Skip to content
Back to skills

Css

ASecurity

Use when editing CSS, writing component styles, or reviewing CSS in this repo.

  • 5 stars
  • 0 votes
  • 0 copies
  • 3 views
  • Added September 19, 2026
ai-agentsjavascriptgojavaapi

Works with

  • api

Security analysis

A100/100

Scanned September 19, 2026

npx -y skills add Aquaticat/Monochromatic --skill css --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Css?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Css
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/aquaticat-css/badge)](https://www.skillsdirectory.com/skills/aquaticat-css)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: css
description: Use when editing CSS, writing component styles, or reviewing CSS in this repo.
---

# CSS in Monochromatic

Fires when editing CSS files,
 writing component styles,
 picking between CSS approaches,
reviewing CSS in a PR,
 choosing sizing units,
 deciding on a selector strategy,
or adding inline styles to a component.

Other surface phrases that should trigger the skill:
"edit this CSS",
 "style this",
 "write a stylesheet",
 "add CSS to",
"review CSS",
 "what's the right CSS for",
 "this component needs styles".
The skill applies to `.css` files,
 CSS-in-JS,
 inline `style` attributes,
and any styling work in the repo.

Single source of truth for the browser baseline:
see `PHILOSOPHY.browser-support.md` at the repo root.

The skill encodes the platform-feature defaults,
browser baseline,
 sizing rules,
 logical properties,
 shorthand rules,
design-token colors,
 declaration discipline,
 accessibility minima,
 mixin shape,
nesting depth,
 and state-attribute conventions.

## Browser baseline

Firefox ESR 140 (June 2025).
All CSS features must be supported by this baseline.
Newer features that the baseline lacks need a feature query (`@supports`) and a fallback,
or they need to be deferred.

When in doubt about a feature,
 check the Firefox ESR 140 caniuse percentage
before reaching for it.
Anything supported in evergreen Firefox but not ESR 140
is off-limits without a feature query.

## Native platform features first

Pick the native option before reaching for a library:

- `<dialog>` for modals.
- Popover API (`popover` attribute,
   `::backdrop` pseudo-element).
- CSS nesting (native,
   not Sass).
- `@layer` for cascade control.
- `@scope` for scoped selectors.
- Container queries (`@container`).

A library or framework that wraps these features adds weight without adding capability.
Use the native form;
reach for a library only when the native form has a documented incompatibility
with the browser baseline.

## Sizing

Use `rem` for all sizing.
Derive related sizes with `calc()`:

```css
.card {
  padding-inline: calc(1rem + 0.5rem);
  border-radius: calc(0.5rem - 1px);
}
```

Never use `px` except in device-pixel-dependent contexts
(1px borders,
 hairline dividers,
 sub-pixel positioning).
Even those cases should be audited;
a 0.0625rem hairline is usually the right call.

## Logical properties

Logical properties everywhere:

- `margin-inline-start` instead of `margin-left`.
- `margin-inline-end` instead of `margin-right`.
- `inset-block-start` instead of `top`.
- `inset-inline-end` instead of `right`.
- `text-align: start` instead of `text-align: left`.
- `padding-inline`,
   `padding-block`,
   `margin-inline`,
   `margin-block`.

Logical properties adapt to writing direction and language
without per-locale overrides.
Physical properties are forbidden in new code.

```css
/* Wrong */
.card {
  margin-left: 1rem;
  text-align: left;
}

/* Right */
.card {
  margin-inline-start: 1rem;
  text-align: start;
}
```

## Shorthand rules

No shorthand properties that combine unrelated axes or sub-properties:

- Forbidden:
   `margin`,
   `padding`,
   `border`,
   `background`.
- Reason:
   longhand is easier to scan and diff.
  `margin: 1rem 2rem 3rem 4rem` hides which value lands on which axis;
  four longhand declarations make it explicit.

Single-axis or single-concept shorthands are fine:

- `padding-inline`,
   `margin-block` (single-axis).
- `border-radius`,
   `inset`,
   `gap` (single-concept).

## Colors via design tokens

All colors come from CSS custom properties in the design token system.
No inline color literals.

```css
/* Wrong */
.card {
  background-color: #f5f5f5;
}

/* Right */
.card {
  background-color: var(--color-surface-1);
}
```

No `var()` fallbacks (`var(--x, red)`).
Fallbacks hide missing tokens;
without them a missing token surfaces as an invalid declaration
which is easier to spot in DevTools.
The single exception:
 user-configurable properties
where the fallback represents the default user choice.

## Declarations and !important

Keep declarations minimal.
Each property appears once per rule
(the cascade resolves duplicates,
 but the diff churns).

No `!important`.
If a rule needs `!important` to win the cascade,
the cascade structure is wrong;
fix `@layer` ordering or selector specificity instead.

Prefer fluid approaches (`clamp()`,
 container queries,
 `calc()` with viewport units)
over breakpoints.
Breakpoints jump at specific widths;
 fluid scales smoothly.

## Accessibility minima

`:focus-visible` on every interactive element.
Never remove the default focus ring without replacing it with a visible alternative.

Touch targets:
 minimum 48px via `min-inline-size` and `min-block-size`
(logical equivalents of `min-width` and `min-height`).

```css
button {
  min-inline-size: 3rem;
  min-block-size: 3rem;
}

button:focus-visible {
  outline: 2px solid var(--color-focus);
  outline-offset: 2px;
}
```

## Mixins

Small composable mixins named by what they do,
 not what they style:

- Good:
   `mixin-truncate-line`,
   `mixin-card-elevation`,
   `mixin-scroll-snap-x`.
- Bad:
   `mixin-card`,
   `mixin-header`,
   `mixin-product-tile`.

Style-named mixins fragment as soon as a non-card needs the elevation;
the mixin name should describe the behaviour so it composes.

## Nesting depth and state attributes

Native CSS nesting only.
Shallow depth,
 3 levels maximum:

```css
.card {
  & .title {
    font-weight: 600;

    & .badge {
      /* level 3, stop here */
    }
  }
}
```

Deeper nesting becomes unreadable in the rendered selector
and harder to override.

Use data attributes for state and variant styling,
 not BEM modifiers:

```css
/* Wrong */
.card--featured {
  /* ... */
}
.card__title--large {
  /* ... */
}

/* Right */
.card[data-featured] {
  /* ... */
}
.card[data-size='large'] .title {
  /* ... */
}
```

Data attributes are queryable from JavaScript without string manipulation
and do not require coordinated class-name updates across markup and CSS.

## Quality check before submitting CSS

- All sizes in `rem` (or `calc()` of `rem`);
   no `px` outside device-pixel contexts.
- Logical properties for every margin,
   padding,
   inset,
   and text-align.
- No forbidden shorthands (`margin`,
   `padding`,
   `border`,
   `background`).
- All colors from `var(--color-*)`;
   no literals.
- No `!important`.
- `:focus-visible` styled on every interactive element.
- Touch targets meet the 48px minimum via `min-inline-size`/`min-block-size`.
- Nesting depth 3 or fewer.
- State and variant styling uses `[data-*]`,
   not BEM modifiers.

If any item is unmet,
 fix before merging.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…