1111 < link rel ="stylesheet " href ="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/atom-one-dark.min.css ">
1212 < script src ="https://cdn.jsdelivr.net/npm/marked/marked.min.js "> </ script >
1313 < script src ="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js "> </ script >
14- <!-- Three.js for 3D background -->
15- < script type ="importmap ">
16- {
17- "imports" : {
18- "three" : "https://unpkg.com/three@0.128.0/build/three.module.js"
19- }
20- }
21- </ script >
2214 < style >
2315 /* ========== GLOBAL STYLES – BLACKSITE POLISH ========== */
2416 * { margin : 0 ; padding : 0 ; box-sizing : border-box; }
5446 position : relative;
5547 }
5648
57- /* 3D Canvas (background) */
49+ /* Background Canvas */
5850 # bg-canvas {
5951 position : fixed;
6052 top : 0 ;
@@ -963,7 +955,7 @@ <h3>🐛 Bloodhound Debugger – ADA‑Powered Forensic Analysis</h3>
963955 </ div >
964956 < div class ="field-group ">
965957 < label > Domain (optional)</ label >
966- < select id ="debuggerDomain ">
958+ < select id ="debuggerDomain ">
967959 < option value ="code "> General Code</ option >
968960 < option value ="security "> Security Critical</ option >
969961 < option value ="financial "> Financial</ option >
@@ -990,75 +982,61 @@ <h4>Results</h4>
990982 </ div >
991983</ div >
992984
993- < script type ="module ">
994- import * as THREE from 'three' ;
995-
996- // ========== THREE.JS BACKGROUND ==========
997- const canvas = document . getElementById ( 'bg-canvas' ) ;
998- const renderer = new THREE . WebGLRenderer ( { canvas, alpha : true } ) ;
999- renderer . setSize ( window . innerWidth , window . innerHeight ) ;
1000- renderer . setClearColor ( 0x000000 , 0 ) ; // transparent
1001-
1002- const scene = new THREE . Scene ( ) ;
1003- const camera = new THREE . PerspectiveCamera ( 75 , window . innerWidth / window . innerHeight , 0.1 , 1000 ) ;
1004- camera . position . z = 15 ;
1005-
1006- // Starfield (points)
1007- const starGeometry = new THREE . BufferGeometry ( ) ;
1008- const starCount = 2000 ;
1009- const starPositions = new Float32Array ( starCount * 3 ) ;
1010- for ( let i = 0 ; i < starCount ; i ++ ) {
1011- starPositions [ i * 3 ] = ( Math . random ( ) - 0.5 ) * 2000 ;
1012- starPositions [ i * 3 + 1 ] = ( Math . random ( ) - 0.5 ) * 2000 ;
1013- starPositions [ i * 3 + 2 ] = ( Math . random ( ) - 0.5 ) * 500 ;
1014- }
1015- starGeometry . setAttribute ( 'position' , new THREE . BufferAttribute ( starPositions , 3 ) ) ;
1016- const starMaterial = new THREE . PointsMaterial ( { color : 0xffffff , size : 0.5 , transparent : true , opacity : 0.8 } ) ;
1017- const stars = new THREE . Points ( starGeometry , starMaterial ) ;
1018- scene . add ( stars ) ;
1019-
1020- // Orbital ring
1021- const ringGeometry = new THREE . TorusGeometry ( 4.5 , 0.08 , 64 , 300 ) ;
1022- const ringMaterial = new THREE . MeshBasicMaterial ( { color : 0xc9a028 , transparent : true , opacity : 0.4 } ) ;
1023- const ring = new THREE . Mesh ( ringGeometry , ringMaterial ) ;
1024- scene . add ( ring ) ;
1025-
1026- // Floating particles (small spheres)
1027- const particleCount = 300 ;
1028- const particleGeometry = new THREE . BufferGeometry ( ) ;
1029- const particlePositions = new Float32Array ( particleCount * 3 ) ;
1030- for ( let i = 0 ; i < particleCount ; i ++ ) {
1031- particlePositions [ i * 3 ] = ( Math . random ( ) - 0.5 ) * 30 ;
1032- particlePositions [ i * 3 + 1 ] = ( Math . random ( ) - 0.5 ) * 20 ;
1033- particlePositions [ i * 3 + 2 ] = ( Math . random ( ) - 0.5 ) * 20 ;
1034- }
1035- particleGeometry . setAttribute ( 'position' , new THREE . BufferAttribute ( particlePositions , 3 ) ) ;
1036- const particleMaterial = new THREE . PointsMaterial ( { color : 0xffaa33 , size : 0.08 , transparent : true , opacity : 0.3 } ) ;
1037- const particles = new THREE . Points ( particleGeometry , particleMaterial ) ;
1038- scene . add ( particles ) ;
1039-
1040- function animate ( ) {
1041- requestAnimationFrame ( animate ) ;
1042- stars . rotation . y += 0.0005 ;
1043- stars . rotation . x += 0.0003 ;
1044- ring . rotation . x += 0.003 ;
1045- ring . rotation . z += 0.002 ;
1046- particles . rotation . y += 0.001 ;
1047- particles . rotation . x += 0.0005 ;
1048- renderer . render ( scene , camera ) ;
1049- }
1050- animate ( ) ;
1051-
1052- window . addEventListener ( 'resize' , onWindowResize , false ) ;
1053- function onWindowResize ( ) {
1054- camera . aspect = window . innerWidth / window . innerHeight ;
1055- camera . updateProjectionMatrix ( ) ;
1056- renderer . setSize ( window . innerWidth , window . innerHeight ) ;
1057- }
1058- </ script >
1059-
1060985< script >
1061986 ( function ( ) {
987+ // ---------- BACKGROUND (particle canvas) ----------
988+ const canvas = document . getElementById ( 'bg-canvas' ) ;
989+ const ctx = canvas . getContext ( '2d' ) ;
990+ let width , height , animFrame ;
991+ let particles = [ ] ;
992+ const PARTICLE_COUNT = 120 ;
993+
994+ function resize ( ) {
995+ width = window . innerWidth ;
996+ height = window . innerHeight ;
997+ canvas . width = width ;
998+ canvas . height = height ;
999+ }
1000+
1001+ function initParticles ( ) {
1002+ particles = [ ] ;
1003+ for ( let i = 0 ; i < PARTICLE_COUNT ; i ++ ) {
1004+ particles . push ( {
1005+ x : Math . random ( ) * width ,
1006+ y : Math . random ( ) * height ,
1007+ radius : 1 + Math . random ( ) * 2 ,
1008+ alpha : 0.3 + Math . random ( ) * 0.5 ,
1009+ speed : 0.2 + Math . random ( ) * 0.8 ,
1010+ } ) ;
1011+ }
1012+ }
1013+
1014+ function draw ( ) {
1015+ ctx . clearRect ( 0 , 0 , width , height ) ;
1016+ ctx . fillStyle = '#050508' ;
1017+ ctx . fillRect ( 0 , 0 , width , height ) ;
1018+ for ( let p of particles ) {
1019+ ctx . beginPath ( ) ;
1020+ ctx . arc ( p . x , p . y , p . radius , 0 , Math . PI * 2 ) ;
1021+ ctx . fillStyle = `rgba(201, 160, 40, ${ p . alpha } )` ;
1022+ ctx . fill ( ) ;
1023+ p . y += p . speed ;
1024+ if ( p . y > height ) p . y = 0 ;
1025+ }
1026+ animFrame = requestAnimationFrame ( draw ) ;
1027+ }
1028+
1029+ function startBackground ( ) {
1030+ resize ( ) ;
1031+ initParticles ( ) ;
1032+ draw ( ) ;
1033+ window . addEventListener ( 'resize' , ( ) => {
1034+ resize ( ) ;
1035+ initParticles ( ) ;
1036+ } ) ;
1037+ }
1038+ startBackground ( ) ;
1039+
10621040 // ---------- CUSTOM CURSOR ----------
10631041 const cursor = document . getElementById ( 'custom-cursor' ) ;
10641042 if ( cursor ) {
@@ -1443,7 +1421,8 @@ <h3>🌌 Structured Mode</h3>
14431421 messagesDiv . appendChild ( div ) ;
14441422 // Attach event listeners
14451423 div . querySelectorAll ( '.badge.ada' ) . forEach ( b => b . onclick = ( ) => showModal ( 'ADA Loop Details' , JSON . stringify ( JSON . parse ( b . dataset . ada ) , null , 2 ) ) ) ;
1446- div . querySelectorAll ( '.badge.receipt' ) . forEach ( b => b . onclick = ( ) => showModal ( 'Checkpoint Receipt' , JSON . stringify ( JSON . parse ( b . dataset . receipt ) , null , 2 ) ) ) ;
1424+
1425+ div . querySelectorAll ( '.badge.receipt' ) . forEach ( b => b . onclick = ( ) => showModal ( 'Checkpoint Receipt' , JSON . stringify ( JSON . parse ( b . dataset . receipt ) , null , 2 ) ) ) ;
14471426 div . querySelectorAll ( '.badge.seal-btn' ) . forEach ( b => b . onclick = ( ) => sealMessage ( b . dataset . content ) ) ;
14481427 div . querySelectorAll ( '.badge.ada-vela' ) . forEach ( b => { const execId = b . dataset . executionId ; if ( execId ) b . onclick = ( ) => showAdaVelaModal ( execId ) ; else b . onclick = ( ) => showModal ( 'Ada‑VELA' , 'Execution ID not available.' ) ; } ) ;
14491428 div . querySelectorAll ( '.feedback-badge' ) . forEach ( b => {
0 commit comments