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,170 @@
|
|
|
1
|
+
<div class="heyiam-portfolio carbon" data-render-version="2" data-template="carbon" data-username="{{ user.username }}">
|
|
2
|
+
|
|
3
|
+
{%- comment -%} Profile Header {%- endcomment -%}
|
|
4
|
+
{% if hasProfile %}
|
|
5
|
+
<header class="profile fade-in" aria-label="Profile">
|
|
6
|
+
{% if user.photoUrl %}
|
|
7
|
+
<img src="{{ user.photoUrl }}" alt="{{ user.displayName }}" class="profile__photo" width="120" height="120">
|
|
8
|
+
{% endif %}
|
|
9
|
+
{% if user.displayName != blank %}
|
|
10
|
+
<h1 class="profile__name">{{ user.displayName }}</h1>
|
|
11
|
+
{% endif %}
|
|
12
|
+
{% if user.bio != blank %}
|
|
13
|
+
<p class="profile__bio">{{ user.bio }}</p>
|
|
14
|
+
{% endif %}
|
|
15
|
+
{% if user.location != blank %}
|
|
16
|
+
<p class="profile__location">{{ user.location }}</p>
|
|
17
|
+
{% endif %}
|
|
18
|
+
<div class="profile__links">
|
|
19
|
+
{% if user.email != blank %}
|
|
20
|
+
<a href="mailto:{{ user.email }}">{{ user.email }}</a>
|
|
21
|
+
{% endif %}
|
|
22
|
+
{% if user.linkedinUrl != blank %}
|
|
23
|
+
<a href="{{ user.linkedinUrl }}" target="_blank" rel="noopener">LinkedIn</a>
|
|
24
|
+
{% endif %}
|
|
25
|
+
{% if user.githubUrl != blank %}
|
|
26
|
+
<a href="{{ user.githubUrl }}" target="_blank" rel="noopener">GitHub</a>
|
|
27
|
+
{% endif %}
|
|
28
|
+
{% if user.twitterHandle != blank %}
|
|
29
|
+
<a href="https://x.com/{{ user.twitterHandle }}" target="_blank" rel="noopener">@{{ user.twitterHandle }}</a>
|
|
30
|
+
{% endif %}
|
|
31
|
+
{% if user.websiteUrl != blank %}
|
|
32
|
+
<a href="{{ user.websiteUrl }}" target="_blank" rel="noopener">{{ user.websiteUrl | stripProtocol }}</a>
|
|
33
|
+
{% endif %}
|
|
34
|
+
{% if user.resumeUrl != blank %}
|
|
35
|
+
<a href="{{ user.resumeUrl }}" class="profile__link--resume" download>Resume (PDF)</a>
|
|
36
|
+
{% endif %}
|
|
37
|
+
</div>
|
|
38
|
+
</header>
|
|
39
|
+
{% endif %}
|
|
40
|
+
|
|
41
|
+
{%- comment -%} Aggregate Stats Bar {%- endcomment -%}
|
|
42
|
+
<section class="stats-bar fade-in" aria-label="Portfolio statistics">
|
|
43
|
+
<div class="stat-cell">
|
|
44
|
+
<div class="stat-cell__value">{{ projects.size }}</div>
|
|
45
|
+
<div class="stat-cell__label">Projects</div>
|
|
46
|
+
</div>
|
|
47
|
+
<div class="stat-cell">
|
|
48
|
+
<div class="stat-cell__value">{{ totalSessions }}</div>
|
|
49
|
+
<div class="stat-cell__label">Sessions</div>
|
|
50
|
+
</div>
|
|
51
|
+
{% if efficiencyMultiplier %}
|
|
52
|
+
<div class="stat-cell stat-cell--leverage">
|
|
53
|
+
<div class="leverage-cell">
|
|
54
|
+
<div class="leverage-cell__value">{{ totalDurationMinutes | formatDuration }}</div>
|
|
55
|
+
<div class="leverage-cell__label">You</div>
|
|
56
|
+
</div>
|
|
57
|
+
<div class="leverage-cell">
|
|
58
|
+
<div class="leverage-cell__value leverage-cell__value--accent">{{ totalAgentDurationMinutes | formatDuration }}</div>
|
|
59
|
+
<div class="leverage-cell__label">Agents</div>
|
|
60
|
+
</div>
|
|
61
|
+
<div class="leverage-cell">
|
|
62
|
+
<div class="leverage-cell__value leverage-cell__value--accent">{{ efficiencyMultiplier }}</div>
|
|
63
|
+
<div class="leverage-cell__label">Multiplier</div>
|
|
64
|
+
</div>
|
|
65
|
+
</div>
|
|
66
|
+
{% else %}
|
|
67
|
+
<div class="stat-cell">
|
|
68
|
+
<div class="stat-cell__value">{{ totalDurationMinutes | formatDuration }}</div>
|
|
69
|
+
<div class="stat-cell__label">Total Time</div>
|
|
70
|
+
</div>
|
|
71
|
+
{% endif %}
|
|
72
|
+
<div class="stat-cell">
|
|
73
|
+
<div class="stat-cell__value">{{ totalLoc | formatLoc }}</div>
|
|
74
|
+
<div class="stat-cell__label">Lines Changed</div>
|
|
75
|
+
</div>
|
|
76
|
+
</section>
|
|
77
|
+
|
|
78
|
+
{%- comment -%} Projects {%- endcomment -%}
|
|
79
|
+
{% if projects.size > 0 %}
|
|
80
|
+
<section aria-label="Projects">
|
|
81
|
+
<h2 class="section-heading">Projects</h2>
|
|
82
|
+
<div class="projects-grid">
|
|
83
|
+
{% for p in projects %}
|
|
84
|
+
<article class="card fade-in">
|
|
85
|
+
<div class="card__header brushed-header">
|
|
86
|
+
<h3 class="card__title"><a href="/{{ user.username }}/{{ p.slug }}">{{ p.title }}</a></h3>
|
|
87
|
+
</div>
|
|
88
|
+
<div class="card__body">
|
|
89
|
+
{% if p.narrative != blank %}
|
|
90
|
+
<p class="card__narrative">{{ p.narrative | truncate: 120 }}</p>
|
|
91
|
+
{% endif %}
|
|
92
|
+
{% if p.skills.size > 0 %}
|
|
93
|
+
<ul class="skill-list" aria-label="Skills used in {{ p.title }}">
|
|
94
|
+
{% for skill in p.skills limit: 6 %}
|
|
95
|
+
<li class="skill-chip">{{ skill }}</li>
|
|
96
|
+
{% endfor %}
|
|
97
|
+
</ul>
|
|
98
|
+
{% endif %}
|
|
99
|
+
<div class="card-stats">
|
|
100
|
+
<span><span class="card-stats__value">{{ p.totalSessions }}</span> sessions</span>
|
|
101
|
+
<span><span class="card-stats__value">{{ p.totalDurationMinutes | formatDuration }}</span> time</span>
|
|
102
|
+
<span><span class="card-stats__value">{{ p.totalLoc | formatLoc }}</span> LOC</span>
|
|
103
|
+
</div>
|
|
104
|
+
{% if p.sourceCounts.size > 0 %}
|
|
105
|
+
{% assign pTotalSrc = 0 %}
|
|
106
|
+
{% for src in p.sourceCounts %}
|
|
107
|
+
{% assign pTotalSrc = pTotalSrc | plus: src.count %}
|
|
108
|
+
{% endfor %}
|
|
109
|
+
{% if pTotalSrc > 0 %}
|
|
110
|
+
<div class="source-bar" role="img" aria-label="Source breakdown for {{ p.title }}">
|
|
111
|
+
{% for src in p.sourceCounts %}
|
|
112
|
+
{% assign srcPct = src.count | times: 100.0 | divided_by: pTotalSrc | round %}
|
|
113
|
+
<div class="source-bar__segment source-bar__segment--{{ src.tool | downcase | replace: ' ', '-' }}" style="width: {{ srcPct }}%"></div>
|
|
114
|
+
{% endfor %}
|
|
115
|
+
</div>
|
|
116
|
+
<div class="source-legend">
|
|
117
|
+
{% for src in p.sourceCounts %}
|
|
118
|
+
{% assign srcPct = src.count | times: 100.0 | divided_by: pTotalSrc | round %}
|
|
119
|
+
<span><span class="source-legend__dot source-legend__dot--{{ src.tool | downcase | replace: ' ', '-' }}"></span>{{ src.tool }} {{ srcPct }}%</span>
|
|
120
|
+
{% endfor %}
|
|
121
|
+
</div>
|
|
122
|
+
{% endif %}
|
|
123
|
+
{% endif %}
|
|
124
|
+
</div>
|
|
125
|
+
</article>
|
|
126
|
+
{% endfor %}
|
|
127
|
+
</div>
|
|
128
|
+
</section>
|
|
129
|
+
{% endif %}
|
|
130
|
+
|
|
131
|
+
{%- comment -%} Aggregate Source Chart {%- endcomment -%}
|
|
132
|
+
{% if sourceCounts.size > 0 %}
|
|
133
|
+
<section class="source-overview fade-in" aria-label="Source breakdown across all projects">
|
|
134
|
+
<h2 class="section-heading">Source Overview</h2>
|
|
135
|
+
<div class="source-bar" role="img" aria-label="Aggregate source breakdown">
|
|
136
|
+
{% for src in sourceCounts %}
|
|
137
|
+
{% assign srcPct = src.count | times: 100.0 | divided_by: totalSourceSessions | round %}
|
|
138
|
+
<div class="source-bar__segment source-bar__segment--{{ src.tool | downcase | replace: ' ', '-' }}" style="width: {{ srcPct }}%"></div>
|
|
139
|
+
{% endfor %}
|
|
140
|
+
</div>
|
|
141
|
+
<div class="source-overview__legend">
|
|
142
|
+
{% for src in sourceCounts %}
|
|
143
|
+
{% assign srcPct = src.count | times: 100.0 | divided_by: totalSourceSessions | round %}
|
|
144
|
+
<span><span class="source-overview__dot source-overview__dot--{{ src.tool | downcase | replace: ' ', '-' }}"></span>{{ src.tool }} {{ srcPct }}%</span>
|
|
145
|
+
{% endfor %}
|
|
146
|
+
</div>
|
|
147
|
+
</section>
|
|
148
|
+
{% endif %}
|
|
149
|
+
|
|
150
|
+
{%- comment -%} Aggregate Skills {%- endcomment -%}
|
|
151
|
+
{% if allSkills.size > 0 %}
|
|
152
|
+
<section class="all-skills fade-in" aria-label="All skills across projects">
|
|
153
|
+
<h2 class="section-heading">Skills</h2>
|
|
154
|
+
<ul class="all-skills__list">
|
|
155
|
+
{% for skill in allSkills %}
|
|
156
|
+
<li class="all-skills__chip">{{ skill.name }}</li>
|
|
157
|
+
{% endfor %}
|
|
158
|
+
</ul>
|
|
159
|
+
</section>
|
|
160
|
+
{% endif %}
|
|
161
|
+
|
|
162
|
+
{%- comment -%} Footer {%- endcomment -%}
|
|
163
|
+
<footer class="carbon-footer">
|
|
164
|
+
<span>Built with <a href="https://heyiam.com" target="_blank" rel="noopener noreferrer">heyi.am</a></span>
|
|
165
|
+
<span>Carbon template</span>
|
|
166
|
+
</footer>
|
|
167
|
+
|
|
168
|
+
{%- comment -%} Fade-in animation {%- endcomment -%}
|
|
169
|
+
|
|
170
|
+
</div>
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
<div class="heyiam-project carbon" data-render-version="2" data-template="carbon"{% if sessionBaseUrl %} data-session-base-url="{{ sessionBaseUrl }}"{% endif %} data-username="{{ user.username }}" data-project-slug="{{ project.slug }}">
|
|
2
|
+
|
|
3
|
+
{%- comment -%} Breadcrumb {%- endcomment -%}
|
|
4
|
+
<nav class="breadcrumb" aria-label="Breadcrumb">
|
|
5
|
+
<a href="/{{ user.username }}">{{ user.username }}</a>
|
|
6
|
+
<span class="breadcrumb__sep">/</span>
|
|
7
|
+
<span aria-current="page">{{ project.slug }}</span>
|
|
8
|
+
</nav>
|
|
9
|
+
|
|
10
|
+
{%- comment -%} Project Header {%- endcomment -%}
|
|
11
|
+
<header class="project-header fade-in">
|
|
12
|
+
<h1 class="project-header__title" data-editable="title">{{ project.title }}</h1>
|
|
13
|
+
{% if project.repoUrl or project.projectUrl %}
|
|
14
|
+
<div class="project-header__links">
|
|
15
|
+
{% if project.repoUrl %}
|
|
16
|
+
<a href="{{ project.repoUrl }}" target="_blank" rel="noopener" aria-label="GitHub repository">{{ project.repoUrl | stripProtocol }}</a>
|
|
17
|
+
{% endif %}
|
|
18
|
+
{% if project.projectUrl %}
|
|
19
|
+
<a href="{{ project.projectUrl }}" target="_blank" rel="noopener" aria-label="Live site">{{ project.projectUrl | stripProtocol }}</a>
|
|
20
|
+
{% endif %}
|
|
21
|
+
</div>
|
|
22
|
+
{% endif %}
|
|
23
|
+
</header>
|
|
24
|
+
|
|
25
|
+
{%- comment -%} Screenshot {%- endcomment -%}
|
|
26
|
+
{% if project.screenshotUrl %}
|
|
27
|
+
<figure class="screenshot fade-in" aria-label="Application screenshot">
|
|
28
|
+
<div class="screenshot__chrome">
|
|
29
|
+
<span class="screenshot__dot"></span>
|
|
30
|
+
<span class="screenshot__dot"></span>
|
|
31
|
+
<span class="screenshot__dot"></span>
|
|
32
|
+
</div>
|
|
33
|
+
<div class="screenshot__body">
|
|
34
|
+
<img src="{{ project.screenshotUrl }}" alt="{{ project.title }} screenshot" class="screenshot__img">
|
|
35
|
+
</div>
|
|
36
|
+
</figure>
|
|
37
|
+
{% endif %}
|
|
38
|
+
|
|
39
|
+
{%- comment -%} Stats Bar {%- endcomment -%}
|
|
40
|
+
<section class="stats-bar stats-bar--project fade-in" aria-label="Project statistics">
|
|
41
|
+
<div class="stat-cell">
|
|
42
|
+
<div class="stat-cell__value">{{ project.totalSessions }}</div>
|
|
43
|
+
<div class="stat-cell__label">Sessions</div>
|
|
44
|
+
</div>
|
|
45
|
+
{% if efficiencyMultiplier %}
|
|
46
|
+
<div class="stat-cell stat-cell--leverage">
|
|
47
|
+
<div class="leverage-cell">
|
|
48
|
+
<div class="leverage-cell__value">{{ project.totalDurationMinutes | formatDuration }}</div>
|
|
49
|
+
<div class="leverage-cell__label">You</div>
|
|
50
|
+
</div>
|
|
51
|
+
<div class="leverage-cell">
|
|
52
|
+
<div class="leverage-cell__value leverage-cell__value--accent">{{ project.totalAgentDurationMinutes | formatDuration }}</div>
|
|
53
|
+
<div class="leverage-cell__label">Agents</div>
|
|
54
|
+
</div>
|
|
55
|
+
<div class="leverage-cell">
|
|
56
|
+
<div class="leverage-cell__value leverage-cell__value--accent">{{ efficiencyMultiplier }}</div>
|
|
57
|
+
<div class="leverage-cell__label">Multiplier</div>
|
|
58
|
+
</div>
|
|
59
|
+
</div>
|
|
60
|
+
{% else %}
|
|
61
|
+
<div class="stat-cell">
|
|
62
|
+
<div class="stat-cell__value">{{ project.totalDurationMinutes | formatDuration }}</div>
|
|
63
|
+
<div class="stat-cell__label">Time</div>
|
|
64
|
+
</div>
|
|
65
|
+
{% endif %}
|
|
66
|
+
<div class="stat-cell">
|
|
67
|
+
<div class="stat-cell__value">{{ project.totalLoc | formatLoc }}</div>
|
|
68
|
+
<div class="stat-cell__label">LOC</div>
|
|
69
|
+
</div>
|
|
70
|
+
<div class="stat-cell">
|
|
71
|
+
<div class="stat-cell__value">{{ project.totalFilesChanged }}</div>
|
|
72
|
+
<div class="stat-cell__label">Files</div>
|
|
73
|
+
</div>
|
|
74
|
+
{% if project.totalTokens %}
|
|
75
|
+
<div class="stat-cell">
|
|
76
|
+
<div class="stat-cell__value">{{ project.totalTokens | formatTokens }}</div>
|
|
77
|
+
<div class="stat-cell__label">Tokens</div>
|
|
78
|
+
</div>
|
|
79
|
+
{% endif %}
|
|
80
|
+
</section>
|
|
81
|
+
|
|
82
|
+
{%- comment -%} Narrative {%- endcomment -%}
|
|
83
|
+
{% if project.narrative != blank %}
|
|
84
|
+
<section class="narrative fade-in" aria-label="Project narrative">
|
|
85
|
+
<h2 class="section-heading">Narrative</h2>
|
|
86
|
+
<p>{{ project.narrative }}</p>
|
|
87
|
+
</section>
|
|
88
|
+
{% endif %}
|
|
89
|
+
|
|
90
|
+
{%- comment -%} Phases Timeline {%- endcomment -%}
|
|
91
|
+
{% if arc.size > 0 %}
|
|
92
|
+
<section class="fade-in" aria-label="Project phases">
|
|
93
|
+
<h2 class="section-heading">Phases</h2>
|
|
94
|
+
<div class="phase-timeline">
|
|
95
|
+
{% for item in arc %}
|
|
96
|
+
<div class="phase-item">
|
|
97
|
+
<div class="phase-item__title">{{ item.phase }}. {{ item.title }}</div>
|
|
98
|
+
{% if item.dates %}
|
|
99
|
+
<div class="phase-item__dates">{{ item.dates }}</div>
|
|
100
|
+
{% endif %}
|
|
101
|
+
<div class="phase-item__desc">{{ item.description }}</div>
|
|
102
|
+
</div>
|
|
103
|
+
{% endfor %}
|
|
104
|
+
</div>
|
|
105
|
+
</section>
|
|
106
|
+
{% endif %}
|
|
107
|
+
|
|
108
|
+
{%- comment -%} Work Timeline Chart (CSS-only SVG) {%- endcomment -%}
|
|
109
|
+
{% if featuredSessions.size > 0 %}
|
|
110
|
+
<section class="timeline-chart fade-in" aria-label="Work timeline">
|
|
111
|
+
<h2 class="section-heading">Work Timeline</h2>
|
|
112
|
+
<div class="timeline-chart__canvas">
|
|
113
|
+
{% assign maxDur = 1 %}
|
|
114
|
+
{% for s in featuredSessions %}
|
|
115
|
+
{% if s.durationMinutes > maxDur %}{% assign maxDur = s.durationMinutes %}{% endif %}
|
|
116
|
+
{% endfor %}
|
|
117
|
+
{% assign chartW = 800 %}
|
|
118
|
+
{% assign chartH = 200 %}
|
|
119
|
+
{% assign padL = 50 %}
|
|
120
|
+
{% assign padR = 30 %}
|
|
121
|
+
{% assign padT = 20 %}
|
|
122
|
+
{% assign padB = 30 %}
|
|
123
|
+
{% assign plotW = chartW | minus: padL | minus: padR %}
|
|
124
|
+
{% assign plotH = chartH | minus: padT | minus: padB %}
|
|
125
|
+
<svg viewBox="0 0 {{ chartW }} {{ chartH }}" aria-label="Chart showing session duration over time">
|
|
126
|
+
{%- comment -%} Grid lines {%- endcomment -%}
|
|
127
|
+
<line x1="{{ padL }}" y1="{{ padT }}" x2="{{ padL }}" y2="{{ chartH | minus: padB }}" stroke="rgba(148,163,184,0.08)" stroke-width="1"/>
|
|
128
|
+
<line x1="{{ padL }}" y1="{{ chartH | minus: padB }}" x2="{{ chartW | minus: padR }}" y2="{{ chartH | minus: padB }}" stroke="rgba(148,163,184,0.15)" stroke-width="1"/>
|
|
129
|
+
{% assign midY = plotH | divided_by: 2 | plus: padT %}
|
|
130
|
+
<line x1="{{ padL }}" y1="{{ midY }}" x2="{{ chartW | minus: padR }}" y2="{{ midY }}" stroke="rgba(148,163,184,0.06)" stroke-width="1" stroke-dasharray="4,4"/>
|
|
131
|
+
|
|
132
|
+
{%- comment -%} Y-axis labels {%- endcomment -%}
|
|
133
|
+
<text x="{{ padL | minus: 6 }}" y="{{ chartH | minus: padB | plus: 4 }}" text-anchor="end" fill="#71717a" font-family="IBM Plex Mono, monospace" font-size="9">0</text>
|
|
134
|
+
{% assign halfDur = maxDur | divided_by: 2 %}
|
|
135
|
+
<text x="{{ padL | minus: 6 }}" y="{{ midY | plus: 4 }}" text-anchor="end" fill="#71717a" font-family="IBM Plex Mono, monospace" font-size="9">{{ halfDur }}m</text>
|
|
136
|
+
<text x="{{ padL | minus: 6 }}" y="{{ padT | plus: 4 }}" text-anchor="end" fill="#71717a" font-family="IBM Plex Mono, monospace" font-size="9">{{ maxDur }}m</text>
|
|
137
|
+
|
|
138
|
+
{%- comment -%} Duration line + points {%- endcomment -%}
|
|
139
|
+
{% assign points = '' %}
|
|
140
|
+
{% assign sessionCount = featuredSessions.size %}
|
|
141
|
+
{% for s in featuredSessions %}
|
|
142
|
+
{% assign idx = forloop.index0 %}
|
|
143
|
+
{% if sessionCount > 1 %}
|
|
144
|
+
{% assign stepX = plotW | times: idx | divided_by: sessionCount | minus: 1 | plus: padL %}
|
|
145
|
+
{% else %}
|
|
146
|
+
{% assign stepX = padL | plus: plotW | divided_by: 2 %}
|
|
147
|
+
{% endif %}
|
|
148
|
+
{% assign ratio = s.durationMinutes | times: 1000 | divided_by: maxDur %}
|
|
149
|
+
{% assign yOff = ratio | times: plotH | divided_by: 1000 %}
|
|
150
|
+
{% assign cy = chartH | minus: padB | minus: yOff %}
|
|
151
|
+
{% if points != '' %}{% assign points = points | append: ' ' %}{% endif %}
|
|
152
|
+
{% assign points = points | append: stepX | append: ',' | append: cy %}
|
|
153
|
+
{% endfor %}
|
|
154
|
+
|
|
155
|
+
<polyline fill="none" stroke="#94a3b8" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" points="{{ points }}"/>
|
|
156
|
+
|
|
157
|
+
{% for s in featuredSessions %}
|
|
158
|
+
{% assign idx = forloop.index0 %}
|
|
159
|
+
{% if sessionCount > 1 %}
|
|
160
|
+
{% assign stepX = plotW | times: idx | divided_by: sessionCount | minus: 1 | plus: padL %}
|
|
161
|
+
{% else %}
|
|
162
|
+
{% assign stepX = padL | plus: plotW | divided_by: 2 %}
|
|
163
|
+
{% endif %}
|
|
164
|
+
{% assign ratio = s.durationMinutes | times: 1000 | divided_by: maxDur %}
|
|
165
|
+
{% assign yOff = ratio | times: plotH | divided_by: 1000 %}
|
|
166
|
+
{% assign cy = chartH | minus: padB | minus: yOff %}
|
|
167
|
+
<circle cx="{{ stepX }}" cy="{{ cy }}" r="5" fill="var(--carbon-bg)" stroke="#94a3b8" stroke-width="2"/>
|
|
168
|
+
<text x="{{ stepX }}" y="{{ chartH | minus: 4 }}" text-anchor="middle" fill="#71717a" font-family="IBM Plex Mono, monospace" font-size="8">{{ s.recordedAt | formatDateShort }}</text>
|
|
169
|
+
{% endfor %}
|
|
170
|
+
</svg>
|
|
171
|
+
</div>
|
|
172
|
+
</section>
|
|
173
|
+
{% endif %}
|
|
174
|
+
|
|
175
|
+
{%- comment -%} Key Decisions {%- endcomment -%}
|
|
176
|
+
{% if arc.size > 0 %}
|
|
177
|
+
<section class="decisions fade-in" aria-label="Key decisions">
|
|
178
|
+
<h2 class="section-heading">Key Decisions</h2>
|
|
179
|
+
{% for item in arc %}
|
|
180
|
+
<div class="decision-item">
|
|
181
|
+
<span class="decision-item__num">{{ item.phase | prepend: '0' | slice: -2, 2 }}</span>
|
|
182
|
+
<span>{{ item.description }}</span>
|
|
183
|
+
</div>
|
|
184
|
+
{% endfor %}
|
|
185
|
+
</section>
|
|
186
|
+
{% endif %}
|
|
187
|
+
|
|
188
|
+
{%- comment -%} Skills {%- endcomment -%}
|
|
189
|
+
{% if project.skills.size > 0 %}
|
|
190
|
+
<section class="fade-in" aria-label="Technologies used">
|
|
191
|
+
<h2 class="section-heading">Skills</h2>
|
|
192
|
+
<ul class="skill-list">
|
|
193
|
+
{% for skill in project.skills %}
|
|
194
|
+
<li class="skill-chip">{{ skill }}</li>
|
|
195
|
+
{% endfor %}
|
|
196
|
+
</ul>
|
|
197
|
+
</section>
|
|
198
|
+
{% endif %}
|
|
199
|
+
|
|
200
|
+
{%- comment -%} Source Breakdown {%- endcomment -%}
|
|
201
|
+
{% if sourceCounts.size > 0 %}
|
|
202
|
+
<section class="source-breakdown fade-in" aria-label="Source breakdown">
|
|
203
|
+
<h2 class="section-heading">Source Breakdown</h2>
|
|
204
|
+
{% assign totalSourceSessions = 0 %}
|
|
205
|
+
{% for src in sourceCounts %}
|
|
206
|
+
{% assign totalSourceSessions = totalSourceSessions | plus: src.count %}
|
|
207
|
+
{% endfor %}
|
|
208
|
+
{% if totalSourceSessions > 0 %}
|
|
209
|
+
<div class="source-bar-lg" role="img" aria-label="Source distribution bar">
|
|
210
|
+
{% for src in sourceCounts %}
|
|
211
|
+
{% assign srcPct = src.count | times: 100.0 | divided_by: totalSourceSessions | round %}
|
|
212
|
+
<div class="source-bar-lg__segment source-bar-lg__segment--{{ src.tool | downcase | replace: ' ', '-' }}" style="width: {{ srcPct }}%"></div>
|
|
213
|
+
{% endfor %}
|
|
214
|
+
</div>
|
|
215
|
+
{% endif %}
|
|
216
|
+
<div class="source-labels">
|
|
217
|
+
{% for src in sourceCounts %}
|
|
218
|
+
{% assign srcPct = src.count | times: 100.0 | divided_by: totalSourceSessions | round %}
|
|
219
|
+
<span><span class="source-labels__dot source-labels__dot--{{ src.tool | downcase | replace: ' ', '-' }}"></span>{{ src.tool }} {{ srcPct }}% ({{ src.count }} session{% if src.count != 1 %}s{% endif %})</span>
|
|
220
|
+
{% endfor %}
|
|
221
|
+
</div>
|
|
222
|
+
</section>
|
|
223
|
+
{% endif %}
|
|
224
|
+
|
|
225
|
+
{%- comment -%} Sessions Table {%- endcomment -%}
|
|
226
|
+
{% if featuredSessions.size > 0 %}
|
|
227
|
+
<section class="sessions-table fade-in" aria-label="Sessions">
|
|
228
|
+
<h2 class="section-heading">Sessions</h2>
|
|
229
|
+
{% for s in featuredSessions %}
|
|
230
|
+
<a href="{{ sessionBaseUrl }}/{{ s.slug }}{{ sessionSuffix }}" class="session-row">
|
|
231
|
+
<span class="session-row__num">{{ forloop.index }}</span>
|
|
232
|
+
<span class="session-row__title">{{ s.title }}</span>
|
|
233
|
+
<span class="session-row__date">{{ s.recordedAt | formatDateShort }}</span>
|
|
234
|
+
<span class="session-row__dur">{{ s.durationMinutes | formatDuration }}</span>
|
|
235
|
+
<span class="session-row__loc">{{ s.locChanged | localeNumber }} LOC</span>
|
|
236
|
+
</a>
|
|
237
|
+
{% endfor %}
|
|
238
|
+
</section>
|
|
239
|
+
{% endif %}
|
|
240
|
+
|
|
241
|
+
{%- comment -%} Footer {%- endcomment -%}
|
|
242
|
+
<footer class="carbon-footer">
|
|
243
|
+
<span>Built with <a href="https://heyiam.com" target="_blank" rel="noopener noreferrer">heyi.am</a></span>
|
|
244
|
+
<span>Carbon template</span>
|
|
245
|
+
</footer>
|
|
246
|
+
|
|
247
|
+
{%- comment -%} Fade-in animation {%- endcomment -%}
|
|
248
|
+
|
|
249
|
+
</div>
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
<div class="heyiam-session carbon" data-render-version="2" data-template="carbon">
|
|
2
|
+
|
|
3
|
+
{%- comment -%} Breadcrumb {%- endcomment -%}
|
|
4
|
+
<nav class="breadcrumb" aria-label="Breadcrumb">
|
|
5
|
+
<a href="/{{ user.username }}">{{ user.username }}</a>
|
|
6
|
+
{% if projectSlug %}
|
|
7
|
+
<span class="breadcrumb__sep">/</span>
|
|
8
|
+
<a href="/{{ user.username }}/{{ projectSlug }}">{{ projectSlug }}</a>
|
|
9
|
+
{% endif %}
|
|
10
|
+
<span class="breadcrumb__sep">/</span>
|
|
11
|
+
<span aria-current="page">{{ session.title }}</span>
|
|
12
|
+
</nav>
|
|
13
|
+
|
|
14
|
+
{%- comment -%} Session Header {%- endcomment -%}
|
|
15
|
+
<header class="session-header fade-in">
|
|
16
|
+
<h1 class="session-header__title">{{ session.title }}</h1>
|
|
17
|
+
<div class="session-header__meta">
|
|
18
|
+
{% if session.recordedAt %}
|
|
19
|
+
<span>Date: <span class="meta-value">{{ session.recordedAt | formatDate }}</span></span>
|
|
20
|
+
{% endif %}
|
|
21
|
+
{% if session.sourceTool %}
|
|
22
|
+
<span>Source: <span class="meta-value">{{ session.sourceTool }}</span></span>
|
|
23
|
+
{% endif %}
|
|
24
|
+
<span>Duration: <span class="meta-value">{{ session.durationMinutes | formatDuration }}</span></span>
|
|
25
|
+
<span>Turns: <span class="meta-value">{{ session.turns }}</span></span>
|
|
26
|
+
<span>LOC: <span class="meta-value">{{ session.locChanged | localeNumber }}</span></span>
|
|
27
|
+
<span>Files: <span class="meta-value">{{ session.filesChanged }}</span></span>
|
|
28
|
+
</div>
|
|
29
|
+
</header>
|
|
30
|
+
|
|
31
|
+
{%- comment -%} Dev Take {%- endcomment -%}
|
|
32
|
+
{% if session.devTake != blank %}
|
|
33
|
+
<div class="dev-take fade-in" aria-label="Developer commentary">
|
|
34
|
+
<div class="dev-take__label">Dev Take</div>
|
|
35
|
+
<p class="dev-take__text">{{ session.devTake }}</p>
|
|
36
|
+
</div>
|
|
37
|
+
{% endif %}
|
|
38
|
+
|
|
39
|
+
{%- comment -%} Main + Sidebar Layout {%- endcomment -%}
|
|
40
|
+
<div class="session-layout">
|
|
41
|
+
|
|
42
|
+
{%- comment -%} Main Content {%- endcomment -%}
|
|
43
|
+
<div>
|
|
44
|
+
|
|
45
|
+
{%- comment -%} Narrative {%- endcomment -%}
|
|
46
|
+
{% if session.narrative != blank %}
|
|
47
|
+
<section class="content-section fade-in" aria-label="Session narrative">
|
|
48
|
+
<h2 class="section-heading">Narrative</h2>
|
|
49
|
+
<p class="narrative-text">{{ session.narrative }}</p>
|
|
50
|
+
</section>
|
|
51
|
+
{% endif %}
|
|
52
|
+
|
|
53
|
+
{%- comment -%} Highlights {%- endcomment -%}
|
|
54
|
+
{% if session.highlights.size > 0 %}
|
|
55
|
+
<section class="content-section fade-in" aria-label="Session highlights">
|
|
56
|
+
<h2 class="section-heading">Highlights</h2>
|
|
57
|
+
<ul class="highlights-list">
|
|
58
|
+
{% for h in session.highlights %}
|
|
59
|
+
<li>{{ h }}</li>
|
|
60
|
+
{% endfor %}
|
|
61
|
+
</ul>
|
|
62
|
+
</section>
|
|
63
|
+
{% endif %}
|
|
64
|
+
|
|
65
|
+
{%- comment -%} Execution Path (Beats) {%- endcomment -%}
|
|
66
|
+
{% if session.beats.size > 0 %}
|
|
67
|
+
<section class="execution-path fade-in" aria-label="Execution path">
|
|
68
|
+
<h2 class="section-heading">Execution Path</h2>
|
|
69
|
+
{% for beat in session.beats %}
|
|
70
|
+
<div class="beat">
|
|
71
|
+
<div class="beat__title">{{ beat.title }}</div>
|
|
72
|
+
<div class="beat__desc">{{ beat.body }}</div>
|
|
73
|
+
</div>
|
|
74
|
+
{% endfor %}
|
|
75
|
+
</section>
|
|
76
|
+
{% endif %}
|
|
77
|
+
|
|
78
|
+
{%- comment -%} Q&A {%- endcomment -%}
|
|
79
|
+
{% if session.qaPairs.size > 0 %}
|
|
80
|
+
<section class="qa-section fade-in" aria-label="Questions and answers">
|
|
81
|
+
<h2 class="section-heading">Q&A</h2>
|
|
82
|
+
{% for qa in session.qaPairs %}
|
|
83
|
+
<article class="qa-item">
|
|
84
|
+
<div class="qa-item__q">
|
|
85
|
+
<span class="qa-item__q-prefix">Q</span>
|
|
86
|
+
<span class="qa-item__q-text">{{ qa.question }}</span>
|
|
87
|
+
</div>
|
|
88
|
+
<div class="qa-item__a">{{ qa.answer }}</div>
|
|
89
|
+
</article>
|
|
90
|
+
{% endfor %}
|
|
91
|
+
</section>
|
|
92
|
+
{% endif %}
|
|
93
|
+
|
|
94
|
+
{%- comment -%} Agent Summary {%- endcomment -%}
|
|
95
|
+
{% if session.agentSummary %}
|
|
96
|
+
<section class="agent-summary fade-in" aria-label="Agent breakdown">
|
|
97
|
+
<h2 class="section-heading">Agent Breakdown</h2>
|
|
98
|
+
|
|
99
|
+
{% assign agent_colors = '#0891b2,#059669,#7c3aed,#475569,#e11d48,#d97706' | split: ',' %}
|
|
100
|
+
{% assign totalAgentDur = 0 %}
|
|
101
|
+
{% for agent in session.agentSummary.agents %}
|
|
102
|
+
{% assign totalAgentDur = totalAgentDur | plus: agent.duration_minutes %}
|
|
103
|
+
{% endfor %}
|
|
104
|
+
|
|
105
|
+
{% if totalAgentDur > 0 %}
|
|
106
|
+
<div class="agent-bar-chart" role="img" aria-label="Agent time distribution">
|
|
107
|
+
{% for agent in session.agentSummary.agents %}
|
|
108
|
+
{% assign pct = agent.duration_minutes | times: 100.0 | divided_by: totalAgentDur | round %}
|
|
109
|
+
{% assign colorIdx = forloop.index0 | modulo: 6 %}
|
|
110
|
+
<div class="agent-bar-chart__seg" style="width: {{ pct }}%; background: {{ agent_colors[colorIdx] }};"></div>
|
|
111
|
+
{% endfor %}
|
|
112
|
+
</div>
|
|
113
|
+
{% endif %}
|
|
114
|
+
|
|
115
|
+
{% for agent in session.agentSummary.agents %}
|
|
116
|
+
{% assign colorIdx = forloop.index0 | modulo: 6 %}
|
|
117
|
+
<div class="agent-row">
|
|
118
|
+
<span class="agent-row__role">
|
|
119
|
+
<span class="agent-dot" style="background: {{ agent_colors[colorIdx] }};" aria-hidden="true"></span>
|
|
120
|
+
{{ agent.role }}
|
|
121
|
+
</span>
|
|
122
|
+
<span class="agent-row__dur">{{ agent.duration_minutes }}m</span>
|
|
123
|
+
<span class="agent-row__loc">{{ agent.loc_changed }} LOC</span>
|
|
124
|
+
</div>
|
|
125
|
+
{% endfor %}
|
|
126
|
+
</section>
|
|
127
|
+
{% endif %}
|
|
128
|
+
|
|
129
|
+
</div>
|
|
130
|
+
|
|
131
|
+
{%- comment -%} Sidebar {%- endcomment -%}
|
|
132
|
+
<aside aria-label="Session details">
|
|
133
|
+
|
|
134
|
+
{%- comment -%} Tools Used {%- endcomment -%}
|
|
135
|
+
{% if session.toolBreakdown.size > 0 %}
|
|
136
|
+
<div class="sidebar-card fade-in">
|
|
137
|
+
<div class="sidebar-card__header brushed-header">Tools Used</div>
|
|
138
|
+
<div class="sidebar-card__body">
|
|
139
|
+
{% for t in session.toolBreakdown %}
|
|
140
|
+
<div class="tool-row">
|
|
141
|
+
<span class="tool-row__name">{{ t.tool }}</span>
|
|
142
|
+
<span class="tool-row__count">{{ t.count }}</span>
|
|
143
|
+
</div>
|
|
144
|
+
{% endfor %}
|
|
145
|
+
</div>
|
|
146
|
+
</div>
|
|
147
|
+
{% endif %}
|
|
148
|
+
|
|
149
|
+
{%- comment -%} Files Changed {%- endcomment -%}
|
|
150
|
+
{% if session.topFiles.size > 0 %}
|
|
151
|
+
<div class="sidebar-card fade-in">
|
|
152
|
+
<div class="sidebar-card__header brushed-header">Files Changed</div>
|
|
153
|
+
<div class="sidebar-card__body">
|
|
154
|
+
{% for f in session.topFiles %}
|
|
155
|
+
<div class="file-row">
|
|
156
|
+
<span class="file-row__name" title="{{ f.path }}">{{ f.path }}</span>
|
|
157
|
+
<span class="file-row__diff">+{{ f.additions }}{% if f.deletions > 0 %} -{{ f.deletions }}{% endif %}</span>
|
|
158
|
+
</div>
|
|
159
|
+
{% endfor %}
|
|
160
|
+
</div>
|
|
161
|
+
</div>
|
|
162
|
+
{% endif %}
|
|
163
|
+
|
|
164
|
+
{%- comment -%} Skills {%- endcomment -%}
|
|
165
|
+
{% if session.skills.size > 0 %}
|
|
166
|
+
<div class="sidebar-card fade-in">
|
|
167
|
+
<div class="sidebar-card__header brushed-header">Skills</div>
|
|
168
|
+
<div class="sidebar-card__body">
|
|
169
|
+
<ul class="sidebar-skills">
|
|
170
|
+
{% for skill in session.skills %}
|
|
171
|
+
<li class="sidebar-skill-chip">{{ skill }}</li>
|
|
172
|
+
{% endfor %}
|
|
173
|
+
</ul>
|
|
174
|
+
</div>
|
|
175
|
+
</div>
|
|
176
|
+
{% endif %}
|
|
177
|
+
|
|
178
|
+
</aside>
|
|
179
|
+
|
|
180
|
+
</div>
|
|
181
|
+
|
|
182
|
+
{%- comment -%} Footer {%- endcomment -%}
|
|
183
|
+
<footer class="carbon-footer">
|
|
184
|
+
<span>Built with <a href="https://heyiam.com" target="_blank" rel="noopener noreferrer">heyi.am</a></span>
|
|
185
|
+
<span>Carbon template</span>
|
|
186
|
+
</footer>
|
|
187
|
+
|
|
188
|
+
{%- comment -%} Fade-in animation {%- endcomment -%}
|
|
189
|
+
|
|
190
|
+
</div>
|