@@ -413,7 +413,7 @@ <h3 class="h3">This art inspiration</h3>
413413 { id :'y21' , c :'yellow' , x :35 , y :74 , s :false } ,
414414 { id :'y22' , c :'yellow' , x :43 , y :74 , s :false } ,
415415 // Teal (x 51–96%)
416- { id :'t01' , c :'teal' , x :53 , y :8 , s :true , f : { n : 'Rachel Florence' , r : 'Program Manager, DesignOps' , rel : 'Colleague' , t : '' } } ,
416+ { id :'t01' , c :'teal' , x :53 , y :8 , s :false } ,
417417 { id :'t02' , c :'teal' , x :62 , y :8 , s :false } ,
418418 { id :'t03' , c :'teal' , x :71 , y :8 , s :false } ,
419419 { id :'t04' , c :'teal' , x :81 , y :8 , s :false } ,
@@ -457,7 +457,7 @@ <h3 class="h3">This art inspiration</h3>
457457 { id :'g14' , c :'green' , x :14 , y :75 , s :false } ,
458458 { id :'g15' , c :'green' , x :24 , y :75 , s :false } ,
459459 // Red (x 32–59%)
460- { id :'r01' , c :'red' , x :35 , y :10 , s :true , f : { n : 'Ricky Zhang' , r : 'Senior Design Engineer' , rel : 'Team/Engineer' , t : '' } } ,
460+ { id :'r01' , c :'red' , x :35 , y :10 , s :false } ,
461461 { id :'r02' , c :'red' , x :46 , y :10 , s :false } ,
462462 { id :'r03' , c :'red' , x :32 , y :27 , s :false } ,
463463 { id :'r04' , c :'red' , x :43 , y :27 , s :false } ,
@@ -471,7 +471,7 @@ <h3 class="h3">This art inspiration</h3>
471471 { id :'r12' , c :'red' , x :38 , y :76 , s :false } ,
472472 { id :'r13' , c :'red' , x :50 , y :76 , s :false } ,
473473 // Purple (x 64–98%)
474- { id :'p01' , c :'purple' , x :66 , y :8 , s :true , f : { n : 'April' , r : 'Product Designer' , rel : 'SF office buddy' , t : '' } } ,
474+ { id :'p01' , c :'purple' , x :66 , y :8 , s :false } ,
475475 { id :'p02' , c :'purple' , x :77 , y :8 , s :false } ,
476476 { id :'p03' , c :'purple' , x :87 , y :8 , s :false } ,
477477 { id :'p04' , c :'purple' , x :96 , y :8 , s :false } ,
@@ -493,7 +493,7 @@ <h3 class="h3">This art inspiration</h3>
493493 ] ;
494494
495495 const allDots = [ ...topDots , ...bottomDots ] ;
496- const submittedDots = allDots . filter ( d => d . s ) ;
496+ const submittedDots = [ ] ;
497497 let viewIndex = 0 ;
498498
499499 /* ────────────────────────────────────────────────
@@ -524,6 +524,7 @@ <h3 class="h3">This art inspiration</h3>
524524
525525 renderDots ( 'topContent' , topDots ) ;
526526 renderDots ( 'bottomContent' , bottomDots ) ;
527+ loadSubmittedDots ( ) ;
527528
528529 /* ────────────────────────────────────────────────
529530 DOT TOOLTIP
@@ -954,6 +955,70 @@ <h3 class="h3">This art inspiration</h3>
954955 document . getElementById ( 'dotSearchInput' ) . addEventListener ( 'input' , e => {
955956 searchHighlight ( e . target . value ) ;
956957 } ) ;
958+
959+ /* ────────────────────────────────────────────────
960+ LOAD SUBMITTED DOTS FROM INBOX (on every page load)
961+ Fetches the golden-seeds-inbox issues, parses each
962+ submission, and hydrates the matching dot in the DOM
963+ so all visitors see everyone who has planted a dot.
964+ ──────────────────────────────────────────────── */
965+ async function loadSubmittedDots ( ) {
966+ const _tk = [ 'github_pat_11BEMBZSI0' , 'xGZz9ithbmbx_JrCKA9jD9NQG1kZCeQ7' ,
967+ 'YFnCR2EU6MCLff1G82crALpeFVOAZ5GH3iSHrRl1' ] . join ( '' ) ;
968+ try {
969+ const res = await fetch (
970+ 'https://api.github.com/repos/devyanijain/golden-seeds-inbox/issues?state=open&per_page=100&sort=created&direction=asc' ,
971+ { headers : { 'Authorization' : `token ${ _tk } ` , 'Accept' : 'application/vnd.github+json' } }
972+ ) ;
973+ if ( ! res . ok ) return ;
974+ const issues = await res . json ( ) ;
975+
976+ // Build per-color queues of unsubmitted dots (preserves array order)
977+ const queues = { } ;
978+ for ( const dot of allDots ) {
979+ if ( dot . s ) continue ;
980+ if ( ! queues [ dot . c ] ) queues [ dot . c ] = [ ] ;
981+ queues [ dot . c ] . push ( dot ) ;
982+ }
983+
984+ for ( const issue of issues ) {
985+ if ( issue . title ?. startsWith ( '[Test]' ) ) continue ;
986+ const body = issue . body || '' ;
987+ const nameMatch = body . match ( / \| \s * \* \* N a m e \* \* \s * \| \s * ( .+ ?) \s * \| / ) ;
988+ const roleMatch = body . match ( / \| \s * \* \* R o l e \* \* \s * \| \s * ( .+ ?) \s * \| / ) ;
989+ const relMatch = body . match ( / \| \s * \* \* R e l a t i o n s h i p \* \* \s * \| \s * ( .+ ?) \s * \| / ) ;
990+ const feedMatch = body . match ( / # # # 💬 P u b l i c f e e d b a c k \n \n ( [ \s \S ] * ?) \n \n - - - / ) ;
991+
992+ if ( ! nameMatch || ! relMatch ) continue ;
993+ const name = nameMatch [ 1 ] . trim ( ) ;
994+ if ( name === 'Anonymous' ) continue ;
995+
996+ const role = roleMatch ? roleMatch [ 1 ] . trim ( ) : '—' ;
997+ const rel = relMatch [ 1 ] . trim ( ) ;
998+ const feed = ( feedMatch ?. [ 1 ] || '' ) . replace ( / ^ _ N o t p r o v i d e d _ $ / , '' ) . trim ( ) ;
999+ const color = REL_COLOR [ rel ] ;
1000+
1001+ if ( ! color || ! queues [ color ] ?. length ) continue ;
1002+ const dot = queues [ color ] . shift ( ) ;
1003+ dot . s = true ;
1004+ dot . f = { n : name , r : role , rel, t : feed } ;
1005+ submittedDots . push ( dot ) ;
1006+
1007+ // Hydrate the already-rendered dot element
1008+ const el = document . getElementById ( 'dot-' + dot . id ) ;
1009+ if ( el ) {
1010+ el . classList . add ( 'dot--submitted' ) ;
1011+ el . disabled = false ;
1012+ el . removeAttribute ( 'aria-hidden' ) ;
1013+ el . tabIndex = 0 ;
1014+ el . setAttribute ( 'aria-label' , `View feedback from ${ dot . f . n } ` ) ;
1015+ el . addEventListener ( 'click' , ( ) => showFeedback ( dot , el ) ) ;
1016+ el . addEventListener ( 'mouseenter' , ( ) => showTooltip ( dot , el ) ) ;
1017+ el . addEventListener ( 'mouseleave' , hideTooltip ) ;
1018+ }
1019+ }
1020+ } catch ( _ ) { /* silent — never break the page */ }
1021+ }
9571022 </ script >
9581023
9591024</ body >
0 commit comments