Cursor rule
.cursor/rules/html-standards.mdc[object Object]
Cursor rules
Quality
65/100
Scores the file, not the repository.Length
1,066 words
16 headings · 15 code blocksRepository
428
— · pushed 17 days agoLast changed
3 days ago
First indexed 3 days ago.123456# Modern HTML Standards78Use the latest evergreen browser features for better user experience and simpler code.9All features should be supported in the last two versions of all major browsers.10All necessary features must be "Baseline widely available".11Progressive enhancement features may be "Baseline 2024".12These are strictly for UX improvements that are non-blocking for conversions.1314## Native Interactive Elements1516**Expandable Content:**17- Use `<details>` and `<summary>` instead of JavaScript toggles18- Perfect for FAQs, product details, filters19- See the [accordion component](mdc:assets/accordion-custom.js) for cases where animation is involved2021**Modals and Popups:**22- Use `<dialog>` for modals instead of custom overlays23- Built-in focus management and backdrop clicks24- See the [dialog component](mdc:assets/dialog.js) for how we use these2526**Tooltips and Menus:**27- Use `popover` attribute for floating content28- Automatic positioning and dismissal2930**Forms:**31- Use `<search>` element for search forms32- Use `<output>` for form calculations and results3334### Input Types (HTML5+)35```html36<input type="text"> <!-- Basic text input -->37<input type="email"> <!-- Email with validation -->38<input type="tel"> <!-- Telephone numbers -->39<input type="url"> <!-- URLs with validation -->40<input type="search"> <!-- Search field with clear button -->41<input type="password"> <!-- Password field -->4243<!-- Numeric inputs -->44<input type="number"> <!-- Numeric input with spinner -->45<input type="range"> <!-- Slider control -->4647<!-- Date/Time inputs -->48<input type="date"> <!-- Date picker -->49<input type="time"> <!-- Time picker -->50<input type="datetime-local"> <!-- Date and time picker -->51<input type="month"> <!-- Month picker -->52<input type="week"> <!-- Week picker -->5354<!-- Selection inputs -->55<input type="checkbox"> <!-- Checkbox -->56<input type="radio"> <!-- Radio button -->57<input type="color"> <!-- Color picker -->58<input type="file"> <!-- File upload -->5960<!-- Action inputs -->61<input type="submit"> <!-- Submit button -->62<input type="reset"> <!-- Reset button -->63<input type="button"> <!-- Generic button -->64<input type="image"> <!-- Image button -->6566<!-- Hidden -->67<input type="hidden"> <!-- Hidden data -->68```6970### Container Elements71```html72<!-- Form container -->73<form> <!-- Form wrapper -->74<fieldset> <!-- Group related inputs -->75<legend> <!-- Fieldset label -->7677<!-- Modern semantic containers -->78<search> <!-- Search form container (HTML5.3) -->79```8081### Text Areas82```html83<textarea> <!-- Multi-line text input -->84```8586### Selection Elements87```html88<select> <!-- Dropdown menu -->89<option> <!-- Option in dropdown -->90<optgroup> <!-- Group options -->91<datalist> <!-- Autocomplete suggestions -->92```9394### Labels and Output95```html96<label> <!-- Input label -->97<output> <!-- Calculation/result display -->98```99100### Buttons101```html102<button type="submit"> <!-- Submit form -->103<button type="reset"> <!-- Reset form -->104<button type="button"> <!-- Generic button -->105```106107### Progress and Meters108```html109<progress> <!-- Progress indicator -->110<meter> <!-- Gauge/measurement display -->111```112113### Modern Form Attributes114```html115<!-- Validation attributes -->116required <!-- Field must be filled -->117pattern="[0-9]{3}-[0-9]{3}-[0-9]{4}" <!-- Regex validation -->118minlength="5" <!-- Minimum character length -->119maxlength="50" <!-- Maximum character length -->120min="1" <!-- Minimum numeric value -->121max="100" <!-- Maximum numeric value -->122step="0.01" <!-- Numeric increment -->123124<!-- Autocomplete attributes -->125autocomplete="name" <!-- Enable specific autocomplete -->126autocomplete="off" <!-- Disable autocomplete -->127list="suggestions" <!-- Link to datalist -->128129<!-- Input hints -->130placeholder="Enter email" <!-- Placeholder text -->131autofocus <!-- Focus on page load -->132readonly <!-- Read-only field -->133disabled <!-- Disabled field -->134multiple <!-- Multiple file/email selection -->135136<!-- Form behavior -->137formnovalidate <!-- Skip validation (on submit buttons) -->138formaction="/alt-submit" <!-- Alternative submission URL -->139formmethod="post" <!-- Override form method -->140formenctype="multipart/form-data" <!-- Override encoding -->141```142143Use [client-side form validation](mdc:https:/developer.mozilla.org/en-US/docs/Learn_web_development/Extensions/Forms/Form_validation) to ensure valid date is being sent to the server.144145## Modern CSS Features146147**Layout:**148- `container-queries` for responsive components149- `aspect-ratio` for maintaining proportions150- `scroll-snap` for carousel behavior151152**Styling:**153- `color-mix()` for dynamic color generation (used for progressive enhancement)154- `view-transitions` for smooth page transitions155- `@layer` for CSS cascade control156157**Interactions:**158- `:has()` selector for parent styling159- `@media (prefers-reduced-motion)` for accessibility160161## Progressive Enhancement162163Use features that are `Baseline Widely Available`.1641651. **Start with semantic HTML** that works without JavaScript1662. **Layer on CSS** for visual enhancement1673. **Add JavaScript** for advanced interactions and accessibility1684. **Polyfill** for modern browsers if necessary for critical interactions1695. **Never break core functionality** for older browsers170171## Accessibility Features172173**Focus Management:**174- Use `tabindex="0"` for custom interactive elements175- Never use positive tabindex values176- Ensure keyboard navigation works naturally177- Ensure focus is trapped in modal contexts178179**Screen Readers:**180- Use semantic HTML elements181- Add `aria-label` when visual context isn't enough182- Use `aria-expanded` for collapsible content183- Use `aria-role` where appropriate184185**Motion Preferences:**186187Write CSS where animations can be disabled if reduced motion is preferred.188189```css190@media (prefers-reduced-motion: reduce) {191 .carousel {192 scroll-behavior: auto;193 }194}195```196197## ID Naming Convention198199Use `CamelCase` for IDs and append section/block identifiers:200201```html202<!-- Section IDs -->203<section id="FeaturedCollection-{{ section.id }}">204205<!-- Block IDs -->206<div id="ProductCard-{{ block.id }}">207208<!-- Element IDs -->209<dialog id="ProductModal-{{ product.id }}-{{ section|block.id }}">210<form id="ProductForm-{{ product.id }}-{{ section|block.id }}">211```212213Section and block IDs are the only things we can guarantee are unique, and so should always be included in `id`s.214215## Examples216217**Expandable FAQ:**218```html219<details class="faq">220 <summary class="faq__question">221 {{ 'faq.shipping_question' | t }}222 </summary>223 <div class="faq__answer">224 {{ 'faq.shipping_answer' | t }}225 </div>226</details>227```228229**Modal Dialog:**230```html231<button class="product__quick-view" onclick="ProductModal{{ product.id }}.showModal()">232 {{ 'products.quick_view' | t }}233</button>234235<dialog id="ProductModal{{ product.id }}" class="product-modal">236 <form method="dialog">237 <button type="submit" class="modal__close">238 {{ 'general.close' | t }}239 </button>240 </form>241 <div class="modal__content">242 {% render 'product-details', product: product %}243 </div>244</dialog>245```246247**Popover Menu:**248```html249<button popovertarget="CartMenu" class="header__cart">250 {{ 'cart.title' | t }} ({{ cart.item_count }})251</button>252253<div id="CartMenu" popover class="cart-popover">254 {% render 'cart-drawer' %}255</div>256```257258**Search Form:**259```html260<search class="header__search">261 <form action="{{ routes.search_url }}" method="get">262 <input263 type="search"264 name="q"265 placeholder="{{ 'general.search_placeholder' | t }}"266 value="{{ search.terms | escape }}"267 >268 <button type="submit">{{ 'general.search' | t }}</button>269 </form>270</search>271```272273**Responsive Product Card:**274```html275<div class="product-card" style="container-type: inline-size;">276 <div class="product-card__media">277 {{ product.featured_image | image_url: width: 800 | image_tag }}278 </div>279 <div class="product-card__info">280 <h3>{{ product.title | escape }}</h3>281 <output class="product-card__price">282 {{ product.price | money }}283 </output>284 </div>285</div>286```287288## Avoid These Patterns289290**Don't use custom JavaScript for:**291- Show/hide toggles (use `<details>`)292- Modal overlays (use `<dialog>`)293- Tooltips (use `popover`)294- Form validation (use native HTML5)295296**Don't create:**297- Custom dropdown menus (use `<select>` or `popover`)298- Custom accordions (use `<details>`)299- Custom tabs (use CSS `:target` or native behavior)300
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
