Upload index.html
Browse files- 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">◌ 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
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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">◌ 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">♢ 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'));
|