Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
shipshitdev avatar

Quick View

  • 126 installs
  • 31 repo stars
  • Updated August 2, 2026
  • shipshitdev/library

Add fast preview panels, modals, or side drawers that surface record details without full navigation during UI implementation.

About

Quick-view encodes reusable UI patterns for inline previews—drawers, popovers, or split panes—that load entity details on demand. It helps agents wire fetching, loading states, routing hooks, and accessible interactions for snappy inspection flows.

  • Detail drawer patterns
  • Lazy data fetch on open
  • Keyboard and focus handling
  • Skeleton loading states
  • Deep-link friendly previews

Quick View by the numbers

  • 126 all-time installs (skills.sh)
  • +3 installs in the week ending Jul 27, 2026 (Skillselion tracking)
  • Ranked #1,000 of 2,245 Frontend Development skills by installs in the Skillselion catalog
  • Data as of Aug 3, 2026 (Skillselion catalog sync)
npx skills add https://github.com/shipshitdev/library --skill quick-view

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs126
repo stars31
Last updatedAugust 2, 2026
Repositoryshipshitdev/library

What it does

Add fast preview panels, modals, or side drawers that surface record details without full navigation during UI implementation.

Files

SKILL.mdMarkdownGitHub ↗

Quick View

Generate minimal HTML to review structured data in a browser. Minimal styling, maximum readability.

When to Use

  • User wants to review output that's hard to read in terminal
  • Lists, tables, drafts, summaries that benefit from visual layout
  • User says: "show me", "view this", "make reviewable", "open as webpage"

Output Rules

DO:

  • Semantic HTML: <table>, <ul>, <details>, <pre>, <h1-3>
  • Use the base template with CSS variables
  • Write to _private/views/
  • Open with open _private/views/{filename}

DO NOT:

  • Add decorative styling beyond the base template
  • Use CSS frameworks
  • Over-engineer or "make it nice"

File Naming

Views have a lifecycle: temporary → keeper → archived.

StageFilenameWhen
Temporaryname-temp.htmlDefault for new views
Keepername.htmlUser says "keep this", "this is good"
Archivedname.2025-01-01.htmlPrevious keeper when promoting new one

Rules:

1. Always create with `-temp` suffix — Every new view starts as name-temp.html 2. Promote on approval — When user approves, rename to name.html 3. Archive before replacing — If name.html exists, rename to name.DATE.html before promoting 4. Never regenerate keepers — Only regenerate -temp files

Workflow:

# First iteration
drafts-temp.html  ← created

# User: "keep this"
drafts.html       ← promoted (temp deleted)

# Later iteration
drafts-temp.html  ← new temp created
drafts.html       ← keeper untouched

# User: "this is better, keep it"
drafts.2025-01-01.html  ← old keeper archived
drafts.html             ← new keeper promoted

Trigger phrases for promotion:

  • "keep this", "this is good", "save this"
  • "make this the default", "lock this in"
  • "I like this one"

Base Template

Every quick-view HTML file uses the base template at ${CLAUDE_SKILL_DIR}/assets/base-template.html. Load it to get the full HTML structure with CSS variables, dark-mode support, truncation toggle script, and type-border classes. Replace {title}, {timestamp}, {count}, and {content} placeholders when generating output.

Patterns

List of items

<h1>Title</h1>
<ul>
  <li><strong>@username</strong> — action item</li>
</ul>

Table

<table>
  <tr><th>Contact</th><th>Action</th><th>Draft</th></tr>
  <tr><td>@name</td><td>Follow up</td><td>Hey...</td></tr>
</table>

Expandable sections (for long content)

<details>
  <summary><strong>@username</strong> — action</summary>
  <div class="truncate">
    <pre>Long content here that may need truncation...</pre>
  </div>
</details>

Type-differentiated items

<div class="type-user">User message or input</div>
<div class="type-draft">Draft content</div>
<div class="type-done">Completed item</div>

With actions

<p>
  <a href="tg://resolve?domain=username">Open Telegram</a> ·
  <button onclick="navigator.clipboard.writeText('draft text')">Copy</button>
</p>

Sourced data (citations & drill-down)

When displaying data gathered from external sources, always include attribution links for drill-down.

Add to base template CSS:

.source { color: var(--muted); font-size: 0.75rem; }
.source a { color: var(--muted); }
.source a:hover { color: var(--accent); }

Inline attribution (preferred for lists):

<div class="tip">
  <strong>Tip title</strong> — Description of the tip.
  <span class="source">— <a href="https://x.com/user/status/123">@username</a></span>
</div>

Table with source column:

<table>
  <tr><th>Tip</th><th>Source</th></tr>
  <tr>
    <td>Description here</td>
    <td class="source"><a href="https://x.com/user/status/123">@user</a></td>
  </tr>
</table>

Expandable with source in summary:

<details>
  <summary><strong>Tip title</strong> <span class="source">— <a href="URL">@source</a></span></summary>
  <p>Full content...</p>
</details>

Meta header with main source:

<p class="meta">
  Generated: {timestamp} · {count} items ·
  Source: <a href="https://x.com/user/status/123">Original thread</a>
</p>

Principles:

  • Always link to original when data comes from external sources
  • Use @username for social media, domain for articles
  • Source links should be muted/subtle, not prominent
  • Include main source in meta header for collections from single source

Editable drafts (with diff tracking)

For drafts that user may edit before sending. Tracks original vs edited for later analysis.

<details>
  <summary><strong>@username</strong> — action <span class="status"></span></summary>
  <pre contenteditable="true"
       data-username="username"
       data-original="Original draft text here"
       onblur="saveDraft(this)">Original draft text here</pre>
  <div class="actions">
    <a href="tg://resolve?domain=username">Open Telegram</a>
    <button onclick="copyDraft(this)">Copy</button>
  </div>
</details>

Include this script block at end of <body> (before closing </body> tag):

function saveDraft(el) {
  const key = 'draft_' + el.dataset.username;
  const edited = el.textContent.trim();
  const original = el.dataset.original;
  if (edited !== original) {
    localStorage.setItem(key, edited);
    el.closest('details').querySelector('.status').textContent = '(edited)';
  }
}

function copyDraft(btn) {
  const pre = btn.closest('details').querySelector('pre');
  navigator.clipboard.writeText(pre.textContent.trim());
  btn.textContent = 'Copied!';
  setTimeout(() => btn.textContent = 'Copy', 1500);
}

function restoreEdits() {
  document.querySelectorAll('pre[data-username]').forEach(el => {
    const saved = localStorage.getItem('draft_' + el.dataset.username);
    if (saved) {
      el.textContent = saved;
      el.closest('details').querySelector('.status').textContent = '(edited)';
    }
  });
}

function exportEdits() {
  const edits = [];
  document.querySelectorAll('pre[data-username]').forEach(el => {
    const original = el.dataset.original;
    const current = el.textContent.trim();
    if (original !== current) {
      edits.push({ username: el.dataset.username, original, edited: current });
    }
  });
  if (edits.length === 0) { alert('No edits to export'); return; }
  const blob = new Blob([JSON.stringify({exported_at: new Date().toISOString(), edits}, null, 2)], {type: 'application/json'});
  const a = document.createElement('a');
  a.href = URL.createObjectURL(blob);
  a.download = 'draft_edits.json';
  a.click();
}

restoreEdits();

Add export button in header when using editable drafts:

<p class="meta">Generated: {timestamp} · {count} drafts · <button onclick="exportEdits()">Export Edits</button></p>

Workflow

1. Identify the data to display (file, variable, recent output) 2. Choose pattern: list, table, or expandable sections 3. Generate HTML using template above 4. Write to _private/views/{name}-temp.html 5. Run open _private/views/{name}-temp.html 6. If user approves, promote to {name}.html

Example

User: "show me the drafts"

Agent:

1. Reads _private/drafts/outreach_drafts.md 2. Parses each draft (heading = contact, body = draft) 3. Generates HTML with <details> for each draft 4. Writes to _private/views/drafts-temp.html 5. Runs open _private/views/drafts-temp.html

Result: Browser opens, user sees expandable list of drafts with auto dark/light mode, long content truncated with "Show more", can copy each one.

User: "this looks good, keep it"

Agent:

1. Renames drafts-temp.htmldrafts.html 2. Confirms: "Saved as drafts.html"

Styling Handoff

This skill produces functional HTML with minimal styling. For full visual styling, invoke the html-style skill after generating.

Classes used by quick-view (compatible with html-style):

ClassPurpose
.type-userUser input/message
.type-draftDraft content
.type-doneCompleted item
.sourceAttribution links
.metaMetadata header
.truncateLong content container
.actionsAction button container

Data attributes for JS hooks:

  • data-username — Identifier for drafts
  • data-original — Original text for diff tracking

Attribution

Truncation pattern and CSS variables approach inspired by simon willison's claude-code-transcripts.

Related skills

Frontend Developmentfrontendintegrations

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.