Use modern CSS features - custom properties, container queries, :has(), @layer, CSS nesting
Provides guidance on modern CSS features like container queries, :has(), and CSS nesting with browser compatibility data and fallback patterns. Use when implementing cutting-edge CSS that needs progressive enhancement.
/plugin marketplace add pluginagentmarketplace/custom-plugin-css/plugin install css-assistant@pluginagentmarketplace-cssThis skill inherits all available tools. When active, it can use any tool Claude has access to.
assets/config.yamlassets/schema.jsonreferences/GUIDE.mdreferences/PATTERNS.mdscripts/validate.pyMaster cutting-edge CSS features: custom properties, container queries, :has(), @layer, and native CSS nesting.
This skill provides atomic, focused guidance on modern CSS features (2022-2025) with browser compatibility information and fallback strategies.
| Property | Value |
|---|---|
| Category | Modern CSS |
| Complexity | Advanced to Expert |
| Dependencies | css-fundamentals |
| Bonded Agent | 07-css-modern-features |
Skill("css-modern")
parameters:
feature:
type: string
required: true
enum: [custom-properties, container-queries, has-selector, layers, nesting, logical-properties]
description: Modern CSS feature to explore
include_fallback:
type: boolean
required: false
default: true
description: Include browser fallback patterns
browser_support:
type: boolean
required: false
default: true
description: Include compatibility information
validation:
- rule: feature_required
message: "feature parameter is required"
- rule: valid_feature
message: "feature must be one of: custom-properties, container-queries..."
retry_config:
max_attempts: 3
backoff_type: exponential
initial_delay_ms: 1000
max_delay_ms: 10000
logging:
entry_point: skill_invoked
exit_point: skill_completed
metrics:
- invocation_count
- feature_usage
- fallback_requests
/* Definition */
:root {
--color-primary: #3b82f6;
--spacing-md: 1rem;
}
/* Usage */
.button {
background: var(--color-primary);
padding: var(--spacing-md);
}
/* With fallback */
color: var(--text-color, black);
/* With calc() */
margin: calc(var(--spacing-md) * 2);
/* Define container */
.card-wrapper {
container-type: inline-size;
container-name: card;
}
/* Query container */
@container card (min-width: 400px) {
.card {
display: grid;
grid-template-columns: 200px 1fr;
}
}
/* Container units */
.card-title {
font-size: clamp(1rem, 5cqi, 2rem);
}
/* Style parent based on child */
.card:has(.card-image) {
padding-top: 0;
}
/* Form validation styling */
.form:has(:invalid) .submit-btn {
opacity: 0.5;
pointer-events: none;
}
/* Style previous sibling */
.item:has(+ .item:hover) {
transform: translateX(-5px);
}
/* Check for empty state */
.list:not(:has(li)) {
display: none;
}
/* Define layer order */
@layer reset, base, components, utilities;
@layer reset {
*, *::before, *::after {
margin: 0;
box-sizing: border-box;
}
}
@layer components {
.button {
padding: 0.5rem 1rem;
}
}
@layer utilities {
.hidden { display: none !important; }
}
.card {
background: white;
border-radius: 8px;
& .card-header {
padding: 1rem;
border-bottom: 1px solid #eee;
}
&:hover {
box-shadow: 0 4px 12px rgba(0,0,0,0.1);
}
@media (min-width: 768px) {
display: grid;
grid-template-columns: 1fr 2fr;
}
}
| Feature | Chrome | Firefox | Safari | Edge |
|---|---|---|---|---|
| Custom Properties | 49+ | 31+ | 9.1+ | 15+ |
| Container Queries | 105+ | 110+ | 16+ | 105+ |
| :has() | 105+ | 121+ | 15.4+ | 105+ |
| @layer | 99+ | 97+ | 15.4+ | 99+ |
| CSS Nesting | 120+ | 117+ | 17.2+ | 120+ |
/* Feature detection */
@supports (container-type: inline-size) {
.wrapper {
container-type: inline-size;
}
}
/* Fallback for :has() */
@supports not selector(:has(*)) {
/* JavaScript-based alternative styles */
.card.has-image {
padding-top: 0;
}
}
/* Base experience */
.card {
padding: 1rem;
}
/* Enhanced for modern browsers */
@supports (container-type: inline-size) {
.card-wrapper {
container-type: inline-size;
}
@container (min-width: 400px) {
.card {
display: grid;
}
}
}
describe('CSS Modern Skill', () => {
test('validates feature parameter', () => {
expect(() => skill({ feature: 'invalid' }))
.toThrow('feature must be one of: custom-properties...');
});
test('includes fallback when flag is true', () => {
const result = skill({ feature: 'container-queries', include_fallback: true });
expect(result).toContain('@supports');
});
test('includes browser support when flag is true', () => {
const result = skill({ feature: 'has-selector', browser_support: true });
expect(result).toContain('Chrome');
expect(result).toContain('Safari');
});
});
| Error Code | Cause | Recovery |
|---|---|---|
| INVALID_FEATURE | Unknown feature | Show valid options |
| BROWSER_UNSUPPORTED | Feature not available | Provide @supports fallback |
| PERFORMANCE_WARNING | :has() used broadly | Suggest scope limitation |
This skill should be used when the user asks to "create a slash command", "add a command", "write a custom command", "define command arguments", "use command frontmatter", "organize commands", "create command with file references", "interactive command", "use AskUserQuestion in command", or needs guidance on slash command structure, YAML frontmatter fields, dynamic arguments, bash execution in commands, user interaction patterns, or command development best practices for Claude Code.
This skill should be used when the user asks to "create an agent", "add an agent", "write a subagent", "agent frontmatter", "when to use description", "agent examples", "agent tools", "agent colors", "autonomous agent", or needs guidance on agent structure, system prompts, triggering conditions, or agent development best practices for Claude Code plugins.
This skill should be used when the user asks to "create a hook", "add a PreToolUse/PostToolUse/Stop hook", "validate tool use", "implement prompt-based hooks", "use ${CLAUDE_PLUGIN_ROOT}", "set up event-driven automation", "block dangerous commands", or mentions hook events (PreToolUse, PostToolUse, Stop, SubagentStop, SessionStart, SessionEnd, UserPromptSubmit, PreCompact, Notification). Provides comprehensive guidance for creating and implementing Claude Code plugin hooks with focus on advanced prompt-based hooks API.