Cursor rule
.cursor/rules/sale-price-accessibility.mdcSale price component accessibility compliance pattern
Cursor rules
Quality
40/100
Scores the file, not the repository.Length
722 words
1 headings · 6 code blocksRepository
428
— · pushed 17 days agoLast changed
3 days ago
First indexed 3 days ago.123456# Sale Price Component Accessibility Standards78Ensures sale price components follow WCAG compliance and provide proper context for screen reader users.910<rule>11name: sale_price_accessibility_standards12description: Enforce sale price component accessibility standards and screen reader context compliance13filters:14 - type: file_extension15 pattern: "\\.(vue|jsx|tsx|html|liquid|php|js|ts)$"1617actions:18 - type: enforce19 conditions:20 # Sale price missing screen reader context21 - pattern: "(?i)<[^>]*(?:sale|discount|price)[^>]*>.*\\$[0-9]+.*\\$[0-9]+"22 pattern_negate: "(class.*sr-only|class.*visually-hidden)"23 message: "Sale price components must include visually hidden text to explain regular and sale prices."2425 # Strike-through price missing context26 - pattern: "(?i)<[^>]*(?:strike|line-through|text-decoration)[^>]*>.*\\$[0-9]+"27 pattern_negate: "(Regular price|Original price|Was|Before)"28 message: "Strike-through prices must include visually hidden context like 'Regular price' or 'Original price'."2930 # Sale price missing context31 - pattern: "(?i)<[^>]*(?:sale|discount|offer)[^>]*>.*\\$[0-9]+"32 pattern_negate: "(Sale price|Now|Current price|Discounted price)"33 message: "Sale prices must include visually hidden context like 'Sale price' or 'Now'."3435 # Missing visually hidden elements for context36 - pattern: "(?i)<[^>]*class=\"[^\"]*(?:sale|price|discount)[^\"]*\"[^>]*>"37 pattern_negate: "(sr-only|visually-hidden|screen-reader-only)"38 message: "Sale price components should include visually hidden elements for screen reader context."3940 # Unnecessary aria-hidden on visible price content41 - pattern: "(?i)<[^>]*class=\"[^\"]*(?:price|sale|discount)[^\"]*\"[^>]*aria-hidden=\"true\"[^>]*>"42 message: "Visible price content should not be hidden from screen readers with aria-hidden. Only decorative elements should use aria-hidden."4344 - type: suggest45 message: |46 **Sale Price Component Accessibility Best Practices:**4748 **Required Screen Reader Context:**49 - **Regular Price:** Must include "Regular price" or "Original price" context50 - **Sale Price:** Must include "Sale price" or "Now" context51 - **Visual Hiding:** Use visually hidden elements to provide context without affecting visual design5253 **Screen Reader Announcement Requirements:**54 - Regular price should announce: "Regular price, $X"55 - Sale price should announce: "Sale price, $Y"56 - Discount should announce: "X% OFF" (visible badge text is sufficient)57 - Complete announcement: "Regular price, $45, Sale price, $35, 20% OFF"5859 **Implementation Patterns:**6061 **Basic Sale Price Structure:**62```html63 <div class="price-container">64 <span class="sr-only">Regular price, </span>65 <span class="regular-price">$45.00</span>66 <span class="sr-only">Sale price, </span>67 <span class="sale-price">$35.00</span>68 <span class="discount-badge">20% OFF</span>69 </div>70```7172 **CSS for Visually Hidden Elements:**73```css74 .sr-only {75 position: absolute;76 width: 1px;77 height: 1px;78 padding: 0;79 margin: -1px;80 overflow: hidden;81 clip: rect(0, 0, 0, 0);82 white-space: nowrap;83 border: 0;84 }85```8687 **Complex Sale Price Examples:**8889 **With Multiple Discounts:**90```html91 <div class="price-container">92 <span class="sr-only">Regular price, </span>93 <span class="regular-price">$100.00</span>94 <span class="sr-only">Sale price, </span>95 <span class="sale-price">$75.00</span>96 <span class="discount">25% OFF</span>97 <span class="sr-only">Member price, </span>98 <span class="member-price">$67.50</span>99 <span class="savings-amount">Extra 10% OFF</span>100 </div>101```102103 **With Currency and Formatting:**104```html105 <div class="price-container">106 <span class="sr-only">Regular price, </span>107 <span class="regular-price">$1,299.99</span>108 <span class="sr-only">Sale price, </span>109 <span class="sale-price">$999.99</span>110 <span class="savings-amount">Save $300</span>111 </div>112```113114 **Button Implementation:**115```html116 <!-- Good: Natural button text -->117 <button class="add-to-cart-btn">118 Add to Cart119 </button>120```121122 **JavaScript Considerations:**123 - Dynamically update visually hidden context when prices change124 - Calculate and update discount percentages automatically125 - Handle currency formatting for different locales126 - Ensure context is updated when prices are updated via AJAX127128 **Dynamic Price Updates:**129```javascript130 function updateSalePrice(regularPrice, salePrice) {131 const regularElement = document.querySelector('.regular-price');132 const saleElement = document.querySelector('.sale-price');133 const discountElement = document.querySelector('.discount');134135 // Calculate discount percentage136 const discount = Math.round(((regularPrice - salePrice) / regularPrice) * 100);137138 // Update visual elements139 regularElement.textContent = `$${regularPrice.toFixed(2)}`;140 saleElement.textContent = `$${salePrice.toFixed(2)}`;141 discountElement.textContent = `${discount}% OFF`;142 }143```144145 **Accessibility Notes:**146 - Screen reader context should be concise but clear147 - Avoid redundant information in visual and screen reader content148 - Test with actual screen readers to ensure proper announcement149 - Consider using aria-live regions for dynamic price updates150 - Ensure price information is accessible in product listings and detail pages151 - Handle cases where sale prices are temporary or time-limited152 - Provide context for different types of discounts (percentage, fixed amount, member-only)153 - Do not hide visible price content from screen readers with aria-hidden154 - Let natural button text serve as the accessible name when sufficient155156 **Common Patterns to Avoid:**157 - Don't rely solely on visual styling (strike-through, colors) to convey meaning158 - Don't use generic terms like "price" without context159 - Don't announce prices without indicating which is regular vs sale160 - Don't forget to announce discount percentages or savings amounts161 - Don't use decorative elements without proper screen reader alternatives162 - Don't hide visible price content with aria-hidden="true"163 - Don't duplicate discount information in visually hidden text when visible badges are sufficient164165 **Color Contrast Requirements:**166 - Ensure all text meets WCAG 2.2 contrast requirements (4.5:1 for normal text)167 - Savings amounts and discount text must be readable against background168 - Test contrast ratios for all price-related text elements169 - Use darker colors for better accessibility (e.g., #157347 instead of #28a745)170171metadata:172 priority: high173 version: 1.0174</rule>175
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
