My goal is to find an architecture which could be common ground a base for quality React UI libraries. A consistent theming/styling API would make the lives of many developers way more comfortable.
HELP/FEEDBACK/YOUR OPINION WANTED! :) Feel free to join the ongoing discussion here or open up a new issue.
npm install
cd app
npm install
npm start
Make components self contained (no global UI lib dependencies) so you can import them and avoid importing the whole library e.g.
// import the whole lib and get Toggle
import { Toggle } from 'ui-lib';
// just import toggle without importing the whole library
import Toggle from 'ui-lib/Toggle';
Leverage react-themeable. It's a nice way of providing many styling classes to a single component. I believe establishing this as a convention would benefit the React community due the consistent API over many libs.
Component styles should be class based. It's more performant & responsive styling doesn't work with server-side rendering. I myself went down the inline-styles path in the past, but switched back to classes. A component using react-themeable could actually work with both (class-names & inline-styles), but I believe this is an unnecessary overhead. Your thoughts?
Ship without a global theme so people don't have to import the styling code. This might not be relevant to company internal or in general libraries that a opinionated about styling.
Provide a simple & handy way to apply a global theme for all the imported components.
While react-themeable is super useful I believe having a way to set a default styling is a crucial feature for a UI library. Most of the time you will use the default theme specific to your product. This avoids adding a lot of theme props through the whole application.
https://github.com/nikgraf/future-react-ui/tree/master/ui-lib/Factory
In this version we assume there is a package which includes a completely unstyled version of the UI kits while there is a second one which takes all the needed components and return themed components buy leveraging a factory function.
/**
* Returns a the provided component as themed component.
*
* Note: defaultProps could be useful for default special behavioural in
* different ui libraries.
*/
export default (Component, theme, defaultProps) => (props) => {
return <Component {...defaultProps} theme={theme} {...props} />;
};
For example these UI
Usage:
import Hint from 'elemental/Hint';
const customTheme = {
questionMark: 'custom-class-for-question-mark-gold',
visibleContent: 'custom-class-visible-content',
};
export default (props) => {
return (
<div>
{/* Globally theme component */}
<Hint />
{/* Overwriting the theme locally for this case */}
<Hint theme={theme}/>
</div>
);
};
other patterns can be found here: https://github.com/nikgraf/future-react-ui/blob/master/global-theming.md
While the Theme component based idea is pretty powerful the issues make me not like it as a default. For some time I was convinced that Module export or Static property would be one of the winners. Right now I'm pretty convinced the Factory Pattern is the clear winner. It is super flexible and allows people to create their own company UI kits. They can easily provide their own styling as well as set other props as default suited to their needs. Another benefit is that you can easily get started with prototyping by using an already style version (e.g. belle-flat) and replace it later with your custom product style.
If you have some ideas/feedback please reach out to me and let's discuss. (Github Issues might be best, but Twitter, Email, Skype, Hangout works as well)
MIT