Drop your workspace folder here
BEM (Block Element Modifier) is a CSS naming convention that keeps styles modular and readable.
.card
A standalone component that makes sense on its own.
.card__title
A part of a block, separated by double underscore.
.card--featured
A variation of a block or element, separated by double hyphen.
CSS patterns that break keyboard navigation, screen readers, or general usability.
outline: none/0 — removes the focus ring, making it impossible for keyboard users to see what element is focuseduser-select: none — prevents text selection; avoid on readable content like articles or labelspointer-events: none — blocks all mouse interaction; ensure a keyboard-accessible alternative is in placeCSS patterns that introduce security vulnerabilities or enable data exfiltration.
javascript: URIs — can execute JavaScript when the browser processes the URLexpression() — evaluates arbitrary JavaScript in old IE, a known XSS vector-moz-binding — loads external XBL scripts in old Firefox, enabling code executionbehavior: — loads HTC files in IE that can execute scriptsurl(http://...) — can leak document state or bypass Content Security PolicyStructural BEM naming errors detected in class selectors and HTML class attributes.
.block__el__sub.block--mod__elClasses that look like they should be BEM modifiers or elements but use a single hyphen instead.
.badge exists → .badge-primary is flagged.badge--primary (modifier) or .badge__primary (element)Raw color or size values that should be CSS variables for consistency and theming.
#ff0000, rgb(), rgba(), hsl(), hsla()var(), 0, none, transparent, inherit, and other CSS keywordsGeneral CSS anti-patterns that reduce maintainability or cause specificity issues.
!important — overrides the cascade, makes styles hard to debug or overridefloat: left/right — designed for text wrapping, not layout; use flexbox or gridz-index values (> 9) — arbitrary numbers create ordering conflicts; use a defined scale via CSS variables#foo — higher specificity than classes, impossible to reuse, hard to override@import — each import is loaded sequentially and blocks rendering; use <link> tags insteadtransition: all — animates every CSS property on change, causing unnecessary repaints; list only the properties you need