Skip to main content

nested-css-selectors

Implements CSS nesting and advanced selectors with progressive enhancement and maintainable specificity. Use when writing or refactoring nested CSS, or when the user mentions :has, :is, :where, :not, or complex selector composition.

Source facts

Repository
rogie/figui3
Last source activity
March 8, 2026 at 01:11
Detected SKILL.md language
English
Stars
66
Forks
1

Install options

The review-first prompt is selected by default. You can switch to a direct command or download a local copy.

Review the source files

Read SKILL.md and any companion files shown by SkillsMP before deciding whether to install.

Showing SKILL.md

SKILL.md
Source instructions · Read-only preview
name
nested-css-selectors
description
Implements CSS nesting and advanced selectors with progressive enhancement and maintainable specificity. Use when writing or refactoring nested CSS, or when the user mentions :has, :is, :where, :not, or complex selector composition.
user-invocable
false
# Nested CSS + Selectors ## Purpose Write modern, readable CSS using nesting and selector composition without breaking fallback behavior or creating specificity traps. ## Core Rules 1. Start with a stable baseline rule first. 2. Use nesting to improve readability, not to increase selector depth. 3. Keep selector chains short; avoid deeply coupled DOM paths. 4. Prefer low-specificity patterns (`:where(...)`) for reusable component styles. 5. Gate risky/brand-new behavior behind `@supports selector(...)` when needed. ## Nesting Guidelines - Nest only when the child selector is semantically tied to the parent block. - Keep nesting to ~2 levels in normal component styles. - Use `&` explicitly for pseudo-classes, variants, and stateful modifiers. - Avoid implicit descendant nesting that recreates fragile long selectors. ```css .card { padding: 12px; &__title { font-weight: 600; } &:hover { background: var(--figma-color-bg-secondary); } } ``` ## Advanced Selector Guidelines - Use `:is(...)` to group alternatives without repeating declarations. - Use `:where(...)` when you want grouping with near-zero specificity cost. - Use `:has(...)` for parent/state relationships that previously required JS classes. - Keep `:not(...)` small and explicit; avoid broad negative matching. ```css .field :is(input, select, textarea) { font: inherit; } .panel :where(button, [role="button"]) { cursor: pointer; } ``` ## Progressive Enhancement Pattern ```css /* baseline behavior */ .form-row { border: 1px solid var(--figma-color-border); } /* enhanced behavior only where supported */ @supports selector(.form-row:has(input:focus-visible)) { .form-row:has(input:focus-visible) { border-color: var(--figma-color-border-selected); } } ``` ## Specificity Guardrails - Prefer class-based selectors over element+class combinations unless necessary. - Avoid IDs in component styling. - If a rule should be easy to override, wrap grouping parts in `:where(...)`. - If a selector becomes hard to reason about, split it into two simpler rules. ## Refactor Workflow 1. Identify repeated selector/declaration blocks. 2. Consolidate with `:is(...)` or `:where(...)` where intent matches. 3. Introduce nesting inside the owning component block. 4. Recheck specificity effects (especially when replacing comma groups). 5. Verify hover/focus/disabled/error states are unchanged. ## Quick Checklist - [ ] Baseline works without advanced selectors. - [ ] Nesting depth remains shallow and readable. - [ ] `:has(...)` usage is support-gated when compatibility matters. - [ ] Specificity is intentional (`:where` for low-cost overrides). - [ ] No fragile selector tied to incidental DOM structure.
View on GitHub