npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@advanced-rest-client/arc-demo-helper

v5.0.4

Published

An element to help create demo pages for ARC components

Downloads

230

Readme

arc-demo-helper

An element to help create demo pages for ARC components based on LitElement.

Usage

Installation

npm install -D @advanced-rest-client/arc-demo-helper

Building a demo page

To build a demo page for a component use DemoPage class as a base class of the demo page. It has a basic set of methods that help build unified demo page.

The goal of a demo page is to show how a component behaves giving different configuration options. The demo page must include all configuration options so it is easy for both a developer and the consumer to recognize what the component is doing.

All API Components demo pages uses the <arc-interactive-demo> element that creates a tile with the component being demoed. This element has also an API to provide an unified and accessible way of providing configuration options.

Basic Example

First extend the base class, define main content template, and initialize the demo.

A base-layout.html.

<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, minimum-scale=1, initial-scale=1, user-scalable=yes">
    <title>Base layout</title>
  </head>
  <body class="styled">
    <div id="demo"></div>

    <script type="module" src="./base-layout.js"></script>
  </body>
</html>

A base-layout.js.

import { html } from 'lit-html';
import { DemoPage } from '../index.js';

class ComponentDemo extends DemoPage {
  contentTemplate() {
    return html`<p>demo content</p>`;
  }
}

const instance = new ComponentDemo();
instance.render();

The render() function generates base layout for the demo page and takes template retuned by the contentTemplate() to put it into the main demo area. Computations are asynchronous. The DOM is rendered in the next event loop after initialization.

Component title

Define a constructor with componentName property set to the component name. This renders the component name in the title bar.

import { html } from 'lit-html';
import { DemoPage } from '../index.js';

class ComponentDemo extends DemoPage {
  constructor() {
    super();
    this.componentName = 'my-component';
  }

  ...
}

const instance = new ComponentDemo();
instance.render();

Basic view options

By setting renderViewControls property you enable some basic UI controls to change the behaviour of the demo page. Basic options are:

  • Toggling dark theme
  • Toggling narrow property in the template
  • Toggling styles applied to the component
import { html } from 'lit-html';
import { DemoPage } from '../index.js';

class ComponentDemo extends DemoPage {
  constructor() {
    super();
    this.componentName = 'my-component';
    this.renderViewControls = true;
  }

  contentTemplate() {
    const { narrow } = this;
    return html`<my-component ?narrow="${narrow}">
      demo content
    </my-component>`;
  }
}

const instance = new ComponentDemo();
instance.render();

The dark theme should be applied by setting up styles for .styled.dark CSS selector.

.styled.dark {
  ...
}

The narrow attribute is commonly used in the components to tell the component that it should render mobile friendly view, if supported. When this option is toggled then the narrow property on the demo class is set to the corresponding boolean value and can be used in the content template.

Finally, the toggle styles option toggles styled class from the body element.

Observable properties

The DemoPage has initObservableProperties() method that registers properties set on the demo page as "observable". When a value of the property change then the view is re-rendered. The operation is deferred so it is safe to set multiple properties at the same time.

class ComponentDemo extends DemoPage {
  constructor() {
    super();
    this.initObservableProperties([
      'prop1', 'prop2'
    ]);
  }

  someMethod() {
    this.prop1 = 'value 1';
    this.prop2 = 'value 2';
  }

  contentTemplate() {
    const { prop1, prop2 } = this;
    return html`<p>
      prop1: ${prop1}, prop2: ${prop2}
    </p>`;
  }
}

Styling the demo

All variables and styles for the demo page should be applied to .styled CSS selector or its children. This way it is easy to switch between demo-styled and un-styled element view. The demo base class has some basic styling included with it. You can overwrite them by setting own CSS in the demo HTML template.

<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, minimum-scale=1, initial-scale=1, user-scalable=yes">
    <title>Base layout</title>
    <style>
    .styled {
      --primary-color: blue;
    }
    .styled.dark {
      --primary-color: white;
    }
    </style>
  </head>
  <body class="styled">
    <div id="demo"></div>

    <script type="module" src="./base-layout.js"></script>
  </body>
</html>

The helper

The element allows to declaratively define a demo of an element that renders the code below the demo area. This element should not be used any more. Please, upgrade to arc-interactive-demo element with combination with the demo page.

<arc-demo-helper>
  <template>
    <button id="testButton">This is test Button</button>
    <script>
    {
      document.getElementById('testButton').addEventListener('click', (e) => {
        e.target.innerText = 'It works!';
      });
    }
    </script>
  </template>
</arc-demo-helper>

arc-interactive-demo

An element that renders demo content in predefined layout with a support for configuration options.

Pass states which is an Array<String> that contains a list of available general UI states of the element. In API Components it is usually Material Design's Filled and Outlined UI and Anypoint's UI. The selectedState sets selected state. This property is not required as the element keeps it's own internal state. The application should handle state-changed event and update the UI according to user selection.

The main demo content element must include slot="content" attribute to be distributed in the correct place.

Elements with slot="options" attribute are rendered in the options drawer.

<arc-interactive-demo
  .states="${demoStates}"
  .selectedState="${demoState}"
  @state-changed="${this._demoStateHandler}"
  ?dark="${darkThemeActive}"
>
  <!-- Main content -->
  <my-component
    ?anypoint="${anypoint}"
    ?outlined="${outlined}"
    slot="content"
  ></my-component>

  <!-- Available options -->
  <label slot="options" id="mainOptionsLabel">Options</label>
  <!-- the "_toggleMainOption" handler is defined in DemoPage class. -->
  <anypoint-checkbox
    aria-describedby="mainOptionsLabel"
    slot="options"
    name="prop1"
    @change="${this._toggleMainOption}">Boolean value</anypoint-checkbox>
</arc-interactive-demo>

Development

git clone https://github.com/advanced-rest-client/arc-demo-helper
cd arc-demo-helper
npm install

Running the demo locally

npm start

Running the tests

npm test