6 Commits

5 changed files with 149 additions and 30 deletions

45
README.md Normal file
View File

@@ -0,0 +1,45 @@
# Signal Elsewhere
An interactive educational experience about money, technology, food, and health — built as a Capacitor Android app.
## Development
The app is a single-page HTML/JS application. No build step is needed for the web version.
```bash
# Serve locally for development
python3 -m http.server 8080
# or
npx serve .
```
Open `http://localhost:8080` in your browser.
## Android Build
```bash
# Install dependencies
npm install
# Copy web assets to Android
npx cap copy
# Sync Capacitor config
npx cap sync android
# Open in Android Studio
npx cap open android
```
From Android Studio, build and run on a device or emulator.
## Structure
- `index.html` — main application source
- `www/` — production web directory (copied to Android)
- `android/` — Android project (Capacitor)
- `capacitor.config.json` — Capacitor configuration
## License
ISC

BIN
apk.apk Normal file

Binary file not shown.

View File

@@ -1029,6 +1029,40 @@ html[data-view="mobile"] #exfilDeskCanvas { max-height: 500px; }
html[data-view="mobile"] #whatIsLabBtn { bottom: 8%; font-size: 1.4rem; padding: 1rem 3rem; } html[data-view="mobile"] #whatIsLabBtn { bottom: 8%; font-size: 1.4rem; padding: 1rem 3rem; }
html[data-view="mobile"] #s8BtnRow .btnNext { padding: 1rem 2rem; font-size: 1.4rem; } html[data-view="mobile"] #s8BtnRow .btnNext { padding: 1rem 2rem; font-size: 1.4rem; }
html[data-view="mobile"] #s7BtnRow .btnNext { padding: 1rem 2rem; font-size: 1.4rem; } html[data-view="mobile"] #s7BtnRow .btnNext { padding: 1rem 2rem; font-size: 1.4rem; }
/* Desktop view overrides */
html[data-view="desktop"] .scene { font-size: 1.4rem; padding: 3rem; }
html[data-view="desktop"] .scene4text,
html[data-view="desktop"] .scene5text,
html[data-view="desktop"] .scene7text,
html[data-view="desktop"] .scene8text,
html[data-view="desktop"] .s4visual,
html[data-view="desktop"] .s5visual,
html[data-view="desktop"] .s4tl { max-width: 60rem; }
html[data-view="desktop"] .comp-table { font-size: 1rem; max-width: 60rem; }
html[data-view="desktop"] .comp-table th,
html[data-view="desktop"] .comp-table td { padding: 0.6rem 1rem; }
html[data-view="desktop"] .scene4sub { padding: 3rem 3rem 7rem; }
html[data-view="desktop"] #scene3 { padding: 4rem 3rem; }
html[data-view="desktop"] #scene3Title { font-size: 3.5rem; top: 2.5rem; left: 2.5rem; }
html[data-view="desktop"] #scene3Text,
html[data-view="desktop"] #textContainer { max-width: 60rem; }
html[data-view="desktop"] #textContainer { font-size: 1.6rem; }
html[data-view="desktop"] .hub-title { font-size: 2.5rem; }
html[data-view="desktop"] .callout-box { font-size: 1.3rem; padding: 1.5rem 2rem; }
html[data-view="desktop"] #scene2Line1,
html[data-view="desktop"] #scene2Message2 { font-size: 1.4rem; }
html[data-view="desktop"] .scene3ChoiceBtn { font-size: 1.1rem; padding: 1.2rem 2.5rem; }
html[data-view="desktop"] #meshCanvas,
html[data-view="desktop"] #deskCanvas,
html[data-view="desktop"] #phoneCanvas,
html[data-view="desktop"] #exfilCanvas,
html[data-view="desktop"] #exfilDeskCanvas { max-height: 480px; }
html[data-view="desktop"] .punch-card { font-size: 0.95rem; padding: 1.2rem; }
html[data-view="desktop"] .punch-card .punch-icon { font-size: 1.8rem; }
html[data-view="desktop"] .scene3ChoiceBtn:hover,
html[data-view="desktop"] .btnNext:hover,
html[data-view="desktop"] .hub-btn:hover { box-shadow: 0 0 12px rgba(0,255,0,0.2); }
</style> </style>
</head> </head>
<body> <body>
@@ -1613,11 +1647,7 @@ html[data-view="mobile"] #exfilDeskCanvas { max-height: 500px; }
let introStarted = false; let introStarted = false;
function setView(mode) { function setView(mode) {
if (mode === 'mobile') { document.documentElement.setAttribute('data-view', mode);
document.documentElement.setAttribute('data-view', 'mobile');
} else {
document.documentElement.removeAttribute('data-view');
}
sessionStorage.setItem('signalView', mode); sessionStorage.setItem('signalView', mode);
} }
@@ -2423,7 +2453,7 @@ html[data-view="mobile"] #exfilDeskCanvas { max-height: 500px; }
html+='<tr><td>US DEBT</td><td>$11.9T</td><td>$35T+</td></tr>'; html+='<tr><td>US DEBT</td><td>$11.9T</td><td>$35T+</td></tr>';
html+='<tr><td>BTC ADOPTION</td><td>NONE</td><td>ETFs, NATIONS, FORTUNE 500</td></tr>'; html+='<tr><td>BTC ADOPTION</td><td>NONE</td><td>ETFs, NATIONS, FORTUNE 500</td></tr>';
html+='<tr><td>GOLD CONFISCATION RISK</td><td>LOW</td><td>REAL (CBDCs RISING)</td></tr>'; html+='<tr><td>GOLD CONFISCATION RISK</td><td>LOW</td><td>REAL (CBDCs RISING)</td></tr>';
html+='</table><div class="punch-row"><div class="punch-card"><span class="punch-icon">🟠</span><span class="punch-text">BTC $100K+<br>WALL STREET OWNS IT</span></div><div class="punch-card"><span class="punch-icon">🥇</span><span class="punch-text">GOLD $3K+<br>STILL THE SAFE HAVEN</span></div><div class="punch-card"><span class="punch-icon">📉</span><span class="punch-text">DOLLAR DOWN<br>70% SINCE 2000</span></div></div>'; html+='</table>';
vis.innerHTML=html; vis.innerHTML=html;
vis.classList.add('visible'); vis.classList.add('visible');
showNextBtn('next4f');showNextBtn('sources4f');showNextBtn('back4f'); showNextBtn('next4f');showNextBtn('sources4f');showNextBtn('back4f');
@@ -5837,9 +5867,21 @@ html[data-view="mobile"] #exfilDeskCanvas { max-height: 500px; }
}); });
// Double-click/tap to skip scene (same as Escape on desktop) // Double-click/tap to skip scene (same as Escape on desktop)
if (isAndroidApp) {
let lastTapTime = 0;
document.addEventListener('touchend', (e) => {
const now = Date.now();
if (lastTapTime > 0 && now - lastTapTime < 400) {
e.preventDefault();
document.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape', bubbles: true }));
}
lastTapTime = now;
});
} else {
document.addEventListener('dblclick', () => { document.addEventListener('dblclick', () => {
document.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape', bubbles: true })); document.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape', bubbles: true }));
}); });
}
// Keyboard shortcuts for testing // Keyboard shortcuts for testing
document.addEventListener('keydown', (e) => { document.addEventListener('keydown', (e) => {
@@ -5983,12 +6025,7 @@ html[data-view="mobile"] #exfilDeskCanvas { max-height: 500px; }
+'<tr><td>US DEBT</td><td>$11.9T</td><td>$35T+</td></tr>' +'<tr><td>US DEBT</td><td>$11.9T</td><td>$35T+</td></tr>'
+'<tr><td>BTC ADOPTION</td><td>NONE</td><td>ETFs, NATIONS, FORTUNE 500</td></tr>' +'<tr><td>BTC ADOPTION</td><td>NONE</td><td>ETFs, NATIONS, FORTUNE 500</td></tr>'
+'<tr><td>GOLD CONFISCATION RISK</td><td>LOW</td><td>REAL (CBDCs RISING)</td></tr>' +'<tr><td>GOLD CONFISCATION RISK</td><td>LOW</td><td>REAL (CBDCs RISING)</td></tr>'
+'</table>' +'</table>';
+'<div class="punch-row">'
+'<div class="punch-card"><span class="punch-icon">\uD83D\uDFE0</span><span class="punch-text">BTC $100K+<br>WALL STREET OWNS IT</span></div>'
+'<div class="punch-card"><span class="punch-icon">\uD83E\uDD47</span><span class="punch-text">GOLD $3K+<br>STILL THE SAFE HAVEN</span></div>'
+'<div class="punch-card"><span class="punch-icon">\uD83D\uDCC9</span><span class="punch-text">DOLLAR DOWN<br>70% SINCE 2000</span></div>'
+'</div>';
s4.querySelector('.s4visual').classList.add('visible'); s4.querySelector('.s4visual').classList.add('visible');
document.getElementById('next4f').style.cssText = ''; document.getElementById('next4f').style.cssText = '';
showNextBtn('next4f'); showNextBtn('next4f');

Binary file not shown.

View File

@@ -1029,6 +1029,40 @@ html[data-view="mobile"] #exfilDeskCanvas { max-height: 500px; }
html[data-view="mobile"] #whatIsLabBtn { bottom: 8%; font-size: 1.4rem; padding: 1rem 3rem; } html[data-view="mobile"] #whatIsLabBtn { bottom: 8%; font-size: 1.4rem; padding: 1rem 3rem; }
html[data-view="mobile"] #s8BtnRow .btnNext { padding: 1rem 2rem; font-size: 1.4rem; } html[data-view="mobile"] #s8BtnRow .btnNext { padding: 1rem 2rem; font-size: 1.4rem; }
html[data-view="mobile"] #s7BtnRow .btnNext { padding: 1rem 2rem; font-size: 1.4rem; } html[data-view="mobile"] #s7BtnRow .btnNext { padding: 1rem 2rem; font-size: 1.4rem; }
/* Desktop view overrides */
html[data-view="desktop"] .scene { font-size: 1.4rem; padding: 3rem; }
html[data-view="desktop"] .scene4text,
html[data-view="desktop"] .scene5text,
html[data-view="desktop"] .scene7text,
html[data-view="desktop"] .scene8text,
html[data-view="desktop"] .s4visual,
html[data-view="desktop"] .s5visual,
html[data-view="desktop"] .s4tl { max-width: 60rem; }
html[data-view="desktop"] .comp-table { font-size: 1rem; max-width: 60rem; }
html[data-view="desktop"] .comp-table th,
html[data-view="desktop"] .comp-table td { padding: 0.6rem 1rem; }
html[data-view="desktop"] .scene4sub { padding: 3rem 3rem 7rem; }
html[data-view="desktop"] #scene3 { padding: 4rem 3rem; }
html[data-view="desktop"] #scene3Title { font-size: 3.5rem; top: 2.5rem; left: 2.5rem; }
html[data-view="desktop"] #scene3Text,
html[data-view="desktop"] #textContainer { max-width: 60rem; }
html[data-view="desktop"] #textContainer { font-size: 1.6rem; }
html[data-view="desktop"] .hub-title { font-size: 2.5rem; }
html[data-view="desktop"] .callout-box { font-size: 1.3rem; padding: 1.5rem 2rem; }
html[data-view="desktop"] #scene2Line1,
html[data-view="desktop"] #scene2Message2 { font-size: 1.4rem; }
html[data-view="desktop"] .scene3ChoiceBtn { font-size: 1.1rem; padding: 1.2rem 2.5rem; }
html[data-view="desktop"] #meshCanvas,
html[data-view="desktop"] #deskCanvas,
html[data-view="desktop"] #phoneCanvas,
html[data-view="desktop"] #exfilCanvas,
html[data-view="desktop"] #exfilDeskCanvas { max-height: 480px; }
html[data-view="desktop"] .punch-card { font-size: 0.95rem; padding: 1.2rem; }
html[data-view="desktop"] .punch-card .punch-icon { font-size: 1.8rem; }
html[data-view="desktop"] .scene3ChoiceBtn:hover,
html[data-view="desktop"] .btnNext:hover,
html[data-view="desktop"] .hub-btn:hover { box-shadow: 0 0 12px rgba(0,255,0,0.2); }
</style> </style>
</head> </head>
<body> <body>
@@ -1613,11 +1647,7 @@ html[data-view="mobile"] #exfilDeskCanvas { max-height: 500px; }
let introStarted = false; let introStarted = false;
function setView(mode) { function setView(mode) {
if (mode === 'mobile') { document.documentElement.setAttribute('data-view', mode);
document.documentElement.setAttribute('data-view', 'mobile');
} else {
document.documentElement.removeAttribute('data-view');
}
sessionStorage.setItem('signalView', mode); sessionStorage.setItem('signalView', mode);
} }
@@ -2423,7 +2453,7 @@ html[data-view="mobile"] #exfilDeskCanvas { max-height: 500px; }
html+='<tr><td>US DEBT</td><td>$11.9T</td><td>$35T+</td></tr>'; html+='<tr><td>US DEBT</td><td>$11.9T</td><td>$35T+</td></tr>';
html+='<tr><td>BTC ADOPTION</td><td>NONE</td><td>ETFs, NATIONS, FORTUNE 500</td></tr>'; html+='<tr><td>BTC ADOPTION</td><td>NONE</td><td>ETFs, NATIONS, FORTUNE 500</td></tr>';
html+='<tr><td>GOLD CONFISCATION RISK</td><td>LOW</td><td>REAL (CBDCs RISING)</td></tr>'; html+='<tr><td>GOLD CONFISCATION RISK</td><td>LOW</td><td>REAL (CBDCs RISING)</td></tr>';
html+='</table><div class="punch-row"><div class="punch-card"><span class="punch-icon">🟠</span><span class="punch-text">BTC $100K+<br>WALL STREET OWNS IT</span></div><div class="punch-card"><span class="punch-icon">🥇</span><span class="punch-text">GOLD $3K+<br>STILL THE SAFE HAVEN</span></div><div class="punch-card"><span class="punch-icon">📉</span><span class="punch-text">DOLLAR DOWN<br>70% SINCE 2000</span></div></div>'; html+='</table>';
vis.innerHTML=html; vis.innerHTML=html;
vis.classList.add('visible'); vis.classList.add('visible');
showNextBtn('next4f');showNextBtn('sources4f');showNextBtn('back4f'); showNextBtn('next4f');showNextBtn('sources4f');showNextBtn('back4f');
@@ -5837,9 +5867,21 @@ html[data-view="mobile"] #exfilDeskCanvas { max-height: 500px; }
}); });
// Double-click/tap to skip scene (same as Escape on desktop) // Double-click/tap to skip scene (same as Escape on desktop)
if (isAndroidApp) {
let lastTapTime = 0;
document.addEventListener('touchend', (e) => {
const now = Date.now();
if (lastTapTime > 0 && now - lastTapTime < 400) {
e.preventDefault();
document.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape', bubbles: true }));
}
lastTapTime = now;
});
} else {
document.addEventListener('dblclick', () => { document.addEventListener('dblclick', () => {
document.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape', bubbles: true })); document.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape', bubbles: true }));
}); });
}
// Keyboard shortcuts for testing // Keyboard shortcuts for testing
document.addEventListener('keydown', (e) => { document.addEventListener('keydown', (e) => {
@@ -5983,12 +6025,7 @@ html[data-view="mobile"] #exfilDeskCanvas { max-height: 500px; }
+'<tr><td>US DEBT</td><td>$11.9T</td><td>$35T+</td></tr>' +'<tr><td>US DEBT</td><td>$11.9T</td><td>$35T+</td></tr>'
+'<tr><td>BTC ADOPTION</td><td>NONE</td><td>ETFs, NATIONS, FORTUNE 500</td></tr>' +'<tr><td>BTC ADOPTION</td><td>NONE</td><td>ETFs, NATIONS, FORTUNE 500</td></tr>'
+'<tr><td>GOLD CONFISCATION RISK</td><td>LOW</td><td>REAL (CBDCs RISING)</td></tr>' +'<tr><td>GOLD CONFISCATION RISK</td><td>LOW</td><td>REAL (CBDCs RISING)</td></tr>'
+'</table>' +'</table>';
+'<div class="punch-row">'
+'<div class="punch-card"><span class="punch-icon">\uD83D\uDFE0</span><span class="punch-text">BTC $100K+<br>WALL STREET OWNS IT</span></div>'
+'<div class="punch-card"><span class="punch-icon">\uD83E\uDD47</span><span class="punch-text">GOLD $3K+<br>STILL THE SAFE HAVEN</span></div>'
+'<div class="punch-card"><span class="punch-icon">\uD83D\uDCC9</span><span class="punch-text">DOLLAR DOWN<br>70% SINCE 2000</span></div>'
+'</div>';
s4.querySelector('.s4visual').classList.add('visible'); s4.querySelector('.s4visual').classList.add('visible');
document.getElementById('next4f').style.cssText = ''; document.getElementById('next4f').style.cssText = '';
showNextBtn('next4f'); showNextBtn('next4f');