@oasisomniverse/js 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +91 -0
- package/package.json +1 -1
- package/src/accept-invite.js +17 -0
- package/src/activity-pub.js +17 -0
- package/src/add-2d-object-map.js +17 -0
- package/src/add-3d-object-map.js +17 -0
- package/src/add-quest-to-map.js +17 -0
- package/src/compare-provider-speeds.js +17 -0
- package/src/contact-popup-nft.js +17 -0
- package/src/create-oapp.js +17 -0
- package/src/deploy-oapp.js +17 -0
- package/src/donate-seeds.js +17 -0
- package/src/download-our-world-map.js +17 -0
- package/src/download-our-world-oapp.js +17 -0
- package/src/edit-oapp.js +17 -0
- package/src/eosio.js +17 -0
- package/src/ethereum.js +17 -0
- package/src/game.js +22 -0
- package/src/holochain.js +17 -0
- package/src/hyperdrive.js +17 -0
- package/src/index.esm.js +143 -15
- package/src/index.js +147 -14
- package/src/install-oapp.js +17 -0
- package/src/ipfs.js +17 -0
- package/src/karma-panel.js +28 -0
- package/src/launch-oapp.js +28 -0
- package/src/manage-auto-fail-over.js +17 -0
- package/src/manage-auto-replicaton.js +17 -0
- package/src/manage-load-balancing.js +17 -0
- package/src/manage-map.js +17 -0
- package/src/manage-oapp.js +28 -0
- package/src/manage-providers.js +17 -0
- package/src/manage-quest.js +28 -0
- package/src/manage-seeds.js +26 -0
- package/src/map.js +17 -0
- package/src/menu-message.js +18 -0
- package/src/messaging.js +27 -0
- package/src/mission.js +17 -0
- package/src/mongo-db.js +17 -0
- package/src/neo4j.js +17 -0
- package/src/nft.js +17 -0
- package/src/oapp.js +17 -0
- package/src/onet.js +17 -0
- package/src/onode.js +17 -0
- package/src/pay-with-seeds.js +17 -0
- package/src/plot-route-on-map.js +17 -0
- package/src/providers.js +18 -0
- package/src/quest.js +17 -0
- package/src/reward-seeds.js +17 -0
- package/src/search-avatars.js +32 -0
- package/src/search-map.js +18 -0
- package/src/search-oapp.js +32 -0
- package/src/search-providers.js +17 -0
- package/src/search-quest.js +28 -0
- package/src/search-seeds.js +28 -0
- package/src/seeds-provider.js +17 -0
- package/src/send-invite.js +17 -0
- package/src/settings.js +18 -0
- package/src/solana.js +17 -0
- package/src/solid.js +17 -0
- package/src/sql-lite.js +17 -0
- package/src/three-fold.js +17 -0
- package/src/view-global-3d-map.js +17 -0
- package/src/view-halons-on-map.js +28 -0
- package/src/view-oapp-on-map.js +28 -0
- package/src/view-organizations.js +27 -0
- package/src/view-provider-stats.js +17 -0
- package/src/view-providers.js +17 -0
- package/src/view-quest-on-map.js +28 -0
- package/src/view-quest.js +26 -0
- package/src/view-seeds.js +27 -0
- package/src/wallet.js +28 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
class OasisSearchQuest {
|
|
2
|
+
constructor({ apiUrl = 'https://api.web4.oasisomniverse.one', onClose = null } = {}) { this._apiUrl = apiUrl; this._onClose = onClose; this._overlay = null; this._injectStyles(); }
|
|
3
|
+
_injectStyles() { if (document.getElementById('oasis-popup-styles')) return; const s = document.createElement('style'); s.id = 'oasis-popup-styles'; s.textContent = `.oasis-popup-overlay{position:fixed;inset:0;z-index:9000;background:rgba(0,0,0,.65);backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .25s}.oasis-popup-overlay.is-open{opacity:1}.oasis-popup-modal{background:#0a1628;border:1px solid rgba(0,200,255,.2);border-radius:16px;box-shadow:0 24px 64px rgba(0,0,0,.6);width:90%;max-width:560px;max-height:90vh;overflow-y:auto;transform:translateY(16px);transition:transform .25s}.oasis-popup-overlay.is-open .oasis-popup-modal{transform:none}.oasis-popup-header{display:flex;align-items:center;justify-content:space-between;padding:20px 24px;border-bottom:1px solid rgba(0,200,255,.1)}.oasis-popup-title{font-family:'Orbitron',sans-serif;font-size:14px;font-weight:700;color:#00c8ff;letter-spacing:.08em}.oasis-popup-close{background:none;border:none;color:#7a9bbf;font-size:22px;cursor:pointer;padding:0;line-height:1}.oasis-popup-close:hover{color:#fff}.oasis-popup-body{padding:24px}.oasis-form-group{margin-bottom:16px}.oasis-label{display:block;font-size:11px;font-weight:700;color:#7a9bbf;letter-spacing:.06em;text-transform:uppercase;margin-bottom:6px}.oasis-input{width:100%;background:rgba(0,0,0,.3);border:1px solid rgba(0,200,255,.2);border-radius:8px;padding:10px 14px;color:#fff;font-size:13px;outline:none;box-sizing:border-box}.oasis-input:focus{border-color:#00c8ff}.oasis-btn-primary{background:linear-gradient(135deg,#0066cc,#00c8ff);color:#fff;border:none;border-radius:8px;padding:11px 20px;font-size:13px;font-weight:600;cursor:pointer;width:100%}.oasis-table{width:100%;border-collapse:collapse;font-size:13px}.oasis-table th{text-align:left;padding:10px 12px;font-size:10px;font-weight:700;letter-spacing:.06em;color:#7a9bbf;text-transform:uppercase;border-bottom:1px solid rgba(0,200,255,.1)}.oasis-table td{padding:10px 12px;color:#fff;border-bottom:1px solid rgba(255,255,255,.05)}.oasis-cs{text-align:center;padding:24px}.oasis-cs p{color:#7a9bbf;font-size:13px}.oasis-msg-error{background:rgba(255,80,80,.12);border:1px solid rgba(255,80,80,.3);color:#ff6b6b;border-radius:8px;padding:10px 14px;font-size:13px}`; document.head.appendChild(s); }
|
|
4
|
+
open() {
|
|
5
|
+
if (this._overlay) return;
|
|
6
|
+
this._overlay = document.createElement('div');
|
|
7
|
+
this._overlay.className = 'oasis-popup-overlay';
|
|
8
|
+
this._overlay.innerHTML = `<div class="oasis-popup-modal"><div class="oasis-popup-header"><span class="oasis-popup-title">Search Quests</span><button class="oasis-popup-close">×</button></div><div class="oasis-popup-body"><div class="oasis-form-group"><label class="oasis-label">Search</label><input class="oasis-input" id="oasis-sq-q" placeholder="Quest name or keyword…"></div><button class="oasis-btn-primary" id="oasis-sq-btn">Search</button><div id="oasis-sq-results" style="margin-top:16px"></div></div></div>`;
|
|
9
|
+
this._overlay.querySelector('.oasis-popup-close').addEventListener('click', () => this.close());
|
|
10
|
+
this._overlay.addEventListener('click', e => { if (e.target === this._overlay) this.close(); });
|
|
11
|
+
this._overlay.querySelector('#oasis-sq-btn').addEventListener('click', () => this._search());
|
|
12
|
+
document.body.appendChild(this._overlay);
|
|
13
|
+
requestAnimationFrame(() => this._overlay.classList.add('is-open'));
|
|
14
|
+
}
|
|
15
|
+
async _search() {
|
|
16
|
+
const q = this._overlay.querySelector('#oasis-sq-q').value.trim(); if (!q) return;
|
|
17
|
+
const res = this._overlay.querySelector('#oasis-sq-results');
|
|
18
|
+
res.innerHTML = '<div class="oasis-cs"><p>Searching…</p></div>';
|
|
19
|
+
try {
|
|
20
|
+
const r = await fetch(`${this._apiUrl}/api/quests/search?q=${encodeURIComponent(q)}`);
|
|
21
|
+
const data = await r.json(); const items = Array.isArray(data) ? data : (data.result || []);
|
|
22
|
+
res.innerHTML = items.length ? `<table class="oasis-table"><thead><tr><th>Quest</th><th>Difficulty</th><th>Reward</th></tr></thead><tbody>${items.map(i=>`<tr><td>${i.name||'—'}</td><td>${i.difficulty||'—'}</td><td>${i.reward||'—'}</td></tr>`).join('')}</tbody></table>` : '<div class="oasis-cs"><p>No quests found.</p></div>';
|
|
23
|
+
} catch { res.innerHTML = '<div class="oasis-msg-error">Search failed.</div>'; }
|
|
24
|
+
}
|
|
25
|
+
close() { if (!this._overlay) return; const el = this._overlay; this._overlay = null; el.classList.remove('is-open'); el.addEventListener('transitionend', () => el.remove(), { once: true }); if (this._onClose) this._onClose(); }
|
|
26
|
+
destroy() { this.close(); }
|
|
27
|
+
}
|
|
28
|
+
window.OasisSearchQuest = OasisSearchQuest;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
class OasisSearchSeeds {
|
|
2
|
+
constructor({ apiUrl = 'https://api.web4.oasisomniverse.one', onClose = null } = {}) { this._apiUrl = apiUrl; this._onClose = onClose; this._overlay = null; this._injectStyles(); }
|
|
3
|
+
_injectStyles() { if (document.getElementById('oasis-popup-styles')) return; const s = document.createElement('style'); s.id = 'oasis-popup-styles'; s.textContent = `.oasis-popup-overlay{position:fixed;inset:0;z-index:9000;background:rgba(0,0,0,.65);backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .25s}.oasis-popup-overlay.is-open{opacity:1}.oasis-popup-modal{background:#0a1628;border:1px solid rgba(0,200,255,.2);border-radius:16px;box-shadow:0 24px 64px rgba(0,0,0,.6);width:90%;max-width:560px;max-height:90vh;overflow-y:auto;transform:translateY(16px);transition:transform .25s}.oasis-popup-overlay.is-open .oasis-popup-modal{transform:none}.oasis-popup-header{display:flex;align-items:center;justify-content:space-between;padding:20px 24px;border-bottom:1px solid rgba(0,200,255,.1)}.oasis-popup-title{font-family:'Orbitron',sans-serif;font-size:14px;font-weight:700;color:#00c8ff;letter-spacing:.08em}.oasis-popup-close{background:none;border:none;color:#7a9bbf;font-size:22px;cursor:pointer;padding:0;line-height:1}.oasis-popup-close:hover{color:#fff}.oasis-popup-body{padding:24px}.oasis-search-row{display:flex;gap:8px;margin-bottom:16px}.oasis-input{flex:1;background:rgba(0,0,0,.3);border:1px solid rgba(0,200,255,.2);border-radius:8px;padding:10px 14px;color:#fff;font-size:13px;outline:none}.oasis-input:focus{border-color:#00c8ff}.oasis-btn-primary{background:linear-gradient(135deg,#00a852,#00c864);color:#fff;border:none;border-radius:8px;padding:10px 18px;font-size:13px;font-weight:600;cursor:pointer}.oasis-table{width:100%;border-collapse:collapse;font-size:13px}.oasis-table th{text-align:left;padding:10px 12px;font-size:10px;font-weight:700;letter-spacing:.06em;color:#7a9bbf;text-transform:uppercase;border-bottom:1px solid rgba(0,200,255,.1)}.oasis-table td{padding:10px 12px;color:#fff;border-bottom:1px solid rgba(255,255,255,.05)}.oasis-cs{text-align:center;padding:24px}.oasis-cs p{color:#7a9bbf;font-size:13px}.oasis-msg-error{background:rgba(255,80,80,.12);border:1px solid rgba(255,80,80,.3);color:#ff6b6b;border-radius:8px;padding:10px 14px;font-size:13px}`; document.head.appendChild(s); }
|
|
4
|
+
open() {
|
|
5
|
+
if (this._overlay) return;
|
|
6
|
+
this._overlay = document.createElement('div');
|
|
7
|
+
this._overlay.className = 'oasis-popup-overlay';
|
|
8
|
+
this._overlay.innerHTML = `<div class="oasis-popup-modal"><div class="oasis-popup-header"><span class="oasis-popup-title">Search SEEDS Accounts</span><button class="oasis-popup-close">×</button></div><div class="oasis-popup-body"><div class="oasis-search-row"><input class="oasis-input" id="oasis-ss-q" placeholder="Account name…"><button class="oasis-btn-primary" id="oasis-ss-btn">Search</button></div><div id="oasis-ss-results"><div class="oasis-cs"><p>Enter an account name to search.</p></div></div></div></div>`;
|
|
9
|
+
this._overlay.querySelector('.oasis-popup-close').addEventListener('click', () => this.close());
|
|
10
|
+
this._overlay.addEventListener('click', e => { if (e.target === this._overlay) this.close(); });
|
|
11
|
+
this._overlay.querySelector('#oasis-ss-btn').addEventListener('click', () => this._search());
|
|
12
|
+
document.body.appendChild(this._overlay);
|
|
13
|
+
requestAnimationFrame(() => this._overlay.classList.add('is-open'));
|
|
14
|
+
}
|
|
15
|
+
async _search() {
|
|
16
|
+
const q = this._overlay.querySelector('#oasis-ss-q').value.trim(); if (!q) return;
|
|
17
|
+
const res = this._overlay.querySelector('#oasis-ss-results');
|
|
18
|
+
res.innerHTML = '<div class="oasis-cs"><p>Searching…</p></div>';
|
|
19
|
+
try {
|
|
20
|
+
const r = await fetch(`${this._apiUrl}/api/seeds/search?q=${encodeURIComponent(q)}`);
|
|
21
|
+
const data = await r.json(); const items = Array.isArray(data) ? data : (data.result || []);
|
|
22
|
+
res.innerHTML = items.length ? `<table class="oasis-table"><thead><tr><th>Account</th><th>Balance</th><th>Reputation</th></tr></thead><tbody>${items.map(a=>`<tr><td>${a.account||'—'}</td><td>${a.balance||'0'}</td><td>${a.reputation||'—'}</td></tr>`).join('')}</tbody></table>` : '<div class="oasis-cs"><p>No accounts found.</p></div>';
|
|
23
|
+
} catch { res.innerHTML = '<div class="oasis-msg-error">Search failed.</div>'; }
|
|
24
|
+
}
|
|
25
|
+
close() { if (!this._overlay) return; const el = this._overlay; this._overlay = null; el.classList.remove('is-open'); el.addEventListener('transitionend', () => el.remove(), { once: true }); if (this._onClose) this._onClose(); }
|
|
26
|
+
destroy() { this.close(); }
|
|
27
|
+
}
|
|
28
|
+
window.OasisSearchSeeds = OasisSearchSeeds;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
class OasisSeedsProvider {
|
|
2
|
+
constructor({ onClose = null } = {}) { this._onClose = onClose; this._overlay = null; this._injectStyles(); }
|
|
3
|
+
_injectStyles() { if (document.getElementById('oasis-popup-styles')) return; const s = document.createElement('style'); s.id = 'oasis-popup-styles'; s.textContent = `.oasis-popup-overlay{position:fixed;inset:0;z-index:9000;background:rgba(0,0,0,.65);backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .25s}.oasis-popup-overlay.is-open{opacity:1}.oasis-popup-modal{background:#0a1628;border:1px solid rgba(0,200,255,.2);border-radius:16px;box-shadow:0 24px 64px rgba(0,0,0,.6);width:90%;max-width:520px;max-height:90vh;overflow-y:auto;transform:translateY(16px);transition:transform .25s}.oasis-popup-overlay.is-open .oasis-popup-modal{transform:none}.oasis-popup-header{display:flex;align-items:center;justify-content:space-between;padding:20px 24px;border-bottom:1px solid rgba(0,200,255,.1)}.oasis-popup-title{font-family:Orbitron,sans-serif;font-size:14px;font-weight:700;color:#00c8ff;letter-spacing:.08em}.oasis-popup-close{background:none;border:none;color:#7a9bbf;font-size:22px;cursor:pointer;padding:0;line-height:1}.oasis-popup-close:hover{color:#fff}.oasis-popup-body{padding:24px}.oasis-cs{text-align:center;padding:32px 16px}.oasis-cs-icon{font-size:48px;margin-bottom:12px}.oasis-cs h3{font-family:Orbitron,sans-serif;font-size:15px;color:#00c8ff;margin:0 0 8px}.oasis-cs p{color:#7a9bbf;font-size:13px;margin:0 0 20px}.oasis-btn-primary{background:linear-gradient(135deg,#0066cc,#00c8ff);color:#fff;border:none;border-radius:8px;padding:11px 20px;font-size:13px;font-weight:600;cursor:pointer;width:100%}`; document.head.appendChild(s); }
|
|
4
|
+
open() {
|
|
5
|
+
if (this._overlay) return;
|
|
6
|
+
this._overlay = document.createElement('div');
|
|
7
|
+
this._overlay.className = 'oasis-popup-overlay';
|
|
8
|
+
this._overlay.innerHTML = `<div class="oasis-popup-modal"><div class="oasis-popup-header"><span class="oasis-popup-title">SEEDS Provider</span><button class="oasis-popup-close">×</button></div><div class="oasis-popup-body"><div class="oasis-cs"><div class="oasis-cs-icon">🌱</div><h3>SEEDS Provider</h3><p>SEEDS regenerative economy integration — use SEEDS tokens for payments, donations, and rewards in the OASIS.</p><button class="oasis-btn-primary">Configure Provider</button></div></div></div>`;
|
|
9
|
+
this._overlay.querySelector('.oasis-popup-close').addEventListener('click', () => this.close());
|
|
10
|
+
this._overlay.addEventListener('click', e => { if (e.target === this._overlay) this.close(); });
|
|
11
|
+
document.body.appendChild(this._overlay);
|
|
12
|
+
requestAnimationFrame(() => this._overlay.classList.add('is-open'));
|
|
13
|
+
}
|
|
14
|
+
close() { if (!this._overlay) return; const el = this._overlay; this._overlay = null; el.classList.remove('is-open'); el.addEventListener('transitionend', () => el.remove(), { once: true }); if (this._onClose) this._onClose(); }
|
|
15
|
+
destroy() { this.close(); }
|
|
16
|
+
}
|
|
17
|
+
window.OasisSeedsProvider = OasisSeedsProvider;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
class OasisSendInvite {
|
|
2
|
+
constructor({ onClose = null } = {}) { this._onClose = onClose; this._overlay = null; this._injectStyles(); }
|
|
3
|
+
_injectStyles() { if (document.getElementById('oasis-popup-styles')) return; const s = document.createElement('style'); s.id = 'oasis-popup-styles'; s.textContent = `.oasis-popup-overlay{position:fixed;inset:0;z-index:9000;background:rgba(0,0,0,.65);backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .25s}.oasis-popup-overlay.is-open{opacity:1}.oasis-popup-modal{background:#0a1628;border:1px solid rgba(0,200,255,.2);border-radius:16px;box-shadow:0 24px 64px rgba(0,0,0,.6);width:90%;max-width:480px;max-height:90vh;overflow-y:auto;transform:translateY(16px);transition:transform .25s}.oasis-popup-overlay.is-open .oasis-popup-modal{transform:none}.oasis-popup-header{display:flex;align-items:center;justify-content:space-between;padding:20px 24px;border-bottom:1px solid rgba(0,200,255,.1)}.oasis-popup-title{font-family:'Orbitron',sans-serif;font-size:14px;font-weight:700;color:#00c8ff;letter-spacing:.08em}.oasis-popup-close{background:none;border:none;color:#7a9bbf;font-size:22px;cursor:pointer;padding:0;line-height:1}.oasis-popup-close:hover{color:#fff}.oasis-popup-body{padding:24px}.oasis-form-group{margin-bottom:16px}.oasis-label{display:block;font-size:11px;font-weight:700;color:#7a9bbf;letter-spacing:.06em;text-transform:uppercase;margin-bottom:6px}.oasis-input{width:100%;background:rgba(0,0,0,.3);border:1px solid rgba(0,200,255,.2);border-radius:8px;padding:10px 14px;color:#fff;font-size:13px;outline:none;box-sizing:border-box}.oasis-input:focus{border-color:#00c8ff}.oasis-btn-primary{background:linear-gradient(135deg,#00a852,#00c864);color:#fff;border:none;border-radius:8px;padding:11px 20px;font-size:13px;font-weight:600;cursor:pointer;width:100%}`; document.head.appendChild(s); }
|
|
4
|
+
open() {
|
|
5
|
+
if (this._overlay) return;
|
|
6
|
+
this._overlay = document.createElement('div');
|
|
7
|
+
this._overlay.className = 'oasis-popup-overlay';
|
|
8
|
+
this._overlay.innerHTML = `<div class="oasis-popup-modal"><div class="oasis-popup-header"><span class="oasis-popup-title">Send SEEDS Invite</span><button class="oasis-popup-close">×</button></div><div class="oasis-popup-body"><p style="color:#7a9bbf;font-size:13px;margin:0 0 20px">Invite someone to join the SEEDS regenerative economy. They'll receive a welcome bonus when they accept.</p><div class="oasis-form-group"><label class="oasis-label">Recipient Name</label><input class="oasis-input" placeholder="Their name…"></div><div class="oasis-form-group"><label class="oasis-label">Email or Account</label><input class="oasis-input" placeholder="email@example.com or @username"></div><button class="oasis-btn-primary">🌱 Send Invite</button></div></div>`;
|
|
9
|
+
this._overlay.querySelector('.oasis-popup-close').addEventListener('click', () => this.close());
|
|
10
|
+
this._overlay.addEventListener('click', e => { if (e.target === this._overlay) this.close(); });
|
|
11
|
+
document.body.appendChild(this._overlay);
|
|
12
|
+
requestAnimationFrame(() => this._overlay.classList.add('is-open'));
|
|
13
|
+
}
|
|
14
|
+
close() { if (!this._overlay) return; const el = this._overlay; this._overlay = null; el.classList.remove('is-open'); el.addEventListener('transitionend', () => el.remove(), { once: true }); if (this._onClose) this._onClose(); }
|
|
15
|
+
destroy() { this.close(); }
|
|
16
|
+
}
|
|
17
|
+
window.OasisSendInvite = OasisSendInvite;
|
package/src/settings.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
class OasisSettings {
|
|
2
|
+
constructor({ onClose = null } = {}) { this._onClose = onClose; this._overlay = null; this._injectStyles(); }
|
|
3
|
+
_injectStyles() { if (document.getElementById('oasis-popup-styles')) return; const s = document.createElement('style'); s.id = 'oasis-popup-styles'; s.textContent = `.oasis-popup-overlay{position:fixed;inset:0;z-index:9000;background:rgba(0,0,0,.65);backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .25s}.oasis-popup-overlay.is-open{opacity:1}.oasis-popup-modal{background:#0a1628;border:1px solid rgba(0,200,255,.2);border-radius:16px;box-shadow:0 24px 64px rgba(0,0,0,.6);width:90%;max-width:560px;max-height:90vh;overflow-y:auto;transform:translateY(16px);transition:transform .25s}.oasis-popup-overlay.is-open .oasis-popup-modal{transform:none}.oasis-popup-header{display:flex;align-items:center;justify-content:space-between;padding:20px 24px;border-bottom:1px solid rgba(0,200,255,.1)}.oasis-popup-title{font-family:'Orbitron',sans-serif;font-size:14px;font-weight:700;color:#00c8ff;letter-spacing:.08em}.oasis-popup-close{background:none;border:none;color:#7a9bbf;font-size:22px;cursor:pointer;padding:0;line-height:1}.oasis-popup-close:hover{color:#fff}.oasis-popup-body{padding:24px}.oasis-setting-row{display:flex;align-items:center;justify-content:space-between;padding:14px 0;border-bottom:1px solid rgba(255,255,255,.05)}.oasis-setting-row:last-child{border-bottom:none}.oasis-setting-label{font-size:13px;color:#fff}.oasis-setting-sub{font-size:11px;color:#7a9bbf;margin-top:2px}.oasis-toggle{position:relative;width:40px;height:22px;background:rgba(0,200,255,.15);border:1px solid rgba(0,200,255,.3);border-radius:999px;cursor:pointer;transition:background .2s}.oasis-toggle.on{background:rgba(0,200,255,.4)}.oasis-toggle::after{content:'';position:absolute;top:2px;left:2px;width:16px;height:16px;background:#7a9bbf;border-radius:50%;transition:transform .2s}.oasis-toggle.on::after{transform:translateX(18px);background:#00c8ff}.oasis-btn-primary{background:linear-gradient(135deg,#0066cc,#00c8ff);color:#fff;border:none;border-radius:8px;padding:10px 20px;font-size:13px;font-weight:600;cursor:pointer;margin-top:20px;width:100%}`; document.head.appendChild(s); }
|
|
4
|
+
open() {
|
|
5
|
+
if (this._overlay) return;
|
|
6
|
+
this._overlay = document.createElement('div');
|
|
7
|
+
this._overlay.className = 'oasis-popup-overlay';
|
|
8
|
+
this._overlay.innerHTML = `<div class="oasis-popup-modal"><div class="oasis-popup-header"><span class="oasis-popup-title">Settings</span><button class="oasis-popup-close">×</button></div><div class="oasis-popup-body"><div class="oasis-setting-row"><div><div class="oasis-setting-label">Notifications</div><div class="oasis-setting-sub">Push alerts for activity</div></div><div class="oasis-toggle on" id="s-notif"></div></div><div class="oasis-setting-row"><div><div class="oasis-setting-label">Dark Mode</div><div class="oasis-setting-sub">Reduce eye strain</div></div><div class="oasis-toggle on" id="s-dark"></div></div><div class="oasis-setting-row"><div><div class="oasis-setting-label">Auto-Failover</div><div class="oasis-setting-sub">Switch providers automatically</div></div><div class="oasis-toggle" id="s-failover"></div></div><div class="oasis-setting-row"><div><div class="oasis-setting-label">Analytics</div><div class="oasis-setting-sub">Share usage data</div></div><div class="oasis-toggle" id="s-analytics"></div></div><button class="oasis-btn-primary">Save Settings</button></div></div>`;
|
|
9
|
+
this._overlay.querySelector('.oasis-popup-close').addEventListener('click', () => this.close());
|
|
10
|
+
this._overlay.addEventListener('click', e => { if (e.target === this._overlay) this.close(); });
|
|
11
|
+
this._overlay.querySelectorAll('.oasis-toggle').forEach(t => t.addEventListener('click', () => t.classList.toggle('on')));
|
|
12
|
+
document.body.appendChild(this._overlay);
|
|
13
|
+
requestAnimationFrame(() => this._overlay.classList.add('is-open'));
|
|
14
|
+
}
|
|
15
|
+
close() { if (!this._overlay) return; const el = this._overlay; this._overlay = null; el.classList.remove('is-open'); el.addEventListener('transitionend', () => el.remove(), { once: true }); if (this._onClose) this._onClose(); }
|
|
16
|
+
destroy() { this.close(); }
|
|
17
|
+
}
|
|
18
|
+
window.OasisSettings = OasisSettings;
|
package/src/solana.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
class OasisSolana {
|
|
2
|
+
constructor({ onClose = null } = {}) { this._onClose = onClose; this._overlay = null; this._injectStyles(); }
|
|
3
|
+
_injectStyles() { if (document.getElementById('oasis-popup-styles')) return; const s = document.createElement('style'); s.id = 'oasis-popup-styles'; s.textContent = `.oasis-popup-overlay{position:fixed;inset:0;z-index:9000;background:rgba(0,0,0,.65);backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .25s}.oasis-popup-overlay.is-open{opacity:1}.oasis-popup-modal{background:#0a1628;border:1px solid rgba(0,200,255,.2);border-radius:16px;box-shadow:0 24px 64px rgba(0,0,0,.6);width:90%;max-width:560px;max-height:90vh;overflow-y:auto;transform:translateY(16px);transition:transform .25s}.oasis-popup-overlay.is-open .oasis-popup-modal{transform:none}.oasis-popup-header{display:flex;align-items:center;justify-content:space-between;padding:20px 24px;border-bottom:1px solid rgba(0,200,255,.1)}.oasis-popup-title{font-family:'Orbitron',sans-serif;font-size:14px;font-weight:700;color:#00c8ff;letter-spacing:.08em}.oasis-popup-close{background:none;border:none;color:#7a9bbf;font-size:22px;cursor:pointer;padding:0;line-height:1}.oasis-popup-close:hover{color:#fff}.oasis-popup-body{padding:24px}.oasis-form-group{margin-bottom:16px}.oasis-label{display:block;font-size:11px;font-weight:700;color:#7a9bbf;letter-spacing:.06em;text-transform:uppercase;margin-bottom:6px}.oasis-input{width:100%;background:rgba(0,0,0,.3);border:1px solid rgba(0,200,255,.2);border-radius:8px;padding:10px 14px;color:#fff;font-size:13px;outline:none;box-sizing:border-box}.oasis-input:focus{border-color:#00c8ff}.oasis-btn-primary{background:linear-gradient(135deg,#9945ff,#14f195);color:#fff;border:none;border-radius:8px;padding:11px 20px;font-size:13px;font-weight:600;cursor:pointer;width:100%}.oasis-badge{display:inline-block;padding:3px 8px;border-radius:999px;font-size:10px;font-weight:700;background:rgba(153,69,255,.2);color:#9945ff;margin-bottom:16px}`; document.head.appendChild(s); }
|
|
4
|
+
open() {
|
|
5
|
+
if (this._overlay) return;
|
|
6
|
+
this._overlay = document.createElement('div');
|
|
7
|
+
this._overlay.className = 'oasis-popup-overlay';
|
|
8
|
+
this._overlay.innerHTML = `<div class="oasis-popup-modal"><div class="oasis-popup-header"><span class="oasis-popup-title">Solana NFTs</span><button class="oasis-popup-close">×</button></div><div class="oasis-popup-body"><span class="oasis-badge">⚡ Solana Chain</span><div class="oasis-form-group"><label class="oasis-label">Wallet Address</label><input class="oasis-input" placeholder="Solana wallet address (base58)…"></div><div class="oasis-form-group"><label class="oasis-label">Collection Address (optional)</label><input class="oasis-input" placeholder="Filter by collection…"></div><button class="oasis-btn-primary">Load Solana NFTs</button></div></div>`;
|
|
9
|
+
this._overlay.querySelector('.oasis-popup-close').addEventListener('click', () => this.close());
|
|
10
|
+
this._overlay.addEventListener('click', e => { if (e.target === this._overlay) this.close(); });
|
|
11
|
+
document.body.appendChild(this._overlay);
|
|
12
|
+
requestAnimationFrame(() => this._overlay.classList.add('is-open'));
|
|
13
|
+
}
|
|
14
|
+
close() { if (!this._overlay) return; const el = this._overlay; this._overlay = null; el.classList.remove('is-open'); el.addEventListener('transitionend', () => el.remove(), { once: true }); if (this._onClose) this._onClose(); }
|
|
15
|
+
destroy() { this.close(); }
|
|
16
|
+
}
|
|
17
|
+
window.OasisSolana = OasisSolana;
|
package/src/solid.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
class OasisSolid {
|
|
2
|
+
constructor({ onClose = null } = {}) { this._onClose = onClose; this._overlay = null; this._injectStyles(); }
|
|
3
|
+
_injectStyles() { if (document.getElementById('oasis-popup-styles')) return; const s = document.createElement('style'); s.id = 'oasis-popup-styles'; s.textContent = `.oasis-popup-overlay{position:fixed;inset:0;z-index:9000;background:rgba(0,0,0,.65);backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .25s}.oasis-popup-overlay.is-open{opacity:1}.oasis-popup-modal{background:#0a1628;border:1px solid rgba(0,200,255,.2);border-radius:16px;box-shadow:0 24px 64px rgba(0,0,0,.6);width:90%;max-width:520px;max-height:90vh;overflow-y:auto;transform:translateY(16px);transition:transform .25s}.oasis-popup-overlay.is-open .oasis-popup-modal{transform:none}.oasis-popup-header{display:flex;align-items:center;justify-content:space-between;padding:20px 24px;border-bottom:1px solid rgba(0,200,255,.1)}.oasis-popup-title{font-family:Orbitron,sans-serif;font-size:14px;font-weight:700;color:#00c8ff;letter-spacing:.08em}.oasis-popup-close{background:none;border:none;color:#7a9bbf;font-size:22px;cursor:pointer;padding:0;line-height:1}.oasis-popup-close:hover{color:#fff}.oasis-popup-body{padding:24px}.oasis-cs{text-align:center;padding:32px 16px}.oasis-cs-icon{font-size:48px;margin-bottom:12px}.oasis-cs h3{font-family:Orbitron,sans-serif;font-size:15px;color:#00c8ff;margin:0 0 8px}.oasis-cs p{color:#7a9bbf;font-size:13px;margin:0 0 20px}.oasis-btn-primary{background:linear-gradient(135deg,#0066cc,#00c8ff);color:#fff;border:none;border-radius:8px;padding:11px 20px;font-size:13px;font-weight:600;cursor:pointer;width:100%}`; document.head.appendChild(s); }
|
|
4
|
+
open() {
|
|
5
|
+
if (this._overlay) return;
|
|
6
|
+
this._overlay = document.createElement('div');
|
|
7
|
+
this._overlay.className = 'oasis-popup-overlay';
|
|
8
|
+
this._overlay.innerHTML = `<div class="oasis-popup-modal"><div class="oasis-popup-header"><span class="oasis-popup-title">Solid Provider</span><button class="oasis-popup-close">×</button></div><div class="oasis-popup-body"><div class="oasis-cs"><div class="oasis-cs-icon">💧</div><h3>Solid Provider</h3><p>Linked Data integration via the Solid protocol. Give users ownership of their data with personal pods.</p><button class="oasis-btn-primary">Configure Provider</button></div></div></div>`;
|
|
9
|
+
this._overlay.querySelector('.oasis-popup-close').addEventListener('click', () => this.close());
|
|
10
|
+
this._overlay.addEventListener('click', e => { if (e.target === this._overlay) this.close(); });
|
|
11
|
+
document.body.appendChild(this._overlay);
|
|
12
|
+
requestAnimationFrame(() => this._overlay.classList.add('is-open'));
|
|
13
|
+
}
|
|
14
|
+
close() { if (!this._overlay) return; const el = this._overlay; this._overlay = null; el.classList.remove('is-open'); el.addEventListener('transitionend', () => el.remove(), { once: true }); if (this._onClose) this._onClose(); }
|
|
15
|
+
destroy() { this.close(); }
|
|
16
|
+
}
|
|
17
|
+
window.OasisSolid = OasisSolid;
|
package/src/sql-lite.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
class OasisSqlLite {
|
|
2
|
+
constructor({ onClose = null } = {}) { this._onClose = onClose; this._overlay = null; this._injectStyles(); }
|
|
3
|
+
_injectStyles() { if (document.getElementById('oasis-popup-styles')) return; const s = document.createElement('style'); s.id = 'oasis-popup-styles'; s.textContent = `.oasis-popup-overlay{position:fixed;inset:0;z-index:9000;background:rgba(0,0,0,.65);backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .25s}.oasis-popup-overlay.is-open{opacity:1}.oasis-popup-modal{background:#0a1628;border:1px solid rgba(0,200,255,.2);border-radius:16px;box-shadow:0 24px 64px rgba(0,0,0,.6);width:90%;max-width:520px;max-height:90vh;overflow-y:auto;transform:translateY(16px);transition:transform .25s}.oasis-popup-overlay.is-open .oasis-popup-modal{transform:none}.oasis-popup-header{display:flex;align-items:center;justify-content:space-between;padding:20px 24px;border-bottom:1px solid rgba(0,200,255,.1)}.oasis-popup-title{font-family:Orbitron,sans-serif;font-size:14px;font-weight:700;color:#00c8ff;letter-spacing:.08em}.oasis-popup-close{background:none;border:none;color:#7a9bbf;font-size:22px;cursor:pointer;padding:0;line-height:1}.oasis-popup-close:hover{color:#fff}.oasis-popup-body{padding:24px}.oasis-cs{text-align:center;padding:32px 16px}.oasis-cs-icon{font-size:48px;margin-bottom:12px}.oasis-cs h3{font-family:Orbitron,sans-serif;font-size:15px;color:#00c8ff;margin:0 0 8px}.oasis-cs p{color:#7a9bbf;font-size:13px;margin:0 0 20px}.oasis-btn-primary{background:linear-gradient(135deg,#0066cc,#00c8ff);color:#fff;border:none;border-radius:8px;padding:11px 20px;font-size:13px;font-weight:600;cursor:pointer;width:100%}`; document.head.appendChild(s); }
|
|
4
|
+
open() {
|
|
5
|
+
if (this._overlay) return;
|
|
6
|
+
this._overlay = document.createElement('div');
|
|
7
|
+
this._overlay.className = 'oasis-popup-overlay';
|
|
8
|
+
this._overlay.innerHTML = `<div class="oasis-popup-modal"><div class="oasis-popup-header"><span class="oasis-popup-title">SQLite Provider</span><button class="oasis-popup-close">×</button></div><div class="oasis-popup-body"><div class="oasis-cs"><div class="oasis-cs-icon">💾</div><h3>SQLite Provider</h3><p>Lightweight local SQLite database provider for offline-capable OASIS applications.</p><button class="oasis-btn-primary">Configure Provider</button></div></div></div>`;
|
|
9
|
+
this._overlay.querySelector('.oasis-popup-close').addEventListener('click', () => this.close());
|
|
10
|
+
this._overlay.addEventListener('click', e => { if (e.target === this._overlay) this.close(); });
|
|
11
|
+
document.body.appendChild(this._overlay);
|
|
12
|
+
requestAnimationFrame(() => this._overlay.classList.add('is-open'));
|
|
13
|
+
}
|
|
14
|
+
close() { if (!this._overlay) return; const el = this._overlay; this._overlay = null; el.classList.remove('is-open'); el.addEventListener('transitionend', () => el.remove(), { once: true }); if (this._onClose) this._onClose(); }
|
|
15
|
+
destroy() { this.close(); }
|
|
16
|
+
}
|
|
17
|
+
window.OasisSqlLite = OasisSqlLite;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
class OasisThreeFold {
|
|
2
|
+
constructor({ onClose = null } = {}) { this._onClose = onClose; this._overlay = null; this._injectStyles(); }
|
|
3
|
+
_injectStyles() { if (document.getElementById('oasis-popup-styles')) return; const s = document.createElement('style'); s.id = 'oasis-popup-styles'; s.textContent = `.oasis-popup-overlay{position:fixed;inset:0;z-index:9000;background:rgba(0,0,0,.65);backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .25s}.oasis-popup-overlay.is-open{opacity:1}.oasis-popup-modal{background:#0a1628;border:1px solid rgba(0,200,255,.2);border-radius:16px;box-shadow:0 24px 64px rgba(0,0,0,.6);width:90%;max-width:520px;max-height:90vh;overflow-y:auto;transform:translateY(16px);transition:transform .25s}.oasis-popup-overlay.is-open .oasis-popup-modal{transform:none}.oasis-popup-header{display:flex;align-items:center;justify-content:space-between;padding:20px 24px;border-bottom:1px solid rgba(0,200,255,.1)}.oasis-popup-title{font-family:Orbitron,sans-serif;font-size:14px;font-weight:700;color:#00c8ff;letter-spacing:.08em}.oasis-popup-close{background:none;border:none;color:#7a9bbf;font-size:22px;cursor:pointer;padding:0;line-height:1}.oasis-popup-close:hover{color:#fff}.oasis-popup-body{padding:24px}.oasis-cs{text-align:center;padding:32px 16px}.oasis-cs-icon{font-size:48px;margin-bottom:12px}.oasis-cs h3{font-family:Orbitron,sans-serif;font-size:15px;color:#00c8ff;margin:0 0 8px}.oasis-cs p{color:#7a9bbf;font-size:13px;margin:0 0 20px}.oasis-btn-primary{background:linear-gradient(135deg,#0066cc,#00c8ff);color:#fff;border:none;border-radius:8px;padding:11px 20px;font-size:13px;font-weight:600;cursor:pointer;width:100%}`; document.head.appendChild(s); }
|
|
4
|
+
open() {
|
|
5
|
+
if (this._overlay) return;
|
|
6
|
+
this._overlay = document.createElement('div');
|
|
7
|
+
this._overlay.className = 'oasis-popup-overlay';
|
|
8
|
+
this._overlay.innerHTML = `<div class="oasis-popup-modal"><div class="oasis-popup-header"><span class="oasis-popup-title">ThreeFold Provider</span><button class="oasis-popup-close">×</button></div><div class="oasis-popup-body"><div class="oasis-cs"><div class="oasis-cs-icon">🌐</div><h3>ThreeFold Provider</h3><p>ThreeFold decentralised Internet infrastructure — sovereign compute and storage on the ThreeFold Grid.</p><button class="oasis-btn-primary">Configure Provider</button></div></div></div>`;
|
|
9
|
+
this._overlay.querySelector('.oasis-popup-close').addEventListener('click', () => this.close());
|
|
10
|
+
this._overlay.addEventListener('click', e => { if (e.target === this._overlay) this.close(); });
|
|
11
|
+
document.body.appendChild(this._overlay);
|
|
12
|
+
requestAnimationFrame(() => this._overlay.classList.add('is-open'));
|
|
13
|
+
}
|
|
14
|
+
close() { if (!this._overlay) return; const el = this._overlay; this._overlay = null; el.classList.remove('is-open'); el.addEventListener('transitionend', () => el.remove(), { once: true }); if (this._onClose) this._onClose(); }
|
|
15
|
+
destroy() { this.close(); }
|
|
16
|
+
}
|
|
17
|
+
window.OasisThreeFold = OasisThreeFold;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
class OasisViewGlobal3dMap {
|
|
2
|
+
constructor({ onClose = null } = {}) { this._onClose = onClose; this._overlay = null; this._injectStyles(); }
|
|
3
|
+
_injectStyles() { if (document.getElementById('oasis-popup-styles')) return; const s = document.createElement('style'); s.id = 'oasis-popup-styles'; s.textContent = `.oasis-popup-overlay{position:fixed;inset:0;z-index:9000;background:rgba(0,0,0,.65);backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .25s}.oasis-popup-overlay.is-open{opacity:1}.oasis-popup-modal{background:#0a1628;border:1px solid rgba(0,200,255,.2);border-radius:16px;box-shadow:0 24px 64px rgba(0,0,0,.6);width:90%;max-width:560px;max-height:90vh;overflow-y:auto;transform:translateY(16px);transition:transform .25s}.oasis-popup-overlay.is-open .oasis-popup-modal{transform:none}.oasis-popup-header{display:flex;align-items:center;justify-content:space-between;padding:20px 24px;border-bottom:1px solid rgba(0,200,255,.1)}.oasis-popup-title{font-family:'Orbitron',sans-serif;font-size:14px;font-weight:700;color:#00c8ff;letter-spacing:.08em}.oasis-popup-close{background:none;border:none;color:#7a9bbf;font-size:22px;cursor:pointer;padding:0;line-height:1}.oasis-popup-close:hover{color:#fff}.oasis-popup-body{padding:24px}.oasis-cs{text-align:center;padding:24px 16px}.oasis-cs-icon{font-size:64px;margin-bottom:12px}.oasis-cs h3{font-family:'Orbitron',sans-serif;font-size:15px;color:#00c8ff;margin:0 0 8px}.oasis-cs p{color:#7a9bbf;font-size:13px;margin:0 0 20px}.oasis-btn-primary{background:linear-gradient(135deg,#0066cc,#00c8ff);color:#fff;border:none;border-radius:8px;padding:12px 28px;font-size:13px;font-weight:600;cursor:pointer}`; document.head.appendChild(s); }
|
|
4
|
+
open() {
|
|
5
|
+
if (this._overlay) return;
|
|
6
|
+
this._overlay = document.createElement('div');
|
|
7
|
+
this._overlay.className = 'oasis-popup-overlay';
|
|
8
|
+
this._overlay.innerHTML = `<div class="oasis-popup-modal"><div class="oasis-popup-header"><span class="oasis-popup-title">Global 3D Map</span><button class="oasis-popup-close">×</button></div><div class="oasis-popup-body"><div class="oasis-cs"><div class="oasis-cs-icon">🌐</div><h3>Our World Global Map</h3><p>Explore the entire OASIS Omniverse in real-time 3D. Navigate continents, find quests, locate avatars, and discover OAPP hotspots.</p><button class="oasis-btn-primary" onclick="window.open('https://www.ourworldthegame.com','_blank')">Launch 3D Map</button></div></div></div>`;
|
|
9
|
+
this._overlay.querySelector('.oasis-popup-close').addEventListener('click', () => this.close());
|
|
10
|
+
this._overlay.addEventListener('click', e => { if (e.target === this._overlay) this.close(); });
|
|
11
|
+
document.body.appendChild(this._overlay);
|
|
12
|
+
requestAnimationFrame(() => this._overlay.classList.add('is-open'));
|
|
13
|
+
}
|
|
14
|
+
close() { if (!this._overlay) return; const el = this._overlay; this._overlay = null; el.classList.remove('is-open'); el.addEventListener('transitionend', () => el.remove(), { once: true }); if (this._onClose) this._onClose(); }
|
|
15
|
+
destroy() { this.close(); }
|
|
16
|
+
}
|
|
17
|
+
window.OasisViewGlobal3dMap = OasisViewGlobal3dMap;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
class OasisViewHalonsOnMap {
|
|
2
|
+
constructor({ apiUrl = 'https://api.web4.oasisomniverse.one', onClose = null } = {}) { this._apiUrl = apiUrl; this._onClose = onClose; this._overlay = null; this._injectStyles(); }
|
|
3
|
+
_injectStyles() { if (document.getElementById('oasis-popup-styles')) return; const s = document.createElement('style'); s.id = 'oasis-popup-styles'; s.textContent = `.oasis-popup-overlay{position:fixed;inset:0;z-index:9000;background:rgba(0,0,0,.65);backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .25s}.oasis-popup-overlay.is-open{opacity:1}.oasis-popup-modal{background:#0a1628;border:1px solid rgba(0,200,255,.2);border-radius:16px;box-shadow:0 24px 64px rgba(0,0,0,.6);width:90%;max-width:600px;max-height:90vh;overflow-y:auto;transform:translateY(16px);transition:transform .25s}.oasis-popup-overlay.is-open .oasis-popup-modal{transform:none}.oasis-popup-header{display:flex;align-items:center;justify-content:space-between;padding:20px 24px;border-bottom:1px solid rgba(0,200,255,.1)}.oasis-popup-title{font-family:'Orbitron',sans-serif;font-size:14px;font-weight:700;color:#00c8ff;letter-spacing:.08em}.oasis-popup-close{background:none;border:none;color:#7a9bbf;font-size:22px;cursor:pointer;padding:0;line-height:1}.oasis-popup-close:hover{color:#fff}.oasis-popup-body{padding:24px}.oasis-table{width:100%;border-collapse:collapse;font-size:13px}.oasis-table th{text-align:left;padding:10px 12px;font-size:10px;font-weight:700;letter-spacing:.06em;color:#7a9bbf;text-transform:uppercase;border-bottom:1px solid rgba(0,200,255,.1)}.oasis-table td{padding:10px 12px;color:#fff;border-bottom:1px solid rgba(255,255,255,.05)}.oasis-cs{text-align:center;padding:32px}.oasis-cs-icon{font-size:48px;margin-bottom:12px}.oasis-cs h3{font-family:'Orbitron',sans-serif;font-size:15px;color:#00c8ff;margin:0 0 8px}.oasis-cs p{color:#7a9bbf;font-size:13px;margin:0}.oasis-msg-error{background:rgba(255,80,80,.12);border:1px solid rgba(255,80,80,.3);color:#ff6b6b;border-radius:8px;padding:10px 14px;font-size:13px}`; document.head.appendChild(s); }
|
|
4
|
+
open() {
|
|
5
|
+
if (this._overlay) return;
|
|
6
|
+
this._overlay = document.createElement('div');
|
|
7
|
+
this._overlay.className = 'oasis-popup-overlay';
|
|
8
|
+
this._overlay.innerHTML = `<div class="oasis-popup-modal"><div class="oasis-popup-header"><span class="oasis-popup-title">Halons on Map</span><button class="oasis-popup-close">×</button></div><div class="oasis-popup-body" id="oasis-halons-body"><div class="oasis-cs"><div class="oasis-cs-icon">⏳</div><p>Loading halons…</p></div></div></div>`;
|
|
9
|
+
this._overlay.querySelector('.oasis-popup-close').addEventListener('click', () => this.close());
|
|
10
|
+
this._overlay.addEventListener('click', e => { if (e.target === this._overlay) this.close(); });
|
|
11
|
+
document.body.appendChild(this._overlay);
|
|
12
|
+
requestAnimationFrame(() => this._overlay.classList.add('is-open'));
|
|
13
|
+
this._load();
|
|
14
|
+
}
|
|
15
|
+
async _load() {
|
|
16
|
+
const body = this._overlay.querySelector('#oasis-halons-body');
|
|
17
|
+
try {
|
|
18
|
+
const r = await fetch(`${this._apiUrl}/api/halons`);
|
|
19
|
+
const data = await r.json();
|
|
20
|
+
const halons = Array.isArray(data) ? data : (data.result || []);
|
|
21
|
+
if (!halons.length) { body.innerHTML = '<div class="oasis-cs"><div class="oasis-cs-icon">🔮</div><h3>No Halons</h3><p>No halons placed on the map yet.</p></div>'; return; }
|
|
22
|
+
body.innerHTML = `<table class="oasis-table"><thead><tr><th>Name</th><th>Latitude</th><th>Longitude</th><th>Type</th></tr></thead><tbody>${halons.map(h=>`<tr><td>${h.name||'—'}</td><td>${h.lat||'—'}</td><td>${h.lng||'—'}</td><td>${h.type||'—'}</td></tr>`).join('')}</tbody></table>`;
|
|
23
|
+
} catch { body.innerHTML = '<div class="oasis-msg-error">Failed to load halons.</div>'; }
|
|
24
|
+
}
|
|
25
|
+
close() { if (!this._overlay) return; const el = this._overlay; this._overlay = null; el.classList.remove('is-open'); el.addEventListener('transitionend', () => el.remove(), { once: true }); if (this._onClose) this._onClose(); }
|
|
26
|
+
destroy() { this.close(); }
|
|
27
|
+
}
|
|
28
|
+
window.OasisViewHalonsOnMap = OasisViewHalonsOnMap;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
class OasisViewOappOnMap {
|
|
2
|
+
constructor({ apiUrl = 'https://api.web4.oasisomniverse.one', onClose = null } = {}) { this._apiUrl = apiUrl; this._onClose = onClose; this._overlay = null; this._injectStyles(); }
|
|
3
|
+
_injectStyles() { if (document.getElementById('oasis-popup-styles')) return; const s = document.createElement('style'); s.id = 'oasis-popup-styles'; s.textContent = `.oasis-popup-overlay{position:fixed;inset:0;z-index:9000;background:rgba(0,0,0,.65);backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .25s}.oasis-popup-overlay.is-open{opacity:1}.oasis-popup-modal{background:#0a1628;border:1px solid rgba(0,200,255,.2);border-radius:16px;box-shadow:0 24px 64px rgba(0,0,0,.6);width:90%;max-width:600px;max-height:90vh;overflow-y:auto;transform:translateY(16px);transition:transform .25s}.oasis-popup-overlay.is-open .oasis-popup-modal{transform:none}.oasis-popup-header{display:flex;align-items:center;justify-content:space-between;padding:20px 24px;border-bottom:1px solid rgba(0,200,255,.1)}.oasis-popup-title{font-family:'Orbitron',sans-serif;font-size:14px;font-weight:700;color:#00c8ff;letter-spacing:.08em}.oasis-popup-close{background:none;border:none;color:#7a9bbf;font-size:22px;cursor:pointer;padding:0;line-height:1}.oasis-popup-close:hover{color:#fff}.oasis-popup-body{padding:24px}.oasis-table{width:100%;border-collapse:collapse;font-size:13px}.oasis-table th{text-align:left;padding:10px 12px;font-size:10px;font-weight:700;letter-spacing:.06em;color:#7a9bbf;text-transform:uppercase;border-bottom:1px solid rgba(0,200,255,.1)}.oasis-table td{padding:10px 12px;color:#fff;border-bottom:1px solid rgba(255,255,255,.05)}.oasis-cs{text-align:center;padding:32px}.oasis-cs-icon{font-size:48px;margin-bottom:12px}.oasis-cs h3{font-family:'Orbitron',sans-serif;font-size:15px;color:#00c8ff;margin:0 0 8px}.oasis-cs p{color:#7a9bbf;font-size:13px;margin:0}.oasis-msg-error{background:rgba(255,80,80,.12);border:1px solid rgba(255,80,80,.3);color:#ff6b6b;border-radius:8px;padding:10px 14px;font-size:13px}`; document.head.appendChild(s); }
|
|
4
|
+
open() {
|
|
5
|
+
if (this._overlay) return;
|
|
6
|
+
this._overlay = document.createElement('div');
|
|
7
|
+
this._overlay.className = 'oasis-popup-overlay';
|
|
8
|
+
this._overlay.innerHTML = `<div class="oasis-popup-modal"><div class="oasis-popup-header"><span class="oasis-popup-title">OAPPs on Map</span><button class="oasis-popup-close">×</button></div><div class="oasis-popup-body" id="oasis-oapp-map-body"><div class="oasis-cs"><div class="oasis-cs-icon">⏳</div><p>Loading OAPPs…</p></div></div></div>`;
|
|
9
|
+
this._overlay.querySelector('.oasis-popup-close').addEventListener('click', () => this.close());
|
|
10
|
+
this._overlay.addEventListener('click', e => { if (e.target === this._overlay) this.close(); });
|
|
11
|
+
document.body.appendChild(this._overlay);
|
|
12
|
+
requestAnimationFrame(() => this._overlay.classList.add('is-open'));
|
|
13
|
+
this._load();
|
|
14
|
+
}
|
|
15
|
+
async _load() {
|
|
16
|
+
const body = this._overlay.querySelector('#oasis-oapp-map-body');
|
|
17
|
+
try {
|
|
18
|
+
const r = await fetch(`${this._apiUrl}/api/oapp/map`);
|
|
19
|
+
const data = await r.json();
|
|
20
|
+
const oapps = Array.isArray(data) ? data : (data.result || []);
|
|
21
|
+
if (!oapps.length) { body.innerHTML = '<div class="oasis-cs"><div class="oasis-cs-icon">📦</div><h3>No OAPPs</h3><p>No OAPPs pinned on the map yet.</p></div>'; return; }
|
|
22
|
+
body.innerHTML = `<table class="oasis-table"><thead><tr><th>OAPP</th><th>Category</th><th>Lat</th><th>Lng</th></tr></thead><tbody>${oapps.map(o=>`<tr><td>${o.name||'—'}</td><td>${o.category||'—'}</td><td>${o.lat||'—'}</td><td>${o.lng||'—'}</td></tr>`).join('')}</tbody></table>`;
|
|
23
|
+
} catch { body.innerHTML = '<div class="oasis-msg-error">Failed to load OAPPs.</div>'; }
|
|
24
|
+
}
|
|
25
|
+
close() { if (!this._overlay) return; const el = this._overlay; this._overlay = null; el.classList.remove('is-open'); el.addEventListener('transitionend', () => el.remove(), { once: true }); if (this._onClose) this._onClose(); }
|
|
26
|
+
destroy() { this.close(); }
|
|
27
|
+
}
|
|
28
|
+
window.OasisViewOappOnMap = OasisViewOappOnMap;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
class OasisViewOrganizations {
|
|
2
|
+
constructor({ apiUrl = 'https://api.web4.oasisomniverse.one', onClose = null } = {}) { this._apiUrl = apiUrl; this._onClose = onClose; this._overlay = null; this._injectStyles(); }
|
|
3
|
+
_injectStyles() { if (document.getElementById('oasis-popup-styles')) return; const s = document.createElement('style'); s.id = 'oasis-popup-styles'; s.textContent = `.oasis-popup-overlay{position:fixed;inset:0;z-index:9000;background:rgba(0,0,0,.65);backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .25s}.oasis-popup-overlay.is-open{opacity:1}.oasis-popup-modal{background:#0a1628;border:1px solid rgba(0,200,255,.2);border-radius:16px;box-shadow:0 24px 64px rgba(0,0,0,.6);width:90%;max-width:600px;max-height:90vh;overflow-y:auto;transform:translateY(16px);transition:transform .25s}.oasis-popup-overlay.is-open .oasis-popup-modal{transform:none}.oasis-popup-header{display:flex;align-items:center;justify-content:space-between;padding:20px 24px;border-bottom:1px solid rgba(0,200,255,.1)}.oasis-popup-title{font-family:'Orbitron',sans-serif;font-size:14px;font-weight:700;color:#00c8ff;letter-spacing:.08em}.oasis-popup-close{background:none;border:none;color:#7a9bbf;font-size:22px;cursor:pointer;padding:0;line-height:1}.oasis-popup-close:hover{color:#fff}.oasis-popup-body{padding:24px}.oasis-table{width:100%;border-collapse:collapse;font-size:13px}.oasis-table th{text-align:left;padding:10px 12px;font-size:10px;font-weight:700;letter-spacing:.06em;color:#7a9bbf;text-transform:uppercase;border-bottom:1px solid rgba(0,200,255,.1)}.oasis-table td{padding:10px 12px;color:#fff;border-bottom:1px solid rgba(255,255,255,.05)}.oasis-btn-sm{background:linear-gradient(135deg,#00a852,#00c864);color:#fff;border:none;border-radius:6px;padding:5px 12px;font-size:11px;cursor:pointer}.oasis-cs{text-align:center;padding:32px}.oasis-cs-icon{font-size:48px;margin-bottom:12px}.oasis-cs h3{font-family:'Orbitron',sans-serif;font-size:15px;color:#00c8ff;margin:0 0 8px}.oasis-cs p{color:#7a9bbf;font-size:13px;margin:0}.oasis-msg-error{background:rgba(255,80,80,.12);border:1px solid rgba(255,80,80,.3);color:#ff6b6b;border-radius:8px;padding:10px 14px;font-size:13px}`; document.head.appendChild(s); }
|
|
4
|
+
open() {
|
|
5
|
+
if (this._overlay) return;
|
|
6
|
+
this._overlay = document.createElement('div');
|
|
7
|
+
this._overlay.className = 'oasis-popup-overlay';
|
|
8
|
+
this._overlay.innerHTML = `<div class="oasis-popup-modal"><div class="oasis-popup-header"><span class="oasis-popup-title">SEEDS Organisations</span><button class="oasis-popup-close">×</button></div><div class="oasis-popup-body" id="oasis-orgs-body"><div class="oasis-cs"><div class="oasis-cs-icon">⏳</div><p>Loading organisations…</p></div></div></div>`;
|
|
9
|
+
this._overlay.querySelector('.oasis-popup-close').addEventListener('click', () => this.close());
|
|
10
|
+
this._overlay.addEventListener('click', e => { if (e.target === this._overlay) this.close(); });
|
|
11
|
+
document.body.appendChild(this._overlay);
|
|
12
|
+
requestAnimationFrame(() => this._overlay.classList.add('is-open'));
|
|
13
|
+
this._load();
|
|
14
|
+
}
|
|
15
|
+
async _load() {
|
|
16
|
+
const body = this._overlay.querySelector('#oasis-orgs-body');
|
|
17
|
+
try {
|
|
18
|
+
const r = await fetch(`${this._apiUrl}/api/seeds/organisations`);
|
|
19
|
+
const data = await r.json(); const orgs = Array.isArray(data) ? data : (data.result || []);
|
|
20
|
+
if (!orgs.length) { body.innerHTML = '<div class="oasis-cs"><div class="oasis-cs-icon">🌿</div><h3>No Organisations</h3><p>No SEEDS organisations found.</p></div>'; return; }
|
|
21
|
+
body.innerHTML = `<table class="oasis-table"><thead><tr><th>Organisation</th><th>Members</th><th>Action</th></tr></thead><tbody>${orgs.map(o=>`<tr><td>${o.name||'—'}</td><td>${o.members||'0'}</td><td><button class="oasis-btn-sm">Join</button></td></tr>`).join('')}</tbody></table>`;
|
|
22
|
+
} catch { body.innerHTML = '<div class="oasis-msg-error">Failed to load organisations.</div>'; }
|
|
23
|
+
}
|
|
24
|
+
close() { if (!this._overlay) return; const el = this._overlay; this._overlay = null; el.classList.remove('is-open'); el.addEventListener('transitionend', () => el.remove(), { once: true }); if (this._onClose) this._onClose(); }
|
|
25
|
+
destroy() { this.close(); }
|
|
26
|
+
}
|
|
27
|
+
window.OasisViewOrganizations = OasisViewOrganizations;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
class OasisViewProviderStats {
|
|
2
|
+
constructor({ onClose = null } = {}) { this._onClose = onClose; this._overlay = null; this._injectStyles(); }
|
|
3
|
+
_injectStyles() { if (document.getElementById('oasis-popup-styles')) return; const s = document.createElement('style'); s.id = 'oasis-popup-styles'; s.textContent = `.oasis-popup-overlay{position:fixed;inset:0;z-index:9000;background:rgba(0,0,0,.65);backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .25s}.oasis-popup-overlay.is-open{opacity:1}.oasis-popup-modal{background:#0a1628;border:1px solid rgba(0,200,255,.2);border-radius:16px;box-shadow:0 24px 64px rgba(0,0,0,.6);width:90%;max-width:520px;max-height:90vh;overflow-y:auto;transform:translateY(16px);transition:transform .25s}.oasis-popup-overlay.is-open .oasis-popup-modal{transform:none}.oasis-popup-header{display:flex;align-items:center;justify-content:space-between;padding:20px 24px;border-bottom:1px solid rgba(0,200,255,.1)}.oasis-popup-title{font-family:Orbitron,sans-serif;font-size:14px;font-weight:700;color:#00c8ff;letter-spacing:.08em}.oasis-popup-close{background:none;border:none;color:#7a9bbf;font-size:22px;cursor:pointer;padding:0;line-height:1}.oasis-popup-close:hover{color:#fff}.oasis-popup-body{padding:24px}.oasis-cs{text-align:center;padding:32px 16px}.oasis-cs-icon{font-size:48px;margin-bottom:12px}.oasis-cs h3{font-family:Orbitron,sans-serif;font-size:15px;color:#00c8ff;margin:0 0 8px}.oasis-cs p{color:#7a9bbf;font-size:13px;margin:0 0 20px}.oasis-btn-primary{background:linear-gradient(135deg,#0066cc,#00c8ff);color:#fff;border:none;border-radius:8px;padding:11px 20px;font-size:13px;font-weight:600;cursor:pointer;width:100%}`; document.head.appendChild(s); }
|
|
4
|
+
open() {
|
|
5
|
+
if (this._overlay) return;
|
|
6
|
+
this._overlay = document.createElement('div');
|
|
7
|
+
this._overlay.className = 'oasis-popup-overlay';
|
|
8
|
+
this._overlay.innerHTML = `<div class="oasis-popup-modal"><div class="oasis-popup-header"><span class="oasis-popup-title">Provider Stats</span><button class="oasis-popup-close">×</button></div><div class="oasis-popup-body"><div class="oasis-cs"><div class="oasis-cs-icon">📊</div><h3>Provider Stats</h3><p>Detailed statistics for each connected provider — read/write speeds, uptime, data volume, and health scores.</p><button class="oasis-btn-primary">Configure Provider</button></div></div></div>`;
|
|
9
|
+
this._overlay.querySelector('.oasis-popup-close').addEventListener('click', () => this.close());
|
|
10
|
+
this._overlay.addEventListener('click', e => { if (e.target === this._overlay) this.close(); });
|
|
11
|
+
document.body.appendChild(this._overlay);
|
|
12
|
+
requestAnimationFrame(() => this._overlay.classList.add('is-open'));
|
|
13
|
+
}
|
|
14
|
+
close() { if (!this._overlay) return; const el = this._overlay; this._overlay = null; el.classList.remove('is-open'); el.addEventListener('transitionend', () => el.remove(), { once: true }); if (this._onClose) this._onClose(); }
|
|
15
|
+
destroy() { this.close(); }
|
|
16
|
+
}
|
|
17
|
+
window.OasisViewProviderStats = OasisViewProviderStats;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
class OasisViewProviders {
|
|
2
|
+
constructor({ onClose = null } = {}) { this._onClose = onClose; this._overlay = null; this._injectStyles(); }
|
|
3
|
+
_injectStyles() { if (document.getElementById('oasis-popup-styles')) return; const s = document.createElement('style'); s.id = 'oasis-popup-styles'; s.textContent = `.oasis-popup-overlay{position:fixed;inset:0;z-index:9000;background:rgba(0,0,0,.65);backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .25s}.oasis-popup-overlay.is-open{opacity:1}.oasis-popup-modal{background:#0a1628;border:1px solid rgba(0,200,255,.2);border-radius:16px;box-shadow:0 24px 64px rgba(0,0,0,.6);width:90%;max-width:520px;max-height:90vh;overflow-y:auto;transform:translateY(16px);transition:transform .25s}.oasis-popup-overlay.is-open .oasis-popup-modal{transform:none}.oasis-popup-header{display:flex;align-items:center;justify-content:space-between;padding:20px 24px;border-bottom:1px solid rgba(0,200,255,.1)}.oasis-popup-title{font-family:Orbitron,sans-serif;font-size:14px;font-weight:700;color:#00c8ff;letter-spacing:.08em}.oasis-popup-close{background:none;border:none;color:#7a9bbf;font-size:22px;cursor:pointer;padding:0;line-height:1}.oasis-popup-close:hover{color:#fff}.oasis-popup-body{padding:24px}.oasis-cs{text-align:center;padding:32px 16px}.oasis-cs-icon{font-size:48px;margin-bottom:12px}.oasis-cs h3{font-family:Orbitron,sans-serif;font-size:15px;color:#00c8ff;margin:0 0 8px}.oasis-cs p{color:#7a9bbf;font-size:13px;margin:0 0 20px}.oasis-btn-primary{background:linear-gradient(135deg,#0066cc,#00c8ff);color:#fff;border:none;border-radius:8px;padding:11px 20px;font-size:13px;font-weight:600;cursor:pointer;width:100%}`; document.head.appendChild(s); }
|
|
4
|
+
open() {
|
|
5
|
+
if (this._overlay) return;
|
|
6
|
+
this._overlay = document.createElement('div');
|
|
7
|
+
this._overlay.className = 'oasis-popup-overlay';
|
|
8
|
+
this._overlay.innerHTML = `<div class="oasis-popup-modal"><div class="oasis-popup-header"><span class="oasis-popup-title">View Providers</span><button class="oasis-popup-close">×</button></div><div class="oasis-popup-body"><div class="oasis-cs"><div class="oasis-cs-icon">👁️</div><h3>View Providers</h3><p>View all currently connected providers with their status, latency, and storage statistics.</p><button class="oasis-btn-primary">Configure Provider</button></div></div></div>`;
|
|
9
|
+
this._overlay.querySelector('.oasis-popup-close').addEventListener('click', () => this.close());
|
|
10
|
+
this._overlay.addEventListener('click', e => { if (e.target === this._overlay) this.close(); });
|
|
11
|
+
document.body.appendChild(this._overlay);
|
|
12
|
+
requestAnimationFrame(() => this._overlay.classList.add('is-open'));
|
|
13
|
+
}
|
|
14
|
+
close() { if (!this._overlay) return; const el = this._overlay; this._overlay = null; el.classList.remove('is-open'); el.addEventListener('transitionend', () => el.remove(), { once: true }); if (this._onClose) this._onClose(); }
|
|
15
|
+
destroy() { this.close(); }
|
|
16
|
+
}
|
|
17
|
+
window.OasisViewProviders = OasisViewProviders;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
class OasisViewQuestOnMap {
|
|
2
|
+
constructor({ apiUrl = 'https://api.web4.oasisomniverse.one', onClose = null } = {}) { this._apiUrl = apiUrl; this._onClose = onClose; this._overlay = null; this._injectStyles(); }
|
|
3
|
+
_injectStyles() { if (document.getElementById('oasis-popup-styles')) return; const s = document.createElement('style'); s.id = 'oasis-popup-styles'; s.textContent = `.oasis-popup-overlay{position:fixed;inset:0;z-index:9000;background:rgba(0,0,0,.65);backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .25s}.oasis-popup-overlay.is-open{opacity:1}.oasis-popup-modal{background:#0a1628;border:1px solid rgba(0,200,255,.2);border-radius:16px;box-shadow:0 24px 64px rgba(0,0,0,.6);width:90%;max-width:600px;max-height:90vh;overflow-y:auto;transform:translateY(16px);transition:transform .25s}.oasis-popup-overlay.is-open .oasis-popup-modal{transform:none}.oasis-popup-header{display:flex;align-items:center;justify-content:space-between;padding:20px 24px;border-bottom:1px solid rgba(0,200,255,.1)}.oasis-popup-title{font-family:'Orbitron',sans-serif;font-size:14px;font-weight:700;color:#00c8ff;letter-spacing:.08em}.oasis-popup-close{background:none;border:none;color:#7a9bbf;font-size:22px;cursor:pointer;padding:0;line-height:1}.oasis-popup-close:hover{color:#fff}.oasis-popup-body{padding:24px}.oasis-table{width:100%;border-collapse:collapse;font-size:13px}.oasis-table th{text-align:left;padding:10px 12px;font-size:10px;font-weight:700;letter-spacing:.06em;color:#7a9bbf;text-transform:uppercase;border-bottom:1px solid rgba(0,200,255,.1)}.oasis-table td{padding:10px 12px;color:#fff;border-bottom:1px solid rgba(255,255,255,.05)}.oasis-cs{text-align:center;padding:32px}.oasis-cs-icon{font-size:48px;margin-bottom:12px}.oasis-cs h3{font-family:'Orbitron',sans-serif;font-size:15px;color:#00c8ff;margin:0 0 8px}.oasis-cs p{color:#7a9bbf;font-size:13px;margin:0}.oasis-msg-error{background:rgba(255,80,80,.12);border:1px solid rgba(255,80,80,.3);color:#ff6b6b;border-radius:8px;padding:10px 14px;font-size:13px}`; document.head.appendChild(s); }
|
|
4
|
+
open() {
|
|
5
|
+
if (this._overlay) return;
|
|
6
|
+
this._overlay = document.createElement('div');
|
|
7
|
+
this._overlay.className = 'oasis-popup-overlay';
|
|
8
|
+
this._overlay.innerHTML = `<div class="oasis-popup-modal"><div class="oasis-popup-header"><span class="oasis-popup-title">Quests on Map</span><button class="oasis-popup-close">×</button></div><div class="oasis-popup-body" id="oasis-quest-map-body"><div class="oasis-cs"><div class="oasis-cs-icon">⏳</div><p>Loading quests…</p></div></div></div>`;
|
|
9
|
+
this._overlay.querySelector('.oasis-popup-close').addEventListener('click', () => this.close());
|
|
10
|
+
this._overlay.addEventListener('click', e => { if (e.target === this._overlay) this.close(); });
|
|
11
|
+
document.body.appendChild(this._overlay);
|
|
12
|
+
requestAnimationFrame(() => this._overlay.classList.add('is-open'));
|
|
13
|
+
this._load();
|
|
14
|
+
}
|
|
15
|
+
async _load() {
|
|
16
|
+
const body = this._overlay.querySelector('#oasis-quest-map-body');
|
|
17
|
+
try {
|
|
18
|
+
const r = await fetch(`${this._apiUrl}/api/quests/map`);
|
|
19
|
+
const data = await r.json();
|
|
20
|
+
const quests = Array.isArray(data) ? data : (data.result || []);
|
|
21
|
+
if (!quests.length) { body.innerHTML = '<div class="oasis-cs"><div class="oasis-cs-icon">🗺️</div><h3>No Quests</h3><p>No quests pinned on the map yet.</p></div>'; return; }
|
|
22
|
+
body.innerHTML = `<table class="oasis-table"><thead><tr><th>Quest</th><th>Difficulty</th><th>Lat</th><th>Lng</th></tr></thead><tbody>${quests.map(q=>`<tr><td>${q.name||'—'}</td><td>${q.difficulty||'—'}</td><td>${q.lat||'—'}</td><td>${q.lng||'—'}</td></tr>`).join('')}</tbody></table>`;
|
|
23
|
+
} catch { body.innerHTML = '<div class="oasis-msg-error">Failed to load quests.</div>'; }
|
|
24
|
+
}
|
|
25
|
+
close() { if (!this._overlay) return; const el = this._overlay; this._overlay = null; el.classList.remove('is-open'); el.addEventListener('transitionend', () => el.remove(), { once: true }); if (this._onClose) this._onClose(); }
|
|
26
|
+
destroy() { this.close(); }
|
|
27
|
+
}
|
|
28
|
+
window.OasisViewQuestOnMap = OasisViewQuestOnMap;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
class OasisViewQuest {
|
|
2
|
+
constructor({ questId = '', apiUrl = 'https://api.web4.oasisomniverse.one', onClose = null } = {}) { this._questId = questId; this._apiUrl = apiUrl; this._onClose = onClose; this._overlay = null; this._injectStyles(); }
|
|
3
|
+
_injectStyles() { if (document.getElementById('oasis-popup-styles')) return; const s = document.createElement('style'); s.id = 'oasis-popup-styles'; s.textContent = `.oasis-popup-overlay{position:fixed;inset:0;z-index:9000;background:rgba(0,0,0,.65);backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .25s}.oasis-popup-overlay.is-open{opacity:1}.oasis-popup-modal{background:#0a1628;border:1px solid rgba(0,200,255,.2);border-radius:16px;box-shadow:0 24px 64px rgba(0,0,0,.6);width:90%;max-width:560px;max-height:90vh;overflow-y:auto;transform:translateY(16px);transition:transform .25s}.oasis-popup-overlay.is-open .oasis-popup-modal{transform:none}.oasis-popup-header{display:flex;align-items:center;justify-content:space-between;padding:20px 24px;border-bottom:1px solid rgba(0,200,255,.1)}.oasis-popup-title{font-family:'Orbitron',sans-serif;font-size:14px;font-weight:700;color:#00c8ff;letter-spacing:.08em}.oasis-popup-close{background:none;border:none;color:#7a9bbf;font-size:22px;cursor:pointer;padding:0;line-height:1}.oasis-popup-close:hover{color:#fff}.oasis-popup-body{padding:24px}.oasis-table{width:100%;border-collapse:collapse;font-size:13px}.oasis-table td{padding:10px 12px;color:#fff;border-bottom:1px solid rgba(255,255,255,.05)}.oasis-cs{text-align:center;padding:32px 16px}.oasis-cs-icon{font-size:48px;margin-bottom:12px}.oasis-cs h3{font-family:'Orbitron',sans-serif;font-size:15px;color:#00c8ff;margin:0 0 8px}.oasis-cs p{color:#7a9bbf;font-size:13px;margin:0}.oasis-msg-error{background:rgba(255,80,80,.12);border:1px solid rgba(255,80,80,.3);color:#ff6b6b;border-radius:8px;padding:10px 14px;font-size:13px}`; document.head.appendChild(s); }
|
|
4
|
+
open() {
|
|
5
|
+
if (this._overlay) return;
|
|
6
|
+
this._overlay = document.createElement('div');
|
|
7
|
+
this._overlay.className = 'oasis-popup-overlay';
|
|
8
|
+
this._overlay.innerHTML = `<div class="oasis-popup-modal"><div class="oasis-popup-header"><span class="oasis-popup-title">View Quest</span><button class="oasis-popup-close">×</button></div><div class="oasis-popup-body" id="oasis-vq-body"><div class="oasis-cs"><div class="oasis-cs-icon">⏳</div><p>Loading quest…</p></div></div></div>`;
|
|
9
|
+
this._overlay.querySelector('.oasis-popup-close').addEventListener('click', () => this.close());
|
|
10
|
+
this._overlay.addEventListener('click', e => { if (e.target === this._overlay) this.close(); });
|
|
11
|
+
document.body.appendChild(this._overlay);
|
|
12
|
+
requestAnimationFrame(() => this._overlay.classList.add('is-open'));
|
|
13
|
+
this._load();
|
|
14
|
+
}
|
|
15
|
+
async _load() {
|
|
16
|
+
const body = this._overlay.querySelector('#oasis-vq-body');
|
|
17
|
+
try {
|
|
18
|
+
const r = await fetch(`${this._apiUrl}/api/quests/${this._questId}`);
|
|
19
|
+
const q = await r.json();
|
|
20
|
+
body.innerHTML = `<h2 style="font-family:'Orbitron',sans-serif;font-size:16px;color:#fff;margin:0 0 8px">${q.name||'Quest'}</h2><p style="color:#7a9bbf;font-size:13px;margin:0 0 16px">${q.description||'No description.'}</p><table class="oasis-table"><tbody><tr><td style="color:#7a9bbf;width:120px">Difficulty</td><td>${q.difficulty||'—'}</td></tr><tr><td style="color:#7a9bbf">Reward</td><td>${q.reward||'—'}</td></tr><tr><td style="color:#7a9bbf">Status</td><td>${q.status||'—'}</td></tr><tr><td style="color:#7a9bbf">Location</td><td>${q.location||'—'}</td></tr></tbody></table>`;
|
|
21
|
+
} catch { body.innerHTML = '<div class="oasis-msg-error">Failed to load quest.</div>'; }
|
|
22
|
+
}
|
|
23
|
+
close() { if (!this._overlay) return; const el = this._overlay; this._overlay = null; el.classList.remove('is-open'); el.addEventListener('transitionend', () => el.remove(), { once: true }); if (this._onClose) this._onClose(); }
|
|
24
|
+
destroy() { this.close(); }
|
|
25
|
+
}
|
|
26
|
+
window.OasisViewQuest = OasisViewQuest;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
class OasisViewSeeds {
|
|
2
|
+
constructor({ apiUrl = 'https://api.web4.oasisomniverse.one', onClose = null } = {}) { this._apiUrl = apiUrl; this._onClose = onClose; this._overlay = null; this._injectStyles(); }
|
|
3
|
+
_injectStyles() { if (document.getElementById('oasis-popup-styles')) return; const s = document.createElement('style'); s.id = 'oasis-popup-styles'; s.textContent = `.oasis-popup-overlay{position:fixed;inset:0;z-index:9000;background:rgba(0,0,0,.65);backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .25s}.oasis-popup-overlay.is-open{opacity:1}.oasis-popup-modal{background:#0a1628;border:1px solid rgba(0,200,255,.2);border-radius:16px;box-shadow:0 24px 64px rgba(0,0,0,.6);width:90%;max-width:600px;max-height:90vh;overflow-y:auto;transform:translateY(16px);transition:transform .25s}.oasis-popup-overlay.is-open .oasis-popup-modal{transform:none}.oasis-popup-header{display:flex;align-items:center;justify-content:space-between;padding:20px 24px;border-bottom:1px solid rgba(0,200,255,.1)}.oasis-popup-title{font-family:'Orbitron',sans-serif;font-size:14px;font-weight:700;color:#00c8ff;letter-spacing:.08em}.oasis-popup-close{background:none;border:none;color:#7a9bbf;font-size:22px;cursor:pointer;padding:0;line-height:1}.oasis-popup-close:hover{color:#fff}.oasis-popup-body{padding:24px}.oasis-stat-row{display:flex;gap:12px;margin-bottom:20px}.oasis-stat{flex:1;background:rgba(0,200,100,.05);border:1px solid rgba(0,200,100,.2);border-radius:10px;padding:14px;text-align:center}.oasis-stat-val{font-family:'Orbitron',sans-serif;font-size:20px;font-weight:700;color:#00c864}.oasis-stat-lbl{font-size:10px;color:#7a9bbf;margin-top:4px}.oasis-table{width:100%;border-collapse:collapse;font-size:13px}.oasis-table th{text-align:left;padding:10px 12px;font-size:10px;font-weight:700;letter-spacing:.06em;color:#7a9bbf;text-transform:uppercase;border-bottom:1px solid rgba(0,200,255,.1)}.oasis-table td{padding:10px 12px;color:#fff;border-bottom:1px solid rgba(255,255,255,.05)}.oasis-cs{text-align:center;padding:32px}.oasis-cs p{color:#7a9bbf;font-size:13px}.oasis-msg-error{background:rgba(255,80,80,.12);border:1px solid rgba(255,80,80,.3);color:#ff6b6b;border-radius:8px;padding:10px 14px;font-size:13px}`; document.head.appendChild(s); }
|
|
4
|
+
open() {
|
|
5
|
+
if (this._overlay) return;
|
|
6
|
+
this._overlay = document.createElement('div');
|
|
7
|
+
this._overlay.className = 'oasis-popup-overlay';
|
|
8
|
+
this._overlay.innerHTML = `<div class="oasis-popup-modal"><div class="oasis-popup-header"><span class="oasis-popup-title">My SEEDS</span><button class="oasis-popup-close">×</button></div><div class="oasis-popup-body" id="oasis-vs-body"><div class="oasis-cs"><p>Loading…</p></div></div></div>`;
|
|
9
|
+
this._overlay.querySelector('.oasis-popup-close').addEventListener('click', () => this.close());
|
|
10
|
+
this._overlay.addEventListener('click', e => { if (e.target === this._overlay) this.close(); });
|
|
11
|
+
document.body.appendChild(this._overlay);
|
|
12
|
+
requestAnimationFrame(() => this._overlay.classList.add('is-open'));
|
|
13
|
+
this._load();
|
|
14
|
+
}
|
|
15
|
+
async _load() {
|
|
16
|
+
const body = this._overlay.querySelector('#oasis-vs-body');
|
|
17
|
+
try {
|
|
18
|
+
const r = await fetch(`${this._apiUrl}/api/seeds/account`);
|
|
19
|
+
const d = await r.json();
|
|
20
|
+
const txs = d.transactions || [];
|
|
21
|
+
body.innerHTML = `<div class="oasis-stat-row"><div class="oasis-stat"><div class="oasis-stat-val">${d.balance||'0'}</div><div class="oasis-stat-lbl">Balance</div></div><div class="oasis-stat"><div class="oasis-stat-val">${d.planted||'0'}</div><div class="oasis-stat-lbl">Planted</div></div><div class="oasis-stat"><div class="oasis-stat-val">${d.reputation||'—'}</div><div class="oasis-stat-lbl">Reputation</div></div></div>${txs.length ? `<table class="oasis-table"><thead><tr><th>Date</th><th>Type</th><th>Amount</th></tr></thead><tbody>${txs.map(t=>`<tr><td>${t.date||'—'}</td><td>${t.type||'—'}</td><td style="color:${t.amount>0?'#00c864':'#ff6b6b'}">${t.amount>0?'+':''}${t.amount}</td></tr>`).join('')}</tbody></table>` : '<div class="oasis-cs"><p>No transactions yet.</p></div>'}`;
|
|
22
|
+
} catch { body.innerHTML = '<div class="oasis-msg-error">Failed to load SEEDS data.</div>'; }
|
|
23
|
+
}
|
|
24
|
+
close() { if (!this._overlay) return; const el = this._overlay; this._overlay = null; el.classList.remove('is-open'); el.addEventListener('transitionend', () => el.remove(), { once: true }); if (this._onClose) this._onClose(); }
|
|
25
|
+
destroy() { this.close(); }
|
|
26
|
+
}
|
|
27
|
+
window.OasisViewSeeds = OasisViewSeeds;
|
package/src/wallet.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
class OasisWallet {
|
|
2
|
+
constructor({ apiUrl = 'https://api.web4.oasisomniverse.one', onClose = null } = {}) { this._apiUrl = apiUrl; this._onClose = onClose; this._overlay = null; this._injectStyles(); }
|
|
3
|
+
_injectStyles() { if (document.getElementById('oasis-popup-styles')) return; const s = document.createElement('style'); s.id = 'oasis-popup-styles'; s.textContent = `.oasis-popup-overlay{position:fixed;inset:0;z-index:9000;background:rgba(0,0,0,.65);backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .25s}.oasis-popup-overlay.is-open{opacity:1}.oasis-popup-modal{background:#0a1628;border:1px solid rgba(0,200,255,.2);border-radius:16px;box-shadow:0 24px 64px rgba(0,0,0,.6);width:90%;max-width:560px;max-height:90vh;overflow-y:auto;transform:translateY(16px);transition:transform .25s}.oasis-popup-overlay.is-open .oasis-popup-modal{transform:none}.oasis-popup-header{display:flex;align-items:center;justify-content:space-between;padding:20px 24px;border-bottom:1px solid rgba(0,200,255,.1)}.oasis-popup-title{font-family:'Orbitron',sans-serif;font-size:14px;font-weight:700;color:#00c8ff;letter-spacing:.08em}.oasis-popup-close{background:none;border:none;color:#7a9bbf;font-size:22px;cursor:pointer;padding:0;line-height:1}.oasis-popup-close:hover{color:#fff}.oasis-popup-body{padding:24px}.oasis-wallet-hero{background:linear-gradient(135deg,rgba(0,102,204,.3),rgba(0,200,255,.15));border:1px solid rgba(0,200,255,.3);border-radius:14px;padding:24px;text-align:center;margin-bottom:20px}.oasis-wallet-bal{font-family:'Orbitron',sans-serif;font-size:32px;font-weight:700;color:#00c8ff}.oasis-wallet-lbl{font-size:11px;color:#7a9bbf;margin-top:4px}.oasis-btn-row{display:flex;gap:10px;margin-bottom:20px}.oasis-btn-primary{flex:1;background:linear-gradient(135deg,#0066cc,#00c8ff);color:#fff;border:none;border-radius:8px;padding:11px;font-size:13px;font-weight:600;cursor:pointer}.oasis-btn-secondary{flex:1;background:rgba(0,200,255,.1);border:1px solid rgba(0,200,255,.3);color:#00c8ff;border-radius:8px;padding:11px;font-size:13px;font-weight:600;cursor:pointer}.oasis-table{width:100%;border-collapse:collapse;font-size:13px}.oasis-table th{text-align:left;padding:10px 12px;font-size:10px;font-weight:700;letter-spacing:.06em;color:#7a9bbf;text-transform:uppercase;border-bottom:1px solid rgba(0,200,255,.1)}.oasis-table td{padding:10px 12px;color:#fff;border-bottom:1px solid rgba(255,255,255,.05)}.oasis-cs{text-align:center;padding:20px}.oasis-cs p{color:#7a9bbf;font-size:13px}.oasis-msg-error{background:rgba(255,80,80,.12);border:1px solid rgba(255,80,80,.3);color:#ff6b6b;border-radius:8px;padding:10px 14px;font-size:13px}`; document.head.appendChild(s); }
|
|
4
|
+
open() {
|
|
5
|
+
if (this._overlay) return;
|
|
6
|
+
this._overlay = document.createElement('div');
|
|
7
|
+
this._overlay.className = 'oasis-popup-overlay';
|
|
8
|
+
this._overlay.innerHTML = `<div class="oasis-popup-modal"><div class="oasis-popup-header"><span class="oasis-popup-title">Wallet</span><button class="oasis-popup-close">×</button></div><div class="oasis-popup-body"><div class="oasis-wallet-hero"><div class="oasis-wallet-bal" id="oasis-wal-bal">—</div><div class="oasis-wallet-lbl">OASIS Balance</div></div><div class="oasis-btn-row"><button class="oasis-btn-primary">Send</button><button class="oasis-btn-secondary">Receive</button><button class="oasis-btn-secondary">History</button></div><div id="oasis-wal-tx"><div class="oasis-cs"><p>Loading transactions…</p></div></div></div></div>`;
|
|
9
|
+
this._overlay.querySelector('.oasis-popup-close').addEventListener('click', () => this.close());
|
|
10
|
+
this._overlay.addEventListener('click', e => { if (e.target === this._overlay) this.close(); });
|
|
11
|
+
document.body.appendChild(this._overlay);
|
|
12
|
+
requestAnimationFrame(() => this._overlay.classList.add('is-open'));
|
|
13
|
+
this._load();
|
|
14
|
+
}
|
|
15
|
+
async _load() {
|
|
16
|
+
try {
|
|
17
|
+
const r = await fetch(`${this._apiUrl}/api/wallet`);
|
|
18
|
+
const d = await r.json();
|
|
19
|
+
this._overlay.querySelector('#oasis-wal-bal').textContent = d.balance ?? '0';
|
|
20
|
+
const txs = d.transactions || [];
|
|
21
|
+
const tx = this._overlay.querySelector('#oasis-wal-tx');
|
|
22
|
+
tx.innerHTML = txs.length ? `<table class="oasis-table"><thead><tr><th>Date</th><th>Description</th><th>Amount</th></tr></thead><tbody>${txs.map(t=>`<tr><td>${t.date||'—'}</td><td>${t.desc||'—'}</td><td style="color:${t.amount>0?'#00c864':'#ff6b6b'}">${t.amount>0?'+':''}${t.amount}</td></tr>`).join('')}</tbody></table>` : '<div class="oasis-cs"><p>No transactions yet.</p></div>';
|
|
23
|
+
} catch { this._overlay.querySelector('#oasis-wal-bal').textContent = '0'; this._overlay.querySelector('#oasis-wal-tx').innerHTML = '<div class="oasis-msg-error">Could not load wallet data.</div>'; }
|
|
24
|
+
}
|
|
25
|
+
close() { if (!this._overlay) return; const el = this._overlay; this._overlay = null; el.classList.remove('is-open'); el.addEventListener('transitionend', () => el.remove(), { once: true }); if (this._onClose) this._onClose(); }
|
|
26
|
+
destroy() { this.close(); }
|
|
27
|
+
}
|
|
28
|
+
window.OasisWallet = OasisWallet;
|