Testing347 commited on
Commit
f124ceb
·
verified ·
1 Parent(s): cb13f5f

Update about.html

Browse files
Files changed (1) hide show
  1. about.html +450 -92
about.html CHANGED
@@ -1,3 +1,4 @@
 
1
  <!DOCTYPE html>
2
  <html lang="en">
3
  <head>
@@ -49,6 +50,13 @@
49
 
50
  .conscious-element { transition: all 0.28s ease; }
51
  .conscious-element:hover { transform: translateY(-2px); }
 
 
 
 
 
 
 
52
  </style>
53
  </head>
54
 
@@ -67,13 +75,13 @@
67
 
68
  <div class="flex items-center space-x-3">
69
  <button id="lab-nav-btn"
70
- class="w-10 h-10 rounded-full border border-indigo-500/40 bg-gray-900/20 hover:bg-gray-900/40 backdrop-blur-sm transition flex items-center justify-center"
71
  aria-label="Open Lab Navigator" title="Lab Navigator">
72
  <i class="fas fa-asterisk text-indigo-300 text-sm"></i>
73
  </button>
74
 
75
  <button id="access-btn"
76
- class="px-6 py-2 bg-gradient-to-r from-indigo-600 to-purple-600 rounded-full hover:opacity-90 transition">
77
  Access
78
  </button>
79
  </div>
@@ -84,7 +92,7 @@
84
  <div class="max-w-6xl mx-auto">
85
  <div class="grid grid-cols-1 lg:grid-cols-5 gap-6">
86
 
87
- <!-- LEFT: File Header + Mission -->
88
  <div class="lg:col-span-3 rounded-2xl border border-gray-800 bg-gray-900/20 overflow-hidden aura">
89
  <div class="px-6 py-5 border-b border-gray-800/60 flex items-start justify-between gap-6">
90
  <div>
@@ -113,20 +121,20 @@
113
  <div class="rounded-2xl border border-gray-800 bg-black/20 p-5">
114
  <div class="text-xs text-gray-400 uppercase tracking-wider mb-2">Mission</div>
115
  <div class="text-sm text-gray-300 leading-relaxed">
116
- Advance toward AGI and, eventually, superintelligence by building systems that can reason, experiment, and improve—while preserving governance, auditability, and alignment constraints. The labs identity is methodological: evidence first, iteration always.
117
  </div>
118
  </div>
119
 
120
  <div class="grid grid-cols-1 md:grid-cols-2 gap-4">
121
  <div class="rounded-2xl border border-gray-800 bg-gray-900/30 p-5 conscious-element">
122
- <div class="text-sm font-semibold text-gray-100">What progress means here</div>
123
  <div class="text-sm text-gray-300 mt-2">
124
  Not hype. Measurable capability gains validated by protocols, baselines, and repeatability.
125
  </div>
126
  </div>
127
 
128
  <div class="rounded-2xl border border-gray-800 bg-gray-900/30 p-5 conscious-element">
129
- <div class="text-sm font-semibold text-gray-100">What prestige means here</div>
130
  <div class="text-sm text-gray-300 mt-2">
131
  Discipline: clean evaluations, honest uncertainty, and claims proportional to evidence.
132
  </div>
@@ -142,7 +150,7 @@
142
  <div class="rounded-2xl border border-gray-800 bg-gray-900/30 p-5 conscious-element">
143
  <div class="text-sm font-semibold text-gray-100">What the website is not</div>
144
  <div class="text-sm text-gray-300 mt-2">
145
- Not a claim factory. Not a generic SaaS landing page. Not a busy top menu.”
146
  </div>
147
  </div>
148
  </div>
@@ -154,7 +162,7 @@
154
  We treat AGI as an engineering and scientific frontier: general problem-solving, robust transfer, and the ability to build and validate hypotheses. Superintelligence is approached as a trajectory, not a marketing label.
155
  </p>
156
  <p class="text-gray-400">
157
- Public statements remain conservative. Internally, the lab is oriented toward capability growth alongside governance: constraints, logs, human oversight where appropriate, and fail-closed behavior for agents.
158
  </p>
159
  </div>
160
  </div>
@@ -162,7 +170,7 @@
162
  </div>
163
  </div>
164
 
165
- <!-- RIGHT: Evaluation Doctrine panel -->
166
  <div class="lg:col-span-2 rounded-2xl border border-gray-800 bg-gray-900/30 overflow-hidden">
167
  <div class="px-6 py-5 border-b border-gray-800/60">
168
  <div class="text-lg font-semibold text-gray-100">Evaluation Doctrine</div>
@@ -180,21 +188,21 @@
180
  <div class="rounded-xl border border-gray-800 bg-black/20 p-4">
181
  <div class="text-xs text-gray-400 uppercase tracking-wider mb-2">Rule 2: Claims scale with Evidence</div>
182
  <div class="text-sm text-gray-300">
183
- Public language remains bounded: concept,” prototype,” validated,” with explicit assumptions and limitations.
184
  </div>
185
  </div>
186
 
187
  <div class="rounded-xl border border-gray-800 bg-black/20 p-4">
188
  <div class="text-xs text-gray-400 uppercase tracking-wider mb-2">Rule 3: Uncertainty is a first-class output</div>
189
  <div class="text-sm text-gray-300">
190
- Calibration, confidence, and failure modes are included in reports; no high accuracy statements without replicated benchmarks.
191
  </div>
192
  </div>
193
 
194
  <div class="rounded-xl border border-gray-800 bg-black/20 p-4">
195
  <div class="text-xs text-gray-400 uppercase tracking-wider mb-2">Rule 4: Agents are governed</div>
196
  <div class="text-sm text-gray-300">
197
- AI employees are scoped by permissions, logged actions, approval gates, and verification layers. The system must fail closed.
198
  </div>
199
  </div>
200
 
@@ -214,11 +222,11 @@
214
 
215
  <div class="flex flex-col gap-3">
216
  <button id="open-programs"
217
- class="px-5 py-3 rounded-xl bg-gradient-to-r from-indigo-600 to-purple-600 hover:opacity-90 transition">
218
  Open Programs
219
  </button>
220
  <button id="open-console"
221
- class="px-5 py-3 rounded-xl border border-gray-700 bg-gray-900/20 hover:bg-gray-900/35 transition">
222
  Open Console
223
  </button>
224
  </div>
@@ -258,23 +266,31 @@
258
  <h3 class="text-xl font-bold" id="access-modal-title">Request Access</h3>
259
  <p class="text-gray-400 mt-1">Curated access for research and evaluation</p>
260
  </div>
261
- <button id="close-access-modal" class="text-gray-400 hover:text-white" aria-label="Close">
262
  <i class="fas fa-times"></i>
263
  </button>
264
  </div>
265
 
266
- <form id="access-form" class="space-y-4">
 
 
 
 
 
267
  <div>
268
  <label for="name" class="block text-sm font-medium mb-1">Full Name</label>
269
- <input type="text" id="name" class="w-full bg-gray-800/50 border border-gray-700 rounded-lg px-4 py-2 focus-ring">
 
270
  </div>
271
  <div>
272
  <label for="email" class="block text-sm font-medium mb-1">Email</label>
273
- <input type="email" id="email" class="w-full bg-gray-800/50 border border-gray-700 rounded-lg px-4 py-2 focus-ring">
 
274
  </div>
275
  <div>
276
  <label for="institution" class="block text-sm font-medium mb-1">Institution/Organization</label>
277
- <input type="text" id="institution" class="w-full bg-gray-800/50 border border-gray-700 rounded-lg px-4 py-2 focus-ring">
 
278
  </div>
279
  <div>
280
  <label for="purpose" class="block text-sm font-medium mb-1">Purpose</label>
@@ -285,9 +301,10 @@
285
  <option value="partnership">Partnership</option>
286
  <option value="other">Other</option>
287
  </select>
 
288
  </div>
289
  <div class="pt-2">
290
- <button type="submit" class="w-full py-3 bg-gradient-to-r from-indigo-600 to-purple-600 rounded-lg hover:opacity-90 transition">
291
  Submit Request
292
  </button>
293
  </div>
@@ -318,7 +335,7 @@
318
  </div>
319
 
320
  <button id="lab-nav-close"
321
- class="w-9 h-9 rounded-full border border-gray-800 bg-gray-900/30 hover:bg-gray-900/50 transition flex items-center justify-center"
322
  aria-label="Close Lab Navigator">
323
  <i class="fas fa-times text-gray-300 text-sm"></i>
324
  </button>
@@ -330,34 +347,34 @@
330
  radial-gradient(circle at 70% 70%, rgba(236,72,153,0.10), transparent 50%);"></div>
331
 
332
  <div class="relative grid grid-cols-1 sm:grid-cols-2 gap-3">
333
- <button class="lab-node text-left rounded-xl border border-gray-800 bg-gray-900/30 hover:border-indigo-500/50 hover:bg-gray-900/45 transition p-4"
334
- data-nav="index.html">
335
  <div class="text-sm text-gray-200 font-medium">Start Here</div>
336
  <div class="text-xs text-gray-500 mt-1">Entry interface</div>
337
  </button>
338
 
339
- <button class="lab-node text-left rounded-xl border border-gray-800 bg-gray-900/30 hover:border-indigo-500/50 hover:bg-gray-900/45 transition p-4"
340
- data-nav="capabilities.html">
341
  <div class="text-sm text-gray-200 font-medium">Programs</div>
342
  <div class="text-xs text-gray-500 mt-1">Program Bay</div>
343
  </button>
344
 
345
- <button class="lab-node text-left rounded-xl border border-gray-800 bg-gray-900/30 hover:border-indigo-500/50 hover:bg-gray-900/45 transition p-4"
346
- data-nav="chat.html">
347
  <div class="text-sm text-gray-200 font-medium">Console</div>
348
  <div class="text-xs text-gray-500 mt-1">Controlled chat</div>
349
  </button>
350
 
351
- <button class="lab-node text-left rounded-xl border border-gray-800 bg-gray-900/30 hover:border-indigo-500/50 hover:bg-gray-900/45 transition p-4"
352
- data-nav="research.html">
353
  <div class="text-sm text-gray-200 font-medium">Research</div>
354
  <div class="text-xs text-gray-500 mt-1">Notes and briefs</div>
355
  </button>
356
 
357
- <button class="lab-node text-left rounded-xl border border-gray-800 bg-gray-900/30 hover:border-indigo-500/50 hover:bg-gray-900/45 transition p-4 sm:col-span-2"
358
- data-nav="contact.html">
359
- <div class="text-sm text-gray-200 font-medium">Contact</div>
360
- <div class="text-xs text-gray-500 mt-1">Direct channel</div>
361
  </button>
362
  </div>
363
 
@@ -369,11 +386,45 @@
369
 
370
  <div class="relative rounded-2xl border border-gray-800 bg-gray-900/30 overflow-hidden">
371
  <div class="px-6 py-5 border-b border-gray-800/60">
372
- <div class="text-lg font-semibold text-gray-100">Navigation</div>
373
- <div class="text-xs text-gray-500 mt-1">Reduced surface, consistent interface.</div>
 
 
 
 
 
 
 
 
374
  </div>
375
- <div class="p-6 text-sm text-gray-300 leading-relaxed">
376
- SILENTPATTERN uses the Lab Navigator instead of a conventional top menu. This preserves the “lab console” aesthetic and makes each page feel like a module.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
377
  </div>
378
  </div>
379
 
@@ -382,25 +433,53 @@
382
  </div>
383
 
384
  <script>
385
- /* VANTA BACKGROUND */
386
- const vantaEffect = VANTA.NET({
387
- el: "#vanta-bg",
388
- mouseControls: true,
389
- touchControls: true,
390
- gyroControls: false,
391
- minHeight: 200.00,
392
- minWidth: 200.00,
393
- scale: 1.00,
394
- scaleMobile: 1.00,
395
- color: 0x4f46e5,
396
- backgroundColor: 0x020617,
397
- points: 12.00,
398
- maxDistance: 20.00,
399
- spacing: 15.00
400
- });
401
- window.addEventListener('resize', () => vantaEffect.resize());
 
 
 
 
 
 
 
 
402
 
403
- /* MODAL HELPERS */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
404
  function trapFocus(modal) {
405
  const focusable = modal.querySelectorAll('a, button, input, select, textarea, [tabindex]:not([tabindex="-1"])');
406
  if (!focusable.length) return;
@@ -414,19 +493,19 @@
414
  } else {
415
  if (document.activeElement === last) { e.preventDefault(); first.focus(); }
416
  }
417
- } else if (e.key === 'Escape') {
418
- toggleModal(modal, false);
419
  }
420
  }
421
  modal.addEventListener('keydown', handler);
422
  modal._focusHandler = handler;
423
  }
 
424
  function untrapFocus(modal) {
425
  if (modal._focusHandler) {
426
  modal.removeEventListener('keydown', modal._focusHandler);
427
  delete modal._focusHandler;
428
  }
429
  }
 
430
  const toggleModal = (modal, show) => {
431
  if (show) {
432
  modal.classList.remove('modal-hidden');
@@ -441,67 +520,346 @@
441
  }
442
  };
443
 
444
- /* ACCESS MODAL */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
445
  const accessModal = document.getElementById('access-modal');
446
  const accessBtn = document.getElementById('access-btn');
447
  const closeAccessModal = document.getElementById('close-access-modal');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
448
 
449
- accessBtn.addEventListener('click', () => {
450
- toggleModal(accessModal, true);
451
- setTimeout(() => document.getElementById('name').focus(), 50);
452
- });
453
- closeAccessModal.addEventListener('click', () => toggleModal(accessModal, false));
454
- accessModal.addEventListener('click', (e) => { if (e.target === accessModal) toggleModal(accessModal, false); });
455
-
456
- document.getElementById('access-form').addEventListener('submit', (e) => {
457
- e.preventDefault();
458
- const name = document.getElementById('name').value.trim();
459
- const email = document.getElementById('email').value.trim();
460
- const institution = document.getElementById('institution').value.trim();
461
- const purpose = document.getElementById('purpose').value;
462
- if (!name || !email || !institution || !purpose) {
463
- alert('Please fill in all fields.');
464
- return;
 
 
 
 
 
465
  }
466
- alert('Request received. You will be contacted after review.');
467
- e.target.reset();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
468
  toggleModal(accessModal, false);
469
- });
 
470
 
471
- /* LAB NAVIGATOR */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
472
  const labNav = document.getElementById('lab-navigator');
473
  const labNavBtn = document.getElementById('lab-nav-btn');
474
  const labNavClose = document.getElementById('lab-nav-close');
475
 
476
- function openLabNav() { toggleModal(labNav, true); setTimeout(() => labNav.focus(), 0); }
477
- function closeLabNav() { toggleModal(labNav, false); }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
478
 
479
- labNavBtn.addEventListener('click', openLabNav);
480
- labNavClose.addEventListener('click', closeLabNav);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
481
 
482
  labNav.addEventListener('click', (e) => {
483
  const shouldClose = e.target && e.target.getAttribute('data-lab-close') === 'true';
484
- if (shouldClose) closeLabNav();
485
  });
486
 
487
  document.querySelectorAll('.lab-node').forEach(btn => {
488
  btn.addEventListener('click', () => {
489
- const href = btn.getAttribute('data-nav');
490
- if (href) window.location.href = href;
 
 
 
 
 
 
 
491
  });
492
  });
493
 
494
- /* Quick links */
495
- document.getElementById('open-programs').addEventListener('click', () => { window.location.href = "capabilities.html"; });
496
- document.getElementById('open-console').addEventListener('click', () => { window.location.href = "chat.html"; });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
497
 
498
- /* ESC behavior */
 
 
499
  document.addEventListener('keydown', (e) => {
500
  if (e.key === 'Escape') {
501
- if (labNav && !labNav.classList.contains('modal-hidden')) closeLabNav();
502
- if (accessModal && !accessModal.classList.contains('modal-hidden')) toggleModal(accessModal, false);
503
  }
504
  });
 
 
 
505
  </script>
506
  </body>
507
- </html>
 
1
+ <!-- SILENTPATTERN FINAL BUILD: 2025-12-15 | pages: 10 | features: hash-deep-linking, lab-navigator, access-modal, form-validation, lab-file-interface -->
2
  <!DOCTYPE html>
3
  <html lang="en">
4
  <head>
 
50
 
51
  .conscious-element { transition: all 0.28s ease; }
52
  .conscious-element:hover { transform: translateY(-2px); }
53
+
54
+ /* Active states */
55
+ .lab-node.active {
56
+ border-color: rgba(99,102,241,0.55) !important;
57
+ box-shadow: 0 0 0 1px rgba(99,102,241,0.22), 0 0 28px rgba(99,102,241,0.08);
58
+ transform: translateY(-1px);
59
+ }
60
  </style>
61
  </head>
62
 
 
75
 
76
  <div class="flex items-center space-x-3">
77
  <button id="lab-nav-btn"
78
+ class="w-10 h-10 rounded-full border border-indigo-500/40 bg-gray-900/20 hover:bg-gray-900/40 backdrop-blur-sm transition flex items-center justify-center focus-ring"
79
  aria-label="Open Lab Navigator" title="Lab Navigator">
80
  <i class="fas fa-asterisk text-indigo-300 text-sm"></i>
81
  </button>
82
 
83
  <button id="access-btn"
84
+ class="px-6 py-2 bg-gradient-to-r from-indigo-600 to-purple-600 rounded-full hover:opacity-90 transition focus-ring">
85
  Access
86
  </button>
87
  </div>
 
92
  <div class="max-w-6xl mx-auto">
93
  <div class="grid grid-cols-1 lg:grid-cols-5 gap-6">
94
 
95
+ <!-- LEFT: "File Header" + Mission -->
96
  <div class="lg:col-span-3 rounded-2xl border border-gray-800 bg-gray-900/20 overflow-hidden aura">
97
  <div class="px-6 py-5 border-b border-gray-800/60 flex items-start justify-between gap-6">
98
  <div>
 
121
  <div class="rounded-2xl border border-gray-800 bg-black/20 p-5">
122
  <div class="text-xs text-gray-400 uppercase tracking-wider mb-2">Mission</div>
123
  <div class="text-sm text-gray-300 leading-relaxed">
124
+ Advance toward AGI and, eventually, superintelligence by building systems that can reason, experiment, and improve—while preserving governance, auditability, and alignment constraints. The lab's identity is methodological: evidence first, iteration always.
125
  </div>
126
  </div>
127
 
128
  <div class="grid grid-cols-1 md:grid-cols-2 gap-4">
129
  <div class="rounded-2xl border border-gray-800 bg-gray-900/30 p-5 conscious-element">
130
+ <div class="text-sm font-semibold text-gray-100">What "progress" means here</div>
131
  <div class="text-sm text-gray-300 mt-2">
132
  Not hype. Measurable capability gains validated by protocols, baselines, and repeatability.
133
  </div>
134
  </div>
135
 
136
  <div class="rounded-2xl border border-gray-800 bg-gray-900/30 p-5 conscious-element">
137
+ <div class="text-sm font-semibold text-gray-100">What "prestige" means here</div>
138
  <div class="text-sm text-gray-300 mt-2">
139
  Discipline: clean evaluations, honest uncertainty, and claims proportional to evidence.
140
  </div>
 
150
  <div class="rounded-2xl border border-gray-800 bg-gray-900/30 p-5 conscious-element">
151
  <div class="text-sm font-semibold text-gray-100">What the website is not</div>
152
  <div class="text-sm text-gray-300 mt-2">
153
+ Not a claim factory. Not a generic SaaS landing page. Not a "busy top menu."
154
  </div>
155
  </div>
156
  </div>
 
162
  We treat AGI as an engineering and scientific frontier: general problem-solving, robust transfer, and the ability to build and validate hypotheses. Superintelligence is approached as a trajectory, not a marketing label.
163
  </p>
164
  <p class="text-gray-400">
165
+ Public statements remain conservative. Internally, the lab is oriented toward capability growth alongside governance: constraints, logs, human oversight where appropriate, and "fail-closed" behavior for agents.
166
  </p>
167
  </div>
168
  </div>
 
170
  </div>
171
  </div>
172
 
173
+ <!-- RIGHT: "Evaluation Doctrine" panel -->
174
  <div class="lg:col-span-2 rounded-2xl border border-gray-800 bg-gray-900/30 overflow-hidden">
175
  <div class="px-6 py-5 border-b border-gray-800/60">
176
  <div class="text-lg font-semibold text-gray-100">Evaluation Doctrine</div>
 
188
  <div class="rounded-xl border border-gray-800 bg-black/20 p-4">
189
  <div class="text-xs text-gray-400 uppercase tracking-wider mb-2">Rule 2: Claims scale with Evidence</div>
190
  <div class="text-sm text-gray-300">
191
+ Public language remains bounded: "concept," "prototype," "validated," with explicit assumptions and limitations.
192
  </div>
193
  </div>
194
 
195
  <div class="rounded-xl border border-gray-800 bg-black/20 p-4">
196
  <div class="text-xs text-gray-400 uppercase tracking-wider mb-2">Rule 3: Uncertainty is a first-class output</div>
197
  <div class="text-sm text-gray-300">
198
+ Calibration, confidence, and failure modes are included in reports; no "high accuracy" statements without replicated benchmarks.
199
  </div>
200
  </div>
201
 
202
  <div class="rounded-xl border border-gray-800 bg-black/20 p-4">
203
  <div class="text-xs text-gray-400 uppercase tracking-wider mb-2">Rule 4: Agents are governed</div>
204
  <div class="text-sm text-gray-300">
205
+ "AI employees" are scoped by permissions, logged actions, approval gates, and verification layers. The system must fail closed.
206
  </div>
207
  </div>
208
 
 
222
 
223
  <div class="flex flex-col gap-3">
224
  <button id="open-programs"
225
+ class="px-5 py-3 rounded-xl bg-gradient-to-r from-indigo-600 to-purple-600 hover:opacity-90 transition focus-ring">
226
  Open Programs
227
  </button>
228
  <button id="open-console"
229
+ class="px-5 py-3 rounded-xl border border-gray-700 bg-gray-900/20 hover:bg-gray-900/35 transition focus-ring">
230
  Open Console
231
  </button>
232
  </div>
 
266
  <h3 class="text-xl font-bold" id="access-modal-title">Request Access</h3>
267
  <p class="text-gray-400 mt-1">Curated access for research and evaluation</p>
268
  </div>
269
+ <button id="close-access-modal" class="text-gray-400 hover:text-white focus-ring" aria-label="Close">
270
  <i class="fas fa-times"></i>
271
  </button>
272
  </div>
273
 
274
+ <!-- Inline feedback -->
275
+ <div id="access-feedback"
276
+ class="hidden mb-4 rounded-lg border border-gray-800 bg-black/25 px-4 py-3 text-sm"
277
+ role="status" aria-live="polite"></div>
278
+
279
+ <form id="access-form" class="space-y-4" novalidate>
280
  <div>
281
  <label for="name" class="block text-sm font-medium mb-1">Full Name</label>
282
+ <input type="text" id="name" class="w-full bg-gray-800/50 border border-gray-700 rounded-lg px-4 py-2 focus-ring" autocomplete="name">
283
+ <p id="name-error" class="hidden mt-1 text-xs text-red-300">Please enter your full name.</p>
284
  </div>
285
  <div>
286
  <label for="email" class="block text-sm font-medium mb-1">Email</label>
287
+ <input type="email" id="email" class="w-full bg-gray-800/50 border border-gray-700 rounded-lg px-4 py-2 focus-ring" autocomplete="email">
288
+ <p id="email-error" class="hidden mt-1 text-xs text-red-300">Please enter a valid email address.</p>
289
  </div>
290
  <div>
291
  <label for="institution" class="block text-sm font-medium mb-1">Institution/Organization</label>
292
+ <input type="text" id="institution" class="w-full bg-gray-800/50 border border-gray-700 rounded-lg px-4 py-2 focus-ring" autocomplete="organization">
293
+ <p id="institution-error" class="hidden mt-1 text-xs text-red-300">Please enter your institution/organization.</p>
294
  </div>
295
  <div>
296
  <label for="purpose" class="block text-sm font-medium mb-1">Purpose</label>
 
301
  <option value="partnership">Partnership</option>
302
  <option value="other">Other</option>
303
  </select>
304
+ <p id="purpose-error" class="hidden mt-1 text-xs text-red-300">Please select a purpose.</p>
305
  </div>
306
  <div class="pt-2">
307
+ <button type="submit" class="w-full py-3 bg-gradient-to-r from-indigo-600 to-purple-600 rounded-lg hover:opacity-90 transition focus-ring">
308
  Submit Request
309
  </button>
310
  </div>
 
335
  </div>
336
 
337
  <button id="lab-nav-close"
338
+ class="w-9 h-9 rounded-full border border-gray-800 bg-gray-900/30 hover:bg-gray-900/50 transition flex items-center justify-center focus-ring"
339
  aria-label="Close Lab Navigator">
340
  <i class="fas fa-times text-gray-300 text-sm"></i>
341
  </button>
 
347
  radial-gradient(circle at 70% 70%, rgba(236,72,153,0.10), transparent 50%);"></div>
348
 
349
  <div class="relative grid grid-cols-1 sm:grid-cols-2 gap-3">
350
+ <button class="lab-node text-left rounded-xl border border-gray-800 bg-gray-900/30 hover:border-indigo-500/50 hover:bg-gray-900/45 transition p-4 focus-ring"
351
+ data-dossier="start" aria-current="false">
352
  <div class="text-sm text-gray-200 font-medium">Start Here</div>
353
  <div class="text-xs text-gray-500 mt-1">Entry interface</div>
354
  </button>
355
 
356
+ <button class="lab-node text-left rounded-xl border border-gray-800 bg-gray-900/30 hover:border-indigo-500/50 hover:bg-gray-900/45 transition p-4 focus-ring"
357
+ data-dossier="programs" aria-current="false">
358
  <div class="text-sm text-gray-200 font-medium">Programs</div>
359
  <div class="text-xs text-gray-500 mt-1">Program Bay</div>
360
  </button>
361
 
362
+ <button class="lab-node text-left rounded-xl border border-gray-800 bg-gray-900/30 hover:border-indigo-500/50 hover:bg-gray-900/45 transition p-4 focus-ring"
363
+ data-dossier="console" aria-current="false">
364
  <div class="text-sm text-gray-200 font-medium">Console</div>
365
  <div class="text-xs text-gray-500 mt-1">Controlled chat</div>
366
  </button>
367
 
368
+ <button class="lab-node text-left rounded-xl border border-gray-800 bg-gray-900/30 hover:border-indigo-500/50 hover:bg-gray-900/45 transition p-4 focus-ring"
369
+ data-dossier="research" aria-current="false">
370
  <div class="text-sm text-gray-200 font-medium">Research</div>
371
  <div class="text-xs text-gray-500 mt-1">Notes and briefs</div>
372
  </button>
373
 
374
+ <button class="lab-node text-left rounded-xl border border-gray-800 bg-gray-900/30 hover:border-indigo-500/50 hover:bg-gray-900/45 transition p-4 focus-ring sm:col-span-2"
375
+ data-dossier="access" aria-current="false">
376
+ <div class="text-sm text-gray-200 font-medium">Access</div>
377
+ <div class="text-xs text-gray-500 mt-1">Curated entry</div>
378
  </button>
379
  </div>
380
 
 
386
 
387
  <div class="relative rounded-2xl border border-gray-800 bg-gray-900/30 overflow-hidden">
388
  <div class="px-6 py-5 border-b border-gray-800/60">
389
+ <div class="flex items-start justify-between gap-4">
390
+ <div>
391
+ <div id="dossier-title" class="text-lg font-semibold text-gray-100">Lab Dossier</div>
392
+ <div id="dossier-subtitle" class="text-xs text-gray-500 mt-1">Select a node to load details.</div>
393
+ </div>
394
+ <div id="dossier-status"
395
+ class="text-xs px-2.5 py-1 rounded-full border border-indigo-500/30 text-indigo-200 bg-indigo-900/15">
396
+ READY
397
+ </div>
398
+ </div>
399
  </div>
400
+
401
+ <div class="p-6 space-y-5 max-h-[560px] overflow-auto thin-scroll">
402
+ <div id="dossier-body" class="text-sm text-gray-300 leading-relaxed">
403
+ This interface reveals SILENTPATTERN as a set of research programs and operational systems.
404
+ The public layer is minimal by design; depth is opened intentionally.
405
+ </div>
406
+
407
+ <div class="rounded-xl border border-gray-800 bg-black/20 p-4">
408
+ <div class="text-xs text-gray-400 uppercase tracking-wider mb-2">Evidence Capsule</div>
409
+ <ul id="dossier-evidence" class="text-sm text-gray-300 space-y-1">
410
+ <li class="text-gray-500">No dossier selected.</li>
411
+ </ul>
412
+ </div>
413
+
414
+ <div class="flex flex-col sm:flex-row gap-3">
415
+ <button id="dossier-primary"
416
+ class="flex-1 px-5 py-3 rounded-xl bg-gradient-to-r from-indigo-600 to-purple-600 hover:opacity-90 transition focus-ring">
417
+ Open
418
+ </button>
419
+ <button id="dossier-secondary"
420
+ class="flex-1 px-5 py-3 rounded-xl border border-gray-700 bg-gray-900/20 hover:bg-gray-900/35 transition focus-ring">
421
+ View Note
422
+ </button>
423
+ </div>
424
+
425
+ <div id="dossier-meta" class="text-xs text-gray-500">
426
+ Last updated: <span class="text-gray-300">—</span>
427
+ </div>
428
  </div>
429
  </div>
430
 
 
433
  </div>
434
 
435
  <script>
436
+ // Site-wide configuration
437
+ const CONFIG = {
438
+ MODAL_HASHES: new Set(['lab', 'access'])
439
+ };
440
+
441
+ /* -------------------------------------------------------------
442
+ UTILITY FUNCTIONS (consistent with other pages)
443
+ ------------------------------------------------------------- */
444
+ function escapeHtml(str) {
445
+ return String(str)
446
+ .replaceAll('&', '&amp;')
447
+ .replaceAll('<', '&lt;')
448
+ .replaceAll('>', '&gt;')
449
+ .replaceAll('"', '&quot;')
450
+ .replaceAll("'", '&#039;');
451
+ }
452
+
453
+ function isValidEmail(email) {
454
+ return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);
455
+ }
456
+
457
+ function currentHashKey() {
458
+ const h = (window.location.hash || '').replace('#', '').trim();
459
+ return h;
460
+ }
461
 
462
+ function setHash(key, replace = false) {
463
+ if (!key) return;
464
+ if (window.location.hash.replace('#', '') === key) return;
465
+ if (replace) {
466
+ history.replaceState(null, '', '#' + key);
467
+ } else {
468
+ history.pushState(null, '', '#' + key);
469
+ }
470
+ }
471
+
472
+ function clearHashIf(key) {
473
+ const h = currentHashKey();
474
+ if (!h) return;
475
+ if (!key || h === key) {
476
+ history.replaceState(null, '', window.location.pathname + window.location.search);
477
+ }
478
+ }
479
+
480
+ /* -------------------------------------------------------------
481
+ MODAL HELPERS (consistent with other pages)
482
+ ------------------------------------------------------------- */
483
  function trapFocus(modal) {
484
  const focusable = modal.querySelectorAll('a, button, input, select, textarea, [tabindex]:not([tabindex="-1"])');
485
  if (!focusable.length) return;
 
493
  } else {
494
  if (document.activeElement === last) { e.preventDefault(); first.focus(); }
495
  }
 
 
496
  }
497
  }
498
  modal.addEventListener('keydown', handler);
499
  modal._focusHandler = handler;
500
  }
501
+
502
  function untrapFocus(modal) {
503
  if (modal._focusHandler) {
504
  modal.removeEventListener('keydown', modal._focusHandler);
505
  delete modal._focusHandler;
506
  }
507
  }
508
+
509
  const toggleModal = (modal, show) => {
510
  if (show) {
511
  modal.classList.remove('modal-hidden');
 
520
  }
521
  };
522
 
523
+ /* -------------------------------------------------------------
524
+ VANTA BACKGROUND
525
+ ------------------------------------------------------------- */
526
+ let vantaEffect = null;
527
+ try {
528
+ if (window.VANTA && typeof VANTA.NET === 'function') {
529
+ vantaEffect = VANTA.NET({
530
+ el: "#vanta-bg",
531
+ mouseControls: true,
532
+ touchControls: true,
533
+ gyroControls: false,
534
+ minHeight: 200.00,
535
+ minWidth: 200.00,
536
+ scale: 1.00,
537
+ scaleMobile: 1.00,
538
+ color: 0x4f46e5,
539
+ backgroundColor: 0x020617,
540
+ points: 12.00,
541
+ maxDistance: 20.00,
542
+ spacing: 15.00
543
+ });
544
+ }
545
+ } catch (e) {
546
+ console.warn('Vanta background failed to initialize:', e);
547
+ vantaEffect = null;
548
+ }
549
+ window.addEventListener('resize', () => {
550
+ if (vantaEffect && typeof vantaEffect.resize === 'function') {
551
+ vantaEffect.resize();
552
+ }
553
+ });
554
+
555
+ /* -------------------------------------------------------------
556
+ ACCESS MODAL
557
+ ------------------------------------------------------------- */
558
  const accessModal = document.getElementById('access-modal');
559
  const accessBtn = document.getElementById('access-btn');
560
  const closeAccessModal = document.getElementById('close-access-modal');
561
+ const accessForm = document.getElementById('access-form');
562
+ const accessFeedback = document.getElementById('access-feedback');
563
+
564
+ const nameEl = document.getElementById('name');
565
+ const emailEl = document.getElementById('email');
566
+ const institutionEl = document.getElementById('institution');
567
+ const purposeEl = document.getElementById('purpose');
568
+
569
+ const nameErr = document.getElementById('name-error');
570
+ const emailErr = document.getElementById('email-error');
571
+ const institutionErr = document.getElementById('institution-error');
572
+ const purposeErr = document.getElementById('purpose-error');
573
+
574
+ function setAccessFeedback(kind, text) {
575
+ if (!accessFeedback) return;
576
+ accessFeedback.classList.remove('hidden');
577
+ accessFeedback.classList.remove('border-red-500/30', 'bg-red-900/10', 'text-red-200');
578
+ accessFeedback.classList.remove('border-emerald-500/30', 'bg-emerald-900/10', 'text-emerald-200');
579
+ accessFeedback.classList.remove('border-indigo-500/30', 'bg-indigo-900/10', 'text-indigo-200');
580
+
581
+ if (kind === 'error') {
582
+ accessFeedback.classList.add('border-red-500/30', 'bg-red-900/10', 'text-red-200');
583
+ } else if (kind === 'success') {
584
+ accessFeedback.classList.add('border-emerald-500/30', 'bg-emerald-900/10', 'text-emerald-200');
585
+ } else {
586
+ accessFeedback.classList.add('border-indigo-500/30', 'bg-indigo-900/10', 'text-indigo-200');
587
+ }
588
+ accessFeedback.textContent = text;
589
+ }
590
 
591
+ function hideAccessFeedback() {
592
+ if (!accessFeedback) return;
593
+ accessFeedback.textContent = '';
594
+ accessFeedback.classList.add('hidden');
595
+ accessFeedback.classList.remove(
596
+ 'border-red-500/30','bg-red-900/10','text-red-200',
597
+ 'border-emerald-500/30','bg-emerald-900/10','text-emerald-200',
598
+ 'border-indigo-500/30','bg-indigo-900/10','text-indigo-200'
599
+ );
600
+ }
601
+
602
+ function setFieldError(inputEl, errorEl, isError) {
603
+ if (!inputEl || !errorEl) return;
604
+ if (isError) {
605
+ errorEl.classList.remove('hidden');
606
+ inputEl.setAttribute('aria-invalid', 'true');
607
+ inputEl.classList.add('border-red-500/60');
608
+ } else {
609
+ errorEl.classList.add('hidden');
610
+ inputEl.removeAttribute('aria-invalid');
611
+ inputEl.classList.remove('border-red-500/60');
612
  }
613
+ }
614
+
615
+ function resetAccessErrors() {
616
+ hideAccessFeedback();
617
+ setFieldError(nameEl, nameErr, false);
618
+ setFieldError(emailEl, emailErr, false);
619
+ setFieldError(institutionEl, institutionErr, false);
620
+ setFieldError(purposeEl, purposeErr, false);
621
+ }
622
+
623
+ function openAccessModal(setHashFlag = true) {
624
+ resetAccessErrors();
625
+ toggleModal(accessModal, true);
626
+ if (setHashFlag) setHash('access');
627
+ setTimeout(() => nameEl && nameEl.focus(), 80);
628
+ }
629
+
630
+ function closeAccessModal(clearHashFlag = true) {
631
  toggleModal(accessModal, false);
632
+ if (clearHashFlag) clearHashIf('access');
633
+ }
634
 
635
+ accessBtn.addEventListener('click', () => openAccessModal(true));
636
+
637
+ if (closeAccessModal) closeAccessModal.addEventListener('click', () => closeAccessModal(true));
638
+
639
+ if (accessModal) {
640
+ accessModal.addEventListener('click', (e) => {
641
+ if (e.target === accessModal) closeAccessModal(true);
642
+ });
643
+ }
644
+
645
+ if (accessForm) {
646
+ // Clear per-field errors on input
647
+ [nameEl, emailEl, institutionEl, purposeEl].forEach(el => {
648
+ if (!el) return;
649
+ el.addEventListener('input', () => {
650
+ if (el === nameEl) setFieldError(nameEl, nameErr, !nameEl.value.trim());
651
+ if (el === emailEl) setFieldError(emailEl, emailErr, !isValidEmail(emailEl.value.trim()));
652
+ if (el === institutionEl) setFieldError(institutionEl, institutionErr, !institutionEl.value.trim());
653
+ if (el === purposeEl) setFieldError(purposeEl, purposeErr, !purposeEl.value);
654
+ });
655
+ el.addEventListener('change', () => el.dispatchEvent(new Event('input')));
656
+ });
657
+
658
+ accessForm.addEventListener('submit', (e) => {
659
+ e.preventDefault();
660
+ resetAccessErrors();
661
+
662
+ const name = (nameEl?.value || '').trim();
663
+ const email = (emailEl?.value || '').trim();
664
+ const institution = (institutionEl?.value || '').trim();
665
+ const purpose = (purposeEl?.value || '').trim();
666
+
667
+ let ok = true;
668
+
669
+ if (!name) { setFieldError(nameEl, nameErr, true); ok = false; }
670
+ if (!email || !isValidEmail(email)) { setFieldError(emailEl, emailErr, true); ok = false; }
671
+ if (!institution) { setFieldError(institutionEl, institutionErr, true); ok = false; }
672
+ if (!purpose) { setFieldError(purposeEl, purposeErr, true); ok = false; }
673
+
674
+ if (!ok) {
675
+ setAccessFeedback('error', 'Please correct the highlighted fields and resubmit.');
676
+ return;
677
+ }
678
+
679
+ setAccessFeedback('success', 'Request received. You will be contacted after review.');
680
+ accessForm.reset();
681
+ });
682
+ }
683
+
684
+ /* -------------------------------------------------------------
685
+ LAB NAVIGATOR
686
+ ------------------------------------------------------------- */
687
  const labNav = document.getElementById('lab-navigator');
688
  const labNavBtn = document.getElementById('lab-nav-btn');
689
  const labNavClose = document.getElementById('lab-nav-close');
690
 
691
+ const DOSSIERS = {
692
+ start: {
693
+ title: "Start Here",
694
+ subtitle: "Entry interface",
695
+ status: "ACTIVE",
696
+ body: "Return to the main interface.",
697
+ evidence: ["Public entry layer", "Programs as dossiers", "Console for controlled interaction"],
698
+ primary: { label: "Go to Index", action: () => { window.location.href = "index.html"; } },
699
+ secondary: { label: "Programs", action: () => { window.location.href = "capabilities.html"; } },
700
+ updated: "—"
701
+ },
702
+ programs: {
703
+ title: "Programs",
704
+ subtitle: "Program Bay",
705
+ status: "ACTIVE",
706
+ body: "Program Bay: MCAP, CHAI, Quantum Lambda, AI Scientist, Agentic Workforce.",
707
+ evidence: ["Dossiers with maturity levels", "Evidence capsules", "Access gates"],
708
+ primary: { label: "Open Programs", action: () => { window.location.href = "capabilities.html"; } },
709
+ secondary: { label: "Console", action: () => { window.location.href = "chat.html"; } },
710
+ updated: "—"
711
+ },
712
+ console: {
713
+ title: "Console",
714
+ subtitle: "Controlled chat",
715
+ status: "DRAFT",
716
+ body: "Controlled chat with exportable transcripts. Model access must remain server-side.",
717
+ evidence: ["No client-side secrets", "Audit-ready transcripts", "Fail-closed behaviors"],
718
+ primary: { label: "Open Console", action: () => { window.location.href = "chat.html"; } },
719
+ secondary: { label: "Research", action: () => { window.location.href = "research.html"; } },
720
+ updated: "—"
721
+ },
722
+ research: {
723
+ title: "Research",
724
+ subtitle: "Notes and briefs",
725
+ status: "DRAFT",
726
+ body: "Technical notes, evaluation methodology, and changelogs.",
727
+ evidence: ["Evaluation philosophy", "Benchmarks + baselines", "Limitations and failure modes"],
728
+ primary: { label: "Open Research", action: () => { window.location.href = "research.html"; } },
729
+ secondary: { label: "Contact", action: () => { window.location.href = "contact.html"; } },
730
+ updated: "—"
731
+ },
732
+ access: {
733
+ title: "Access",
734
+ subtitle: "Curated entry",
735
+ status: "ACTIVE",
736
+ body: "Request access for controlled demos and evaluation workflows.",
737
+ evidence: ["Application-based", "Segmented by intent", "Controlled demos"],
738
+ primary: { label: "Request Access", action: () => { closeLabNav(true); openAccessModal(true); } },
739
+ secondary: { label: "Contact", action: () => { window.location.href = "contact.html"; } },
740
+ updated: "—"
741
+ }
742
+ };
743
+
744
+ const dossierTitle = document.getElementById('dossier-title');
745
+ const dossierSubtitle = document.getElementById('dossier-subtitle');
746
+ const dossierStatus = document.getElementById('dossier-status');
747
+ const dossierBody = document.getElementById('dossier-body');
748
+ const dossierEvidence = document.getElementById('dossier-evidence');
749
+ const dossierPrimary = document.getElementById('dossier-primary');
750
+ const dossierSecondary = document.getElementById('dossier-secondary');
751
+ const dossierMeta = document.getElementById('dossier-meta');
752
+
753
+ function setActiveLabNode(key) {
754
+ document.querySelectorAll('.lab-node').forEach(btn => {
755
+ const isActive = btn.getAttribute('data-dossier') === key;
756
+ btn.classList.toggle('active', isActive);
757
+ btn.setAttribute('aria-current', isActive ? 'true' : 'false');
758
+ });
759
+ }
760
+
761
+ function renderDossier(key) {
762
+ const d = DOSSIERS[key];
763
+ if (!d) return;
764
 
765
+ setActiveLabNode(key);
766
+
767
+ dossierTitle.textContent = d.title;
768
+ dossierSubtitle.textContent = d.subtitle;
769
+ dossierStatus.textContent = d.status;
770
+ dossierBody.textContent = d.body;
771
+
772
+ dossierEvidence.innerHTML = "";
773
+ d.evidence.forEach(item => {
774
+ const li = document.createElement('li');
775
+ li.textContent = item;
776
+ dossierEvidence.appendChild(li);
777
+ });
778
+
779
+ dossierPrimary.textContent = d.primary.label;
780
+ dossierPrimary.onclick = d.primary.action;
781
+
782
+ dossierSecondary.textContent = d.secondary.label;
783
+ dossierSecondary.onclick = d.secondary.action;
784
+
785
+ dossierMeta.innerHTML = `Last updated: <span class="text-gray-300">${d.updated}</span>`;
786
+ }
787
+
788
+ function openLabNav(setHashFlag = true) {
789
+ toggleModal(labNav, true);
790
+ if (setHashFlag) setHash('lab');
791
+ setTimeout(() => labNav.focus(), 0);
792
+
793
+ // Ensure a stable default selection when opened
794
+ const alreadyActive = document.querySelector('.lab-node.active');
795
+ if (!alreadyActive) renderDossier('start');
796
+ }
797
+
798
+ function closeLabNav(clearHashFlag = true) {
799
+ toggleModal(labNav, false);
800
+ if (clearHashFlag) clearHashIf('lab');
801
+ }
802
+
803
+ labNavBtn.addEventListener('click', () => openLabNav(true));
804
+ labNavClose.addEventListener('click', () => closeLabNav(true));
805
 
806
  labNav.addEventListener('click', (e) => {
807
  const shouldClose = e.target && e.target.getAttribute('data-lab-close') === 'true';
808
+ if (shouldClose) closeLabNav(true);
809
  });
810
 
811
  document.querySelectorAll('.lab-node').forEach(btn => {
812
  btn.addEventListener('click', () => {
813
+ const key = btn.getAttribute('data-dossier');
814
+ renderDossier(key);
815
+
816
+ // Apply navigation actions
817
+ if (key === 'start') window.location.href = "index.html";
818
+ if (key === 'programs') window.location.href = "capabilities.html";
819
+ if (key === 'console') window.location.href = "chat.html";
820
+ if (key === 'research') window.location.href = "research.html";
821
+ if (key === 'access') { closeLabNav(true); openAccessModal(true); }
822
  });
823
  });
824
 
825
+ /* -------------------------------------------------------------
826
+ QUICK LINKS
827
+ ------------------------------------------------------------- */
828
+ document.getElementById('open-programs').addEventListener('click', () => {
829
+ window.location.href = "capabilities.html";
830
+ });
831
+
832
+ document.getElementById('open-console').addEventListener('click', () => {
833
+ window.location.href = "chat.html";
834
+ });
835
+
836
+ /* -------------------------------------------------------------
837
+ HASH ROUTER: handle modal hashes
838
+ ------------------------------------------------------------- */
839
+ function applyHashState() {
840
+ const key = currentHashKey();
841
+
842
+ if (CONFIG.MODAL_HASHES.has(key)) {
843
+ if (key === 'lab') openLabNav(false);
844
+ if (key === 'access') openAccessModal(false);
845
+ }
846
+ }
847
+
848
+ window.addEventListener('hashchange', applyHashState);
849
+ applyHashState(); // Initial load
850
 
851
+ /* -------------------------------------------------------------
852
+ GLOBAL ESC BEHAVIOR
853
+ ------------------------------------------------------------- */
854
  document.addEventListener('keydown', (e) => {
855
  if (e.key === 'Escape') {
856
+ if (labNav && !labNav.classList.contains('modal-hidden')) closeLabNav(true);
857
+ if (accessModal && !accessModal.classList.contains('modal-hidden')) closeAccessModal(true);
858
  }
859
  });
860
+
861
+ // Initial dossier render
862
+ renderDossier('start');
863
  </script>
864
  </body>
865
+ </html>