CSS coding standards for Oh My Brand! theme. BEM methodology, custom properties, theme.json integration, responsive design, and accessibility. Use when styling blocks, templates or components.
Scanned 2/12/2026
Install via CLI
openskills install majiayu000/claude-skill-registry---
name: css-standards
description: CSS coding standards for Oh My Brand! theme. BEM methodology, custom properties, theme.json integration, responsive design, and accessibility. Use when styling blocks, templates or components.
metadata:
author: Wesley Smits
version: "1.0.0"
---
# CSS Standards
CSS coding standards and patterns for the Oh My Brand! WordPress FSE theme.
---
## When to Use
- Styling block components
- Writing responsive layouts
- Defining CSS custom properties
- Implementing accessible focus states
- Working with WordPress design tokens
---
## Reference Files
| File | Purpose |
|------|---------|
| [gallery-block.css](references/gallery-block.css) | Complete block styling example |
| [theme-json-tokens.css](references/theme-json-tokens.css) | WordPress design token usage |
| [accessibility.css](references/accessibility.css) | Focus, reduced motion, contrast |
---
## BEM Naming
BEM (Block, Element, Modifier) naming convention:
```
.block → Component container
.block__element → Child element
.block--modifier → Block variation
.block__element--modifier → Element variation
```
### Block Class Prefix
| Block Type | Prefix | Example |
|------------|--------|---------|
| Native blocks | `wp-block-theme-oh-my-brand-` | `.wp-block-theme-oh-my-brand-gallery` |
| ACF blocks | `wp-block-acf-` | `.wp-block-acf-gallery` |
### BEM Examples
```css
/* Block */
.wp-block-theme-oh-my-brand-gallery { }
/* Elements */
.wp-block-theme-oh-my-brand-gallery__track { }
.wp-block-theme-oh-my-brand-gallery__slide { }
.wp-block-theme-oh-my-brand-gallery__button { }
/* Block modifiers */
.wp-block-theme-oh-my-brand-gallery--fullwidth { }
/* Element modifiers */
.wp-block-theme-oh-my-brand-gallery__button--prev { }
.wp-block-theme-oh-my-brand-gallery__slide--active { }
```
---
## Custom Properties
Define custom properties at the block root:
```css
.wp-block-theme-oh-my-brand-gallery {
/* Layout */
--visible-images: 3;
--block-gap: 1rem;
/* Animation */
--transition-duration: 300ms;
--transition-timing: ease-out;
/* Colors (use theme tokens) */
--button-bg: var(--wp--preset--color--primary);
--button-text: var(--wp--preset--color--base);
}
```
See [gallery-block.css](references/gallery-block.css) for complete example.
---
## Theme.json Tokens
Use WordPress design tokens from `theme.json`:
| Token Type | CSS Variable Pattern |
|------------|---------------------|
| Colors | `var(--wp--preset--color--{slug})` |
| Spacing | `var(--wp--preset--spacing--{size})` |
| Font Family | `var(--wp--preset--font-family--{slug})` |
| Font Size | `var(--wp--preset--font-size--{slug})` |
| Layout | `var(--wp--style--global--content-size)` |
See [theme-json-tokens.css](references/theme-json-tokens.css) for examples.
---
## Responsive Design
Mobile-first approach using `min-width` breakpoints:
| Name | Width | Target |
|------|-------|--------|
| Mobile | < 768px | Phones (base styles) |
| Tablet | ≥ 768px | Tablets |
| Desktop | ≥ 1024px | Laptops |
| Large | ≥ 1280px | Desktops |
### Example
```css
/* Base (mobile) styles */
.wp-block-theme-oh-my-brand-gallery {
grid-template-columns: 1fr;
}
/* Tablet */
@media (min-width: 768px) {
.wp-block-theme-oh-my-brand-gallery {
grid-template-columns: repeat(2, 1fr);
}
}
/* Desktop */
@media (min-width: 1024px) {
.wp-block-theme-oh-my-brand-gallery {
grid-template-columns: repeat(3, 1fr);
}
}
```
---
## Accessibility
### Focus Styles
```css
.wp-block-theme-oh-my-brand-gallery__button:focus-visible {
outline: 2px solid var(--wp--preset--color--primary);
outline-offset: 2px;
}
```
### Reduced Motion
```css
@media (prefers-reduced-motion: reduce) {
.wp-block-theme-oh-my-brand-gallery__track {
transition: none;
}
}
```
### Screen Reader Only
```css
.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border: 0;
}
```
See [accessibility.css](references/accessibility.css) for complete patterns.
### Color Contrast (WCAG 2.1 AA)
| Content Type | Minimum Ratio |
|--------------|---------------|
| Normal text | 4.5:1 |
| Large text (18px+ bold, 24px+) | 3:1 |
| UI components | 3:1 |
---
## Stylelint Rules
This project uses Stylelint for CSS linting. Key rules to follow:
### No Empty Blocks
Stylelint disallows empty rule blocks. Never create a rule with only a comment:
```css
/* ❌ Bad - empty block causes stylelint error */
@media (prefers-reduced-motion: reduce) {
.my-component {
/* No styles needed */
}
}
/* ❌ Bad - empty block */
.my-component__element {
}
/* ✅ Good - omit the rule entirely if no styles needed */
/* (Simply don't include the rule) */
/* ✅ Good - if you need the media query, include actual styles */
@media (prefers-reduced-motion: reduce) {
.my-component {
transition: none;
animation: none;
}
}
```
### No Duplicate Selectors
Stylelint disallows duplicate selectors within a stylesheet. Consolidate all styles for a selector in one place:
```css
/* ❌ Bad - duplicate selector causes stylelint error */
.my-component__number {
font-size: 2rem;
font-weight: 700;
}
.my-component__label {
font-size: 1rem;
}
.my-component__number {
order: 0; /* This duplicates the selector above! */
}
/* ✅ Good - all styles consolidated in one selector */
.my-component__number {
font-size: 2rem;
font-weight: 700;
order: 0;
}
.my-component__label {
font-size: 1rem;
}
```
### Hex Color Length
Use shorthand hex colors when possible:
```css
/* ❌ Bad - can be shortened */
color: #0066cc;
background: #ffffff;
/* ✅ Good - use shorthand */
color: #06c;
background: #fff;
```
### Key Principles
1. If a rule block would be empty (even with just a comment), **do not include it**
2. Consolidate all styles for a selector in **one place** - no duplicate selectors
3. Use **shorthand hex colors** when all pairs are identical (e.g., `#aabbcc` → `#abc`)
---
## Validation
**Always run stylelint after making CSS changes:**
```bash
pnpm run lint:css
```
Fix any issues before committing. This ensures consistent code style and catches common errors.
---
## Related Skills
- [html-standards](../html-standards/SKILL.md) - Semantic HTML structure
- [web-components](../web-components/SKILL.md) - Frontend Web Components
- [native-block-development](../native-block-development/SKILL.md) - Block styling
---
## References
- [BEM Methodology](https://getbem.com/)
- [WordPress Global Styles](https://developer.wordpress.org/themes/global-settings-and-styles/)
- [WCAG 2.1 Quick Reference](https://www.w3.org/WAI/WCAG21/quickref/)
- [CSS Custom Properties](https://css-tricks.com/a-complete-guide-to-custom-properties/)
No comments yet. Be the first to comment!