@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.
Files changed (72) hide show
  1. package/README.md +91 -0
  2. package/package.json +1 -1
  3. package/src/accept-invite.js +17 -0
  4. package/src/activity-pub.js +17 -0
  5. package/src/add-2d-object-map.js +17 -0
  6. package/src/add-3d-object-map.js +17 -0
  7. package/src/add-quest-to-map.js +17 -0
  8. package/src/compare-provider-speeds.js +17 -0
  9. package/src/contact-popup-nft.js +17 -0
  10. package/src/create-oapp.js +17 -0
  11. package/src/deploy-oapp.js +17 -0
  12. package/src/donate-seeds.js +17 -0
  13. package/src/download-our-world-map.js +17 -0
  14. package/src/download-our-world-oapp.js +17 -0
  15. package/src/edit-oapp.js +17 -0
  16. package/src/eosio.js +17 -0
  17. package/src/ethereum.js +17 -0
  18. package/src/game.js +22 -0
  19. package/src/holochain.js +17 -0
  20. package/src/hyperdrive.js +17 -0
  21. package/src/index.esm.js +143 -15
  22. package/src/index.js +147 -14
  23. package/src/install-oapp.js +17 -0
  24. package/src/ipfs.js +17 -0
  25. package/src/karma-panel.js +28 -0
  26. package/src/launch-oapp.js +28 -0
  27. package/src/manage-auto-fail-over.js +17 -0
  28. package/src/manage-auto-replicaton.js +17 -0
  29. package/src/manage-load-balancing.js +17 -0
  30. package/src/manage-map.js +17 -0
  31. package/src/manage-oapp.js +28 -0
  32. package/src/manage-providers.js +17 -0
  33. package/src/manage-quest.js +28 -0
  34. package/src/manage-seeds.js +26 -0
  35. package/src/map.js +17 -0
  36. package/src/menu-message.js +18 -0
  37. package/src/messaging.js +27 -0
  38. package/src/mission.js +17 -0
  39. package/src/mongo-db.js +17 -0
  40. package/src/neo4j.js +17 -0
  41. package/src/nft.js +17 -0
  42. package/src/oapp.js +17 -0
  43. package/src/onet.js +17 -0
  44. package/src/onode.js +17 -0
  45. package/src/pay-with-seeds.js +17 -0
  46. package/src/plot-route-on-map.js +17 -0
  47. package/src/providers.js +18 -0
  48. package/src/quest.js +17 -0
  49. package/src/reward-seeds.js +17 -0
  50. package/src/search-avatars.js +32 -0
  51. package/src/search-map.js +18 -0
  52. package/src/search-oapp.js +32 -0
  53. package/src/search-providers.js +17 -0
  54. package/src/search-quest.js +28 -0
  55. package/src/search-seeds.js +28 -0
  56. package/src/seeds-provider.js +17 -0
  57. package/src/send-invite.js +17 -0
  58. package/src/settings.js +18 -0
  59. package/src/solana.js +17 -0
  60. package/src/solid.js +17 -0
  61. package/src/sql-lite.js +17 -0
  62. package/src/three-fold.js +17 -0
  63. package/src/view-global-3d-map.js +17 -0
  64. package/src/view-halons-on-map.js +28 -0
  65. package/src/view-oapp-on-map.js +28 -0
  66. package/src/view-organizations.js +27 -0
  67. package/src/view-provider-stats.js +17 -0
  68. package/src/view-providers.js +17 -0
  69. package/src/view-quest-on-map.js +28 -0
  70. package/src/view-quest.js +26 -0
  71. package/src/view-seeds.js +27 -0
  72. package/src/wallet.js +28 -0
@@ -0,0 +1,28 @@
1
+ class OasisManageQuest {
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:640px;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-badge{display:inline-block;padding:3px 8px;border-radius:999px;font-size:10px;font-weight:700}.oasis-badge-blue{background:rgba(0,200,255,.15);color:#00c8ff}.oasis-badge-green{background:rgba(0,200,100,.15);color:#00c864}.oasis-badge-yellow{background:rgba(255,200,0,.15);color:#ffc800}.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">Manage Quests</span><button class="oasis-popup-close">×</button></div><div class="oasis-popup-body" id="oasis-mq-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-mq-body');
17
+ try {
18
+ const r = await fetch(`${this._apiUrl}/api/quests`);
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 created yet.</p></div>'; return; }
22
+ body.innerHTML = `<table class="oasis-table"><thead><tr><th>Quest</th><th>Difficulty</th><th>Status</th></tr></thead><tbody>${quests.map(q=>`<tr><td>${q.name||'—'}</td><td><span class="oasis-badge oasis-badge-blue">${q.difficulty||'Normal'}</span></td><td><span class="oasis-badge ${q.active?'oasis-badge-green':'oasis-badge-yellow'}">${q.active?'Active':'Draft'}</span></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.OasisManageQuest = OasisManageQuest;
@@ -0,0 +1,26 @@
1
+ class OasisManageSeeds {
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:540px;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-btn-row{display:flex;gap:8px}.oasis-btn{flex:1;border:none;border-radius:8px;padding:10px;font-size:12px;font-weight:600;cursor:pointer}.oasis-btn-green{background:linear-gradient(135deg,#00a852,#00c864);color:#fff}.oasis-btn-secondary{background:rgba(0,200,255,.1);border:1px solid rgba(0,200,255,.3);color:#00c8ff}.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">Manage SEEDS</span><button class="oasis-popup-close">×</button></div><div class="oasis-popup-body" id="oasis-ms-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-ms-body');
17
+ try {
18
+ const r = await fetch(`${this._apiUrl}/api/seeds/balance`);
19
+ const d = await r.json();
20
+ 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.harvested||'0'}</div><div class="oasis-stat-lbl">Harvested</div></div></div><div class="oasis-btn-row"><button class="oasis-btn oasis-btn-green">Donate</button><button class="oasis-btn oasis-btn-secondary">Send</button><button class="oasis-btn oasis-btn-secondary">Reward</button></div>`;
21
+ } catch { body.innerHTML = '<div class="oasis-msg-error">Failed to load SEEDS data.</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.OasisManageSeeds = OasisManageSeeds;
package/src/map.js ADDED
@@ -0,0 +1,17 @@
1
+ class OasisMap {
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:640px;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-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:12px}.oasis-card{background:rgba(0,200,255,.05);border:1px solid rgba(0,200,255,.15);border-radius:12px;padding:16px;cursor:pointer;transition:all .2s}.oasis-card:hover{border-color:rgba(0,200,255,.4);background:rgba(0,200,255,.1)}.oasis-card-title{font-family:'Orbitron',sans-serif;font-size:12px;color:#fff;margin-bottom:4px}.oasis-card-sub{font-size:11px;color:#7a9bbf}`; 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">Our World Map</span><button class="oasis-popup-close">×</button></div><div class="oasis-popup-body"><div class="oasis-grid"><div class="oasis-card"><div class="oasis-card-title">🌍 Global 3D Map</div><div class="oasis-card-sub">View the world</div></div><div class="oasis-card"><div class="oasis-card-title">🔍 Search Map</div><div class="oasis-card-sub">Find locations</div></div><div class="oasis-card"><div class="oasis-card-title">📍 Manage Map</div><div class="oasis-card-sub">Edit map data</div></div><div class="oasis-card"><div class="oasis-card-title">🗺️ Plot Route</div><div class="oasis-card-sub">Navigation</div></div><div class="oasis-card"><div class="oasis-card-title">🧩 Add 2D Object</div><div class="oasis-card-sub">Place overlays</div></div><div class="oasis-card"><div class="oasis-card-title">🏗️ Add 3D Object</div><div class="oasis-card-sub">Place 3D assets</div></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
+ }
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.OasisMap = OasisMap;
@@ -0,0 +1,18 @@
1
+ class OasisMenuMessage {
2
+ constructor({ message = '', type = 'info', onClose = null } = {}) { this._message = message; this._type = type; 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-menu-msg{padding:16px;border-radius:10px;font-size:14px;line-height:1.6}.oasis-menu-msg.info{background:rgba(0,200,255,.1);border:1px solid rgba(0,200,255,.3);color:#e0f7ff}.oasis-menu-msg.warn{background:rgba(255,200,0,.1);border:1px solid rgba(255,200,0,.3);color:#fff9e0}.oasis-menu-msg.error{background:rgba(255,80,80,.1);border:1px solid rgba(255,80,80,.3);color:#ffe0e0}.oasis-menu-msg.success{background:rgba(0,200,100,.1);border:1px solid rgba(0,200,100,.3);color:#e0ffe8}`; 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
+ const icons = { info: 'ℹ️', warn: '⚠️', error: '❌', success: '✅' };
9
+ this._overlay.innerHTML = `<div class="oasis-popup-modal"><div class="oasis-popup-header"><span class="oasis-popup-title">Message</span><button class="oasis-popup-close">×</button></div><div class="oasis-popup-body"><div class="oasis-menu-msg ${this._type}">${icons[this._type]||'ℹ️'} ${this._message || 'No message provided.'}</div></div></div>`;
10
+ this._overlay.querySelector('.oasis-popup-close').addEventListener('click', () => this.close());
11
+ this._overlay.addEventListener('click', e => { if (e.target === this._overlay) this.close(); });
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.OasisMenuMessage = OasisMenuMessage;
@@ -0,0 +1,27 @@
1
+ class OasisMessaging {
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-msg-thread{display:flex;flex-direction:column;gap:12px;margin-bottom:16px;max-height:300px;overflow-y:auto}.oasis-msg-bubble{padding:10px 14px;border-radius:12px;font-size:13px;max-width:80%}.oasis-msg-bubble.sent{background:rgba(0,102,204,.3);border:1px solid rgba(0,102,204,.4);color:#e0f0ff;align-self:flex-end}.oasis-msg-bubble.recv{background:rgba(0,200,255,.08);border:1px solid rgba(0,200,255,.2);color:#fff;align-self:flex-start}.oasis-msg-meta{font-size:10px;color:#7a9bbf;margin-bottom:4px}.oasis-send-row{display:flex;gap:8px}.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,#0066cc,#00c8ff);color:#fff;border:none;border-radius:8px;padding:10px 18px;font-size:13px;font-weight:600;cursor:pointer}.oasis-btn-primary:hover{opacity:.85}.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}`; 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">Messaging</span><button class="oasis-popup-close">×</button></div><div class="oasis-popup-body"><div class="oasis-msg-thread" id="oasis-msg-thread"><div class="oasis-cs"><div class="oasis-cs-icon">💬</div><p>No messages yet.</p></div></div><div class="oasis-send-row"><input class="oasis-input" id="oasis-msg-input" placeholder="Type a message…"><button class="oasis-btn-primary" id="oasis-msg-send">Send</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
+ this._overlay.querySelector('#oasis-msg-send').addEventListener('click', () => this._send());
12
+ this._overlay.querySelector('#oasis-msg-input').addEventListener('keydown', e => { if (e.key === 'Enter') this._send(); });
13
+ document.body.appendChild(this._overlay);
14
+ requestAnimationFrame(() => this._overlay.classList.add('is-open'));
15
+ }
16
+ _send() {
17
+ const input = this._overlay.querySelector('#oasis-msg-input');
18
+ const text = input.value.trim(); if (!text) return;
19
+ const thread = this._overlay.querySelector('#oasis-msg-thread');
20
+ if (thread.querySelector('.oasis-cs')) thread.innerHTML = '';
21
+ thread.insertAdjacentHTML('beforeend', `<div class="oasis-msg-bubble sent"><div class="oasis-msg-meta">You · just now</div>${text}</div>`);
22
+ input.value = ''; thread.scrollTop = thread.scrollHeight;
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.OasisMessaging = OasisMessaging;
package/src/mission.js ADDED
@@ -0,0 +1,17 @@
1
+ class OasisMission {
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:640px;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-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:12px}.oasis-card{background:rgba(0,200,255,.05);border:1px solid rgba(0,200,255,.15);border-radius:12px;padding:16px;cursor:pointer;transition:all .2s}.oasis-card:hover{border-color:rgba(0,200,255,.4);background:rgba(0,200,255,.1)}.oasis-card-title{font-family:'Orbitron',sans-serif;font-size:12px;color:#fff;margin-bottom:4px}.oasis-card-sub{font-size:11px;color:#7a9bbf}`; 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">Missions</span><button class="oasis-popup-close">×</button></div><div class="oasis-popup-body"><div class="oasis-grid"><div class="oasis-card"><div class="oasis-card-title">📋 Manage</div><div class="oasis-card-sub">Edit missions</div></div><div class="oasis-card"><div class="oasis-card-title">🔍 Search</div><div class="oasis-card-sub">Find missions</div></div><div class="oasis-card"><div class="oasis-card-title">👁️ View</div><div class="oasis-card-sub">Mission details</div></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
+ }
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.OasisMission = OasisMission;
@@ -0,0 +1,17 @@
1
+ class OasisMongoDb {
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">MongoDB 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>MongoDB Provider</h3><p>MongoDB NoSQL database integration for flexible document storage within the OASIS data layer.</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.OasisMongoDb = OasisMongoDb;
package/src/neo4j.js ADDED
@@ -0,0 +1,17 @@
1
+ class OasisNeo4j {
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">Neo4j 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>Neo4j Provider</h3><p>Graph database integration via Neo4j — ideal for social graphs, quest dependencies, and relationship data.</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.OasisNeo4j = OasisNeo4j;
package/src/nft.js ADDED
@@ -0,0 +1,17 @@
1
+ class OasisNFT {
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:640px;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-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:12px}.oasis-card{background:rgba(0,200,255,.05);border:1px solid rgba(0,200,255,.15);border-radius:12px;padding:16px;cursor:pointer;transition:all .2s}.oasis-card:hover{border-color:rgba(0,200,255,.4);background:rgba(0,200,255,.1)}.oasis-card-title{font-family:'Orbitron',sans-serif;font-size:12px;color:#fff;margin-bottom:4px}.oasis-card-sub{font-size:11px;color:#7a9bbf}`; 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">OASIS NFTs</span><button class="oasis-popup-close">×</button></div><div class="oasis-popup-body"><div class="oasis-grid"><div class="oasis-card"><div class="oasis-card-title">🖼️ View NFTs</div><div class="oasis-card-sub">Browse collection</div></div><div class="oasis-card"><div class="oasis-card-title">🛒 Purchase</div><div class="oasis-card-sub">Buy NFTs</div></div><div class="oasis-card"><div class="oasis-card-title">🌍 Virtual Land</div><div class="oasis-card-sub">Land NFTs</div></div><div class="oasis-card"><div class="oasis-card-title">📋 Manage</div><div class="oasis-card-sub">Your NFTs</div></div><div class="oasis-card"><div class="oasis-card-title">🔍 Search</div><div class="oasis-card-sub">Find NFTs</div></div><div class="oasis-card"><div class="oasis-card-title">⚡ Solana</div><div class="oasis-card-sub">Solana NFTs</div></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
+ }
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.OasisNFT = OasisNFT;
package/src/oapp.js ADDED
@@ -0,0 +1,17 @@
1
+ class OasisOApp {
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:640px;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-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:12px}.oasis-card{background:rgba(0,200,255,.05);border:1px solid rgba(0,200,255,.15);border-radius:12px;padding:16px;cursor:pointer;transition:all .2s}.oasis-card:hover{border-color:rgba(0,200,255,.4);background:rgba(0,200,255,.1)}.oasis-card-title{font-family:'Orbitron',sans-serif;font-size:12px;color:#fff;margin-bottom:4px}.oasis-card-sub{font-size:11px;color:#7a9bbf}`; 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">OAPP Manager</span><button class="oasis-popup-close">×</button></div><div class="oasis-popup-body"><div class="oasis-grid"><div class="oasis-card"><div class="oasis-card-title">➕ Create</div><div class="oasis-card-sub">New OAPP</div></div><div class="oasis-card"><div class="oasis-card-title">✏️ Edit</div><div class="oasis-card-sub">Modify OAPP</div></div><div class="oasis-card"><div class="oasis-card-title">🚀 Deploy</div><div class="oasis-card-sub">Go live</div></div><div class="oasis-card"><div class="oasis-card-title">⬇️ Install</div><div class="oasis-card-sub">Add OAPP</div></div><div class="oasis-card"><div class="oasis-card-title">▶️ Launch</div><div class="oasis-card-sub">Run OAPP</div></div><div class="oasis-card"><div class="oasis-card-title">📋 Manage</div><div class="oasis-card-sub">All OAPPs</div></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
+ }
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.OasisOApp = OasisOApp;
package/src/onet.js ADDED
@@ -0,0 +1,17 @@
1
+ class OasisONET {
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:500px;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}`; 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">ONET</span><button class="oasis-popup-close">×</button></div><div class="oasis-popup-body"><div class="oasis-cs"><div class="oasis-cs-icon">🌐</div><h3>OASIS Network (ONET)</h3><p>The decentralised network layer powering the OASIS. Connect, route, and communicate across all nodes in the Omniverse.</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
+ }
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.OasisONET = OasisONET;
package/src/onode.js ADDED
@@ -0,0 +1,17 @@
1
+ class OasisONODE {
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:500px;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}`; 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">ONODE</span><button class="oasis-popup-close">×</button></div><div class="oasis-popup-body"><div class="oasis-cs"><div class="oasis-cs-icon">🔵</div><h3>OASIS Node (ONODE)</h3><p>A distributed node in the OASIS network. Each ONODE contributes storage, compute, and bandwidth to the decentralised Omniverse infrastructure.</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
+ }
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.OasisONODE = OasisONODE;
@@ -0,0 +1,17 @@
1
+ class OasisPayWithSeeds {
2
+ constructor({ amount = '', recipient = '', onClose = null } = {}) { this._amount = amount; this._recipient = recipient; 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">Pay with SEEDS</span><button class="oasis-popup-close">×</button></div><div class="oasis-popup-body"><div class="oasis-form-group"><label class="oasis-label">Pay To</label><input class="oasis-input" value="${this._recipient}" placeholder="SEEDS account name…"></div><div class="oasis-form-group"><label class="oasis-label">Amount (SEEDS)</label><input class="oasis-input" type="number" value="${this._amount}" placeholder="0.00"></div><div class="oasis-form-group"><label class="oasis-label">Memo</label><input class="oasis-input" placeholder="Payment description…"></div><button class="oasis-btn-primary">🌱 Pay Now</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.OasisPayWithSeeds = OasisPayWithSeeds;
@@ -0,0 +1,17 @@
1
+ class OasisPlotRouteOnMap {
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,#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">Plot Route on Map</span><button class="oasis-popup-close">×</button></div><div class="oasis-popup-body"><div class="oasis-form-group"><label class="oasis-label">Route Name</label><input class="oasis-input" placeholder="e.g. City Tour, Quest Path…"></div><div class="oasis-form-group"><label class="oasis-label">Start Location</label><input class="oasis-input" placeholder="Lat, Lng or place name…"></div><div class="oasis-form-group"><label class="oasis-label">End Location</label><input class="oasis-input" placeholder="Lat, Lng or place name…"></div><div class="oasis-form-group"><label class="oasis-label">Waypoints (optional)</label><input class="oasis-input" placeholder="Comma-separated lat,lng pairs…"></div><button class="oasis-btn-primary">Plot Route</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.OasisPlotRouteOnMap = OasisPlotRouteOnMap;
@@ -0,0 +1,18 @@
1
+ class OasisProviders {
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:640px;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-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(130px,1fr));gap:10px}.oasis-card{background:rgba(0,200,255,.05);border:1px solid rgba(0,200,255,.15);border-radius:12px;padding:14px;cursor:pointer;transition:all .2s;text-align:center}.oasis-card:hover{border-color:rgba(0,200,255,.4);background:rgba(0,200,255,.1)}.oasis-card-title{font-family:'Orbitron',sans-serif;font-size:11px;color:#fff;margin-bottom:4px}.oasis-card-sub{font-size:10px;color:#7a9bbf}`; 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
+ const providers = [['🗄️','MongoDB','NoSQL'],['🔺','Neo4j','Graph DB'],['☁️','IPFS','Decentralised'],['🌱','Holochain','P2P'],['🔷','Ethereum','Blockchain'],['🟣','Solana','Fast chain'],['🟢','EOSIO','DPOS'],['💧','Solid','Linked Data'],['🌿','Seeds','SEEDS economy'],['📡','ActivityPub','Federation'],['🔒','ThreeFold','Web4 grid'],['💾','SQLite','Local DB']];
9
+ this._overlay.innerHTML = `<div class="oasis-popup-modal"><div class="oasis-popup-header"><span class="oasis-popup-title">Providers</span><button class="oasis-popup-close">×</button></div><div class="oasis-popup-body"><div class="oasis-grid">${providers.map(([i,n,s])=>`<div class="oasis-card"><div style="font-size:24px;margin-bottom:6px">${i}</div><div class="oasis-card-title">${n}</div><div class="oasis-card-sub">${s}</div></div>`).join('')}</div></div></div>`;
10
+ this._overlay.querySelector('.oasis-popup-close').addEventListener('click', () => this.close());
11
+ this._overlay.addEventListener('click', e => { if (e.target === this._overlay) this.close(); });
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.OasisProviders = OasisProviders;
package/src/quest.js ADDED
@@ -0,0 +1,17 @@
1
+ class OasisQuest {
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:640px;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-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:12px}.oasis-card{background:rgba(0,200,255,.05);border:1px solid rgba(0,200,255,.15);border-radius:12px;padding:16px;cursor:pointer;transition:all .2s}.oasis-card:hover{border-color:rgba(0,200,255,.4);background:rgba(0,200,255,.1)}.oasis-card-title{font-family:'Orbitron',sans-serif;font-size:12px;color:#fff;margin-bottom:4px}.oasis-card-sub{font-size:11px;color:#7a9bbf}`; 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</span><button class="oasis-popup-close">×</button></div><div class="oasis-popup-body"><div class="oasis-grid"><div class="oasis-card"><div class="oasis-card-title">📋 Manage</div><div class="oasis-card-sub">Edit quests</div></div><div class="oasis-card"><div class="oasis-card-title">🔍 Search</div><div class="oasis-card-sub">Find quests</div></div><div class="oasis-card"><div class="oasis-card-title">👁️ View</div><div class="oasis-card-sub">Quest details</div></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
+ }
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.OasisQuest = OasisQuest;
@@ -0,0 +1,17 @@
1
+ class OasisRewardSeeds {
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}textarea.oasis-input{min-height:70px;resize:vertical}.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">Reward SEEDS</span><button class="oasis-popup-close">×</button></div><div class="oasis-popup-body"><div class="oasis-form-group"><label class="oasis-label">Reward Recipient</label><input class="oasis-input" placeholder="Avatar username or SEEDS account…"></div><div class="oasis-form-group"><label class="oasis-label">SEEDS Amount</label><input class="oasis-input" type="number" min="0" placeholder="0.00"></div><div class="oasis-form-group"><label class="oasis-label">Reason</label><textarea class="oasis-input" placeholder="What are you rewarding them for?"></textarea></div><button class="oasis-btn-primary">🌱 Send Reward</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.OasisRewardSeeds = OasisRewardSeeds;
@@ -0,0 +1,32 @@
1
+ class OasisSearchAvatars {
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-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,#0066cc,#00c8ff);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-table tr:hover td{background:rgba(0,200,255,.04)}.oasis-cs{text-align:center;padding:32px 16px}.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">Search Avatars</span><button class="oasis-popup-close">×</button></div><div class="oasis-popup-body"><div class="oasis-search-row"><input class="oasis-input" id="oasis-sa-q" placeholder="Search by username or ID…"><button class="oasis-btn-primary" id="oasis-sa-btn">Search</button></div><div id="oasis-sa-results"><div class="oasis-cs"><p>Enter a search term to find avatars.</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-sa-btn').addEventListener('click', () => this._search());
12
+ this._overlay.querySelector('#oasis-sa-q').addEventListener('keydown', e => { if (e.key === 'Enter') this._search(); });
13
+ document.body.appendChild(this._overlay);
14
+ requestAnimationFrame(() => this._overlay.classList.add('is-open'));
15
+ }
16
+ async _search() {
17
+ const q = this._overlay.querySelector('#oasis-sa-q').value.trim();
18
+ const results = this._overlay.querySelector('#oasis-sa-results');
19
+ if (!q) return;
20
+ results.innerHTML = '<div class="oasis-cs"><p>Searching…</p></div>';
21
+ try {
22
+ const r = await fetch(`${this._apiUrl}/api/avatars/search?q=${encodeURIComponent(q)}`);
23
+ const data = await r.json();
24
+ const items = Array.isArray(data) ? data : (data.result || []);
25
+ if (!items.length) { results.innerHTML = '<div class="oasis-cs"><p>No avatars found.</p></div>'; return; }
26
+ results.innerHTML = `<table class="oasis-table"><thead><tr><th>Username</th><th>Email</th><th>Karma</th></tr></thead><tbody>${items.map(a=>`<tr><td>${a.username||a.name||'—'}</td><td>${a.email||'—'}</td><td>${a.karma||0}</td></tr>`).join('')}</tbody></table>`;
27
+ } catch { results.innerHTML = '<div class="oasis-msg-error">Search failed.</div>'; }
28
+ }
29
+ 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(); }
30
+ destroy() { this.close(); }
31
+ }
32
+ window.OasisSearchAvatars = OasisSearchAvatars;
@@ -0,0 +1,18 @@
1
+ class OasisSearchMap {
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,#0066cc,#00c8ff);color:#fff;border:none;border-radius:8px;padding:10px 18px;font-size:13px;font-weight:600;cursor:pointer}.oasis-cs{text-align:center;padding:24px}.oasis-cs p{color:#7a9bbf;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 Map</span><button class="oasis-popup-close">×</button></div><div class="oasis-popup-body"><div class="oasis-search-row"><input class="oasis-input" id="oasis-sm-q" placeholder="Search locations, quests, objects…"><button class="oasis-btn-primary" id="oasis-sm-btn">Search</button></div><div id="oasis-sm-results"><div class="oasis-cs"><p>Enter a search term to find map objects.</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-sm-btn').addEventListener('click', () => { this._overlay.querySelector('#oasis-sm-results').innerHTML = '<div class="oasis-cs"><p>No results found for that location.</p></div>'; });
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.OasisSearchMap = OasisSearchMap;
@@ -0,0 +1,32 @@
1
+ class OasisSearchOAPP {
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-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,#0066cc,#00c8ff);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 OAPPs</span><button class="oasis-popup-close">×</button></div><div class="oasis-popup-body"><div class="oasis-search-row"><input class="oasis-input" id="oasis-soapp-q" placeholder="Search by name or category…"><button class="oasis-btn-primary" id="oasis-soapp-btn">Search</button></div><div id="oasis-soapp-results"><div class="oasis-cs"><p>Enter a search term to find OAPPs.</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-soapp-btn').addEventListener('click', () => this._search());
12
+ this._overlay.querySelector('#oasis-soapp-q').addEventListener('keydown', e => { if (e.key === 'Enter') this._search(); });
13
+ document.body.appendChild(this._overlay);
14
+ requestAnimationFrame(() => this._overlay.classList.add('is-open'));
15
+ }
16
+ async _search() {
17
+ const q = this._overlay.querySelector('#oasis-soapp-q').value.trim();
18
+ const results = this._overlay.querySelector('#oasis-soapp-results');
19
+ if (!q) return;
20
+ results.innerHTML = '<div class="oasis-cs"><p>Searching…</p></div>';
21
+ try {
22
+ const r = await fetch(`${this._apiUrl}/api/oapp/search?q=${encodeURIComponent(q)}`);
23
+ const data = await r.json();
24
+ const items = Array.isArray(data) ? data : (data.result || []);
25
+ if (!items.length) { results.innerHTML = '<div class="oasis-cs"><p>No OAPPs found.</p></div>'; return; }
26
+ results.innerHTML = `<table class="oasis-table"><thead><tr><th>Name</th><th>Category</th><th>Version</th></tr></thead><tbody>${items.map(o=>`<tr><td>${o.name||'—'}</td><td>${o.category||'—'}</td><td>${o.version||'—'}</td></tr>`).join('')}</tbody></table>`;
27
+ } catch { results.innerHTML = '<div class="oasis-msg-error">Search failed.</div>'; }
28
+ }
29
+ 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(); }
30
+ destroy() { this.close(); }
31
+ }
32
+ window.OasisSearchOAPP = OasisSearchOAPP;
@@ -0,0 +1,17 @@
1
+ class OasisSearchProviders {
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">Search 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>Search Providers</h3><p>Search the OASIS provider registry to discover and connect to new storage and compute nodes.</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.OasisSearchProviders = OasisSearchProviders;