Plumeria 16.2
2026-07-13
Plumeria v16.2 introduces validate-pseudos in @plumeria/eslint-plugin, a new rule to validate CSS pseudo-classes and pseudo-elements inside css.create().
Plumeria extracts styles during compilation, so invalid pseudo-selectors or typos can slip through to production unnoticed. The new validate-pseudos rule catches these at lint time. It is included in plumeria.configs.recommended as an error by default, and comprehensively covers legacy (:before), functional (:nth-child(2n)), and chained (:hover::after) selectors.
import * as css from '@plumeria/core';
css.create({
button: {
':hover::before': { content: '""' }, // ✅
':nth-child(2n)': { color: 'red' }, // ✅
':hovver': { color: 'blue' }, // ❌ Invalid pseudo-class
':hover::befor': { content: '""' }, // ❌ Invalid pseudo-element
}
});When TypeScript type information is available, the rule also resolves and validates computed keys:
const pseudo = ':hovver' as const;
css.create({
button: {
[pseudo]: { color: 'red' }, // ❌ Error: Invalid pseudo-class: ":hovver"
}
});Parallel Build Integration (Fail Fast)
To prevent compiling when linting checks fail, you can run plumerialint in parallel with your build command using the -- separator:
{
"scripts": {
"build": "plumerialint -- next build"
}
}If plumerialint detects any styling errors or warnings, it will print the diagnostics, immediately abort/kill the parallel build process (next build), and exit with a non-zero code. This avoids compiling when styling validation fails.
Modern Selectors Support
The validation reference has been updated to support modern CSS pseudo-selectors:
- Pseudo-classes:
:popover-open,:state(),:host,:host(),:host-context() - Pseudo-elements:
::details-content,::file-selector-button,::target-text,::highlight()
css.create({
input: {
'::file-selector-button': { backgroundColor: 'purple' },
},
popover: {
':popover-open': { boxShadow: '0 4px 12px rgba(0,0,0,0.1)' },
},
});Fixes
16.2.12 (Jul 20, 2026)
- Feat: export getRootIdentifier (utils)
- Fix: throw an unknown function
16.2.11 (Jul 20, 2026)
- Fix: extend overrideLonghand scope to pseudo-selectors
- Fix: enable validate-pseudos rule for the plumerialint command
16.2.10 (Jul 18, 2026)
- Refactor: improve acquireLock (turbopack-loader)
- Fix: incremental generation HMR and initial startup in dev mode
16.2.9 (Jul 17, 2026)
- Update npm core README.md
16.2.8 (Jul 17, 2026)
- Update @rust-gear/glob to v1.1.0
16.2.7 (Jul 16, 2026)
- Perf: update dependencies code(utils parser performance)
16.2.6 (Jul 16, 2026)
- Fix: change index to key hash(classString) in parser.ts
- Fix: change x.index and entry.index to x.key and entry.key in compiler
- Fix: change the reverse edge to a safe implementation and switched the key from index to key also output the CSS prop on the parent side
- Fix: fix use function and export CSSProperties
16.2.5 (Jul 15, 2026)
- Fix: style-name-requires-imports rule add fix feature
16.2.4 (Jul 14, 2026)
- Fix: Next.js variant bracket bugfix
16.2.3 (Jul 14, 2026)
- Fix: add getFileDependencies and resolveExport
- Fix: dependencies graph and re export
- Fix: remove warning in plumerialint
16.2.2 (Jul 13, 2026)
- Fix: inspector support other css
16.2.1 (Jul 12, 2026)
- Feat: parallel run oxlint for CLI
Thanks for building with Plumeria! If you have any feedback or questions, please let us know on GitHub Discussions or GitHub Issues.