export { theme } from './config'; import { colors, layouts } from './config'; import { TwoColumn, Center } from './containers'; import { StyledElements, ContactInfo, ComponentDisplay as Components, Organisms, Sponsors } from './slide-components'; import { Search, Header, Demo, Article, DemoTemplate, Blog } from './demo';
import { images } from './assets/images'; import { demoAtomsFirst, demoAtomsSecond, demoMoleculesFirst, demoMoleculesSecond } from './constants';
import { Appear } from 'mdx-deck';
import vsDark from "prism-react-renderer/themes/vsDark" import { CodeSurfer } from "mdx-deck-code-surfer"
<TwoColumn padding={ '0px 30px'}>
π©βπ» Software Engineer
β Coffee Enthusiast
πΎ Gamer
- Based in Kansas City
- Primarily work with React & .NET
- Expert Dabbler
- Passionate about UX
- What is atomic design?
- How do we create a design system?
- How does atomic design help my React applications?
- What are some tools to create a component library utilizing atomic design?
<img src={images.atomicBatman} style={{ width: '500px', height: '400px', margin: '0 auto' }} />
export default layouts.Padded;
<TwoColumn padding={'0 20px'}>
<img src={images.brad} style={{ width: '400px', height: '400px', borderRadius: '100%', margin: '0 auto 20px auto' }} />
- Web Designer & Developer
- Helped redesign Time Inc. (Time, Fortune, People, Sports Illustrated), TechCrunch, Entertainment Weekly
- Passionate about UX
- Side Projects: Pattern Lab, Styleguides.io, This is Responsive
- Creator of atomic design
Created during TechCrunch website redesign in 2013
Wanted a system that looked at individual pieces of UI, not whole
Atomic design was born πΆ
<img src={images.book} style={{ width: '307px', height: '475px', backgroundSize: '307px 475px', margin: '0 auto' }} />
"Atomic design is a methodology composed of five distinct stages working together to create interface design systems in a more deliberate and hierarchical manner."
Brad Frost
"Atomic design is a methodology..."
"...composed of five distinct stages working together..."
"......more deliberate and hierarchical manner."
"Atomic design is not linear"
<img src={images.atomicDesign} style={{ marginTop: '50px' }} />
Credit: Atomic Design
Credit: Atomic Design
Labels, Inputs, and Buttons
<Components alignment={'flex-start'} />
<TwoColumn padding={'0 20px'}>
<button type="submit" />
<input width="400"/>
Credit: Atomic Design
<TwoColumn padding={'0 20px'}> <img src={images.water} style={{zoom: '125%'}} /> <img src={images.hydrogenPeroxide} style={{zoom: '125%'}} />
Search Form
<Search label={true} labelPosition={'top'} style={{zoom: '125%'}} />
Credit: Atomic Design
A Header
A ProductGrid
organism might be comprised of multiple ProductCard
molecules
<img src={images.productGrid} style={{ maxWidth: '700px', margin: '0 auto' }} />
Credit: Gap
Credit: Atomic Design
<img src={images.template} style={{ width:'600px'}}/>
Credit: Atomic Design
Credit: Atomic Design
<img src={images.page} style={{ width:'650px'}}/>
Credit: Atomic Design
Atomic design provides us the ability to quickly shift between the abstract and the concrete
The parts of our design influence the whole, and the whole influences the parts
Discussing design and content is like discussing the chicken and the egg π£
"Content needs to be structured and structuring alters your content, designing alters content. Itβs not βcontent then designβ, or βcontent or designβ. Itβs βcontent and designβ"
Mark Boulton
Atomic design is not just for the web
Itβs for user interfaces as a whole
<img src={images.instagram} style={{ width: '1200px' }} />
If you don't like the atomic nomenclature, change it
<TwoColumn padding={'0 50px'} alignment={'flex-start'} border={'1px solid #fff'} >
I'm so glad you asked!
Atomic design can be a guideline for good architecture
React thrives on the KISS method
<CodeSurfer title="Comment.js" code={require("!raw-loader!./slide-components/Comment/Comment.js")} theme={vsDark} showNumbers={true} steps={[ { notes: ""}, { range: [7, 15]}, { range: [22, 26]}, { notes: ""}, ]} />
<CodeSurfer title="UserInfo.js" code={require("!raw-loader!./slide-components/UserInfo/UserInfo.js")} theme={vsDark} showNumbers={true} dark={true} steps={[ { notes: ""}, { range: [5, 8]}, ]} />
<CodeSurfer title="Avatar.js" code={require("!raw-loader!./slide-components/UserInfo/Avatar.js")} theme={vsDark} showNumbers={true} dark={true} steps={[ { notes: ""}, ]} />
<CodeSurfer title="UserInfo.js" code={require("!raw-loader!./slide-components/UserInfo/UserInfoFinished.js")} theme={vsDark} showNumbers={true} dark={true} steps={[ { lines: [2], notes: ""}, { lines: [6], notes: ""}, { notes: ""} ]} />
<CodeSurfer title="Comment.js" code={require("!raw-loader!./slide-components/Comment/CommentWithUserInfo.js")} theme={vsDark} showNumbers={true} dark={true} steps={[ { lines: [2]}, { lines: [8], notes: ""}, { notes: ""}, { range: [15, 19], notes: ""}, ]} />
<CodeSurfer title="CommentActions.js" code={require("!raw-loader!./slide-components/CommentActions/CommentActions.js")} theme={vsDark} showNumbers={true} dark={true} steps={[ { notes: ""}, { range: [5, 9] } ]} />
<CodeSurfer title="Comment.js" code={require("!raw-loader!./slide-components/Comment/CommentFinished.js")} theme={vsDark} showNumbers={true} dark={true} steps={[ { notes: ""}, { lines: [2, 3] }, { lines: [8] }, { lines: [15] }, { notes: ""} ]} />
We can take this even further...
We can build a component library utilizing atomic design
People are the key π
These people need to be internal stakeholders
Change is hard
Constant communication π¬ and education π©βπ«
- Promote consistency and cohesion
- Speed up your teamβs productivity
- Establish a more collaborative workflow with a shared vocabulary
- Serve as a future-friendly foundation
Design systems lead to cohesive, consistent experiences
Design systems speed up your teamβs workflow by allowing you to reuse aspects of user interfaces without having to reinvent the wheel in every project
Centralizing UI elements in a pattern library or component library establishes a shared vocabulary for everyone within the organization, not just developers
Design systems make cross-browser/device, performance, and accessibility testing easier, vastly speed up production time, and allow teams to launch high-quality work faster
This design system is a living, breathing asset to your organization that can be adapted and modified based on your organizationβs needs.
It's about to get painful π₯
It's time to perform an interface audit
Tedious process, but hard work pays off πͺ
An interface inventory is a comprehensive collection of the bits and pieces that make up your user interface
Screenshots πΈ
-
Gather the Troops ππββπ
Prepare for the Screenshots π
Screenshots Galore! πΈ
Sharing is Caring π¨βπ«
All Aboard! π
Donβt try and do this on your own for three reasons:
-
It can be overwhelming
You will miss things
Others need to feel your pain π₯π₯
You'll need a place to store your screenshots like...
PowerPoint or Keynote, Photoshop or Sketch, Evernote Web Clipper, Google Docs, or Microsoft Word
The interface audit exercise involves screenshotting and categorizing all the unique user interface patterns that make up your overall user interface
Assign each person or pair a category
Some category options include:
-
Global Elements: headers, footers
Navigation: main nav, footer nav, pagination
Images: logos, hero images, avatars, thumbnails
Icons: social, arrows, hamburgers, spinners
Forms: inputs, text areas, select menus, checkboxes, radio buttons
Buttons: primary, secondary, big, small, disabled
Headings: h1, h2, h3, h4, h5, h6
Lists: ordered, unordered, striped, lined
Interactive Components: accordions, tabs, carousels
Messaging: alerts, success, errors, warnings, modals, tooltips
Colors: All colors used in site
...
It's very easy to get lost in this part of the process π€
β±οΈ Time-box the screenshot exercise
(30-90 minutes)
Combine all of the participants' findings into one mega-document
Have each participant spend 5-10 minutes presenting their findings
Now it's time to get the entire organization on board
- Captures all patterns and their inconsistencies
- Gets organizational buy-in
- Establishes a scope of work
- Lays the groundwork to a sound interface design system
- Captures all patterns and their inconsistencies
- Gets organizational buy-in
- Establishes a scope of work
- Lays the groundwork to a sound interface design system
Ask forgiveness, not permission
Our job is to create great work for our clients and organizations, and interface design systems are a means to that end
<img src={images.legoMess} style={{width: '1250px'}} />
<img src={images.legoOrganized} style={{width: '1250px'}} />
<img src={images.legoProcess} style={{width: '1250px'}} />
Now it's time to begin creating unified patterns
Create a style guide in Sketch or Photoshop or implement a CSS framework
A static site generator (powered by PHP or Node) that stitches together UI components
Utilizes Mustache, a "logic-less" templating tool
- Nested Patterns
- Design with Dynamic Data
- Tool Agnostic
- Language Agnostic
- Annotations
- Pattern Starter Kits
- Versatile
- Pattern Lineage
- Documentation
- Extensible
βββ node_modules/
βββ src/
β βββ atoms/
β β βββ Button/
β β βββ Input/
β β βββ Label/
β βββ molecules/
β β βββ Search/
β βββ organisms/
β βββ Header/
βββ package.json
βββ ...
Our components should be data agnostic
Test every component in the library
Consistent import/export patterns
Button.jsx
const Button = () => ...
export default Button;
index.js
export { default as Button } from './atoms/Button.jsx'
Use some kind of release versioning
Maintain an accurate CHANGELOG.md
file
<img src={images.cra} style={{ width: '100vw' }}/>
Credit: Facebook
<img src={images.bit} style={{ width: '100vw' }} />
Credit: Bit
Note: Bit is not entirely free
Many CSS-in-JS libraries to choose from including Styled Components <π > and Emotion π©βπ€
CSS-in-JS makes themes a breeze
You can create a custom theme, drop it in your <ThemeProvider/>
, and all of the child components will inherit the theme's styles
You can switch themes through CSS-in-JS without having to recompile the entire application
- Ensures consistency across your applications
- Allows for nesting and extending styles
- Quickly change a CSS property based on a JS property
You could set up your own Create React App that showcases all of your atomic components
Or you could use a pre-built tool to display your components
Here's a few options:
<img src={images.storybook} style={{width: '1200px' }} />
<img src={images.reactStyleguidist} style={{width: '100vw' }} />
<img src={images.reactStyleguidistExample} style={{ width: '100vw' }} />
<img src={images.blueKit} style={{width: '100vw' }} />
<img src={images.blueKitExample} style={{ width: '100vw' }} />
We're done, right?
Wrong π β
Design systems are living and breathing things
Go tell your colleagues π£
Go tell your boss π£
Go tell your organization π£
Go tell your friends π£
And think about React, atomically βοΈ