BinKhoaLe1812 commited on
Commit
b9eb8f5
·
verified ·
1 Parent(s): 3261822

Delete index.html

Browse files
Files changed (1) hide show
  1. index.html +0 -479
index.html DELETED
@@ -1,479 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en" class="scroll-smooth">
3
- <head>
4
- <meta charset="UTF-8" />
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
- <title>MedAI — COS30018 Multi‑Agent Clinical Reasoning</title>
7
- <meta name="description" content="Swinburne COS30018 MedAI — Multi‑Agent Clinical Reasoning System with Agentic RAG, safety rails, and rigorous evaluation." />
8
- <link rel="icon" href="assets/logo.svg">
9
- <!-- Tailwind (CDN) -->
10
- <script src="https://cdn.tailwindcss.com"></script>
11
- <script>
12
- // Ensure Tailwind is loaded before configuring
13
- if (typeof tailwind !== 'undefined') {
14
- tailwind.config = {
15
- darkMode: 'class',
16
- theme: {
17
- extend: {
18
- fontFamily: { inter: ['Inter', 'ui-sans-serif', 'system-ui'] },
19
- boxShadow: {
20
- glow: '0 0 20px rgba(99,102,241,0.3), 0 0 40px rgba(99,102,241,0.2)'
21
- },
22
- backgroundImage: {
23
- 'grid': 'linear-gradient(to right, rgba(255,255,255,0.06) 1px, transparent 1px), linear-gradient(to bottom, rgba(255,255,255,0.06) 1px, transparent 1px)'
24
- },
25
- spacing: {
26
- '18': '4.5rem',
27
- '88': '22rem'
28
- }
29
- }
30
- }
31
- };
32
- } else {
33
- console.warn('Tailwind CSS not loaded');
34
- }
35
- </script>
36
- <!-- AOS (Animate On Scroll) -->
37
- <link href="https://unpkg.com/aos@2.3.4/dist/aos.css" rel="stylesheet" />
38
- <script defer src="https://unpkg.com/aos@2.3.4/dist/aos.js"></script>
39
- <!-- Lucide Icons -->
40
- <script src="https://unpkg.com/lucide@latest"></script>
41
- <!-- Mermaid -->
42
- <script src="https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.min.js"></script>
43
- <script>
44
- mermaid.initialize({
45
- startOnLoad: true,
46
- theme: 'dark',
47
- securityLevel: 'loose',
48
- fontFamily: 'Inter, ui-sans-serif, system-ui',
49
- flowchart: {
50
- useMaxWidth: true,
51
- htmlLabels: true
52
- }
53
- });
54
- </script>
55
- <link rel="preconnect" href="https://fonts.googleapis.com">
56
- <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
57
- <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
58
- <link rel="stylesheet" href="assets/styles.css">
59
- </head>
60
- <body class="bg-slate-950 text-slate-100 font-inter">
61
- <!-- Background decoration -->
62
- <div class="fixed inset-0 -z-10 overflow-hidden pointer-events-none">
63
- <div class="absolute -top-40 -left-40 w-[60rem] h-[60rem] rounded-full bg-gradient-to-tr from-indigo-500/30 via-blue-400/20 to-cyan-300/10 blur-3xl animate-pulse-slow"></div>
64
- <div class="absolute -bottom-40 -right-40 w-[60rem] h-[60rem] rounded-full bg-gradient-to-tr from-fuchsia-500/20 via-indigo-500/10 to-sky-400/10 blur-3xl animate-pulse-slow delay-700"></div>
65
- </div>
66
-
67
- <!-- Navbar -->
68
- <header class="sticky top-0 z-50 backdrop-blur supports-[backdrop-filter]:bg-slate-900/60 border-b border-white/10" role="banner">
69
- <div class="max-w-7xl mx-auto px-4 py-3 flex items-center justify-between">
70
- <div class="flex items-center gap-3">
71
- <img src="assets/logo.svg" class="w-9 h-9" alt="MedAI logo" width="36" height="36" />
72
- <span class="font-extrabold tracking-tight text-xl">MedAI</span>
73
- <span class="text-slate-400 hidden sm:inline" aria-label="Course code">• COS30018</span>
74
- </div>
75
- <nav class="hidden md:flex items-center gap-6 text-sm" role="navigation" aria-label="Main navigation">
76
- <a href="#overview" class="link" aria-label="Go to Overview section">Overview</a>
77
- <a href="#capabilities" class="link" aria-label="Go to Capabilities section">Capabilities</a>
78
- <a href="#architecture" class="link" aria-label="Go to Architecture section">Architecture</a>
79
- <a href="#training" class="link" aria-label="Go to Training section">Training</a>
80
- <a href="#evaluation" class="link" aria-label="Go to Evaluation section">Evaluation</a>
81
- <a href="#team" class="link" aria-label="Go to Team section">Team</a>
82
- </nav>
83
- <div class="flex items-center gap-3">
84
- <a href="https://huggingface.co/spaces/MedAI-COS30018/MedicalDiagnosisSystem" target="_blank" rel="noopener noreferrer" class="btn-primary" aria-label="Open live application in new tab">Live App</a>
85
- <button id="themeToggle" aria-label="Toggle between light and dark theme" class="btn-icon" type="button">
86
- <i data-lucide="sun-medium" class="icon" aria-hidden="true"></i>
87
- </button>
88
- </div>
89
- </div>
90
- </header>
91
-
92
- <!-- Hero -->
93
- <section class="relative" role="banner" aria-labelledby="hero-title">
94
- <div class="max-w-7xl mx-auto px-4 py-16 lg:py-24">
95
- <div class="grid lg:grid-cols-2 gap-12 items-center">
96
- <div data-aos="fade-right" data-aos-duration="700">
97
- <h1 id="hero-title" class="text-4xl lg:text-6xl font-extrabold leading-tight">
98
- Multi‑Agent <span class="text-indigo-400">Clinical Reasoning</span> System
99
- </h1>
100
- <p class="mt-5 text-slate-300 text-lg max-w-2xl">
101
- Safety‑first medical assistant coordinating Diagnostics, Pharmacology, and Triage agents via an MCP orchestrator,
102
- grounded by Agentic RAG over EMR/EHR and PubMed, and rigorously evaluated on MedMCQA and PubMedQA.
103
- </p>
104
- <div class="mt-8 flex flex-wrap gap-3" role="group" aria-label="Action buttons">
105
- <a class="btn-secondary" href="https://huggingface.co/spaces/MedAI-COS30018/MedAI_Processing" target="_blank" rel="noopener noreferrer" aria-label="Open data processing application">Data Processing</a>
106
- <a class="btn-ghost" href="#architecture" aria-label="Scroll to architecture section">See Architecture</a>
107
- </div>
108
- <div class="mt-6 flex items-center gap-6 text-sm text-slate-400" role="contentinfo">
109
- <span>Unit: COS30018 (Intelligent Systems)</span>
110
- <span aria-hidden="true">•</span>
111
- <span>School: Swinburne University of Technology</span>
112
- </div>
113
- </div>
114
- <div class="relative" data-aos="fade-left" data-aos-duration="700">
115
- <div class="card glass shadow-glow" role="complementary" aria-labelledby="glance-title">
116
- <div class="p-6">
117
- <h3 id="glance-title" class="font-semibold text-slate-200 mb-3">At a Glance</h3>
118
- <ul class="space-y-2 text-slate-300" role="list">
119
- <li>• 500k+ curated & synthetic cases</li>
120
- <li>• LoRA/QLoRA, Knowledge Distillation, GRPO</li>
121
- <li>• Agentic RAG (Node & Graph) with citations</li>
122
- <li>• Safety rails, HIL, uncertainty flags</li>
123
- <li>• HPC‑reproducible training</li>
124
- </ul>
125
- <div class="mt-6 flex gap-3" role="group" aria-label="External resources">
126
- <a class="chip" href="https://huggingface.co/MedAI-COS30018/MedicalDiagnosisSystem" target="_blank" rel="noopener noreferrer" aria-label="Visit Live App">Live App</a>
127
- <a class="chip" href="https://huggingface.co/MedAI-COS30018" target="_blank" rel="noopener noreferrer" aria-label="Visit Hugging Face organization">HF Org</a>
128
- <a class="chip" href="https://huggingface.co/collections/MedAI-COS30018/finetuning-68bbe0b045db4ed5aac5e9a2" target="_blank" rel="noopener noreferrer" aria-label="View fine-tuning datasets">Finetune Datasets</a>
129
- <a class="chip" href="https://huggingface.co/collections/MedAI-COS30018/rag-68bbe244bfa8ce6132fd5242" target="_blank" rel="noopener noreferrer" aria-label="View RAG datasets">RAG Datasets</a>
130
- </div>
131
- </div>
132
- <div class="border-t border-white/10 p-4 text-xs text-slate-400">
133
- <span>Phase 1 prototype: Multimodal + naïve‑RAG + MCP</span>
134
- </div>
135
- </div>
136
- </div>
137
- </div>
138
- </div>
139
- </section>
140
-
141
- <!-- Overview -->
142
- <section id="overview" class="section">
143
- <div class="container">
144
- <div class="section-header" data-aos="fade-up">
145
- <h2>Overview</h2>
146
- <p>Accuracy, traceability, and safety via multi‑agent orchestration and evidence‑grounded generation.</p>
147
- </div>
148
- <div class="grid md:grid-cols-3 gap-6">
149
- <div class="feature" data-aos="zoom-in-up">
150
- <i data-lucide="stethoscope" class="feature-icon"></i>
151
- <h3>Specialist Agents</h3>
152
- <p>Diagnostics (differentials + red flags), Pharmacology (DDIs, dosing), and Triage (urgency & disposition).</p>
153
- </div>
154
- <div class="feature" data-aos="zoom-in-up" data-aos-delay="100">
155
- <i data-lucide="workflow" class="feature-icon"></i>
156
- <h3>Reasoning Orchestrator</h3>
157
- <p>MCP planner routes tasks, fuses evidence, and enforces self‑consistency with safe refusal and uncertainty flags.</p>
158
- </div>
159
- <div class="feature" data-aos="zoom-in-up" data-aos-delay="200">
160
- <i data-lucide="library" class="feature-icon"></i>
161
- <h3>Agentic RAG</h3>
162
- <p>Graph & Node RAG over EMR/EHR + PubMed with section‑aware chunking, source allowlists, and citations.</p>
163
- </div>
164
- </div>
165
- </div>
166
- </section>
167
-
168
- <!-- Capabilities -->
169
- <section id="capabilities" class="section">
170
- <div class="container">
171
- <div class="section-header" data-aos="fade-up">
172
- <h2>Core Capabilities</h2>
173
- <p>Modeling & optimization to drive accurate, inspectable clinical reasoning.</p>
174
- </div>
175
- <div class="grid md:grid-cols-2 lg:grid-cols-3 gap-6">
176
- <div class="card" data-tilt data-tilt-max="6">
177
- <div class="card-body">
178
- <h4 class="card-title">LoRA/QLoRA</h4>
179
- <p>Parameter‑efficient adapters let us fine‑tune 7–13B models on modest GPUs while retaining high performance.</p>
180
- </div>
181
- </div>
182
- <div class="card" data-tilt data-tilt-max="6">
183
- <div class="card-body">
184
- <h4 class="card-title">Knowledge Distillation</h4>
185
- <p>Teacher→Student compression to deliver fast, strong specialists with small runtime footprints.</p>
186
- </div>
187
- </div>
188
- <div class="card" data-tilt data-tilt-max="6">
189
- <div class="card-body">
190
- <h4 class="card-title">GRPO Reasoning</h4>
191
- <p>Reinforcement learning variant targeting multi‑step, self‑consistent reasoning with lower compute costs.</p>
192
- </div>
193
- </div>
194
- <div class="card" data-tilt data-tilt-max="6">
195
- <div class="card-body">
196
- <h4 class="card-title">QAC + Counterfactuals</h4>
197
- <p>Paraphrasing, chunking, and “what‑if” synthesis improve robustness across presentation styles.</p>
198
- </div>
199
- </div>
200
- <div class="card" data-tilt data-tilt-max="6">
201
- <div class="card-body">
202
- <h4 class="card-title">Safety Rails</h4>
203
- <p>Allowlists, section filters, and citation‑required answers reduce hallucinations and protect privacy.</p>
204
- </div>
205
- </div>
206
- <div class="card" data-tilt data-tilt-max="6">
207
- <div class="card-body">
208
- <h4 class="card-title">HPC Reproducibility</h4>
209
- <p>Deterministic seeds, LR scheduling, and checkpointing ensure auditability and consistent results.</p>
210
- </div>
211
- </div>
212
- </div>
213
- </div>
214
- </section>
215
-
216
- <!-- Architecture -->
217
- <section id="architecture" class="section" aria-labelledby="architecture-title">
218
- <div class="container">
219
- <div class="section-header" data-aos="fade-up">
220
- <h2 id="architecture-title">Architecture</h2>
221
- <p>Click tabs to switch between layers.</p>
222
- </div>
223
- <div class="tabs mb-6" role="tablist" aria-label="Architecture layers">
224
- <button class="tab active" data-target="#arch-l1" role="tab" aria-selected="true" aria-controls="arch-l1" id="tab-l1">System Diagram</button>
225
- <button class="tab" data-target="#arch-l2" role="tab" aria-selected="false" aria-controls="arch-l2" id="tab-l2">RAG Internals</button>
226
- <button class="tab" data-target="#arch-l3" role="tab" aria-selected="false" aria-controls="arch-l3" id="tab-l3">Sequence Diagram</button>
227
- </div>
228
-
229
- <div id="arch-l1" class="diagram visible" role="tabpanel" aria-labelledby="tab-l1" aria-hidden="false" style="display: block;">
230
- <pre class="mermaid" aria-label="System Architecture Diagram">
231
- flowchart LR
232
- U(["Clinician UI / EMR"]) -->|"symptoms, meds, files"| MCP["MCP Orchestrator<br/>FastAPI routing, planning, safety, tracing"]
233
- MCP --> DX["Diagnostics Agent"]
234
- MCP --> RX["Pharmacology Agent"]
235
- subgraph RAG["Agentic RAG"]
236
- QR["Query Router"] --> RET["Retriever"]
237
- RET --> SR["Safety Rails"]
238
- end
239
- DX --> RAG
240
- RX --> RAG
241
- SR --> KB[("Med KB / PubMed")]
242
- SR --> EMR[("EMR/EHR summaries")]
243
- DX --> FUSE["Evidence Fusion + Self-Consistency"]
244
- RX --> FUSE
245
- FUSE --> OUT{{"Final Report<br/>summary, plan, citations, cautions"}}
246
- OUT --> QA["Evaluation & QA<br/>MedMCQA, PubMedQA, similarity audits"]
247
- </pre>
248
- </div>
249
-
250
- <div id="arch-l2" class="diagram" role="tabpanel" aria-labelledby="tab-l2" aria-hidden="true" style="display: none;">
251
- <pre class="mermaid" aria-label="RAG Internals Architecture Diagram">
252
- sequenceDiagram
253
- autonumber
254
- participant MCP as Orchestrator (MCP)
255
- participant QR as Query Router
256
- participant RW as Rewriter / Disambiguator
257
- participant RET as Retriever (vector + keyword)
258
- participant SR as Safety Rails
259
- participant LTM as VectorDB / LTM
260
- participant KB as Med KB (PubMed / Guidelines)
261
- participant EMR as EMR Summarizer
262
- participant EVID as Evidence Bundle
263
-
264
- MCP->>QR: Build query context (symptoms, vitals, meds, files, LTM hints)
265
- QR->>RW: Route + transform query
266
-
267
- alt Disambiguation needed
268
- RW->>RW: Expand synonyms / codes / abbreviations
269
- else Well-formed query
270
- RW-->>QR: Passthrough
271
- end
272
-
273
- RW->>RET: Search request (text + embedding)
274
-
275
- par Vector search
276
- RET->>LTM: kNN on embeddings (cosine)
277
- LTM-->>RET: top-k chunks + scores
278
- and Keyword filter
279
- RET->>KB: Keyword/BM25 filter
280
- KB-->>RET: filtered docs
281
- end
282
-
283
- RET->>SR: Candidate bundle {doc, section, score, source}
284
- SR->>SR: Apply allowlist, section filters, dedupe, PII scrub
285
- SR->>SR: Compute threshold τ and coverage/confidence
286
-
287
- alt Low similarity (score < τ)
288
- SR-->>MCP: Low-confidence → ask clarify / broaden search
289
- else Sufficient evidence
290
- SR-->>EVID: Vetted bundle
291
- note right of EVID: Citations + provenance map
292
- EVID->>LTM: Write traces (embeds, query, ids, similarity)
293
- opt EMR context needed
294
- QR->>EMR: Request patient summary (PHI-safe)
295
- EMR-->>EVID: Labs, meds, history snippet
296
- end
297
- EVID-->>MCP: Evidence bundle + citations
298
- end
299
- </pre>
300
- </div>
301
-
302
- <div id="arch-l3" class="diagram" role="tabpanel" aria-labelledby="tab-l3" aria-hidden="true" style="display: none;">
303
- <pre class="mermaid" aria-label="Single Turn Sequence Diagram">
304
- sequenceDiagram
305
- participant C as Clinician
306
- participant MCP as Orchestrator (MCP)
307
- participant RAG as RAG (Router→Retriever→Safety)
308
- participant AG as Agents (Dx/Rx/Triage)
309
- participant DB as VectorDB/LTM
310
- participant OUT as Evidence Fusion
311
- C->>MCP: case description
312
- MCP->>RAG: retrieve evidence
313
- RAG->>DB: similarity search
314
- DB-->>RAG: top-k docs
315
- RAG-->>MCP: evidence bundle + citations
316
- MCP->>AG: delegated tasks
317
- AG-->>OUT: candidate answers + rationales
318
- OUT-->>C: final report + citations + cautions
319
- OUT->>DB: write traces/embeddings
320
- </pre>
321
- </div>
322
- </div>
323
- </section>
324
-
325
- <!-- Training & Reproducibility -->
326
- <section id="training" class="section">
327
- <div class="container">
328
- <div class="section-header" data-aos="fade-up">
329
- <h2>Data, Training & Reproducibility</h2>
330
- <p>From 500k+ cases to specialized, efficient agents.</p>
331
- </div>
332
- <div class="grid lg:grid-cols-2 gap-6">
333
- <div class="card">
334
- <div class="card-body">
335
- <h4 class="card-title">Datasets & Augmentation</h4>
336
- <ul class="list">
337
- <li>500k+ curated & synthetic clinical cases across specialties</li>
338
- <li>QAC paraphrasing & chunking, self‑consistency sampling</li>
339
- <li>Counterfactual case generation, back‑translation</li>
340
- </ul>
341
- <div class="mt-4 flex gap-3 flex-wrap">
342
- <a class="chip" target="_blank" href="https://huggingface.co/collections/MedAI-COS30018/finetuning-68bbe0b045db4ed5aac5e9a2">Fine‑tuning Collection</a>
343
- <a class="chip" target="_blank" href="https://huggingface.co/collections/MedAI-COS30018/rag-68bbe244bfa8ce6132fd5242">RAG Collection</a>
344
- <a class="chip" target="_blank" href="https://huggingface.co/spaces/MedAI-COS30018/MedAI_Processing">Ingestion Pipeline</a>
345
- </div>
346
- </div>
347
- </div>
348
- <div class="card">
349
- <div class="card-body">
350
- <h4 class="card-title">Fine‑Tuning & KD</h4>
351
- <ul class="list">
352
- <li>Teacher→Student Knowledge Distillation</li>
353
- <li>LoRA/QLoRA adapters, GRPO for reasoning</li>
354
- <li>HPC runs: deterministic seeds, LR schedules, checkpoints</li>
355
- </ul>
356
- <div class="mt-4 flex gap-3 flex-wrap">
357
- <a class="chip" target="_blank" href="https://hackmd.io/@ngFNmXW1RVOfNb7b3NYBJg/instruction">KD Procedure</a>
358
- <a class="chip" target="_blank" href="https://hackmd.io/@ngFNmXW1RVOfNb7b3NYBJg/bench">Benchmarks Plan</a>
359
- </div>
360
- </div>
361
- </div>
362
- </div>
363
- </div>
364
- </section>
365
-
366
- <!-- Evaluation -->
367
- <section id="evaluation" class="section">
368
- <div class="container">
369
- <div class="section-header" data-aos="fade-up">
370
- <h2>Evaluation & Safety</h2>
371
- <p>Benchmarks, semantic audits, and runtime guards.</p>
372
- </div>
373
- <div class="grid lg:grid-cols-3 gap-6">
374
- <div class="metric">
375
- <div class="metric-value" data-count="500000">0</div>
376
- <div class="metric-label">Cases Curated</div>
377
- </div>
378
- <div class="metric">
379
- <div class="metric-value" data-count="3">0</div>
380
- <div class="metric-label">Specialist Agents</div>
381
- </div>
382
- <div class="metric">
383
- <div class="metric-value" data-count="2">0</div>
384
- <div class="metric-label">Benchmarks</div>
385
- </div>
386
- </div>
387
- <div class="mt-8 grid md:grid-cols-2 gap-6">
388
- <div class="card">
389
- <div class="card-body">
390
- <h4 class="card-title">Benchmarks</h4>
391
- <p>MedMCQA (medical exam QA) and PubMedQA (research abstract QA). Complemented by semantic similarity audits with biomedical embeddings.</p>
392
- </div>
393
- </div>
394
- <div class="card">
395
- <div class="card-body">
396
- <h4 class="card-title">Runtime Guards</h4>
397
- <p>Uncertainty prompts, refusal policies for out‑of‑scope, citation‑required answers, and HIL oversight to ensure safety.</p>
398
- </div>
399
- </div>
400
- </div>
401
- </div>
402
- </section>
403
-
404
- <!-- Team -->
405
- <section id="team" class="section">
406
- <div class="container">
407
- <div class="section-header" data-aos="fade-up">
408
- <h2>Team</h2>
409
- <div class="team-info">
410
- <div class="university-info">
411
- <span class="university-name">Swinburne University of Technology</span>
412
- <span class="course-code">COS30018</span>
413
- </div>
414
- <div class="team-members">
415
- <div class="member-card" data-aos="zoom-in" data-aos-delay="100">
416
- <!-- <div class="member-avatar">L</div> -->
417
- <span class="member-name">Liam</span>
418
- </div>
419
- <div class="member-card" data-aos="zoom-in" data-aos-delay="200">
420
- <!-- <div class="member-avatar">H</div> -->
421
- <span class="member-name">Henry</span>
422
- </div>
423
- <div class="member-card" data-aos="zoom-in" data-aos-delay="300">
424
- <!-- <div class="member-avatar">H</div> -->
425
- <span class="member-name">Hai</span>
426
- </div>
427
- <div class="member-card" data-aos="zoom-in" data-aos-delay="400">
428
- <!-- <div class="member-avatar">D</div> -->
429
- <span class="member-name">Dylan</span>
430
- </div>
431
- <div class="member-card" data-aos="zoom-in" data-aos-delay="500">
432
- <!-- <div class="member-avatar">V</div> -->
433
- <span class="member-name">Vinh</span>
434
- </div>
435
- </div>
436
- </div>
437
- </div>
438
- </div>
439
- </section>
440
-
441
- <!-- Footer -->
442
- <footer class="py-10 border-t border-white/10 text-center text-slate-400">
443
- <div class="container">
444
- <div class="flex justify-center gap-6 mb-3">
445
- <a class="link" target="_blank" href="https://huggingface.co/MedAI-COS30018">HF Org</a>
446
- <a class="link" target="_blank" href="https://huggingface.co/spaces/MedAI-COS30018/MedicalDiagnosisSystem">Live App</a>
447
- <a class="link" target="_blank" href="https://huggingface.co/spaces/MedAI-COS30018/MedAI_Processing">Data Processing</a>
448
- </div>
449
- <div class="text-xs">© 2025 Swinburne University · MedAI (COS30018). For research and educational use only.</div>
450
- </div>
451
- </footer>
452
-
453
- <script src="https://unpkg.com/vanilla-tilt@1.8.1/dist/vanilla-tilt.min.js"></script>
454
- <script src="assets/app.js"></script>
455
- <script>
456
- // Wait for all resources to load before initializing
457
- window.addEventListener('load', () => {
458
- // Initialize AOS if available
459
- if (typeof AOS !== 'undefined') {
460
- AOS.init({
461
- duration: 700,
462
- once: true,
463
- offset: 100,
464
- easing: 'ease-in-out'
465
- });
466
- } else {
467
- console.warn('AOS library not loaded');
468
- }
469
-
470
- // Initialize Lucide icons if available
471
- if (typeof lucide !== 'undefined') {
472
- lucide.createIcons();
473
- } else {
474
- console.warn('Lucide library not loaded');
475
- }
476
- });
477
- </script>
478
- </body>
479
- </html>