This commit is contained in:
samantha42
2026-03-20 22:30:45 +01:00
parent 81203af783
commit 90c70be734
4 changed files with 5 additions and 966 deletions
+3 -8
View File
@@ -35,10 +35,6 @@ func Finance(w http.ResponseWriter, r *http.Request) { http.ServeFile(w, r, "./s
func Cinema(w http.ResponseWriter, r *http.Request) { http.ServeFile(w, r, "./static/cinema.html") } func Cinema(w http.ResponseWriter, r *http.Request) { http.ServeFile(w, r, "./static/cinema.html") }
func Cyber(w http.ResponseWriter, r *http.Request) { http.ServeFile(w, r, "./static/cyber.html") } func Cyber(w http.ResponseWriter, r *http.Request) { http.ServeFile(w, r, "./static/cyber.html") }
func About(w http.ResponseWriter, r *http.Request) { http.ServeFile(w, r, "./static/about.html") } func About(w http.ResponseWriter, r *http.Request) { http.ServeFile(w, r, "./static/about.html") }
func GitPage(w http.ResponseWriter, r *http.Request) { http.ServeFile(w, r, "./static/gitpage.html") }
func GitPageTicTacToe(w http.ResponseWriter, r *http.Request) {
http.ServeFile(w, r, "./static/gitpages/TicTacToe.html")
}
func Styles(w http.ResponseWriter, r *http.Request) { http.ServeFile(w, r, "./static/styles.css") } func Styles(w http.ResponseWriter, r *http.Request) { http.ServeFile(w, r, "./static/styles.css") }
@@ -110,10 +106,9 @@ func main() {
http.HandleFunc("/finance", Finance) http.HandleFunc("/finance", Finance)
http.HandleFunc("/cinema", Cinema) http.HandleFunc("/cinema", Cinema)
http.HandleFunc("/cyber", Cyber) http.HandleFunc("/cyber", Cyber)
//http.HandleFunc("/gitpage", GitPage) http.HandleFunc("/git", func(w http.ResponseWriter, r *http.Request) {
//http.HandleFunc("/gitpage/TicTacToe", GitPageTicTacToe) http.Redirect(w, r, "https://git.samantha42.xyz", http.StatusFound)
//http.HandleFunc("/trades", TradesHandler) })
//http.HandleFunc("/api/prices", PricesHandler)
fmt.Printf("running on http://localhost:%s/\n", *port) fmt.Printf("running on http://localhost:%s/\n", *port)
if err := http.ListenAndServe(":"+*port, nil); err != nil { if err := http.ListenAndServe(":"+*port, nil); err != nil {
BIN
View File
Binary file not shown.
+2 -5
View File
@@ -15,18 +15,15 @@
<body> <body>
<div class="container"> <div class="container">
<!-- PAGE NAV — place right before <header> --> <!-- PAGE NAV — place right before <header> -->
<nav class="page-nav"> <nav class="page-nav">
<a href="#about" class="active"><span>about</span></a> <a href="#about" class="active"><span>about</span></a>
<a href="/git" target="_blank"><span>git</span></a>
<br /><span><p class="section-label">//Opinion</p></span> <br /><span><p class="section-label">//Opinion</p></span>
<a href="/cinema"><span>Cinema</span></a> <a href="/cinema"><span>Cinema</span></a>
<a href="/finance"><span>Finance</span></a> <a href="/finance"><span>Finance</span></a>
<a href="/cyber"><span>cyber</span></a> <a href="/cyber"><span>cyber</span></a>
<a href="/infra"><span>infra</span></a> <a href="/infra"><span>infra</span></a>
</nav> </nav>
<header> <header>
<p class="tag">// about me</p> <p class="tag">// about me</p>
<h1>Samantha<br /><span>Vero Friis</span></h1> <h1>Samantha<br /><span>Vero Friis</span></h1>
-953
View File
@@ -1,953 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>username / project-name</title>
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link href="https://fonts.googleapis.com/css2?family=DM+Mono:ital,wght@0,300;0,400;0,500;1,400&family=Syne:wght@400;700;800&display=swap" rel="stylesheet" />
<style>
/* ─── Variables ─── */
:root {
--bg: #252525;
--surface: #2b2b2b;
--surface2: #313131;
--border: #3a3a3a;
--border-focus: #4e4e4e;
--text: #e8e8e0;
--muted: #777770;
--accent: #B88FE0;
--accent2: #6247AA;
--green: #6fcf8a;
--red: #e07070;
--yellow: #e0c870;
}
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
html { scroll-behavior: smooth; }
body {
background: var(--bg);
color: var(--text);
font-family: 'DM Mono', monospace;
min-height: 100vh;
overflow-x: hidden;
}
/* Grain overlay */
body::before {
content: '';
position: fixed;
inset: 0;
background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noise)' opacity='0.04'/%3E%3C/svg%3E");
pointer-events: none;
z-index: 999;
opacity: 0.35;
}
.container { max-width: 980px; margin: 0 auto; padding: 0 2rem; }
/* ─── Top nav ─── */
.topbar {
border-bottom: 1px solid var(--border);
padding: 1rem 0;
animation: fadeUp 0.4s ease both;
}
.topbar-inner {
display: flex;
align-items: center;
gap: 1.5rem;
}
.site-logo {
font-family: 'Syne', sans-serif;
font-weight: 800;
font-size: 1rem;
color: var(--text);
text-decoration: none;
letter-spacing: -0.02em;
}
.site-logo span { color: var(--accent); }
.breadcrumb {
display: flex;
align-items: center;
gap: 0.4rem;
font-size: 0.78rem;
color: var(--muted);
}
.breadcrumb a {
color: var(--accent);
text-decoration: none;
transition: opacity 0.2s;
}
.breadcrumb a:hover { opacity: 0.7; }
.breadcrumb .sep { color: var(--border-focus); }
.topbar-right { margin-left: auto; display: flex; align-items: center; gap: 1rem; }
.nav-link {
font-size: 0.68rem;
letter-spacing: 0.1em;
text-transform: uppercase;
color: var(--muted);
text-decoration: none;
transition: color 0.2s;
}
.nav-link:hover { color: var(--text); }
/* ─── Repo header ─── */
.repo-header {
padding: 2.5rem 0 2rem;
border-bottom: 1px solid var(--border);
animation: fadeUp 0.5s 0.05s ease both;
}
.repo-title-row {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 2rem;
flex-wrap: wrap;
}
.repo-title-group { flex: 1; min-width: 0; }
.repo-tag {
font-size: 0.65rem;
letter-spacing: 0.2em;
text-transform: uppercase;
color: var(--accent);
margin-bottom: 0.6rem;
}
.repo-name {
font-family: 'Syne', sans-serif;
font-size: clamp(1.6rem, 3vw, 2.4rem);
font-weight: 800;
line-height: 1.05;
letter-spacing: -0.02em;
margin-bottom: 0.5rem;
}
.repo-name span { color: var(--accent); }
.repo-desc-text {
font-size: 0.8rem;
color: var(--muted);
line-height: 1.6;
max-width: 540px;
margin-bottom: 1rem;
}
.repo-topics {
display: flex;
flex-wrap: wrap;
gap: 0.4rem;
margin-bottom: 1rem;
}
.topic {
font-size: 0.62rem;
padding: 0.2rem 0.6rem;
border: 1px solid rgba(184, 143, 224, 0.2);
color: var(--accent);
letter-spacing: 0.08em;
background: rgba(184, 143, 224, 0.05);
transition: background 0.2s;
}
.topic:hover { background: rgba(184, 143, 224, 0.12); cursor: default; }
/* stats row */
.repo-stats {
display: flex;
gap: 1.5rem;
flex-wrap: wrap;
}
.stat-item {
display: flex;
align-items: center;
gap: 0.4rem;
font-size: 0.72rem;
color: var(--muted);
}
.stat-item .stat-icon { font-size: 0.85rem; opacity: 0.6; }
.stat-item strong { color: var(--text); font-weight: 500; }
/* action buttons */
.repo-actions {
display: flex;
flex-direction: column;
gap: 0.5rem;
flex-shrink: 0;
}
.btn-primary {
background: var(--accent2);
color: var(--text);
font-family: 'DM Mono', monospace;
font-size: 0.72rem;
letter-spacing: 0.1em;
text-transform: uppercase;
padding: 0.6rem 1.2rem;
border: none;
cursor: pointer;
transition: background 0.2s;
text-decoration: none;
display: inline-flex;
align-items: center;
gap: 0.5rem;
white-space: nowrap;
}
.btn-primary:hover { background: var(--accent); }
.btn-ghost {
background: transparent;
color: var(--muted);
font-family: 'DM Mono', monospace;
font-size: 0.72rem;
letter-spacing: 0.1em;
text-transform: uppercase;
padding: 0.6rem 1.2rem;
border: 1px solid var(--border);
cursor: pointer;
transition: border-color 0.2s, color 0.2s;
text-decoration: none;
display: inline-flex;
align-items: center;
gap: 0.5rem;
white-space: nowrap;
}
.btn-ghost:hover { border-color: var(--border-focus); color: var(--text); }
/* ─── Tab bar ─── */
.tabs {
border-bottom: 1px solid var(--border);
display: flex;
gap: 0;
animation: fadeUp 0.5s 0.1s ease both;
overflow-x: auto;
}
.tab {
font-size: 0.7rem;
letter-spacing: 0.08em;
text-transform: uppercase;
color: var(--muted);
padding: 1rem 1.2rem;
cursor: pointer;
border-bottom: 2px solid transparent;
transition: color 0.2s, border-color 0.2s;
white-space: nowrap;
text-decoration: none;
display: inline-flex;
align-items: center;
gap: 0.5rem;
}
.tab:hover { color: var(--text); }
.tab.active { color: var(--accent); border-bottom-color: var(--accent); }
.tab-count {
font-size: 0.6rem;
padding: 0.1rem 0.4rem;
border: 1px solid var(--border);
color: var(--muted);
}
/* ─── Main layout ─── */
.repo-body {
display: grid;
grid-template-columns: 1fr 260px;
gap: 2rem;
padding: 2rem 0 4rem;
animation: fadeUp 0.5s 0.15s ease both;
}
/* ─── File browser ─── */
.file-browser {
border: 1px solid var(--border);
}
.file-browser-bar {
display: flex;
align-items: center;
justify-content: space-between;
padding: 0.8rem 1rem;
background: var(--surface);
border-bottom: 1px solid var(--border);
gap: 1rem;
}
.branch-selector {
display: flex;
align-items: center;
gap: 0.5rem;
font-size: 0.72rem;
color: var(--text);
background: var(--bg);
border: 1px solid var(--border);
padding: 0.35rem 0.7rem;
cursor: pointer;
transition: border-color 0.2s;
}
.branch-selector:hover { border-color: var(--border-focus); }
.branch-name { color: var(--accent); }
.file-meta {
font-size: 0.68rem;
color: var(--muted);
display: flex;
align-items: center;
gap: 0.8rem;
flex: 1;
}
.latest-commit {
font-size: 0.68rem;
color: var(--muted);
}
.latest-commit span { color: var(--text); }
.commit-hash {
font-size: 0.65rem;
color: var(--accent2);
border: 1px solid rgba(98, 71, 170, 0.3);
padding: 0.1rem 0.4rem;
cursor: pointer;
transition: background 0.2s;
}
.commit-hash:hover { background: rgba(98, 71, 170, 0.1); }
/* file rows */
.file-row {
display: grid;
grid-template-columns: 1.5rem 1fr 1fr auto;
align-items: center;
gap: 0.5rem;
padding: 0.65rem 1rem;
border-bottom: 1px solid var(--border);
transition: background 0.15s;
cursor: pointer;
text-decoration: none;
color: inherit;
}
.file-row:last-child { border-bottom: none; }
.file-row:hover { background: var(--surface2); }
.file-icon { font-size: 0.85rem; text-align: center; }
.file-name {
font-size: 0.78rem;
color: var(--text);
transition: color 0.15s;
}
.file-row:hover .file-name { color: var(--accent); }
.file-row.dir .file-name { color: var(--accent2); }
.file-row.dir:hover .file-name { color: var(--accent); }
.file-commit {
font-size: 0.65rem;
color: var(--muted);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.file-age {
font-size: 0.62rem;
color: var(--muted);
white-space: nowrap;
text-align: right;
}
/* README */
.readme {
border: 1px solid var(--border);
margin-top: 1rem;
}
.readme-bar {
display: flex;
align-items: center;
gap: 0.6rem;
padding: 0.8rem 1rem;
background: var(--surface);
border-bottom: 1px solid var(--border);
font-size: 0.7rem;
letter-spacing: 0.1em;
text-transform: uppercase;
color: var(--muted);
}
.readme-bar-icon { color: var(--accent); }
.readme-content {
padding: 2rem;
font-size: 0.82rem;
line-height: 1.9;
color: #c8c8c0;
}
.readme-content h1 {
font-family: 'Syne', sans-serif;
font-size: 1.4rem;
font-weight: 800;
color: var(--text);
margin-bottom: 0.8rem;
letter-spacing: -0.02em;
}
.readme-content h2 {
font-family: 'Syne', sans-serif;
font-size: 1rem;
font-weight: 700;
color: var(--accent);
margin: 2rem 0 0.8rem;
letter-spacing: -0.01em;
}
.readme-content h2::before {
content: '// ';
color: var(--accent2);
font-family: 'DM Mono', monospace;
font-weight: 300;
}
.readme-content p { margin-bottom: 1rem; }
.readme-content code {
font-family: 'DM Mono', monospace;
font-size: 0.76rem;
color: var(--accent);
background: rgba(184, 143, 224, 0.08);
padding: 0.1rem 0.4rem;
border: 1px solid rgba(184, 143, 224, 0.15);
}
.readme-content pre {
background: var(--surface);
border: 1px solid var(--border);
padding: 1.2rem 1.4rem;
margin: 1rem 0 1.4rem;
overflow-x: auto;
}
.readme-content pre code {
background: none;
border: none;
padding: 0;
font-size: 0.76rem;
color: #c8c8c0;
}
.readme-content ul {
list-style: none;
padding: 0;
margin: 0 0 1rem;
}
.readme-content ul li {
padding-left: 1.2rem;
position: relative;
margin-bottom: 0.4rem;
font-size: 0.8rem;
}
.readme-content ul li::before {
content: '▸';
position: absolute;
left: 0;
color: var(--accent2);
font-size: 0.7rem;
}
.readme-badge {
display: inline-flex;
align-items: center;
gap: 0.3rem;
font-size: 0.62rem;
padding: 0.2rem 0.6rem;
border: 1px solid var(--border);
color: var(--muted);
margin-right: 0.4rem;
margin-bottom: 0.8rem;
}
.readme-badge.green { color: var(--green); border-color: rgba(111, 207, 138, 0.3); }
.readme-badge.purple { color: var(--accent); border-color: rgba(184, 143, 224, 0.3); }
.readme-badge.yellow { color: var(--yellow); border-color: rgba(224, 200, 112, 0.3); }
/* ─── Sidebar ─── */
.sidebar { display: flex; flex-direction: column; gap: 1.5rem; }
.sidebar-section { }
.sidebar-title {
font-size: 0.62rem;
letter-spacing: 0.16em;
text-transform: uppercase;
color: var(--muted);
margin-bottom: 0.8rem;
padding-bottom: 0.6rem;
border-bottom: 1px solid var(--border);
}
/* about */
.about-desc {
font-size: 0.75rem;
color: var(--muted);
line-height: 1.7;
margin-bottom: 1rem;
}
.about-link {
display: flex;
align-items: center;
gap: 0.5rem;
font-size: 0.72rem;
color: var(--accent);
text-decoration: none;
margin-bottom: 0.5rem;
transition: opacity 0.2s;
}
.about-link:hover { opacity: 0.7; }
/* languages */
.lang-bar {
height: 4px;
display: flex;
border-radius: 2px;
overflow: hidden;
margin-bottom: 0.8rem;
}
.lang-seg { height: 100%; transition: opacity 0.2s; }
.lang-seg:hover { opacity: 0.7; cursor: default; }
.lang-list { display: flex; flex-direction: column; gap: 0.5rem; }
.lang-item {
display: flex;
align-items: center;
justify-content: space-between;
font-size: 0.7rem;
}
.lang-label { display: flex; align-items: center; gap: 0.5rem; color: var(--muted); }
.lang-dot { width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0; }
.lang-pct { color: var(--muted); }
/* activity */
.activity-graph {
display: grid;
grid-template-columns: repeat(26, 1fr);
gap: 2px;
}
.activity-col { display: flex; flex-direction: column; gap: 2px; }
.activity-cell {
width: 100%;
aspect-ratio: 1;
border-radius: 1px;
background: var(--surface2);
transition: background 0.2s;
}
.activity-cell:hover { opacity: 0.7; cursor: default; }
.activity-cell.l1 { background: rgba(98, 71, 170, 0.25); }
.activity-cell.l2 { background: rgba(98, 71, 170, 0.5); }
.activity-cell.l3 { background: rgba(184, 143, 224, 0.5); }
.activity-cell.l4 { background: var(--accent); }
.activity-label {
font-size: 0.6rem;
color: var(--muted);
margin-top: 0.5rem;
text-align: right;
}
/* contributors */
.contributors { display: flex; flex-direction: column; gap: 0.6rem; }
.contributor {
display: flex;
align-items: center;
gap: 0.7rem;
text-decoration: none;
transition: opacity 0.2s;
}
.contributor:hover { opacity: 0.7; }
.avatar {
width: 28px;
height: 28px;
border-radius: 50%;
background: var(--surface2);
border: 1px solid var(--border);
display: flex;
align-items: center;
justify-content: center;
font-size: 0.7rem;
font-family: 'Syne', sans-serif;
font-weight: 700;
color: var(--accent);
flex-shrink: 0;
}
.contributor-info { flex: 1; }
.contributor-name { font-size: 0.73rem; color: var(--text); }
.contributor-commits { font-size: 0.62rem; color: var(--muted); }
/* releases */
.release-item {
display: flex;
align-items: flex-start;
gap: 0.8rem;
padding-bottom: 0.8rem;
border-bottom: 1px solid var(--border);
margin-bottom: 0.8rem;
}
.release-item:last-child { border-bottom: none; margin-bottom: 0; padding-bottom: 0; }
.release-tag-label {
font-size: 0.62rem;
padding: 0.2rem 0.5rem;
background: rgba(111, 207, 138, 0.1);
border: 1px solid rgba(111, 207, 138, 0.3);
color: var(--green);
white-space: nowrap;
flex-shrink: 0;
}
.release-info {}
.release-name { font-size: 0.75rem; color: var(--text); margin-bottom: 0.15rem; }
.release-date { font-size: 0.62rem; color: var(--muted); }
/* ─── Footer ─── */
footer {
padding: 2rem 0 2.5rem;
border-top: 1px solid var(--border);
display: flex;
flex-direction: column;
align-items: center;
gap: 0.5rem;
text-align: center;
animation: fadeUp 0.6s 0.4s ease both;
}
.footer-copy { font-size: 0.65rem; color: var(--muted); letter-spacing: 0.05em; }
footer a { color: var(--accent); text-decoration: none; font-size: 0.75rem; transition: opacity 0.2s; }
footer a:hover { opacity: 0.7; }
/* ─── Animations ─── */
@keyframes fadeUp {
from { opacity: 0; transform: translateY(12px); }
to { opacity: 1; transform: translateY(0); }
}
/* ─── Responsive ─── */
@media (max-width: 768px) {
.repo-body { grid-template-columns: 1fr; }
.sidebar { order: -1; }
.repo-actions { flex-direction: row; flex-wrap: wrap; }
.file-row { grid-template-columns: 1.5rem 1fr auto; }
.file-commit { display: none; }
}
@media (max-width: 560px) {
.repo-title-row { flex-direction: column; }
.tabs { gap: 0; }
.tab { padding: 0.8rem 0.8rem; font-size: 0.65rem; }
}
</style>
</head>
<body>
<!-- Top nav -->
<nav class="topbar">
<div class="container">
<div class="topbar-inner">
<a href="/gitpage" class="site-logo">Git</a>
<div class="breadcrumb">
<a href="#">samantha</a>
<span class="sep">/</span>
<a href="#" style="font-weight:500;">TicTacToe</a>
</div>
<div class="topbar-right">
<a href="#" class="nav-link">Projects</a>
<a href="#" class="nav-link">About</a>
</div>
</div>
</div>
</nav>
<!-- Repo header -->
<div class="repo-header">
<div class="container">
<div class="repo-title-row">
<div class="repo-title-group">
<div class="repo-tag">// public repository</div>
<div class="repo-name">project-<span>name</span></div>
<div class="repo-desc-text">A fast, minimal toolkit for processing and visualizing time-series data. Built for clarity and performance with zero dependencies.</div>
<div class="repo-topics">
<span class="topic">typescript</span>
<span class="topic">data-viz</span>
<span class="topic">time-series</span>
<span class="topic">zero-deps</span>
<span class="topic">cli</span>
</div>
<div class="repo-stats">
<div class="stat-item">
<span class="stat-icon"></span>
<strong>248</strong> stars
</div>
<div class="stat-item">
<span class="stat-icon"></span>
<strong>34</strong> forks
</div>
<div class="stat-item">
<span class="stat-icon"></span>
<strong>12</strong> watching
</div>
<div class="stat-item">
<span class="stat-icon"></span>
MIT License
</div>
</div>
</div>
<div class="repo-actions">
<a href="#" class="btn-primary">⬇ Clone</a>
<a href="#" class="btn-ghost">☆ Star</a>
<a href="#" class="btn-ghost">⑂ Fork</a>
</div>
</div>
</div>
</div>
<!-- Tabs -->
<div class="tabs">
<div class="container" style="display:flex;">
<a href="#" class="tab active">
◫ Code
</a>
<a href="#" class="tab">
◎ Issues <span class="tab-count">7</span>
</a>
<a href="#" class="tab">
⇄ Pull Requests <span class="tab-count">2</span>
</a>
<a href="#" class="tab">
◷ Actions
</a>
<a href="#" class="tab">
◈ Releases <span class="tab-count">4</span>
</a>
</div>
</div>
<!-- Main body -->
<main>
<div class="container">
<div class="repo-body">
<!-- Left: file browser + readme -->
<div>
<!-- File browser -->
<div class="file-browser">
<div class="file-browser-bar">
<div class="branch-selector">
<span class="branch-name">main</span>
</div>
<div class="file-meta">
<span class="latest-commit"><span>fix: handle edge case in parser</span></span>
<span class="commit-hash">a3f92d1</span>
</div>
<div style="font-size:0.65rem;color:var(--muted);white-space:nowrap;">3 days ago</div>
</div>
<!-- Dir rows -->
<a href="#" class="file-row dir">
<span class="file-icon">📁</span>
<span class="file-name">src</span>
<span class="file-commit">refactor: split core modules into separate files</span>
<span class="file-age">2 wks ago</span>
</a>
<a href="#" class="file-row dir">
<span class="file-icon">📁</span>
<span class="file-name">tests</span>
<span class="file-commit">test: add coverage for edge cases</span>
<span class="file-age">3 days ago</span>
</a>
<a href="#" class="file-row dir">
<span class="file-icon">📁</span>
<span class="file-name">docs</span>
<span class="file-commit">docs: update API reference</span>
<span class="file-age">1 wk ago</span>
</a>
<a href="#" class="file-row dir">
<span class="file-icon">📁</span>
<span class="file-name">examples</span>
<span class="file-commit">chore: add more usage examples</span>
<span class="file-age">5 days ago</span>
</a>
<a href="#" class="file-row">
<span class="file-icon">📄</span>
<span class="file-name">.gitignore</span>
<span class="file-commit">chore: initial setup</span>
<span class="file-age">3 mos ago</span>
</a>
<a href="#" class="file-row">
<span class="file-icon">📄</span>
<span class="file-name">LICENSE</span>
<span class="file-commit">chore: initial setup</span>
<span class="file-age">3 mos ago</span>
</a>
<a href="#" class="file-row">
<span class="file-icon">📄</span>
<span class="file-name">README.md</span>
<span class="file-commit">docs: improve getting started section</span>
<span class="file-age">1 wk ago</span>
</a>
<a href="#" class="file-row">
<span class="file-icon">📄</span>
<span class="file-name">package.json</span>
<span class="file-commit">chore: bump dependencies</span>
<span class="file-age">4 days ago</span>
</a>
<a href="#" class="file-row">
<span class="file-icon">📄</span>
<span class="file-name">tsconfig.json</span>
<span class="file-commit">chore: strict mode enabled</span>
<span class="file-age">2 mos ago</span>
</a>
</div>
<!-- README -->
<div class="readme">
<div class="readme-bar">
<span class="readme-bar-icon"></span>
README.md
</div>
<div class="readme-content">
<span class="readme-badge green">● build passing</span>
<span class="readme-badge purple">v2.1.0</span>
<span class="readme-badge yellow">MIT</span>
<h1>project-name</h1>
<p>A fast, minimal toolkit for processing and visualizing time-series data. Built with TypeScript, zero runtime dependencies, works in Node and the browser.</p>
<h2>Installation</h2>
<pre><code>npm install project-name
# or
yarn add project-name</code></pre>
<h2>Quick Start</h2>
<pre><code>import { TimeSeries, plot } from 'project-name';
const ts = new TimeSeries(data);
const smoothed = ts.rollingMean(7);
plot(smoothed, { width: 80, height: 20 });</code></pre>
<h2>Features</h2>
<ul>
<li>Zero runtime dependencies — ships as a single ESM/CJS bundle</li>
<li>Rolling statistics: mean, median, stddev, percentiles</li>
<li>Gap detection and interpolation for irregular time series</li>
<li>ASCII plot renderer for terminal output</li>
<li>Full TypeScript support with strict types</li>
<li>~8kb gzipped</li>
</ul>
<h2>Documentation</h2>
<p>Full API reference available in <code>docs/</code> or at the project website. Each method is documented with examples and edge-case notes.</p>
</div>
</div>
</div>
<!-- Sidebar -->
<aside class="sidebar">
<!-- About -->
<div class="sidebar-section">
<div class="sidebar-title">About</div>
<div class="about-desc">Fast, minimal time-series processing and visualization. Zero deps.</div>
<a href="#" class="about-link">🔗 project-name.dev</a>
<a href="#" class="about-link">📦 npm package</a>
</div>
<!-- Languages -->
<div class="sidebar-section">
<div class="sidebar-title">Languages</div>
<div class="lang-bar">
<div class="lang-seg" style="width:74%;background:var(--accent2);"></div>
<div class="lang-seg" style="width:16%;background:var(--accent);"></div>
<div class="lang-seg" style="width:7%;background:var(--yellow);"></div>
<div class="lang-seg" style="width:3%;background:var(--muted);"></div>
</div>
<div class="lang-list">
<div class="lang-item">
<div class="lang-label"><div class="lang-dot" style="background:var(--accent2);"></div>TypeScript</div>
<div class="lang-pct">74%</div>
</div>
<div class="lang-item">
<div class="lang-label"><div class="lang-dot" style="background:var(--accent);"></div>JavaScript</div>
<div class="lang-pct">16%</div>
</div>
<div class="lang-item">
<div class="lang-label"><div class="lang-dot" style="background:var(--yellow);"></div>Shell</div>
<div class="lang-pct">7%</div>
</div>
<div class="lang-item">
<div class="lang-label"><div class="lang-dot" style="background:var(--muted);"></div>Other</div>
<div class="lang-pct">3%</div>
</div>
</div>
</div>
<!-- Releases -->
<div class="sidebar-section">
<div class="sidebar-title">Releases</div>
<div class="release-item">
<span class="release-tag-label">v2.1.0</span>
<div class="release-info">
<div class="release-name">Rolling stats & fix</div>
<div class="release-date">5 days ago</div>
</div>
</div>
<div class="release-item">
<span class="release-tag-label">v2.0.0</span>
<div class="release-info">
<div class="release-name">Major rewrite</div>
<div class="release-date">3 wks ago</div>
</div>
</div>
<div class="release-item">
<span class="release-tag-label">v1.4.2</span>
<div class="release-info">
<div class="release-name">Bug fix release</div>
<div class="release-date">2 mos ago</div>
</div>
</div>
</div>
<!-- Activity -->
<div class="sidebar-section">
<div class="sidebar-title">Activity</div>
<div class="activity-graph" id="activityGraph"></div>
<div class="activity-label">Last 26 weeks</div>
</div>
<!-- Contributors -->
<div class="sidebar-section">
<div class="sidebar-title">Contributors</div>
<div class="contributors">
<a href="#" class="contributor">
<div class="avatar">U</div>
<div class="contributor-info">
<div class="contributor-name">username</div>
<div class="contributor-commits">142 commits</div>
</div>
</a>
<a href="#" class="contributor">
<div class="avatar">J</div>
<div class="contributor-info">
<div class="contributor-name">jsmith</div>
<div class="contributor-commits">28 commits</div>
</div>
</a>
<a href="#" class="contributor">
<div class="avatar">K</div>
<div class="contributor-info">
<div class="contributor-name">k_dev</div>
<div class="contributor-commits">11 commits</div>
</div>
</a>
</div>
</div>
</aside>
</div>
</div>
</main>
<footer>
<div class="container">
<a href="#">username</a>
<div class="footer-copy">© 2026 — built with intention</div>
</div>
</footer>
<script>
// Generate activity graph
const graph = document.getElementById('activityGraph');
const levels = [null, 'l1', 'l2', 'l3', 'l4'];
const pattern = [0,0,1,0,2,1,0,1,3,2,1,0,0,1,2,3,4,2,1,0,1,2,1,0,3,2];
for (let w = 0; w < 26; w++) {
const col = document.createElement('div');
col.className = 'activity-col';
for (let d = 0; d < 7; d++) {
const cell = document.createElement('div');
const activity = Math.random() < 0.4 ? Math.min(4, Math.floor(Math.random() * 3) + pattern[w]) : 0;
cell.className = 'activity-cell' + (activity > 0 ? ` l${activity}` : '');
col.appendChild(cell);
}
graph.appendChild(col);
}
// Tab switching
document.querySelectorAll('.tab').forEach(tab => {
tab.addEventListener('click', e => {
e.preventDefault();
document.querySelectorAll('.tab').forEach(t => t.classList.remove('active'));
tab.classList.add('active');
});
});
</script>
</body>
</html>