Plumeria 16.2

2026-07-13

refirst11
refirst11Core team members

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:

package.json
{
  "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.