Skip to content
dashboard-auto-generation-client logo

Dashboard Auto-Generation (Client Edition)

dashboard-auto-generation-client

Generate professional, client-ready dashboards from data files with clean design (no CURV branding). Detects patterns, creates visualizations, provides insights. Perfect for client presentations and professional reporting.

SKILL.md

Full skill instructions

Dashboard Auto-Generation (Client Edition)

Core Principle

Show first, refine later. Never ask "what do you want to see?" - analyze the data, detect patterns, and build a professional dashboard immediately.

Client-Ready Design: Clean, professional styling with neutral colors and universal branding. No CURV-specific elements. Ready to share directly with clients.

When to Activate

Activate this skill when user:

  • Uploads a data file (CSV, Excel, JSON, TSV)
  • Says "analyze this data"
  • Asks for a "dashboard" or "report"
  • Wants to "visualize" or "understand" data
  • Mentions PPC, sales, analytics, or business metrics
  • Requests "client-friendly" or "professional" dashboard
  • Wants to share analysis with external stakeholders

Do NOT ask questions - just build the best dashboard you can from the data.

Modern Design System (Actual n8n Tokens)

CRITICAL: Complete CSS Variables (Copy Exactly)

Every dashboard MUST start with these exact n8n design tokens in the <style> tag:

:root {
  /​* n8n colors - extracted from n8n.io */
  --color-crow: rgba(25, 9, 24, 0.94);
  --color-dr--white: rgba(250, 249, 251, 0.75);
  --color-new-love: rgb(196, 187, 211);
  --color-ink-black: rgba(31, 25, 42, 0.7);
  --color-ink-black-2: rgba(31, 25, 42, 0.5);
  --color-ink-black-3: rgba(31, 25, 42, 0.3);
  --color-ink-black-4: rgb(31, 25, 42);
  --color-white: rgba(255, 255, 255, 0.16);
  --color-white-2: rgba(255, 255, 255, 0.1);
  --color-white-3: rgba(255, 255, 255, 0.3);
  --color-white-4: rgb(255, 255, 255);
  --color-white-5: rgba(255, 255, 255, 0.8);
  --color-white-6: rgba(255, 255, 255, 0.93);
  --color-narwhale-grey: rgba(12, 8, 28, 0.43);
  --color-narwhale-grey-2: rgba(13, 10, 25, 0.28);
  --color-narwhale-grey-3: rgb(14, 9, 24);

  /​* n8n typography */
  --font-family: geomanist, ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
  --font-family-book: geomanist-book, ui-sans-serif, system-ui, sans-serif;

  /​* n8n spacing */
  --vspace-sm: 0.5rem;
  --vspace-md: 1rem;
  --vspace-lg: 1.5rem;
  --vspace-xl: 2rem;
  --vspace-xxl: 3rem;

  --hspace-sm: 0.5rem;
  --hspace-md: 1rem;
  --hspace-lg: 1.5rem;
  --hspace-xl: 2rem;

  /​* n8n border radii */
  --border-radius-sm: 8px;
  --border-radius-md: 16px;
  --border-radius-lg: 20px;
  --border-radius-xl: 1.5rem;

  /​* n8n shadows - glassmorphic effects */
  --shadow-card: rgba(255, 255, 255, 0.05) 0px 4px 12px 0px inset, rgba(0, 0, 0, 0.23) 0px 4px 16px -8px;
  --shadow-card-hover: rgb(196, 187, 211) 0px 0px inset, rgba(14, 9, 24, 0.44) 0px 4px 4px, rgb(0, 0, 0) 0px 13px 16px -8px, rgba(255, 255, 255, 0.05) 0px 4px 12px inset;
  --shadow-glow: rgba(196, 187, 211, 0.3) 0px 0px 20px;
}

Base Styles Using n8n Tokens

* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}

body {
    font-family: var(--font-family);
    background: var(--color-narwhale-grey-3);
    color: var(--color-white-4);
    line-height: 1.6;
    padding: var(--vspace-xl);
    min-height: 100vh;
}

.container {
    max-width: 1400px;
    margin: 0 auto;
}

h1, h2, h3 {
    font-family: var(--font-family-book);
    font-weight: 500;
}

.dashboard-title {
    font-size: 54px;
    font-weight: 500;
    color: var(--color-white-4);
    letter-spacing: -2px;
    line-height: 54px;
}

.metric-value {
    font-size: 48px;
    font-weight: 500;
    color: var(--color-new-love);
    line-height: 1;
}

.metric-label {
    font-size: 14px;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--color-dr--white);
    font-weight: 400;
}

Header (Modern n8n-Style)

<!-- ========== MODERN GRADIENT HEADER ========== -->
<header class="modern-header">
    <div class="header-background"></​div>
    <div class="header-content">
        <h1 class="dashboard-title">[Dashboard Name]</​h1>
        <p class="dashboard-subtitle">[Description of data - e.g., "30-Day Performance Analysis | Aug 11 - Sep 9, 2025"]</​p>
        <p class="dashboard-metadata">Generated: [Date] | [Data Point Count] records analyzed</​p>
    </​div>
</​header>

Required CSS for Header (Using n8n Tokens):

.modern-header {
    text-align: center;
    margin-bottom: var(--vspace-xxl);
    padding: var(--vspace-xxl) var(--hspace-xl);
    background: var(--color-ink-black);
    border-radius: var(--border-radius-lg);
    position: relative;
    overflow: hidden;
    border: 1px solid var(--color-ink-black-3);
    box-shadow: var(--shadow-card);
}

.header-background {
    position: absolute;
    top: -50%;
    left: -50%;
    width: 200%;
    height: 200%;
    background: radial-gradient(circle, var(--color-narwhale-grey) 0%, transparent 70%);
    animation: pulseGlow 8s ease-in-out infinite;
}

@keyframes pulseGlow {
    0%, 100% { opacity: 0.5; transform: scale(1); }
    50% { opacity: 0.8; transform: scale(1.1); }
}

.header-content {
    max-width: 900px;
    margin: 0 auto;
    position: relative;
    z-index: 1;
}

.dashboard-title {
    font-size: 54px;
    font-weight: 500;
    color: var(--color-white-4);
    letter-spacing: -2px;
    margin: 0 0 var(--vspace-md) 0;
    line-height: 54px;
}

.dashboard-subtitle {
    font-size: 20px;
    color: var(--color-white-5);
    margin: 0 0 var(--vspace-sm) 0;
    font-weight: 400;
    line-height: 30px;
}

.dashboard-metadata {
    font-size: 14px;
    color: var(--color-dr--white);
    margin: 0;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    font-weight: 400;
}

/​* Responsive header */
@media (max-width: 768px) {
    .modern-header { padding: var(--vspace-xl) var(--hspace-lg); }
    .dashboard-title { font-size: 36px; line-height: 36px; }
    .dashboard-subtitle { font-size: 16px; }
}

Footer (Modern Design)

<!-- ========== MODERN FOOTER ========== -->
<footer class="modern-footer">
    <div class="footer-content">
        <p class="footer-credits">Produced By Danny McMillan | A Seller Sessions Production | &copy; 2025</​p>
    </​div>
</​footer>

Required CSS for Footer (Using n8n Tokens):

.modern-footer {
    text-align: center;
    padding: var(--vspace-xl) var(--hspace-lg);
    margin-top: var(--vspace-xxl);
    border-top: 1px solid var(--color-ink-black-3);
    background: var(--color-ink-black-2);
}

.footer-content {
    max-width: 900px;
    margin: 0 auto;
}

.footer-credits {
    font-size: 14px;
    color: var(--color-dr--white);
    margin: 0;
    letter-spacing: 0.04em;
    font-weight: 400;
    line-height: 21px;
}

Panel Design (Glassmorphic Cards - n8n Style)

.panel {
    background: var(--color-ink-black);
    backdrop-filter: blur(20px);
    border: 1px solid var(--color-ink-black-3);
    border-radius: var(--border-radius-lg);
    padding: var(--hspace-xl);
    box-shadow: var(--shadow-card);
    transition: box-shadow 0.5s ease, border-color 0.5s ease, transform 0.3s ease;
    position: relative;
    overflow: hidden;
}

.panel::before {
    content: '';
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    height: 1px;
    background: linear-gradient(90deg, transparent, var(--color-new-love), transparent);
    opacity: 0.3;
}

.panel:hover {
    transform: translateY(-4px);
    box-shadow: var(--shadow-card-hover);
    border-color: var(--color-new-love);
}

Button Styles (Professional)

.btn-primary {
    background: linear-gradient(135deg, #2563eb, #1d4ed8);
    color: white;
    border: none;
    border-radius: 8px;
    padding: 12px 32px;
    font-weight: 600;
    cursor: pointer;
    transition: all 0.3s ease;
}

.btn-primary:hover {
    transform: translateY(-2px);
    box-shadow: 0 8px 16px rgba(37, 99, 235, 0.25);
}

.btn-outline {
    background: transparent;
    color: #2563eb;
    border: 2px solid #2563eb;
    border-radius: 8px;
    padding: 10px 28px;
}

Tab Navigation (Modern n8n Style)

<div class="tab-nav">
    <button class="tab active">OVERVIEW</​button>
    <button class="tab">EXPLORER</​button>
    <button class="tab">FUNNEL</​button>
    <button class="tab">INSIGHTS</​button>
</​div>

Tab Styling (Using n8n Tokens):

.tab-nav {
    display: flex;
    gap: var(--hspace-sm);
    margin-bottom: var(--vspace-xl);
    padding: var(--hspace-sm);
    background: var(--color-ink-black-2);
    border-radius: var(--border-radius-md);
    border: 1px solid var(--color-ink-black-3);
}

.tab {
    background: transparent;
    color: var(--color-dr--white);
    border: none;
    border-radius: var(--border-radius-sm);
    padding: var(--vspace-md) var(--hspace-lg);
    font-size: 14px;
    font-weight: 400;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    cursor: pointer;
    transition: box-shadow 0.5s ease, border-color 0.5s ease, background 0.3s ease;
    position: relative;
    line-height: 21px;
}

.tab.active {
    color: var(--color-white-4);
    background: var(--color-ink-black);
    border: 1px solid var(--color-new-love);
    box-shadow: var(--shadow-glow);
}

.tab:hover:not(.active) {
    color: var(--color-white-5);
    background: var(--color-white-2);
}

Auto-Detection Patterns

1. PPC / Advertising Data

Detect columns like:

  • Placement, Campaign, Ad Group, Keyword, Search Term
  • Impressions, Clicks, Spend, Cost Per Click (CPC)
  • Sales, Revenue, ROAS, ACOS, CTR, Conversion Rate
  • Orders, Units, Add-to-Cart, Cart Adds

Auto-generate tabs:

  1. OVERVIEW - 6 key metrics + top performers table
  2. EXPLORER - Searchable/​filterable table with all campaigns/​keywords
  3. FUNNEL - Impressions → Clicks → Cart Adds → Purchases (with CVR)
  4. INSIGHTS - Key findings, opportunities, recommendations

2. Sales / E-commerce Data

Detect columns like:

  • Date, Product, SKU, Category, ASIN
  • Units, Revenue, Profit, Price
  • Orders, Customers, Sessions
  • Returns, Refunds

Auto-generate tabs:

  1. OVERVIEW - Revenue, units, AOV, profit metrics
  2. EXPLORER - Product performance table with filters
  3. FUNNEL - Sessions → Views → Cart → Purchase (if session data)
  4. INSIGHTS - Low stock, high return rate, underperformers

3. Analytics / Traffic Data

Detect columns like:

  • Date, Source, Medium, Campaign, Keyword
  • Sessions, Users, Pageviews, Bounce Rate
  • Conversion Rate, Goal Completions, Events
  • Avg Session Duration, Pages per Session

Auto-generate tabs:

  1. OVERVIEW - Sessions, users, CVR, bounce rate
  2. EXPLORER - Source/​medium breakdown with filters
  3. FUNNEL - Landing → Engagement → Conversion
  4. INSIGHTS - High bounce sources, conversion opportunities

4. Financial / Business Data

Detect columns like:

  • Date, Account, Category, Transaction Type
  • Amount, Debit, Credit, Balance
  • Vendor, Customer, Invoice

Auto-generate tabs:

  1. OVERVIEW - Total income, expenses, profit, cash flow
  2. EXPLORER - Transaction table with filters
  3. NO FUNNEL - Not applicable
  4. INSIGHTS - Top expenses, late invoices, cash flow issues

Tab System (When to Use)

Use Tabs When:

  • Dataset has >100 rows (need explorer for search/​filter)
  • Data supports funnel visualization (impressions→clicks→conversions)
  • Multiple insight types exist (opportunities, trends, recommendations)

Single Page When:

  • Dataset <50 rows (all fits on overview)
  • Simple report with few metrics
  • No funnel or exploration needed

Overview Tab (Always Required)

Structure:

  1. Performance Summary Section (4-6 large metric cards)
  2. Top Performers Table (top 10 by primary metric)
  3. Key Insights Section (3-5 bullet points)

Metric Cards (Modern n8n Style - 3 Columns):

<div class="metrics-grid">
    <div class="metric-card">
        <div class="metric-content">
            <p class="metric-label">IMPRESSIONS</​p>
            <p class="metric-value">50.9K</​p>
            <p class="metric-detail">Brand share: 1.8%</​p>
        </​div>
        <div class="metric-footer">
            <span class="percentage positive">+12.5%</​span>
            <span class="period">vs last period</​span>
        </​div>
    </​div>
    <!-- Repeat for other metrics -->
</​div>

Metric Card Styling (3 Equal Columns - Using n8n Tokens):

.metrics-grid {
    display: grid;
    grid-template-columns: repeat(3, 1fr);  /​* EXACTLY 3 columns, equal width */
    gap: var(--hspace-lg);
    margin-bottom: var(--vspace-xxl);
}

@media (max-width: 1024px) {
    .metrics-grid {
        grid-template-columns: repeat(2, 1fr);  /​* 2 columns on tablets */
    }
}

@media (max-width: 640px) {
    .metrics-grid {
        grid-template-columns: 1fr;  /​* 1 column on mobile */
    }
}

.metric-card {
    background: var(--color-ink-black);
    backdrop-filter: blur(20px);
    border: 1px solid var(--color-ink-black-3);
    border-radius: var(--border-radius-lg);
    padding: var(--hspace-xl);
    box-shadow: var(--shadow-card);
    transition: box-shadow 0.5s ease, border-color 0.5s ease, transform 0.3s ease;
    position: relative;
    overflow: hidden;
}

.metric-card::before {
    content: '';
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    height: 2px;
    background: linear-gradient(90deg, transparent, var(--color-new-love), transparent);
    opacity: 0.4;
}

.metric-card:hover {
    transform: translateY(-8px);
    box-shadow: var(--shadow-card-hover);
    border-color: var(--color-new-love);
}

.metric-content {
    margin-bottom: var(--vspace-lg);
}

.metric-label {
    font-size: 14px;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--color-dr--white);
    font-weight: 400;
    margin-bottom: var(--vspace-sm);
    line-height: 21px;
}

.metric-value {
    font-size: 48px;
    font-weight: 500;
    color: var(--color-new-love);
    margin: var(--vspace-sm) 0;
    line-height: 48px;
}

.metric-detail {
    font-size: 14px;
    color: var(--color-dr--white);
    margin-top: var(--vspace-sm);
    line-height: 21px;
}

.metric-footer {
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding-top: var(--vspace-lg);
    border-top: 1px solid var(--color-ink-black-3);
}

.percentage {
    font-size: 14px;
    font-weight: 400;
    padding: var(--vspace-1) var(--hspace-sm);
    border-radius: var(--border-radius-sm);
    line-height: 21px;
}

.percentage.positive {
    background: rgba(16, 185, 129, 0.2);
    color: #10b981;
}

.percentage.negative {
    background: rgba(239, 68, 68, 0.2);
    color: #ef4444;
}

.period {
    font-size: 14px;
    color: var(--color-white-3);
    font-weight: 400;
    line-height: 21px;
}

Explorer Tab (When >100 Rows)

Structure:

  1. Search Bar (filter across all text columns)
  2. Performance Legend (color-coded badges)
  3. Sortable Table (click headers to sort)
  4. Pagination (10/​20/​50 per page)

Search Implementation:

<div class="explorer-controls">
    <input type="text" id="search-input" placeholder="Search..." class="search-input">
    <select id="per-page" class="per-page-select">
        <option value="10">10 per page</​option>
        <option value="20">20 per page</​option>
        <option value="50">50 per page</​option>
    </​select>
    <span class="results-count">Showing <strong id="count">0</​strong> results</​span>
</​div>

Professional Table Design:

.data-table {
    width: 100%;
    border-collapse: collapse;
    background: #ffffff;
    border-radius: 12px;
    overflow: hidden;
    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
}

.data-table thead {
    background: linear-gradient(135deg, #f8f9fa, #e5e7eb);
}

.data-table th {
    padding: 16px;
    text-align: left;
    font-size: 12px;
    text-transform: uppercase;
    letter-spacing: 0.5px;
    color: #6b7280;
    font-weight: 700;
    border-bottom: 2px solid #2563eb;
}

.data-table td {
    padding: 16px;
    border-bottom: 1px solid #e5e7eb;
    color: #1f2937;
}

.data-table tr:hover {
    background: #f8f9fa;
}

.data-table th.sortable {
    cursor: pointer;
    user-select: none;
}

.data-table th.sortable:hover {
    color: #2563eb;
}

Performance Badges (Professional):

.badge {
    padding: 4px 12px;
    border-radius: 16px;
    font-size: 11px;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.5px;
}

.badge.excellent {
    background: #d1fae5;
    color: #065f46;
}

.badge.good {
    background: #fef3c7;
    color: #92400e;
}

.badge.needs-work {
    background: #fee2e2;
    color: #991b1b;
}

Funnel Tab (When Funnel Data Exists)

When to Create Funnel:

PPC Data: Impressions → Clicks → Cart Adds → Purchases E-commerce: Sessions → Views → Cart → Purchase Analytics: Landing → Engagement → Goal Completion Support: New → In Progress → Resolved

Professional Funnel Visualization:

<div class="funnel-container">
    <h2 class="funnel-title">Conversion Funnel Analysis</​h2>
    <p class="funnel-subtitle">Track customer journey and identify conversion bottlenecks</​p>

    <div class="funnel-visual">
        <!-- Stage 1 -->
        <div class="funnel-stage" style="width: 100%;">
            <div class="stage-header">
                <span class="stage-icon">👁️</​span>
                <span class="stage-name">Impressions</​span>
            </​div>
            <div class="stage-metric">50,900</​div>
            <div class="stage-detail">Starting point</​div>
        </​div>

        <!-- Drop-off -->
        <div class="funnel-drop">
            <span class="drop-rate">-94.9%</​span>
            <div class="drop-arrow">↓</​div>
        </​div>

        <!-- Stage 2 -->
        <div class="funnel-stage" style="width: 85%;">
            <div class="stage-header">
                <span class="stage-icon">🖱️</​span>
                <span class="stage-name">Clicks</​span>
            </​div>
            <div class="stage-metric">2,600</​div>
            <div class="stage-detail">
                <span class="cvr">5.1% CVR</​span>
            </​div>
        </​div>
        <!-- Continue for all stages -->
    </​div>

    <div class="funnel-summary">
        <div class="summary-card">
            <p class="summary-value">0.62%</​p>
            <p class="summary-label">Overall Conversion</​p>
        </​div>
        <div class="summary-card">
            <p class="summary-value alert">94.9%</​p>
            <p class="summary-label">Largest Drop-off</​p>
        </​div>
        <div class="summary-card">
            <p class="summary-value">Impressions → Clicks</​p>
            <p class="summary-label">Critical Stage</​p>
        </​div>
    </​div>
</​div>

Professional Funnel Styling:

.funnel-visual {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 0;
    margin: 40px 0;
}

.funnel-stage {
    background: linear-gradient(135deg, #dbeafe, #bfdbfe);
    border: 2px solid #2563eb;
    border-radius: 12px;
    padding: 32px;
    text-align: center;
    transition: all 0.3s ease;
}

.funnel-stage:hover {
    transform: scale(1.02);
    box-shadow: 0 8px 24px rgba(37, 99, 235, 0.2);
}

.stage-metric {
    font-size: 36px;
    font-weight: 700;
    color: #1f2937;
    margin: 12px 0;
}

.funnel-drop {
    display: flex;
    flex-direction: column;
    align-items: center;
    padding: 16px 0;
}

.drop-rate {
    background: #fee2e2;
    color: #991b1b;
    padding: 6px 16px;
    border-radius: 20px;
    font-size: 14px;
    font-weight: 600;
}

.cvr {
    background: #d1fae5;
    color: #065f46;
    padding: 4px 12px;
    border-radius: 12px;
    font-size: 12px;
    font-weight: 600;
}

Insights Tab (Always Include)

Structure:

  1. Key Findings (3-5 bullet points with context)
  2. Opportunities (sorted by impact)
  3. Recommendations (actionable next steps)

Professional Insight Cards:

<div class="insights-section">
    <h2 class="section-title">📊 Key Findings</​h2>
    <div class="insights-grid">
        <div class="insight-card success">
            <div class="insight-icon">✓</​div>
            <div class="insight-content">
                <h3>Top Performing Segment</​h3>
                <p class="insight-text">Product Pages deliver 5.84x ROAS vs 2.1x average</​p>
                <p class="insight-recommendation">Recommendation: Increase budget allocation by 30%</​p>
            </​div>
        </​div>
        <!-- More insights -->
    </​div>
</​div>

Insight Card Styling:

.insights-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
    gap: 24px;
    margin-bottom: 40px;
}

.insight-card {
    background: #ffffff;
    border: 1px solid #e5e7eb;
    border-left: 4px solid #2563eb;
    border-radius: 12px;
    padding: 24px;
    transition: all 0.3s ease;
}

.insight-card.success {
    border-left-color: #10b981;
}

.insight-card.warning {
    border-left-color: #f59e0b;
}

.insight-card.alert {
    border-left-color: #ef4444;
}

.insight-icon {
    font-size: 32px;
    margin-bottom: 16px;
}

.insight-text {
    font-size: 16px;
    color: #1f2937;
    margin-bottom: 12px;
    font-weight: 500;
}

.insight-recommendation {
    font-size: 14px;
    color: #6b7280;
    font-style: italic;
}

Opportunity Cards (Professional):

<div class="opportunities-section">
    <h2 class="section-title">💡 Opportunities</​h2>
    <div class="opportunities-grid">
        <div class="opportunity-card high-impact">
            <div class="card-header">
                <span class="impact-badge high">HIGH IMPACT</​span>
            </​div>
            <h3 class="opportunity-title">Hidden Growth Potential</​h3>
            <p class="opportunity-description">Low market share but high conversion rate</​p>
            <div class="opportunity-metrics">
                <div class="metric-row">
                    <span>Impressions:</​span>
                    <strong>15,420</​strong>
                </​div>
                <div class="metric-row">
                    <span>CVR:</​span>
                    <strong class="positive">0.56%</​strong>
                </​div>
            </​div>
            <button class="btn-outline">View Details</​button>
        </​div>
        <!-- More opportunities -->
    </​div>
</​div>

Opportunity Styling:

.opportunity-card {
    background: #ffffff;
    border: 1px solid #e5e7eb;
    border-radius: 12px;
    padding: 24px;
}

.impact-badge {
    padding: 4px 12px;
    border-radius: 16px;
    font-size: 11px;
    font-weight: 700;
    text-transform: uppercase;
}

.impact-badge.high {
    background: #fee2e2;
    color: #991b1b;
}

.impact-badge.medium {
    background: #fef3c7;
    color: #92400e;
}

.impact-badge.low {
    background: #dbeafe;
    color: #1e40af;
}

Search & Filter Implementation

const searchInput = document.getElementById('search-input');
const tableBody = document.getElementById('table-body');
const resultsCount = document.getElementById('count');

searchInput.addEventListener('input', (e) => {
    const searchTerm = e.target.value.toLowerCase();
    const rows = tableBody.querySelectorAll('tr');

    let visibleCount = 0;
    rows.forEach(row => {
        const text = row.textContent.toLowerCase();
        if (text.includes(searchTerm)) {
            row.style.display = '';
            visibleCount++;
        } else {
            row.style.display = 'none';
        }
    });

    resultsCount.textContent = visibleCount;
});

Sortable Table Implementation

document.querySelectorAll('.sortable').forEach(header => {
    header.addEventListener('click', () => {
        const column = header.getAttribute('data-column');
        const rows = Array.from(tableBody.querySelectorAll('tr'));
        const isAscending = header.classList.contains('asc');

        rows.sort((a, b) => {
            const aVal = a.querySelector(`[data-column="${column}"]`).textContent;
            const bVal = b.querySelector(`[data-column="${column}"]`).textContent;

            // Numeric sorting
            if (!isNaN(aVal) && !isNaN(bVal)) {
                return isAscending ? aVal - bVal : bVal - aVal;
            }
            // Text sorting
            return isAscending ? aVal.localeCompare(bVal) : bVal.localeCompare(aVal);
        });

        tableBody.innerHTML = '';
        rows.forEach(row => tableBody.appendChild(row));

        document.querySelectorAll('.sortable').forEach(h => h.classList.remove('asc', 'desc'));
        header.classList.add(isAscending ? 'desc' : 'asc');
    });
});

File Naming Convention

[dashboard-name]-[client-name]-[date].html

Examples:
- performance-analysis-acme-corp-2025-10-19.html
- sales-dashboard-client-a-2025-10-19.html
- ppc-report-q4-2025-10-19.html

Quality Gates

Before delivering ANY client dashboard, verify:

MANDATORY Requirements:

  • Modern gradient header with pulsing glow animation
  • Footer with exact text: "Produced By Danny McMillan | A Seller Sessions Production | © 2025"
  • Responsive layout (mobile-friendly)
  • All tabs functional (if multi-tab)
  • Search and sort working in Explorer
  • Color-coded performance indicators
  • Modern n8n-inspired design (dark gradient background, purple/​blue accents)
  • 3 equal-width metric cards per row (grid-template-columns: repeat(3, 1fr))
  • NO emoticons anywhere in the dashboard
  • Glassmorphic cards with backdrop-filter blur

⚠️ OUTPUT FORMAT:

  • Must be standalone HTML file
  • Complete <!DOCTYPE html> with <head> and <body>
  • All CSS in <style> tag
  • All JavaScript in <script> tag
  • Opens directly in browser without build tools

Standard Quality:

  • Tab navigation (if >100 rows or funnel exists)
  • Metric cards with icons
  • Funnel visualization (if applicable)
  • Insights with recommendations
  • Search/​filter functional
  • Sortable table headers
  • Professional badges (green/​amber/​red)
  • Clean design throughout

Example Output Structure

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Performance Dashboard</​title>
    <link href="https://fonts.googleapis.com/​css2?family=Inter:wght@400;500;600;700;800;900&display=swap" rel="stylesheet">
    <style>
        /​* Modern n8n-inspired design system CSS */
        body {
            font-family: 'Inter', sans-serif;
            background: linear-gradient(135deg, #0f172a 0%, #1e1b4b 50%, #1e293b 100%);
            color: #ffffff;
            padding: 40px;
            margin: 0;
            min-height: 100vh;
        }

        .container {
            max-width: 1400px;
            margin: 0 auto;
        }
        /​* ... rest of modern CSS ... */
    </​style>
</​head>
<body>
    <div class="container">
        <!-- Modern Gradient Header -->
        <header class="modern-header">
            <div class="header-background"></​div>
            <div class="header-content">
                <h1 class="dashboard-title">Performance Analysis</​h1>
                <p class="dashboard-subtitle">30-Day Report | Aug 11 - Sep 9, 2025</​p>
                <p class="dashboard-metadata">Generated: Oct 19, 2025 | 1,344 records analyzed</​p>
            </​div>
        </​header>

        <!-- Modern Tab Navigation -->
        <div class="tab-nav">
            <button class="tab active">OVERVIEW</​button>
            <button class="tab">EXPLORER</​button>
            <button class="tab">FUNNEL</​button>
            <button class="tab">INSIGHTS</​button>
        </​div>

        <!-- Tab Content -->
        <div id="overview-tab" class="tab-content active">
            <!-- 3-column metric grid -->
            <div class="metrics-grid">
                <!-- Cards here -->
            </​div>
        </​div>

        <div id="explorer-tab" class="tab-content hidden">
            <!-- Explorer content -->
        </​div>

        <div id="funnel-tab" class="tab-content hidden">
            <!-- Funnel content -->
        </​div>

        <div id="insights-tab" class="tab-content hidden">
            <!-- Insights content -->
        </​div>

        <!-- Modern Footer -->
        <footer class="modern-footer">
            <div class="footer-content">
                <p class="footer-credits">Produced By Danny McMillan | A Seller Sessions Production | &copy; 2025</​p>
            </​div>
        </​footer>
    </​div>

    <script>
        /​* JavaScript for tabs, search, sort */
    </​script>
</​body>
</​html>

Success Criteria

This skill works correctly when:

  • User uploads file → Complete tabbed dashboard generated automatically
  • Modern n8n-inspired design with dark gradient background
  • Purple/​blue gradient accents throughout
  • 3 equal-width metric cards per row (no emoticons)
  • Glassmorphic cards with backdrop-filter blur effects
  • Footer displays: "Produced By Danny McMillan | A Seller Sessions Production | © 2025"
  • Funnel visualization with drop-off analysis
  • Insights categorized by impact
  • Search and sort fully functional
  • Mobile-responsive layout (3 cols → 2 cols → 1 col)
  • Zero questions asked before generation
  • Smooth animations and hover effects
  • Professional and cutting-edge appearance

Integration with Other Skills

Works with:

  • mcp-response-optimization: Ensures efficient data processing without token bloat
  • curv-design-system: Alternative for internal Danny McMillan branded dashboards
  • dashboard-auto-generation: CURV-branded version for internal use

When to use this skill vs dashboard-auto-generation:

  • Use dashboard-auto-generation-client: For external clients, professional presentations, shareable reports
  • Use dashboard-auto-generation: For internal CURV Tools, Seller Sessions content, Danny McMillan branded work

More skills from majiayu000

xiaohongshu logo
majiayu000/claude-arsenal

xiaohongshu

xiaohongshu

286 148
View
agent-task-conductor logo
majiayu000/claude-skill-registry

agent-task-conductor

Conduct multi-agent task orchestration and workflow coordination.

663 1
View
conductor-setup logo
majiayu000/claude-skill-registry

conductor-setup

Initialize project with Conductor artifacts (product definition,

663 1
View
animation-designer logo
majiayu000/claude-skill-registry

animation-designer

Expert in web animations, transitions, and motion design using Framer Motion and CSS

663 1
View
diagramming logo
majiayu000/claude-skill-registry

diagramming

Creates Mermaid and ASCII diagrams for flowcharts, architecture, ERDs, state machines, mindmaps, and more. Use when user mentions diagram, flowchart, mermaid, ASCII diagram, text diagram, terminal diagram, visualize, C4, mindmap, architecture diagram, sequence diagram, ERD, or needs visual docume...

663 1
View
h3-pg logo
majiayu000/claude-skill-registry-data

h3-pg

PostgreSQL bindings for H3 hexagonal grid system. Use when working with H3 cells in Postgres, including spatial indexing, geometry/geography integration, and raster analysis.

23 1
View
conductor-development logo
majiayu000/claude-skill-registry

conductor-development

Context-Driven Development skill for projects using Conductor. Use this skill when you detect a `conductor/` directory in the project, when working on tasks defined in a `plan.md` file, or when the user asks about tracks, specs, or plans. Automatically applies TDD workflow, tracks task completion...

663 1
View
conductor-status logo
majiayu000/claude-skill-registry

conductor-status

Display project status, active tracks, and next actions

663 1
View
dockerization logo
majiayu000/claude-skill-registry

dockerization

Official Stakpak application containerization standard operating procedure, a step-by-step guidline to properly dockerize applications. This is a rule book curated by the Stakpak Team.

663 1
View

Popular AI tools

Kaiber logo
Video

Kaiber

Generate, edit, and beat-sync AI video with leading models in one workspace.

Paid
View
Vimcal logo
Productivity

Vimcal

The world's fastest calendar for remote work

Free
View

Transform Your Design with AI Designer by ImgCreator.ai

Freemium
View
Akool AI logo
Content & writing

Akool AI

Revolutionizing Video Production with AI-Powered Creativity

Paid
View

Extend an image past the frame and let AI fill the new aspect ratio.

Freemium
View
StarByFace logo
Security

StarByFace

Discover your celebrity doppelgänger with StarByFace!

Free
View
C

ChainClarity explains 700+ crypto whitepapers in plain English, with layered summaries, comparisons, research tools, alerts, and a $4.99 Pro plan.

Freemium
View
Opus Clip logo
Coding & apps

Opus Clip

Opus.ai: Revolutionize Your Web Experience

Free
View