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

The art of building framework independent design systems

The art of building framework independent design systems

Stefan Nieuwenhuis

April 04, 2019
Tweet

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