basics

Template Expressions

A focused primitive example showing the core behavior in a small component.

Example overview

This prerendered document exposes Template Expressions as navigable HTML. The interactive playground experience is enhanced later by the client bundle.

Source preview

import expressionsStyles from "./expressions.styles.css";
import { PickComponent, PickRender, Reactive, Listen } from "pick-components";

// Expressions inside {{...}} are evaluated by the template engine, not by arbitrary JavaScript.
@PickRender({
  selector: "template-expressions-example",
  styles: expressionsStyles,
  template: `
    <section class="panel">
      <label>
        Name
        <input id="nameInput" type="text" value="{{name}}" />
      </label>

      <label>
        Count
        <input id="countInput" type="number" value="{{count}}" step="1" />
      </label>

      <div class="examples">
        <p><code>name.toUpperCase()</code> <strong>{{name.toUpperCase()}}</strong></p>
        <p><code>name.length</code> <strong>{{name.length}}</strong></p>
        <p><code>count + 1</code> <strong>{{count + 1}}</strong></p>
        <p><code>count % 2 === 0 ? "Even" : "Odd"</code> <strong>{{count % 2 === 0 ? "Even" : "Odd"}}</strong></p>
      </div>
    </section>
  `,
})
class TemplateExpressionsExample extends PickComponent {
  @Reactive name = "Ada";
  @Reactive count = 2;

  @Listen("#nameInput", "input")
  updateName(event: Event): void {
    this.name = (event.target as HTMLInputElement).value;
  }

  @Listen("#countInput", "input")
  updateCount(event: Event): void {
    this.count =
      Number.parseInt((event.target as HTMLInputElement).value, 10) || 0;
  }
}