[OCaml] High Intensity Training Online
chore ignore showcase site
Keep the local showcase deployment outside version control while it is not part of the application release.
Changed files
.gitignore
@@ -11,6 +11,9 @@
11
11
# Copyrighted Heavy Duty book material — reference only, never commit
12
12
doc/
13
13
14
Added:
# Showcase site — ignored for now
15
Added:
site/
16
Added:
14
17
# Editor / OS noise
15
18
*~
16
19
.#*
site/assets/site.css
@@ -1,288 +0,0 @@
1
Removed:
/* hito showcase — hito.mlnp.fr
2
Removed:
3
Removed:
The design tokens, paper texture, and typography are copied verbatim from
4
Removed:
the application stylesheet (lib/web/assets/hito.css) so the showcase and the
5
Removed:
app read as one product. Only the layout below (hero, features, screenshots,
6
Removed:
footer) is specific to the showcase. Keep the token block in sync with the
7
Removed:
app when it changes. */
8
Removed:
9
Removed:
@import url("https://fonts.googleapis.com/css2?family=Courier+Prime:wght@400;700&family=Work+Sans:ital,wght@0,400;0,500;0,600;0,700;0,800;1,400;1,600&display=swap");
10
Removed:
11
Removed:
:root {
12
Removed:
color-scheme: light;
13
Removed:
--paper: #f7f2e8;
14
Removed:
--paper-raised: #fffdf8;
15
Removed:
--ink: #1a1a16;
16
Removed:
--muted-ink: #5b584f;
17
Removed:
--rule: #b9b1a2;
18
Removed:
--rule-strong: #756f63;
19
Removed:
--oxblood: #8c201b;
20
Removed:
--oxblood-dark: #65130f;
21
Removed:
--brass: #7b5714;
22
Removed:
--brass-wash: #f4e7c5;
23
Removed:
--evergreen: #1f5b45;
24
Removed:
--evergreen-wash: #dcebe2;
25
Removed:
--focus: #65130f;
26
Removed:
--error: #8c201b;
27
Removed:
--font-size-small: 0.875rem;
28
Removed:
--font-size-base: 1rem;
29
Removed:
--font-size-lead: 1.125rem;
30
Removed:
--font-size-heading: 2rem;
31
Removed:
--radius: 0.4em;
32
Removed:
--sans: "Work Sans", ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
33
Removed:
--mono: "Courier Prime", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
34
Removed:
}
35
Removed:
36
Removed:
* { box-sizing: border-box; }
37
Removed:
38
Removed:
html { background: var(--paper); }
39
Removed:
40
Removed:
body {
41
Removed:
min-width: 20rem;
42
Removed:
margin: 0;
43
Removed:
color: var(--ink);
44
Removed:
background: var(--paper);
45
Removed:
font: 400 var(--font-size-base)/1.5 var(--sans);
46
Removed:
text-rendering: optimizeLegibility;
47
Removed:
}
48
Removed:
49
Removed:
/* The signature paper rule-grid, shared with the app. */
50
Removed:
body::before {
51
Removed:
position: fixed;
52
Removed:
z-index: -1;
53
Removed:
inset: 0;
54
Removed:
background-image: linear-gradient(to bottom, rgba(26, 26, 22, 0.035) 1px, transparent 1px);
55
Removed:
background-size: 100% 2rem;
56
Removed:
content: "";
57
Removed:
pointer-events: none;
58
Removed:
}
59
Removed:
60
Removed:
a {
61
Removed:
color: var(--oxblood-dark);
62
Removed:
font-weight: 600;
63
Removed:
text-decoration-thickness: 0.1em;
64
Removed:
text-underline-offset: 0.16em;
65
Removed:
}
66
Removed:
67
Removed:
a:hover { color: var(--oxblood); }
68
Removed:
69
Removed:
a:focus-visible,
70
Removed:
summary:focus-visible {
71
Removed:
outline: 2px solid var(--focus);
72
Removed:
outline-offset: 2px;
73
Removed:
}
74
Removed:
75
Removed:
/* Shared shell metrics and the wordmark, matching the app masthead. */
76
Removed:
.shell {
77
Removed:
width: min(100%, 72rem);
78
Removed:
margin: 0 auto;
79
Removed:
padding: 0 1rem 3rem;
80
Removed:
}
81
Removed:
82
Removed:
.masthead {
83
Removed:
display: flex;
84
Removed:
align-items: center;
85
Removed:
gap: 1rem;
86
Removed:
min-height: 4.75rem;
87
Removed:
}
88
Removed:
89
Removed:
.brand {
90
Removed:
display: inline-flex;
91
Removed:
align-items: center;
92
Removed:
margin-right: auto;
93
Removed:
color: var(--ink);
94
Removed:
font: 800 2rem/1 var(--sans);
95
Removed:
letter-spacing: -0.03em;
96
Removed:
text-decoration: none;
97
Removed:
}
98
Removed:
99
Removed:
.masthead-cta {
100
Removed:
display: inline-flex;
101
Removed:
align-items: center;
102
Removed:
min-height: 2.75rem;
103
Removed:
padding: 0.5rem 0.9rem;
104
Removed:
border: 1px solid var(--oxblood-dark);
105
Removed:
border-radius: var(--radius);
106
Removed:
color: var(--paper-raised);
107
Removed:
background: var(--oxblood);
108
Removed:
font-weight: 700;
109
Removed:
text-decoration: none;
110
Removed:
}
111
Removed:
.masthead-cta:hover {
112
Removed:
color: var(--paper-raised);
113
Removed:
background: var(--oxblood-dark);
114
Removed:
}
115
Removed:
116
Removed:
/* The eyebrow label, shared with the app. */
117
Removed:
.eyebrow {
118
Removed:
margin: 0 0 0.5rem;
119
Removed:
color: var(--oxblood-dark);
120
Removed:
font: 700 var(--font-size-small)/1.35 var(--sans);
121
Removed:
letter-spacing: 0.09em;
122
Removed:
text-transform: uppercase;
123
Removed:
}
124
Removed:
125
Removed:
/* Hero: the oxblood-topped paper card, matching the app's .page-surface. */
126
Removed:
.hero {
127
Removed:
border: 1px solid var(--rule-strong);
128
Removed:
border-top: 6px solid var(--oxblood);
129
Removed:
background: var(--paper-raised);
130
Removed:
border-radius: var(--radius);
131
Removed:
box-shadow: 0 0.4rem 1.5rem rgba(26, 26, 22, 0.09);
132
Removed:
padding: clamp(1.5rem, 4vw, 3rem);
133
Removed:
}
134
Removed:
135
Removed:
.hero h1 {
136
Removed:
margin: 0 0 0.75rem;
137
Removed:
font: 800 clamp(2rem, 5vw, 3rem)/1.05 var(--sans);
138
Removed:
letter-spacing: -0.02em;
139
Removed:
}
140
Removed:
141
Removed:
.hero .lead {
142
Removed:
max-width: 42rem;
143
Removed:
margin: 0 0 1.75rem;
144
Removed:
color: var(--muted-ink);
145
Removed:
font-size: var(--font-size-lead);
146
Removed:
}
147
Removed:
148
Removed:
.hero-actions {
149
Removed:
display: flex;
150
Removed:
flex-wrap: wrap;
151
Removed:
gap: 0.75rem;
152
Removed:
}
153
Removed:
154
Removed:
.button-primary,
155
Removed:
.button-secondary {
156
Removed:
display: inline-flex;
157
Removed:
align-items: center;
158
Removed:
min-height: 2.75rem;
159
Removed:
padding: 0.6rem 1.1rem;
160
Removed:
border-radius: var(--radius);
161
Removed:
font-weight: 700;
162
Removed:
text-decoration: none;
163
Removed:
}
164
Removed:
.button-primary {
165
Removed:
color: var(--paper-raised);
166
Removed:
background: var(--oxblood);
167
Removed:
border: 1px solid var(--oxblood-dark);
168
Removed:
}
169
Removed:
.button-primary:hover {
170
Removed:
color: var(--paper-raised);
171
Removed:
background: var(--oxblood-dark);
172
Removed:
}
173
Removed:
.button-secondary {
174
Removed:
color: var(--ink);
175
Removed:
background: transparent;
176
Removed:
border: 1px solid var(--rule-strong);
177
Removed:
}
178
Removed:
.button-secondary:hover {
179
Removed:
color: var(--oxblood-dark);
180
Removed:
background: #ece4d5;
181
Removed:
}
182
Removed:
183
Removed:
/* Section rhythm. */
184
Removed:
.section {
185
Removed:
margin-top: 3rem;
186
Removed:
}
187
Removed:
.section > h2 {
188
Removed:
margin: 0 0 1.25rem;
189
Removed:
font: 800 var(--font-size-heading)/1.1 var(--sans);
190
Removed:
letter-spacing: -0.01em;
191
Removed:
}
192
Removed:
193
Removed:
/* Feature grid: each principle is a paper card. */
194
Removed:
.feature-grid {
195
Removed:
display: grid;
196
Removed:
grid-template-columns: repeat(auto-fit, minmax(15rem, 1fr));
197
Removed:
gap: 1rem;
198
Removed:
}
199
Removed:
200
Removed:
.feature {
201
Removed:
border: 1px solid var(--rule);
202
Removed:
border-left: 4px solid var(--brass);
203
Removed:
background: var(--paper-raised);
204
Removed:
border-radius: var(--radius);
205
Removed:
padding: 1.25rem;
206
Removed:
}
207
Removed:
.feature h3 {
208
Removed:
margin: 0 0 0.5rem;
209
Removed:
font: 700 var(--font-size-lead)/1.25 var(--sans);
210
Removed:
}
211
Removed:
.feature p {
212
Removed:
margin: 0;
213
Removed:
color: var(--muted-ink);
214
Removed:
}
215
Removed:
216
Removed:
/* Screenshot slots: captioned placeholders, ready for images later. */
217
Removed:
.shots {
218
Removed:
display: grid;
219
Removed:
grid-template-columns: repeat(auto-fit, minmax(18rem, 1fr));
220
Removed:
gap: 1rem;
221
Removed:
}
222
Removed:
.shot {
223
Removed:
margin: 0;
224
Removed:
border: 1px solid var(--rule);
225
Removed:
background: var(--paper-raised);
226
Removed:
border-radius: var(--radius);
227
Removed:
overflow: hidden;
228
Removed:
}
229
Removed:
.shot img {
230
Removed:
display: block;
231
Removed:
width: 100%;
232
Removed:
height: auto;
233
Removed:
}
234
Removed:
.shot .placeholder {
235
Removed:
display: flex;
236
Removed:
align-items: center;
237
Removed:
justify-content: center;
238
Removed:
aspect-ratio: 16 / 10;
239
Removed:
color: var(--muted-ink);
240
Removed:
background: repeating-linear-gradient(
241
Removed:
45deg,
242
Removed:
#efe7d6,
243
Removed:
#efe7d6 10px,
244
Removed:
var(--paper-raised) 10px,
245
Removed:
var(--paper-raised) 20px
246
Removed:
);
247
Removed:
font: 700 var(--font-size-small)/1.35 var(--mono);
248
Removed:
letter-spacing: 0.06em;
249
Removed:
text-transform: uppercase;
250
Removed:
}
251
Removed:
.shot figcaption {
252
Removed:
padding: 0.75rem 1rem;
253
Removed:
color: var(--muted-ink);
254
Removed:
font-size: var(--font-size-small);
255
Removed:
border-top: 1px solid var(--rule);
256
Removed:
}
257
Removed:
258
Removed:
/* Closing call to action. */
259
Removed:
.cta-band {
260
Removed:
margin-top: 3rem;
261
Removed:
border: 1px solid var(--rule-strong);
262
Removed:
border-top: 6px solid var(--evergreen);
263
Removed:
background: var(--evergreen-wash);
264
Removed:
border-radius: var(--radius);
265
Removed:
padding: clamp(1.5rem, 4vw, 2.5rem);
266
Removed:
text-align: center;
267
Removed:
}
268
Removed:
.cta-band h2 {
269
Removed:
margin: 0 0 0.5rem;
270
Removed:
font: 800 var(--font-size-heading)/1.1 var(--sans);
271
Removed:
}
272
Removed:
.cta-band p {
273
Removed:
margin: 0 0 1.5rem;
274
Removed:
color: var(--muted-ink);
275
Removed:
}
276
Removed:
277
Removed:
/* Footer. */
278
Removed:
.site-footer {
279
Removed:
margin-top: 3rem;
280
Removed:
padding-top: 1.5rem;
281
Removed:
border-top: 1px solid var(--rule);
282
Removed:
color: var(--muted-ink);
283
Removed:
font-size: var(--font-size-small);
284
Removed:
}
285
Removed:
286
Removed:
@media (prefers-reduced-motion: reduce) {
287
Removed:
* { scroll-behavior: auto; }
288
Removed:
}
site/index.html
@@ -1,108 +0,0 @@
1
Removed:
<!DOCTYPE html>
2
Removed:
<html lang="en">
3
Removed:
<head>
4
Removed:
<title>hito — a high-intensity training tracker</title>
5
Removed:
<meta charset="utf-8" />
6
Removed:
<meta name="viewport" content="width=device-width,initial-scale=1" />
7
Removed:
<meta
8
Removed:
name="description"
9
Removed:
content="hito is a training tracker for brief, infrequent, high-intensity workouts. It records what happened and shows your progress, without pushing you to do more."
10
Removed:
/>
11
Removed:
<link rel="stylesheet" href="assets/site.css" />
12
Removed:
</head>
13
Removed:
<body>
14
Removed:
<div class="shell">
15
Removed:
<header class="masthead">
16
Removed:
<a class="brand" href="/">hito</a>
17
Removed:
<a class="masthead-cta" href="https://app.hito.mlnp.fr">Open the app</a>
18
Removed:
</header>
19
Removed:
20
Removed:
<main>
21
Removed:
<section class="hero">
22
Removed:
<p class="eyebrow">High-intensity training</p>
23
Removed:
<h1>Train hard. Train brief. Grow.</h1>
24
Removed:
<p class="lead">
25
Removed:
hito is a training tracker for people who lift with high intensity.
26
Removed:
It keeps your sessions short and infrequent, records exactly what
27
Removed:
you did, and shows your progress — one more rep, a little more
28
Removed:
weight. It never asks you to do more than the work that grows you.
29
Removed:
</p>
30
Removed:
<div class="hero-actions">
31
Removed:
<a class="button-primary" href="https://app.hito.mlnp.fr">Open the app</a>
32
Removed:
<a class="button-secondary" href="#principles">See the method</a>
33
Removed:
</div>
34
Removed:
</section>
35
Removed:
36
Removed:
<section class="section" id="principles">
37
Removed:
<h2>Built around four principles</h2>
38
Removed:
<div class="feature-grid">
39
Removed:
<article class="feature">
40
Removed:
<h3>Intensity, not volume</h3>
41
Removed:
<p>
42
Removed:
A working set runs to the point where one more rep is not
43
Removed:
possible. That effort is what signals growth. hito treats the
44
Removed:
set as complete at that point — not at a rep count.
45
Removed:
</p>
46
Removed:
</article>
47
Removed:
<article class="feature">
48
Removed:
<h3>Recovery comes first</h3>
49
Removed:
<p>
50
Removed:
The gym stimulates growth; rest produces it. hito tracks
51
Removed:
recovery between sessions, so a hard workout gates the next one
52
Removed:
and you train again only when you are ready.
53
Removed:
</p>
54
Removed:
</article>
55
Removed:
<article class="feature">
56
Removed:
<h3>The minimum that works</h3>
57
Removed:
<p>
58
Removed:
More sets are not more progress. hito favours the smallest
59
Removed:
effective dose and flags rising volume as a warning to watch,
60
Removed:
never a target to chase.
61
Removed:
</p>
62
Removed:
</article>
63
Removed:
<article class="feature">
64
Removed:
<h3>Progress you can see</h3>
65
Removed:
<p>
66
Removed:
Progress is a clear signal: more reps, more weight, or both.
67
Removed:
hito reads your logbook and shows the trend, so each session
68
Removed:
has a plain measure of whether you moved forward.
69
Removed:
</p>
70
Removed:
</article>
71
Removed:
</div>
72
Removed:
</section>
73
Removed:
74
Removed:
<section class="section" id="screenshots">
75
Removed:
<h2>A look inside</h2>
76
Removed:
<div class="shots">
77
Removed:
<figure class="shot">
78
Removed:
<div class="placeholder">Screenshot</div>
79
Removed:
<figcaption>Your routine — the exercises and the load for the next session.</figcaption>
80
Removed:
</figure>
81
Removed:
<figure class="shot">
82
Removed:
<div class="placeholder">Screenshot</div>
83
Removed:
<figcaption>The workout in progress — log each set as you take it to failure.</figcaption>
84
Removed:
</figure>
85
Removed:
<figure class="shot">
86
Removed:
<div class="placeholder">Screenshot</div>
87
Removed:
<figcaption>The logbook — every session recorded, with the progress trend.</figcaption>
88
Removed:
</figure>
89
Removed:
</div>
90
Removed:
</section>
91
Removed:
92
Removed:
<section class="cta-band">
93
Removed:
<h2>Start your logbook</h2>
94
Removed:
<p>Brief, infrequent, intense. hito keeps the record so you can focus on the work.</p>
95
Removed:
<a class="button-primary" href="https://app.hito.mlnp.fr">Open the app</a>
96
Removed:
</section>
97
Removed:
</main>
98
Removed:
99
Removed:
<footer class="site-footer">
100
Removed:
<p>
101
Removed:
hito is a personal training tracker. Its method is inspired by Mike
102
Removed:
Mentzer's approach to high-intensity training. It is not medical or
103
Removed:
fitness advice; train within your own limits.
104
Removed:
</p>
105
Removed:
</footer>
106
Removed:
</div>
107
Removed:
</body>
108
Removed:
</html>