feat(18-01): chi v5 dependency, go:embed static assets, HTML layout and overview templates

- Add chi v5.2.5 to go.mod
- Vendor htmx v2.0.4 minified JS in pkg/web/static/
- Create go:embed directives for static/ and templates/
- Create layout.html with nav bar and Tailwind CDN
- Create overview.html with stat cards and findings table
This commit is contained in:
salvacybersec
2026-04-06 18:01:37 +03:00
parent 17c17944aa
commit dd2c8c5586
7 changed files with 177 additions and 4 deletions

View File

@@ -0,0 +1,77 @@
{{template "layout" .}}
{{define "content"}}
<!-- Stat cards -->
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-6 mb-8">
<div class="stat-card bg-white border border-gray-200">
<p class="text-sm font-medium text-gray-500">Total Keys Found</p>
<p class="mt-2 text-3xl font-bold text-gray-900">{{.TotalKeys}}</p>
</div>
<div class="stat-card bg-white border border-gray-200">
<p class="text-sm font-medium text-gray-500">Providers Loaded</p>
<p class="mt-2 text-3xl font-bold text-gray-900">{{.TotalProviders}}</p>
</div>
<div class="stat-card bg-white border border-gray-200">
<p class="text-sm font-medium text-gray-500">Recon Sources</p>
<p class="mt-2 text-3xl font-bold text-gray-900">{{.ReconSources}}</p>
</div>
<div class="stat-card bg-white border border-gray-200">
<p class="text-sm font-medium text-gray-500">Last Scan</p>
<p class="mt-2 text-xl font-bold text-gray-900">{{if .LastScan}}{{.LastScan}}{{else}}Never{{end}}</p>
</div>
</div>
<!-- Recent findings -->
<div class="bg-white shadow-sm rounded-lg border border-gray-200">
<div class="px-6 py-4 border-b border-gray-200">
<h2 class="text-lg font-semibold text-gray-900">Recent Findings</h2>
</div>
{{if .RecentFindings}}
<div class="overflow-x-auto">
<table class="findings-table">
<thead>
<tr>
<th>Provider</th>
<th>Masked Key</th>
<th>Source</th>
<th>Confidence</th>
<th>Verified</th>
<th>Date</th>
</tr>
</thead>
<tbody>
{{range .RecentFindings}}
<tr>
<td class="font-medium">{{.ProviderName}}</td>
<td class="font-mono text-sm text-gray-600">{{.KeyMasked}}</td>
<td class="text-sm text-gray-600">{{.SourcePath}}</td>
<td>
{{if eq .Confidence "high"}}
<span class="inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-green-100 text-green-800">High</span>
{{else if eq .Confidence "medium"}}
<span class="inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-yellow-100 text-yellow-800">Medium</span>
{{else}}
<span class="inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-gray-100 text-gray-800">{{.Confidence}}</span>
{{end}}
</td>
<td>
{{if .Verified}}
<span class="text-green-600 font-medium">Live</span>
{{else}}
<span class="text-gray-400">-</span>
{{end}}
</td>
<td class="text-sm text-gray-500">{{.CreatedAt.Format "2006-01-02 15:04"}}</td>
</tr>
{{end}}
</tbody>
</table>
</div>
{{else}}
<div class="px-6 py-12 text-center text-gray-500">
<p class="text-lg">No findings yet</p>
<p class="mt-1 text-sm">Run a scan to detect API keys</p>
</div>
{{end}}
</div>
{{end}}