sova-devtools 0.1.1

In-app DevTools bar for Sova (HTML inject, SSE timeline, request snapshots)
Documentation
<script setup lang="ts">
defineProps<{
  headers: string[];
  rows: unknown[][];
  monoCols?: number[];
}>();

async function copyCell(v: unknown) {
  try {
    await navigator.clipboard.writeText(String(v ?? ""));
  } catch {
    /* ignore */
  }
}
</script>

<template>
  <p v-if="!rows.length" class="m-0 text-[var(--dt-faint)]">— empty —</p>
  <div v-else class="overflow-auto rounded-[var(--dt-radius)] border border-[var(--dt-border)]">
    <table class="w-full border-collapse text-left">
      <thead>
        <tr class="bg-[var(--dt-surface-2)]">
          <th
            v-for="h in headers"
            :key="h"
            class="sticky top-0 px-2.5 py-1.5 text-[10px] font-semibold uppercase tracking-wider text-[var(--dt-faint)]"
          >
            {{ h }}
          </th>
        </tr>
      </thead>
      <tbody>
        <tr
          v-for="(row, i) in rows"
          :key="i"
          class="border-t border-[var(--dt-border)] transition-colors hover:bg-[var(--dt-surface)]"
          :class="i % 2 === 1 ? 'bg-[color-mix(in_srgb,var(--dt-surface)_45%,transparent)]' : ''"
        >
          <td
            v-for="(cell, j) in row"
            :key="j"
            class="max-w-[28rem] truncate px-2.5 py-1.5 align-top text-[12px]"
            :class="monoCols?.includes(j) ? 'dt-mono text-[11px]' : ''"
            :title="String(cell ?? '')"
            @dblclick="copyCell(cell)"
          >
            <slot name="cell" :cell="cell" :col="j" :row="row">{{ cell }}</slot>
          </td>
        </tr>
      </tbody>
    </table>
  </div>
</template>