1818 --power : # ef4444 ;
1919 --wisdom : # 3b82f6 ;
2020 }
21-
21+
2222 body {
2323 font-family : 'Inter' , system-ui, sans-serif;
2424 background-color : var (--bg-color );
2525 color : var (--text-primary );
2626 margin : 0 ;
2727 padding : 20px ;
2828 }
29-
29+
3030 .container {
3131 max_width : 1400px ;
3232 margin : 0 auto;
3333 }
34-
34+
3535 header {
3636 margin-bottom : 30px ;
3737 border-bottom : 1px solid # 334155 ;
3838 padding-bottom : 20px ;
3939 }
40-
40+
4141 h1 { margin : 0 ; font-size : 2rem ; }
4242 .subtitle { color : var (--text-secondary ); margin-top : 5px ; }
43-
43+
4444 .grid {
4545 display : grid;
4646 grid-template-columns : repeat (auto-fit, minmax (400px , 1fr ));
4747 gap : 20px ;
4848 margin-bottom : 30px ;
4949 }
50-
50+
5151 .card {
5252 background-color : var (--card-bg );
5353 border-radius : 12px ;
5454 padding : 20px ;
5555 box-shadow : 0 4px 6px -1px rgba (0 , 0 , 0 , 0.1 );
5656 }
57-
57+
5858 .card h2 { margin-top : 0 ; font-size : 1.2rem ; color : var (--accent ); }
59-
59+
6060 # galaxy-graph {
6161 width : 100% ;
6262 height : 600px ;
6363 background-color : # 020617 ;
6464 border-radius : 8px ;
6565 }
66-
66+
6767 table {
6868 width : 100% ;
6969 border-collapse : collapse;
7070 margin-top : 10px ;
7171 }
72-
72+
7373 th , td {
7474 text-align : left;
7575 padding : 12px ;
7676 border-bottom : 1px solid # 334155 ;
7777 }
78-
78+
7979 th { color : var (--text-secondary ); font-weight : 600 ; }
80-
80+
8181 .badge {
8282 padding : 4px 8px ;
8383 border-radius : 4px ;
8484 font-size : 0.8rem ;
8585 font-weight : bold;
8686 }
87-
87+
8888 .badge-love { background : rgba (244 , 114 , 182 , 0.2 ); color : var (--love ); }
8989 .badge-justice { background : rgba (251 , 191 , 36 , 0.2 ); color : var (--justice ); }
9090 .badge-power { background : rgba (239 , 68 , 68 , 0.2 ); color : var (--power ); }
9191 .badge-wisdom { background : rgba (59 , 130 , 246 , 0.2 ); color : var (--wisdom ); }
92-
92+
9393 </ style >
9494</ head >
9595< body >
9696 < div class ="container ">
9797 < header >
9898 < h1 > LJPW Code Harmony Report</ h1 >
99- < div class ="subtitle "> Generated on 2025-11-19 20:26 </ div >
99+ < div class ="subtitle "> Generated on 2025-11-20 18:56 </ div >
100100 </ header >
101-
101+
102102 < div class ="grid ">
103103 < div class ="card ">
104104 < h2 > System Balance (Average)</ h2 >
@@ -109,16 +109,16 @@ <h2>Semantic Density vs Complexity</h2>
109109 < canvas id ="scatterChart "> </ canvas >
110110 </ div >
111111 </ div >
112-
112+
113113 < div class ="card " style ="margin-bottom: 30px; ">
114114 < h2 > Dependency Galaxy (Gravitational Pull)</ h2 >
115115 < div id ="galaxy-graph "> </ div >
116116 < p style ="color: var(--text-secondary); font-size: 0.9rem; margin-top: 10px; ">
117- Nodes are sized by Mass (Complexity). Links show imports.
117+ Nodes are sized by Mass (Complexity). Links show imports.
118118 Colors represent dominant LJPW dimension.
119119 </ p >
120120 </ div >
121-
121+
122122 < div class ="card ">
123123 < h2 > File Analysis</ h2 >
124124 < div style ="overflow-x: auto; ">
@@ -142,14 +142,14 @@ <h2>File Analysis</h2>
142142 </ div >
143143
144144 < script >
145- const data = { "files" : [ { "path" : "C:\\Users\\Well\\Crush\\Projects\\Python_CH\\Python-Code-Harmonizer\\tests\\user_validation\\simple_data.py" , "name" : "simple_data.py" , "l" : 0.0 , "j" : 0.0 , "p" : 0.0 , "w" : 0.5 , "functions" : 2 , "density" : 0.0 , "disharmony" : 0.0 } , { "path" : "C:\\Users\\Well\\Crush\\Projects\\Python_CH\\Python-Code-Harmonizer\\tests\\user_validation\\simple_hello.py" , "name" : "simple_hello.py" , "l" : 1.0 , "j" : 0.0 , "p" : 0.0 , "w" : 0.0 , "functions" : 2 , "density" : 0.0 , "disharmony" : 0.0 } , { "path" : "C:\\Users\\Well\\Crush\\Projects\\Python_CH\\Python-Code-Harmonizer\\tests\\user_validation\\simple_math.py" , "name" : "simple_math.py" , "l" : 0.0 , "j" : 0.0 , "p" : 0.0 , "w" : 1.0 , "functions" : 3 , "density" : 0.0 , "disharmony" : 0.0 } , { "path" : "C:\\Users\\Well\\Crush\\Projects\\Python_CH\\Python-Code-Harmonizer\\tests\\user_validation\\complex_clean.py" , "name" : "complex_clean.py" , "l" : 0.08333333333333333 , "j" : 0.16666666666666666 , "p" : 0.08333333333333333 , "w" : 0.41666666666666663 , "functions" : 4 , "density" : 0.08333333333333333 , "disharmony" : 0.0 } , { "path" : "C:\\Users\\Well\\Crush\\Projects\\Python_CH\\Python-Code-Harmonizer\\tests\\user_validation\\complex_god.py" , "name" : "complex_god.py" , "l" : 0.4 , "j" : 0.23333333333333334 , "p" : 0.05 , "w" : 0.11666666666666667 , "functions" : 5 , "density" : 0.05 , "disharmony" : 0.0 } , { "path" : "C:\\Users\\Well\\Crush\\Projects\\Python_CH\\Python-Code-Harmonizer\\tests\\user_validation\\complex_spaghetti.py" , "name" : "complex_spaghetti.py" , "l" : 0.08333333333333333 , "j" : 0.16666666666666666 , "p" : 0.08333333333333333 , "w" : 0.41666666666666663 , "functions" : 4 , "density" : 0.08333333333333333 , "disharmony" : 0.0 } ] , "graph" : { "nodes" : [ { "id" : "simple_data.py" , "mass" : 1.0 , "gravity" : 0 } , { "id" : "simple_hello.py" , "mass" : 1.0 , "gravity" : 0 } , { "id" : "simple_math.py" , "mass" : 1.0 , "gravity" : 0 } , { "id" : "complex_clean.py" , "mass" : 1.0 , "gravity" : 0 } , { "id" : "complex_god.py" , "mass" : 1.0 , "gravity" : 0 } , { "id" : "complex_spaghetti.py" , "mass" : 1.0 , "gravity" : 0 } ] , "links" : [ ] } , "timestamp" : "2025-11-19T20:26:48.834236" , "project" : "LJPW Validation Run" } ;
146-
145+ const data = { "files" : [ { "path" : "/workspace/tests/user_validation/simple_hello.py" , "name" : "simple_hello.py" , "l" : 1.0 , "j" : 0.0 , "p" : 0.0 , "w" : 0.0 , "functions" : 2 , "density" : 0.0 , "disharmony" : 0.0 } , { "path" : "/workspace/tests/user_validation/simple_data.py" , "name" : "simple_data.py" , "l" : 0.0 , "j" : 0.0 , "p" : 0.0 , "w" : 0.5 , "functions" : 2 , "density" : 0.0 , "disharmony" : 0.0 } , { "path" : "/workspace/tests/user_validation/simple_math.py" , "name" : "simple_math.py" , "l" : 0.0 , "j" : 0.0 , "p" : 0.0 , "w" : 1.0 , "functions" : 3 , "density" : 0.0 , "disharmony" : 0.0 } , { "path" : "/workspace/tests/user_validation/complex_god.py" , "name" : "complex_god.py" , "l" : 0.4 , "j" : 0.23333333333333334 , "p" : 0.05 , "w" : 0.11666666666666667 , "functions" : 5 , "density" : 0.05 , "disharmony" : 0.0 } , { "path" : "/workspace/tests/user_validation/complex_spaghetti.py" , "name" : "complex_spaghetti.py" , "l" : 0.08333333333333333 , "j" : 0.16666666666666666 , "p" : 0.08333333333333333 , "w" : 0.41666666666666663 , "functions" : 4 , "density" : 0.08333333333333333 , "disharmony" : 0.0 } , { "path" : "/workspace/tests/user_validation/complex_clean.py" , "name" : "complex_clean.py" , "l" : 0.08333333333333333 , "j" : 0.16666666666666666 , "p" : 0.08333333333333333 , "w" : 0.41666666666666663 , "functions" : 4 , "density" : 0.08333333333333333 , "disharmony" : 0.0 } ] , "graph" : { "nodes" : [ { "id" : "simple_hello.py" , "mass" : 1.0 , "gravity" : 0 } , { "id" : "simple_data.py" , "mass" : 1.0 , "gravity" : 0 } , { "id" : "simple_math.py" , "mass" : 1.0 , "gravity" : 0 } , { "id" : "complex_god.py" , "mass" : 1.0 , "gravity" : 0 } , { "id" : "complex_spaghetti.py" , "mass" : 1.0 , "gravity" : 0 } , { "id" : "complex_clean.py" , "mass" : 1.0 , "gravity" : 0 } ] , "links" : [ ] } , "timestamp" : "2025-11-20T18:56:22.439403" , "project" : "LJPW Validation Run" } ;
146+
147147 // --- 1. Radar Chart ---
148148 const avgL = data . files . reduce ( ( sum , f ) => sum + f . l , 0 ) / data . files . length ;
149149 const avgJ = data . files . reduce ( ( sum , f ) => sum + f . j , 0 ) / data . files . length ;
150150 const avgP = data . files . reduce ( ( sum , f ) => sum + f . p , 0 ) / data . files . length ;
151151 const avgW = data . files . reduce ( ( sum , f ) => sum + f . w , 0 ) / data . files . length ;
152-
152+
153153 new Chart ( document . getElementById ( 'radarChart' ) , {
154154 type : 'radar' ,
155155 data : {
@@ -182,7 +182,7 @@ <h2>File Analysis</h2>
182182 plugins : { legend : { labels : { color : '#cbd5e1' } } }
183183 }
184184 } ) ;
185-
185+
186186 // --- 2. Scatter Chart (Density vs Complexity) ---
187187 new Chart ( document . getElementById ( 'scatterChart' ) , {
188188 type : 'scatter' ,
@@ -201,12 +201,12 @@ <h2>File Analysis</h2>
201201 } ,
202202 options : {
203203 scales : {
204- x : {
204+ x : {
205205 title : { display : true , text : 'Complexity (Function Count)' , color : '#94a3b8' } ,
206206 grid : { color : '#334155' } ,
207207 ticks : { color : '#94a3b8' }
208208 } ,
209- y : {
209+ y : {
210210 title : { display : true , text : 'Semantic Density (Power/LOC)' , color : '#94a3b8' } ,
211211 grid : { color : '#334155' } ,
212212 ticks : { color : '#94a3b8' }
@@ -222,27 +222,27 @@ <h2>File Analysis</h2>
222222 }
223223 }
224224 } ) ;
225-
225+
226226 // --- 3. D3 Force Graph ---
227227 const width = document . getElementById ( 'galaxy-graph' ) . clientWidth ;
228228 const height = 600 ;
229-
229+
230230 const svg = d3 . select ( "#galaxy-graph" ) . append ( "svg" )
231231 . attr ( "width" , width )
232232 . attr ( "height" , height ) ;
233-
233+
234234 const simulation = d3 . forceSimulation ( data . graph . nodes )
235235 . force ( "link" , d3 . forceLink ( data . graph . links ) . id ( d => d . id ) . distance ( 100 ) )
236236 . force ( "charge" , d3 . forceManyBody ( ) . strength ( - 300 ) )
237237 . force ( "center" , d3 . forceCenter ( width / 2 , height / 2 ) ) ;
238-
238+
239239 const link = svg . append ( "g" )
240240 . selectAll ( "line" )
241241 . data ( data . graph . links )
242242 . enter ( ) . append ( "line" )
243243 . attr ( "stroke" , "#475569" )
244244 . attr ( "stroke-width" , 1 ) ;
245-
245+
246246 const node = svg . append ( "g" )
247247 . selectAll ( "circle" )
248248 . data ( data . graph . nodes )
@@ -263,51 +263,51 @@ <h2>File Analysis</h2>
263263 . on ( "start" , dragstarted )
264264 . on ( "drag" , dragged )
265265 . on ( "end" , dragended ) ) ;
266-
266+
267267 node . append ( "title" ) . text ( d => d . id ) ;
268-
268+
269269 simulation . on ( "tick" , ( ) => {
270270 link
271271 . attr ( "x1" , d => d . source . x )
272272 . attr ( "y1" , d => d . source . y )
273273 . attr ( "x2" , d => d . target . x )
274274 . attr ( "y2" , d => d . target . y ) ;
275-
275+
276276 node
277277 . attr ( "cx" , d => d . x )
278278 . attr ( "cy" , d => d . y ) ;
279279 } ) ;
280-
280+
281281 function dragstarted ( event , d ) {
282282 if ( ! event . active ) simulation . alphaTarget ( 0.3 ) . restart ( ) ;
283283 d . fx = d . x ;
284284 d . fy = d . y ;
285285 }
286-
286+
287287 function dragged ( event , d ) {
288288 d . fx = event . x ;
289289 d . fy = event . y ;
290290 }
291-
291+
292292 function dragended ( event , d ) {
293293 if ( ! event . active ) simulation . alphaTarget ( 0 ) ;
294294 d . fx = null ;
295295 d . fy = null ;
296296 }
297-
297+
298298 // --- 4. Populate Table ---
299299 const tbody = document . querySelector ( '#fileTable tbody' ) ;
300300 data . files . forEach ( f => {
301301 const tr = document . createElement ( 'tr' ) ;
302-
302+
303303 const max = Math . max ( f . l , f . j , f . p , f . w ) ;
304304 let domClass = '' ;
305305 let domName = '' ;
306306 if ( max === f . l ) { domClass = 'badge-love' ; domName = 'Love' ; }
307307 else if ( max === f . j ) { domClass = 'badge-justice' ; domName = 'Justice' ; }
308308 else if ( max === f . p ) { domClass = 'badge-power' ; domName = 'Power' ; }
309309 else { domClass = 'badge-wisdom' ; domName = 'Wisdom' ; }
310-
310+
311311 tr . innerHTML = `
312312 <td>${ f . name } </td>
313313 <td><span class="badge ${ domClass } ">${ domName } </span></td>
0 commit comments