Skip to content

Commit acba83c

Browse files
authored
Merge pull request #170 from chenyejia/css-logical-plugin
Add plugin for CSS logical properties
2 parents a0cafc8 + d54af04 commit acba83c

6 files changed

Lines changed: 66 additions & 0 deletions

File tree

docs/data/SpecialPlugins.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ Sometimes it is not enough to just prefix a property, but you also need to prefi
1313
| flexboxOld | Adds trasformators for the old 2009 flexbox specification used in old Webkit-based browsers. |
1414
| gradient | Adds support for prefixed `background` and `backgroundImage` values `linear-gradient()`, `radial-gradient()`, `repeating-linear-gradient()` and `repeating-radial-gradient()`. |
1515
| imagetSet | Adds support for prefixed `imaget-set()` values. |
16+
| logical | Adds support for prefixed CSS logical properties. |
1617
| position | Adds support for the prefixed `position` value on `sticky`. |
1718
| sizing | Adds support for prefixed `maxHeight`, `maxWidth`, `width`, `height`, `columnWidth`,`minWidth`, `minHeight` intrinsic & extrinsic sizing values `min-content`, `max-content`, `fill-available`, `fit-content`, `contain-floats`. |
1819
| transition | Adds support for prefixed CSS properties on `transition` and `transitionProperty` values. |

modules/__tests__/createPrefixer-test.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,19 @@ describe('Static Prefixer', () => {
176176
expect(prefix(input)).toEqual(output)
177177
})
178178

179+
it('should prefix css logical properties', () => {
180+
const input = {
181+
marginInlineStart: '1px',
182+
}
183+
const output = {
184+
marginInlineStart: '1px',
185+
WebkitMarginStart: '1px',
186+
MozMarginStart: '1px',
187+
}
188+
expect(prefix(input)).toEqual(output)
189+
expect(prefix(input)).toEqual(output)
190+
})
191+
179192
it('should add all flexbox display types', () => {
180193
const input = { display: 'flex' }
181194
const output = {

modules/generator/maps/pluginMap.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,14 @@ export default {
7171
and_uc: maximumVersion,
7272
ios_saf: maximumVersion,
7373
},
74+
logical: {
75+
chrome: 68,
76+
safari: maximumVersion,
77+
opera: maximumVersion,
78+
and_chr: 66,
79+
ios_saf: maximumVersion,
80+
firefox: 40,
81+
},
7482
position: {
7583
safari: maximumVersion,
7684
ios_saf: maximumVersion,

modules/index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import flex from './plugins/flex'
1010
import flexboxOld from './plugins/flexboxOld'
1111
import gradient from './plugins/gradient'
1212
import imageSet from './plugins/imageSet'
13+
import logical from './plugins/logical'
1314
import position from './plugins/position'
1415
import sizing from './plugins/sizing'
1516
import transition from './plugins/transition'
@@ -22,6 +23,7 @@ const plugins = [
2223
flexboxOld,
2324
gradient,
2425
imageSet,
26+
logical,
2527
position,
2628
sizing,
2729
transition,

modules/plugins/index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import flexboxIE from './flexboxIE'
88
import flexboxOld from './flexboxOld'
99
import gradient from './gradient'
1010
import imageSet from './imageSet'
11+
import logical from './logical'
1112
import position from './position'
1213
import sizing from './sizing'
1314
import transition from './transition'
@@ -23,6 +24,7 @@ export default [
2324
flexboxOld,
2425
gradient,
2526
imageSet,
27+
logical,
2628
position,
2729
sizing,
2830
transition,

modules/plugins/logical.js

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
/* @flow */
2+
const alternativeProps = {
3+
marginBlockStart: ['WebkitMarginBefore'],
4+
marginBlockEnd: ['WebkitMarginAfter'],
5+
marginInlineStart: ['WebkitMarginStart', 'MozMarginStart'],
6+
marginInlineEnd: ['WebkitMarginEnd', 'MozMarginEnd'],
7+
paddingBlockStart: ['WebkitPaddingBefore'],
8+
paddingBlockEnd: ['WebkitPaddingAfter'],
9+
paddingInlineStart: ['WebkitPaddingStart', 'MozPaddingStart'],
10+
paddingInlineEnd: ['WebkitPaddingEnd', 'MozPaddingEnd'],
11+
borderBlockStart: ['WebkitBorderBefore'],
12+
borderBlockStartColor: ['WebkitBorderBeforeColor'],
13+
borderBlockStartStyle: ['WebkitBorderBeforeStyle'],
14+
borderBlockStartWidth: ['WebkitBorderBeforeWidth'],
15+
borderBlockEnd: ['WebkitBorderAfter'],
16+
borderBlockEndColor: ['WebkitBorderAfterColor'],
17+
borderBlockEndStyle: ['WebkitBorderAfterStyle'],
18+
borderBlockEndWidth: ['WebkitBorderAfterWidth'],
19+
borderInlineStart: ['WebkitBorderStart', 'MozBorderStart'],
20+
borderInlineStartColor: ['WebkitBorderStartColor', 'MozBorderStartColor'],
21+
borderInlineStartStyle: ['WebkitBorderStartStyle', 'MozBorderStartStyle'],
22+
borderInlineStartWidth: ['WebkitBorderStartWidth', 'MozBorderStartWidth'],
23+
borderInlineEnd: ['WebkitBorderEnd', 'MozBorderEnd'],
24+
borderInlineEndColor: ['WebkitBorderEndColor', 'MozBorderEndColor'],
25+
borderInlineEndStyle: ['WebkitBorderEndStyle', 'MozBorderEndStyle'],
26+
borderInlineEndWidth: ['WebkitBorderEndWidth', 'MozBorderEndWidth'],
27+
}
28+
29+
export default function logical(
30+
property: string,
31+
value: any,
32+
style: Object
33+
): void {
34+
if (Object.prototype.hasOwnProperty.call(alternativeProps, property)) {
35+
const alternativePropList = alternativeProps[property]
36+
for (let i = 0, len = alternativePropList.length; i < len; ++i) {
37+
style[alternativePropList[i]] = value
38+
}
39+
}
40+
}

0 commit comments

Comments
 (0)