Presentation_User.html 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782
  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>Local Food AI - Clinician User Manual Presentation</title>
  7. <!-- Google Fonts -->
  8. <link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=Outfit:wght@400;500;600;700&family=Fira+Code:wght@400;500&display=swap" rel="stylesheet">
  9. <style>
  10. :root {
  11. --bg-color: #080c10;
  12. --slide-bg: rgba(13, 17, 23, 0.75);
  13. --border-color: rgba(255, 255, 255, 0.08);
  14. --primary-accent: #34d399; /* Emerald accent for users (feels medical/fresh) */
  15. --secondary-accent: #60a5fa; /* Blue accent */
  16. --text-primary: #f0f6fc;
  17. --text-secondary: #8b949e;
  18. --text-muted: #484f58;
  19. --code-bg: #161b22;
  20. --font-display: 'Outfit', sans-serif;
  21. --font-sans: 'Inter', sans-serif;
  22. --font-mono: 'Fira Code', monospace;
  23. --glow-color: rgba(52, 211, 153, 0.15);
  24. }
  25. * {
  26. box-sizing: border-box;
  27. margin: 0;
  28. padding: 0;
  29. }
  30. body {
  31. background-color: var(--bg-color);
  32. background-image:
  33. radial-gradient(at 0% 0%, rgba(52, 211, 153, 0.08) 0, transparent 50%),
  34. radial-gradient(at 100% 100%, rgba(96, 165, 250, 0.08) 0, transparent 50%);
  35. color: var(--text-primary);
  36. font-family: var(--font-sans);
  37. overflow: hidden;
  38. height: 100vh;
  39. width: 100vw;
  40. display: flex;
  41. flex-direction: column;
  42. justify-content: center;
  43. align-items: center;
  44. }
  45. /* Slide Container */
  46. .presentation-container {
  47. position: relative;
  48. width: 90%;
  49. max-width: 1100px;
  50. height: 80vh;
  51. min-height: 550px;
  52. perspective: 1500px;
  53. }
  54. .slide-deck {
  55. position: relative;
  56. width: 100%;
  57. height: 100%;
  58. transform-style: preserve-3d;
  59. }
  60. /* Individual Slides */
  61. .slide {
  62. position: absolute;
  63. width: 100%;
  64. height: 100%;
  65. background: var(--slide-bg);
  66. border: 1px solid var(--border-color);
  67. border-radius: 16px;
  68. padding: 3.5rem;
  69. backdrop-filter: blur(12px);
  70. -webkit-backdrop-filter: blur(12px);
  71. box-shadow: 0 20px 50px rgba(0, 0, 0, 0.4), inset 0 1px 1px rgba(255, 255, 255, 0.1);
  72. display: flex;
  73. flex-direction: column;
  74. justify-content: space-between;
  75. opacity: 0;
  76. visibility: hidden;
  77. transform: scale(0.9) translateZ(-100px);
  78. transition: all 0.6s cubic-bezier(0.25, 0.8, 0.25, 1);
  79. pointer-events: none;
  80. }
  81. /* Slide States for Animations */
  82. .slide.active {
  83. opacity: 1;
  84. visibility: visible;
  85. transform: scale(1) translateZ(0);
  86. pointer-events: auto;
  87. z-index: 10;
  88. }
  89. .slide.prev {
  90. opacity: 0;
  91. visibility: hidden;
  92. transform: scale(0.9) translateX(-100%) rotateY(15deg);
  93. z-index: 5;
  94. }
  95. .slide.next {
  96. opacity: 0;
  97. visibility: hidden;
  98. transform: scale(0.9) translateX(100%) rotateY(-15deg);
  99. z-index: 5;
  100. }
  101. /* Content Formatting */
  102. .slide-header {
  103. display: flex;
  104. justify-content: space-between;
  105. align-items: center;
  106. border-bottom: 1px dashed var(--border-color);
  107. padding-bottom: 1rem;
  108. margin-bottom: 1.5rem;
  109. }
  110. .slide-header .tag {
  111. font-family: var(--font-mono);
  112. font-size: 0.8rem;
  113. color: var(--secondary-accent);
  114. text-transform: uppercase;
  115. letter-spacing: 2px;
  116. }
  117. .slide-header .title-badge {
  118. font-size: 0.75rem;
  119. padding: 0.25rem 0.75rem;
  120. border-radius: 20px;
  121. background: rgba(52, 211, 153, 0.1);
  122. border: 1px solid rgba(52, 211, 153, 0.2);
  123. color: var(--primary-accent);
  124. font-family: var(--font-mono);
  125. }
  126. .slide-body {
  127. flex-grow: 1;
  128. display: flex;
  129. flex-direction: column;
  130. justify-content: center;
  131. }
  132. .slide-title {
  133. font-family: var(--font-display);
  134. font-size: 2.2rem;
  135. font-weight: 700;
  136. line-height: 1.2;
  137. margin-bottom: 1.5rem;
  138. background: linear-gradient(135deg, var(--primary-accent), var(--secondary-accent));
  139. -webkit-background-clip: text;
  140. -webkit-text-fill-color: transparent;
  141. }
  142. .slide-footer {
  143. display: flex;
  144. justify-content: space-between;
  145. align-items: center;
  146. border-top: 1px solid var(--border-color);
  147. padding-top: 1.2rem;
  148. margin-top: 1.5rem;
  149. font-size: 0.8rem;
  150. color: var(--text-secondary);
  151. }
  152. /* Grid Layouts inside slides */
  153. .slide-grid-2 {
  154. display: grid;
  155. grid-template-columns: 1fr 1fr;
  156. gap: 2rem;
  157. align-items: start;
  158. }
  159. .slide-grid-3 {
  160. display: grid;
  161. grid-template-columns: 1fr 1fr 1fr;
  162. gap: 1.5rem;
  163. }
  164. /* Lists and Cards */
  165. ul {
  166. list-style: none;
  167. }
  168. li {
  169. position: relative;
  170. padding-left: 1.5rem;
  171. margin-bottom: 0.8rem;
  172. font-size: 1.05rem;
  173. line-height: 1.5;
  174. color: var(--text-primary);
  175. }
  176. li::before {
  177. content: "✓";
  178. position: absolute;
  179. left: 0;
  180. color: var(--primary-accent);
  181. font-weight: bold;
  182. }
  183. li.warning-li::before {
  184. content: "⚠";
  185. color: #ff7b72;
  186. }
  187. li strong {
  188. color: #fff;
  189. font-weight: 600;
  190. }
  191. .card {
  192. background: rgba(255, 255, 255, 0.02);
  193. border: 1px solid rgba(255, 255, 255, 0.05);
  194. border-radius: 8px;
  195. padding: 1.2rem;
  196. transition: all 0.3s ease;
  197. }
  198. .card:hover {
  199. background: rgba(255, 255, 255, 0.04);
  200. border-color: rgba(52, 211, 153, 0.2);
  201. box-shadow: 0 4px 20px var(--glow-color);
  202. transform: translateY(-2px);
  203. }
  204. .card-title {
  205. font-family: var(--font-display);
  206. font-size: 1.15rem;
  207. font-weight: 600;
  208. color: #fff;
  209. margin-bottom: 0.6rem;
  210. display: flex;
  211. align-items: center;
  212. gap: 0.5rem;
  213. }
  214. .card-title .icon {
  215. color: var(--primary-accent);
  216. }
  217. .card-desc {
  218. font-size: 0.95rem;
  219. color: var(--text-secondary);
  220. line-height: 1.4;
  221. }
  222. /* Title Slide Layout */
  223. .title-slide {
  224. justify-content: center;
  225. align-items: center;
  226. text-align: center;
  227. }
  228. .title-slide .slide-title {
  229. font-size: 3.2rem;
  230. margin-bottom: 1.5rem;
  231. }
  232. .title-slide .subtitle {
  233. font-size: 1.3rem;
  234. color: var(--text-secondary);
  235. margin-bottom: 2rem;
  236. max-width: 700px;
  237. }
  238. .meta-grid {
  239. display: grid;
  240. grid-template-columns: repeat(3, 160px);
  241. gap: 1.5rem;
  242. margin-top: 2rem;
  243. border-top: 1px solid var(--border-color);
  244. padding-top: 2rem;
  245. }
  246. .meta-item {
  247. display: flex;
  248. flex-direction: column;
  249. align-items: center;
  250. }
  251. .meta-label {
  252. font-size: 0.75rem;
  253. text-transform: uppercase;
  254. letter-spacing: 1px;
  255. color: var(--text-secondary);
  256. margin-bottom: 0.4rem;
  257. }
  258. .meta-value {
  259. font-size: 0.95rem;
  260. font-weight: 500;
  261. color: #fff;
  262. }
  263. .highlight-text {
  264. color: var(--primary-accent);
  265. font-weight: 500;
  266. }
  267. /* Navigation Controls */
  268. .controls {
  269. position: absolute;
  270. bottom: 2.5vh;
  271. display: flex;
  272. align-items: center;
  273. gap: 2rem;
  274. z-index: 100;
  275. }
  276. .nav-btn {
  277. background: rgba(255, 255, 255, 0.05);
  278. border: 1px solid var(--border-color);
  279. border-radius: 50%;
  280. width: 50px;
  281. height: 50px;
  282. color: var(--text-primary);
  283. cursor: pointer;
  284. display: flex;
  285. justify-content: center;
  286. align-items: center;
  287. font-size: 1.2rem;
  288. transition: all 0.2s ease;
  289. }
  290. .nav-btn:hover:not(:disabled) {
  291. background: rgba(52, 211, 153, 0.2);
  292. border-color: var(--primary-accent);
  293. box-shadow: 0 0 15px var(--glow-color);
  294. color: #fff;
  295. transform: scale(1.05);
  296. }
  297. .nav-btn:disabled {
  298. opacity: 0.3;
  299. cursor: not-allowed;
  300. }
  301. .progress-bar-container {
  302. width: 250px;
  303. height: 6px;
  304. background: rgba(255, 255, 255, 0.05);
  305. border-radius: 3px;
  306. overflow: hidden;
  307. }
  308. .progress-bar {
  309. height: 100%;
  310. width: 0%;
  311. background: linear-gradient(90deg, var(--primary-accent), var(--secondary-accent));
  312. border-radius: 3px;
  313. transition: width 0.4s ease;
  314. }
  315. .slide-counter {
  316. font-family: var(--font-mono);
  317. font-size: 0.85rem;
  318. color: var(--text-secondary);
  319. min-width: 100px;
  320. text-align: center;
  321. }
  322. /* Badges */
  323. .badge {
  324. display: inline-block;
  325. padding: 0.2rem 0.6rem;
  326. font-size: 0.8rem;
  327. font-weight: 600;
  328. border-radius: 4px;
  329. text-transform: uppercase;
  330. }
  331. .badge-red { background: rgba(239, 68, 68, 0.15); border: 1px solid rgba(239, 68, 68, 0.3); color: #f87171; }
  332. .badge-green { background: rgba(16, 185, 129, 0.15); border: 1px solid rgba(16, 185, 129, 0.3); color: #34d399; }
  333. </style>
  334. </head>
  335. <body>
  336. <div class="presentation-container">
  337. <div class="slide-deck">
  338. <!-- Slide 1: Title -->
  339. <div class="slide title-slide active">
  340. <div class="slide-header">
  341. <span class="tag">Local Food AI</span>
  342. <span class="title-badge">USER GUIDE</span>
  343. </div>
  344. <div class="slide-body">
  345. <h1 class="slide-title">Local Food AI Platform</h1>
  346. <p class="subtitle">Clinician User Manual & Functional Application Walkthrough</p>
  347. <div class="meta-grid">
  348. <div class="meta-item">
  349. <span class="meta-label">Audience</span>
  350. <span class="meta-value">Clinical Staff & Users</span>
  351. </div>
  352. <div class="meta-item">
  353. <span class="meta-label">Author</span>
  354. <span class="meta-value">Francois Lange</span>
  355. </div>
  356. <div class="meta-item">
  357. <span class="meta-label">Status</span>
  358. <span class="meta-value">Ready (production)</span>
  359. </div>
  360. </div>
  361. </div>
  362. <div class="slide-footer">
  363. <span>Domain-specific Project 1 (DSP1) - Clinical Guide</span>
  364. <span>1 / 9</span>
  365. </div>
  366. </div>
  367. <!-- Slide 2: Vision -->
  368. <div class="slide">
  369. <div class="slide-header">
  370. <span class="tag">Project Vision</span>
  371. <span class="title-badge">PRIVACY FIRST</span>
  372. </div>
  373. <div class="slide-body">
  374. <h2 class="slide-title">The Vision: A Privacy-First Clinical Dietitian</h2>
  375. <div class="slide-grid-2">
  376. <div>
  377. <ul>
  378. <li><strong>Complete HIPAA Compliance</strong>: Patient dietary parameters, medical diagnoses, and recipe histories remain 100% inside your building.</li>
  379. <li><strong>Adaptive AI Specialist</strong>: The local AI engine adapts instantly to user selections (e.g., pregnancy, kidney disease, diabetes).</li>
  380. <li><strong>Fully Local RAG Intelligence</strong>: Bypasses slow and risky cloud queries by retrieving context entirely from in-house databases.</li>
  381. </ul>
  382. </div>
  383. <div class="card" style="border-color: rgba(52, 211, 153, 0.2);">
  384. <div class="card-title"><span class="icon">🔒</span> Air-Gapped Advantage</div>
  385. <div class="card-desc">
  386. "Unlike ChatGPT or consumer dietary trackers, Local Food AI never leaks clinic logs or clinician search strings to third-party databases."
  387. </div>
  388. </div>
  389. </div>
  390. </div>
  391. <div class="slide-footer">
  392. <span>Local Food AI - User Presentation</span>
  393. <span>2 / 9</span>
  394. </div>
  395. </div>
  396. <!-- Slide 3: Secure Logging -->
  397. <div class="slide">
  398. <div class="slide-header">
  399. <span class="tag">Access Control</span>
  400. <span class="title-badge">LOGIN & SECURITY</span>
  401. </div>
  402. <div class="slide-body">
  403. <h2 class="slide-title">Secure Authentication & Password Recovery</h2>
  404. <div class="slide-grid-2">
  405. <div>
  406. <ul>
  407. <li><strong>Bcrypt Hashed Credentials</strong>: Heavy database level encryption blocks unauthorized entry.</li>
  408. <li><strong>Sidebar Session Status</strong>: Displays the active user, network mode, and active LLM version details.</li>
  409. <li><strong>Outbound Email Recovery</strong>: Integrated password reset routing via secure internal SMTP relays.</li>
  410. </ul>
  411. </div>
  412. <div class="slide-grid-2" style="grid-template-columns: 1fr; gap: 1rem;">
  413. <div class="card">
  414. <div class="card-title"><span class="icon">👤</span> Cookie Timeout</div>
  415. <div class="card-desc">Secures sessions on shared ward computers, preventing patient detail access.</div>
  416. </div>
  417. <div class="card">
  418. <div class="card-title"><span class="icon">🔑</span> Self-Serve Resets</div>
  419. <div class="card-desc">Request reset loops dispatch direct recovery keys to the clinician's inbox.</div>
  420. </div>
  421. </div>
  422. </div>
  423. </div>
  424. <div class="slide-footer">
  425. <span>Local Food AI - User Presentation</span>
  426. <span>3 / 9</span>
  427. </div>
  428. </div>
  429. <!-- Slide 4: Data Search -->
  430. <div class="slide">
  431. <div class="slide-header">
  432. <span class="tag">Clinical Search</span>
  433. <span class="title-badge">DATABASE FILTERS</span>
  434. </div>
  435. <div class="slide-body">
  436. <h2 class="slide-title">Tab 1: High-Speed Database Exploration</h2>
  437. <div class="slide-grid-2">
  438. <div>
  439. <ul>
  440. <li><strong>Real-Time Searching</strong>: Access millions of OpenFoodFacts entries in under <span class="highlight-text">0.04 seconds</span>.</li>
  441. <li><strong>Dynamic Warnings</strong>: Automatically overlays warning indicators based on active patient profile constraints.</li>
  442. <li><strong>Flexible Column Config</strong>: Custom selections allow dietitians to inspect precise vitamins and minerals.</li>
  443. </ul>
  444. </div>
  445. <div class="card">
  446. <div class="card-title"><span class="icon">🥗</span> Product Search Cards</div>
  447. <div style="margin-top: 1rem; border-top: 1px solid var(--border-color); padding-top: 1rem;">
  448. <div style="display:flex; justify-content:space-between; align-items:center; margin-bottom: 0.8rem;">
  449. <strong>Unpasteurized Brie</strong>
  450. <span class="badge badge-red">High Risk</span>
  451. </div>
  452. <p style="font-size: 0.85rem; color: var(--text-secondary); margin-bottom: 1rem;">
  453. Listeria Risk: Avoid raw/unpasteurized soft cheeses during pregnancy.
  454. </p>
  455. <div style="display:flex; justify-content:space-between; align-items:center;">
  456. <strong>Raw Spinach</strong>
  457. <span class="badge badge-green">Recommended</span>
  458. </div>
  459. <p style="font-size: 0.85rem; color: var(--text-secondary);">
  460. High Iron & Folate: Encourages fetal cell growth.
  461. </p>
  462. </div>
  463. </div>
  464. </div>
  465. </div>
  466. <div class="slide-footer">
  467. <span>Local Food AI - User Presentation</span>
  468. <span>4 / 9</span>
  469. </div>
  470. </div>
  471. <!-- Slide 5: Plate Builder -->
  472. <div class="slide">
  473. <div class="slide-header">
  474. <span class="tag">Plate Formulation</span>
  475. <span class="title-badge">MY PLATE BUILDER</span>
  476. </div>
  477. <div class="slide-body">
  478. <h2 class="slide-title">Tab 2: My Plate Builder & Portion Parser</h2>
  479. <div class="slide-grid-2">
  480. <div>
  481. <ul>
  482. <li><strong>Natural Unit Parser</strong>: Clinicians can enter quantities in plain English (e.g. `1.5 cups`, `2 tablespoons`).</li>
  483. <li><strong>Density Conversions</strong>: Converts volume measurements into metric grams based on food density maps.</li>
  484. <li><strong>Cumulative Totals</strong>: Displays real-time compound macro updates (Proteins, Carbs, Fats).</li>
  485. </ul>
  486. </div>
  487. <div class="card">
  488. <div class="card-title"><span class="icon">📊</span> Macro intake vs Thresholds</div>
  489. <div style="margin-top: 1rem; display:flex; flex-direction:column; gap: 0.6rem;">
  490. <div>
  491. <div style="display:flex; justify-content:space-between; font-size:0.8rem; margin-bottom:0.2rem;">
  492. <span>Protein (70g Target)</span>
  493. <span>52g (74%)</span>
  494. </div>
  495. <div style="width:100%; height:8px; background:#222; border-radius:4px; overflow:hidden;">
  496. <div style="width:74%; height:100%; background:var(--primary-accent);"></div>
  497. </div>
  498. </div>
  499. <div>
  500. <div style="display:flex; justify-content:space-between; font-size:0.8rem; margin-bottom:0.2rem;">
  501. <span>Sodium (2000mg Limit)</span>
  502. <span>420mg (21%)</span>
  503. </div>
  504. <div style="width:100%; height:8px; background:#222; border-radius:4px; overflow:hidden;">
  505. <div style="width:21%; height:100%; background:var(--secondary-accent);"></div>
  506. </div>
  507. </div>
  508. </div>
  509. </div>
  510. </div>
  511. </div>
  512. <div class="slide-footer">
  513. <span>Local Food AI - User Presentation</span>
  514. <span>5 / 9</span>
  515. </div>
  516. </div>
  517. <!-- Slide 6: Consultation Chat -->
  518. <div class="slide">
  519. <div class="slide-header">
  520. <span class="tag">Interactive AI</span>
  521. <span class="title-badge">CONSULTATION CHAT</span>
  522. </div>
  523. <div class="slide-body">
  524. <h2 class="slide-title">Tab 3: Clinician Consultation Portal</h2>
  525. <div class="slide-grid-2">
  526. <div>
  527. <ul>
  528. <li><strong>Client Profile Dropdown</strong>: Select medical conditions (Diabetes, Anemia, Hypertension, Pregnancy).</li>
  529. <li><strong>Verified database queries (RAG)</strong>: The local model queries local food data first to ensure factual responses.</li>
  530. <li><strong>Chain-of-Thought Explanation</strong>: Explains details step-by-step to help clinicians verify reasoning path safety.</li>
  531. </ul>
  532. </div>
  533. <div class="card" style="background:#161b22; font-family:var(--font-mono); font-size:0.85rem;">
  534. <div style="color:var(--primary-accent); margin-bottom:0.4rem;">&gt; Can my diabetic client eat dates?</div>
  535. <div style="color:var(--text-secondary); margin-bottom:0.4rem;">&lt;thought&gt;
  536. Checking glycaemic index... Dates contain ~66g sugar per 100g. High GI load. Injected profile is Diabetes.
  537. &lt;/thought&gt;</div>
  538. <div style="color:#fff;">Dates are high in simple sugars (GI ~103). Recommend limiting portion to &lt;20g and pairing with almonds to slow absorption.</div>
  539. </div>
  540. </div>
  541. </div>
  542. <div class="slide-footer">
  543. <span>Local Food AI - User Presentation</span>
  544. <span>6 / 9</span>
  545. </div>
  546. </div>
  547. <!-- Slide 7: Meal Planner -->
  548. <div class="slide">
  549. <div class="slide-header">
  550. <span class="tag">Diet Plans</span>
  551. <span class="title-badge">AI MEAL PLANNER</span>
  552. </div>
  553. <div class="slide-body">
  554. <h2 class="slide-title">Tab 4: Automated Clinical Meal Planner</h2>
  555. <div class="slide-grid-2">
  556. <div>
  557. <ul>
  558. <li><strong>Daily Caloric Targets</strong>: Input targets (e.g. `2000 kcal`) to scale portion recommendations.</li>
  559. <li><strong>Diet constraints integration</strong>: Enter restrictions (e.g. Halal, Vegan, Low-Fat, Kosher).</li>
  560. <li><strong>Printable Grid output</strong>: Formats the entire breakdown (Breakfast, Lunch, Dinner) into clean tables.</li>
  561. </ul>
  562. </div>
  563. <table style="width: 100%; border-collapse: collapse; font-size: 0.85rem; text-align: left;">
  564. <thead>
  565. <tr style="border-bottom: 1px solid var(--border-color); color:#fff;">
  566. <th style="padding: 0.5rem 0;">Meal</th>
  567. <th style="padding: 0.5rem 0;">Proposed Food</th>
  568. <th style="padding: 0.5rem 0;">Kcal</th>
  569. </tr>
  570. </thead>
  571. <tbody>
  572. <tr style="border-bottom: 1px dashed var(--border-color);">
  573. <td style="padding: 0.5rem 0;">Breakfast</td>
  574. <td style="padding: 0.5rem 0; color:var(--primary-accent);">Oatmeal with Walnuts & Bananas</td>
  575. <td style="padding: 0.5rem 0;">450</td>
  576. </tr>
  577. <tr style="border-bottom: 1px dashed var(--border-color);">
  578. <td style="padding: 0.5rem 0;">Lunch</td>
  579. <td style="padding: 0.5rem 0; color:var(--primary-accent);">Quinoa & Roasted Veggie Salad</td>
  580. <td style="padding: 0.5rem 0;">650</td>
  581. </tr>
  582. <tr>
  583. <td style="padding: 0.5rem 0;">Dinner</td>
  584. <td style="padding: 0.5rem 0; color:var(--primary-accent);">Lentil Dahl with Brown Rice</td>
  585. <td style="padding: 0.5rem 0;">750</td>
  586. </tr>
  587. </tbody>
  588. </table>
  589. </div>
  590. </div>
  591. <div class="slide-footer">
  592. <span>Local Food AI - User Presentation</span>
  593. <span>7 / 9</span>
  594. </div>
  595. </div>
  596. <!-- Slide 8: Privacy Guarantees -->
  597. <div class="slide">
  598. <div class="slide-header">
  599. <span class="tag">Security</span>
  600. <span class="title-badge">PRIVACY GUARANTEED</span>
  601. </div>
  602. <div class="slide-body">
  603. <h2 class="slide-title">How Your Patient Data is Protected</h2>
  604. <div class="slide-grid-2">
  605. <div>
  606. <ul>
  607. <li class="warning-li"><strong>No External API Transmissions</strong>: Patient data stays locally in memory. Zero external sharing.</li>
  608. <li><strong>Anonymous SearXNG Meta-Search</strong>: External searches are stripped of cookies and clinic source tags.</li>
  609. <li><strong>Isolated Networks</strong>: System nodes run in private networks, blocking external access.</li>
  610. </ul>
  611. </div>
  612. <div class="card" style="background: rgba(52, 211, 153, 0.05); border-color: rgba(52, 211, 153, 0.2);">
  613. <div class="card-title" style="color: var(--primary-accent);"><span class="icon">🔒</span> Hospital-Grade Data Security</div>
  614. <div class="card-desc" style="color: var(--text-primary);">
  615. All processing occurs inside your facility's firewall. Local databases and local AI engines guarantee complete privacy compliance.
  616. </div>
  617. </div>
  618. </div>
  619. </div>
  620. <div class="slide-footer">
  621. <span>Local Food AI - User Presentation</span>
  622. <span>8 / 9</span>
  623. </div>
  624. </div>
  625. <!-- Slide 9: User Workflow Walkthrough -->
  626. <div class="slide">
  627. <div class="slide-header">
  628. <span class="tag">Application Use</span>
  629. <span class="title-badge">WORKFLOW STEPS</span>
  630. </div>
  631. <div class="slide-body">
  632. <h2 class="slide-title">Step-by-Step Clinical Workflow</h2>
  633. <div class="slide-grid-3">
  634. <div class="card">
  635. <div class="card-title">1. Patient Profile</div>
  636. <div class="card-desc">Select active health restrictions and medical conditions in the sidebar selector.</div>
  637. </div>
  638. <div class="card">
  639. <div class="card-title">2. Build Diet Plate</div>
  640. <div class="card-desc">Search foods, add to plate, and adjust portions using natural volumes.</div>
  641. </div>
  642. <div class="card">
  643. <div class="card-title">3. Consult AI</div>
  644. <div class="card-desc">Generate meal plans, check safety flags, and view the AI's clinical reasoning.</div>
  645. </div>
  646. </div>
  647. </div>
  648. <div class="slide-footer">
  649. <span>Local Food AI - User Presentation</span>
  650. <span>9 / 9</span>
  651. </div>
  652. </div>
  653. </div>
  654. </div>
  655. <!-- Navigation Controls -->
  656. <div class="controls">
  657. <button class="nav-btn" id="prevBtn" aria-label="Previous slide">←</button>
  658. <div class="progress-bar-container">
  659. <div class="progress-bar" id="progress"></div>
  660. </div>
  661. <span class="slide-counter" id="counter">Slide 1 of 9</span>
  662. <button class="nav-btn" id="nextBtn" aria-label="Next slide">→</button>
  663. </div>
  664. <script>
  665. let currentSlide = 0;
  666. const slides = document.querySelectorAll('.slide');
  667. const totalSlides = slides.length;
  668. const prevBtn = document.getElementById('prevBtn');
  669. const nextBtn = document.getElementById('nextBtn');
  670. const progress = document.getElementById('progress');
  671. const counter = document.getElementById('counter');
  672. function updateSlides() {
  673. slides.forEach((slide, idx) => {
  674. slide.classList.remove('active', 'prev', 'next');
  675. if (idx === currentSlide) {
  676. slide.classList.add('active');
  677. } else if (idx < currentSlide) {
  678. slide.classList.add('prev');
  679. } else {
  680. slide.classList.add('next');
  681. }
  682. });
  683. // Update progress bar
  684. const pct = ((currentSlide + 1) / totalSlides) * 100;
  685. progress.style.width = `${pct}%`;
  686. // Update slide counter
  687. counter.innerText = `Slide ${currentSlide + 1} of ${totalSlides}`;
  688. // Disable buttons at bounds
  689. prevBtn.disabled = currentSlide === 0;
  690. nextBtn.disabled = currentSlide === totalSlides - 1;
  691. }
  692. prevBtn.addEventListener('click', () => {
  693. if (currentSlide > 0) {
  694. currentSlide--;
  695. updateSlides();
  696. }
  697. });
  698. nextBtn.addEventListener('click', () => {
  699. if (currentSlide < totalSlides - 1) {
  700. currentSlide++;
  701. updateSlides();
  702. }
  703. });
  704. // Key bindings
  705. document.addEventListener('keydown', (e) => {
  706. if (e.key === 'ArrowRight' || e.key === ' ') {
  707. if (currentSlide < totalSlides - 1) {
  708. currentSlide++;
  709. updateSlides();
  710. }
  711. } else if (e.key === 'ArrowLeft') {
  712. if (currentSlide > 0) {
  713. currentSlide--;
  714. updateSlides();
  715. }
  716. }
  717. });
  718. updateSlides();
  719. </script>
  720. </body>
  721. </html>