frontend-conventions
Frontend Conventions
A shared system of rules for naming, formatting, and structuring code across HTML, CSS, and JavaScript. Consistency here is what makes a codebase feel like it was written by one person, regardless of team size.
Code Formatting
General
| Setting | Value |
|---|---|
| Indentation | spaces |
| Tab size | 2 |
| Translate tabs to spaces | Yes |
| Trim trailing whitespace | Yes |
| New line at end of file | Yes |
Quotes by File Type
| File type | Quote style |
|---|---|
.html |
"double" |
.css |
'single' |
.js |
'single' |
.json |
"double" |
.yml |
none in general; 'single' when forcing a string or using special characters; "double" when parsing escape codes |
Naming Cases
| What you're naming | Case style |
|---|---|
| HTML attributes and values | dash-case |
| CSS custom property | --dash-case |
| JavaScript variable / function | camelCase |
| JavaScript class | PascalCase |
| File names | dash-case.extension |
Naming Prefixes
All CSS classes are prefixed by category so their purpose is immediately visible in HTML.
| Category | Prefix |
|---|---|
| Component | c- |
| Utility | u- |
| JavaScript hook | js- |
js- classes are never styled — they exist solely as selectors for JavaScript behavior.
Namespacing
When working within a named project or library, prefix everything with a project namespace to prevent collisions:
| Scope | Namespace |
|---|---|
| Global/custom property | --namespace-property-name |
| Scoped/component property | --prefix-namespace-block-property |
Examples:
/* Global token */
var(--mmn-color-bg-primary)
/* Scoped to a component */
var(--c-mmn-card-border-radius)
Frontend Naming Patterns
| Type | Pattern | Example |
|---|---|---|
| HTML custom element | <namespace-element-name> |
<mmn-card> |
| HTML data attribute | data-namespace-attribute |
data-mmn-uuid="rng1928" |
| CSS selector | class="prefix-namespace-block__element--modifier" |
class="c-mmn-card__media--video" |
| JS selector | class="js-namespace-target" |
class="js-mmn-card-for-ab-test" |
Acceptable Abbreviations
Only use abbreviations from this list — everything else is spelled out in full.
| Full word | Abbreviation |
|---|---|
| Image | img |
| Background | bg |
| Minimum | min |
| Maximum | max |
| Call to action | cta |
| Column | col |
| Column span | colspan |
| Row span | rowspan |
Modifier API
Use these standardized modifier names so any developer can predict class names without checking documentation.
Size Scale
2xs · xs · sm · md · lg · xl · 2xl
<!-- The 2xl heading component -->
<h1 class="c-mmn-heading--2xl">...</h1>
Tints and Shades
xxlight · xlight · light · medium · dark · xdark · xxdark
<!-- The xdark magenta utility color -->
<span class="u-mmn-color-magenta-xdark">...</span>
Hierarchy
primary · secondary · tertiary
<!-- The primary button component -->
<button class="c-mmn-button--primary" type="button">...</button>
Responsive Behavior
Apply a utility or modifier at a specific breakpoint using @from- and @until- suffixes:
| Syntax | Meaning |
|---|---|
behavior@from-[breakpoint] |
Apply from this breakpoint and up |
behavior@until-[breakpoint] |
Apply below this breakpoint |
<!-- Full width from the sm breakpoint and beyond -->
<div class="u-mmn-full-width@from-sm">...</div>
<!-- Full width below the sm breakpoint only -->
<div class="u-mmn-full-width@until-sm">...</div>
CSS Property Order
Write CSS properties in this order within every rule. Grouping by concern (display → position → size → space → typography → border → background → advanced) makes rules easier to scan and diff.
.selector {
content;
/* Display */
display;
grid;
grid-*;
flex;
flex-*;
justify-*;
align-*;
place-*;
order;
box-sizing;
appearance;
visibility;
opacity;
/* Position */
position;
inset;
inset-block;
inset-block-start;
inset-block-end;
inset-inline;
inset-inline-start;
inset-inline-end;
float;
clear;
transform;
z-index;
/* Size */
inline-size;
min-inline-size;
max-inline-size;
block-size;
min-block-size;
max-block-size;
overflow;
overflow-block;
overflow-inline;
/* Space */
margin;
margin-block;
margin-block-start;
margin-block-end;
margin-inline;
margin-inline-start;
margin-inline-end;
padding;
padding-block;
padding-block-start;
padding-block-end;
padding-inline;
padding-inline-start;
padding-inline-end;
/* Typography */
font;
font-family;
font-style;
font-size;
font-weight;
font-feature-settings;
font-variant;
line-height;
list-style;
color;
text-align;
text-decoration;
text-transform;
text-wrap;
letter-spacing;
vertical-align;
cursor;
pointer-events;
user-select;
/* Border */
border;
border-radius;
border-width;
border-style;
border-color;
border-image;
box-shadow;
outline;
/* Background */
background;
background-color;
background-image;
background-position;
background-repeat;
background-size;
backdrop-filter;
/* Advanced */
filter;
will-change;
transition;
animation;
}
More from mikemai2awesome/agent-skills
tiny-css
Write minimal, efficient CSS for small or minimalist projects by trusting the browser instead of fighting it. Only use this skill for personal sites, prototypes, simple landing pages, or projects intentionally kept lean — if the project has multiple developers, a component library, a design token system, or more than a handful of CSS files, a more comprehensive CSS approach is needed. If you're about to write a CSS reset, declare a base font-size on :root, set default colors on body, use px for spacing, or reach for physical margin/padding properties, this skill will stop you.
12tiny-a11y
Write minimal, accessible HTML, CSS, and JavaScript. Use when building web components, writing HTML markup, creating forms, or reviewing code for accessibility.
4