Cursor rule
.cursor/rules/slider-accessibility.mdcSlider component accessibility compliance pattern
Cursor rules
Quality
40/100
Scores the file, not the repository.Length
560 words
1 headings · 1 code blocksRepository
428
— · pushed 17 days agoLast changed
3 days ago
First indexed 3 days ago.123456# Slider Component Accessibility Standards78Ensures slider components follow WCAG compliance and WAI-ARIA Slider Pattern specifications.910<rule>11name: slider_accessibility_standards12description: Enforce slider component accessibility standards and WAI-ARIA Slider Pattern compliance13filters:14 - type: file_extension15 pattern: "\\.(vue|jsx|tsx|html|liquid|php|js|ts)$"1617actions:18 - type: enforce19 conditions:20 # Slider role requirement21 - pattern: "(?i)<(div|input)[^>]*(?:slider|range)[^>]*>"22 pattern_negate: "role=\"slider\""23 message: "Slider controls must have role='slider' attribute."2425 # aria-valuenow requirement26 - pattern: "(?i)<[^>]*role=\"slider\"[^>]*>"27 pattern_negate: "aria-valuenow=\"[0-9.-]+\""28 message: "Slider elements must have aria-valuenow attribute set to the current value."2930 # aria-valuemin requirement31 - pattern: "(?i)<[^>]*role=\"slider\"[^>]*>"32 pattern_negate: "aria-valuemin=\"[0-9.-]+\""33 message: "Slider elements must have aria-valuemin attribute set to the minimum allowed value."3435 # aria-valuemax requirement36 - pattern: "(?i)<[^>]*role=\"slider\"[^>]*>"37 pattern_negate: "aria-valuemax=\"[0-9.-]+\""38 message: "Slider elements must have aria-valuemax attribute set to the maximum allowed value."3940 # Missing keyboard event handlers41 - pattern: "(?i)<[^>]*role=\"slider\"[^>]*>"42 pattern_negate: "(onKeyDown|onkeydown|@keydown|v-on:keydown)"43 message: "Slider elements should handle keyboard events (Arrow keys, Home, End, Page Up/Down)."4445 # Missing label46 - pattern: "(?i)<[^>]*role=\"slider\"[^>]*>"47 pattern_negate: "(aria-labelledby|aria-label)"48 message: "Slider elements must have either aria-labelledby or aria-label for accessibility."4950 - type: suggest51 message: |52 **Slider Component Accessibility Best Practices:**5354 **Required ARIA Attributes:**55 - **role='slider':** Set on the slider control element56 - **aria-valuenow:** Current value of the slider57 - **aria-valuemin:** Minimum allowed value58 - **aria-valuemax:** Maximum allowed value59 - **aria-valuetext:** (Optional) User-friendly text representation of the value60 - **aria-orientation:** (Optional) 'vertical' for vertical sliders, defaults to 'horizontal'61 - **aria-labelledby:** Reference to visible label, OR62 - **aria-label:** Descriptive label if no visible label exists6364 **Keyboard Interaction Requirements:**65 - **Right/Up Arrow:** Increase value by one step66 - **Left/Down Arrow:** Decrease value by one step67 - **Home:** Set to minimum value68 - **End:** Set to maximum value69 - **Page Up:** (Optional) Increase by larger step70 - **Page Down:** (Optional) Decrease by larger step7172 **Implementation Example:**73```html74 <div class="slider-container">75 <label id="slider-label" for="slider">Select a value:</label>76 <div class="slider-wrapper">77 <div role="slider"78 id="slider"79 tabindex="0"80 aria-labelledby="slider-label"81 aria-valuemin="0"82 aria-valuemax="100"83 aria-valuenow="50"84 aria-valuetext="50%">85 <div class="slider-track">86 <div class="slider-fill" style="width: 50%"></div>87 <div class="slider-thumb" style="left: 50%"></div>88 </div>89 </div>90 <div class="slider-value" aria-hidden="true">50%</div>91 </div>92 </div>9394 <script>95 const slider = document.querySelector('[role="slider"]');96 const thumb = slider.querySelector('.slider-thumb');97 const fill = slider.querySelector('.slider-fill');98 const valueDisplay = document.querySelector('.slider-value');99100 const min = parseInt(slider.getAttribute('aria-valuemin'));101 const max = parseInt(slider.getAttribute('aria-valuemax'));102 const step = 1; // Define step value103104 function updateSlider(value) {105 // Ensure value is within bounds106 value = Math.max(min, Math.min(max, value));107108 // Update ARIA attributes109 slider.setAttribute('aria-valuenow', value);110 slider.setAttribute('aria-valuetext', `${value}%`);111112 // Update visual elements113 thumb.style.left = `${value}%`;114 fill.style.width = `${value}%`;115 valueDisplay.textContent = `${value}%`;116 }117118 // Keyboard interaction119 slider.addEventListener('keydown', (event) => {120 let newValue = parseInt(slider.getAttribute('aria-valuenow'));121122 switch(event.key) {123 case 'ArrowRight':124 case 'ArrowUp':125 newValue += step;126 break;127 case 'ArrowLeft':128 case 'ArrowDown':129 newValue -= step;130 break;131 case 'Home':132 newValue = min;133 break;134 case 'End':135 newValue = max;136 break;137 case 'PageUp':138 newValue += step * 10; // Larger step139 break;140 case 'PageDown':141 newValue -= step * 10; // Larger step142 break;143 default:144 return;145 }146147 event.preventDefault();148 updateSlider(newValue);149 });150 </script>151```152153 **JavaScript Considerations:**154 - Implement all required keyboard interactions155 - Update ARIA attributes dynamically156 - Ensure values stay within min/max bounds157 - Provide visual feedback for value changes158 - Handle both mouse and touch interactions159 - Consider implementing smooth animations160 - Support both horizontal and vertical orientations161162 **Accessibility Notes:**163 - Ensure proper focus management164 - Provide clear visual focus indicators165 - Support high contrast mode166 - Test with screen readers167 - Consider touch target sizes168 - Provide visual feedback for interactions169 - Support both mouse and keyboard users170 - Consider adding value announcements for screen readers171172metadata:173 priority: high174 version: 1.0175</rule>176
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
