summaryrefslogtreecommitdiffhomepage
path: root/src/components/Table.svelte
blob: b6f5c5ad9a494f9cfc6654ae10b9baf1ad8f0d00 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<script lang="ts">
  // Generic, purely presentational table. Props in → markup out; zero logic,
  // zero data-fetching. Shared by the surface custom-field "table" renderer and
  // the frontend "Loaded Modules" view, so neither feature depends on the other.
  let {
    columns,
    rows,
    empty = "No data",
  }: {
    readonly columns: readonly string[];
    readonly rows: readonly (readonly string[])[];
    /** Text shown when there are no rows. */
    readonly empty?: string;
  } = $props();
</script>

<div class="overflow-x-auto">
  <table class="table table-sm">
    <thead>
      <tr>
        {#each columns as col, i (i)}
          <th>{col}</th>
        {/each}
      </tr>
    </thead>
    <tbody>
      {#if rows.length === 0}
        <tr>
          <td colspan={Math.max(columns.length, 1)} class="opacity-60">{empty}</td>
        </tr>
      {:else}
        {#each rows as row, r (r)}
          <tr>
            {#each row as cell, c (c)}
              <td>{cell}</td>
            {/each}
          </tr>
        {/each}
      {/if}
    </tbody>
  </table>
</div>