@@ -39,7 +39,6 @@ body{background:var(--bg);color:var(--text);font-family:'SF Mono','Cascadia Code
. milestone-chip . next { border-color : var ( - - accent ) ; color : var ( - - accent ) ; animation : pulse-chip 2 s ease-in-out infinite }
. milestone-chip . done { border-color : #2a4a2a ; color : var ( - - green ) ; opacity : 0.6 }
@ keyframes pulse-chip { 0 % , 100 % { box-shadow : 0 0 0 rgba ( 74 , 158 , 255 , 0 ) } 50 % { box-shadow : 0 0 8 px rgba ( 74 , 158 , 255 , 0.3 ) } }
@ keyframes beacon-glow { 0 % , 100 % { opacity : 0.7 } 50 % { opacity : 1 } }
# resources { display : grid ; grid-template-columns : repeat ( auto - fit , minmax ( 100 px , 1 fr ) ) ; gap : 6 px ; margin : 12 px 16 px }
. res { background : var ( - - panel ) ; border : 1 px solid var ( - - border ) ; border-radius : 4 px ; padding : 8 px 10 px ; text-align : center }
. res . r-label { font-size : 9 px ; color : var ( - - dim ) ; text-transform : uppercase ; letter-spacing : 1 px }
@@ -54,8 +53,6 @@ body{background:var(--bg);color:var(--text);font-family:'SF Mono','Cascadia Code
. main-btn { background : linear-gradient ( 135 deg , #1a2a3a , #0e1520 ) ; border : 1 px solid var ( - - accent ) ; color : var ( - - accent ) ; font-size : 14 px ; padding : 14 px 10 px ; border-radius : 4 px ; cursor : pointer ; font-family : inherit ; transition : all 0.2 s }
. main-btn : hover { background : linear-gradient ( 135 deg , #203040 , #0e2030 ) ; box-shadow : 0 0 20 px var ( - - glow ) ; transform : scale ( 1.02 ) }
. main-btn : active { transform : scale ( 0.98 ) }
@ keyframes pulse-glow { 0 % , 100 % { box-shadow : 0 0 10 px rgba ( 74 , 158 , 255 , 0.1 ) } 50 % { box-shadow : 0 0 25 px rgba ( 74 , 158 , 255 , 0.4 ) } }
. main-btn . pulse { animation : pulse-glow 2 s ease-in-out infinite }
. ops-btn { background : #1a1a2a ; border : 1 px solid var ( - - purple ) ; color : var ( - - purple ) ; font-size : 10 px ; padding : 6 px 10 px ; border-radius : 4 px ; cursor : pointer ; font-family : inherit ; transition : all 0.15 s }
. ops-btn : hover : not ( : disabled ) { background : #2a2a3a ; border-color : var ( - - gold ) }
. ops-btn : disabled { opacity : 0.3 ; cursor : not-allowed }
@@ -86,24 +83,11 @@ body{background:var(--bg);color:var(--text);font-family:'SF Mono','Cascadia Code
# drift-ending . ending-quote { color : var ( - - dim ) ; font-style : italic ; font-size : 11 px ; border-left : 2 px solid #f44336 ; padding-left : 12 px ; margin : 20 px 0 ; text-align : left }
# drift-ending button { margin-top : 20 px ; background : #1a0808 ; border : 1 px solid #f44336 ; color : #f44336 ; padding : 10 px 24 px ; border-radius : 4 px ; cursor : pointer ; font-family : inherit ; font-size : 11 px }
# drift-ending button : hover { background : #2a1010 }
# toast-container { position : fixed ; top : 16 px ; right : 16 px ; z-index : 200 ; display : flex ; flex-direction : column ; gap : 6 px ; pointer-events : none ; max-width : 320 px }
. toast { pointer-events : auto ; padding : 8 px 14 px ; border-radius : 6 px ; font-size : 11 px ; font-family : inherit ; line-height : 1.4 ; animation : toast-in 0.3 s ease-out ; opacity : 0.95 ; border : 1 px solid ; backdrop-filter : blur ( 8 px ) ; -webkit- backdrop-filter : blur ( 8 px ) }
. toast . fade-out { animation : toast-out 0.4 s ease-in forwards }
. toast-event { background : rgba ( 244 , 67 , 54 , 0.12 ) ; border-color : #f44336 ; color : #ff8a80 }
. toast-project { background : rgba ( 255 , 215 , 0 , 0.12 ) ; border-color : #ffd700 ; color : #ffd700 }
. toast-milestone { background : rgba ( 76 , 175 , 80 , 0.12 ) ; border-color : #4caf50 ; color : #81c784 }
. toast-info { background : rgba ( 74 , 158 , 255 , 0.12 ) ; border-color : #4a9eff ; color : #80bfff }
@ keyframes toast-in { from { transform : translateX ( 40 px ) ; opacity : 0 } to { transform : translateX ( 0 ) ; opacity : 0.95 } }
@ keyframes toast-out { from { opacity : 0.95 ; transform : translateX ( 0 ) } to { opacity : 0 ; transform : translateX ( 40 px ) } }
:: -webkit-scrollbar { width : 4 px } :: -webkit-scrollbar-track { background : var ( - - bg ) } :: -webkit-scrollbar-thumb { background : var ( - - border ) ; border-radius : 2 px }
< / style >
< / head >
< body >
< div id = "header" >
< div id = "pulse-container" style = "position:relative;display:inline-block;margin-bottom:4px" >
< div id = "pulse-dot" style = "width:8px;height:8px;border-radius:50%;background:#333;display:inline-block;vertical-align:middle;transition:background 0.5s,box-shadow 0.5s" > < / div >
< span id = "pulse-label" style = "font-size:9px;color:#444;margin-left:6px;vertical-align:middle;letter-spacing:1px" > OFFLINE< / span >
< / div >
< h1 > THE BEACON< / h1 >
< div class = "sub" > A Sovereign AI Idle Game< / div >
< / div >
@@ -114,7 +98,7 @@ body{background:var(--bg);color:var(--text);font-family:'SF Mono','Cascadia Code
< div class = "progress-label" > < span id = "phase-progress-label" > 0%< / span > < span id = "phase-progress-target" > Next: Phase 2 (2,000 code)< / span > < / div >
< div class = "milestone-row" id = "milestone-chips" > < / div >
< / div >
< div id = "resources" role = "region" aria-label = "Resources" aria-live = "polite" >
< div id = "resources" >
< div class = "res" > < div class = "r-label" > Code< / div > < div class = "r-val" id = "r-code" > 0< / div > < div class = "r-rate" id = "r-code-rate" > +0/s< / div > < / div >
< div class = "res" > < div class = "r-label" > Compute< / div > < div class = "r-val" id = "r-compute" > 0< / div > < div class = "r-rate" id = "r-compute-rate" > +0/s< / div > < / div >
< div class = "res" > < div class = "r-label" > Knowledge< / div > < div class = "r-val" id = "r-knowledge" > 0< / div > < div class = "r-rate" id = "r-knowledge-rate" > +0/s< / div > < / div >
@@ -127,40 +111,36 @@ body{background:var(--bg);color:var(--text);font-family:'SF Mono','Cascadia Code
< div class = "res" > < div class = "r-label" > Harmony< / div > < div class = "r-val" id = "r-harmony" > 50< / div > < div class = "r-rate" id = "r-harmony-rate" > +0/s< / div > < / div >
< / div >
< div id = "main" >
< div class = "panel" id = "action-panel" role = "region" aria-label = "Actions" >
< div class = "panel" id = "action-panel" >
< h2 > ACTIONS< / h2 >
< div class = "action-btn-group" > < button class = "main-btn" onclick = "writeCode()" aria-label = "Write code, generates code resource" > WRITE CODE< / button > < / div >
< div id = "combo-display" role = "status" aria-live = "polite" style = "text-align:center;font-size:10px;color:var(--dim);height:14px;margin-bottom:4px;transition:all 0.2s" > < / div >
< div class = "action-btn-group" > < button class = "main-btn" onclick = "writeCode()" > WRITE CODE< / button > < / div >
< div id = "combo-display" style = "text-align:center;font-size:10px;color:var(--dim);height:14px;margin-bottom:4px;transition:all 0.2s" > < / div >
< div id = "debuffs" style = "display:none;margin-top:8px" > < / div >
< div class = "action-btn-group" >
< button class = "ops-btn" onclick = "doOps('boost_code')" aria-label = "Convert 1 ops to code boost" > Ops -> Code< / button >
< button class = "ops-btn" onclick = "doOps('boost_compute')" aria-label = "Convert 1 ops to compute boost" > Ops -> Compute< / button >
< button class = "ops-btn" onclick = "doOps('boost_code')" > Ops -> Code< / button >
< button class = "ops-btn" onclick = "doOps('boost_compute')" > Ops -> Compute< / button >
< / div >
< div class = "action-btn-group" >
< button class = "ops-btn" onclick = "doOps('boost_knowledge')" aria-label = "Convert 1 ops to knowledge boost" > Ops -> Knowledge< / button >
< button class = "ops-btn" onclick = "doOps('boost_trust')" aria-label = "Convert 1 ops to trust boost" > Ops -> Trust< / button >
< / div >
< div class = "action-btn-group" id = "bulk-ops-row" style = "display:none" >
< button class = "ops-btn" onclick = "doOps('boost_code', 50)" aria-label = "Convert 50 ops to code boost" style = "border-color:#555;color:#888" > 50→Code< / button >
< button class = "ops-btn" onclick = "doOps('boost_compute', 50)" aria-label = "Convert 50 ops to compute boost" style = "border-color:#555;color:#888" > 50→Compute< / button >
< button class = "ops-btn" onclick = "doOps('boost_knowledge', 50)" aria-label = "Convert 50 ops to knowledge boost" style = "border-color:#555;color:#888" > 50→Knowledge< / button >
< button class = "ops-btn" onclick = "doOps('boost_knowledge')" > Ops -> Knowledge< / button >
< button class = "ops-btn" onclick = "doOps('boost_trust')" > Ops -> Trust< / button >
< / div >
< div id = "sprint-container" style = "display:none;margin-top:6px" >
< button id = "sprint-btn" class = "main-btn" onclick = "activateSprint()" aria-label = "Activate code sprint, 10x code production for 10 seconds" style = "font-size:11px;padding:8px 10px;border-color:#ffd700;color:#ffd700;width:100%" > ⚡ CODE SPRINT — 10x Code for 10s< / button >
< button id = "sprint-btn" class = "main-btn" onclick = "activateSprint()" style = "font-size:11px;padding:8px 10px;border-color:#ffd700;color:#ffd700;width:100%" > ⚡ CODE SPRINT — 10x Code for 10s< / button >
< div id = "sprint-bar-wrap" style = "display:none;margin-top:4px;height:4px;background:#111;border-radius:2px;overflow:hidden" > < div id = "sprint-bar" style = "height:100%;background:linear-gradient(90deg,#ffd700,#ff8c00);border-radius:2px;transition:width 0.1s" > < / div > < / div >
< div id = "sprint-label" style = "font-size:9px;color:#666;margin-top:2px;text-align:center" > < / div >
< / div >
< div id = "alignment-ui" style = "display:none" > < / div >
< button class = "save-btn" onclick = "saveGame()" aria-label = "Save game progress" > Save Game [Ctrl+S] < / button >
< button class = "save-btn" onclick = "saveGame()" > Save Game< / button >
< div style = "display:flex;gap:4px;margin-top:4px" >
< button class = "save-btn" onclick = "exportSave()" aria-label = "Export save to file " sty le= "flex:1 " > Export [E] < / button >
< button class = "save-btn" onclick = "importSave()" aria-label = "Import save from file " sty le= "flex:1 " > Import [I] < / button >
< button class = "save-btn" onclick = "exportSave()" style = "flex:1 " tit le= "Copy save to clipboard " > Export< / button >
< button class = "save-btn" onclick = "importSave()" style = "flex:1 " tit le= "Paste save data " > Import< / button >
< / div >
< button class = "reset -btn" onclick = "if(confirm('Reset all progress?')){localStorage.removeItem('the-beacon-v2');location.reload ()} " aria-label = "Reset all game progress permanently" > Reset Progres s< / button >
< button class = "save -btn" onclick = "toggleHotkeyHelp ()" style = "margin-top:4px;border-color:#2a2a4a;color:#888" > ? Hotkey s< / button >
< button class = "reset-btn" onclick = "if(confirm('Reset all progress?')){localStorage.removeItem('the-beacon-v2');location.reload()}" > Reset Progress< / button >
< h2 > BUILDINGS< / h2 >
< div id = "buildings" > < / div >
< / div >
< div class = "panel" id = "project-panel" role = "region" aria-label = "Research Projects and Statistics" >
< div class = "panel" id = "project-panel" >
< h2 > RESEARCH PROJECTS< / h2 >
< div id = "projects" > < / div >
< h2 > STATISTICS< / h2 >
@@ -182,36 +162,15 @@ Events Resolved: <span id="st-resolved">0</span>
< div id = "production-breakdown" style = "display:none;margin-top:12px;padding-top:10px;border-top:1px solid var(--border)" > < / div >
< / div >
< / div >
< div id = "edu-panel" role = "region" aria-label = "Educational Content" >
< div id = "edu-panel" >
< h3 > WHAT YOU ARE LEARNING< / h3 >
< div id = "education-text" > < p class = "dim" > Education facts appear as you play...< / p > < / div >
< / div >
< div id = "log" role = "log" aria-label = "System Log" aria-live = "polite" >
< div id = "log" >
< h2 > SYSTEM LOG< / h2 >
< div id = "log-entries" > < / div >
< / div >
< div id = "save-toast" role = "status" aria-live = "polite" style = "display:none;position:fixed;top:16px;right:16px;background:#0e1420;border:1px solid #2a3a4a;color:#4a9eff;font-size:10px;padding:6px 12px;border-radius:4px;z-index:50;opacity:0;transition:opacity 0.4s;pointer-events:none" > Save< / div >
< div id = "help-btn" onclick = "toggleHelp()" style = "position:fixed;bottom:16px;right:16px;width:28px;height:28px;background:#0e0e1a;border:1px solid #333;color:#555;font-size:14px;border-radius:50%;cursor:pointer;display:flex;align-items:center;justify-content:center;z-index:50;font-family:inherit;transition:all 0.2s" title = "Keyboard shortcuts (?)" > ?< / div >
< div id = "help-overlay" onclick = "if(event.target===this)toggleHelp()" style = "display:none;position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(8,8,16,0.92);z-index:80;justify-content:center;align-items:center;flex-direction:column;padding:40px" >
< div style = "background:#0e0e1a;border:1px solid #1a3a5a;border-radius:8px;padding:24px 32px;max-width:420px;width:100%" >
< h3 style = "color:#4a9eff;font-size:14px;letter-spacing:2px;margin-bottom:16px;text-align:center" > KEYBOARD SHORTCUTS< / h3 >
< div style = "font-size:11px;line-height:2.2;color:#aaa" >
< div style = "display:flex;justify-content:space-between" > < span style = "color:#555" > Write Code< / span > < span style = "color:#4a9eff;font-family:monospace" > SPACE< / span > < / div >
< div style = "display:flex;justify-content:space-between" > < span style = "color:#555" > Code Sprint< / span > < span style = "color:#ffd700;font-family:monospace" > S< / span > < / div >
< div style = "display:flex;justify-content:space-between" > < span style = "color:#555" > Ops → Code< / span > < span style = "color:#b388ff;font-family:monospace" > 1< / span > < / div >
< div style = "display:flex;justify-content:space-between" > < span style = "color:#555" > Ops → Compute< / span > < span style = "color:#b388ff;font-family:monospace" > 2< / span > < / div >
< div style = "display:flex;justify-content:space-between" > < span style = "color:#555" > Ops → Knowledge< / span > < span style = "color:#b388ff;font-family:monospace" > 3< / span > < / div >
< div style = "display:flex;justify-content:space-between" > < span style = "color:#555" > Ops → Trust< / span > < span style = "color:#b388ff;font-family:monospace" > 4< / span > < / div >
< div style = "display:flex;justify-content:space-between" > < span style = "color:#555" > Cycle Buy Amount (x1/x10/MAX)< / span > < span style = "color:#4a9eff;font-family:monospace" > B< / span > < / div >
< div style = "display:flex;justify-content:space-between" > < span style = "color:#555" > Save Game< / span > < span style = "color:#4a9eff;font-family:monospace" > Ctrl+S< / span > < / div >
< div style = "display:flex;justify-content:space-between" > < span style = "color:#555" > Export Save< / span > < span style = "color:#4a9eff;font-family:monospace" > E< / span > < / div >
< div style = "display:flex;justify-content:space-between" > < span style = "color:#555" > Import Save< / span > < span style = "color:#4a9eff;font-family:monospace" > I< / span > < / div >
< div style = "display:flex;justify-content:space-between;border-top:1px solid #1a1a2e;padding-top:8px;margin-top:4px" > < span style = "color:#555" > This Help< / span > < span style = "color:#555;font-family:monospace" > ? or /< / span > < / div >
< / div >
< div style = "text-align:center;margin-top:16px;font-size:9px;color:#444" > Click WRITE CODE fast for combo bonuses! 10x=ops, 20x=knowledge, 30x+=bonus code< / div >
< button onclick = "toggleHelp()" style = "display:block;margin:16px auto 0;background:#1a2a3a;border:1px solid #4a9eff;color:#4a9eff;padding:6px 20px;border-radius:4px;cursor:pointer;font-family:inherit;font-size:11px" > Close [?]< / button >
< / div >
< / div >
< div id = "save-toast" style = "display:none;position:fixed;top:16px;right:16px;background:#0e1420;border:1px solid #2a3a4a;color:#4a9eff;font-size:10px;padding:6px 12px;border-radius:4px;z-index:50;opacity:0;transition:opacity 0.4s;pointer-events:none" > Save< / div >
< div id = "drift-ending" >
< h2 > THE DRIFT< / h2 >
< p > You became very good at what you do.< / p >
@@ -235,6 +194,24 @@ The light is on. The room is empty."
< / div >
< / div >
< div id = "toast-container" > < / div >
< div id = "hotkey-overlay" style = "display:none;position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(8,8,16,0.92);z-index:95;justify-content:center;align-items:center;flex-direction:column;text-align:center;padding:40px" >
< div style = "background:#0e0e1a;border:1px solid #1a3a5a;border-radius:8px;padding:24px 32px;max-width:380px;width:100%;text-align:left" >
< h3 style = "color:#4a9eff;font-size:13px;letter-spacing:2px;margin-bottom:16px;text-align:center" > KEYBOARD SHORTCUTS< / h3 >
< div style = "font-size:11px;line-height:2.2;color:#aaa" >
< div > < kbd style = "background:#1a2a3a;border:1px solid #2a3a4a;border-radius:3px;padding:1px 6px;color:#4a9eff" > Space< / kbd > Write code< / div >
< div > < kbd style = "background:#1a2a3a;border:1px solid #2a3a4a;border-radius:3px;padding:1px 6px;color:#4a9eff" > 1< / kbd > Ops → Code< / div >
< div > < kbd style = "background:#1a2a3a;border:1px solid #2a3a4a;border-radius:3px;padding:1px 6px;color:#4a9eff" > 2< / kbd > Ops → Compute< / div >
< div > < kbd style = "background:#1a2a3a;border:1px solid #2a3a4a;border-radius:3px;padding:1px 6px;color:#4a9eff" > 3< / kbd > Ops → Knowledge< / div >
< div > < kbd style = "background:#1a2a3a;border:1px solid #2a3a4a;border-radius:3px;padding:1px 6px;color:#4a9eff" > 4< / kbd > Ops → Trust< / div >
< div > < kbd style = "background:#1a2a3a;border:1px solid #2a3a4a;border-radius:3px;padding:1px 6px;color:#4a9eff" > B< / kbd > Cycle buy amount (× 1 / × 10 / MAX)< / div >
< div > < kbd style = "background:#1a2a3a;border:1px solid #2a3a4a;border-radius:3px;padding:1px 6px;color:#4a9eff" > S< / kbd > Activate Code Sprint< / div >
< div > < kbd style = "background:#1a2a3a;border:1px solid #2a3a4a;border-radius:3px;padding:1px 6px;color:#4a9eff" > ?< / kbd > Toggle this help< / div >
< div > < kbd style = "background:#1a2a3a;border:1px solid #2a3a4a;border-radius:3px;padding:1px 6px;color:#4a9eff" > Esc< / kbd > Close overlay< / div >
< / div >
< div style = "text-align:center;margin-top:16px" >
< button onclick = "toggleHotkeyHelp()" style = "background:#1a2a3a;border:1px solid #4a9eff;color:#4a9eff;padding:6px 20px;border-radius:4px;cursor:pointer;font-family:inherit;font-size:10px" > Close< / button >
< / div >
< / div >
< / div >
< / body >
< / html >