<!doctype html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Sketch Web Components Demo Runner</title>
    <link rel="stylesheet" href="/dist/tailwind.css" />
    <style>
      :root {
        --demo-primary: #0969da;
        --demo-secondary: #656d76;
        --demo-background: #f6f8fa;
        --demo-border: #d1d9e0;
      }

      .demo-runner {
        width: 100%;
        display: flex;
        height: 100vh;
        font-family:
          -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
      }

      .demo-sidebar {
        width: 280px;
        background: var(--demo-background);
        border-right: 1px solid var(--demo-border);
        padding: 20px;
        overflow-y: auto;
      }

      .demo-content {
        flex: 1;
        padding: 20px;
        overflow-y: auto;
      }

      .demo-nav {
        list-style: none;
        padding: 0;
        margin: 0;
      }

      .demo-nav li {
        margin-bottom: 4px;
      }

      .demo-nav button {
        width: 100%;
        text-align: left;
        padding: 8px 12px;
        background: transparent;
        border: 1px solid transparent;
        border-radius: 6px;
        cursor: pointer;
        font-size: 14px;
        color: var(--demo-secondary);
        transition: all 0.2s;
      }

      .demo-nav button:hover {
        background: #ffffff;
        border-color: var(--demo-border);
        color: var(--demo-primary);
      }

      .demo-nav button.active {
        background: var(--demo-primary);
        color: white;
      }

      .demo-header {
        margin-bottom: 20px;
        padding-bottom: 15px;
        border-bottom: 1px solid var(--demo-border);
      }

      .demo-title {
        font-size: 24px;
        font-weight: 600;
        margin: 0 0 8px 0;
        color: #24292f;
      }

      .demo-description {
        color: var(--demo-secondary);
        margin: 0;
        font-size: 14px;
      }

      .demo-container {
        background: white;
        border: 1px solid var(--demo-border);
        border-radius: 8px;
        min-height: 400px;
        padding: 20px;
      }

      .demo-loading {
        display: flex;
        align-items: center;
        justify-content: center;
        height: 200px;
        color: var(--demo-secondary);
      }

      .demo-welcome {
        text-align: center;
        padding: 60px 20px;
        color: var(--demo-secondary);
      }

      .demo-welcome h2 {
        margin-bottom: 10px;
        color: #24292f;
      }

      .search-box {
        width: 100%;
        padding: 8px 12px;
        margin-bottom: 16px;
        border: 1px solid var(--demo-border);
        border-radius: 6px;
        font-size: 14px;
      }

      .search-box:focus {
        outline: none;
        border-color: var(--demo-primary);
      }

      .demo-error {
        padding: 20px;
        background: #ffeaea;
        border: 1px solid #ffcccc;
        border-radius: 6px;
        color: #d73a49;
      }
    </style>
  </head>
  <body>
    <div class="demo-runner">
      <nav class="demo-sidebar">
        <h1 style="font-size: 18px; margin: 0 0 20px 0; color: #24292f">
          Component Demos
        </h1>

        <input
          type="text"
          class="search-box"
          placeholder="Search components..."
          id="demo-search"
        />

        <ul class="demo-nav" id="demo-nav">
          <!-- Component list will be populated dynamically -->
        </ul>
      </nav>

      <main class="demo-content">
        <div class="demo-header" id="demo-header" style="display: none">
          <h1 class="demo-title" id="demo-title"></h1>
          <p class="demo-description" id="demo-description"></p>
        </div>

        <div class="demo-container" id="demo-container">
          <div class="demo-welcome">
            <h2>Welcome to Sketch Component Demos</h2>
            <p>Select a component from the sidebar to view its demo.</p>
          </div>
        </div>
      </main>
    </div>

    <script type="module">
      import { DemoRunner } from "./demo-framework/demo-runner.ts";

      class DemoRunnerApp {
        constructor() {
          this.demoRunner = new DemoRunner({
            container: document.getElementById("demo-container"),
            onDemoChange: this.onDemoChange.bind(this),
          });

          this.searchBox = document.getElementById("demo-search");
          this.navList = document.getElementById("demo-nav");
          this.demoHeader = document.getElementById("demo-header");
          this.demoTitle = document.getElementById("demo-title");
          this.demoDescription = document.getElementById("demo-description");

          this.currentComponent = null;
          this.availableComponents = [];

          this.init();
        }

        async init() {
          try {
            // Load available components
            this.availableComponents =
              await this.demoRunner.getAvailableComponents();
            this.renderNavigation();

            // Set up search
            this.searchBox.addEventListener(
              "input",
              this.handleSearch.bind(this),
            );

            // Handle URL hash for direct linking
            this.handleHashChange();
            window.addEventListener(
              "hashchange",
              this.handleHashChange.bind(this),
            );
          } catch (error) {
            console.error("Failed to initialize demo runner:", error);
            this.showError("Failed to load demo components");
          }
        }

        renderNavigation(filter = "") {
          const filteredComponents = this.availableComponents.filter(
            (component) =>
              component.toLowerCase().includes(filter.toLowerCase()),
          );

          this.navList.innerHTML = "";

          filteredComponents.forEach((component) => {
            const li = document.createElement("li");
            const button = document.createElement("button");
            button.textContent = this.formatComponentName(component);
            button.addEventListener("click", () =>
              this.loadComponent(component),
            );

            if (component === this.currentComponent) {
              button.classList.add("active");
            }

            li.appendChild(button);
            this.navList.appendChild(li);
          });
        }

        formatComponentName(component) {
          return component
            .replace(/^sketch-/, "")
            .replace(/-/g, " ")
            .replace(/\b\w/g, (l) => l.toUpperCase());
        }

        async loadComponent(componentName) {
          if (this.currentComponent === componentName) {
            return;
          }

          try {
            this.showLoading();
            await this.demoRunner.loadDemo(componentName);
            this.currentComponent = componentName;

            // Update URL hash
            window.location.hash = componentName;

            // Update navigation
            this.renderNavigation(this.searchBox.value);
          } catch (error) {
            console.error(`Failed to load demo for ${componentName}:`, error);
            this.showError(`Failed to load demo for ${componentName}`);
          }
        }

        onDemoChange(componentName, demo) {
          // Update header
          this.demoTitle.textContent = demo.title;
          this.demoDescription.textContent = demo.description || "";

          if (demo.description) {
            this.demoDescription.style.display = "block";
          } else {
            this.demoDescription.style.display = "none";
          }

          this.demoHeader.style.display = "block";
        }

        handleSearch(event) {
          this.renderNavigation(event.target.value);
        }

        handleHashChange() {
          const hash = window.location.hash.slice(1);
          if (hash && this.availableComponents.includes(hash)) {
            this.loadComponent(hash);
          }
        }

        showLoading() {
          document.getElementById("demo-container").innerHTML = `
            <div class="demo-loading">
              Loading demo...
            </div>
          `;
        }

        showError(message) {
          document.getElementById("demo-container").innerHTML = `
            <div class="demo-error">
              <strong>Error:</strong> ${message}
            </div>
          `;
        }
      }

      // Initialize the demo runner when DOM is ready
      if (document.readyState === "loading") {
        document.addEventListener(
          "DOMContentLoaded",
          () => new DemoRunnerApp(),
        );
      } else {
        new DemoRunnerApp();
      }
    </script>
  </body>
</html>
