mr601s commited on
Commit
f1a2901
·
verified ·
1 Parent(s): 114223e

You are a site generator. Create a static, single-page course site with hash-based routing (e.g., /#/lesson/1) and a left sidebar “content ladder.” Do not upload large media into the repo; embed videos and link docs by URL. Keep the bundle lightweight (plain HTML/CSS/JS is fine).

Browse files

Brand & Layout

Title/brand (top left of sidebar): Client Journey Mastery — Module 1

Left sidebar lists lessons 01–05. Active lesson shows highlighted state.

Main pane shows: H1 title → video player → “Download Worksheet” button(s) → Next/Prev buttons.

Theme: dark, clean, high contrast, large readable text, mobile friendly.

Store a “viewed” status per lesson in localStorage and show a ✅ in the sidebar for lessons the user has opened.

Behavior

Routing: single page app with hash routes: /#/lesson/1…/#/lesson/5, plus /#/resources.

Videos: each lesson embeds a Google Drive preview (iframe) using the /preview URL format.

Docs: open worksheet links in a new tab (target="_blank").

Prev/Next buttons move between lessons. On the last lesson, “Next” is disabled.

Optional access code: scaffold a simple access code check (front-end only). If ACCESS_CODE is empty, skip the gate.

Data (use exactly these titles, videos, and documents)

Note: Convert each “file/view” Drive link to /preview for the iframe source.
Pattern: https://drive.google.com/file/d/FILE_ID/preview

Module title: Fat Loss Fundamentals (Module 1)

Lessons (01–05):

Basal Metabolic Rate & Energy Expenditure
Video (Drive preview): https://drive.google.com/file/d/10kpjrXhvW91Ea2z4Z6Onu9NfiU2EIlWa/preview

Worksheet: https://docs.google.com/document/d/1-AaCUxmN-vp5rrmdhctpm2-0YfkkP2ytuYJDz39eoYA/edit?usp=drive_link

Why Do We Gain Fat?
Video (Drive preview): https://drive.google.com/file/d/1Y103LdQxY2QnUEavk91XK6ec15mR0iPp/preview

Worksheet: https://docs.google.com/document/d/1nuZcMARA8P1cnbASn_tgOqasA8GLQ1rAROs3TgXQlbU/edit?usp=drive_link

How Do We Lose Fat?
Video (Drive preview): https://drive.google.com/file/d/1GeN_yq_ol9jEUUvGySxodtAvi9_6d-Kr/preview

Worksheet: https://docs.google.com/document/d/1FLkHVFVAnH9lbIa_s1haaX8NnCqAcla9b7wvyzm7mBY/edit?usp=drive_link

Fat-Loss Exercise
Video (Drive preview): https://drive.google.com/file/d/1HM2S5LpXZ5_7dqeM_Osa3z1moxLyFLuU/preview

Worksheet: https://docs.google.com/document/d/1GLJ11aNGHGDFRltm3RpXVBNLtDD44RsupFeEh6lzR_4/edit?usp=drive_link

What Hinders Fat Loss
Video (Drive preview): https://drive.google.com/file/d/1YhhE0UIACQOPf0lzF1NevQj-W9142eIq/preview

Worksheet: https://docs.google.com/document/d/1l1DL2KOUqq2GXAyB2COaUwF7s_UIhWnlzw9qb37COA8/edit?usp=drive_link

Additional resources page (add to bottom of sidebar as “Resources”):

Resource A: https://docs.google.com/document/d/1rT_sQEOkcQqUXEzcIK7jBmK_yN0ZaqSxS7s1fFSghdc/edit?usp=drive_link

Resource B: https://docs.google.com/document/d/1RKctMkeo3XzEeuXeISGByOPZFGrwPQ0LBuwN5SlXzFs/edit?usp=drive_link

Implementation Notes

Data source: hardcode a small JS object like:

const ACCESS_CODE = ""; // set non-empty to enable gate
const LESSONS = [
{ n:1, title:"Basal Metabolic Rate & Energy Expenditure",
video:"https://drive.google.com/file/d/10kpjrXhvW91Ea2z4Z6Onu9NfiU2EIlWa/preview",
docs:[{label:"Worksheet", url:"https://docs.google.com/document/d/1-AaCUxmN-vp5rrmdhctpm2-0YfkkP2ytuYJDz39eoYA/edit?usp=drive_link"}]
},
{ n:2, title:"Why Do We Gain Fat?",
video:"https://drive.google.com/file/d/1Y103LdQxY2QnUEavk91XK6ec15mR0iPp/preview",
docs:[{label:"Worksheet", url:"https://docs.google.com/document/d/1nuZcMARA8P1cnbASn_tgOqasA8GLQ1rAROs3TgXQlbU/edit?usp=drive_link"}]
},
{ n:3, title:"How Do We Lose Fat?",
video:"https://drive.google.com/file/d/1GeN_yq_ol9jEUUvGySxodtAvi9_6d-Kr/preview",
docs:[{label:"Worksheet", url:"https://docs.google.com/document/d/1FLkHVFVAnH9lbIa_s1haaX8NnCqAcla9b7wvyzm7mBY/edit?usp=drive_link"}]
},
{ n:4, title:"Fat-Loss Exercise",
video:"https://drive.google.com/file/d/1HM2S5LpXZ5_7dqeM_Osa3z1moxLyFLuU/preview",
docs:[{label:"Worksheet", url:"https://docs.google.com/document/d/1GLJ11aNGHGDFRltm3RpXVBNLtDD44RsupFeEh6lzR_4/edit?usp=drive_link"}]
},
{ n:5, title:"What Hinders Fat Loss",
video:"https://drive.google.com/file/d/1YhhE0UIACQOPf0lzF1NevQj-W9142eIq/preview",
docs:[{label:"Worksheet", url:"https://docs.google.com/document/d/1l1DL2KOUqq2GXAyB2COaUwF7s_UIhWnlzw9qb37COA8/edit?usp=drive_link"}]
},
];
const EXTRA_DOCS = [
{label:"Resource A", url:"https://docs.google.com/document/d/1rT_sQEOkcQqUXEzcIK7jBmK_yN0ZaqSxS7s1fFSghdc/edit?usp=drive_link"},
{label:"Resource B", url:"https://docs.google.com/document/d/1RKctMkeo3XzEeuXeISGByOPZFGrwPQ0LBuwN5SlXzFs/edit?usp=drive_link"},
];


Video embed: use <iframe src=".../preview" allow="autoplay; fullscreen" allowfullscreen></iframe>.

Progress ticks: when a lesson route is opened, set localStorage.setItem('m1_viewed_'+n, '1'). On render, show ✅ for any lesson with this flag.

Accessibility: keyboard focus styles, sufficient color contrast, and aria-current="page" on the active lesson link.

Deliverables

A single static site (index.html + CSS + JS) or a Hugging Face Space (Static) project with the above behavior.

Clear README with instructions to change ACCESS_CODE and how to add Module 2 later by extending the same data structure. - Initial Deployment

Files changed (3) hide show
  1. README.md +7 -5
  2. index.html +376 -18
  3. prompts.txt +110 -0
README.md CHANGED
@@ -1,10 +1,12 @@
1
  ---
2
- title: Plantedinnutrition
3
- emoji: 🦀
4
- colorFrom: blue
5
- colorTo: purple
6
  sdk: static
7
  pinned: false
 
 
8
  ---
9
 
10
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
1
  ---
2
+ title: plantedinnutrition
3
+ emoji: 🐳
4
+ colorFrom: green
5
+ colorTo: blue
6
  sdk: static
7
  pinned: false
8
+ tags:
9
+ - deepsite
10
  ---
11
 
12
+ Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
index.html CHANGED
@@ -1,19 +1,377 @@
1
- <!doctype html>
2
- <html>
3
- <head>
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width" />
6
- <title>My static Space</title>
7
- <link rel="stylesheet" href="style.css" />
8
- </head>
9
- <body>
10
- <div class="card">
11
- <h1>Welcome to your static Space!</h1>
12
- <p>You can modify this app directly by editing <i>index.html</i> in the Files and versions tab.</p>
13
- <p>
14
- Also don't forget to check the
15
- <a href="https://huggingface.co/docs/hub/spaces" target="_blank">Spaces documentation</a>.
16
- </p>
17
- </div>
18
- </body>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19
  </html>
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Client Journey Mastery — Module 1</title>
7
+ <script src="https://cdn.tailwindcss.com"></script>
8
+ <script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
9
+ <style>
10
+ :root {
11
+ --primary: #3b82f6;
12
+ --primary-dark: #2563eb;
13
+ --bg-dark: #0f172a;
14
+ --bg-light: #1e293b;
15
+ --text-light: #f8fafc;
16
+ }
17
+ body {
18
+ @apply bg-[var(--bg-dark)] text-[var(--text-light)] min-h-screen;
19
+ font-family: 'Inter', sans-serif;
20
+ }
21
+ .sidebar {
22
+ scrollbar-width: thin;
23
+ scrollbar-color: var(--bg-light) var(--bg-dark);
24
+ }
25
+ .sidebar::-webkit-scrollbar {
26
+ width: 6px;
27
+ }
28
+ .sidebar::-webkit-scrollbar-track {
29
+ background: var(--bg-dark);
30
+ }
31
+ .sidebar::-webkit-scrollbar-thumb {
32
+ background-color: var(--bg-light);
33
+ border-radius: 3px;
34
+ }
35
+ .video-container {
36
+ aspect-ratio: 16/9;
37
+ }
38
+ .lesson-link.active {
39
+ @apply bg-[var(--bg-light)] border-l-4 border-[var(--primary)];
40
+ }
41
+ .lesson-link:hover:not(.active) {
42
+ @apply bg-[var(--bg-light)] bg-opacity-50;
43
+ }
44
+ .btn-primary {
45
+ @apply bg-[var(--primary)] hover:bg-[var(--primary-dark)] text-white font-medium py-2 px-4 rounded transition;
46
+ }
47
+ .btn-outline {
48
+ @apply border border-[var(--primary)] text-[var(--primary)] hover:bg-[var(--primary)] hover:text-white font-medium py-2 px-4 rounded transition;
49
+ }
50
+ .btn-disabled {
51
+ @apply bg-gray-600 text-gray-400 cursor-not-allowed font-medium py-2 px-4 rounded;
52
+ }
53
+ .access-code-input {
54
+ @apply bg-[var(--bg-light)] border border-gray-600 rounded px-4 py-2 text-white focus:outline-none focus:ring-2 focus:ring-[var(--primary)];
55
+ }
56
+ </style>
57
+ </head>
58
+ <body class="flex flex-col md:flex-row">
59
+ <!-- Sidebar -->
60
+ <div class="sidebar w-full md:w-64 bg-[var(--bg-dark)] border-r border-gray-800 h-screen overflow-y-auto fixed md:static">
61
+ <div class="p-4 border-b border-gray-800">
62
+ <h1 class="text-xl font-bold">Client Journey Mastery</h1>
63
+ <p class="text-sm text-gray-400">Module 1: Fat Loss Fundamentals</p>
64
+ </div>
65
+ <nav class="p-2">
66
+ <ul class="space-y-1" id="lessons-list">
67
+ <!-- Lessons will be populated by JS -->
68
+ </ul>
69
+ <div class="mt-8 p-2">
70
+ <a href="#/resources" class="flex items-center text-gray-400 hover:text-white transition">
71
+ <i data-feather="book" class="w-5 h-5 mr-2"></i>
72
+ <span>Resources</span>
73
+ </a>
74
+ </div>
75
+ </nav>
76
+ </div>
77
+
78
+ <!-- Main Content -->
79
+ <main class="flex-1 md:ml-64 p-4 md:p-8" id="main-content">
80
+ <!-- Access Code Gate (if enabled) -->
81
+ <div id="access-gate" class="max-w-md mx-auto mt-20 p-8 bg-[var(--bg-light)] rounded-lg shadow-lg hidden">
82
+ <h2 class="text-2xl font-bold mb-6 text-center">Enter Access Code</h2>
83
+ <div class="space-y-4">
84
+ <input type="password" id="access-code-input" placeholder="Enter access code" class="access-code-input w-full">
85
+ <button id="submit-code" class="btn-primary w-full">Continue</button>
86
+ </div>
87
+ <p id="code-error" class="text-red-400 text-sm mt-2 hidden">Invalid access code</p>
88
+ </div>
89
+
90
+ <!-- Lesson Content -->
91
+ <div id="lesson-content" class="max-w-4xl mx-auto hidden">
92
+ <h1 id="lesson-title" class="text-3xl font-bold mb-6"></h1>
93
+
94
+ <div class="video-container mb-8 bg-black rounded-lg overflow-hidden">
95
+ <iframe id="lesson-video" class="w-full h-full" frameborder="0" allowfullscreen></iframe>
96
+ </div>
97
+
98
+ <div id="lesson-docs" class="mb-8 space-y-2">
99
+ <!-- Worksheets will be populated by JS -->
100
+ </div>
101
+
102
+ <div class="flex justify-between mt-8">
103
+ <button id="prev-lesson" class="btn-outline">Previous</button>
104
+ <button id="next-lesson" class="btn-primary">Next</button>
105
+ </div>
106
+ </div>
107
+
108
+ <!-- Resources Content -->
109
+ <div id="resources-content" class="max-w-4xl mx-auto hidden">
110
+ <h1 class="text-3xl font-bold mb-6">Additional Resources</h1>
111
+ <div id="resources-list" class="space-y-4">
112
+ <!-- Resources will be populated by JS -->
113
+ </div>
114
+ </div>
115
+ </main>
116
+
117
+ <script>
118
+ // Data
119
+ const ACCESS_CODE = ""; // set non-empty to enable gate
120
+ const LESSONS = [
121
+ {
122
+ n:1,
123
+ title:"Basal Metabolic Rate & Energy Expenditure",
124
+ video:"https://drive.google.com/file/d/10kpjrXhvW91Ea2z4Z6Onu9NfiU2EIlWa/preview",
125
+ docs:[{label:"Worksheet", url:"https://docs.google.com/document/d/1-AaCUxmN-vp5rrmdhctpm2-0YfkkP2ytuYJDz39eoYA/edit?usp=drive_link"}]
126
+ },
127
+ {
128
+ n:2,
129
+ title:"Why Do We Gain Fat?",
130
+ video:"https://drive.google.com/file/d/1Y103LdQxY2QnUEavk91XK6ec15mR0iPp/preview",
131
+ docs:[{label:"Worksheet", url:"https://docs.google.com/document/d/1nuZcMARA8P1cnbASn_tgOqasA8GLQ1rAROs3TgXQlbU/edit?usp=drive_link"}]
132
+ },
133
+ {
134
+ n:3,
135
+ title:"How Do We Lose Fat?",
136
+ video:"https://drive.google.com/file/d/1GeN_yq_ol9jEUUvGySxodtAvi9_6d-Kr/preview",
137
+ docs:[{label:"Worksheet", url:"https://docs.google.com/document/d/1FLkHVFVAnH9lbIa_s1haaX8NnCqAcla9b7wvyzm7mBY/edit?usp=drive_link"}]
138
+ },
139
+ {
140
+ n:4,
141
+ title:"Fat-Loss Exercise",
142
+ video:"https://drive.google.com/file/d/1HM2S5LpXZ5_7dqeM_Osa3z1moxLyFLuU/preview",
143
+ docs:[{label:"Worksheet", url:"https://docs.google.com/document/d/1GLJ11aNGHGDFRltm3RpXVBNLtDD44RsupFeEh6lzR_4/edit?usp=drive_link"}]
144
+ },
145
+ {
146
+ n:5,
147
+ title:"What Hinders Fat Loss",
148
+ video:"https://drive.google.com/file/d/1YhhE0UIACQOPf0lzF1NevQj-W9142eIq/preview",
149
+ docs:[{label:"Worksheet", url:"https://docs.google.com/document/d/1l1DL2KOUqq2GXAyB2COaUwF7s_UIhWnlzw9qb37COA8/edit?usp=drive_link"}]
150
+ },
151
+ ];
152
+ const EXTRA_DOCS = [
153
+ {label:"Resource A", url:"https://docs.google.com/document/d/1rT_sQEOkcQqUXEzcIK7jBmK_yN0ZaqSxS7s1fFSghdc/edit?usp=drive_link"},
154
+ {label:"Resource B", url:"https://docs.google.com/document/d/1RKctMkeo3XzEeuXeISGByOPZFGrwPQ0LBuwN5SlXzFs/edit?usp=drive_link"},
155
+ ];
156
+
157
+ // DOM Elements
158
+ const lessonsList = document.getElementById('lessons-list');
159
+ const mainContent = document.getElementById('main-content');
160
+ const lessonContent = document.getElementById('lesson-content');
161
+ const resourcesContent = document.getElementById('resources-content');
162
+ const accessGate = document.getElementById('access-gate');
163
+ const lessonTitle = document.getElementById('lesson-title');
164
+ const lessonVideo = document.getElementById('lesson-video');
165
+ const lessonDocs = document.getElementById('lesson-docs');
166
+ const resourcesList = document.getElementById('resources-list');
167
+ const prevLessonBtn = document.getElementById('prev-lesson');
168
+ const nextLessonBtn = document.getElementById('next-lesson');
169
+ const accessCodeInput = document.getElementById('access-code-input');
170
+ const submitCodeBtn = document.getElementById('submit-code');
171
+ const codeError = document.getElementById('code-error');
172
+
173
+ // State
174
+ let currentLesson = 1;
175
+
176
+ // Initialize
177
+ function init() {
178
+ renderLessonsList();
179
+
180
+ if (ACCESS_CODE) {
181
+ showAccessGate();
182
+ } else {
183
+ handleRouting();
184
+ }
185
+
186
+ window.addEventListener('hashchange', handleRouting);
187
+ prevLessonBtn.addEventListener('click', goToPrevLesson);
188
+ nextLessonBtn.addEventListener('click', goToNextLesson);
189
+ submitCodeBtn.addEventListener('click', checkAccessCode);
190
+
191
+ feather.replace();
192
+ }
193
+
194
+ // Show access code gate
195
+ function showAccessGate() {
196
+ accessGate.classList.remove('hidden');
197
+ lessonContent.classList.add('hidden');
198
+ resourcesContent.classList.add('hidden');
199
+ }
200
+
201
+ // Check access code
202
+ function checkAccessCode() {
203
+ if (accessCodeInput.value === ACCESS_CODE) {
204
+ accessGate.classList.add('hidden');
205
+ handleRouting();
206
+ } else {
207
+ codeError.classList.remove('hidden');
208
+ }
209
+ }
210
+
211
+ // Handle routing
212
+ function handleRouting() {
213
+ const hash = window.location.hash;
214
+
215
+ if (hash.startsWith('#/lesson/')) {
216
+ const lessonNum = parseInt(hash.split('/')[2]);
217
+ if (lessonNum >= 1 && lessonNum <= LESSONS.length) {
218
+ showLesson(lessonNum);
219
+ } else {
220
+ showLesson(1);
221
+ }
222
+ } else if (hash === '#/resources') {
223
+ showResources();
224
+ } else {
225
+ showLesson(1);
226
+ }
227
+ }
228
+
229
+ // Show lesson
230
+ function showLesson(lessonNum) {
231
+ currentLesson = lessonNum;
232
+ const lesson = LESSONS[lessonNum - 1];
233
+
234
+ // Update URL
235
+ window.location.hash = `/lesson/${lessonNum}`;
236
+
237
+ // Mark as viewed
238
+ localStorage.setItem(`m1_viewed_${lessonNum}`, '1');
239
+ updateLessonStatus(lessonNum);
240
+
241
+ // Update UI
242
+ lessonTitle.textContent = `${lessonNum.toString().padStart(2, '0')}. ${lesson.title}`;
243
+ lessonVideo.src = lesson.video;
244
+
245
+ // Render worksheets
246
+ lessonDocs.innerHTML = '';
247
+ lesson.docs.forEach(doc => {
248
+ const docElement = document.createElement('a');
249
+ docElement.href = doc.url;
250
+ docElement.target = "_blank";
251
+ docElement.className = "inline-flex items-center btn-outline mr-2 mb-2";
252
+ docElement.innerHTML = `<i data-feather="download" class="w-4 h-4 mr-2"></i>${doc.label}`;
253
+ lessonDocs.appendChild(docElement);
254
+ });
255
+
256
+ // Update navigation buttons
257
+ prevLessonBtn.disabled = lessonNum === 1;
258
+ nextLessonBtn.disabled = lessonNum === LESSONS.length;
259
+
260
+ if (lessonNum === 1) {
261
+ prevLessonBtn.className = "btn-disabled";
262
+ } else {
263
+ prevLessonBtn.className = "btn-outline";
264
+ }
265
+
266
+ if (lessonNum === LESSONS.length) {
267
+ nextLessonBtn.className = "btn-disabled";
268
+ } else {
269
+ nextLessonBtn.className = "btn-primary";
270
+ }
271
+
272
+ // Show content
273
+ lessonContent.classList.remove('hidden');
274
+ resourcesContent.classList.add('hidden');
275
+
276
+ feather.replace();
277
+ }
278
+
279
+ // Show resources
280
+ function showResources() {
281
+ window.location.hash = '/resources';
282
+
283
+ // Render resources
284
+ resourcesList.innerHTML = '';
285
+ EXTRA_DOCS.forEach(doc => {
286
+ const docElement = document.createElement('a');
287
+ docElement.href = doc.url;
288
+ docElement.target = "_blank";
289
+ docElement.className = "flex items-center p-4 bg-[var(--bg-light)] rounded-lg hover:bg-opacity-80 transition";
290
+ docElement.innerHTML = `
291
+ <div class="bg-[var(--primary)] bg-opacity-10 p-3 rounded-full mr-4">
292
+ <i data-feather="file-text" class="text-[var(--primary)]"></i>
293
+ </div>
294
+ <div>
295
+ <h3 class="font-medium">${doc.label}</h3>
296
+ <p class="text-sm text-gray-400">Google Document</p>
297
+ </div>
298
+ <div class="ml-auto">
299
+ <i data-feather="external-link" class="text-gray-400"></i>
300
+ </div>
301
+ `;
302
+ resourcesList.appendChild(docElement);
303
+ });
304
+
305
+ // Show content
306
+ lessonContent.classList.add('hidden');
307
+ resourcesContent.classList.remove('hidden');
308
+
309
+ feather.replace();
310
+ }
311
+
312
+ // Navigation functions
313
+ function goToPrevLesson() {
314
+ if (currentLesson > 1) {
315
+ showLesson(currentLesson - 1);
316
+ }
317
+ }
318
+
319
+ function goToNextLesson() {
320
+ if (currentLesson < LESSONS.length) {
321
+ showLesson(currentLesson + 1);
322
+ }
323
+ }
324
+
325
+ // Render lessons list
326
+ function renderLessonsList() {
327
+ lessonsList.innerHTML = '';
328
+
329
+ LESSONS.forEach(lesson => {
330
+ const viewed = localStorage.getItem(`m1_viewed_${lesson.n}`);
331
+
332
+ const li = document.createElement('li');
333
+ li.innerHTML = `
334
+ <a href="#/lesson/${lesson.n}"
335
+ class="lesson-link flex items-center p-3 rounded-md ${window.location.hash === `#/lesson/${lesson.n}` ? 'active' : ''}"
336
+ ${window.location.hash === `#/lesson/${lesson.n}` ? 'aria-current="page"' : ''}>
337
+ <span class="text-gray-400 w-6">${lesson.n.toString().padStart(2, '0')}</span>
338
+ <span class="flex-1">${lesson.title}</span>
339
+ ${viewed ? '<i data-feather="check" class="text-green-400 w-4 h-4"></i>' : ''}
340
+ </a>
341
+ `;
342
+
343
+ lessonsList.appendChild(li);
344
+ });
345
+
346
+ feather.replace();
347
+ }
348
+
349
+ // Update lesson status in sidebar
350
+ function updateLessonStatus(lessonNum) {
351
+ const lessonLinks = document.querySelectorAll('.lesson-link');
352
+ lessonLinks.forEach(link => {
353
+ link.classList.remove('active');
354
+ link.removeAttribute('aria-current');
355
+
356
+ if (link.getAttribute('href') === `#/lesson/${lessonNum}`) {
357
+ link.classList.add('active');
358
+ link.setAttribute('aria-current', 'page');
359
+
360
+ // Add checkmark if not already present
361
+ if (!link.querySelector('i[data-feather="check"]')) {
362
+ const checkIcon = document.createElement('i');
363
+ checkIcon.setAttribute('data-feather', 'check');
364
+ checkIcon.className = 'text-green-400 w-4 h-4';
365
+ link.appendChild(checkIcon);
366
+ }
367
+ }
368
+ });
369
+
370
+ feather.replace();
371
+ }
372
+
373
+ // Initialize the app
374
+ init();
375
+ </script>
376
+ </body>
377
  </html>
prompts.txt ADDED
@@ -0,0 +1,110 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ You are a site generator. Create a static, single-page course site with hash-based routing (e.g., /#/lesson/1) and a left sidebar “content ladder.” Do not upload large media into the repo; embed videos and link docs by URL. Keep the bundle lightweight (plain HTML/CSS/JS is fine).
2
+
3
+ Brand & Layout
4
+
5
+ Title/brand (top left of sidebar): Client Journey Mastery — Module 1
6
+
7
+ Left sidebar lists lessons 01–05. Active lesson shows highlighted state.
8
+
9
+ Main pane shows: H1 title → video player → “Download Worksheet” button(s) → Next/Prev buttons.
10
+
11
+ Theme: dark, clean, high contrast, large readable text, mobile friendly.
12
+
13
+ Store a “viewed” status per lesson in localStorage and show a ✅ in the sidebar for lessons the user has opened.
14
+
15
+ Behavior
16
+
17
+ Routing: single page app with hash routes: /#/lesson/1…/#/lesson/5, plus /#/resources.
18
+
19
+ Videos: each lesson embeds a Google Drive preview (iframe) using the /preview URL format.
20
+
21
+ Docs: open worksheet links in a new tab (target="_blank").
22
+
23
+ Prev/Next buttons move between lessons. On the last lesson, “Next” is disabled.
24
+
25
+ Optional access code: scaffold a simple access code check (front-end only). If ACCESS_CODE is empty, skip the gate.
26
+
27
+ Data (use exactly these titles, videos, and documents)
28
+
29
+ Note: Convert each “file/view” Drive link to /preview for the iframe source.
30
+ Pattern: https://drive.google.com/file/d/FILE_ID/preview
31
+
32
+ Module title: Fat Loss Fundamentals (Module 1)
33
+
34
+ Lessons (01–05):
35
+
36
+ Basal Metabolic Rate & Energy Expenditure
37
+ Video (Drive preview): https://drive.google.com/file/d/10kpjrXhvW91Ea2z4Z6Onu9NfiU2EIlWa/preview
38
+
39
+ Worksheet: https://docs.google.com/document/d/1-AaCUxmN-vp5rrmdhctpm2-0YfkkP2ytuYJDz39eoYA/edit?usp=drive_link
40
+
41
+ Why Do We Gain Fat?
42
+ Video (Drive preview): https://drive.google.com/file/d/1Y103LdQxY2QnUEavk91XK6ec15mR0iPp/preview
43
+
44
+ Worksheet: https://docs.google.com/document/d/1nuZcMARA8P1cnbASn_tgOqasA8GLQ1rAROs3TgXQlbU/edit?usp=drive_link
45
+
46
+ How Do We Lose Fat?
47
+ Video (Drive preview): https://drive.google.com/file/d/1GeN_yq_ol9jEUUvGySxodtAvi9_6d-Kr/preview
48
+
49
+ Worksheet: https://docs.google.com/document/d/1FLkHVFVAnH9lbIa_s1haaX8NnCqAcla9b7wvyzm7mBY/edit?usp=drive_link
50
+
51
+ Fat-Loss Exercise
52
+ Video (Drive preview): https://drive.google.com/file/d/1HM2S5LpXZ5_7dqeM_Osa3z1moxLyFLuU/preview
53
+
54
+ Worksheet: https://docs.google.com/document/d/1GLJ11aNGHGDFRltm3RpXVBNLtDD44RsupFeEh6lzR_4/edit?usp=drive_link
55
+
56
+ What Hinders Fat Loss
57
+ Video (Drive preview): https://drive.google.com/file/d/1YhhE0UIACQOPf0lzF1NevQj-W9142eIq/preview
58
+
59
+ Worksheet: https://docs.google.com/document/d/1l1DL2KOUqq2GXAyB2COaUwF7s_UIhWnlzw9qb37COA8/edit?usp=drive_link
60
+
61
+ Additional resources page (add to bottom of sidebar as “Resources”):
62
+
63
+ Resource A: https://docs.google.com/document/d/1rT_sQEOkcQqUXEzcIK7jBmK_yN0ZaqSxS7s1fFSghdc/edit?usp=drive_link
64
+
65
+ Resource B: https://docs.google.com/document/d/1RKctMkeo3XzEeuXeISGByOPZFGrwPQ0LBuwN5SlXzFs/edit?usp=drive_link
66
+
67
+ Implementation Notes
68
+
69
+ Data source: hardcode a small JS object like:
70
+
71
+ const ACCESS_CODE = ""; // set non-empty to enable gate
72
+ const LESSONS = [
73
+ { n:1, title:"Basal Metabolic Rate & Energy Expenditure",
74
+ video:"https://drive.google.com/file/d/10kpjrXhvW91Ea2z4Z6Onu9NfiU2EIlWa/preview",
75
+ docs:[{label:"Worksheet", url:"https://docs.google.com/document/d/1-AaCUxmN-vp5rrmdhctpm2-0YfkkP2ytuYJDz39eoYA/edit?usp=drive_link"}]
76
+ },
77
+ { n:2, title:"Why Do We Gain Fat?",
78
+ video:"https://drive.google.com/file/d/1Y103LdQxY2QnUEavk91XK6ec15mR0iPp/preview",
79
+ docs:[{label:"Worksheet", url:"https://docs.google.com/document/d/1nuZcMARA8P1cnbASn_tgOqasA8GLQ1rAROs3TgXQlbU/edit?usp=drive_link"}]
80
+ },
81
+ { n:3, title:"How Do We Lose Fat?",
82
+ video:"https://drive.google.com/file/d/1GeN_yq_ol9jEUUvGySxodtAvi9_6d-Kr/preview",
83
+ docs:[{label:"Worksheet", url:"https://docs.google.com/document/d/1FLkHVFVAnH9lbIa_s1haaX8NnCqAcla9b7wvyzm7mBY/edit?usp=drive_link"}]
84
+ },
85
+ { n:4, title:"Fat-Loss Exercise",
86
+ video:"https://drive.google.com/file/d/1HM2S5LpXZ5_7dqeM_Osa3z1moxLyFLuU/preview",
87
+ docs:[{label:"Worksheet", url:"https://docs.google.com/document/d/1GLJ11aNGHGDFRltm3RpXVBNLtDD44RsupFeEh6lzR_4/edit?usp=drive_link"}]
88
+ },
89
+ { n:5, title:"What Hinders Fat Loss",
90
+ video:"https://drive.google.com/file/d/1YhhE0UIACQOPf0lzF1NevQj-W9142eIq/preview",
91
+ docs:[{label:"Worksheet", url:"https://docs.google.com/document/d/1l1DL2KOUqq2GXAyB2COaUwF7s_UIhWnlzw9qb37COA8/edit?usp=drive_link"}]
92
+ },
93
+ ];
94
+ const EXTRA_DOCS = [
95
+ {label:"Resource A", url:"https://docs.google.com/document/d/1rT_sQEOkcQqUXEzcIK7jBmK_yN0ZaqSxS7s1fFSghdc/edit?usp=drive_link"},
96
+ {label:"Resource B", url:"https://docs.google.com/document/d/1RKctMkeo3XzEeuXeISGByOPZFGrwPQ0LBuwN5SlXzFs/edit?usp=drive_link"},
97
+ ];
98
+
99
+
100
+ Video embed: use <iframe src=".../preview" allow="autoplay; fullscreen" allowfullscreen></iframe>.
101
+
102
+ Progress ticks: when a lesson route is opened, set localStorage.setItem('m1_viewed_'+n, '1'). On render, show ✅ for any lesson with this flag.
103
+
104
+ Accessibility: keyboard focus styles, sufficient color contrast, and aria-current="page" on the active lesson link.
105
+
106
+ Deliverables
107
+
108
+ A single static site (index.html + CSS + JS) or a Hugging Face Space (Static) project with the above behavior.
109
+
110
+ Clear README with instructions to change ACCESS_CODE and how to add Module 2 later by extending the same data structure.