SlideShare uma empresa Scribd logo
1 de 38
Baixar para ler offline
Styling 
Components 
with JavaScript 
@bensmithett
Warning 
» Not a tutorial for use in production! 
» I'm not even using any of this outside 
late night hacks 
But there are some interesting new ideas. 
Let's explore them & challenge CSS best 
practices!
Components are awesome! 
Nobody builds pages any more. 
Here's an example Profile component: 
components/ 
Profile/ 
index.hbs 
index.css 
index.js
HTML Template 
<div class="profile"> 
<img class="profile__avatar" src="{{avatarUrl}}.jpg" /> 
<strong>{{username}}</strong> 
</div> 
Style 
.profile { 
border: 1px solid #ddd; 
overflow: hidden; 
} 
.profile__avatar { 
float: left; 
margin-right: 10px; 
}
Behaviour 
var Profile = function (el) { 
el.addEventListener("click", function () { 
console.log("hai!"); 
}); 
this.el = el; 
this.tmpl = Handlebars.compile(someTemplateString); 
}; 
Profile.prototype.render = function (state) { 
this.el.innerHTML = this.tmpl(state); 
};
React combines HTML structure & behaviour 
var React = require("react"); 
var Profile = React.createClass({ 
handleClick: function () { 
console.log("hai"); 
}, 
render: function () { 
return ( 
<div class="profile"> 
<img class="profile__avatar" src="{this.props.avatarUrl}.jpg" 
onClick={this.handleClick} /> 
<strong>{this.props.username}</strong> 
</div> 
); 
} 
}); 
module.exports = Profile;
That's a big dirty lie 
The component's CSS is one of its 
concerns, but it's off in some random 
other file. 
components/ 
Profile/ 
index.css 
index.jsx
The only connection: a class name 
// JS 
render: function () { 
return ( 
<div class="profile"> 
// ... 
</div> 
) 
} 
/* CSS */ 
.profile 
border: 1px solid #ddd; 
overflow: hidden;
Most things 
» JS Dependencies are explicitly required 
» HTML structure is right there in the 
file 
» JS behaviour is right there in the file 
CSS 
» In another file, the classes might have 
the same name ¯_()_/¯ 
It's a crappy, vague connection.
CSS builds are a bit backwards 
//app.scss 
@import vendor/Normalize.css; 
@import base; 
@import components/Header; 
@import components/Profile; 
@import components/Footer; 
You need to know which bits of CSS your 
app requires. Lame.
What if our JS build automatically 
created a stylesheet based only on the 
components we use? 
// app.js 
var Profile = require(./components/Profile); 
var Header = require(./components/Header); 
var Footer = require(./components/Footer); 
// app.css 
// Somehow... 
// components/Profile/index.css 
// components/Header/index.css 
// components/Footer/index.css 
// ... end up here?
http://webpack.github.io/
var React = require(react); 
require(./index.css); 
var Profile = React.createClass({ 
render: function () { 
return ( 
div class=profile / 
); 
} 
}); 
module.exports = Profile;
// app.js 
var Profile = require(./components/Profile); 
var Header = require(./components/Header); 
var Footer = require(./components/Footer); 
// app.css generated by webpack 
.profile { ... } 
.profile__avatar { ... } 
.header { ... } 
.footer { ... }
Hooray! 
CSS is just another dependency we can 
require() in our component
Hooray? 
components/ 
Profile/ 
index.css 
index.jsx 
» Still working across 2 files 
» Need to maintain class names across 2 
files 
... still a bit lame.
React can do inline styles 
// Profile/index.js 
var Profile = React.createClass({ 
styles: { 
border: 1px solid #ddd, 
overflow: hidden 
}, 
render: function () { 
return( 
div style={this.styles} / 
); 
} 
}); 
!-- DOM generated by React -- 
div style=border: 1px solid #ddd; overflow: hidden; 
/div
Nobody likes inline 
styles though
What we really want: 
» Declare styles in the component, like 
we do with inline styles 
» Build process that... 
» converts them to a CSS class 
» spits out a shiny, auto-generated 
app.css 
» component knows to use that class 
name
React-style does that! 
» https://github.com/SanderSpies/react-style 
» http://andreypopp.com/posts/2014-08-06- 
react-style.html 
(with a little help from webpack)
var React = require(react/addons); 
var ReactStyle = require(react-style); 
var Profile = React.createClass({ 
styles: ReactStyle(function () { 
return { 
backgroundColor: green, 
border: 1px solid #ddd 
}; 
}), 
render: function () { 
return( 
div styles={this.styles()} / 
); 
} 
}); 
module.exports = Profile;
!-- DOM generated by React -- 
div class=a 
... 
/div 
// app.css generated by React-style  Webpack 
.a { 
background-color: green; 
border: 1px solid #ddd; 
}
Demo 
Compiling with default compressed class 
names
Demo 
Formatting class names
Do you even need 
a CSS naming 
convention?
not really... 
» Styles are tightly coupled part of the 
component, not a separate thing 
» CSS class naming conventions are a 
project setting, not an inherent 
property of the component 
» Dev: BEM class names for easy 
debugging 
» Prod: Tiny compressed class names
I 3 Sass 
$red: #f00; 
$grid-columns: 12; 
$base-font-size: 16px; 
@function px-to-em($px, $base: $base-font-size) { 
@return ($px / $base) * 1em; 
} 
%placeholder { 
color: $red; 
} 
.thing { 
@extend %placeholder; 
padding: 10px; 
}
What is a Preprocessor? 
A language that helps us generate blocks 
of key:value pairs. 
selector { 
property: value; 
other-property: other-value; 
}
What is a Preprocessor? 
A language that helps us generate blocks 
of key:value pairs. 
selector = { 
property: value, 
other-property: other-value 
}; 
JavaScript can do that!
JS already has lots of Real Programming 
Language Things TM 
» Variables 
» Functions 
» Arrays  Objects 
» Loops 
» Maths 
» String manipulation 
» Dependency management
Warning! 
Total pseudocode, nothing past this point 
actually works
Example: color variables 
var colors = require(./color_palette); 
var Profile = React.createClass({ 
styles: ReactStyle(function () { 
return { 
color: colors[hotPink], 
}; 
}), 
render: function () { 
return( 
div styles={this.styles()} / 
); 
} 
});
Example: Generate a grid 
var gridColumns = 12; 
var styles = {}; 
for (var i = 1; i = gridColumns; i++) { 
var width = (i / gridColumns) * 100; 
styles[span- + i] = ReactStyle(function () { 
return { 
float: left, 
width: width + % 
} 
}); 
} 
var GridColumn = React.createClass({ 
styles: styles, 
render: function () { 
var columns = span- + this.props.columns; 
return( 
div styles={this.styles[columns]()} / 
); 
} 
});
2015 Hipster Preprocessor 
JavaScript?!
The end :) 
@bensmithett 
https://github.com/bensmithett/react-style-example 
https://github.com/SanderSpies/react-style 
https://github.com/chenglou/rcss 
https://github.com/hedgerwang/react-styles 
https://github.com/elierotenberg/react-css

Mais conteúdo relacionado

Mais procurados

How I Learned to Stop Worrying and Love jQuery (Jan 2013)
How I Learned to Stop Worrying and Love jQuery (Jan 2013)How I Learned to Stop Worrying and Love jQuery (Jan 2013)
How I Learned to Stop Worrying and Love jQuery (Jan 2013)
David Giard
 
Short intro to JQuery and Modernizr
Short intro to JQuery and ModernizrShort intro to JQuery and Modernizr
Short intro to JQuery and Modernizr
Jussi Pohjolainen
 

Mais procurados (19)

RequireJS & Handlebars
RequireJS & HandlebarsRequireJS & Handlebars
RequireJS & Handlebars
 
SharePoint and jQuery Essentials
SharePoint and jQuery EssentialsSharePoint and jQuery Essentials
SharePoint and jQuery Essentials
 
JavaScript and jQuery Basics
JavaScript and jQuery BasicsJavaScript and jQuery Basics
JavaScript and jQuery Basics
 
Real World Web components
Real World Web componentsReal World Web components
Real World Web components
 
Cartegraph Live HTML, CSS, JavaScript and jQuery Training
Cartegraph Live HTML, CSS, JavaScript and jQuery TrainingCartegraph Live HTML, CSS, JavaScript and jQuery Training
Cartegraph Live HTML, CSS, JavaScript and jQuery Training
 
Introduction to javascript templating using handlebars.js
Introduction to javascript templating using handlebars.jsIntroduction to javascript templating using handlebars.js
Introduction to javascript templating using handlebars.js
 
Oracle Application Express & jQuery Mobile - OGh Apex Dag 2012
Oracle Application Express & jQuery Mobile - OGh Apex Dag 2012Oracle Application Express & jQuery Mobile - OGh Apex Dag 2012
Oracle Application Express & jQuery Mobile - OGh Apex Dag 2012
 
Building Web Sites that Work Everywhere
Building Web Sites that Work EverywhereBuilding Web Sites that Work Everywhere
Building Web Sites that Work Everywhere
 
Internet and Web Technology (CLASS-10) [Node.js] | NIC/NIELIT Web Technology
Internet and Web Technology (CLASS-10) [Node.js] | NIC/NIELIT Web Technology Internet and Web Technology (CLASS-10) [Node.js] | NIC/NIELIT Web Technology
Internet and Web Technology (CLASS-10) [Node.js] | NIC/NIELIT Web Technology
 
J query
J queryJ query
J query
 
How I Learned to Stop Worrying and Love jQuery (Jan 2013)
How I Learned to Stop Worrying and Love jQuery (Jan 2013)How I Learned to Stop Worrying and Love jQuery (Jan 2013)
How I Learned to Stop Worrying and Love jQuery (Jan 2013)
 
Short intro to JQuery and Modernizr
Short intro to JQuery and ModernizrShort intro to JQuery and Modernizr
Short intro to JQuery and Modernizr
 
JQuery
JQueryJQuery
JQuery
 
jQuery in the [Aol.] Enterprise
jQuery in the [Aol.] EnterprisejQuery in the [Aol.] Enterprise
jQuery in the [Aol.] Enterprise
 
DirectToWeb 2.0
DirectToWeb 2.0DirectToWeb 2.0
DirectToWeb 2.0
 
Managing JavaScript Dependencies With RequireJS
Managing JavaScript Dependencies With RequireJSManaging JavaScript Dependencies With RequireJS
Managing JavaScript Dependencies With RequireJS
 
jQuery Tips Tricks Trivia
jQuery Tips Tricks TriviajQuery Tips Tricks Trivia
jQuery Tips Tricks Trivia
 
JQuery
JQueryJQuery
JQuery
 
JsViews - Next Generation jQuery Templates
JsViews - Next Generation jQuery TemplatesJsViews - Next Generation jQuery Templates
JsViews - Next Generation jQuery Templates
 

Destaque

Destaque (6)

Modern networking for php developers - Dutch PHP conference 2015
Modern networking for php developers - Dutch PHP conference 2015Modern networking for php developers - Dutch PHP conference 2015
Modern networking for php developers - Dutch PHP conference 2015
 
UX, ethnography and possibilities: for Libraries, Museums and Archives
UX, ethnography and possibilities: for Libraries, Museums and ArchivesUX, ethnography and possibilities: for Libraries, Museums and Archives
UX, ethnography and possibilities: for Libraries, Museums and Archives
 
Designing Teams for Emerging Challenges
Designing Teams for Emerging ChallengesDesigning Teams for Emerging Challenges
Designing Teams for Emerging Challenges
 
Visual Design with Data
Visual Design with DataVisual Design with Data
Visual Design with Data
 
3 Things Every Sales Team Needs to Be Thinking About in 2017
3 Things Every Sales Team Needs to Be Thinking About in 20173 Things Every Sales Team Needs to Be Thinking About in 2017
3 Things Every Sales Team Needs to Be Thinking About in 2017
 
How to Become a Thought Leader in Your Niche
How to Become a Thought Leader in Your NicheHow to Become a Thought Leader in Your Niche
How to Become a Thought Leader in Your Niche
 

Semelhante a Styling components with JavaScript

Jarv.us Showcase — SenchaCon 2011
Jarv.us Showcase — SenchaCon 2011Jarv.us Showcase — SenchaCon 2011
Jarv.us Showcase — SenchaCon 2011
Chris Alfano
 
Javascript unit testing, yes we can e big
Javascript unit testing, yes we can   e bigJavascript unit testing, yes we can   e big
Javascript unit testing, yes we can e big
Andy Peterson
 

Semelhante a Styling components with JavaScript (20)

Practical HTML5: Using It Today
Practical HTML5: Using It TodayPractical HTML5: Using It Today
Practical HTML5: Using It Today
 
Javascript first-class citizenery
Javascript first-class citizeneryJavascript first-class citizenery
Javascript first-class citizenery
 
[Coscup 2012] JavascriptMVC
[Coscup 2012] JavascriptMVC[Coscup 2012] JavascriptMVC
[Coscup 2012] JavascriptMVC
 
Guia de Sobrevivência JS no mundo Open Source
Guia de Sobrevivência JS no mundo Open SourceGuia de Sobrevivência JS no mundo Open Source
Guia de Sobrevivência JS no mundo Open Source
 
Wt unit 2 ppts client sied technology
Wt unit 2 ppts client sied technologyWt unit 2 ppts client sied technology
Wt unit 2 ppts client sied technology
 
Wt unit 2 ppts client side technology
Wt unit 2 ppts client side technologyWt unit 2 ppts client side technology
Wt unit 2 ppts client side technology
 
Web performance essentials - Goodies
Web performance essentials - GoodiesWeb performance essentials - Goodies
Web performance essentials - Goodies
 
Having Fun with Play
Having Fun with PlayHaving Fun with Play
Having Fun with Play
 
Web Development for UX Designers
Web Development for UX DesignersWeb Development for UX Designers
Web Development for UX Designers
 
Webpack
Webpack Webpack
Webpack
 
RequireJS
RequireJSRequireJS
RequireJS
 
Jquery presentation
Jquery presentationJquery presentation
Jquery presentation
 
Jarv.us Showcase — SenchaCon 2011
Jarv.us Showcase — SenchaCon 2011Jarv.us Showcase — SenchaCon 2011
Jarv.us Showcase — SenchaCon 2011
 
J query b_dotnet_ug_meet_12_may_2012
J query b_dotnet_ug_meet_12_may_2012J query b_dotnet_ug_meet_12_may_2012
J query b_dotnet_ug_meet_12_may_2012
 
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
 
Django Rest Framework and React and Redux, Oh My!
Django Rest Framework and React and Redux, Oh My!Django Rest Framework and React and Redux, Oh My!
Django Rest Framework and React and Redux, Oh My!
 
Integrating React.js Into a PHP Application
Integrating React.js Into a PHP ApplicationIntegrating React.js Into a PHP Application
Integrating React.js Into a PHP Application
 
Assetic (Zendcon)
Assetic (Zendcon)Assetic (Zendcon)
Assetic (Zendcon)
 
Javascript unit testing, yes we can e big
Javascript unit testing, yes we can   e bigJavascript unit testing, yes we can   e big
Javascript unit testing, yes we can e big
 
jQuery & 10,000 Global Functions: Working with Legacy JavaScript
jQuery & 10,000 Global Functions: Working with Legacy JavaScriptjQuery & 10,000 Global Functions: Working with Legacy JavaScript
jQuery & 10,000 Global Functions: Working with Legacy JavaScript
 

Último

Call for Papers - Educational Administration: Theory and Practice, E-ISSN: 21...
Call for Papers - Educational Administration: Theory and Practice, E-ISSN: 21...Call for Papers - Educational Administration: Theory and Practice, E-ISSN: 21...
Call for Papers - Educational Administration: Theory and Practice, E-ISSN: 21...
Christo Ananth
 
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
dollysharma2066
 

Último (20)

Glass Ceramics: Processing and Properties
Glass Ceramics: Processing and PropertiesGlass Ceramics: Processing and Properties
Glass Ceramics: Processing and Properties
 
Online banking management system project.pdf
Online banking management system project.pdfOnline banking management system project.pdf
Online banking management system project.pdf
 
Unit 1 - Soil Classification and Compaction.pdf
Unit 1 - Soil Classification and Compaction.pdfUnit 1 - Soil Classification and Compaction.pdf
Unit 1 - Soil Classification and Compaction.pdf
 
Booking open Available Pune Call Girls Koregaon Park 6297143586 Call Hot Ind...
Booking open Available Pune Call Girls Koregaon Park  6297143586 Call Hot Ind...Booking open Available Pune Call Girls Koregaon Park  6297143586 Call Hot Ind...
Booking open Available Pune Call Girls Koregaon Park 6297143586 Call Hot Ind...
 
NFPA 5000 2024 standard .
NFPA 5000 2024 standard                                  .NFPA 5000 2024 standard                                  .
NFPA 5000 2024 standard .
 
UNIT-II FMM-Flow Through Circular Conduits
UNIT-II FMM-Flow Through Circular ConduitsUNIT-II FMM-Flow Through Circular Conduits
UNIT-II FMM-Flow Through Circular Conduits
 
data_management_and _data_science_cheat_sheet.pdf
data_management_and _data_science_cheat_sheet.pdfdata_management_and _data_science_cheat_sheet.pdf
data_management_and _data_science_cheat_sheet.pdf
 
University management System project report..pdf
University management System project report..pdfUniversity management System project report..pdf
University management System project report..pdf
 
Call for Papers - International Journal of Intelligent Systems and Applicatio...
Call for Papers - International Journal of Intelligent Systems and Applicatio...Call for Papers - International Journal of Intelligent Systems and Applicatio...
Call for Papers - International Journal of Intelligent Systems and Applicatio...
 
Top Rated Pune Call Girls Budhwar Peth ⟟ 6297143586 ⟟ Call Me For Genuine Se...
Top Rated  Pune Call Girls Budhwar Peth ⟟ 6297143586 ⟟ Call Me For Genuine Se...Top Rated  Pune Call Girls Budhwar Peth ⟟ 6297143586 ⟟ Call Me For Genuine Se...
Top Rated Pune Call Girls Budhwar Peth ⟟ 6297143586 ⟟ Call Me For Genuine Se...
 
Water Industry Process Automation & Control Monthly - April 2024
Water Industry Process Automation & Control Monthly - April 2024Water Industry Process Automation & Control Monthly - April 2024
Water Industry Process Automation & Control Monthly - April 2024
 
(INDIRA) Call Girl Bhosari Call Now 8617697112 Bhosari Escorts 24x7
(INDIRA) Call Girl Bhosari Call Now 8617697112 Bhosari Escorts 24x7(INDIRA) Call Girl Bhosari Call Now 8617697112 Bhosari Escorts 24x7
(INDIRA) Call Girl Bhosari Call Now 8617697112 Bhosari Escorts 24x7
 
Coefficient of Thermal Expansion and their Importance.pptx
Coefficient of Thermal Expansion and their Importance.pptxCoefficient of Thermal Expansion and their Importance.pptx
Coefficient of Thermal Expansion and their Importance.pptx
 
chapter 5.pptx: drainage and irrigation engineering
chapter 5.pptx: drainage and irrigation engineeringchapter 5.pptx: drainage and irrigation engineering
chapter 5.pptx: drainage and irrigation engineering
 
Extrusion Processes and Their Limitations
Extrusion Processes and Their LimitationsExtrusion Processes and Their Limitations
Extrusion Processes and Their Limitations
 
Call for Papers - Educational Administration: Theory and Practice, E-ISSN: 21...
Call for Papers - Educational Administration: Theory and Practice, E-ISSN: 21...Call for Papers - Educational Administration: Theory and Practice, E-ISSN: 21...
Call for Papers - Educational Administration: Theory and Practice, E-ISSN: 21...
 
Thermal Engineering Unit - I & II . ppt
Thermal Engineering  Unit - I & II . pptThermal Engineering  Unit - I & II . ppt
Thermal Engineering Unit - I & II . ppt
 
Java Programming :Event Handling(Types of Events)
Java Programming :Event Handling(Types of Events)Java Programming :Event Handling(Types of Events)
Java Programming :Event Handling(Types of Events)
 
CCS335 _ Neural Networks and Deep Learning Laboratory_Lab Complete Record
CCS335 _ Neural Networks and Deep Learning Laboratory_Lab Complete RecordCCS335 _ Neural Networks and Deep Learning Laboratory_Lab Complete Record
CCS335 _ Neural Networks and Deep Learning Laboratory_Lab Complete Record
 
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
 

Styling components with JavaScript

  • 1. Styling Components with JavaScript @bensmithett
  • 2. Warning » Not a tutorial for use in production! » I'm not even using any of this outside late night hacks But there are some interesting new ideas. Let's explore them & challenge CSS best practices!
  • 3. Components are awesome! Nobody builds pages any more. Here's an example Profile component: components/ Profile/ index.hbs index.css index.js
  • 4. HTML Template <div class="profile"> <img class="profile__avatar" src="{{avatarUrl}}.jpg" /> <strong>{{username}}</strong> </div> Style .profile { border: 1px solid #ddd; overflow: hidden; } .profile__avatar { float: left; margin-right: 10px; }
  • 5. Behaviour var Profile = function (el) { el.addEventListener("click", function () { console.log("hai!"); }); this.el = el; this.tmpl = Handlebars.compile(someTemplateString); }; Profile.prototype.render = function (state) { this.el.innerHTML = this.tmpl(state); };
  • 6.
  • 7. React combines HTML structure & behaviour var React = require("react"); var Profile = React.createClass({ handleClick: function () { console.log("hai"); }, render: function () { return ( <div class="profile"> <img class="profile__avatar" src="{this.props.avatarUrl}.jpg" onClick={this.handleClick} /> <strong>{this.props.username}</strong> </div> ); } }); module.exports = Profile;
  • 8.
  • 9. That's a big dirty lie The component's CSS is one of its concerns, but it's off in some random other file. components/ Profile/ index.css index.jsx
  • 10. The only connection: a class name // JS render: function () { return ( <div class="profile"> // ... </div> ) } /* CSS */ .profile border: 1px solid #ddd; overflow: hidden;
  • 11. Most things » JS Dependencies are explicitly required » HTML structure is right there in the file » JS behaviour is right there in the file CSS » In another file, the classes might have the same name ¯_()_/¯ It's a crappy, vague connection.
  • 12. CSS builds are a bit backwards //app.scss @import vendor/Normalize.css; @import base; @import components/Header; @import components/Profile; @import components/Footer; You need to know which bits of CSS your app requires. Lame.
  • 13. What if our JS build automatically created a stylesheet based only on the components we use? // app.js var Profile = require(./components/Profile); var Header = require(./components/Header); var Footer = require(./components/Footer); // app.css // Somehow... // components/Profile/index.css // components/Header/index.css // components/Footer/index.css // ... end up here?
  • 14.
  • 16. var React = require(react); require(./index.css); var Profile = React.createClass({ render: function () { return ( div class=profile / ); } }); module.exports = Profile;
  • 17. // app.js var Profile = require(./components/Profile); var Header = require(./components/Header); var Footer = require(./components/Footer); // app.css generated by webpack .profile { ... } .profile__avatar { ... } .header { ... } .footer { ... }
  • 18. Hooray! CSS is just another dependency we can require() in our component
  • 19. Hooray? components/ Profile/ index.css index.jsx » Still working across 2 files » Need to maintain class names across 2 files ... still a bit lame.
  • 20. React can do inline styles // Profile/index.js var Profile = React.createClass({ styles: { border: 1px solid #ddd, overflow: hidden }, render: function () { return( div style={this.styles} / ); } }); !-- DOM generated by React -- div style=border: 1px solid #ddd; overflow: hidden; /div
  • 21. Nobody likes inline styles though
  • 22. What we really want: » Declare styles in the component, like we do with inline styles » Build process that... » converts them to a CSS class » spits out a shiny, auto-generated app.css » component knows to use that class name
  • 23. React-style does that! » https://github.com/SanderSpies/react-style » http://andreypopp.com/posts/2014-08-06- react-style.html (with a little help from webpack)
  • 24. var React = require(react/addons); var ReactStyle = require(react-style); var Profile = React.createClass({ styles: ReactStyle(function () { return { backgroundColor: green, border: 1px solid #ddd }; }), render: function () { return( div styles={this.styles()} / ); } }); module.exports = Profile;
  • 25. !-- DOM generated by React -- div class=a ... /div // app.css generated by React-style Webpack .a { background-color: green; border: 1px solid #ddd; }
  • 26. Demo Compiling with default compressed class names
  • 28. Do you even need a CSS naming convention?
  • 29. not really... » Styles are tightly coupled part of the component, not a separate thing » CSS class naming conventions are a project setting, not an inherent property of the component » Dev: BEM class names for easy debugging » Prod: Tiny compressed class names
  • 30. I 3 Sass $red: #f00; $grid-columns: 12; $base-font-size: 16px; @function px-to-em($px, $base: $base-font-size) { @return ($px / $base) * 1em; } %placeholder { color: $red; } .thing { @extend %placeholder; padding: 10px; }
  • 31. What is a Preprocessor? A language that helps us generate blocks of key:value pairs. selector { property: value; other-property: other-value; }
  • 32. What is a Preprocessor? A language that helps us generate blocks of key:value pairs. selector = { property: value, other-property: other-value }; JavaScript can do that!
  • 33. JS already has lots of Real Programming Language Things TM » Variables » Functions » Arrays Objects » Loops » Maths » String manipulation » Dependency management
  • 34. Warning! Total pseudocode, nothing past this point actually works
  • 35. Example: color variables var colors = require(./color_palette); var Profile = React.createClass({ styles: ReactStyle(function () { return { color: colors[hotPink], }; }), render: function () { return( div styles={this.styles()} / ); } });
  • 36. Example: Generate a grid var gridColumns = 12; var styles = {}; for (var i = 1; i = gridColumns; i++) { var width = (i / gridColumns) * 100; styles[span- + i] = ReactStyle(function () { return { float: left, width: width + % } }); } var GridColumn = React.createClass({ styles: styles, render: function () { var columns = span- + this.props.columns; return( div styles={this.styles[columns]()} / ); } });
  • 38. The end :) @bensmithett https://github.com/bensmithett/react-style-example https://github.com/SanderSpies/react-style https://github.com/chenglou/rcss https://github.com/hedgerwang/react-styles https://github.com/elierotenberg/react-css