Marcel0123 commited on
Commit
36bae99
·
verified ·
1 Parent(s): 4c172b9

Upload index.html

Browse files
Files changed (1) hide show
  1. index.html +42 -7
index.html CHANGED
@@ -409,12 +409,33 @@
409
  animation:orchestraV5Chase 1s linear infinite !important;
410
  }
411
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
412
  </style></head>
413
  <body>
414
  <div class="app">
415
  <main class="main">
416
  <header><div class="header-copy"><div class="eyebrow">REAKT / AI ANALYTICS PLATFORM</div><h1>Inloop <span>Intelligence</span> <em>ORCHESTRA</em></h1><p>Maak complexe informatie begrijpelijk en toegankelijk voor iedereen.</p></div><div class="orchestra-hero-title" aria-label="ORCHESTRA by Marcel Ooms"><span class="orchestra-hero-word">ORCHESTRA</span><span class="orchestra-hero-credit">by Marcel Ooms</span></div><div class="header-center-logo"><div class="reakt-wordmark" role="img" aria-label="Reakt — Werken aan je toekomst"><strong class="reakt-name">Reakt</strong><span class="reakt-tagline">Werken aan je toekomst</span></div></div><div class="header-actions"><span class="pill"><i></i> LOKALE ANALYSE</span><span class="clock" id="clock"></span></div></header>
417
- <div class="topbar"><div><span class="section-kicker">CONTROL CENTER</span><h2>Agent Command Center <span class="live-dot"></span></h2></div><div class="actions"><label class="pace-label" for="paceSelect">Weergave <select id="paceSelect" aria-label="Animatiesnelheid"><option value="presentation">Presentatie ± 30 sec</option><option value="fast">Snel ± 6 sec</option></select></label><button id="resetBtn" class="ghost">↺ Reset</button><button id="startBtn" class="primary">▶ Start voorbeeldanalyse</button></div></div>
418
  <section class="import-panel panel" aria-label="Lokale Excelanalyse met 2026 en historische referentie 2025">
419
  <div class="import-intro"><span class="section-kicker">ORCHESTRA NEXT · BROWSER-LOKAAL</span><strong>Scanregistratie 2026 + referentie 2025</strong><small>Browser-lokale analyse · alle bronlocaties · geen bestanden in Space-repository</small></div>
420
  <label class="import-file-label" for="scanFile"><span>▤</span> Rapportage 2026 (.xlsx)</label><input type="file" id="scanFile" accept=".xlsx" aria-label="Rapportagebestand januari tot en met september 2026" />
@@ -472,7 +493,19 @@
472
  <section class="panel logpanel"><div class="panel-heading"><div><span class="section-kicker">REAL-TIME PROCESS</span><h3>Agent activity log</h3></div><span class="subtle" id="logStatus">Stand-by</span></div><div class="logs" id="logs"><div class="logitem muted">◌ &nbsp; Klik op ‘Start demo-analyse’ om de workflow te bekijken.</div></div></section>
473
  </div>
474
  <aside class="right-content"><section class="panel chatpanel"><div class="panel-heading"><div><span class="section-kicker">MANAGEMENT ASSISTENT</span><h3><span class="chat-icon">✧</span> Vraag het aan Inloop AI</h3></div><span class="demo-badge">DEMO</span></div><div class="chat-messages" id="messages"><div class="message assistant"><small>INLOOP AI · DEMONSTRATIE</small><p>Welkom! Start de demo-analyse en stel daarna een vraag over de fictieve locatiecijfers.</p></div></div><div class="quick-questions"><button data-q="Welke locatie groeit het sterkst?">Grootste groei?</button><button data-q="Zijn de cijfers gevalideerd?">Validatiestatus?</button><button data-q="Maak een managementsamenvatting">Samenvatting?</button></div><form id="chatForm" class="chat-form"><input id="chatInput" autocomplete="off" placeholder="Stel een vraag over de demo..." aria-label="Vraag aan Inloop AI"><button aria-label="Verstuur vraag">➤</button></form><div class="chat-disclaimer">Vooraf ingestelde demo-antwoorden · geen echte AI</div></section>
475
- <section class="panel preview"><div class="panel-heading"><div><span class="section-kicker">OUTPUT</span><h3>Infographic preview</h3></div><span class="warn-label">CONCEPT</span></div><div class="paper"><div class="paper-top"><strong>REAKT<span>.</span></strong><small>INLOOPMONITOR / Q3 2026</small></div><h4>Inloop in beeld</h4><p>Illustratieve managementrapportage</p><div class="paper-kpis"><div><strong>12.480</strong><small>Bezoeken</small></div><div><strong>1.286</strong><small>Uniek</small></div><div><strong>164</strong><small>Instroom</small></div></div><div class="paper-bars"><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i></div><div class="paper-watermark">FICTIEVE DATA · NIET GEVALIDEERD</div></div><button class="export" id="exportBtn">▣ Open witte Reakt-monitor</button></section></aside>
 
 
 
 
 
 
 
 
 
 
 
 
476
  </div>
477
  <footer>REAKT INLOOP INTELLIGENCE <span>ORCHESTRA PROTOTYPE · LOKALE VERWERKING · CONTROLEER CIJFERS VÓÓR PUBLICATIE</span></footer>
478
  </main>
@@ -1033,10 +1066,6 @@ function renderImported(result){
1033
  document.querySelector('.verification .warning').textContent=quality.mismatches?`⚠ ${quality.mismatches} interne telverschillen gevonden. Cijfers nader onderzoeken. NIET GEVALIDEERD.`:
1034
  quality.sourceIssues.length?`⚠ Tweede telling sluit aan; ${quality.sourceIssues.length} soorten bronafwijkingen beoordeeld. Zie aantallen en KPI-impact hierboven. NIET EXTERN GEVALIDEERD.`:
1035
  `✓ ${quality.checks.length} interne telcontroles sluiten aan. ${result.historyLoaded?'Historie 2025 meegenomen.':'2025 ontbreekt: instroom voorlopig.'} Businesscontrollercontrole optioneel; niet extern gevalideerd.`;
1036
- document.querySelector('.paper-watermark').textContent='LOKALE EXCEL-ANALYSE · NIET EXTERN GEVALIDEERD';
1037
- document.querySelector('.paper p').textContent=result.period.label+' · lokale Excel-proef · niet voor publicatie';
1038
- const pk=document.querySelectorAll('.paper-kpis strong');[num(result.visits),num(result.unique),num(result.newIntake)].forEach((x,i)=>{if(pk[i])pk[i].textContent=x});
1039
- const pl=document.querySelectorAll('.paper-kpis small');if(pl[2])pl[2].textContent='Eerste geldige scan in '+result.period.label;
1040
  }
1041
  async function startImported(){
1042
  if(running)return;
@@ -1271,6 +1300,9 @@ $('reportPng').addEventListener('click',()=>downloadReportImage('png'));
1271
  $('reportJpg').addEventListener('click',()=>downloadReportImage('jpg'));
1272
  document.addEventListener('keydown',e=>{if(e.key==='Escape'&&$('reportOverlay').classList.contains('open'))closeWhiteReport()});
1273
 
 
 
 
1274
  $('startBtn').addEventListener('click',start);$('resetBtn').addEventListener('click',reset);$('chatForm').addEventListener('submit',e=>{e.preventDefault();const q=$('chatInput').value;$('chatInput').value='';ask(q)});document.querySelectorAll('[data-q]').forEach(b=>b.addEventListener('click',()=>ask(b.dataset.q)));$('exportBtn').addEventListener('click',openWhiteReport);
1275
  Promise.resolve({ok:true,json:async()=>JSON.parse(document.getElementById('orchestra-demo-data').textContent)}).then(r=>r.json()).then(d=>{demoData=d;renderKPIs(d);renderChecks(d);drawChart(d)}).catch(()=>log('Demo-gegevens konden niet worden geladen'));
1276
 
@@ -1558,7 +1590,7 @@ async function nextStartImported(){
1558
  $('flowState').textContent='Concept beschikbaar · NIET EXTERN GEVALIDEERD';$('logStatus').textContent='Afgerond';
1559
  log(`Echte berekening, interne verificatie en weergave: ${(cpu/1000).toFixed(2)} sec. Geanimeerde procesweergave: ${((performance.now()-timestamp)/1000).toFixed(1)} sec (exclusief Excel-invoer).`);
1560
  }catch(err){log('FOUT: '+err.message);$('flowState').textContent='Berekening of weergave mislukt';conductor.classList.add('attention');$('conductorStatus').textContent='Fout gedetecteerd';}
1561
- finally{nextClearNetwork(false);running=false;nextIsRunning=false;$('startBtn').disabled=false;$('resetBtn').disabled=false;conductor.classList.remove('running');document.querySelector('.orchestra').classList.remove('running');}
1562
  }
1563
  start=async function(){
1564
  if(running)return;
@@ -1568,6 +1600,9 @@ start=async function(){
1568
  return nextOriginalStart();
1569
  };
1570
  $('startBtn').removeEventListener('click',nextOriginalStart);
 
 
 
1571
  $('startBtn').addEventListener('click',start);
1572
  window.addEventListener('resize',()=>requestAnimationFrame(nextBuildGraph));
1573
  if(typeof ResizeObserver!=='undefined')new ResizeObserver(()=>requestAnimationFrame(nextBuildGraph)).observe(document.querySelector('.orchestra'));
 
409
  animation:orchestraV5Chase 1s linear infinite !important;
410
  }
411
  }
412
+
413
+ /* ORCHESTRA NEXT v7 — direct dashboard en toekomstige AI Insight Studio */
414
+ .dashboard-top-button{background:linear-gradient(110deg,#16725f,#1585a7);border:1px solid #39a5a5;box-shadow:0 5px 19px rgba(27,184,171,.18);white-space:nowrap}
415
+ .dashboard-top-button:disabled{opacity:.45;filter:grayscale(.3);box-shadow:none;cursor:not-allowed}
416
+ .insight-studio{padding:19px 18px 18px;position:relative;overflow:hidden;border-color:#365477;background:radial-gradient(circle at 10% 0%,rgba(28,111,160,.26),transparent 46%),linear-gradient(145deg,#112440,#0a172b)}
417
+ .insight-studio::after{content:'';position:absolute;right:-65px;top:-75px;width:180px;height:180px;border:1px solid #4ebfdd20;border-radius:50%;box-shadow:0 0 0 22px #4ebfdd0a,0 0 0 46px #4ebfdd08;pointer-events:none}
418
+ .insight-heading{display:flex;gap:13px;align-items:center;margin-bottom:14px;position:relative;z-index:1}
419
+ .insight-symbol{width:47px;height:47px;display:grid;place-items:center;flex:none;font-size:27px;color:#b3f1ff;border:1px solid #4a96cf;border-radius:12px;background:#152d50;box-shadow:0 0 22px #3bc9e533}
420
+ .insight-heading h3{font-size:19px;margin:4px 0;color:#ecf9ff;letter-spacing:.3px}
421
+ .insight-heading p{font-size:11px;line-height:1.45;color:#a6bfdd;margin:0}
422
+ .insight-state{font-size:10px;color:#9fc7df;background:#122d40;border:1px solid #296178;border-radius:8px;padding:9px 11px;line-height:1.5}
423
+ .insight-state-dot{display:inline-block;width:7px;height:7px;border-radius:50%;background:#7ad8f0;margin-right:6px;box-shadow:0 0 8px #65d9f6}
424
+ .insight-intro{font-size:12px;color:#d6eaff;margin:18px 0 11px;font-weight:600}
425
+ .insight-questions{display:flex;flex-direction:column;gap:9px}
426
+ .insight-question{display:flex;gap:11px;align-items:start;border:1px solid #2c4767;background:linear-gradient(110deg,#152944,#10223b);border-radius:10px;padding:12px 11px;transition:border-color .2s,transform .2s}
427
+ .insight-question:hover{border-color:var(--insight);transform:translateX(2px)}
428
+ .insight-q-icon{width:30px;height:30px;border-radius:8px;display:grid;place-items:center;flex:none;background:color-mix(in srgb,var(--insight) 12%,#12213a);color:var(--insight);font-size:19px;border:1px solid color-mix(in srgb,var(--insight) 40%,#243953)}
429
+ .insight-question strong{display:block;color:#eef6ff;font-size:12px;margin:1px 0 4px}
430
+ .insight-question p{font-size:11px;line-height:1.48;color:#b4cce6;margin:0}
431
+ .insight-note{font-size:10px;line-height:1.55;color:#a0b6d4;margin-top:15px;border-top:1px solid #2c4462;padding-top:12px}
432
+ @media(max-width:900px){.topbar .actions{flex-wrap:wrap;justify-content:flex-end}}
433
  </style></head>
434
  <body>
435
  <div class="app">
436
  <main class="main">
437
  <header><div class="header-copy"><div class="eyebrow">REAKT / AI ANALYTICS PLATFORM</div><h1>Inloop <span>Intelligence</span> <em>ORCHESTRA</em></h1><p>Maak complexe informatie begrijpelijk en toegankelijk voor iedereen.</p></div><div class="orchestra-hero-title" aria-label="ORCHESTRA by Marcel Ooms"><span class="orchestra-hero-word">ORCHESTRA</span><span class="orchestra-hero-credit">by Marcel Ooms</span></div><div class="header-center-logo"><div class="reakt-wordmark" role="img" aria-label="Reakt — Werken aan je toekomst"><strong class="reakt-name">Reakt</strong><span class="reakt-tagline">Werken aan je toekomst</span></div></div><div class="header-actions"><span class="pill"><i></i> LOKALE ANALYSE</span><span class="clock" id="clock"></span></div></header>
438
+ <div class="topbar"><div><span class="section-kicker">CONTROL CENTER</span><h2>Agent Command Center <span class="live-dot"></span></h2></div><div class="actions"><label class="pace-label" for="paceSelect">Weergave <select id="paceSelect" aria-label="Animatiesnelheid"><option value="presentation">Presentatie ± 30 sec</option><option value="fast">Snel ± 6 sec</option></select></label><button id="resetBtn" class="ghost">↺ Reset</button><button id="startBtn" class="primary">▶ Start voorbeeldanalyse</button><button id="exportBtn" class="dashboard-top-button" disabled title="Analyseer eerst één locatie">▣ Open dashboard</button></div></div>
439
  <section class="import-panel panel" aria-label="Lokale Excelanalyse met 2026 en historische referentie 2025">
440
  <div class="import-intro"><span class="section-kicker">ORCHESTRA NEXT · BROWSER-LOKAAL</span><strong>Scanregistratie 2026 + referentie 2025</strong><small>Browser-lokale analyse · alle bronlocaties · geen bestanden in Space-repository</small></div>
441
  <label class="import-file-label" for="scanFile"><span>▤</span> Rapportage 2026 (.xlsx)</label><input type="file" id="scanFile" accept=".xlsx" aria-label="Rapportagebestand januari tot en met september 2026" />
 
493
  <section class="panel logpanel"><div class="panel-heading"><div><span class="section-kicker">REAL-TIME PROCESS</span><h3>Agent activity log</h3></div><span class="subtle" id="logStatus">Stand-by</span></div><div class="logs" id="logs"><div class="logitem muted">◌ &nbsp; Klik op ‘Start demo-analyse’ om de workflow te bekijken.</div></div></section>
494
  </div>
495
  <aside class="right-content"><section class="panel chatpanel"><div class="panel-heading"><div><span class="section-kicker">MANAGEMENT ASSISTENT</span><h3><span class="chat-icon">✧</span> Vraag het aan Inloop AI</h3></div><span class="demo-badge">DEMO</span></div><div class="chat-messages" id="messages"><div class="message assistant"><small>INLOOP AI · DEMONSTRATIE</small><p>Welkom! Start de demo-analyse en stel daarna een vraag over de fictieve locatiecijfers.</p></div></div><div class="quick-questions"><button data-q="Welke locatie groeit het sterkst?">Grootste groei?</button><button data-q="Zijn de cijfers gevalideerd?">Validatiestatus?</button><button data-q="Maak een managementsamenvatting">Samenvatting?</button></div><form id="chatForm" class="chat-form"><input id="chatInput" autocomplete="off" placeholder="Stel een vraag over de demo..." aria-label="Vraag aan Inloop AI"><button aria-label="Verstuur vraag">➤</button></form><div class="chat-disclaimer">Vooraf ingestelde demo-antwoorden · geen echte AI</div></section>
496
+ <section class="panel insight-studio" aria-label="AI Insight Studio, toekomstige functionaliteit">
497
+ <div class="insight-heading"><div class="insight-symbol">✧</div><div><span class="section-kicker">TOEKOMST · ORCHESTRA NEXT</span><h3>AI INSIGHT STUDIO</h3><p>Van cijfers naar nieuwe vragen en beter onderbouwde inzichten.</p></div></div>
498
+ <div class="insight-state"><span class="insight-state-dot"></span> Concept voor toekomstige uitbreiding · momenteel geen AI-API aangesloten</div>
499
+ <div class="insight-intro">Welke vragen zou je straks aan ORCHESTRA kunnen stellen?</div>
500
+ <div class="insight-questions">
501
+ <div class="insight-question" style="--insight:#59e0c1"><span class="insight-q-icon">↗</span><div><strong>Ontwikkelingen</strong><p>Welke locaties laten de grootste veranderingen in bezoekersaantallen zien?</p></div></div>
502
+ <div class="insight-question" style="--insight:#5fcafa"><span class="insight-q-icon">◎</span><div><strong>Nieuwe instroom</strong><p>Hoe ontwikkelt de instroom zich per kwartaal ten opzichte van eerdere perioden?</p></div></div>
503
+ <div class="insight-question" style="--insight:#bb91ff"><span class="insight-q-icon">◈</span><div><strong>Opvallende patronen</strong><p>Welke veranderingen in bezoekfrequentie en actieve cliënten verdienen nader onderzoek?</p></div></div>
504
+ <div class="insight-question" style="--insight:#ffbd77"><span class="insight-q-icon">⬡</span><div><strong>Datakwaliteit</strong><p>Welke bronafwijkingen kunnen KPI's beïnvloeden en wat blijft onzeker?</p></div></div>
505
+ <div class="insight-question" style="--insight:#f090c6"><span class="insight-q-icon">▤</span><div><strong>Managementsamenvatting</strong><p>Welke ontwikkelingen, aandachtspunten en beperkingen kunnen we feitelijk rapporteren?</p></div></div>
506
+ </div>
507
+ <div class="insight-note">♢ &nbsp; Inspirerende voorbeeldvragen, geen actieve AI-analyse. Een toekomstige API-koppeling vraagt vooraf een privacy- en informatiebeveiligingsbeoordeling. Geen cliëntgegevens naar externe AI-diensten.</div>
508
+ </section></aside>
509
  </div>
510
  <footer>REAKT INLOOP INTELLIGENCE <span>ORCHESTRA PROTOTYPE · LOKALE VERWERKING · CONTROLEER CIJFERS VÓÓR PUBLICATIE</span></footer>
511
  </main>
 
1066
  document.querySelector('.verification .warning').textContent=quality.mismatches?`⚠ ${quality.mismatches} interne telverschillen gevonden. Cijfers nader onderzoeken. NIET GEVALIDEERD.`:
1067
  quality.sourceIssues.length?`⚠ Tweede telling sluit aan; ${quality.sourceIssues.length} soorten bronafwijkingen beoordeeld. Zie aantallen en KPI-impact hierboven. NIET EXTERN GEVALIDEERD.`:
1068
  `✓ ${quality.checks.length} interne telcontroles sluiten aan. ${result.historyLoaded?'Historie 2025 meegenomen.':'2025 ontbreekt: instroom voorlopig.'} Businesscontrollercontrole optioneel; niet extern gevalideerd.`;
 
 
 
 
1069
  }
1070
  async function startImported(){
1071
  if(running)return;
 
1300
  $('reportJpg').addEventListener('click',()=>downloadReportImage('jpg'));
1301
  document.addEventListener('keydown',e=>{if(e.key==='Escape'&&$('reportOverlay').classList.contains('open'))closeWhiteReport()});
1302
 
1303
+ // Dashboard uitsluitend na een afgeronde berekening voor één geselecteerde locatie.
1304
+ function syncDashboardButton(){const b=$('exportBtn');if(b)b.disabled=running||!importedData?.last||importedData.last.site==='*';}
1305
+ ['siteSelect','periodSelect','periodType','scanFile','historyFile'].forEach(id=>$(id)?.addEventListener('change',()=>{$('exportBtn').disabled=true;}));
1306
  $('startBtn').addEventListener('click',start);$('resetBtn').addEventListener('click',reset);$('chatForm').addEventListener('submit',e=>{e.preventDefault();const q=$('chatInput').value;$('chatInput').value='';ask(q)});document.querySelectorAll('[data-q]').forEach(b=>b.addEventListener('click',()=>ask(b.dataset.q)));$('exportBtn').addEventListener('click',openWhiteReport);
1307
  Promise.resolve({ok:true,json:async()=>JSON.parse(document.getElementById('orchestra-demo-data').textContent)}).then(r=>r.json()).then(d=>{demoData=d;renderKPIs(d);renderChecks(d);drawChart(d)}).catch(()=>log('Demo-gegevens konden niet worden geladen'));
1308
 
 
1590
  $('flowState').textContent='Concept beschikbaar · NIET EXTERN GEVALIDEERD';$('logStatus').textContent='Afgerond';
1591
  log(`Echte berekening, interne verificatie en weergave: ${(cpu/1000).toFixed(2)} sec. Geanimeerde procesweergave: ${((performance.now()-timestamp)/1000).toFixed(1)} sec (exclusief Excel-invoer).`);
1592
  }catch(err){log('FOUT: '+err.message);$('flowState').textContent='Berekening of weergave mislukt';conductor.classList.add('attention');$('conductorStatus').textContent='Fout gedetecteerd';}
1593
+ finally{nextClearNetwork(false);running=false;nextIsRunning=false;$('startBtn').disabled=false;$('resetBtn').disabled=false;conductor.classList.remove('running');document.querySelector('.orchestra').classList.remove('running');syncDashboardButton();}
1594
  }
1595
  start=async function(){
1596
  if(running)return;
 
1600
  return nextOriginalStart();
1601
  };
1602
  $('startBtn').removeEventListener('click',nextOriginalStart);
1603
+ // Dashboard uitsluitend na een afgeronde berekening voor één geselecteerde locatie.
1604
+ function syncDashboardButton(){const b=$('exportBtn');if(b)b.disabled=running||!importedData?.last||importedData.last.site==='*';}
1605
+ ['siteSelect','periodSelect','periodType','scanFile','historyFile'].forEach(id=>$(id)?.addEventListener('change',()=>{$('exportBtn').disabled=true;}));
1606
  $('startBtn').addEventListener('click',start);
1607
  window.addEventListener('resize',()=>requestAnimationFrame(nextBuildGraph));
1608
  if(typeof ResizeObserver!=='undefined')new ResizeObserver(()=>requestAnimationFrame(nextBuildGraph)).observe(document.querySelector('.orchestra'));