The Source of Truth: Authoring Component Documentation

In the Espalier system, we do not write documentation files manually for our components. Instead, we utilize JSDoc comments within our Lit Element source files to generate a Custom Elements Manifest (CEM). This manifest acts as the "Source of Truth" for the entire design system, driving our static site, IDE autocomplete, and eventual design-tool integrations.

By authoring documentation alongside the implementation, we eliminate the risk of "Documentation Drift" and ensure that our API is always self-describing.

The Anatomy of a Component Comment

Every Espalier component must begin with a block comment (/**... */) placed immediately above the class definition. This comment should use Markdown to describe the component's purpose and include specific tags that the CEM analyzer can parse.

/**
 * A versatile button component that supports various visual 
 * variants and reactive states.
 * 
 * @tag esp-button
 * @summary Primary action trigger for user interfaces.
 */
@customElement('esp-button')
export class EspalierButton extends LitElement {... }

Supported Documentation Tags

To create a defensible and helpful API, you must document the following interactive surface areas using these standard tags:

1. Properties and Attributes

  • @prop {type} name - description: Documents a JavaScript property.
  • @attr {type} name - description: Documents an HTML attribute.
  • @default value: Specifies the initial value.

2. Composition and Slots

  • @slot - description: Documents the default, unnamed slot.
  • @slot name - description: Documents a named slot (e.g., prefix or suffix).

3. Events and Interactivity

  • @fires event-name - description: Documents a custom event dispatched by the component. This allows consumers to know exactly which listeners to attach.

4. Styling API (Shadow DOM)

  • @cssprop --variable-name - description: Documents a CSS Custom Property that can be used to theme the component.
  • @csspart part-name - description: Documents a Shadow Part that can be styled via the ::part() pseudo-element.

Markdown in JSDoc

The descriptions within your tags are parsed as Markdown. You are encouraged to use:

  • Bold and Italics for emphasis.
  • In-line `code` for variable names.
  • Unordered lists for complex requirements.

Challenge the Assumption: "Type Definitions are Documentation"

A common assumption in modern development is that TypeScript interfaces are enough to document a component. We challenge this. A type definition (like string) tells a developer what the data is, but it doesn't explain Why it exists, When to use it, or How it affects the UI.

For a defensible architecture, every public member must have a human-readable description in Markdown.

Strategic Impact: The Manifest Ecosystem

Authoring documentation via JSDoc tags unlocks the "Manifest Ecosystem":

  • IDE Support: Developers using VS Code get "hover docs" and autocomplete for your component's attributes and CSS properties.
  • Automated READMEs: We can generate consistent GitHub documentation directly from the source code.
  • Figma Connectivity: The manifest can be used to map code properties to Figma components, creating true parity between design and engineering.
Components API Guides Getting started Styling Espalier Browser support GitHub npm package Taproot I/O