Secretsofbuildingrobust
UIcomponents
@glnnrys
GlennReyes
Independent Software Engineer
React, GraphQL, Design Systems & TypeScript
@glnnrys
BuildingUIs
BuildingUIs
isfun
BuildingrobustUIs
ishard
BuildingrobustUIs
ishard
Whatisrobust?
🧐
Stable
Reliable
Functioneffectivelyandreliablyundera
widerangeofconditions
ConsistentUX Performance
WhatmakesrobustUIs
Stepsofbuildingnewuserinterfaces
Tooling Theming Building
Tooling
=
Bettertooling BetterDX
Bettertooling
keepsyourcodebaseclean
Bettertooling
Keepsyourcodebaseclean
withoutthehassle
Findandfixproblemsinthecode
withnoeffort
Preferdeterministiccodestyle
AutoSorting
Deterministiccodemakescode
morereliable,predictableandconsistent
✨ Separate config files per app
✅ Client: eslint-config-banana/react
✅ Server: eslint-config-banana/node
✅ Anything: eslint-config-banana (core)
✨ Enhance linting with type information
✅ More options for improved DX
ESLint
pnpm add eslint-config-banana —-dev
Prettier
@trivago/prettier-plugin-sort-imports prettier-plugin-tailwindcss
Buildcomponentsinisolation
Buildcomponentsin
isolation
with component explorers
Storybook
Styleguidist
Bit
React Cosmos
Wix Component Studio
Runautomatedtests
forUIcomponents
100%UIstatecoverageiskey
Theming
StephenHay
“We’re not designing pages,
we’re designing systems of
components.”
Designtokens
Typography Color Spacing
Designtokens
Typography
Color
Spacing
Designtokens
Download
Color
Spacings
Typography
Componentsfor
Layout&Spacing
BuildingrobustUIs
Loremipsumdolorsitametconsecteturadipisicingelit.
Unde,doloremquemodi?Facere,aperiam.Obcaecati
laboriosam,laborumeiusvoluptatumquasieaque
maximeconsequuntur,facilisnumquamsitex,
praesentiumtempora architectoquibusdam.
Loremipsumdolorsitametconsecteturadipisicingelit.
Unde,doloremquemodi?Facere,aperiam.Obcaecati
laboriosam,laborumeiusvoluptatumquasieaque
maximeconsequuntur,facilisnumquamsitex,
praesentiumtempora architectoquibusdam.
Loremipsumdolorsitametconsecteturadipisicingelit.
Unde,doloremquemodi?Facere,aperiam.Obcaecati
laboriosam,laborumeiusvoluptatumquasieaque
maximeconsequuntur,facilisnumquamsitex,
praesentiumtempora architectoquibusdam.
Loremipsumdolorsitametconsecteturadipisicingelit.
Unde,doloremquemodi?Facere,aperiam.Obcaecati
laboriosam,laborumeiusvoluptatumquasieaque
maximeconsequuntur,facilisnumquamsitex,
praesentiumtempora architectoquibusdam.
BuildingrobustUIs
Loremipsum dolorsitametconsecteturadipisicingelit.
Unde,doloremquemodi?Facere,aperiam.Obcaecati
laboriosam,laborumeiusvoluptatumquasieaque
maximeconsequuntur,facilisnumquamsitex,
praesentium temporaarchitectoquibusdam.
Loremipsum dolorsitametconsecteturadipisicingelit.
Unde,doloremquemodi?Facere,aperiam.Obcaecati
laboriosam,laborumeiusvoluptatumquasieaque
maximeconsequuntur,facilisnumquamsitex,
praesentium temporaarchitectoquibusdam.
gap: 24px
BuildingrobustUIs
Building
Atomicdesign
https://bradfrost.com/blog/post/atomic-web-design
The most basic building blocks
Atoms
Button Input Select
Card
Icon
Divider
Body Text
Heading
Checkbox
A composition of atoms in its smallest fundamental unit
Molecules
Search
Search this site
Groups of molecules joined together
Organisms
Search
Search this site
Home Articles About Contact
Consist mostly of groups of organisms stitched together to form pages
Templates
Search
Search this site
Home Articles About Contact
Speci
fi
c instances of templates with real representative content
Pages
Search
Search this site
Home Articles About Contact
My thoughts on this conference
ComponentDrivenDevelopment
Buildfromthebottomup
Search
Search
Buildfromthe
bottomup
Code
✅ Try keep separate dumb & smart components
✅ Group related code parts together
✅ Build custom hooks if applicable
✅ Reduce the API surface to the bare minimum
Quickwins
ReactComponentProps
<Button primary />
<Button primary secondary />
<Button primary secondary />
<Button appearance="primary" />
Booleantypevs.Uniontype
<PrimaryButton />
<SecondaryButton />
<PrimaryButton />
<Button appearance="primary" />
<Button primary />
vs.
vs.
TypesforHTMLelementattributes
😓 😓
🤨 🤨
🤓 🤓
🤩 🤩
BanclassNameandstylein
UIcomponents
BanclassNameandstylein
UIcomponents
Reuseexisting
typesandinterfaces
Reuseexisting
typesandinterfaces
CompoundComponents
Polymorphiccomponents
Polymorphiccomponents
GenericsinReactUIcomponents
Component Usage
GenericsinReactUIcomponents
Overloadfunctioncomponents
Overloadfunctioncomponents
typevsinterface
inReactcomponentprops
typevsinterface
inReactcomponentprops
Reducedcomputationalwork
byusinginterface
Encourage type annotations.
Especially return types.
helps with faster compilation
https://github.com/microsoft/TypeScript/wiki/Performance
MoreTypeScriptthings
tohelp avoid badtypes
🚩 any → ✅ parse (eg. with zod)
🚩 Type assertions → ✅ Narrow type instead
MoreTypeScriptthings
tohelp avoid badtypes
MoreTypeScriptthings
tohelp avoid badtypes
🚩 Non-null assertions → ✅ Narrow type instead
Takeaways
Propertooling
encouragesrobustcode.
Aresilientdesignsystem
encouragesrobustcode.
Stricttypes
encouragesrobustcode.
Stricttypesencourages
robustUIcomponents.
ThekeytorobustUIis
simplicity.
UIcomponentsshouldbe
reusable.
Take good care
from the ground up.
Saves tons of headache later.
¡Gracias!
Glenn Reyes · @glnnrys ·glennreyes.com
https://speakerdeck.com/glennreyes/secrets-of-building-robust-ui-components

Glenn Reyes - Secrets of building robust UI components