Stylelint Use Logical
Enforce usage of logical properties and values in CSS
Install / Use
npx skills add csstools/stylelint-use-logicalInstalls into whichever agent you are using.
README
Property Use Logical <img src="https://jonathantneal.github.io/stylelint-logo.svg" alt="stylelint" width="90" height="90" align="right">
Property Use Logical is a stylelint rule to enforce the usage of Logical Properties and Values in CSS.
Physical dimensions and directions are described left to right and top to bottom, while their logical counterparts are described start to end and inline or block.
ℹ️ NOTE: this project is largely in maintenance mode
Consider using the Layout Mappings rules which are now built into Stylelint.
For example, to add spacing before the start of a paragraph, we might use the
physical padding-left property.
p {
padding-left: 2em;
}
Were the content Hebrew or Arabic — flowing right to left — then we might
use alternating padding-left and padding-right properties.
p:dir(ltr) {
padding-left: 2em;
}
p:dir(rtl) {
padding-right: 2em;
}
Selector weight aside, we can instead use the logical padding-inline-start
property.
p {
padding-inline-start: 2em;
}
Similarly, physical horizontal and vertical dimensions are described more succinctly using their logical counterparts.
h1, h2, h3 {
margin-top: 1em;
margin-bottom: 1em;
}
blockquote {
margin-left: 1em;
margin-right: 1em;
}
/* becomes */
h1, h2, h3 {
margin-block: 1em;
}
blockquote {
margin-inline: 1em;
}
Usage
Add stylelint and Property Use Logical to your project.
npm install stylelint stylelint-use-logical --save-dev
Add Property Use Logical to your stylelint configuration.
{
"plugins": [
"stylelint-use-logical"
],
"rules": {
"csstools/use-logical": ("always" || true) || ("ignore" || false || null)
}
}
Options
always
The "always" option (alternatively true) requires logical properties and
values to be used, and the following patterns are not considered violations:
.inset {
inset: 0;
}
.margin {
margin-inline-start: 0;
}
.padding {
padding-inline: 0;
}
.float {
float: inline-start;
}
.text-align {
text-align: start;
}
.text-align-ignored:dir(ltr) {
text-align: left;
}
While the following patterns are considered violations:
.inset {
top: 0;
right: 0;
bottom: 0;
left: 0;
}
.margin {
margin-left: 0;
}
.padding {
padding-left: 0;
padding-right: 0;
}
.float {
float: left;
}
.text-align {
text-align: left;
}
ignore
The "ignore" option (alternatively false or null) disables the rule.
Secondary Options
except
The except option ignores reporting or autofixing properties and values
matching a case-insensitive string or regular expression.
{
"rules": {
"csstools/use-logical": ["always", { "except": ['float', /^margin/i] }]
}
}
direction
The direction option controls whether left to right or right to left
properties and values should be reported or autofixed.
{
"rules": {
"csstools/use-logical": ["always", { "direction": "ltr" || "rtl" }]
}
}
Property and Value Mapping
Assuming left to right directionality:
| Physical Property | Logical Property |
| ----------------- | ---------------------- |
| top | inset-block-start |
| right | inset-inline-end |
| bottom | inset-block-end |
| left | inset-inline-start |
| Physical Property | Logical Property |
| ----------------- | ---------------------- |
| margin-top | margin-block-start |
| margin-right | margin-inline-end |
| margin-bottom | margin-block-end |
| margin-left | margin-inline-start |
| Physical Property | Logical Property |
| ----------------- | ---------------------- |
| padding-top | padding-block-start |
| padding-right | padding-inline-end |
| padding-bottom | padding-block-end |
| padding-left | padding-inline-start |
| Physical Property | Logical Property |
| ----------------- | ---------------------- |
| width | inline-size |
| min-width | min-inline-size |
| max-width | max-inline-size |
| height | block-size |
| min-height | min-block-size |
| max-height | max-block-size |
| Physical Property | Logical Property |
| --------------------------- | --------------------------- |
| border-top-left-radius | border-start-start-radius |
| border-top-right-radius | border-start-end-radius |
| border-bottom-left-radius | border-end-start-radius |
| border-bottom-right-radius| border-end-end-radius |
| Physical Value | Logical Value |
| -------------------- | --------------------- |
| text-align: left; | text-align: start; |
| text-align: right; | text-align: end; |
Related Skills
node-connect
385.5kDiagnose OpenClaw Android, iOS, or macOS node pairing, QR/setup code, route, auth, and connection failures.
blender-python-addon
40.5kBlender Python add-on rules for operators, panels, properties, registration, testing, and API-safe scripting
flutter-development-guidelines-cursorrules-prompt-file
40.5kCursor rules for Flutter development with MVVM architecture, Riverpod state management, Material widgets, and Dart style guidelines.
commit-push-pr
140.7kCommit, push, and open a PR
