diff --git a/.github/labeler.yml b/.github/labeler.yml
index 1be04be84..74cf54dc2 100644
--- a/.github/labeler.yml
+++ b/.github/labeler.yml
@@ -113,6 +113,10 @@
- plugins/postcss-nesting/**
- experimental/postcss-nesting/**
+"plugins/postcss-normalize-display-values":
+ - plugins/postcss-normalize-display-values/**
+ - experimental/postcss-normalize-display-values/**
+
"plugins/postcss-overflow-shorthand":
- plugins/postcss-overflow-shorthand/**
- experimental/postcss-overflow-shorthand/**
diff --git a/package-lock.json b/package-lock.json
index 430bd02e5..13e7e8ccb 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1755,6 +1755,10 @@
"resolved": "plugins/postcss-is-pseudo-class",
"link": true
},
+ "node_modules/@csstools/postcss-normalize-display-values": {
+ "resolved": "plugins/postcss-normalize-display-values",
+ "link": true
+ },
"node_modules/@csstools/postcss-tape": {
"resolved": "packages/postcss-tape",
"link": true
@@ -6605,6 +6609,7 @@
}
},
"plugins/postcss-hwb-function": {
+ "name": "@csstools/postcss-hwb-function",
"version": "1.0.0",
"license": "CC0-1.0",
"dependencies": {
@@ -6696,6 +6701,20 @@
"postcss": "^8.3"
}
},
+ "plugins/postcss-normalize-display-values": {
+ "name": "@csstools/postcss-normalize-display-values",
+ "version": "1.0.0",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "peerDependencies": {
+ "postcss": "^8.3"
+ }
+ },
"plugins/postcss-overflow-shorthand": {
"version": "3.0.2",
"license": "CC0-1.0",
@@ -7945,6 +7964,12 @@
"postcss-tape": "^6.0.1"
}
},
+ "@csstools/postcss-normalize-display-values": {
+ "version": "file:plugins/postcss-normalize-display-values",
+ "requires": {
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
"@csstools/postcss-tape": {
"version": "file:packages/postcss-tape",
"requires": {
diff --git a/plugins/postcss-normalize-display-values/.gitignore b/plugins/postcss-normalize-display-values/.gitignore
new file mode 100644
index 000000000..7172b04f1
--- /dev/null
+++ b/plugins/postcss-normalize-display-values/.gitignore
@@ -0,0 +1,6 @@
+node_modules
+package-lock.json
+yarn.lock
+*.result.css
+*.result.css.map
+dist/*
diff --git a/plugins/postcss-normalize-display-values/.nvmrc b/plugins/postcss-normalize-display-values/.nvmrc
new file mode 100644
index 000000000..f0b10f153
--- /dev/null
+++ b/plugins/postcss-normalize-display-values/.nvmrc
@@ -0,0 +1 @@
+v16.13.1
diff --git a/plugins/postcss-normalize-display-values/.tape.mjs b/plugins/postcss-normalize-display-values/.tape.mjs
new file mode 100644
index 000000000..f99d4b4cc
--- /dev/null
+++ b/plugins/postcss-normalize-display-values/.tape.mjs
@@ -0,0 +1,14 @@
+import postcssTape from '../../packages/postcss-tape/dist/index.mjs';
+import plugin from '@csstools/postcss-normalize-display-values';
+
+postcssTape(plugin)({
+ basic: {
+ message: 'supports basic usage',
+ },
+ 'basic:preserve-false': {
+ message: 'supports variables with { preserve: true } usage',
+ options: {
+ preserve: false
+ }
+ },
+});
diff --git a/plugins/postcss-normalize-display-values/CHANGELOG.md b/plugins/postcss-normalize-display-values/CHANGELOG.md
new file mode 100644
index 000000000..72250b28e
--- /dev/null
+++ b/plugins/postcss-normalize-display-values/CHANGELOG.md
@@ -0,0 +1,5 @@
+# Changes to PostCSS Normalize Display Values
+
+### 1.0.0
+
+- Initial version
diff --git a/plugins/postcss-normalize-display-values/INSTALL.md b/plugins/postcss-normalize-display-values/INSTALL.md
new file mode 100644
index 000000000..b0ad3a181
--- /dev/null
+++ b/plugins/postcss-normalize-display-values/INSTALL.md
@@ -0,0 +1,164 @@
+# Installing PostCSS Normalize Display Values
+
+[PostCSS Normalize Display Values] runs in all Node environments, with special
+instructions for:
+
+| [Node](#node) | [PostCSS CLI](#postcss-cli) | [Webpack](#webpack) | [Create React App](#create-react-app) | [Gulp](#gulp) | [Grunt](#grunt) |
+| --- | --- | --- | --- | --- | --- |
+
+## Node
+
+Add [PostCSS Normalize Display Values] to your project:
+
+```bash
+npm install postcss @csstools/postcss-normalize-display-values --save-dev
+```
+
+Use it as a [PostCSS] plugin:
+
+```js
+const postcss = require('postcss');
+const postcssNormalizeDisplayValues = require('@csstools/postcss-normalize-display-values');
+
+postcss([
+ postcssNormalizeDisplayValues(/* pluginOptions */)
+]).process(YOUR_CSS /*, processOptions */);
+```
+
+## PostCSS CLI
+
+Add [PostCSS CLI] to your project:
+
+```bash
+npm install postcss-cli --save-dev
+```
+
+Use [PostCSS Normalize Display Values] in your `postcss.config.js` configuration
+file:
+
+```js
+const postcssNormalizeDisplayValues = require('@csstools/postcss-normalize-display-values');
+
+module.exports = {
+ plugins: [
+ postcssNormalizeDisplayValues(/* pluginOptions */)
+ ]
+}
+```
+
+## Webpack
+
+Add [PostCSS Loader] to your project:
+
+```bash
+npm install postcss-loader --save-dev
+```
+
+Use [PostCSS Normalize Display Values] in your Webpack configuration:
+
+```js
+const postcssNormalizeDisplayValues = require('@csstools/postcss-normalize-display-values');
+
+module.exports = {
+ module: {
+ rules: [
+ {
+ test: /\.css$/,
+ use: [
+ 'style-loader',
+ { loader: 'css-loader', options: { importLoaders: 1 } },
+ { loader: 'postcss-loader', options: {
+ ident: 'postcss',
+ plugins: () => [
+ postcssNormalizeDisplayValues(/* pluginOptions */)
+ ]
+ } }
+ ]
+ }
+ ]
+ }
+}
+```
+
+## Create React App
+
+Add [React App Rewired] and [React App Rewire PostCSS] to your project:
+
+```bash
+npm install react-app-rewired react-app-rewire-postcss --save-dev
+```
+
+Use [React App Rewire PostCSS] and [PostCSS Normalize Display Values] in your
+`config-overrides.js` file:
+
+```js
+const reactAppRewirePostcss = require('react-app-rewire-postcss');
+const postcssNormalizeDisplayValues = require('@csstools/postcss-normalize-display-values');
+
+module.exports = config => reactAppRewirePostcss(config, {
+ plugins: () => [
+ postcssNormalizeDisplayValues(/* pluginOptions */)
+ ]
+});
+```
+
+## Gulp
+
+Add [Gulp PostCSS] to your project:
+
+```bash
+npm install gulp-postcss --save-dev
+```
+
+Use [PostCSS Normalize Display Values] in your Gulpfile:
+
+```js
+const postcss = require('gulp-postcss');
+const postcssNormalizeDisplayValues = require('@csstools/postcss-normalize-display-values');
+
+gulp.task('css', () => gulp.src('./src/*.css').pipe(
+ postcss([
+ postcssNormalizeDisplayValues(/* pluginOptions */)
+ ])
+).pipe(
+ gulp.dest('.')
+));
+```
+
+## Grunt
+
+Add [Grunt PostCSS] to your project:
+
+```bash
+npm install grunt-postcss --save-dev
+```
+
+Use [PostCSS Normalize Display Values] in your Gruntfile:
+
+```js
+const postcssNormalizeDisplayValues = require('@csstools/postcss-normalize-display-values');
+
+grunt.loadNpmTasks('grunt-postcss');
+
+grunt.initConfig({
+ postcss: {
+ options: {
+ use: [
+ postcssNormalizeDisplayValues(/* pluginOptions */)
+ ]
+ },
+ dist: {
+ src: '*.css'
+ }
+ }
+});
+```
+
+[Gulp PostCSS]: https://github.com/postcss/gulp-postcss
+[Grunt PostCSS]: https://github.com/nDmitry/grunt-postcss
+[PostCSS]: https://github.com/postcss/postcss
+[PostCSS CLI]: https://github.com/postcss/postcss-cli
+[PostCSS Loader]: https://github.com/postcss/postcss-loader
+[PostCSS Normalize Display Values]: https://github.com/csstools/postcss-plugins/tree/main/plugins/postcss-normalize-display-values
+[React App Rewire PostCSS]: https://github.com/csstools/react-app-rewire-postcss
+[React App Rewired]: https://github.com/timarney/react-app-rewired
diff --git a/plugins/postcss-normalize-display-values/LICENSE.md b/plugins/postcss-normalize-display-values/LICENSE.md
new file mode 100644
index 000000000..0bc1fa706
--- /dev/null
+++ b/plugins/postcss-normalize-display-values/LICENSE.md
@@ -0,0 +1,108 @@
+# CC0 1.0 Universal
+
+## Statement of Purpose
+
+The laws of most jurisdictions throughout the world automatically confer
+exclusive Copyright and Related Rights (defined below) upon the creator and
+subsequent owner(s) (each and all, an “owner”) of an original work of
+authorship and/or a database (each, a “Work”).
+
+Certain owners wish to permanently relinquish those rights to a Work for the
+purpose of contributing to a commons of creative, cultural and scientific works
+(“Commons”) that the public can reliably and without fear of later claims of
+infringement build upon, modify, incorporate in other works, reuse and
+redistribute as freely as possible in any form whatsoever and for any purposes,
+including without limitation commercial purposes. These owners may contribute
+to the Commons to promote the ideal of a free culture and the further
+production of creative, cultural and scientific works, or to gain reputation or
+greater distribution for their Work in part through the use and efforts of
+others.
+
+For these and/or other purposes and motivations, and without any expectation of
+additional consideration or compensation, the person associating CC0 with a
+Work (the “Affirmer”), to the extent that he or she is an owner of Copyright
+and Related Rights in the Work, voluntarily elects to apply CC0 to the Work and
+publicly distribute the Work under its terms, with knowledge of his or her
+Copyright and Related Rights in the Work and the meaning and intended legal
+effect of CC0 on those rights.
+
+1. Copyright and Related Rights. A Work made available under CC0 may be
+ protected by copyright and related or neighboring rights (“Copyright and
+ Related Rights”). Copyright and Related Rights include, but are not limited
+ to, the following:
+ 1. the right to reproduce, adapt, distribute, perform, display, communicate,
+ and translate a Work;
+ 2. moral rights retained by the original author(s) and/or performer(s);
+ 3. publicity and privacy rights pertaining to a person’s image or likeness
+ depicted in a Work;
+ 4. rights protecting against unfair competition in regards to a Work,
+ subject to the limitations in paragraph 4(i), below;
+ 5. rights protecting the extraction, dissemination, use and reuse of data in
+ a Work;
+ 6. database rights (such as those arising under Directive 96/9/EC of the
+ European Parliament and of the Council of 11 March 1996 on the legal
+ protection of databases, and under any national implementation thereof,
+ including any amended or successor version of such directive); and
+ 7. other similar, equivalent or corresponding rights throughout the world
+ based on applicable law or treaty, and any national implementations
+ thereof.
+
+2. Waiver. To the greatest extent permitted by, but not in contravention of,
+ applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and
+ unconditionally waives, abandons, and surrenders all of Affirmer’s Copyright
+ and Related Rights and associated claims and causes of action, whether now
+ known or unknown (including existing as well as future claims and causes of
+ action), in the Work (i) in all territories worldwide, (ii) for the maximum
+ duration provided by applicable law or treaty (including future time
+ extensions), (iii) in any current or future medium and for any number of
+ copies, and (iv) for any purpose whatsoever, including without limitation
+ commercial, advertising or promotional purposes (the “Waiver”). Affirmer
+ makes the Waiver for the benefit of each member of the public at large and
+ to the detriment of Affirmer’s heirs and successors, fully intending that
+ such Waiver shall not be subject to revocation, rescission, cancellation,
+ termination, or any other legal or equitable action to disrupt the quiet
+ enjoyment of the Work by the public as contemplated by Affirmer’s express
+ Statement of Purpose.
+
+3. Public License Fallback. Should any part of the Waiver for any reason be
+ judged legally invalid or ineffective under applicable law, then the Waiver
+ shall be preserved to the maximum extent permitted taking into account
+ Affirmer’s express Statement of Purpose. In addition, to the extent the
+ Waiver is so judged Affirmer hereby grants to each affected person a
+ royalty-free, non transferable, non sublicensable, non exclusive,
+ irrevocable and unconditional license to exercise Affirmer’s Copyright and
+ Related Rights in the Work (i) in all territories worldwide, (ii) for the
+ maximum duration provided by applicable law or treaty (including future time
+ extensions), (iii) in any current or future medium and for any number of
+ copies, and (iv) for any purpose whatsoever, including without limitation
+ commercial, advertising or promotional purposes (the “License”). The License
+ shall be deemed effective as of the date CC0 was applied by Affirmer to the
+ Work. Should any part of the License for any reason be judged legally
+ invalid or ineffective under applicable law, such partial invalidity or
+ ineffectiveness shall not invalidate the remainder of the License, and in
+ such case Affirmer hereby affirms that he or she will not (i) exercise any
+ of his or her remaining Copyright and Related Rights in the Work or (ii)
+ assert any associated claims and causes of action with respect to the Work,
+ in either case contrary to Affirmer’s express Statement of Purpose.
+
+4. Limitations and Disclaimers.
+ 1. No trademark or patent rights held by Affirmer are waived, abandoned,
+ surrendered, licensed or otherwise affected by this document.
+ 2. Affirmer offers the Work as-is and makes no representations or warranties
+ of any kind concerning the Work, express, implied, statutory or
+ otherwise, including without limitation warranties of title,
+ merchantability, fitness for a particular purpose, non infringement, or
+ the absence of latent or other defects, accuracy, or the present or
+ absence of errors, whether or not discoverable, all to the greatest
+ extent permissible under applicable law.
+ 3. Affirmer disclaims responsibility for clearing rights of other persons
+ that may apply to the Work or any use thereof, including without
+ limitation any person’s Copyright and Related Rights in the Work.
+ Further, Affirmer disclaims responsibility for obtaining any necessary
+ consents, permissions or other rights required for any use of the Work.
+ 4. Affirmer understands and acknowledges that Creative Commons is not a
+ party to this document and has no duty or obligation with respect to this
+ CC0 or use of the Work.
+
+For more information, please see
+http://creativecommons.org/publicdomain/zero/1.0/.
diff --git a/plugins/postcss-normalize-display-values/README.md b/plugins/postcss-normalize-display-values/README.md
new file mode 100644
index 000000000..80caf5c95
--- /dev/null
+++ b/plugins/postcss-normalize-display-values/README.md
@@ -0,0 +1,86 @@
+# PostCSS Normalize Display Values [][postcss]
+
+[
][npm-url]
+[
][css-url]
+[
][cli-url]
+[
][discord]
+
+[PostCSS Normalize Display Values] lets you specify definition of outer and inner displays types for an element.
+
+```pcss
+.element {
+ display: inline flow-root;
+}
+
+/* becomes */
+
+.element {
+ display: inline-block;
+ display: inline flow-root;
+}
+```
+
+_See prior work by [cssnano](https://github.com/cssnano) here [postcss-normalize-display-values](https://github.com/cssnano/cssnano/tree/master/packages/postcss-normalize-display-values)
+To ensure long term maintenance and to provide the needed features this plugin was recreated based on cssnano's work._
+
+## Usage
+
+Add [PostCSS Normalize Display Values] to your project:
+
+```bash
+npm install postcss @csstools/postcss-normalize-display-values --save-dev
+```
+
+Use it as a [PostCSS] plugin:
+
+```js
+const postcss = require('postcss');
+const postcssNormalizeDisplayValues = require('@csstools/postcss-normalize-display-values');
+
+postcss([
+ postcssNormalizeDisplayValues(/* pluginOptions */)
+]).process(YOUR_CSS /*, processOptions */);
+```
+
+[PostCSS Normalize Display Values] runs in all Node environments, with special
+instructions for:
+
+| [Node](INSTALL.md#node) | [PostCSS CLI](INSTALL.md#postcss-cli) | [Webpack](INSTALL.md#webpack) | [Create React App](INSTALL.md#create-react-app) | [Gulp](INSTALL.md#gulp) | [Grunt](INSTALL.md#grunt) |
+| --- | --- | --- | --- | --- | --- |
+
+## Options
+
+### preserve
+
+The `preserve` option determines whether the original source
+is preserved. By default, it is preserved.
+
+```js
+postcssNormalizeDisplayValues({ preserve: false })
+```
+
+```pcss
+.element {
+ display: inline flow-root;
+}
+
+/* becomes */
+
+.element {
+ display: inline-block;
+}
+```
+
+[postcss]: https://github.com/postcss/postcss
+
+[cli-url]: https://github.com/csstools/postcss-plugins/actions/workflows/test.yml?query=workflow/test
+[css-url]: https://cssdb.org/#display-two-values
+[discord]: https://discord.gg/bUadyRwkJS
+[npm-url]: https://www.npmjs.com/package/@csstools/postcss-normalize-display-values
+
+[CSS Fonts]: https://www.w3.org/TR/css-display-3/#the-display-properties
+[Gulp PostCSS]: https://github.com/postcss/gulp-postcss
+[Grunt PostCSS]: https://github.com/nDmitry/grunt-postcss
+[PostCSS]: https://github.com/postcss/postcss
+[PostCSS Loader]: https://github.com/postcss/postcss-loader
+[PostCSS Normalize Display Values]: https://github.com/csstools/postcss-plugins/tree/main/plugins/postcss-normalize-display-values
diff --git a/plugins/postcss-normalize-display-values/package.json b/plugins/postcss-normalize-display-values/package.json
new file mode 100644
index 000000000..05f51e25b
--- /dev/null
+++ b/plugins/postcss-normalize-display-values/package.json
@@ -0,0 +1,71 @@
+{
+ "name": "@csstools/postcss-normalize-display-values",
+ "version": "1.0.0",
+ "description": "Use two values display syntax for inner and outer display types.",
+ "author": "Jonathan Neal