Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
ccheney avatar

Modern Css

  • 158 installs
  • 57 repo stars
  • Updated July 7, 2026
  • ccheney/robust-skills

Ship responsive, accessible interfaces using modern CSS layout, typography, and interaction patterns without relying on outdated hacks or excessive JavaScript.

About

Teaches robust modern CSS practices for building maintainable, responsive web interfaces using current layout, typography, theming, and interaction standards so teams can deliver polished UI with native browser features instead of legacy workarounds.

  • Container queries and modern layout systems
  • CSS Grid and Flexbox production patterns
  • Custom properties and theming
  • Accessible focus and motion practices
  • Progressive enhancement without JS bloat

Modern Css by the numbers

  • 158 all-time installs (skills.sh)
  • Ranked #943 of 2,245 Frontend Development skills by installs in the Skillselion catalog
  • Data as of Aug 3, 2026 (Skillselion catalog sync)
npx skills add https://github.com/ccheney/robust-skills --skill modern-css

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs158
repo stars57
Last updatedJuly 7, 2026
Repositoryccheney/robust-skills

What it does

Ship responsive, accessible interfaces using modern CSS layout, typography, and interaction patterns without relying on outdated hacks or excessive JavaScript.

Files

SKILL.mdMarkdownGitHub ↗

Modern CSS

Pure native CSS for building interfaces — no preprocessors, no frameworks.

When to Use (and When NOT to)

Use Freely (Baseline)Feature-Detect First
CSS Grid, Subgrid, Flexbox@function, if() (Chrome-only)
Container Queries (size + style)Customizable <select> (Chrome-only)
:has(), :is(), :where()Scroll-state queries (Chrome-only)
CSS Nesting, @layer, @scopesibling-index(), sibling-count()
@property (typed custom props)::scroll-button(), ::scroll-marker
oklch(), color-mix(), light-dark()Typed attr() beyond content
Relative color syntaxfield-sizing: content
@starting-style, transition-behaviorinterpolate-size (Chrome-only)
Scroll-driven animationsGrid Lanes / masonry (experimental)
Anchor positioning, Popover APIrandom() (Safari TP only)
text-wrap: balance, linear() easing@mixin / @apply (no browser yet)
View Transitions, logical properties

CRITICAL: The Modern Cascade

Understanding how styles resolve is the single most important concept in CSS. The additions of @layer and @scope fundamentally changed the cascade algorithm.

Style Resolution Order (highest priority wins):
┌─────────────────────────────────────────────────┐
│ 1. Transitions (active transition wins)         │
│ 2. !important (user-agent > user > author)      │
│ 3. @layer order (later layer > earlier layer)   │
│ 4. Unlayered styles (beat ALL layers)           │
│ 5. Specificity (ID > class > element)           │
│ 6. @scope proximity (closer root wins)      NEW │
│ 7. Source order (later > earlier)               │
└─────────────────────────────────────────────────┘

Unlayered > Last layer > ... > First layer
           (utilities)        (reset)

Cascade layers (@layer) and scope proximity (@scope) are now more powerful than selector specificity. Define your layer order once (@layer reset, base, components, utilities;) and specificity wars disappear. Unlayered styles always beat layered styles — use this for overrides.

Quick Decision Trees

"How do I lay this out?"

Layout approach?
├─ 2D grid (rows + columns)         → CSS Grid
│  ├─ Children must align across    → Grid + Subgrid
│  └─ Waterfall / masonry           → grid-lanes (experimental)
├─ 1D row OR column                 → Flexbox
├─ Component adapts to container    → Container Query + Grid/Flex
├─ Viewport-based responsiveness    → @media range syntax
└─ Element sized to content         → fit-content / min-content / stretch

"How do I style this state?"

Style based on what?
├─ Child/descendant presence        → :has()
├─ Container size                   → @container (inline-size)
├─ Container custom property        → @container style()
├─ Scroll position (stuck/snapped)  → scroll-state() query
├─ Element's own custom property    → if(style(...))
├─ Browser feature support          → @supports
├─ User preference (motion/color)   → @media (prefers-*)
└─ Multiple selectors efficiently   → :is() / :where()

"How do I animate this?"

Animation type?
├─ Enter/appear on DOM              → @starting-style + transition
├─ Exit/disappear (display:none)    → transition-behavior: allow-discrete
├─ Animate to/from auto height      → interpolate-size: allow-keywords
├─ Scroll-linked (parallax/reveal)  → animation-timeline: scroll()/view()
├─ Page/view navigation             → View Transitions API
├─ Custom easing (bounce/spring)    → linear() function
└─ Always: respect user preference  → @media (prefers-reduced-motion)

What CSS Replaced JavaScript For

JavaScript PatternCSS Replacement
Scroll position listenersScroll-driven animations
IntersectionObserver for revealanimation-timeline: view()
Sticky header shadow togglescroll-state(stuck: top)
Floating UI / Popper.jsAnchor positioning
Carousel prev/next/dots::scroll-button(), ::scroll-marker
Auto-expanding textareafield-sizing: content
Staggered animation delayssibling-index()
max-height: 9999px hackinterpolate-size: allow-keywords
Parent element selection:has()
Theme toggle logiclight-dark() + color-scheme
Tooltip/popover show/hidePopover API + invoker commands
Color manipulation functionscolor-mix(), relative color syntax
For non-Baseline features, always feature-detect with @supports or use progressive enhancement. Check MDN or Baseline for current browser support.

Anti-Patterns (CRITICAL)

Anti-PatternProblemFix
Overusing !importantSpecificity arms raceUse @layer for cascade control
Deep nesting (.a .b .c .d)Fragile, DOM-coupledFlat selectors, @scope
IDs for styling (#header)Too specific to overrideClasses (.header)
@media for component layoutViewport-coupled, not reusableContainer queries
JS scroll listeners for effectsJanky, expensiveScroll-driven animations
JS for tooltip positioningFloating UI dependencyAnchor positioning
JS for carousel controlsFragile, a11y issues::scroll-button, ::scroll-marker
JS for auto-expanding textareaUnnecessary complexityfield-sizing: content
max-height: 9999px for animationWrong duration, jankyinterpolate-size: allow-keywords
margin-left / padding-rightBreaks in RTL/verticalLogical properties (margin-inline-start)
rgba() with commasLegacy syntaxrgb(r g b / a) space-separated
appearance: none on selectsRemoves ALL functionalityappearance: base-select
Preprocessor-only variablesCan't change at runtimeCSS custom properties
Preprocessor-only nestingExtra build step dependencyNative CSS nesting
Preprocessor color functionsCan't respond to contextcolor-mix(), relative colors
text-wrap: balance on paragraphsPerformance-heavyOnly headings/short text
content-visibility above foldDelays LCP renderingOnly off-screen sections
Overusing will-changeWastes GPU memoryApply only to animating elements

Reference Documentation

FilePurpose
references/CASCADE.mdNesting, @layer, @scope, cascade control, and CSS architecture
references/LAYOUT.mdGrid, Subgrid, Flexbox, Container Queries, and intrinsic sizing
references/SELECTORS.md:has(), :is(), :where(), pseudo-elements, and state-based selection
references/COLOR.mdOKLCH, color-mix(), relative colors, light-dark(), and theming
references/TOKENS.md@property, @function, if(), math functions, and design tokens
references/ANIMATION.md@starting-style, interpolate-size, linear(), view transitions
references/SCROLL.mdScroll-driven animations, scroll-state queries, native carousels
references/COMPONENTS.mdCustomizable <select>, popover, anchor positioning, field-sizing
references/PERFORMANCE.mdcontent-visibility, typography, logical properties, accessibility
references/CHEATSHEET.mdQuick reference: browser support, legacy→modern patterns, units

Sources

Official Specifications

Browser Vendor Blogs

Reference

Related skills

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.