heyiam 0.2.28 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +45 -0
- package/dist/config.js +10 -1
- package/dist/db.js +1 -2
- package/dist/export.js +40 -25
- package/dist/format-utils.js +5 -0
- package/dist/index.js +168 -0
- package/dist/mount.js +300 -102
- package/dist/parsers/claude.js +2 -28
- package/dist/parsers/codex.js +2 -26
- package/dist/parsers/cursor.js +2 -26
- package/dist/parsers/duration.js +35 -0
- package/dist/parsers/gemini.js +2 -20
- package/dist/parsers/types.js +0 -1
- package/dist/public/assets/index-BZ65TU_Y.js +40 -0
- package/dist/public/assets/index-CqCaW2cb.css +1 -0
- package/dist/public/index.html +2 -2
- package/dist/redact.js +4 -104
- package/dist/render/build-render-data.js +9 -2
- package/dist/render/index.js +32 -5
- package/dist/render/liquid.js +147 -7
- package/dist/render/mock-data.js +303 -0
- package/dist/render/templates/aurora/portfolio.liquid +204 -0
- package/dist/render/templates/aurora/project.liquid +260 -0
- package/dist/render/templates/aurora/session.liquid +223 -0
- package/dist/render/templates/aurora/styles.css +1178 -0
- package/dist/render/templates/bauhaus/portfolio.liquid +179 -0
- package/dist/render/templates/bauhaus/project.liquid +300 -0
- package/dist/render/templates/bauhaus/session.liquid +333 -0
- package/dist/render/templates/bauhaus/styles.css +1641 -0
- package/dist/render/templates/blueprint/portfolio.liquid +167 -0
- package/dist/render/templates/blueprint/project.liquid +286 -0
- package/dist/render/templates/blueprint/session.liquid +248 -0
- package/dist/render/templates/blueprint/styles.css +1285 -0
- package/dist/render/templates/canvas/portfolio.liquid +215 -0
- package/dist/render/templates/canvas/project.liquid +235 -0
- package/dist/render/templates/canvas/session.liquid +223 -0
- package/dist/render/templates/canvas/styles.css +1436 -0
- package/dist/render/templates/carbon/portfolio.liquid +170 -0
- package/dist/render/templates/carbon/project.liquid +249 -0
- package/dist/render/templates/carbon/session.liquid +190 -0
- package/dist/render/templates/carbon/styles.css +1091 -0
- package/dist/render/templates/chalk/portfolio.liquid +199 -0
- package/dist/render/templates/chalk/project.liquid +245 -0
- package/dist/render/templates/chalk/session.liquid +215 -0
- package/dist/render/templates/chalk/styles.css +1157 -0
- package/dist/render/templates/circuit/portfolio.liquid +162 -0
- package/dist/render/templates/circuit/project.liquid +247 -0
- package/dist/render/templates/circuit/session.liquid +205 -0
- package/dist/render/templates/circuit/styles.css +1403 -0
- package/dist/render/templates/cosmos/portfolio.liquid +232 -0
- package/dist/render/templates/cosmos/project.liquid +327 -0
- package/dist/render/templates/cosmos/session.liquid +239 -0
- package/dist/render/templates/cosmos/styles.css +1151 -0
- package/dist/render/templates/daylight/portfolio.liquid +217 -0
- package/dist/render/templates/daylight/project.liquid +229 -0
- package/dist/render/templates/daylight/session.liquid +219 -0
- package/dist/render/templates/daylight/styles.css +1311 -0
- package/dist/render/templates/editorial/portfolio.liquid +126 -0
- package/dist/render/templates/editorial/project.liquid +202 -0
- package/dist/render/templates/editorial/session.liquid +171 -0
- package/dist/render/templates/editorial/styles.css +822 -0
- package/dist/render/templates/ember/portfolio.liquid +318 -0
- package/dist/render/templates/ember/project.liquid +232 -0
- package/dist/render/templates/ember/session.liquid +202 -0
- package/dist/render/templates/ember/styles.css +1283 -0
- package/dist/render/templates/glacier/portfolio.liquid +271 -0
- package/dist/render/templates/glacier/project.liquid +288 -0
- package/dist/render/templates/glacier/session.liquid +217 -0
- package/dist/render/templates/glacier/styles.css +1200 -0
- package/dist/render/templates/grid/portfolio.liquid +265 -0
- package/dist/render/templates/grid/project.liquid +306 -0
- package/dist/render/templates/grid/session.liquid +260 -0
- package/dist/render/templates/grid/styles.css +1441 -0
- package/dist/render/templates/kinetic/portfolio.liquid +170 -0
- package/dist/render/templates/kinetic/project.liquid +242 -0
- package/dist/render/templates/kinetic/session.liquid +228 -0
- package/dist/render/templates/kinetic/styles.css +944 -0
- package/dist/render/templates/meridian/portfolio.liquid +255 -0
- package/dist/render/templates/meridian/project.liquid +376 -0
- package/dist/render/templates/meridian/session.liquid +298 -0
- package/dist/render/templates/meridian/styles.css +1369 -0
- package/dist/render/templates/minimal/portfolio.liquid +71 -0
- package/dist/render/templates/minimal/project.liquid +154 -0
- package/dist/render/templates/minimal/session.liquid +140 -0
- package/dist/render/templates/minimal/styles.css +525 -0
- package/dist/render/templates/mono/portfolio.liquid +291 -0
- package/dist/render/templates/mono/project.liquid +275 -0
- package/dist/render/templates/mono/session.liquid +276 -0
- package/dist/render/templates/mono/styles.css +1016 -0
- package/dist/render/templates/neon/portfolio.liquid +217 -0
- package/dist/render/templates/neon/project.liquid +225 -0
- package/dist/render/templates/neon/session.liquid +195 -0
- package/dist/render/templates/neon/styles.css +1265 -0
- package/dist/render/templates/noir/portfolio.liquid +137 -0
- package/dist/render/templates/noir/project.liquid +220 -0
- package/dist/render/templates/noir/session.liquid +241 -0
- package/dist/render/templates/noir/styles.css +1223 -0
- package/dist/render/templates/obsidian/portfolio.liquid +257 -0
- package/dist/render/templates/obsidian/project.liquid +280 -0
- package/dist/render/templates/obsidian/session.liquid +241 -0
- package/dist/render/templates/obsidian/styles.css +1401 -0
- package/dist/render/templates/paper/portfolio.liquid +267 -0
- package/dist/render/templates/paper/project.liquid +235 -0
- package/dist/render/templates/paper/session.liquid +271 -0
- package/dist/render/templates/paper/styles.css +1509 -0
- package/dist/render/templates/parallax/portfolio.liquid +305 -0
- package/dist/render/templates/parallax/project.liquid +275 -0
- package/dist/render/templates/parallax/session.liquid +295 -0
- package/dist/render/templates/parallax/styles.css +1874 -0
- package/dist/render/templates/parchment/portfolio.liquid +290 -0
- package/dist/render/templates/parchment/project.liquid +289 -0
- package/dist/render/templates/parchment/session.liquid +346 -0
- package/dist/render/templates/parchment/styles.css +1397 -0
- package/dist/render/templates/partials/_beats.liquid +16 -0
- package/dist/render/templates/partials/_breadcrumb.liquid +9 -0
- package/dist/render/templates/partials/_footer.liquid +7 -0
- package/dist/render/templates/partials/_growth-chart.liquid +7 -0
- package/dist/render/templates/partials/_key-decisions.liquid +20 -0
- package/dist/render/templates/partials/_links.liquid +16 -0
- package/dist/render/templates/partials/_narrative.liquid +8 -0
- package/dist/render/templates/partials/_phases.liquid +20 -0
- package/dist/render/templates/partials/_portfolio-header.liquid +20 -0
- package/dist/render/templates/partials/_portfolio-projects.liquid +16 -0
- package/dist/render/templates/partials/_portfolio-stats.liquid +19 -0
- package/dist/render/templates/partials/_qa.liquid +13 -0
- package/dist/render/templates/partials/_screenshot.liquid +15 -0
- package/dist/render/templates/partials/_session-cards.liquid +30 -0
- package/dist/render/templates/partials/_session-header.liquid +39 -0
- package/dist/render/templates/partials/_session-sidebar.liquid +30 -0
- package/dist/render/templates/partials/_skills.liquid +12 -0
- package/dist/render/templates/partials/_source-breakdown.liquid +22 -0
- package/dist/render/templates/partials/_stats.liquid +38 -0
- package/dist/render/templates/partials/_work-timeline.liquid +7 -0
- package/dist/render/templates/project.liquid +7 -4
- package/dist/render/templates/radar/portfolio.liquid +233 -0
- package/dist/render/templates/radar/project.liquid +278 -0
- package/dist/render/templates/radar/session.liquid +300 -0
- package/dist/render/templates/radar/styles.css +1049 -0
- package/dist/render/templates/showcase/portfolio.liquid +231 -0
- package/dist/render/templates/showcase/project.liquid +237 -0
- package/dist/render/templates/showcase/session.liquid +210 -0
- package/dist/render/templates/showcase/styles.css +1279 -0
- package/dist/render/templates/signal/portfolio.liquid +227 -0
- package/dist/render/templates/signal/project.liquid +278 -0
- package/dist/render/templates/signal/session.liquid +282 -0
- package/dist/render/templates/signal/styles.css +1395 -0
- package/dist/render/templates/strata/portfolio.liquid +192 -0
- package/dist/render/templates/strata/project.liquid +282 -0
- package/dist/render/templates/strata/session.liquid +261 -0
- package/dist/render/templates/strata/styles.css +1350 -0
- package/dist/render/templates/styles.css +1190 -0
- package/dist/render/templates/terminal/portfolio.liquid +118 -0
- package/dist/render/templates/terminal/project.liquid +161 -0
- package/dist/render/templates/terminal/session.liquid +145 -0
- package/dist/render/templates/terminal/styles.css +492 -0
- package/dist/render/templates/verdant/portfolio.liquid +333 -0
- package/dist/render/templates/verdant/project.liquid +309 -0
- package/dist/render/templates/verdant/session.liquid +237 -0
- package/dist/render/templates/verdant/styles.css +1257 -0
- package/dist/render/templates/zen/portfolio.liquid +136 -0
- package/dist/render/templates/zen/project.liquid +187 -0
- package/dist/render/templates/zen/session.liquid +203 -0
- package/dist/render/templates/zen/styles.css +1207 -0
- package/dist/render/templates.js +90 -0
- package/dist/routes/context.js +15 -10
- package/dist/routes/enhance.js +17 -40
- package/dist/routes/export.js +14 -4
- package/dist/routes/preview.js +480 -108
- package/dist/routes/projects.js +11 -19
- package/dist/routes/publish.js +15 -17
- package/dist/routes/settings.js +94 -1
- package/dist/routes/sse.js +9 -0
- package/dist/server.js +8 -2
- package/dist/settings.js +17 -9
- package/package.json +2 -4
- package/dist/public/assets/index-B_d6DlEI.js +0 -21
- package/dist/public/assets/index-Dalqz2mC.css +0 -1
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
<div class="heyiam-portfolio daylight" data-render-version="2" data-template="daylight" data-username="{{ user.username }}">
|
|
2
|
+
|
|
3
|
+
{%- comment -%} Hero {%- endcomment -%}
|
|
4
|
+
{% if hasProfile %}
|
|
5
|
+
<section class="dl-hero dl-container dl-bounce" aria-label="Profile">
|
|
6
|
+
{% if user.photoUrl %}
|
|
7
|
+
<img src="{{ user.photoUrl }}" alt="{{ user.displayName }}" class="dl-hero-photo">
|
|
8
|
+
{% endif %}
|
|
9
|
+
{% if user.displayName != blank %}
|
|
10
|
+
<h1 class="dl-hero-name">{{ user.displayName }}</h1>
|
|
11
|
+
{% endif %}
|
|
12
|
+
{% if user.bio %}
|
|
13
|
+
<p class="dl-hero-bio">{{ user.bio }}</p>
|
|
14
|
+
{% endif %}
|
|
15
|
+
{% if user.location %}
|
|
16
|
+
<p class="dl-hero-location">{{ user.location }}</p>
|
|
17
|
+
{% endif %}
|
|
18
|
+
{% if user.email or user.linkedinUrl or user.githubUrl or user.twitterHandle or user.websiteUrl or user.resumeUrl %}
|
|
19
|
+
<ul class="dl-hero-links" aria-label="Contact and social links">
|
|
20
|
+
{% if user.email %}
|
|
21
|
+
<li><a href="mailto:{{ user.email }}"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><rect x="2" y="4" width="20" height="16" rx="2"/><path d="m2 4 10 8 10-8"/></svg>{{ user.email }}</a></li>
|
|
22
|
+
{% endif %}
|
|
23
|
+
{% if user.linkedinUrl %}
|
|
24
|
+
<li><a href="{{ user.linkedinUrl }}" target="_blank" rel="noopener"><svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M20.5 2h-17A1.5 1.5 0 002 3.5v17A1.5 1.5 0 003.5 22h17a1.5 1.5 0 001.5-1.5v-17A1.5 1.5 0 0020.5 2zM8 19H5v-9h3zM6.5 8.25A1.75 1.75 0 118.3 6.5a1.78 1.78 0 01-1.8 1.75zM19 19h-3v-4.74c0-1.42-.6-1.93-1.38-1.93A1.74 1.74 0 0013 14.19V19h-3v-9h2.9v1.3a3.11 3.11 0 012.7-1.4c1.55 0 3.36.86 3.36 3.66z"/></svg>LinkedIn</a></li>
|
|
25
|
+
{% endif %}
|
|
26
|
+
{% if user.githubUrl %}
|
|
27
|
+
<li><a href="{{ user.githubUrl }}" target="_blank" rel="noopener"><svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z"/></svg>GitHub</a></li>
|
|
28
|
+
{% endif %}
|
|
29
|
+
{% if user.twitterHandle %}
|
|
30
|
+
<li><a href="https://x.com/{{ user.twitterHandle }}" target="_blank" rel="noopener"><svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"/></svg>@{{ user.twitterHandle }}</a></li>
|
|
31
|
+
{% endif %}
|
|
32
|
+
{% if user.websiteUrl %}
|
|
33
|
+
<li><a href="{{ user.websiteUrl }}" target="_blank" rel="noopener"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><circle cx="12" cy="12" r="10"/><path d="M2 12h20M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"/></svg>{{ user.websiteUrl | stripProtocol }}</a></li>
|
|
34
|
+
{% endif %}
|
|
35
|
+
{% if user.resumeUrl %}
|
|
36
|
+
<li><a href="{{ user.resumeUrl }}"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/><line x1="12" y1="18" x2="12" y2="12"/><polyline points="9 15 12 18 15 15"/></svg>Resume (PDF)</a></li>
|
|
37
|
+
{% endif %}
|
|
38
|
+
</ul>
|
|
39
|
+
{% endif %}
|
|
40
|
+
</section>
|
|
41
|
+
{% endif %}
|
|
42
|
+
|
|
43
|
+
<div class="dl-container">
|
|
44
|
+
|
|
45
|
+
{%- comment -%} Stats {%- endcomment -%}
|
|
46
|
+
<section class="dl-stats dl-bounce dl-delay-1" aria-label="Portfolio statistics">
|
|
47
|
+
<div class="dl-stat-card">
|
|
48
|
+
<span class="dl-stat-number" data-target="{{ projects.size }}">0</span>
|
|
49
|
+
<span class="dl-stat-label">Projects</span>
|
|
50
|
+
</div>
|
|
51
|
+
<div class="dl-stat-card">
|
|
52
|
+
<span class="dl-stat-number" data-target="{{ totalSessions }}">0</span>
|
|
53
|
+
<span class="dl-stat-label">Sessions</span>
|
|
54
|
+
</div>
|
|
55
|
+
<div class="dl-stat-card">
|
|
56
|
+
<span class="dl-stat-number" data-target="{{ totalLoc }}" data-format="comma">0</span>
|
|
57
|
+
<span class="dl-stat-label">Lines Changed</span>
|
|
58
|
+
</div>
|
|
59
|
+
{% if efficiencyMultiplier %}
|
|
60
|
+
<div class="dl-stat-card">
|
|
61
|
+
<span class="dl-stat-number">{{ efficiencyMultiplier }}</span>
|
|
62
|
+
<span class="dl-stat-label">Leverage</span>
|
|
63
|
+
</div>
|
|
64
|
+
{% else %}
|
|
65
|
+
<div class="dl-stat-card">
|
|
66
|
+
<span class="dl-stat-number">{{ totalDurationMinutes | formatDuration }}</span>
|
|
67
|
+
<span class="dl-stat-label">Total Time</span>
|
|
68
|
+
</div>
|
|
69
|
+
{% endif %}
|
|
70
|
+
</section>
|
|
71
|
+
|
|
72
|
+
{%- comment -%} Leverage Card {%- endcomment -%}
|
|
73
|
+
{% if efficiencyMultiplier %}
|
|
74
|
+
<div class="dl-leverage-card dl-bounce dl-delay-1" role="figure" aria-label="Time breakdown">
|
|
75
|
+
<div class="dl-leverage-card__title">Time Breakdown</div>
|
|
76
|
+
<svg width="96" height="96" viewBox="0 0 96 96">
|
|
77
|
+
<circle cx="48" cy="48" r="40" fill="none" stroke="rgba(14,165,233,0.12)" stroke-width="7"/>
|
|
78
|
+
{% assign totalCombined = totalDurationMinutes | plus: totalAgentDurationMinutes %}
|
|
79
|
+
{% if totalCombined > 0 %}
|
|
80
|
+
{% assign humanPct = totalDurationMinutes | times: 251 | divided_by: totalCombined %}
|
|
81
|
+
{% else %}
|
|
82
|
+
{% assign humanPct = 125 %}
|
|
83
|
+
{% endif %}
|
|
84
|
+
<circle cx="48" cy="48" r="40" fill="none" stroke="var(--dl-accent)" stroke-width="7" stroke-dasharray="{{ humanPct }} 251" stroke-dashoffset="-50" stroke-linecap="round"/>
|
|
85
|
+
<text x="48" y="44" text-anchor="middle" font-family="var(--dl-font-display)" font-size="18" font-weight="700" fill="var(--dl-accent)">{{ efficiencyMultiplier }}</text>
|
|
86
|
+
<text x="48" y="58" text-anchor="middle" font-family="var(--dl-font-mono)" font-size="8" fill="var(--dl-text-tertiary)">LEVERAGE</text>
|
|
87
|
+
</svg>
|
|
88
|
+
<div class="dl-leverage-card__values">
|
|
89
|
+
<div><span class="dl-leverage-card__num">{{ totalDurationMinutes | formatDuration }}</span><span class="dl-leverage-card__lbl">you</span></div>
|
|
90
|
+
<div><span class="dl-leverage-card__num" style="color:var(--dl-accent)">{{ totalAgentDurationMinutes | formatDuration }}</span><span class="dl-leverage-card__lbl">agents</span></div>
|
|
91
|
+
</div>
|
|
92
|
+
</div>
|
|
93
|
+
{% endif %}
|
|
94
|
+
|
|
95
|
+
{%- comment -%} Projects {%- endcomment -%}
|
|
96
|
+
{% if projects.size > 0 %}
|
|
97
|
+
<section aria-label="Projects" class="dl-bounce dl-delay-2">
|
|
98
|
+
<h2 class="dl-section-heading">Projects</h2>
|
|
99
|
+
<div class="dl-projects">
|
|
100
|
+
{% for p in projects %}
|
|
101
|
+
<article class="dl-project-card dl-bounce dl-delay-2">
|
|
102
|
+
<h3 class="dl-project-title">
|
|
103
|
+
<a href="/{{ user.username }}/{{ p.slug }}">{{ p.title }}</a>
|
|
104
|
+
</h3>
|
|
105
|
+
{% if p.narrative %}
|
|
106
|
+
<p class="dl-project-narrative">{{ p.narrative }}</p>
|
|
107
|
+
{% endif %}
|
|
108
|
+
<p class="dl-project-meta">
|
|
109
|
+
{{ p.totalSessions }} session{% if p.totalSessions != 1 %}s{% endif %} · {{ p.totalDurationMinutes | formatDuration }} · {{ p.totalLoc | localeNumber }} LOC
|
|
110
|
+
</p>
|
|
111
|
+
{% if p.skills.size > 0 %}
|
|
112
|
+
<div class="dl-project-skills">
|
|
113
|
+
{% for skill in p.skills %}
|
|
114
|
+
<span class="dl-skill-chip">{{ skill }}</span>
|
|
115
|
+
{% endfor %}
|
|
116
|
+
</div>
|
|
117
|
+
{% endif %}
|
|
118
|
+
{% if p.sourceCounts.size > 0 %}
|
|
119
|
+
{% assign pTotalSrc = 0 %}
|
|
120
|
+
{% for src in p.sourceCounts %}{% assign pTotalSrc = pTotalSrc | plus: src.count %}{% endfor %}
|
|
121
|
+
{% if pTotalSrc > 0 %}
|
|
122
|
+
<div class="dl-project-source">
|
|
123
|
+
{% assign pFirstPct = p.sourceCounts[0].count | times: 100.0 | divided_by: pTotalSrc | round %}
|
|
124
|
+
<span>{{ p.sourceCounts[0].tool }} {{ pFirstPct }}%</span>
|
|
125
|
+
<div class="dl-source-bar" role="img" aria-label="Source tool distribution">
|
|
126
|
+
<div class="dl-source-fill" style="width: {{ pFirstPct }}%"></div>
|
|
127
|
+
</div>
|
|
128
|
+
{% if p.sourceCounts.size > 1 %}
|
|
129
|
+
{% assign pSecondPct = p.sourceCounts[1].count | times: 100.0 | divided_by: pTotalSrc | round %}
|
|
130
|
+
<span>{{ p.sourceCounts[1].tool }} {{ pSecondPct }}%</span>
|
|
131
|
+
{% endif %}
|
|
132
|
+
</div>
|
|
133
|
+
{% endif %}
|
|
134
|
+
{% endif %}
|
|
135
|
+
</article>
|
|
136
|
+
{% endfor %}
|
|
137
|
+
</div>
|
|
138
|
+
</section>
|
|
139
|
+
{% endif %}
|
|
140
|
+
|
|
141
|
+
{%- comment -%} Activity Heatmap {%- endcomment -%}
|
|
142
|
+
{% if activityByDay.size > 0 %}
|
|
143
|
+
<section class="dl-activity-section dl-bounce dl-delay-3" aria-label="Activity overview">
|
|
144
|
+
<h2 class="dl-section-heading">Activity</h2>
|
|
145
|
+
<div class="dl-activity-chart">
|
|
146
|
+
<div class="dl-activity-title">Coding sessions over time</div>
|
|
147
|
+
<div class="dl-activity-grid" role="img" aria-label="Activity heatmap showing coding sessions over time">
|
|
148
|
+
{% for day in activityByDay %}
|
|
149
|
+
{% if day.count >= 4 %}{% assign level = 4 %}
|
|
150
|
+
{% elsif day.count >= 3 %}{% assign level = 3 %}
|
|
151
|
+
{% elsif day.count >= 2 %}{% assign level = 2 %}
|
|
152
|
+
{% elsif day.count >= 1 %}{% assign level = 1 %}
|
|
153
|
+
{% else %}{% assign level = 0 %}{% endif %}
|
|
154
|
+
<div class="dl-activity-cell" data-level="{{ level }}" title="{{ day.date }}: {{ day.count }} sessions"></div>
|
|
155
|
+
{% endfor %}
|
|
156
|
+
</div>
|
|
157
|
+
<div class="dl-activity-legend">
|
|
158
|
+
<span>Less</span>
|
|
159
|
+
<div class="dl-activity-legend-cell" data-level="0"></div>
|
|
160
|
+
<div class="dl-activity-legend-cell" data-level="1"></div>
|
|
161
|
+
<div class="dl-activity-legend-cell" data-level="2"></div>
|
|
162
|
+
<div class="dl-activity-legend-cell" data-level="3"></div>
|
|
163
|
+
<div class="dl-activity-legend-cell" data-level="4"></div>
|
|
164
|
+
<span>More</span>
|
|
165
|
+
</div>
|
|
166
|
+
</div>
|
|
167
|
+
</section>
|
|
168
|
+
{% endif %}
|
|
169
|
+
|
|
170
|
+
{%- comment -%} All Skills {%- endcomment -%}
|
|
171
|
+
{% if allSkills.size > 0 %}
|
|
172
|
+
<section class="dl-all-skills-section dl-bounce dl-delay-3" aria-label="All skills across projects">
|
|
173
|
+
<h2 class="dl-section-heading">Skills</h2>
|
|
174
|
+
<div class="dl-all-skills">
|
|
175
|
+
{% for skill in allSkills %}
|
|
176
|
+
<span class="dl-skill-chip-lg">{{ skill.name }} <span class="dl-skill-count">{{ skill.count }} project{% if skill.count != 1 %}s{% endif %}</span></span>
|
|
177
|
+
{% endfor %}
|
|
178
|
+
</div>
|
|
179
|
+
</section>
|
|
180
|
+
{% endif %}
|
|
181
|
+
|
|
182
|
+
{%- comment -%} Source Overview {%- endcomment -%}
|
|
183
|
+
{% if sourceCounts.size > 0 %}
|
|
184
|
+
<section class="dl-source-overview dl-bounce dl-delay-4" aria-label="Source tool breakdown">
|
|
185
|
+
<h2 class="dl-section-heading">Source Breakdown</h2>
|
|
186
|
+
{% assign totalSourceSessions = 0 %}
|
|
187
|
+
{% for src in sourceCounts %}{% assign totalSourceSessions = totalSourceSessions | plus: src.count %}{% endfor %}
|
|
188
|
+
<div class="dl-source-cards">
|
|
189
|
+
{% for src in sourceCounts %}
|
|
190
|
+
<div class="dl-source-card">
|
|
191
|
+
<div class="dl-source-card-name">{{ src.tool }}</div>
|
|
192
|
+
{% if totalSourceSessions > 0 %}
|
|
193
|
+
{% assign srcPct = src.count | times: 100.0 | divided_by: totalSourceSessions | round %}
|
|
194
|
+
<div class="dl-source-card-pct">{{ srcPct }}%</div>
|
|
195
|
+
{% endif %}
|
|
196
|
+
<div class="dl-source-card-sessions">{{ src.count }} session{% if src.count != 1 %}s{% endif %}</div>
|
|
197
|
+
</div>
|
|
198
|
+
{% endfor %}
|
|
199
|
+
</div>
|
|
200
|
+
{% if totalSourceSessions > 0 %}
|
|
201
|
+
{% assign firstSrcPct = sourceCounts[0].count | times: 100.0 | divided_by: totalSourceSessions | round %}
|
|
202
|
+
<div class="dl-source-bar-overview" role="img" aria-label="Source tool distribution">
|
|
203
|
+
<div class="dl-source-fill-overview" style="width: {{ firstSrcPct }}%"></div>
|
|
204
|
+
</div>
|
|
205
|
+
{% endif %}
|
|
206
|
+
</section>
|
|
207
|
+
{% endif %}
|
|
208
|
+
|
|
209
|
+
<footer class="dl-footer" role="contentinfo">
|
|
210
|
+
<p>Built with <a href="https://heyi.am">heyi.am</a> · Daylight theme</p>
|
|
211
|
+
</footer>
|
|
212
|
+
|
|
213
|
+
</div>
|
|
214
|
+
|
|
215
|
+
{%- comment -%} Animations {%- endcomment -%}
|
|
216
|
+
|
|
217
|
+
</div>
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
<div class="heyiam-project daylight" data-render-version="2" data-template="daylight"{% if sessionBaseUrl %} data-session-base-url="{{ sessionBaseUrl }}"{% endif %} data-username="{{ user.username }}" data-project-slug="{{ project.slug }}">
|
|
2
|
+
|
|
3
|
+
<div class="dl-container">
|
|
4
|
+
|
|
5
|
+
{%- comment -%} Project Header {%- endcomment -%}
|
|
6
|
+
<header class="dl-project-header dl-bounce">
|
|
7
|
+
<h1 data-editable="title">{{ project.title }}</h1>
|
|
8
|
+
{% if project.repoUrl or project.projectUrl %}
|
|
9
|
+
<div class="dl-project-links">
|
|
10
|
+
{% if project.repoUrl %}
|
|
11
|
+
<a href="{{ project.repoUrl }}" target="_blank" rel="noopener">{{ project.repoUrl | stripProtocol }}</a>
|
|
12
|
+
{% endif %}
|
|
13
|
+
{% if project.projectUrl %}
|
|
14
|
+
<a href="{{ project.projectUrl }}" target="_blank" rel="noopener">{{ project.projectUrl | stripProtocol }}</a>
|
|
15
|
+
{% endif %}
|
|
16
|
+
</div>
|
|
17
|
+
{% endif %}
|
|
18
|
+
</header>
|
|
19
|
+
|
|
20
|
+
{%- comment -%} Screenshot {%- endcomment -%}
|
|
21
|
+
{% if project.screenshotUrl %}
|
|
22
|
+
<div class="dl-screenshot dl-bounce dl-delay-1" data-editable="screenshot">
|
|
23
|
+
<div class="dl-screenshot-bar">
|
|
24
|
+
<span class="dl-screenshot-dot"></span>
|
|
25
|
+
<span class="dl-screenshot-dot"></span>
|
|
26
|
+
<span class="dl-screenshot-dot"></span>
|
|
27
|
+
</div>
|
|
28
|
+
<div class="dl-screenshot-body">
|
|
29
|
+
<img src="{{ project.screenshotUrl }}" alt="{{ project.title }} screenshot">
|
|
30
|
+
</div>
|
|
31
|
+
</div>
|
|
32
|
+
{% endif %}
|
|
33
|
+
|
|
34
|
+
{%- comment -%} Narrative {%- endcomment -%}
|
|
35
|
+
{% if project.narrative %}
|
|
36
|
+
<section class="dl-narrative dl-bounce dl-delay-2" aria-label="Project narrative">
|
|
37
|
+
<h2 class="dl-section-heading">The Story</h2>
|
|
38
|
+
<p>{{ project.narrative }}</p>
|
|
39
|
+
</section>
|
|
40
|
+
{% endif %}
|
|
41
|
+
|
|
42
|
+
{%- comment -%} Stats {%- endcomment -%}
|
|
43
|
+
<section class="dl-stats-row dl-bounce dl-delay-1" aria-label="Project statistics">
|
|
44
|
+
<div class="dl-stat-card">
|
|
45
|
+
<span class="dl-stat-number" data-target="{{ project.totalSessions }}">0</span>
|
|
46
|
+
<span class="dl-stat-label">Sessions</span>
|
|
47
|
+
</div>
|
|
48
|
+
<div class="dl-stat-card">
|
|
49
|
+
<span class="dl-stat-number" data-target="{{ project.totalLoc }}" data-format="comma">0</span>
|
|
50
|
+
<span class="dl-stat-label">Lines Changed</span>
|
|
51
|
+
</div>
|
|
52
|
+
<div class="dl-stat-card">
|
|
53
|
+
<span class="dl-stat-number" data-target="{{ project.totalFilesChanged }}">0</span>
|
|
54
|
+
<span class="dl-stat-label">Files</span>
|
|
55
|
+
</div>
|
|
56
|
+
{% if project.totalTokens %}
|
|
57
|
+
<div class="dl-stat-card">
|
|
58
|
+
<span class="dl-stat-number">{{ project.totalTokens | formatTokens }}</span>
|
|
59
|
+
<span class="dl-stat-label">Tokens</span>
|
|
60
|
+
</div>
|
|
61
|
+
{% endif %}
|
|
62
|
+
{% if efficiencyMultiplier %}
|
|
63
|
+
<div class="dl-stat-card">
|
|
64
|
+
<span class="dl-stat-number">{{ efficiencyMultiplier }}</span>
|
|
65
|
+
<span class="dl-stat-label">Leverage</span>
|
|
66
|
+
</div>
|
|
67
|
+
{% endif %}
|
|
68
|
+
</section>
|
|
69
|
+
|
|
70
|
+
{%- comment -%} Leverage Card {%- endcomment -%}
|
|
71
|
+
{% if efficiencyMultiplier %}
|
|
72
|
+
<div class="dl-leverage-card dl-bounce dl-delay-1" role="figure" aria-label="Time breakdown">
|
|
73
|
+
<div class="dl-leverage-card__title">Time Breakdown</div>
|
|
74
|
+
<svg width="96" height="96" viewBox="0 0 96 96">
|
|
75
|
+
<circle cx="48" cy="48" r="40" fill="none" stroke="rgba(14,165,233,0.12)" stroke-width="7"/>
|
|
76
|
+
{% assign totalCombined = project.totalDurationMinutes | plus: project.totalAgentDurationMinutes %}
|
|
77
|
+
{% if totalCombined > 0 %}
|
|
78
|
+
{% assign humanPct = project.totalDurationMinutes | times: 251 | divided_by: totalCombined %}
|
|
79
|
+
{% else %}
|
|
80
|
+
{% assign humanPct = 125 %}
|
|
81
|
+
{% endif %}
|
|
82
|
+
<circle cx="48" cy="48" r="40" fill="none" stroke="var(--dl-accent)" stroke-width="7" stroke-dasharray="{{ humanPct }} 251" stroke-dashoffset="-50" stroke-linecap="round"/>
|
|
83
|
+
<text x="48" y="44" text-anchor="middle" font-family="var(--dl-font-display)" font-size="18" font-weight="700" fill="var(--dl-accent)">{{ efficiencyMultiplier }}</text>
|
|
84
|
+
<text x="48" y="58" text-anchor="middle" font-family="var(--dl-font-mono)" font-size="8" fill="var(--dl-text-tertiary)">LEVERAGE</text>
|
|
85
|
+
</svg>
|
|
86
|
+
<div class="dl-leverage-card__values">
|
|
87
|
+
<div><span class="dl-leverage-card__num">{{ project.totalDurationMinutes | formatDuration }}</span><span class="dl-leverage-card__lbl">you</span></div>
|
|
88
|
+
<div><span class="dl-leverage-card__num" style="color:var(--dl-accent)">{{ project.totalAgentDurationMinutes | formatDuration }}</span><span class="dl-leverage-card__lbl">agents</span></div>
|
|
89
|
+
</div>
|
|
90
|
+
</div>
|
|
91
|
+
{% endif %}
|
|
92
|
+
|
|
93
|
+
{%- comment -%} Work Timeline Chart (CSS-only bars matching mockup) {%- endcomment -%}
|
|
94
|
+
{% if featuredSessions.size > 0 %}
|
|
95
|
+
<section class="dl-chart-container dl-bounce dl-delay-2" aria-label="Work timeline">
|
|
96
|
+
<h2 class="dl-chart-title">Work Timeline</h2>
|
|
97
|
+
{% assign maxLoc = 1 %}
|
|
98
|
+
{% for s in featuredSessions %}
|
|
99
|
+
{% if s.locChanged > maxLoc %}{% assign maxLoc = s.locChanged %}{% endif %}
|
|
100
|
+
{% endfor %}
|
|
101
|
+
{% assign maxDur = 1 %}
|
|
102
|
+
{% for s in featuredSessions %}
|
|
103
|
+
{% if s.durationMinutes > maxDur %}{% assign maxDur = s.durationMinutes %}{% endif %}
|
|
104
|
+
{% endfor %}
|
|
105
|
+
<div class="dl-chart" role="img" aria-label="Bar chart showing lines of code and duration across {{ featuredSessions.size }} sessions">
|
|
106
|
+
{% for s in featuredSessions %}
|
|
107
|
+
<div class="dl-chart-bar-group">
|
|
108
|
+
{% assign locHeight = s.locChanged | times: 100 | divided_by: maxLoc %}
|
|
109
|
+
{% assign durHeight = s.durationMinutes | times: 100 | divided_by: maxDur %}
|
|
110
|
+
<div class="dl-chart-bar dl-chart-bar-loc" style="height: {{ locHeight }}%" title="{{ s.locChanged }} LOC"></div>
|
|
111
|
+
<div class="dl-chart-bar dl-chart-bar-duration" style="height: {{ durHeight }}%" title="{{ s.durationMinutes }}m"></div>
|
|
112
|
+
<span class="dl-chart-label">S{{ forloop.index }}</span>
|
|
113
|
+
</div>
|
|
114
|
+
{% endfor %}
|
|
115
|
+
</div>
|
|
116
|
+
<div class="dl-chart-legend">
|
|
117
|
+
<span><span class="dl-chart-legend-dot" style="background: var(--dl-accent)"></span>Lines of Code</span>
|
|
118
|
+
<span><span class="dl-chart-legend-dot" style="background: var(--dl-accent-green)"></span>Duration</span>
|
|
119
|
+
</div>
|
|
120
|
+
</section>
|
|
121
|
+
{% endif %}
|
|
122
|
+
|
|
123
|
+
{%- comment -%} Phases {%- endcomment -%}
|
|
124
|
+
{% if arc.size > 0 %}
|
|
125
|
+
<section class="dl-phases dl-bounce dl-delay-2" aria-label="Project phases">
|
|
126
|
+
<h2 class="dl-section-heading">Phases</h2>
|
|
127
|
+
<ol class="dl-phase-list" role="list">
|
|
128
|
+
{% for item in arc %}
|
|
129
|
+
<li class="dl-phase-item">
|
|
130
|
+
<span class="dl-phase-name">{{ item.title }}</span>
|
|
131
|
+
{% if item.dates %}
|
|
132
|
+
<span class="dl-phase-dates">{{ item.dates }}</span>
|
|
133
|
+
{% endif %}
|
|
134
|
+
<p class="dl-phase-desc">{{ item.description }}</p>
|
|
135
|
+
</li>
|
|
136
|
+
{% endfor %}
|
|
137
|
+
</ol>
|
|
138
|
+
</section>
|
|
139
|
+
{% endif %}
|
|
140
|
+
|
|
141
|
+
{%- comment -%} Skills {%- endcomment -%}
|
|
142
|
+
{% if project.skills.size > 0 %}
|
|
143
|
+
<section class="dl-skills-section dl-bounce dl-delay-3" aria-label="Skills used">
|
|
144
|
+
<h2 class="dl-section-heading">Skills</h2>
|
|
145
|
+
<div class="dl-skill-chips">
|
|
146
|
+
{% for skill in project.skills %}
|
|
147
|
+
<span class="dl-skill-chip">{{ skill }}</span>
|
|
148
|
+
{% endfor %}
|
|
149
|
+
</div>
|
|
150
|
+
</section>
|
|
151
|
+
{% endif %}
|
|
152
|
+
|
|
153
|
+
{%- comment -%} Key Decisions {%- endcomment -%}
|
|
154
|
+
{% if arc.size > 0 %}
|
|
155
|
+
<section class="dl-decisions dl-bounce dl-delay-3" aria-label="Key decisions">
|
|
156
|
+
<h2 class="dl-section-heading">Key Decisions</h2>
|
|
157
|
+
<ol class="dl-decision-list">
|
|
158
|
+
{% for item in arc %}
|
|
159
|
+
<li class="dl-decision-item">{{ item.description }}</li>
|
|
160
|
+
{% endfor %}
|
|
161
|
+
</ol>
|
|
162
|
+
</section>
|
|
163
|
+
{% endif %}
|
|
164
|
+
|
|
165
|
+
{%- comment -%} Source Breakdown {%- endcomment -%}
|
|
166
|
+
{% if sourceCounts.size > 0 %}
|
|
167
|
+
<section class="dl-source-section dl-bounce dl-delay-3" aria-label="Source breakdown">
|
|
168
|
+
<h2 class="dl-section-heading">Source Breakdown</h2>
|
|
169
|
+
{% assign totalSourceSessions = 0 %}
|
|
170
|
+
{% for src in sourceCounts %}
|
|
171
|
+
{% assign totalSourceSessions = totalSourceSessions | plus: src.count %}
|
|
172
|
+
{% endfor %}
|
|
173
|
+
<div class="dl-source-breakdown">
|
|
174
|
+
{% if totalSourceSessions > 0 %}
|
|
175
|
+
{% assign firstPct = sourceCounts[0].count | times: 100.0 | divided_by: totalSourceSessions | round %}
|
|
176
|
+
<div class="dl-source-bar-large" role="img" aria-label="Source tool distribution">
|
|
177
|
+
<div class="dl-source-fill-large" style="width: {{ firstPct }}%"></div>
|
|
178
|
+
</div>
|
|
179
|
+
{% endif %}
|
|
180
|
+
<div class="dl-source-labels">
|
|
181
|
+
{% for src in sourceCounts %}
|
|
182
|
+
{% if totalSourceSessions > 0 %}
|
|
183
|
+
{% assign srcPct = src.count | times: 100.0 | divided_by: totalSourceSessions | round %}
|
|
184
|
+
<span>{{ src.tool }} {{ srcPct }}% ({{ src.count }} session{% if src.count != 1 %}s{% endif %})</span>
|
|
185
|
+
{% else %}
|
|
186
|
+
<span>{{ src.tool }} ({{ src.count }} session{% if src.count != 1 %}s{% endif %})</span>
|
|
187
|
+
{% endif %}
|
|
188
|
+
{% endfor %}
|
|
189
|
+
</div>
|
|
190
|
+
</div>
|
|
191
|
+
</section>
|
|
192
|
+
{% endif %}
|
|
193
|
+
|
|
194
|
+
{%- comment -%} Featured Sessions {%- endcomment -%}
|
|
195
|
+
{% if featuredSessions.size > 0 %}
|
|
196
|
+
<section class="dl-sessions-section dl-bounce dl-delay-4" aria-label="Featured sessions">
|
|
197
|
+
<h2 class="dl-section-heading">Sessions</h2>
|
|
198
|
+
<div class="dl-session-grid">
|
|
199
|
+
{% assign agent_colors = '#0891b2,#059669,#7c3aed,#475569,#e11d48,#d97706' | split: ',' %}
|
|
200
|
+
{% for s in featuredSessions %}
|
|
201
|
+
<article class="dl-session-card">
|
|
202
|
+
{% if s.skills.size > 0 %}
|
|
203
|
+
<span class="dl-session-card-tag">{{ s.skills | first }}</span>
|
|
204
|
+
{% endif %}
|
|
205
|
+
<h3 class="dl-session-card-title"><a href="{{ sessionBaseUrl }}/{{ s.slug }}{{ sessionSuffix }}">{{ s.title }}</a></h3>
|
|
206
|
+
<p class="dl-session-card-meta">{{ s.durationMinutes | formatDuration }} · {{ s.locChanged | localeNumber }} LOC{% if s.agentSummary %} · {{ s.agentSummary.agents.size }} agents{% endif %}</p>
|
|
207
|
+
{% if s.agentSummary %}
|
|
208
|
+
<div class="dl-session-card-agents" aria-label="{{ s.agentSummary.agents.size }} agents used">
|
|
209
|
+
{% for agent in s.agentSummary.agents %}
|
|
210
|
+
{% assign colorIdx = forloop.index0 | modulo: 6 %}
|
|
211
|
+
<span class="dl-agent-dot" style="background: {{ agent_colors[colorIdx] }}" title="{{ agent.role }}"></span>
|
|
212
|
+
{% endfor %}
|
|
213
|
+
</div>
|
|
214
|
+
{% endif %}
|
|
215
|
+
</article>
|
|
216
|
+
{% endfor %}
|
|
217
|
+
</div>
|
|
218
|
+
</section>
|
|
219
|
+
{% endif %}
|
|
220
|
+
|
|
221
|
+
<footer class="dl-footer" role="contentinfo">
|
|
222
|
+
<p>Built with <a href="https://heyi.am">heyi.am</a> · Daylight theme</p>
|
|
223
|
+
</footer>
|
|
224
|
+
|
|
225
|
+
</div>
|
|
226
|
+
|
|
227
|
+
{%- comment -%} Animations {%- endcomment -%}
|
|
228
|
+
|
|
229
|
+
</div>
|