Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
The art of building framework independent desig...
Search
Stefan Nieuwenhuis
April 04, 2019
Technology
260
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
The art of building framework independent design systems
Video:
https://www.youtube.com/watch?v=ZusytL3s8Zw
Stefan Nieuwenhuis
April 04, 2019
More Decks by Stefan Nieuwenhuis
See All by Stefan Nieuwenhuis
NHSWD/4NG: The JavaScript Big Three
stefannhs
0
36
Taming huge Angular applications at bol.com
stefannhs
0
450
Taming huge enterprise applications with Mono repos, Design Systems & Web Components
stefannhs
0
150
Micro Frontends & Design Systems, built with Angular and Stencil
stefannhs
0
470
Building a framework independent component library with StencilJS
stefannhs
0
280
Other Decks in Technology
See All in Technology
スクラムで身についていた動き方を、XPで捉え直してみた
codmoninc
1
170
AIエージェントを雇う前に決める5つのこと
knishioka
1
150
振り返りこそエンジニアの本領
negima
0
260
DGX Sparkを2台使って いろいろ動かす話
sonoda_mj
1
120
Level Up Your CDK DX: 5 Tools I’ve Been Building
gotok365
2
190
深夜のクラウド懺悔室 1:29:300 or 1:0:0
kazzpapa3
0
110
いま、生成AIにKaggleをどこまで 任せられるか — ROGIIコンペでの進め方とTips
k951286
2
1.3k
はじめてのDatabricks:技術者向けワークショップ / beginner-workshop
databricksjapan
PRO
0
140
[RSJ26] Hierarchy-Aware Multimodal Retrieval-Augmented Generation for Embodied Question Answering
keio_smilab
PRO
1
170
[RSJ26] NarrativeFlow: Flow-Based Vision-Language-Action Model Using Robot Velocity Fields
keio_smilab
PRO
0
150
どんな手を使っても絶対間に合わせるスケジューラ
asari194617
0
1.5k
Azure Cost Management の FOCUS コストデータを迷わず読むための“3つの軸”
tetsuyaooooo
0
140
Featured
See All Featured
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
230
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.8k
Done Done
chrislema
186
16k
Game over? The fight for quality and originality in the time of robots
wayneb77
1
260
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
500
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.6k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
490
Fashionably flexible responsive web design (full day workshop)
malarkey
408
67k
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.2k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
Technical Leadership for Architectural Decision Making
baasie
3
550
Transcript
@stefannhs @stefannhs @stefannhs
@stefannhs The art of building framework independent design systems Software
Engineer Archaeology Waterpolo Stefan Nieuwenhuis Skydiving Books Developer Avocado
@stefannhs 1999 - bol.com launch > 2000 - new categories
2011 - retail platform 2013 - €1 bln. turnover
@stefannhs Monolith Architecture Server side app User Interface Database
@stefannhs Performance Less cross cutting concerns Planning & Design Less
operational overhead Security
@stefannhs Performance Less cross cutting concerns Planning & Design Less
operational overhead Security
@stefannhs Microservices
@stefannhs Transparency Independency Scalability
@stefannhs Transparency Independency Scalability Consistency
@stefannhs Design System
@stefannhs Pattern Library
@stefannhs // Corporate colors $palette-blue-main: rgb(051,102,204) !default; $palette-blue-dark: rgb(014,052,144) !default;
$palette-blue-light: rgb(058,125,231) !default; $palette-blue-hover: rgb(245,247,252) !default; // Secondary colors $palette-red-main: rgb(248,087,105) !default; $palette-orange-main: rgb(251,120,093) !default; $palette-yellow-main: rgb(255,162,078) !default; $palette-lime-main: rgb(150,210,113) !default; $palette-green-main: rgb(051,204,131) !default; Style guide
@stefannhs
@stefannhs Generic No framework lock-in Flexible Reusable Development speed
@stefannhs <h1> My Awesome button </h1> <p>This button is made
possible w/ Web Components!</p> <my-button>Click me</my-button>
@stefannhs <template id="myButton"> <style>button { border: 2px solid red; border-radius:
5px; background: tomato; padding: 10px; color: white; font-weight: bold; text-transform: uppercase; cursor: pointer; }</style> <button><slot/></button> </template>
@stefannhs class MyButtonElement extends HTMLElement { constructor() { super(); const
template = document.getElementById('myButton'); // Shadow DOM this.attachShadow({ mode: 'closed' }); this.shadowRoot.appendChild( template.content.cloneNode(true)); } }
@stefannhs class MyButtonElement extends HTMLElement { constructor() { super(); const
template = document.getElementById('myButton'); // Shadow DOM this.attachShadow({ mode: 'open' }); this.shadowRoot.appendChild( template.content.cloneNode(true)); } } // Define Custom Element customElements.define('my-button', MyButtonElement);
@stefannhs <h1> My Awesome button </h1> <p>This button is made
possible w/ Web Components!</p> <my-button>Click me</my-button>
@stefannhs Compatibility Easy API Performance Future-proof
@stefannhs npm init stencil
@stefannhs // Stencil controller import { Component, Prop } from
'@stencil/core'; @Component({ tag: 'my-component', styleUrl: 'my-component.css', shadow: true }) export class MyComponent { render() { return <div>Hello world!</div>; } }
@stefannhs // Stencil controller import { Component, Prop } from
'@stencil/core'; @Component({ tag: 'my-button', styleUrl: 'my-button.css', shadow: true }) export class MyButtonElement { render() { return <button><slot/></button>; } }
@stefannhs npm run build
@stefannhs ... <script src="/build/mycomponent.js"></script> </head> <body> <h1> My Awesome button
</h1> <p>This button is made possible w/ Web Components!</p> <my-button>Click me</my-button> </body>
@stefannhs Extensive config Auto docs generation Bundling Dev Server Typed
components Plugins Polyfills
@stefannhs Mono Repository
@stefannhs One single source of truth Reusability Versioning Scalable Experience
@stefannhs
@stefannhs { "name": "@awesome-components-lib/buttons", "version": "5.0.1", "description": "Button Component", ...
} { "name": "@awesome-components-lib/footer", "version": "1.0.0", "description": "Footer Component", ... } Semantic Versioning No interdependencies Scoped packages
@stefannhs
@stefannhs Design System Holy Grail of Consistency
@stefannhs Icons made by Freepik from www.flaticon.com is licensed by
CC 3.0 BY DM’s are open! @stefannhs