Swiss provides a functional way of defining custom elements.

Features

Example - Counter


  import { define } from 'swiss';
  import { html, render } from 'lit-html';

  const Counter = CE => el => ({
    update: () =>
      render(
        html`
          <a href="#" @click="${() => el.count++}">
            Clicked ${el.count} times
          </a>
        `,
        el
      )
  });

  define('s-counter', {
    props: { count: 0 },
    setup: Counter
  });
https://codesandbox.io/s/swiss-counter-cb45i

Syntax


  import { define, mixins } from 'swiss';

  // mixins is an array containing the default mixins set in Swiss.
  // for global mixins push a function in the same format as setup below.

  function setup(CE, options) {
    // CE is the custom element class and options is the object defined below.
    // This is called before the custom element is defined.
    return (el) => {
      // el is an instance of your custom element.
      // anything that is returned in the object literal is mixed in the element.
      return {
        yell: () => console.log('Whahaaa')
      }
    };
  }

  define('s-counter', {
    setup,
    props: {
      // shorthand property definition w/ default value 0
      count: 0,

      // readonly getter w/ default value of Steve
      firstName: {
        get: (el, val = 'Steve') => val,
      },

      // getter & setter w/ default value of King
      lastName: {
        get: (el, val = 'King') => val,
        set: (host, value) => value,
      },

      // getter that reflects its value to the name attribute
      name: {
        get: ({ firstName, lastName }) => `${firstName} ${lastName}`,
        reflect: true,
      },

      // prop config w/ custom to/from attribute converters
      wheel: {
        get: (host, val = { hub: 1, spokes: [9, 8, 7] }) => val,
        set: (host, val) => val,
        toAttribute: JSON.stringify,
        fromAttribute: JSON.parse,
        reflect: true,
      }

    }
  });