Skip to content
/ rune Public

marpple/rune

Folders and files

NameName
Last commit message
Last commit date

Latest commit

6f4f254 · Oct 28, 2025

History

253 Commits
Oct 15, 2025
Mar 22, 2024
Oct 27, 2025
Oct 28, 2025
Jan 23, 2025
Mar 6, 2024
Mar 26, 2024
Apr 9, 2024
Oct 22, 2025
Oct 27, 2025
Oct 15, 2025
Oct 15, 2025
Oct 15, 2025
Jan 23, 2025

Repository files navigation

rune

Rune - Web API based Front-end SDK

Rune is a fast and robust library for building high-quality frontend applications, serving as a modern web technology-based SDK.

  • Object-oriented programming-based architecture
  • Type-safe Generic Views & Enable
  • Single-component Server-Side Rendering
  • Sleek UI component development kit
  • High portability and performance

Getting Started

pnpm add rune-ts
npm install rune-ts

Documentation

Example

interface Setting {
  title: string;
  on: boolean;
}

class SettingItemView extends View<Setting> {
  switchView = new SwitchView(this.data);

  override template() {
    return html`
      <div>
        <span class="title">${this.data.title}</span>
        ${this.switchView}
      </div>
    `;
  }
}

class SettingListView extends ListView<SettingItemView> {
  ItemView = SettingItemView;
}

class SettingPage extends View<Setting[]> {
  private listView = new SettingListView(this.data);
  private toggleAllView = new SwitchView({ on: this.isAllOn() });

  override template() {
    return html`
      <div>
        <div class="header">
          <h2>Setting</h2>
          ${this.toggleAllView}
        </div>
        <div class="body">${this.listView}</div>
      </div>
    `;
  }

  protected override onRender() {
    this.toggleAllView.addEventListener(Toggled, (e) => this.toggleAll(e.detail.on));
    this.listView.addEventListener(Toggled, () => this.syncToggleAllView());
  }

  private toggleAll(on: boolean) {
    this.listView.itemViews
      .filter((itemView) => itemView.data.on !== on)
      .forEach((itemView) => itemView.switchView.setOn(on));
  }

  private syncToggleAllView() {
    this.toggleAllView.setOn(this.isAllOn());
  }

  private isAllOn() {
    return this.data.every(({ on }) => on);
  }
}