An open API service indexing awesome lists of open source software.

https://github.com/oe/postcss-logical-polyfill

A PostCSS plugin that provides physical property polyfills for CSS logical properties, enabling backward compatibility for older browsers and environments that don't support logical properties natively
https://github.com/oe/postcss-logical-polyfill

css css-logical css-logical-properties logical-properties polyfill postcss rtl

Last synced: 4 months ago
JSON representation

A PostCSS plugin that provides physical property polyfills for CSS logical properties, enabling backward compatibility for older browsers and environments that don't support logical properties natively

Awesome Lists containing this project

README

          

# postcss-logical-polyfill

[![NPM Version][npm-img]][npm-url]
[![Build Status][build-img]][build-url]
[![Coverage Status][coverage-img]][coverage-url]
[![NPM Downloads][downloads-img]][downloads-url]
[![Types][types-img]][types-url]
[![Package Size][size-img]][size-url]

A PostCSS plugin that transforms CSS logical properties into physical properties with appropriate direction selectors, enabling backward compatibility for older browsers.

## Quick Start

### Installation

```bash
# Using npm
npm install postcss-logical-polyfill --save-dev
# Using pnpm
pnpm add -D postcss-logical-polyfill
# Using yarn
yarn add -D postcss-logical-polyfill
```

### Basic Usage

[Playground](http://app.evecalm.com/postcss-logical-polyfill/playground/)

[Full document](https://app.evecalm.com/postcss-logical-polyfill/)

```js
// postcss.config.js
module.exports = {
plugins: [
require('postcss-logical-polyfill')()
]
}
```

### Example Transformation

**Input CSS:**
```css
.container {
margin-inline: 1rem;
padding-block: 2rem;
border-inline-start: 2px solid blue;
}
```

**Output CSS:**
```css
.container {
margin-left: 1rem;
margin-right: 1rem;
padding-top: 2rem;
padding-bottom: 2rem;
}
[dir="ltr"] .container {
border-left: 2px solid blue;
}
[dir="rtl"] .container {
border-right: 2px solid blue;
}
```

## Key Features

- **๐Ÿ”„ Polyfill Direction**: Transforms logical properties โ†’ physical properties (reverse of most tools)
- **๐ŸŽฏ Smart Generation**: Creates both LTR and RTL versions automatically
- **โšก Optimized Output**: Block-direction properties generate single rules (no duplication)
- **๐Ÿ”— Extended Support**: Includes scroll properties and logical values via integrated shim
- **๐Ÿงช Experimental Features**: Linear gradient logical directions and draft CSS specs
- **๐ŸŽ›๏ธ Configurable**: Custom selectors and output order control
- **๐Ÿ—๏ธ Framework Ready**: Works with any build tool or CSS framework

## Why Use This Plugin?

While modern browsers support CSS logical properties, older browsers don't. This plugin acts as a polyfill, converting your modern logical properties to physical properties that work everywhere, while preserving the directional behavior for international layouts.

**Perfect for:**
- โœ… Supporting older browsers while using modern CSS
- โœ… Gradual migration from physical to logical properties
- โœ… RTL/LTR internationalization
- โœ… Framework integration with directional layouts

## Installation

```bash
# Using npm
npm install postcss-logical-polyfill --save-dev

# Using pnpm
pnpm add -D postcss-logical-polyfill

# Using yarn
yarn add -D postcss-logical-polyfill
```

## What It Does

This plugin transforms **CSS Logical Properties** into physical properties with appropriate direction selectors for browser compatibility. It intelligently processes:

- **All standard logical properties** (margin, padding, border, inset, sizing, etc.)
- **Logical values** (float: inline-start, clear: inline-end, resize: block)
- **Scroll properties** (scroll-margin, scroll-padding)
- **Experimental features** (linear-gradient logical directions)
- **Both scoped and unscoped** logical properties

**โžก๏ธ [Complete supported properties list](./docs/SUPPORTED-PROPERTIES.md)**

## Configuration

### Basic Options

```js
const logicalPolyfill = require('postcss-logical-polyfill');

postcss([
logicalPolyfill({
// Direction selectors (default shown)
rtl: { selector: '[dir="rtl"]' },
ltr: { selector: '[dir="ltr"]' },

// Output order for unscoped properties
outputOrder: 'ltr-first' // or 'rtl-first'
})
])
```

**โžก๏ธ [Complete configuration guide](./docs/ADVANCED-USAGE.md)**

## Example Transformation

**Input CSS:**
```css
/* Unscoped logical properties - will generate both LTR and RTL versions */
.container {
margin-inline: 1rem;
padding-inline-start: 1rem;
}

/* Block-direction properties - Generate single optimized rule */
.content {
margin-block: 2rem;
padding-block-start: 1rem;
}

/* Extended logical properties via shim system */
.scroll-area {
scroll-margin-inline: 10px;
float: inline-start;
}

/* Experimental: Linear gradient logical directions */
.gradient-element {
background: linear-gradient(to inline-end, red, blue);
}
```

**Output CSS:**
```css
.container {
margin-left: 1rem;
margin-right: 1rem;
}
[dir="ltr"] .container {
padding-left: 1rem;
}
[dir="rtl"] .container {
padding-right: 1rem;
}

/* Block-direction properties - Single optimized rule */
.content {
margin-top: 2rem;
margin-bottom: 2rem;
padding-top: 1rem;
}

/* Extended logical properties transformed */
.scroll-area {
scroll-margin-left: 10px;
scroll-margin-right: 10px;
}
[dir="ltr"] .scroll-area {
float: left;
}
[dir="rtl"] .scroll-area {
float: right;
}

/* Experimental features automatically enabled */
[dir="ltr"] .gradient-element {
background: linear-gradient(to right, red, blue);
}
[dir="rtl"] .gradient-element {
background: linear-gradient(to left, red, blue);
}
```

## How It Works

This plugin intelligently processes CSS through a 7-phase optimization pipeline:

1. **๐Ÿ” Detection**: Identifies logical properties and existing direction selectors
2. **๐ŸŽฏ Classification**: Separates block-direction, inline-direction, and mixed properties
3. **๐Ÿ”„ Transformation**: Converts logical to physical properties based on direction context
4. **๐ŸŽฏ Selector Application**: Adds appropriate direction selectors when needed
5. **๐Ÿ”ง Optimization**: Merges rules and eliminates redundant declarations
6. **๐ŸŽฏ Smart Priority**: Implements rightmost selector precedence for predictable behavior
7. **โœจ Output**: Generates clean, optimized CSS for maximum compatibility

**โžก๏ธ [Detailed technical explanation](./docs/HOW-IT-WORKS.md)**

## Getting Started

### Installation

```bash
npm install postcss-logical-polyfill --save-dev
```

### Basic Setup

```js
// postcss.config.js
module.exports = {
plugins: [
require('postcss-logical-polyfill')()
]
}
```

### Build Tool Integration

**โžก๏ธ [Integration guides for Webpack, Vite, Next.js, and more](./docs/INTEGRATION-GUIDE.md)**

## Important Notes

### HTML Direction Attribute Required

You **must** set the `dir` attribute on your HTML for the generated CSS to work:

```html


```

Without the `dir` attribute, the generated `[dir="ltr"]` and `[dir="rtl"]` selectors won't match.

### Custom Selectors

You can configure custom direction selectors for your framework:

```js
logicalPolyfill({
ltr: { selector: '.ltr' },
rtl: { selector: '.rtl' }
})
```

**โžก๏ธ [Complete usage guide and best practices](./docs/ADVANCED-USAGE.md)**

## Examples

This package includes ready-to-run examples for different build systems and use cases.

```bash
# View all available examples
ls examples/

# Run specific examples
cd examples/basic && npx tsx process.ts
cd examples/webpack && npx tsx process.ts
cd examples/sass && npx tsx process.ts

# Run all examples at once
pnpm run examples
```

**Available examples:**
- **Basic**: Plain CSS with PostCSS
- **Build Tools**: Webpack integration
- **Preprocessors**: SASS and LESS integration
- **Configuration**: Output order and selector priority
- **CLI**: PostCSS command-line usage

**โžก๏ธ [View all examples](./examples/README.md)**

## Troubleshooting

Having issues? Check our troubleshooting guide for common problems and solutions.

**โžก๏ธ [Complete troubleshooting guide](./docs/TROUBLESHOOTING.md)**

## Documentation

- **[๐Ÿ“– Full Documentation](./docs/)** - Complete documentation site built with Astro Starlight
- **[๐Ÿš€ Getting Started Guide](./docs/src/content/docs/getting-started/introduction.mdx)** - Quick start and installation
- **[โš™๏ธ Configuration](./docs/src/content/docs/guides/configuration.mdx)** - Configuration options and framework integration
- **[๐Ÿ“‹ Supported Properties](./docs/src/content/docs/references/supported-properties.mdx)** - Complete reference of all supported logical properties
- **[๐Ÿ”ง How It Works](./docs/src/content/docs/guides/how-it-works.mdx)** - Technical details about the processing pipeline
- **[๐ŸŽฎ Interactive Playground](./docs/src/content/docs/playground.mdx)** - Try the plugin online with live preview

## Learn More

- **[CSS Logical Properties and Values (MDN)](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_logical_properties_and_values)** - Official documentation and browser support information

## Requirements

- Node.js 16.0.0 or later
- PostCSS 8.0.0 or later

## Contributing

Contributions are welcome! Please see our [contributing guidelines](./CONTRIBUTING.md) for details.

## Credits

This plugin wraps and extends [postcss-logical](https://github.com/csstools/postcss-plugins/tree/main/plugins/postcss-logical) to provide polyfill functionality.

## License

[MIT](./LICENSE)

[npm-url]: https://www.npmjs.com/package/postcss-logical-polyfill
[npm-img]: https://img.shields.io/npm/v/postcss-logical-polyfill
[build-url]: https://github.com/oe/postcss-logical-polyfill/actions/workflows/ci.yml
[build-img]: https://github.com/oe/postcss-logical-polyfill/actions/workflows/ci.yml/badge.svg
[coverage-url]: https://codecov.io/gh/oe/postcss-logical-polyfill
[coverage-img]: https://codecov.io/gh/oe/postcss-logical-polyfill/branch/main/graph/badge.svg
[downloads-url]: https://www.npmjs.com/package/postcss-logical-polyfill
[downloads-img]: https://img.shields.io/npm/dm/postcss-logical-polyfill
[size-url]: https://packagephobia.com/result?p=postcss-logical-polyfill
[size-img]: https://packagephobia.com/badge?p=postcss-logical-polyfill
[types-url]: https://www.npmjs.com/package/postcss-logical-polyfill
[types-img]: https://img.shields.io/npm/types/postcss-logical-polyfill