KairosEtp commited on
Commit
dfbfae0
·
verified ·
1 Parent(s): c3710ff

Create an online course landing page with course overview, curriculum breakdown with expandable modules, instructor credentials, student testimonials with videos, pricing and enrollment options, FAQ section, and money-back guarantee badge.

Browse files
Files changed (4) hide show
  1. README.md +7 -4
  2. index.html +694 -19
  3. script.js +147 -0
  4. style.css +81 -18
README.md CHANGED
@@ -1,10 +1,13 @@
1
  ---
2
  title: Course Landing
3
- emoji: 💻
4
- colorFrom: yellow
5
- colorTo: green
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: Course Landing
3
+ colorFrom: green
4
+ colorTo: gray
5
+ emoji: 🐳
6
  sdk: static
7
  pinned: false
8
+ tags:
9
+ - deepsite-v3
10
  ---
11
 
12
+ # Welcome to your new DeepSite project!
13
+ This project was created with [DeepSite](https://huggingface.co/deepsite).
index.html CHANGED
@@ -1,19 +1,694 @@
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" />
6
+ <title>Modern Web Development Bootcamp — Course Landing</title>
7
+ <meta name="description" content="Master modern web development with hands-on projects, real-world mentorship, and lifetime access. Enroll now with our 14-day money-back guarantee." />
8
+ <meta property="og:title" content="Modern Web Development Bootcamp" />
9
+ <meta property="og:description" content="Learn full-stack web development with hands-on projects, real-world mentorship, and lifetime access." />
10
+ <meta property="og:type" content="website" />
11
+ <meta property="og:image" content="https://images.unsplash.com/photo-1515879218367-8466d910aaa4?q=80&w=1200&auto=format&fit=crop" />
12
+ <link rel="preconnect" href="https://unpkg.com" />
13
+ <link rel="preconnect" href="https://cdn.tailwindcss.com" />
14
+ <link rel="stylesheet" href="style.css" />
15
+ <script src="https://cdn.tailwindcss.com"></script>
16
+ <script>
17
+ tailwind.config = {
18
+ theme: {
19
+ extend: {
20
+ colors: {
21
+ primary: {
22
+ 50: 'rgb(var(--primary-50) / <alpha-value>)',
23
+ 100: 'rgb(var(--primary-100) / <alpha-value>)',
24
+ 200: 'rgb(var(--primary-200) / <alpha-value>)',
25
+ 300: 'rgb(var(--primary-300) / <alpha-value>)',
26
+ 400: 'rgb(var(--primary-400) / <alpha-value>)',
27
+ 500: 'rgb(var(--primary-500) / <alpha-value>)',
28
+ 600: 'rgb(var(--primary-600) / <alpha-value>)',
29
+ 700: 'rgb(var(--primary-700) / <alpha-value>)',
30
+ 800: 'rgb(var(--primary-800) / <alpha-value>)',
31
+ 900: 'rgb(var(--primary-900) / <alpha-value>)',
32
+ },
33
+ secondary: {
34
+ 50: 'rgb(var(--secondary-50) / <alpha-value>)',
35
+ 100: 'rgb(var(--secondary-100) / <alpha-value>)',
36
+ 200: 'rgb(var(--secondary-200) / <alpha-value>)',
37
+ 300: 'rgb(var(--secondary-300) / <alpha-value>)',
38
+ 400: 'rgb(var(--secondary-400) / <alpha-value>)',
39
+ 500: 'rgb(var(--secondary-500) / <alpha-value>)',
40
+ 600: 'rgb(var(--secondary-600) / <alpha-value>)',
41
+ 700: 'rgb(var(--secondary-700) / <alpha-value>)',
42
+ 800: 'rgb(var(--secondary-800) / <alpha-value>)',
43
+ 900: 'rgb(var(--secondary-900) / <alpha-value>)',
44
+ },
45
+ }
46
+ }
47
+ }
48
+ }
49
+ </script>
50
+ </head>
51
+ <body class="bg-white text-gray-800 antialiased">
52
+ <!-- Header -->
53
+ <header class="fixed inset-x-0 top-0 z-40 border-b border-gray-100 bg-white/80 backdrop-blur">
54
+ <div class="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
55
+ <div class="flex h-16 items-center justify-between">
56
+ <a href="#" class="flex items-center gap-2">
57
+ <span class="inline-flex h-8 w-8 items-center justify-center rounded-lg bg-primary-500 text-white">
58
+ <i data-feather="book-open"></i>
59
+ </span>
60
+ <span class="font-semibold tracking-tight">Web Dev Bootcamp</span>
61
+ </a>
62
+ <nav class="hidden items-center gap-8 md:flex">
63
+ <a href="#overview" class="text-sm font-medium text-gray-700 hover:text-gray-900">Overview</a>
64
+ <a href="#curriculum" class="text-sm font-medium text-gray-700 hover:text-gray-900">Curriculum</a>
65
+ <a href="#instructor" class="text-sm font-medium text-gray-700 hover:text-gray-900">Instructor</a>
66
+ <a href="#testimonials" class="text-sm font-medium text-gray-700 hover:text-gray-900">Testimonials</a>
67
+ <a href="#pricing" class="text-sm font-medium text-gray-700 hover:text-gray-900">Pricing</a>
68
+ <a href="#faq" class="text-sm font-medium text-gray-700 hover:text-gray-900">FAQ</a>
69
+ </nav>
70
+ <div class="flex items-center gap-3">
71
+ <a href="#pricing" class="rounded-lg bg-primary-500 px-4 py-2 text-sm font-semibold text-white shadow hover:bg-primary-600 focus:outline-none focus:ring-2 focus:ring-primary-400">
72
+ Enroll Now
73
+ </a>
74
+ <button id="menuToggle" class="rounded-lg p-2 text-gray-700 hover:bg-gray-100 md:hidden" aria-label="Open menu">
75
+ <i data-feather="menu"></i>
76
+ </button>
77
+ </div>
78
+ </div>
79
+ <div id="mobileMenu" class="hidden border-t border-gray-100 pb-4 pt-2 md:hidden">
80
+ <nav class="flex flex-col gap-2">
81
+ <a href="#overview" class="rounded-lg px-2 py-2 text-sm font-medium hover:bg-gray-100">Overview</a>
82
+ <a href="#curriculum" class="rounded-lg px-2 py-2 text-sm font-medium hover:bg-gray-100">Curriculum</a>
83
+ <a href="#instructor" class="rounded-lg px-2 py-2 text-sm font-medium hover:bg-gray-100">Instructor</a>
84
+ <a href="#testimonials" class="rounded-lg px-2 py-2 text-sm font-medium hover:bg-gray-100">Testimonials</a>
85
+ <a href="#pricing" class="rounded-lg px-2 py-2 text-sm font-medium hover:bg-gray-100">Pricing</a>
86
+ <a href="#faq" class="rounded-lg px-2 py-2 text-sm font-medium hover:bg-gray-100">FAQ</a>
87
+ </nav>
88
+ </div>
89
+ </div>
90
+ </header>
91
+
92
+ <!-- Hero -->
93
+ <section id="overview" class="relative mt-16 overflow-hidden bg-gradient-to-b from-primary-50 to-white">
94
+ <div class="absolute right-0 top-0 -z-10 h-64 w-64 translate-x-1/3 -translate-y-1/3 rounded-full bg-primary-200/50 blur-3xl"></div>
95
+ <div class="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
96
+ <div class="grid grid-cols-1 items-center gap-10 py-16 lg:grid-cols-2">
97
+ <div>
98
+ <div class="inline-flex items-center gap-2 rounded-full border border-primary-200 bg-white/80 px-3 py-1 text-xs font-medium text-primary-700 shadow-sm">
99
+ <i data-feather="shield"></i>
100
+ 14-day money-back guarantee
101
+ </div>
102
+ <h1 class="mt-4 text-4xl font-extrabold tracking-tight text-gray-900 sm:text-5xl">
103
+ Modern Web Development Bootcamp
104
+ </h1>
105
+ <p class="mt-4 max-w-prose text-lg text-gray-700">
106
+ Build job‑ready skills in HTML, CSS, JavaScript, React, Node.js, databases, and deployment. Learn by building 7 real projects with mentor feedback and lifetime access.
107
+ </p>
108
+ <ul class="mt-6 flex flex-wrap gap-4 text-sm text-gray-700">
109
+ <li class="inline-flex items-center gap-2">
110
+ <i data-feather="check-circle" class="text-primary-500"></i> 120+ lessons • 40+ hours
111
+ </li>
112
+ <li class="inline-flex items-center gap-2">
113
+ <i data-feather="check-circle" class="text-primary-500"></i> 7 capstone projects
114
+ </li>
115
+ <li class="inline-flex items-center gap-2">
116
+ <i data-feather="check-circle" class="text-primary-500"></i> Certificate of completion
117
+ </li>
118
+ </ul>
119
+ <div class="mt-8 flex flex-wrap items-center gap-3">
120
+ <a href="#pricing" class="inline-flex items-center rounded-lg bg-primary-500 px-5 py-3 text-sm font-semibold text-white shadow hover:bg-primary-600 focus:outline-none focus:ring-2 focus:ring-primary-400">
121
+ <i data-feather="zap"></i>
122
+ <span class="ml-2">Enroll Now</span>
123
+ </a>
124
+ <a href="assets/syllabus.pdf" target="_blank" class="inline-flex items-center rounded-lg border border-gray-300 bg-white px-5 py-3 text-sm font-semibold text-gray-800 hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-primary-400">
125
+ <i data-feather="download-cloud"></i>
126
+ <span class="ml-2">Download Syllabus</span>
127
+ </a>
128
+ </div>
129
+ <p class="mt-3 text-xs text-gray-500">No risk. Full refund within 14 days.</p>
130
+ </div>
131
+ <div class="relative">
132
+ <div class="absolute -inset-6 -z-10 rounded-2xl bg-primary-100/60 blur-2xl"></div>
133
+ <div class="aspect-video overflow-hidden rounded-2xl border border-gray-200 bg-gray-900 shadow-xl">
134
+ <iframe class="h-full w-full" src="https://www.youtube.com/embed/ysz5S6PUM-U" title="Course trailer" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
135
+ </div>
136
+ <p class="mt-2 text-center text-xs text-gray-500">Preview the course</p>
137
+ </div>
138
+ </div>
139
+ </div>
140
+ </section>
141
+
142
+ <!-- Curriculum -->
143
+ <section id="curriculum" class="py-16">
144
+ <div class="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
145
+ <div class="flex items-end justify-between gap-6">
146
+ <div>
147
+ <h2 class="text-3xl font-bold tracking-tight text-gray-900">Curriculum</h2>
148
+ <p class="mt-2 max-w-2xl text-gray-700">Expand each module to see the lessons and projects you’ll build.</p>
149
+ </div>
150
+ <button id="expandAll" class="hidden rounded-lg border border-gray-300 bg-white px-3 py-2 text-sm font-medium text-gray-800 hover:bg-gray-50 md:inline-flex">
151
+ <i data-feather="plus-square"></i>
152
+ <span class="ml-2">Expand All</span>
153
+ </button>
154
+ </div>
155
+
156
+ <div class="mt-6 space-y-4">
157
+ <div class="module border border-gray-200 rounded-xl bg-white">
158
+ <button class="module-toggle flex w-full items-center justify-between p-5 text-left" aria-expanded="false">
159
+ <div class="flex items-center gap-3">
160
+ <span class="flex h-8 w-8 items-center justify-center rounded bg-primary-100 text-primary-700">1</span>
161
+ <div>
162
+ <h3 class="font-semibold text-gray-900">Web Foundations: HTML & CSS</h3>
163
+ <p class="text-sm text-gray-600">Semantic HTML, modern CSS, Flexbox & Grid</p>
164
+ </div>
165
+ </div>
166
+ <i data-feather="chevron-down" class="module-icon h-5 w-5 text-gray-500 transition-transform"></i>
167
+ </button>
168
+ <div class="module-content hidden border-t border-gray-100 p-5">
169
+ <ul class="grid gap-3 sm:grid-cols-2">
170
+ <li class="flex items-start gap-3">
171
+ <i data-feather="play-circle" class="mt-0.5 h-4 w-4 text-primary-500"></i>
172
+ <div>
173
+ <p class="font-medium text-gray-900">Semantic Structure</p>
174
+ <p class="text-sm text-gray-600">Accessibility-first HTML elements</p>
175
+ </div>
176
+ </li>
177
+ <li class="flex items-start gap-3">
178
+ <i data-feather="play-circle" class="mt-0.5 h-4 w-4 text-primary-500"></i>
179
+ <div>
180
+ <p class="font-medium text-gray-900">Modern CSS Layouts</p>
181
+ <p class="text-sm text-gray-600">Flexbox, Grid, and responsive design</p>
182
+ </div>
183
+ </li>
184
+ <li class="flex items-start gap-3">
185
+ <i data-feather="tool" class="mt-0.5 h-4 w-4 text-primary-500"></i>
186
+ <div>
187
+ <p class="font-medium text-gray-900">Project: Portfolio Site</p>
188
+ <p class="text-sm text-gray-600">Responsive portfolio with a11y best practices</p>
189
+ </div>
190
+ </li>
191
+ </ul>
192
+ </div>
193
+ </div>
194
+
195
+ <div class="module border border-gray-200 rounded-xl bg-white">
196
+ <button class="module-toggle flex w-full items-center justify-between p-5 text-left" aria-expanded="false">
197
+ <div class="flex items-center gap-3">
198
+ <span class="flex h-8 w-8 items-center justify-center rounded bg-primary-100 text-primary-700">2</span>
199
+ <div>
200
+ <h3 class="font-semibold text-gray-900">JavaScript Essentials</h3>
201
+ <p class="text-sm text-gray-600">ES6+, DOM, async JS, APIs</p>
202
+ </div>
203
+ </div>
204
+ <i data-feather="chevron-down" class="module-icon h-5 w-5 text-gray-500 transition-transform"></i>
205
+ </button>
206
+ <div class="module-content hidden border-t border-gray-100 p-5">
207
+ <ul class="grid gap-3 sm:grid-cols-2">
208
+ <li class="flex items-start gap-3">
209
+ <i data-feather="play-circle" class="mt-0.5 h-4 w-4 text-primary-500"></i>
210
+ <div>
211
+ <p class="font-medium text-gray-900">Core Syntax & Patterns</p>
212
+ <p class="text-sm text-gray-600">Modules, destructuring, and promises</p>
213
+ </div>
214
+ </li>
215
+ <li class="flex items-start gap-3">
216
+ <i data-feather="play-circle" class="mt-0.5 h-4 w-4 text-primary-500"></i>
217
+ <div>
218
+ <p class="font-medium text-gray-900">DOM & Events</p>
219
+ <p class="text-sm text-gray-600">Building interactive UIs</p>
220
+ </div>
221
+ </li>
222
+ <li class="flex items-start gap-3">
223
+ <i data-feather="tool" class="mt-0.5 h-4 w-4 text-primary-500"></i>
224
+ <div>
225
+ <p class="font-medium text-gray-900">Project: SPA To‑Do App</p>
226
+ <p class="text-sm text-gray-600">Local storage, routing, and filtering</p>
227
+ </div>
228
+ </li>
229
+ </ul>
230
+ </div>
231
+ </div>
232
+
233
+ <div class="module border border-gray-200 rounded-xl bg-white">
234
+ <button class="module-toggle flex w-full items-center justify-between p-5 text-left" aria-expanded="false">
235
+ <div class="flex items-center gap-3">
236
+ <span class="flex h-8 w-8 items-center justify-center rounded bg-primary-100 text-primary-700">3</span>
237
+ <div>
238
+ <h3 class="font-semibold text-gray-900">Frontend Frameworks: React</h3>
239
+ <p class="text-sm text-gray-600">Hooks, routing, state management</p>
240
+ </div>
241
+ </div>
242
+ <i data-feather="chevron-down" class="module-icon h-5 w-5 text-gray-500 transition-transform"></i>
243
+ </button>
244
+ <div class="module-content hidden border-t border-gray-100 p-5">
245
+ <ul class="grid gap-3 sm:grid-cols-2">
246
+ <li class="flex items-start gap-3">
247
+ <i data-feather="play-circle" class="mt-0.5 h-4 w-4 text-primary-500"></i>
248
+ <div>
249
+ <p class="font-medium text-gray-900">React Fundamentals</p>
250
+ <p class="text-sm text-gray-600">Components, props, state, effects</p>
251
+ </div>
252
+ </li>
253
+ <li class="flex items-start gap-3">
254
+ <i data-feather="play-circle" class="mt-0.5 h-4 w-4 text-primary-500"></i>
255
+ <div>
256
+ <p class="font-medium text-gray-900">Routing & Forms</p>
257
+ <p class="text-sm text-gray-600">React Router and controlled inputs</p>
258
+ </div>
259
+ </li>
260
+ <li class="flex items-start gap-3">
261
+ <i data-feather="tool" class="mt-0.5 h-4 w-4 text-primary-500"></i>
262
+ <div>
263
+ <p class="font-medium text-gray-900">Project: E‑commerce UI</p>
264
+ <p class="text-sm text-gray-600">Product listing, cart, and checkout</p>
265
+ </div>
266
+ </li>
267
+ </ul>
268
+ </div>
269
+ </div>
270
+
271
+ <div class="module border border-gray-200 rounded-xl bg-white">
272
+ <button class="module-toggle flex w-full items-center justify-between p-5 text-left" aria-expanded="false">
273
+ <div class="flex items-center gap-3">
274
+ <span class="flex h-8 w-8 items-center justify-center rounded bg-primary-100 text-primary-700">4</span>
275
+ <div>
276
+ <h3 class="font-semibold text-gray-900">Backend with Node & Express</h3>
277
+ <p class="text-sm text-gray-600">REST APIs, auth, middleware</p>
278
+ </div>
279
+ </div>
280
+ <i data-feather="chevron-down" class="module-icon h-5 w-5 text-gray-500 transition-transform"></i>
281
+ </button>
282
+ <div class="module-content hidden border-t border-gray-100 p-5">
283
+ <ul class="grid gap-3 sm:grid-cols-2">
284
+ <li class="flex items-start gap-3">
285
+ <i data-feather="play-circle" class="mt-0.5 h-4 w-4 text-primary-500"></i>
286
+ <div>
287
+ <p class="font-medium text-gray-900">REST APIs</p>
288
+ <p class="text-sm text-gray-600">Routes, controllers, and validation</p>
289
+ </div>
290
+ </li>
291
+ <li class="flex items-start gap-3">
292
+ <i data-feather="play-circle" class="mt-0.5 h-4 w-4 text-primary-500"></i>
293
+ <div>
294
+ <p class="font-medium text-gray-900">Authentication</p>
295
+ <p class="text-sm text-gray-600">JWT, sessions, and secure flows</p>
296
+ </div>
297
+ </li>
298
+ <li class="flex items-start gap-3">
299
+ <i data-feather="tool" class="mt-0.5 h-4 w-4 text-primary-500"></i>
300
+ <div>
301
+ <p class="font-medium text-gray-900">Project: API + Dashboard</p>
302
+ <p class="text-sm text-gray-600">Protected routes and admin panel</p>
303
+ </div>
304
+ </li>
305
+ </ul>
306
+ </div>
307
+ </div>
308
+
309
+ <div class="module border border-gray-200 rounded-xl bg-white">
310
+ <button class="module-toggle flex w-full items-center justify-between p-5 text-left" aria-expanded="false">
311
+ <div class="flex items-center gap-3">
312
+ <span class="flex h-8 w-8 items-center justify-center rounded bg-primary-100 text-primary-700">5</span>
313
+ <div>
314
+ <h3 class="font-semibold text-gray-900">Databases & ORM</h3>
315
+ <p class="text-sm text-gray-600">SQL, Prisma, migrations</p>
316
+ </div>
317
+ </div>
318
+ <i data-feather="chevron-down" class="module-icon h-5 w-5 text-gray-500 transition-transform"></i>
319
+ </button>
320
+ <div class="module-content hidden border-t border-gray-100 p-5">
321
+ <ul class="grid gap-3 sm:grid-cols-2">
322
+ <li class="flex items-start gap-3">
323
+ <i data-feather="play-circle" class="mt-0.5 h-4 w-4 text-primary-500"></i>
324
+ <div>
325
+ <p class="font-medium text-gray-900">SQL Basics</p>
326
+ <p class="text-sm text-gray-600">Relationships and indexing</p>
327
+ </div>
328
+ </li>
329
+ <li class="flex items-start gap-3">
330
+ <i data-feather="play-circle" class="mt-0.5 h-4 w-4 text-primary-500"></i>
331
+ <div>
332
+ <p class="font-medium text-gray-900">Prisma ORM</p>
333
+ <p class="text-sm text-gray-600">Schema, queries, and migrations</p>
334
+ </div>
335
+ </li>
336
+ <li class="flex items-start gap-3">
337
+ <i data-feather="tool" class="mt-0.5 h-4 w-4 text-primary-500"></i>
338
+ <div>
339
+ <p class="font-medium text-gray-900">Project: Data‑rich App</p>
340
+ <p class="text-sm text-gray-600">Reports and filters with joins</p>
341
+ </div>
342
+ </li>
343
+ </ul>
344
+ </div>
345
+ </div>
346
+
347
+ <div class="module border border-gray-200 rounded-xl bg-white">
348
+ <button class="module-toggle flex w-full items-center justify-between p-5 text-left" aria-expanded="false">
349
+ <div class="flex items-center gap-3">
350
+ <span class="flex h-8 w-8 items-center justify-center rounded bg-primary-100 text-primary-700">6</span>
351
+ <div>
352
+ <h3 class="font-semibold text-gray-900">Testing & Quality</h3>
353
+ <p class="text-sm text-gray-600">Jest, RTL, linting, CI</p>
354
+ </div>
355
+ </div>
356
+ <i data-feather="chevron-down" class="module-icon h-5 w-5 text-gray-500 transition-transform"></i>
357
+ </button>
358
+ <div class="module-content hidden border-t border-gray-100 p-5">
359
+ <ul class="grid gap-3 sm:grid-cols-2">
360
+ <li class="flex items-start gap-3">
361
+ <i data-feather="play-circle" class="mt-0.5 h-4 w-4 text-primary-500"></i>
362
+ <div>
363
+ <p class="font-medium text-gray-900">Unit & Integration Tests</p>
364
+ <p class="text-sm text-gray-600">Jest and React Testing Library</p>
365
+ </div>
366
+ </li>
367
+ <li class="flex items-start gap-3">
368
+ <i data-feather="play-circle" class="mt-0.5 h-4 w-4 text-primary-500"></i>
369
+ <div>
370
+ <p class="font-medium text-gray-900">E2E Tests</p>
371
+ <p class="text-sm text-gray-600">Playwright basics</p>
372
+ </div>
373
+ </li>
374
+ <li class="flex items-start gap-3">
375
+ <i data-feather="tool" class="mt-0.5 h-4 w-4 text-primary-500"></i>
376
+ <div>
377
+ <p class="font-medium text-gray-900">Project: Add Full Test Suite</p>
378
+ <p class="text-sm text-gray-600">Coverage and CI pipeline</p>
379
+ </div>
380
+ </li>
381
+ </ul>
382
+ </div>
383
+ </div>
384
+
385
+ <div class="module border border-gray-200 rounded-xl bg-white">
386
+ <button class="module-toggle flex w-full items-center justify-between p-5 text-left" aria-expanded="false">
387
+ <div class="flex items-center gap-3">
388
+ <span class="flex h-8 w-8 items-center justify-center rounded bg-primary-100 text-primary-700">7</span>
389
+ <div>
390
+ <h3 class="font-semibold text-gray-900">DevOps & Deployment</h3>
391
+ <p class="text-sm text-gray-600">Docker, CI/CD, cloud hosting</p>
392
+ </div>
393
+ </div>
394
+ <i data-feather="chevron-down" class="module-icon h-5 w-5 text-gray-500 transition-transform"></i>
395
+ </button>
396
+ <div class="module-content hidden border-t border-gray-100 p-5">
397
+ <ul class="grid gap-3 sm:grid-cols-2">
398
+ <li class="flex items-start gap-3">
399
+ <i data-feather="play-circle" class="mt-0.5 h-4 w-4 text-primary-500"></i>
400
+ <div>
401
+ <p class="font-medium text-gray-900">Docker & Containers</p>
402
+ <p class="text-sm text-gray-600">Images, Compose, and best practices</p>
403
+ </div>
404
+ </li>
405
+ <li class="flex items-start gap-3">
406
+ <i data-feather="play-circle" class="mt-0.5 h-4 w-4 text-primary-500"></i>
407
+ <div>
408
+ <p class="font-medium text-gray-900">Deploy to Cloud</p>
409
+ <p class="text-sm text-gray-600">Static hosting and serverless</p>
410
+ </div>
411
+ </li>
412
+ <li class="flex items-start gap-3">
413
+ <i data-feather="tool" class="mt-0.5 h-4 w-4 text-primary-500"></i>
414
+ <div>
415
+ <p class="font-medium text-gray-900">Capstone: Launch Your App</p>
416
+ <p class="text-sm text-gray-600">End‑to‑end deployment pipeline</p>
417
+ </div>
418
+ </li>
419
+ </ul>
420
+ </div>
421
+ </div>
422
+ </div>
423
+ </div>
424
+ </section>
425
+
426
+ <!-- Instructor -->
427
+ <section id="instructor" class="bg-gray-50 py-16">
428
+ <div class="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
429
+ <div class="grid grid-cols-1 items-center gap-10 lg:grid-cols-2">
430
+ <div>
431
+ <img src="https://images.unsplash.com/photo-1607746882042-944635dfe10e?q=80&w=800&auto=format&fit=crop" alt="Instructor headshot" class="h-64 w-64 rounded-full object-cover shadow-lg ring-4 ring-white" />
432
+ </div>
433
+ <div>
434
+ <h2 class="text-3xl font-bold tracking-tight text-gray-900">Meet Your Instructor</h2>
435
+ <p class="mt-2 text-lg text-gray-700"><strong>Alex Rivera</strong> — Senior Full‑Stack Engineer</p>
436
+ <ul class="mt-4 space-y-2 text-gray-700">
437
+ <li class="flex items-start gap-3">
438
+ <i data-feather="award" class="mt-0.5 h-4 w-4 text-primary-500"></i>
439
+ <span>10+ years building products for startups and enterprises</span>
440
+ </li>
441
+ <li class="flex items-start gap-3">
442
+ <i data-feather="briefcase" class="mt-0.5 h-4 w-4 text-primary-500"></i>
443
+ <span>Previously led frontend at a Series B SaaS company</span>
444
+ </li>
445
+ <li class="flex items-start gap-3">
446
+ <i data-feather="book" class="mt-0.5 h-4 w-4 text-primary-500"></i>
447
+ <span>Mentored 1,200+ developers transitioning to web dev roles</span>
448
+ </li>
449
+ </ul>
450
+ <div class="mt-6 flex gap-3">
451
+ <a href="#" class="inline-flex items-center rounded-lg border border-gray-300 bg-white px-4 py-2 text-sm font-medium text-gray-800 hover:bg-gray-50">
452
+ <i data-feather="linkedin"></i>
453
+ <span class="ml-2">LinkedIn</span>
454
+ </a>
455
+ <a href="#" class="inline-flex items-center rounded-lg border border-gray-300 bg-white px-4 py-2 text-sm font-medium text-gray-800 hover:bg-gray-50">
456
+ <i data-feather="twitter"></i>
457
+ <span class="ml-2">Twitter</span>
458
+ </a>
459
+ </div>
460
+ </div>
461
+ </div>
462
+ </div>
463
+ </section>
464
+
465
+ <!-- Testimonials -->
466
+ <section id="testimonials" class="py-16">
467
+ <div class="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
468
+ <div class="mx-auto max-w-3xl text-center">
469
+ <h2 class="text-3xl font-bold tracking-tight text-gray-900">What Students Say</h2>
470
+ <p class="mt-2 text-gray-700">Real results from our community.</p>
471
+ </div>
472
+
473
+ <div class="mt-10 grid gap-6 sm:grid-cols-2 lg:grid-cols-3">
474
+ <div class="video-card group relative overflow-hidden rounded-xl border border-gray-200 bg-white shadow-sm">
475
+ <div class="relative aspect-video bg-gray-100">
476
+ <iframe class="h-full w-full" src="https://www.youtube.com/embed/WhWc3b3KhnY" title="Student testimonial 1" allowfullscreen></iframe>
477
+ <div class="absolute inset-0 bg-black/20 opacity-0 transition-opacity group-hover:opacity-100"></div>
478
+ </div>
479
+ <div class="p-4">
480
+ <div class="flex items-center gap-3">
481
+ <img src="https://images.unsplash.com/photo-1544005313-94ddf0286df2?q=80&w=200&auto=format&fit=crop" alt="Sarah K." class="h-10 w-10 rounded-full object-cover" />
482
+ <div>
483
+ <p class="font-semibold text-gray-900">Sarah K.</p>
484
+ <p class="text-sm text-gray-600">Landed a junior dev role in 5 weeks</p>
485
+ </div>
486
+ </div>
487
+ </div>
488
+ </div>
489
+
490
+ <div class="video-card group relative overflow-hidden rounded-xl border border-gray-200 bg-white shadow-sm">
491
+ <div class="relative aspect-video bg-gray-100">
492
+ <iframe class="h-full w-full" src="https://www.youtube.com/embed/3PHXvlpOkf4" title="Student testimonial 2" allowfullscreen></iframe>
493
+ <div class="absolute inset-0 bg-black/20 opacity-0 transition-opacity group-hover:opacity-100"></div>
494
+ </div>
495
+ <div class="p-4">
496
+ <div class="flex items-center gap-3">
497
+ <img src="https://images.unsplash.com/photo-1547425260-76bcadfb4f2c?q=80&w=200&auto=format&fit=crop" alt="David M." class="h-10 w-10 rounded-full object-cover" />
498
+ <div>
499
+ <p class="font-semibold text-gray-900">David M.</p>
500
+ <p class="text-sm text-gray-600">Built a production SaaS MVP</p>
501
+ </div>
502
+ </div>
503
+ </div>
504
+ </div>
505
+
506
+ <div class="video-card group relative overflow-hidden rounded-xl border border-gray-200 bg-white shadow-sm">
507
+ <div class="relative aspect-video bg-gray-100">
508
+ <iframe class="h-full w-full" src="https://www.youtube.com/embed/6YbH8r0Z3fU" title="Student testimonial 3" allowfullscreen></iframe>
509
+ <div class="absolute inset-0 bg-black/20 opacity-0 transition-opacity group-hover:opacity-100"></div>
510
+ </div>
511
+ <div class="p-4">
512
+ <div class="flex items-center gap-3">
513
+ <img src="https://images.unsplash.com/photo-1556157382-97eda2d62296?q=80&w=200&auto=format&fit=crop" alt="Leila P." class="h-10 w-10 rounded-full object-cover" />
514
+ <div>
515
+ <p class="font-semibold text-gray-900">Leila P.</p>
516
+ <p class="text-sm text-gray-600">Mentorship made all the difference</p>
517
+ </div>
518
+ </div>
519
+ </div>
520
+ </div>
521
+ </div>
522
+ </div>
523
+ </section>
524
+
525
+ <!-- Pricing -->
526
+ <section id="pricing" class="bg-gray-50 py-16">
527
+ <div class="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
528
+ <div class="mx-auto max-w-3xl text-center">
529
+ <h2 class="text-3xl font-bold tracking-tight text-gray-900">Pricing</h2>
530
+ <p class="mt-2 text-gray-700">Choose a plan that fits your goals. 14‑day money‑back guarantee.</p>
531
+ </div>
532
+
533
+ <div class="mt-10 grid gap-6 lg:grid-cols-3">
534
+ <div class="rounded-2xl border border-gray-200 bg-white p-6 shadow-sm">
535
+ <h3 class="text-lg font-semibold text-gray-900">Starter</h3>
536
+ <p class="mt-1 text-sm text-gray-600">Self‑paced access to core content.</p>
537
+ <div class="mt-6 flex items-baseline gap-1">
538
+ <span class="text-3xl font-extrabold text-gray-900">$199</span>
539
+ <span class="text-sm text-gray-600">one‑time</span>
540
+ </div>
541
+ <ul class="mt-4 space-y-2 text-sm text-gray-700">
542
+ <li class="flex items-start gap-2">
543
+ <i data-feather="check" class="mt-0.5 h-4 w-4 text-primary-500"></i>
544
+ <span>All videos and lessons</span>
545
+ </li>
546
+ <li class="flex items-start gap-2">
547
+ <i data-feather="check" class="mt-0.5 h-4 w-4 text-primary-500"></i>
548
+ <span>Downloadable resources</span>
549
+ </li>
550
+ <li class="flex items-start gap-2">
551
+ <i data-feather="check" class="mt-0.5 h-4 w-4 text-primary-500"></i>
552
+ <span>Community access</span>
553
+ </li>
554
+ </ul>
555
+ <a href="#" class="mt-6 block w-full rounded-lg border border-gray-300 bg-white px-4 py-2 text-center text-sm font-semibold text-gray-800 hover:bg-gray-50">Enroll</a>
556
+ <p class="mt-3 text-center text-xs text-gray-500">14‑day refund policy</p>
557
+ </div>
558
+
559
+ <div class="rounded-2xl border-2 border-primary-500 bg-white p-6 shadow-lg ring-1 ring-primary-400 relative">
560
+ <div class="absolute -top-3 right-4 rounded-full bg-primary-500 px-3 py-1 text-xs font-semibold text-white">Most Popular</div>
561
+ <h3 class="text-lg font-semibold text-gray-900">Pro</h3>
562
+ <p class="mt-1 text-sm text-gray-600">Everything in Starter, plus mentor feedback.</p>
563
+ <div class="mt-6 flex items-baseline gap-1">
564
+ <span class="text-3xl font-extrabold text-gray-900">$399</span>
565
+ <span class="text-sm text-gray-600">one‑time</span>
566
+ </div>
567
+ <ul class="mt-4 space-y-2 text-sm text-gray-700">
568
+ <li class="flex items-start gap-2">
569
+ <i data-feather="check" class="mt-0.5 h-4 w-4 text-primary-500"></i>
570
+ <span>Project reviews and feedback</span>
571
+ </li>
572
+ <li class="flex items-start gap-2">
573
+ <i data-feather="check" class="mt-0.5 h-4 w-4 text-primary-500"></i>
574
+ <span>Private mentor Q&A sessions</span>
575
+ </li>
576
+ <li class="flex items-start gap-2">
577
+ <i data-feather="check" class="mt-0.5 h-4 w-4 text-primary-500"></i>
578
+ <span>Certificate of completion</span>
579
+ </li>
580
+ </ul>
581
+ <a href="#" class="mt-6 block w-full rounded-lg bg-primary-500 px-4 py-2 text-center text-sm font-semibold text-white shadow hover:bg-primary-600">Enroll Pro</a>
582
+ <p class="mt-3 text-center text-xs text-gray-500">14‑day refund policy</p>
583
+ </div>
584
+
585
+ <div class="rounded-2xl border border-gray-200 bg-white p-6 shadow-sm">
586
+ <h3 class="text-lg font-semibold text-gray-900">Team</h3>
587
+ <p class="mt-1 text-sm text-gray-600">Upskill your team with cohort tracking.</p>
588
+ <div class="mt-6 flex items-baseline gap-1">
589
+ <span class="text-3xl font-extrabold text-gray-900">$999</span>
590
+ <span class="text-sm text-gray-600">up to 10 seats</span>
591
+ </div>
592
+ <ul class="mt-4 space-y-2 text-sm text-gray-700">
593
+ <li class="flex items-start gap-2">
594
+ <i data-feather="check" class="mt-0.5 h-4 w-4 text-primary-500"></i>
595
+ <span>Team dashboard and progress</span>
596
+ </li>
597
+ <li class="flex items-start gap-2">
598
+ <i data-feather="check" class="mt-0.5 h-4 w-4 text-primary-500"></i>
599
+ <span>Group mentor sessions</span>
600
+ </li>
601
+ <li class="flex items-start gap-2">
602
+ <i data-feather="check" class="mt-0.5 h-4 w-4 text-primary-500"></i>
603
+ <span>Priority support</span>
604
+ </li>
605
+ </ul>
606
+ <a href="mailto:team@example.com?subject=Web%20Dev%20Bootcamp%20Team%20Plan" class="mt-6 block w-full rounded-lg border border-gray-300 bg-white px-4 py-2 text-center text-sm font-semibold text-gray-800 hover:bg-gray-50">Contact Sales</a>
607
+ <p class="mt-3 text-center text-xs text-gray-500">Custom invoicing available</p>
608
+ </div>
609
+ </div>
610
+
611
+ <div class="mt-8 flex justify-center">
612
+ <div class="inline-flex items-center gap-2 rounded-full border border-primary-200 bg-white px-4 py-2 text-sm font-medium text-primary-700 shadow-sm">
613
+ <i data-feather="shield"></i>
614
+ <span>14‑day money‑back guarantee</span>
615
+ </div>
616
+ </div>
617
+ </div>
618
+ </section>
619
+
620
+ <!-- FAQ -->
621
+ <section id="faq" class="py-16">
622
+ <div class="mx-auto max-w-4xl px-4 sm:px-6 lg:px-8">
623
+ <h2 class="text-3xl font-bold tracking-tight text-gray-900">Frequently Asked Questions</h2>
624
+ <div class="mt-6 divide-y divide-gray-200 overflow-hidden rounded-xl border border-gray-200 bg-white">
625
+ <details class="faq-item group p-5">
626
+ <summary class="flex cursor-pointer list-none items-center justify-between">
627
+ <span class="font-medium text-gray-900">Do I need prior experience?</span>
628
+ <i data-feather="plus" class="h-5 w-5 text-gray-500 transition-transform group-open:rotate-45"></i>
629
+ </summary>
630
+ <div class="mt-3 text-gray-700">
631
+ No. We start from the basics and ramp up to advanced topics. However, familiarity with computers is recommended.
632
+ </div>
633
+ </details>
634
+
635
+ <details class="faq-item group p-5">
636
+ <summary class="flex cursor-pointer list-none items-center justify-between">
637
+ <span class="font-medium text-gray-900">How long do I have access?</span>
638
+ <i data-feather="plus" class="h-5 w-5 text-gray-500 transition-transform group-open:rotate-45"></i>
639
+ </summary>
640
+ <div class="mt-3 text-gray-700">
641
+ Lifetime access to all updates and lessons. You can learn at your own pace.
642
+ </div>
643
+ </details>
644
+
645
+ <details class="faq-item group p-5">
646
+ <summary class="flex cursor-pointer list-none items-center justify-between">
647
+ <span class="font-medium text-gray-900">What is the refund policy?</span>
648
+ <i data-feather="plus" class="h-5 w-5 text-gray-500 transition-transform group-open:rotate-45"></i>
649
+ </summary>
650
+ <div class="mt-3 text-gray-700">
651
+ Try it risk‑free. Get a full refund within 14 days if you’re not satisfied.
652
+ </div>
653
+ </details>
654
+
655
+ <details class="faq-item group p-5">
656
+ <summary class="flex cursor-pointer list-none items-center justify-between">
657
+ <span class="font-medium text-gray-900">Is there a certificate?</span>
658
+ <i data-feather="plus" class="h-5 w-5 text-gray-500 transition-transform group-open:rotate-45"></i>
659
+ </summary>
660
+ <div class="mt-3 text-gray-700">
661
+ Yes. You’ll receive a certificate after completing all projects and assessments.
662
+ </div>
663
+ </details>
664
+ </div>
665
+ </div>
666
+ </section>
667
+
668
+ <!-- Footer -->
669
+ <footer class="border-t border-gray-100 bg-white py-10">
670
+ <div class="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
671
+ <div class="flex flex-col items-center justify-between gap-6 sm:flex-row">
672
+ <div class="flex items-center gap-2">
673
+ <span class="inline-flex h-8 w-8 items-center justify-center rounded-lg bg-primary-500 text-white">
674
+ <i data-feather="book-open"></i>
675
+ </span>
676
+ <span class="font-semibold">Web Dev Bootcamp</span>
677
+ </div>
678
+ <p class="text-sm text-gray-600">© <span id="year"></span> Web Dev Bootcamp. All rights reserved.</p>
679
+ <div class="flex items-center gap-4">
680
+ <a href="#overview" class="text-sm text-gray-700 hover:text-gray-900">Overview</a>
681
+ <a href="#pricing" class="text-sm text-gray-700 hover:text-gray-900">Pricing</a>
682
+ <a href="#faq" class="text-sm text-gray-700 hover:text-gray-900">FAQ</a>
683
+ </div>
684
+ </div>
685
+ </div>
686
+ </footer>
687
+
688
+ <!-- Scripts -->
689
+ <script src="script.js"></script>
690
+ <script src="https://unpkg.com/feather-icons"></script>
691
+ <script>feather.replace();</script>
692
+ <script src="https://huggingface.co/deepsite/deepsite-badge.js"></script>
693
+ </body>
694
+ </html>
script.js ADDED
@@ -0,0 +1,147 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ (function () {
2
+ const qs = (sel, ctx = document) => ctx.querySelector(sel);
3
+ const qsa = (sel, ctx = document) => Array.from(ctx.querySelectorAll(sel));
4
+
5
+ // Mobile menu
6
+ const menuToggle = qs('#menuToggle');
7
+ const mobileMenu = qs('#mobileMenu');
8
+ if (menuToggle && mobileMenu) {
9
+ menuToggle.addEventListener('click', () => {
10
+ const isHidden = mobileMenu.classList.contains('hidden');
11
+ mobileMenu.classList.toggle('hidden', !isHidden);
12
+ menuToggle.setAttribute('aria-expanded', String(isHidden));
13
+ });
14
+ }
15
+
16
+ // Expand/Collapse all curriculum modules
17
+ const expandBtn = qs('#expandAll');
18
+ const modules = qsa('.module');
19
+ if (expandBtn && modules.length) {
20
+ const toggleAll = () => {
21
+ const shouldOpen = expandBtn.dataset.state !== 'open';
22
+ modules.forEach((mod) => {
23
+ const content = qs('.module-content', mod);
24
+ const icon = qs('.module-icon', mod);
25
+ const summaryBtn = qs('.module-toggle', mod);
26
+ if (shouldOpen) {
27
+ openModule(mod, content, icon, summaryBtn, false);
28
+ } else {
29
+ closeModule(mod, content, icon, summaryBtn, false);
30
+ }
31
+ });
32
+ expandBtn.dataset.state = shouldOpen ? 'open' : 'closed';
33
+ const icon = qs('i', expandBtn);
34
+ if (icon) {
35
+ icon.setAttribute('data-feather', shouldOpen ? 'minus-square' : 'plus-square');
36
+ // Replace icon
37
+ if (window.feather && typeof feather.replace === 'function') {
38
+ feather.replace();
39
+ }
40
+ }
41
+ };
42
+ expandBtn.addEventListener('click', toggleAll);
43
+ }
44
+
45
+ // Individual module toggle
46
+ function openModule(module, content, icon, summaryBtn, animate = true) {
47
+ summaryBtn.setAttribute('aria-expanded', 'true');
48
+ content.classList.remove('hidden');
49
+ content.classList.add('open');
50
+ if (icon) icon.style.transform = 'rotate(180deg)';
51
+ if (animate) {
52
+ // auto height animation
53
+ content.style.maxHeight = '0px';
54
+ requestAnimationFrame(() => {
55
+ content.style.maxHeight = content.scrollHeight + 'px';
56
+ });
57
+ const onEnd = (e) => {
58
+ if (e.propertyName !== 'max-height') return;
59
+ content.style.maxHeight = 'none';
60
+ content.removeEventListener('transitionend', onEnd);
61
+ };
62
+ content.addEventListener('transitionend', onEnd);
63
+ } else {
64
+ content.style.maxHeight = 'none';
65
+ }
66
+ }
67
+
68
+ function closeModule(module, content, icon, summaryBtn, animate = true) {
69
+ summaryBtn.setAttribute('aria-expanded', 'false');
70
+ if (animate) {
71
+ // from current height to 0
72
+ content.style.maxHeight = content.scrollHeight + 'px';
73
+ requestAnimationFrame(() => {
74
+ content.style.maxHeight = '0px';
75
+ });
76
+ const onEnd = (e) => {
77
+ if (e.propertyName !== 'max-height') return;
78
+ content.classList.remove('open');
79
+ content.classList.add('hidden');
80
+ content.style.maxHeight = '';
81
+ content.removeEventListener('transitionend', onEnd);
82
+ };
83
+ content.addEventListener('transitionend', onEnd);
84
+ } else {
85
+ content.classList.remove('open');
86
+ content.classList.add('hidden');
87
+ content.style.maxHeight = '';
88
+ }
89
+ if (icon) icon.style.transform = 'rotate(0deg)';
90
+ }
91
+
92
+ modules.forEach((mod) => {
93
+ const content = qs('.module-content', mod);
94
+ const icon = qs('.module-icon', mod);
95
+ const summaryBtn = qs('.module-toggle', mod);
96
+
97
+ summaryBtn.addEventListener('click', (e) => {
98
+ e.preventDefault();
99
+ const isOpen = summaryBtn.getAttribute('aria-expanded') === 'true';
100
+ if (isOpen) {
101
+ closeModule(mod, content, icon, summaryBtn, true);
102
+ } else {
103
+ openModule(mod, content, icon, summaryBtn, true);
104
+ }
105
+ });
106
+ });
107
+
108
+ // FAQ accordion behavior: only one open at a time
109
+ const faqs = qsa('#faq details');
110
+ if (faqs.length) {
111
+ faqs.forEach((faq) => {
112
+ faq.addEventListener('toggle', () => {
113
+ if (faq.open) {
114
+ faqs.forEach((other) => {
115
+ if (other !== faq) other.removeAttribute('open');
116
+ });
117
+ }
118
+ });
119
+ });
120
+ }
121
+
122
+ // Smooth scroll offset for fixed header
123
+ const offset = 16; // header height-ish
124
+ qsa('a[href^="#"]').forEach((a) => {
125
+ a.addEventListener('click', (e) => {
126
+ const id = a.getAttribute('href');
127
+ if (!id || id === '#') return;
128
+ const el = qs(id);
129
+ if (!el) return;
130
+ e.preventDefault();
131
+ const top = el.getBoundingClientRect().top + window.scrollY - offset;
132
+ window.scrollTo({ top, behavior: 'smooth' });
133
+ history.pushState(null, '', id);
134
+ });
135
+ });
136
+
137
+ // Footer year
138
+ const yearEl = qs('#year');
139
+ if (yearEl) {
140
+ yearEl.textContent = String(new Date().getFullYear());
141
+ }
142
+
143
+ // Replace Feather icons if dynamically inserted
144
+ if (window.feather && typeof feather.replace === 'function') {
145
+ feather.replace();
146
+ }
147
+ })();
style.css CHANGED
@@ -1,28 +1,91 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  body {
2
- padding: 2rem;
3
- font-family: -apple-system, BlinkMacSystemFont, "Arial", sans-serif;
 
 
 
 
 
 
 
4
  }
5
 
6
- h1 {
7
- font-size: 16px;
8
- margin-top: 0;
 
 
 
9
  }
10
 
11
- p {
12
- color: rgb(107, 114, 128);
13
- font-size: 15px;
14
- margin-bottom: 10px;
15
- margin-top: 5px;
 
 
 
16
  }
17
 
18
- .card {
19
- max-width: 620px;
20
- margin: 0 auto;
21
- padding: 16px;
22
- border: 1px solid lightgray;
23
- border-radius: 16px;
 
 
24
  }
25
 
26
- .card p:last-child {
27
- margin-bottom: 0;
 
 
 
28
  }
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Theme variables (light default). Replace the RGB values with your brand colors. */
2
+ :root {
3
+ --primary-50: 239 246 255;
4
+ --primary-100: 219 234 254;
5
+ --primary-200: 191 219 254;
6
+ --primary-300: 147 197 253;
7
+ --primary-400: 96 165 250;
8
+ --primary-500: 59 130 246;
9
+ --primary-600: 37 99 235;
10
+ --primary-700: 29 78 216;
11
+ --primary-800: 30 64 175;
12
+ --primary-900: 30 58 138;
13
+
14
+ --secondary-50: 250 245 255;
15
+ --secondary-100: 243 232 255;
16
+ --secondary-200: 233 213 255;
17
+ --secondary-300: 196 181 253;
18
+ --secondary-400: 167 139 250;
19
+ --secondary-500: 139 92 246;
20
+ --secondary-600: 124 58 237;
21
+ --secondary-700: 109 40 217;
22
+ --secondary-800: 91 33 182;
23
+ --secondary-900: 76 29 149;
24
+ }
25
+
26
+ /* Optional: Dark theme (if desired) */
27
+ /* [data-theme="dark"] {
28
+ color-scheme: dark;
29
+ } */
30
+
31
+ /* Base */
32
+ html, body {
33
+ height: 100%;
34
+ }
35
+
36
  body {
37
+ font-family: ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, "Apple Color Emoji", "Segoe UI Emoji";
38
+ line-height: 1.55;
39
+ }
40
+
41
+ /* Focus ring improvements */
42
+ :focus-visible {
43
+ outline: 2px solid transparent;
44
+ outline-offset: 2px;
45
+ box-shadow: 0 0 0 2px rgb(var(--primary-500) / 0.35);
46
  }
47
 
48
+ /* Module details animation */
49
+ details > summary {
50
+ list-style: none;
51
+ }
52
+ details > summary::-webkit-details-marker {
53
+ display: none;
54
  }
55
 
56
+ /* Module content collapsible */
57
+ .module .module-content {
58
+ max-height: 0;
59
+ overflow: hidden;
60
+ transition: max-height 220ms ease;
61
+ }
62
+ .module .module-content.open {
63
+ /* JS will set a max-height or use auto */
64
  }
65
 
66
+ /* FAQ details animation (for browsers not supporting <details>) */
67
+ .faq-item[open] .faq-content {
68
+ max-height: 500px;
69
+ }
70
+ .faq-item .faq-content {
71
+ overflow: hidden;
72
+ max-height: 0;
73
+ transition: max-height 220ms ease;
74
  }
75
 
76
+ /* Backdrop blur fallback */
77
+ @supports not (backdrop-filter: blur(12px)) {
78
+ header {
79
+ background-color: rgba(255, 255, 255, 0.96);
80
+ }
81
  }
82
+
83
+ /* Smooth scrolling */
84
+ html {
85
+ scroll-behavior: smooth;
86
+ }
87
+
88
+ /* Utility shadow rings for cards */
89
+ .shadow-ring {
90
+ box-shadow: 0 0 0 1px rgb(0 0 0 / 0.04), 0 2px 8px rgb(0 0 0 / 0.06);
91
+ }