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
250
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
33
Taming huge Angular applications at bol.com
stefannhs
0
440
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
460
Building a framework independent component library with StencilJS
stefannhs
0
280
Other Decks in Technology
See All in Technology
AIの性能が向上しても未解決な組織の重大問題は何か?/An Unsolved Organizational Problem in the Age of AI
moriyuya
3
540
「嘘をつくテスト」の失敗例から学ぶ 良いテストコード #frontend_phpcon_do
asumikam
0
600
LLMと共に進化するプロセスを目指して
ymatsuwitter
12
3.8k
EventBridge Connection
_kensh
5
680
チームで実践する AI-DLC 思考の軌跡を残すチェックポイント設計
belongadmin
0
3.1k
Claude Code の Sandbox 機能を Anthropic Sandbox Runtime(srt) で試そう!/lets-play-anthropic-sandbox-runtime
tomoki10
1
420
2026.06.13_AI時代に事業会社が「SIer出身エンジニア」を求める理由 / Why Businesses Seek Engineers with a System Integrator Background in the AI Era
jumtech
0
980
ポケモンの型をTypeScriptの型システムで表現してみた
subroh0508
0
360
サプライチェーンセキュリティの空白地帯 - 信頼できる”依存性”の未来を考える
rung
PRO
2
800
Agentic ERPをどう設計するか ー 受発注エージェントを動かす、現場の知見と設計思想ー
recerqainc
1
2.1k
AmazonRoute 53ではじめてのドメイン取得!HTTPS化までの道のりを整理してみた
usanchuu
3
120
Djangoユーザが知っ得なPostgreSQL機能 - 設計の選択肢を増やす / Djang-use-PostgreSQL
soudai
PRO
0
220
Featured
See All Featured
30 Presentation Tips
portentint
PRO
1
320
Ruling the World: When Life Gets Gamed
codingconduct
0
250
Utilizing Notion as your number one productivity tool
mfonobong
4
320
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
71
40k
Producing Creativity
orderedlist
PRO
348
40k
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
580
Optimising Largest Contentful Paint
csswizardry
37
3.7k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
231
23k
HDC tutorial
michielstock
2
700
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.8k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
360
Embracing the Ebb and Flow
colly
88
5.1k
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