@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
package/README.md ADDED
@@ -0,0 +1,91 @@
1
+ # @oasisomniverse/js — OASIS JavaScript UI Component Library
2
+
3
+ The vanilla JavaScript UI component library for the [OASIS Platform](https://oasisomniverse.one). Drop 126 pre-built components into any website or web app to integrate avatar SSO, karma, NFTs, quests, map, seeds, messaging, OApps, providers and more — no framework required.
4
+
5
+ [![npm](https://img.shields.io/npm/v/@oasisomniverse/js)](https://www.npmjs.com/package/@oasisomniverse/js)
6
+ [![Live Demo](https://img.shields.io/badge/demo-live-brightgreen)](https://oportal.oasisomniverse.one)
7
+
8
+ ## Install
9
+
10
+ ```bash
11
+ npm install @oasisomniverse/js
12
+ ```
13
+
14
+ Or via CDN:
15
+
16
+ ```html
17
+ <script src="https://cdn.jsdelivr.net/npm/@oasisomniverse/js/dist/oasis.min.js"></script>
18
+ ```
19
+
20
+ ## Basic Usage
21
+
22
+ ```js
23
+ import { Login, AvatarConnect, KarmaToast } from '@oasisomniverse/js';
24
+
25
+ // Initialise the OASIS API endpoint
26
+ const config = { apiUrl: 'https://api.web4.oasisomniverse.one' };
27
+
28
+ // Mount a login widget into a container element
29
+ const login = new Login('#login-container', config);
30
+ login.mount();
31
+
32
+ // Show a karma toast notification
33
+ const toast = new KarmaToast({ message: '+10 karma earned', value: 10 });
34
+ toast.show();
35
+ ```
36
+
37
+ ## Component List
38
+
39
+ All 126 components are grouped below. Every component is also available in React, Angular, Vue, Svelte and Next.js at full parity — see the [OASIS Web Component Library](https://oportal.oasisomniverse.one) for the full matrix.
40
+
41
+ | Group | Components |
42
+ |---|---|
43
+ | **Auth & Identity** | AcceptInvite, AvatarConnect, ForgotPassword, Login, ResetPassword, SearchAvatar, SearchAvatars, SendInvite, Signup, VerifyEmail |
44
+ | **Avatar** | AvatarProfile, AvatarWallet, EditAvatar, SearchProfiles, ViewAchievements, ViewAvatar, ViewAvatarKarma, ViewLeagues, ViewOrganizations, ViewTournaments |
45
+ | **Data Screen** | ActivityPub, AddData, EOSIO, Ethereum, Holochain, IPFS, LoadData, ManageData, MongoDB, Neo4j, OffChainManagement, SearchData, Solana, Solid, SQLite, ThreeFold |
46
+ | **Eggs** | Eggs, ManageEggs, SearchEggs, ViewEggs |
47
+ | **Game** | Game |
48
+ | **Karma** | KarmaPanel, KarmaToast, SearchKarma, ViewKarma, VoteKarma |
49
+ | **Map** | Add2DObjectToMap, Add3DObjectToMap, AddQuestToMap, DownloadMap, ManageMap, Map, PlotRouteOnMap, SearchMap, ViewGlobal3DMap, ViewHalonsOnMap, ViewOAppOnMap, ViewQuestOnMap |
50
+ | **Messages** | MenuMessage, Message, MessageContacts, Messaging |
51
+ | **Mission** | ManageMission, Mission, SearchMission, ViewMission |
52
+ | **NFT** | ContactPopupNFT, ManageNFT, NFT, PurchaseNFT, PurchaseVirtualLandNFT, SearchNFT, ViewNFT |
53
+ | **OApp** | CreateOApp, DeployOApp, DownloadOApp, EditOApp, InstallOApp, LaunchOApp, ManageOApp, OApp, SearchOApp |
54
+ | **Providers** | CompareProviderSpeeds, CrossChainManagement, ManageAutoFailover, ManageAutoReplication, ManageLoadBalancing, ManageProviders, ProviderDropdown, Providers, SearchProviders, SeedsProvider, ViewProviderStats, ViewProviders |
55
+ | **Quest** | ManageQuest, Quest, SearchQuest, ViewQuest |
56
+ | **Seeds** | DonateSeeds, ManageSeeds, PayWithSeeds, RewardSeeds, SearchSeeds, Seeds, ViewSeeds |
57
+ | **Common UI** | ComingSoon, Confirmation, Contact, HyperDrive, NavBar, ONET, ONODE, OasisModal, Settings, SideNav, StarField, Wallet |
58
+
59
+ ## Dark Space Design System
60
+
61
+ The OASIS component library ships with the **Dark Space** design system — a deep-space aesthetic built for the OASIS Omniverse:
62
+
63
+ - **Background**: near-black (#0a0d14) with subtle nebula gradients
64
+ - **Primary accent**: electric cyan (#00c8ff)
65
+ - **Typography**: [Orbitron](https://fonts.google.com/specimen/Orbitron) for headings, [Rajdhani](https://fonts.google.com/specimen/Rajdhani) for body text
66
+ - **Text**: always bright (#e0f0ff / #fff) — never dim or faded
67
+ - **Borders**: translucent cyan (`rgba(0,200,255,0.2)`)
68
+ - **Cards**: glassy dark panels with backdrop-filter blur
69
+
70
+ All CSS custom properties are exposed on `:root` so you can theme components for your own OAPP.
71
+
72
+ ```css
73
+ :root {
74
+ --oasis-bg: #0a0d14;
75
+ --oasis-accent: #00c8ff;
76
+ --oasis-text: #e0f0ff;
77
+ --oasis-border: rgba(0, 200, 255, 0.2);
78
+ }
79
+ ```
80
+
81
+ ## Live Demo
82
+
83
+ **[oportal.oasisomniverse.one](https://oportal.oasisomniverse.one)** — the JS OPORTAL running all 126 components live.
84
+
85
+ ## Links
86
+
87
+ - [GitHub](https://github.com/NextGenSoftwareUK/OASIS-JS-UI-Component-Library)
88
+ - [npm](https://www.npmjs.com/package/@oasisomniverse/js)
89
+ - [OASIS API Docs](https://oasis-web4.gitbook.io/oasis-web4-docs/)
90
+ - [Developer Portal](https://oportal.oasisomniverse.one)
91
+ - [OASIS Platform](https://oasisomniverse.one)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oasisomniverse/js",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "description": "OASIS Omniverse vanilla JS web component widgets",
5
5
  "keywords": [
6
6
  "oasis",
@@ -0,0 +1,17 @@
1
+ class OasisAcceptInvite {
2
+ constructor({ inviteCode = '', onClose = null } = {}) { this._inviteCode = inviteCode; 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-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">Accept 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">Enter your invite code to join the SEEDS regenerative economy and start earning karma.</p><div class="oasis-form-group"><label class="oasis-label">Invite Code</label><input class="oasis-input" value="${this._inviteCode}" placeholder="SEEDS invite code…"></div><div class="oasis-form-group"><label class="oasis-label">Your Name</label><input class="oasis-input" placeholder="Display name…"></div><button class="oasis-btn-primary">🌱 Accept 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.OasisAcceptInvite = OasisAcceptInvite;
@@ -0,0 +1,17 @@
1
+ class OasisActivityPub {
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">ActivityPub</span><button class="oasis-popup-close">×</button></div><div class="oasis-popup-body"><div class="oasis-cs"><div class="oasis-cs-icon">📡</div><h3>ActivityPub</h3><p>Federated social networking via the ActivityPub protocol. Connect with Mastodon, Pleroma, and other Fediverse platforms.</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.OasisActivityPub = OasisActivityPub;
@@ -0,0 +1,17 @@
1
+ class OasisAdd2dObjectMap {
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%}.oasis-btn-primary:hover{opacity:.85}`; 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">Add 2D Object to Map</span><button class="oasis-popup-close">×</button></div><div class="oasis-popup-body"><div class="oasis-form-group"><label class="oasis-label">Object Name</label><input class="oasis-input" placeholder="e.g. Banner, Marker, Overlay…"></div><div class="oasis-form-group"><label class="oasis-label">Image URL</label><input class="oasis-input" placeholder="https://…"></div><div class="oasis-form-group"><label class="oasis-label">Latitude</label><input class="oasis-input" type="number" placeholder="51.5074"></div><div class="oasis-form-group"><label class="oasis-label">Longitude</label><input class="oasis-input" type="number" placeholder="-0.1278"></div><button class="oasis-btn-primary">Add to Map</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.OasisAdd2dObjectMap = OasisAdd2dObjectMap;
@@ -0,0 +1,17 @@
1
+ class OasisAdd3dObjectMap {
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">Add 3D Object to Map</span><button class="oasis-popup-close">×</button></div><div class="oasis-popup-body"><div class="oasis-form-group"><label class="oasis-label">Object Name</label><input class="oasis-input" placeholder="e.g. Building, Tree, Vehicle…"></div><div class="oasis-form-group"><label class="oasis-label">Model URL (.glb / .gltf)</label><input class="oasis-input" placeholder="https://…"></div><div class="oasis-form-group"><label class="oasis-label">Latitude</label><input class="oasis-input" type="number" placeholder="51.5074"></div><div class="oasis-form-group"><label class="oasis-label">Longitude</label><input class="oasis-input" type="number" placeholder="-0.1278"></div><div class="oasis-form-group"><label class="oasis-label">Altitude (m)</label><input class="oasis-input" type="number" placeholder="0"></div><button class="oasis-btn-primary">Add 3D Object</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.OasisAdd3dObjectMap = OasisAdd3dObjectMap;
@@ -0,0 +1,17 @@
1
+ class OasisAddQuestToMap {
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">Add Quest to Map</span><button class="oasis-popup-close">×</button></div><div class="oasis-popup-body"><div class="oasis-form-group"><label class="oasis-label">Quest ID</label><input class="oasis-input" placeholder="Enter quest ID…"></div><div class="oasis-form-group"><label class="oasis-label">Map Pin Title</label><input class="oasis-input" placeholder="e.g. Lost Artefact Quest…"></div><div class="oasis-form-group"><label class="oasis-label">Latitude</label><input class="oasis-input" type="number" placeholder="51.5074"></div><div class="oasis-form-group"><label class="oasis-label">Longitude</label><input class="oasis-input" type="number" placeholder="-0.1278"></div><button class="oasis-btn-primary">Pin Quest to Map</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.OasisAddQuestToMap = OasisAddQuestToMap;
@@ -0,0 +1,17 @@
1
+ class OasisCompareProviderSpeeds {
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">Compare Provider Speeds</span><button class="oasis-popup-close">×</button></div><div class="oasis-popup-body"><div class="oasis-cs"><div class="oasis-cs-icon">⚡</div><h3>Compare Provider Speeds</h3><p>Benchmark and compare read/write speeds across all connected OASIS providers in real time.</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.OasisCompareProviderSpeeds = OasisCompareProviderSpeeds;
@@ -0,0 +1,17 @@
1
+ class OasisNftContactPopup {
2
+ constructor({ nftName = '', onClose = null } = {}) { this._nftName = nftName; 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-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:100px;resize:vertical}.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">Contact NFT Owner</span><button class="oasis-popup-close">×</button></div><div class="oasis-popup-body">${this._nftName ? `<p style="color:#7a9bbf;font-size:13px;margin:0 0 20px">Enquiring about: <strong style="color:#fff">${this._nftName}</strong></p>` : ''}<div class="oasis-form-group"><label class="oasis-label">Your Name</label><input class="oasis-input" placeholder="Avatar username…"></div><div class="oasis-form-group"><label class="oasis-label">Message</label><textarea class="oasis-input" placeholder="I'm interested in this NFT…"></textarea></div><button class="oasis-btn-primary">Send Message</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.OasisNftContactPopup = OasisNftContactPopup;
@@ -0,0 +1,17 @@
1
+ class OasisCreateOAPP {
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}textarea.oasis-input{min-height:80px;resize:vertical}.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">Create OAPP</span><button class="oasis-popup-close">×</button></div><div class="oasis-popup-body"><div class="oasis-form-group"><label class="oasis-label">OAPP Name</label><input class="oasis-input" placeholder="My Awesome OAPP…"></div><div class="oasis-form-group"><label class="oasis-label">Description</label><textarea class="oasis-input" placeholder="What does your OAPP do?"></textarea></div><div class="oasis-form-group"><label class="oasis-label">Category</label><input class="oasis-input" placeholder="e.g. Game, Social, Finance…"></div><div class="oasis-form-group"><label class="oasis-label">Version</label><input class="oasis-input" placeholder="1.0.0"></div><button class="oasis-btn-primary">Create OAPP</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.OasisCreateOAPP = OasisCreateOAPP;
@@ -0,0 +1,17 @@
1
+ class OasisDeployOAPP {
2
+ constructor({ oappName = '', onClose = null } = {}) { this._oappName = oappName; 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-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-deploy-checklist{list-style:none;padding:0;margin:0 0 20px}.oasis-deploy-checklist li{display:flex;align-items:center;gap:10px;padding:8px 0;border-bottom:1px solid rgba(255,255,255,.05);color:#fff;font-size:13px}.oasis-deploy-checklist li::before{content:'✅';font-size:14px}`; 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">Deploy OAPP</span><button class="oasis-popup-close">×</button></div><div class="oasis-popup-body">${this._oappName?`<p style="color:#7a9bbf;font-size:13px;margin:0 0 16px">Deploying: <strong style="color:#fff">${this._oappName}</strong></p>`:''}<ul class="oasis-deploy-checklist"><li>Build validated</li><li>Dependencies resolved</li><li>OASIS API key set</li></ul><div class="oasis-form-group"><label class="oasis-label">Target Environment</label><input class="oasis-input" placeholder="production / staging…"></div><button class="oasis-btn-primary">🚀 Deploy 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.OasisDeployOAPP = OasisDeployOAPP;
@@ -0,0 +1,17 @@
1
+ class OasisDonateSeeds {
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-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">Donate SEEDS</span><button class="oasis-popup-close">×</button></div><div class="oasis-popup-body"><div class="oasis-form-group"><label class="oasis-label">Recipient</label><input class="oasis-input" placeholder="SEEDS account name…"></div><div class="oasis-form-group"><label class="oasis-label">Amount (SEEDS)</label><input class="oasis-input" type="number" min="0" placeholder="0.00"></div><div class="oasis-form-group"><label class="oasis-label">Note (optional)</label><textarea class="oasis-input" placeholder="What is this donation for?"></textarea></div><button class="oasis-btn-primary">🌱 Donate Seeds</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.OasisDonateSeeds = OasisDonateSeeds;
@@ -0,0 +1,17 @@
1
+ class OasisDownloadOurWorldMap {
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: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:12px 28px;font-size:14px;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">Download Our World</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 — Free to Play</h3><p>Download the Our World augmented reality game and explore the OASIS Omniverse in the real world.</p><button class="oasis-btn-primary" onclick="window.open('https://www.ourworldthegame.com','_blank')">Download Our World</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.OasisDownloadOurWorldMap = OasisDownloadOurWorldMap;
@@ -0,0 +1,17 @@
1
+ class OasisDownloadOurWorldOApp {
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:16px}.oasis-cs-icon{font-size:56px;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:14px;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">Download Our World</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 OAPP</h3><p>Download the Our World OAPP to explore, build, and play in the OASIS Omniverse augmented reality experience.</p><button class="oasis-btn-primary" onclick="window.open('https://www.ourworldthegame.com','_blank')">Download Free</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.OasisDownloadOurWorldOApp = OasisDownloadOurWorldOApp;
@@ -0,0 +1,17 @@
1
+ class OasisEditOAPP {
2
+ constructor({ oappId = '', onClose = null } = {}) { this._oappId = oappId; 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}textarea.oasis-input{min-height:80px;resize:vertical}.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">Edit OAPP</span><button class="oasis-popup-close">×</button></div><div class="oasis-popup-body"><div class="oasis-form-group"><label class="oasis-label">OAPP Name</label><input class="oasis-input" placeholder="OAPP Name…" value="${this._oappId}"></div><div class="oasis-form-group"><label class="oasis-label">Description</label><textarea class="oasis-input" placeholder="Updated description…"></textarea></div><div class="oasis-form-group"><label class="oasis-label">Version</label><input class="oasis-input" placeholder="1.0.1"></div><button class="oasis-btn-primary">Save Changes</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.OasisEditOAPP = OasisEditOAPP;
package/src/eosio.js ADDED
@@ -0,0 +1,17 @@
1
+ class OasisEosio {
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">EOSIO 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>EOSIO Provider</h3><p>EOSIO Delegated Proof of Stake blockchain integration. High throughput, zero transaction fees for OASIS operations.</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.OasisEosio = OasisEosio;
@@ -0,0 +1,17 @@
1
+ class OasisEthereum {
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">Ethereum 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>Ethereum Provider</h3><p>Ethereum blockchain integration for smart contracts, NFTs, and decentralised finance within 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.OasisEthereum = OasisEthereum;
package/src/game.js ADDED
@@ -0,0 +1,22 @@
1
+ class OasisGame {
2
+ constructor({ onClose = null } = {}) { this._onClose = onClose; this._overlay = null; this._injectStyles(); }
3
+ _injectStyles() {
4
+ if (document.getElementById('oasis-popup-styles')) return;
5
+ const s = document.createElement('style'); s.id = 'oasis-popup-styles';
6
+ 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-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-badge-red{background:rgba(255,80,80,.15);color:#ff6b6b}.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-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-btn{display:inline-flex;align-items:center;gap:8px;padding:10px 20px;border-radius:8px;font-size:13px;font-weight:600;cursor:pointer;border:none;transition:all .2s}.oasis-btn-primary{background:linear-gradient(135deg,#0066cc,#00c8ff);color:#fff}.oasis-btn-primary:hover{opacity:.85}.oasis-btn-secondary{background:rgba(0,200,255,.1);border:1px solid rgba(0,200,255,.3);color:#00c8ff}.oasis-btn-secondary:hover{background:rgba(0,200,255,.2)}.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}.oasis-stat-row{display:flex;gap:12px;margin-bottom:20px}.oasis-stat{flex:1;background:rgba(0,200,255,.05);border:1px solid rgba(0,200,255,.1);border-radius:10px;padding:14px;text-align:center}.oasis-stat-val{font-family:'Orbitron',sans-serif;font-size:20px;font-weight:700;color:#00c8ff}.oasis-stat-lbl{font-size:10px;color:#7a9bbf;margin-top:4px}.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-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}`;
7
+ document.head.appendChild(s);
8
+ }
9
+ open() {
10
+ if (this._overlay) return;
11
+ this._overlay = document.createElement('div');
12
+ this._overlay.className = 'oasis-popup-overlay';
13
+ this._overlay.innerHTML = `<div class="oasis-popup-modal"><div class="oasis-popup-header"><span class="oasis-popup-title">Game World</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">🏆 Leagues</div><div class="oasis-card-sub">Competitive tiers</div></div><div class="oasis-card"><div class="oasis-card-title">🎯 Missions</div><div class="oasis-card-sub">Active quests</div></div><div class="oasis-card"><div class="oasis-card-title">⚔️ Tournaments</div><div class="oasis-card-sub">Scheduled events</div></div><div class="oasis-card"><div class="oasis-card-title">🌟 Achievements</div><div class="oasis-card-sub">Unlock rewards</div></div><div class="oasis-card"><div class="oasis-card-title">👤 Profiles</div><div class="oasis-card-sub">Find players</div></div><div class="oasis-card"><div class="oasis-card-title">📊 Leaderboard</div><div class="oasis-card-sub">Top avatars</div></div></div></div></div>`;
14
+ this._overlay.querySelector('.oasis-popup-close').addEventListener('click', () => this.close());
15
+ this._overlay.addEventListener('click', e => { if (e.target === this._overlay) this.close(); });
16
+ document.body.appendChild(this._overlay);
17
+ requestAnimationFrame(() => this._overlay.classList.add('is-open'));
18
+ }
19
+ 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(); }
20
+ destroy() { this.close(); }
21
+ }
22
+ window.OasisGame = OasisGame;
@@ -0,0 +1,17 @@
1
+ class OasisHolochain {
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">Holochain 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>Holochain Provider</h3><p>Peer-to-peer distributed computing via Holochain. No central servers, no blockchain bottlenecks.</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.OasisHolochain = OasisHolochain;
@@ -0,0 +1,17 @@
1
+ class OasisHyperDrive {
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-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">HyperDrive</span><button class="oasis-popup-close">×</button></div><div class="oasis-popup-body"><div class="oasis-cs"><div class="oasis-cs-icon">🚀</div><h3>HyperDrive</h3><p>Hyper-speed data transport layer for the OASIS. Enables blazing-fast cross-provider data replication and synchronisation.</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.OasisHyperDrive = OasisHyperDrive;