Cursor rule
.cursor/rules/modal-accessibility.mdcModal window accessibility compliance and ARIA Dialog Pattern
Cursor rules
Quality
40/100
Scores the file, not the repository.Length
500 words
1 headings · 1 code blocksRepository
428
— · pushed 17 days agoLast changed
3 days ago
First indexed 3 days ago.123456# Modal Window Accessibility Standards78Ensures modal windows follow WCAG compliance and ARIA Dialog Pattern specifications.910<rule>11name: modal_accessibility_standards12description: Enforce modal window accessibility standards and ARIA Dialog Pattern compliance13filters:14 - type: file_extension15 pattern: "\\.(vue|jsx|tsx|html|liquid|php|js|ts)$"1617actions:18 - type: enforce19 conditions:20 # Dialog role requirement21 - pattern: "(?i)<(div|section|article)[^>]*(?:modal|dialog)[^>]*>"22 pattern_negate: "role=\"dialog\""23 message: "Modal containers must have role='dialog' attribute."2425 # aria-modal requirement26 - pattern: "(?i)<[^>]*role=\"dialog\"[^>]*>"27 pattern_negate: "aria-modal=\"true\""28 message: "Dialog elements must have aria-modal='true' attribute."2930 # aria-labelledby or aria-label requirement31 - pattern: "(?i)<[^>]*role=\"dialog\"[^>]*>"32 pattern_negate: "(aria-labelledby|aria-label)"33 message: "Dialog elements must have either aria-labelledby or aria-label for accessibility."3435 # Empty aria-label check36 - pattern: "(?i)<[^>]*role=\"dialog\"[^>]*aria-label=\"\"[^>]*>"37 message: "Dialog aria-label should not be empty; provide a meaningful description."3839 # Button without proper close functionality40 - pattern: "(?i)<button[^>]*(?:close|dismiss|cancel)[^>]*>"41 pattern_negate: "(onClick|onclick|@click|v-on:click)"42 message: "Modal close buttons should have proper click handlers to close the dialog."4344 # Close button should have aria-label45 - pattern: "(?i)<button[^>]*(?:close|dismiss|×|×)[^>]*>"46 pattern_negate: "aria-label=\"[^\"]*[Cc]lose[^\"]*\""47 message: "Modal close buttons should have aria-label='Close' or similar descriptive text for screen readers."4849 # Missing focus trap indicators50 - pattern: "(?i)(?:showModal|openModal|displayModal)\\s*\\("51 message: "When opening modals, ensure focus management is implemented (focus should move to an element inside the dialog)."5253 # Modal launcher should have aria-haspopup54 - pattern: "(?i)<button[^>]*(?:open|show|launch)[^>]*(?:modal|dialog)[^>]*>"55 pattern_negate: "aria-haspopup=\"dialog\""56 message: "Buttons that open modals should include aria-haspopup='dialog' to inform users a dialog will open."5758 - type: suggest59 message: |60 **Modal Window Accessibility Best Practices:**6162 **Required ARIA Attributes:**63 - **role='dialog':** Set on the modal container element64 - **aria-modal='true':** Indicates the dialog is modal65 - **aria-labelledby:** Reference to visible dialog title, OR66 - **aria-label:** Descriptive label if no visible title exists67 - **aria-haspopup='dialog':** Set on buttons/elements that trigger the modal to inform users a dialog will open6869 **Keyboard Interaction Requirements:**70 - **Initial Focus:** When dialog opens, focus must move to an element inside the dialog71 - **Tab Cycling:** Tab key should cycle through tabbable elements within the dialog only72 - **Shift+Tab:** Should cycle backwards through tabbable elements within the dialog73 - **Escape Key:** Must close the dialog74 - **Focus Trap:** Focus should be contained within the modal while open7576 **Focus Management:**77 - Implement focus trapping to prevent tab navigation outside the modal78 - Return focus to the triggering element when modal closes79 - Move focus to the close button (first focusable element) when modal opens80 - Ensure close button is positioned first in DOM order within the dialog8182 **Structure Requirements:**83 - All interactive elements must be descendants of the dialog container84 - Position close button first in DOM order within the dialog container85 - Use semantic HTML within the modal (headings, buttons, form labels)86 - Provide clear visual focus indicators87 - Close buttons should use aria-label="Close" with × entity for visual 'x' icon8889 **Example Implementation:**90```html91 <!-- Modal launcher -->92 <button aria-haspopup="dialog" onclick="openModal()">Open Settings</button>9394 <!-- Modal dialog -->95 <div role="dialog" aria-modal="true" aria-labelledby="modal-title">96 <button type="button" aria-label="Close" onclick="closeModal()">×</button>97 <h2 id="modal-title">Modal Title</h2>98 <p>Modal content...</p>99 </div>100```101102 **JavaScript Considerations:**103 - Implement proper event listeners for Escape key104 - Manage body scroll when modal is open105 - Handle focus restoration on modal close106107metadata:108 priority: high109 version: 1.0110</rule>111
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
