Upgrade to Pro — share decks privately, control downloads, hide ads and more …

The art of building framework independent desig...

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on. →

The art of building framework independent design systems

Avatar for Stefan Nieuwenhuis

Stefan Nieuwenhuis

April 04, 2019

More Decks by Stefan Nieuwenhuis

Other Decks in Technology

Transcript

  1. @stefannhs The art of building framework independent design systems Software

    Engineer Archaeology Waterpolo Stefan Nieuwenhuis Skydiving Books Developer Avocado
  2. @stefannhs 1999 - bol.com launch > 2000 - new categories

    2011 - retail platform 2013 - €1 bln. turnover
  3. @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
  4. @stefannhs <h1> My Awesome button </h1> <p>This button is made

    possible w/ Web Components!</p> <my-button>Click me</my-button>
  5. @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>
  6. @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)); } }
  7. @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);
  8. @stefannhs <h1> My Awesome button </h1> <p>This button is made

    possible w/ Web Components!</p> <my-button>Click me</my-button>
  9. @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>; } }
  10. @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>; } }
  11. @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>
  12. @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