#React-style-marker
React-style-marker is trying to manage inline style on React elements in a different way.
With React-style-marker, inline style will be converted into variables and expressions and you can reuse these variables in the same rule in this system.
- bottom up and composable
- readable and reusable
- '+', '-', '*', '/', '=', '(', ')' instead of object operations
npm install react-style-marker
var Marker = require('react-style-marker');
var I = Marker.insert;
var T = Marker.trans;
Trans translates the react-style-marker string to react inline style object.
console.log(T("width(100)+height(100)+display('block'))")
The output is:
{ width: 100, height: 100, display: 'block' }
<div style={T("width(100)+height(100)+display('block')")} >
</div>
Which is equal to:
<div style={{width:100,height:100,display:block}} >
</div>
If it has an assign expression, the left side will be assigned value which is the result of the right side expression.
T("myDiv=display('block') + width(100) + height(100)")
Then you can simply use:
<div style={T('myDiv')}>
</div>
Trans returns the result of the first expression:
console.log(T("myDiv=display('block') + width(100) + height(100)"))
console.log(T("myDiv"));
The output is both:
{ display: 'block', width: 100, height: 100 }
Using ';' or '\n' to seperate Multiple expression:
T("myDiv1=display('block') + width(100) + height(100);myDiv2=myDiv1");
Parameters: alias, key, value, priority, state
I('myBg', 'background', 'grey');
Then you define style {myBg:background('grey')}
<div style={T('myBg')}>
</div>
You can also define style with state:
I('myBgHover, 'background', 'red', 1, 'hover');
Using '*' to achive composing style with states:
<button
style={T("myBg*myBgHover", this.state.hover)}
onMouseEnter={this.handleMouseEnter}
onMouseLeave={this.handleMouseLeave} >
</button>
handleMouseEnter() {
this.setState({
hover: 'hover'
});
},
handleMouseLeave() {
this.setState({
hover: null
});
},
var Marker = require('react-style-marker');
var T = Marker.trans;
// you can use custom variable cm as the combination
// cm = Object.assign({}, {display:'absolute'}, {left:0} ...)
T("cm=display('absolute')+left(0)+right(0)+top(0)+bottom(0)+margin('auto auto auto auto')");
var Demo = React.createClass({
render: function() {
// Trans covert expression to react styles
// And can use variables which you defined with Trans earlier(variable cm)
return (
<div>
<div style={T("height(500)+relative+background('orange')")} >
<div style={T("cm+width(50)+height(100)+background('green')")}>
</div>
</div>
</div>
)
}
});
React.render(<Demo />, document.getElementById('example'));
Stateful styles:
var Marker = require('react-style-marker');var I = Marker.insert;
var T = Marker.trans;
// Alias for a certain style
I('bg', 'background', 'grey');
I('bgHover', 'background', 'pink', 1, 'hover');
var Demo = React.createClass({
getInitialState() {
return {
hover: null
};
},
handleMouseEnter() {
this.setState({
hover: 'hover'
});
},
handleMouseLeave() {
this.setState({
hover: null
});
},
// '*' make multiple state combined in a single variable
// Trans has an optional sencond paramter state
// Which can filter style value with certain state
render: function() {
return (
<div>
<div onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave} style={T("width(100)+height(100)+bg*bgHover", this.state.hover)}>
</div>
</div>
)
}
});
React.render(<Demo />, document.getElementById('example'));