@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/src/index.esm.js CHANGED
@@ -1,15 +1,143 @@
1
- // @oasisomniverse/js — ESM re-exports
2
- // Each widget self-registers on window.* when imported.
3
- // You can also import the class directly: import { OasisNavBar } from '@oasisomniverse/js'
4
-
5
- export { OasisNavBar } from './widgets/navbar.js';
6
- export { OasisModal } from './widgets/oasis-modal.js';
7
- export { OasisContact } from './widgets/contact.js';
8
- export { OasisConfirmation } from './widgets/confirmation.js';
9
- export { OasisComingSoon } from './widgets/coming-soon.js';
10
- export { OasisKarmaToast } from './widgets/karma-toast.js';
11
- export { OasisAvatarConnect } from './widgets/avatar-connect.js';
12
- export { OasisSeeds } from './widgets/seeds.js';
13
- export { OasisEggs } from './widgets/eggs.js';
14
- export { OasisStarField } from './widgets/star-field.js';
15
- export { OasisProviderDropdown } from './widgets/provider-dropdown.js';
1
+ // @oasisomniverse/js — ESM named re-exports
2
+ // Each widget class is exported by name for tree-shaking
3
+
4
+ export { OasisAvatarConnect } from './avatar-connect.js';
5
+ export { OasisAvatarWallet } from './avatar-wallet.js';
6
+ export { OasisComingSoon } from './coming-soon.js';
7
+ export { OasisConfirmation } from './confirmation.js';
8
+ export { OasisContact } from './contact.js';
9
+ export { OasisEggs } from './eggs.js';
10
+ export { OasisForgotPassword } from './forgot-password.js';
11
+ export { OasisGame } from './game.js';
12
+ export { OasisHyperDrive } from './hyperdrive.js';
13
+ export { OasisKarmaPanel } from './karma-panel.js';
14
+ export { OasisKarmaToast } from './karma-toast.js';
15
+ export { OasisLogin } from './login.js';
16
+ export { OasisMap } from './map.js';
17
+ export { OasisMenuMessage } from './menu-message.js';
18
+ export { OasisMessaging } from './messaging.js';
19
+ export { OasisMission } from './mission.js';
20
+ export { OasisNavBar } from './navbar.js';
21
+ export { OasisNFT } from './nft.js';
22
+ export { OasisOApp } from './oapp.js';
23
+ export { OasisOasisModal } from './oasis-modal.js';
24
+ export { OasisONET } from './onet.js';
25
+ export { OasisONODE } from './onode.js';
26
+ export { OasisProviderDropdown } from './provider-dropdown.js';
27
+ export { OasisProviders } from './providers.js';
28
+ export { OasisQuest } from './quest.js';
29
+ export { OasisResetPassword } from './reset-password.js';
30
+ export { OasisSearchAvatars } from './search-avatars.js';
31
+ export { OasisSeeds } from './seeds.js';
32
+ export { OasisSettings } from './settings.js';
33
+ export { OasisSignup } from './signup.js';
34
+ export { OasisStarField } from './star-field.js';
35
+ export { OasisVerifyEmail } from './verify-email.js';
36
+ export { OasisWallet } from './wallet.js';
37
+
38
+ // Avatar sub-components
39
+ export { OasisEditAvatar } from './edit-avatar.js';
40
+ export { OasisSearchAvatar } from './search-avatar.js';
41
+ export { OasisViewAvatar } from './view-avatar.js';
42
+
43
+ // Data Screen sub-components
44
+ export { OasisAddData } from './add-data.js';
45
+ export { OasisCrossChainManagement } from './cross-chain-management.js';
46
+ export { OasisLoadData } from './load-data.js';
47
+ export { OasisManageData } from './manage-data.js';
48
+ export { OasisOffChainManagement } from './off-chain-management.js';
49
+ export { OasisSearchData } from './search-data.js';
50
+
51
+ // Eggs sub-components
52
+ export { OasisManageEggs } from './manage-eggs.js';
53
+ export { OasisSearchEggs } from './search-eggs.js';
54
+ export { OasisViewEggs } from './view-eggs.js';
55
+
56
+ // Game sub-components
57
+ export { OasisSearchProfiles } from './search-profiles.js';
58
+ export { OasisViewAchievements } from './view-achievements.js';
59
+ export { OasisViewLeagues } from './view-leagues.js';
60
+ export { OasisViewTournaments } from './view-tournaments.js';
61
+
62
+ // Karma sub-components
63
+ export { OasisSearchKarma } from './search-karma.js';
64
+ export { OasisViewAvatarKarma } from './view-avatar-karma.js';
65
+ export { OasisViewKarma } from './view-karma.js';
66
+ export { OasisVoteKarma } from './vote-karma.js';
67
+
68
+ // Map sub-components
69
+ export { OasisAdd2dObjectMap } from './add-2d-object-map.js';
70
+ export { OasisAdd3dObjectMap } from './add-3d-object-map.js';
71
+ export { OasisAddQuestToMap } from './add-quest-to-map.js';
72
+ export { OasisDownloadOurWorldMap } from './download-our-world-map.js';
73
+ export { OasisManageMap } from './manage-map.js';
74
+ export { OasisPlotRouteOnMap } from './plot-route-on-map.js';
75
+ export { OasisSearchMap } from './search-map.js';
76
+ export { OasisViewGlobal3dMap } from './view-global-3d-map.js';
77
+ export { OasisViewHalonsOnMap } from './view-halons-on-map.js';
78
+ export { OasisViewOappOnMap } from './view-oapp-on-map.js';
79
+ export { OasisViewQuestOnMap } from './view-quest-on-map.js';
80
+
81
+ // Messages sub-components
82
+ export { OasisMessage } from './message.js';
83
+
84
+ // Mission sub-components
85
+ export { OasisManageMission } from './manage-mission.js';
86
+ export { OasisSearchMission } from './search-mission.js';
87
+ export { OasisViewMission } from './view-mission.js';
88
+
89
+ // NFT sub-components
90
+ export { OasisNftContactPopup } from './contact-popup-nft.js';
91
+ export { OasisManageOasisNft } from './manage-oasis-nft.js';
92
+ export { OasisPurchaseOasisNft } from './purchase-oasis-nft.js';
93
+ export { OasisPurchaseOasisVirtualLandNft } from './purchase-oasis-virtual-land-nft.js';
94
+ export { OasisSearchOasisNft } from './search-oasis-nft.js';
95
+ export { OasisSolana } from './solana.js';
96
+ export { OasisViewOasisNft } from './view-oasis-nft.js';
97
+
98
+ // OApp sub-components
99
+ export { OasisCreateOAPP } from './create-oapp.js';
100
+ export { OasisDeployOAPP } from './deploy-oapp.js';
101
+ export { OasisDownloadOurWorldOApp } from './download-our-world-oapp.js';
102
+ export { OasisEditOAPP } from './edit-oapp.js';
103
+ export { OasisInstallOAPP } from './install-oapp.js';
104
+ export { OasisLaunchOAPP } from './launch-oapp.js';
105
+ export { OasisManageOAPP } from './manage-oapp.js';
106
+ export { OasisSearchOAPP } from './search-oapp.js';
107
+
108
+ // Provider sub-components
109
+ export { OasisActivityPub } from './activity-pub.js';
110
+ export { OasisCompareProviderSpeeds } from './compare-provider-speeds.js';
111
+ export { OasisEosio } from './eosio.js';
112
+ export { OasisEthereum } from './ethereum.js';
113
+ export { OasisHolochain } from './holochain.js';
114
+ export { OasisIpfs } from './ipfs.js';
115
+ export { OasisManageAutoFailOver } from './manage-auto-fail-over.js';
116
+ export { OasisManageAutoReplicaton } from './manage-auto-replicaton.js';
117
+ export { OasisManageLoadBalancing } from './manage-load-balancing.js';
118
+ export { OasisManageProviders } from './manage-providers.js';
119
+ export { OasisMongoDb } from './mongo-db.js';
120
+ export { OasisNeo4j } from './neo4j.js';
121
+ export { OasisSearchProviders } from './search-providers.js';
122
+ export { OasisSeedsProvider } from './seeds-provider.js';
123
+ export { OasisSolid } from './solid.js';
124
+ export { OasisSqlLite } from './sql-lite.js';
125
+ export { OasisThreeFold } from './three-fold.js';
126
+ export { OasisViewProviders } from './view-providers.js';
127
+ export { OasisViewProviderStats } from './view-provider-stats.js';
128
+
129
+ // Quest sub-components
130
+ export { OasisManageQuest } from './manage-quest.js';
131
+ export { OasisSearchQuest } from './search-quest.js';
132
+ export { OasisViewQuest } from './view-quest.js';
133
+
134
+ // Seeds sub-components
135
+ export { OasisAcceptInvite } from './accept-invite.js';
136
+ export { OasisDonateSeeds } from './donate-seeds.js';
137
+ export { OasisManageSeeds } from './manage-seeds.js';
138
+ export { OasisPayWithSeeds } from './pay-with-seeds.js';
139
+ export { OasisRewardSeeds } from './reward-seeds.js';
140
+ export { OasisSearchSeeds } from './search-seeds.js';
141
+ export { OasisSendInvite } from './send-invite.js';
142
+ export { OasisViewOrganizations } from './view-organizations.js';
143
+ export { OasisViewSeeds } from './view-seeds.js';
package/src/index.js CHANGED
@@ -1,15 +1,148 @@
1
1
  // @oasisomniverse/js — OASIS Omniverse vanilla JS widgets
2
- // Load this file to register all widgets on window.*
3
- // Or import individual widgets from ./widgets/<name>.js
4
-
5
- import './widgets/avatar-connect.js';
6
- import './widgets/coming-soon.js';
7
- import './widgets/confirmation.js';
8
- import './widgets/contact.js';
9
- import './widgets/eggs.js';
10
- import './widgets/karma-toast.js';
11
- import './widgets/navbar.js';
12
- import './widgets/oasis-modal.js';
13
- import './widgets/provider-dropdown.js';
14
- import './widgets/seeds.js';
15
- import './widgets/star-field.js';
2
+ // Import this file to register all widgets on window.*
3
+
4
+ // ── Auth ─────────────────────────────────────────────────────────────────────
5
+ import './forgot-password.js';
6
+ import './login.js';
7
+ import './reset-password.js';
8
+ import './signup.js';
9
+ import './verify-email.js';
10
+
11
+ // ── Layout / navigation ───────────────────────────────────────────────────────
12
+ import './navbar.js';
13
+ import './oasis-modal.js';
14
+ import './star-field.js';
15
+
16
+ // ── Avatar ────────────────────────────────────────────────────────────────────
17
+ import './avatar-connect.js';
18
+ import './avatar-wallet.js';
19
+ import './edit-avatar.js';
20
+ import './search-avatar.js';
21
+ import './search-avatars.js';
22
+ import './view-avatar.js';
23
+
24
+ // ── Common popups ─────────────────────────────────────────────────────────────
25
+ import './coming-soon.js';
26
+ import './confirmation.js';
27
+ import './contact.js';
28
+ import './hyperdrive.js';
29
+ import './menu-message.js';
30
+ import './messaging.js';
31
+ import './onet.js';
32
+ import './onode.js';
33
+ import './provider-dropdown.js';
34
+ import './settings.js';
35
+ import './wallet.js';
36
+
37
+ // ── Data Screen ───────────────────────────────────────────────────────────────
38
+ import './add-data.js';
39
+ import './cross-chain-management.js';
40
+ import './load-data.js';
41
+ import './manage-data.js';
42
+ import './off-chain-management.js';
43
+ import './search-data.js';
44
+
45
+ // ── Eggs ──────────────────────────────────────────────────────────────────────
46
+ import './eggs.js';
47
+ import './manage-eggs.js';
48
+ import './search-eggs.js';
49
+ import './view-eggs.js';
50
+
51
+ // ── Game ──────────────────────────────────────────────────────────────────────
52
+ import './game.js';
53
+ import './search-profiles.js';
54
+ import './view-achievements.js';
55
+ import './view-leagues.js';
56
+ import './view-tournaments.js';
57
+
58
+ // ── Karma ─────────────────────────────────────────────────────────────────────
59
+ import './karma-panel.js';
60
+ import './karma-toast.js';
61
+ import './search-karma.js';
62
+ import './view-avatar-karma.js';
63
+ import './view-karma.js';
64
+ import './vote-karma.js';
65
+
66
+ // ── Map ───────────────────────────────────────────────────────────────────────
67
+ import './map.js';
68
+ import './add-2d-object-map.js';
69
+ import './add-3d-object-map.js';
70
+ import './add-quest-to-map.js';
71
+ import './download-our-world-map.js';
72
+ import './manage-map.js';
73
+ import './plot-route-on-map.js';
74
+ import './search-map.js';
75
+ import './view-global-3d-map.js';
76
+ import './view-halons-on-map.js';
77
+ import './view-oapp-on-map.js';
78
+ import './view-quest-on-map.js';
79
+
80
+ // ── Messages ──────────────────────────────────────────────────────────────────
81
+ import './message.js';
82
+
83
+ // ── Mission ───────────────────────────────────────────────────────────────────
84
+ import './mission.js';
85
+ import './manage-mission.js';
86
+ import './search-mission.js';
87
+ import './view-mission.js';
88
+
89
+ // ── NFT ───────────────────────────────────────────────────────────────────────
90
+ import './nft.js';
91
+ import './contact-popup-nft.js';
92
+ import './manage-oasis-nft.js';
93
+ import './purchase-oasis-nft.js';
94
+ import './purchase-oasis-virtual-land-nft.js';
95
+ import './search-oasis-nft.js';
96
+ import './solana.js';
97
+ import './view-oasis-nft.js';
98
+
99
+ // ── OApp ──────────────────────────────────────────────────────────────────────
100
+ import './oapp.js';
101
+ import './create-oapp.js';
102
+ import './deploy-oapp.js';
103
+ import './download-our-world-oapp.js';
104
+ import './edit-oapp.js';
105
+ import './install-oapp.js';
106
+ import './launch-oapp.js';
107
+ import './manage-oapp.js';
108
+ import './search-oapp.js';
109
+
110
+ // ── Providers ─────────────────────────────────────────────────────────────────
111
+ import './providers.js';
112
+ import './activity-pub.js';
113
+ import './compare-provider-speeds.js';
114
+ import './eosio.js';
115
+ import './ethereum.js';
116
+ import './holochain.js';
117
+ import './ipfs.js';
118
+ import './manage-auto-fail-over.js';
119
+ import './manage-auto-replicaton.js';
120
+ import './manage-load-balancing.js';
121
+ import './manage-providers.js';
122
+ import './mongo-db.js';
123
+ import './neo4j.js';
124
+ import './search-providers.js';
125
+ import './seeds-provider.js';
126
+ import './solid.js';
127
+ import './sql-lite.js';
128
+ import './three-fold.js';
129
+ import './view-providers.js';
130
+ import './view-provider-stats.js';
131
+
132
+ // ── Quest ─────────────────────────────────────────────────────────────────────
133
+ import './quest.js';
134
+ import './manage-quest.js';
135
+ import './search-quest.js';
136
+ import './view-quest.js';
137
+
138
+ // ── Seeds ─────────────────────────────────────────────────────────────────────
139
+ import './seeds.js';
140
+ import './accept-invite.js';
141
+ import './donate-seeds.js';
142
+ import './manage-seeds.js';
143
+ import './pay-with-seeds.js';
144
+ import './reward-seeds.js';
145
+ import './search-seeds.js';
146
+ import './send-invite.js';
147
+ import './view-organizations.js';
148
+ import './view-seeds.js';
@@ -0,0 +1,17 @@
1
+ class OasisInstallOAPP {
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-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(160px,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}.oasis-card:hover{border-color:#00c8ff;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}.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">Install OAPP</span><button class="oasis-popup-close">×</button></div><div class="oasis-popup-body"><div class="oasis-search-row"><input class="oasis-input" id="oasis-install-q" placeholder="Search OAPPs to install…"><button class="oasis-btn-primary" id="oasis-install-btn">Search</button></div><div class="oasis-grid" id="oasis-install-grid"><div class="oasis-card"><div class="oasis-card-title">🎮 Game Hub</div><div class="oasis-card-sub">Games & tournaments</div></div><div class="oasis-card"><div class="oasis-card-title">💬 Chat</div><div class="oasis-card-sub">Avatar messaging</div></div><div class="oasis-card"><div class="oasis-card-title">🌱 Seeds Wallet</div><div class="oasis-card-sub">SEEDS economy</div></div><div class="oasis-card"><div class="oasis-card-title">🗺️ Map Explorer</div><div class="oasis-card-sub">Our World AR</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.OasisInstallOAPP = OasisInstallOAPP;
package/src/ipfs.js ADDED
@@ -0,0 +1,17 @@
1
+ class OasisIpfs {
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">IPFS 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>IPFS Provider</h3><p>InterPlanetary File System integration for permanent, censorship-resistant content addressing in the OASIS.</p><button class="oasis-btn-primary">Configure Provider</button></div></div></div>`;
9
+ this._overlay.querySelector('.oasis-popup-close').addEventListener('click', () => this.close());
10
+ this._overlay.addEventListener('click', e => { if (e.target === this._overlay) this.close(); });
11
+ document.body.appendChild(this._overlay);
12
+ requestAnimationFrame(() => this._overlay.classList.add('is-open'));
13
+ }
14
+ close() { if (!this._overlay) return; const el = this._overlay; this._overlay = null; el.classList.remove('is-open'); el.addEventListener('transitionend', () => el.remove(), { once: true }); if (this._onClose) this._onClose(); }
15
+ destroy() { this.close(); }
16
+ }
17
+ window.OasisIpfs = OasisIpfs;
@@ -0,0 +1,28 @@
1
+ class OasisKarmaPanel {
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: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-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-bar{background:rgba(255,255,255,.08);border-radius:999px;height:8px;margin:8px 0}.oasis-bar-fill{height:100%;border-radius:999px;background:linear-gradient(90deg,#0066cc,#00c8ff)}.oasis-cs{text-align:center;padding:32px 16px}.oasis-cs-icon{font-size:48px;margin-bottom:12px}.oasis-cs h3{font-family:'Orbitron',sans-serif;font-size:15px;color:#00c8ff;margin:0 0 8px}.oasis-cs p{color:#7a9bbf;font-size:13px;margin:0}.oasis-msg-error{background:rgba(255,80,80,.12);border:1px solid rgba(255,80,80,.3);color:#ff6b6b;border-radius:8px;padding:10px 14px;font-size:13px}`; document.head.appendChild(s); }
4
+ open() {
5
+ if (this._overlay) return;
6
+ this._overlay = document.createElement('div');
7
+ this._overlay.className = 'oasis-popup-overlay';
8
+ this._overlay.innerHTML = `<div class="oasis-popup-modal"><div class="oasis-popup-header"><span class="oasis-popup-title">Karma Panel</span><button class="oasis-popup-close">×</button></div><div class="oasis-popup-body" id="oasis-kp-body"><div class="oasis-cs"><div class="oasis-cs-icon">⏳</div><p>Loading karma…</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-kp-body');
17
+ try {
18
+ const r = await fetch(`${this._apiUrl}/api/karma`);
19
+ const d = await r.json();
20
+ const total = d.total || 0; const max = d.max || 1000;
21
+ const pct = Math.min(100, Math.round((total / max) * 100));
22
+ body.innerHTML = `<div class="oasis-stat-row"><div class="oasis-stat"><div class="oasis-stat-val">${total}</div><div class="oasis-stat-lbl">Total Karma</div></div><div class="oasis-stat"><div class="oasis-stat-val">${d.positive||0}</div><div class="oasis-stat-lbl">Positive</div></div><div class="oasis-stat"><div class="oasis-stat-val">${d.negative||0}</div><div class="oasis-stat-lbl">Negative</div></div></div><p style="font-size:11px;color:#7a9bbf;margin:0 0 6px">Progress (${pct}%)</p><div class="oasis-bar"><div class="oasis-bar-fill" style="width:${pct}%"></div></div>`;
23
+ } catch { body.innerHTML = '<div class="oasis-msg-error">Failed to load karma.</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.OasisKarmaPanel = OasisKarmaPanel;
@@ -0,0 +1,28 @@
1
+ class OasisLaunchOAPP {
2
+ constructor({ apiUrl = 'https://api.web4.oasisomniverse.one', onClose = null } = {}) { this._apiUrl = apiUrl; this._onClose = onClose; this._overlay = null; this._injectStyles(); }
3
+ _injectStyles() { if (document.getElementById('oasis-popup-styles')) return; const s = document.createElement('style'); s.id = 'oasis-popup-styles'; s.textContent = `.oasis-popup-overlay{position:fixed;inset:0;z-index:9000;background:rgba(0,0,0,.65);backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .25s}.oasis-popup-overlay.is-open{opacity:1}.oasis-popup-modal{background:#0a1628;border:1px solid rgba(0,200,255,.2);border-radius:16px;box-shadow:0 24px 64px rgba(0,0,0,.6);width:90%;max-width:600px;max-height:90vh;overflow-y:auto;transform:translateY(16px);transition:transform .25s}.oasis-popup-overlay.is-open .oasis-popup-modal{transform:none}.oasis-popup-header{display:flex;align-items:center;justify-content:space-between;padding:20px 24px;border-bottom:1px solid rgba(0,200,255,.1)}.oasis-popup-title{font-family:'Orbitron',sans-serif;font-size:14px;font-weight:700;color:#00c8ff;letter-spacing:.08em}.oasis-popup-close{background:none;border:none;color:#7a9bbf;font-size:22px;cursor:pointer;padding:0;line-height:1}.oasis-popup-close:hover{color:#fff}.oasis-popup-body{padding:24px}.oasis-table{width:100%;border-collapse:collapse;font-size:13px}.oasis-table th{text-align:left;padding:10px 12px;font-size:10px;font-weight:700;letter-spacing:.06em;color:#7a9bbf;text-transform:uppercase;border-bottom:1px solid rgba(0,200,255,.1)}.oasis-table td{padding:10px 12px;color:#fff;border-bottom:1px solid rgba(255,255,255,.05)}.oasis-table tr:hover td{background:rgba(0,200,255,.04)}.oasis-btn-sm{background:linear-gradient(135deg,#0066cc,#00c8ff);color:#fff;border:none;border-radius:6px;padding:5px 12px;font-size:11px;font-weight:600;cursor:pointer}.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">Launch OAPP</span><button class="oasis-popup-close">×</button></div><div class="oasis-popup-body" id="oasis-launch-body"><div class="oasis-cs"><p>Loading installed OAPPs…</p></div></div></div>`;
9
+ this._overlay.querySelector('.oasis-popup-close').addEventListener('click', () => this.close());
10
+ this._overlay.addEventListener('click', e => { if (e.target === this._overlay) this.close(); });
11
+ document.body.appendChild(this._overlay);
12
+ requestAnimationFrame(() => this._overlay.classList.add('is-open'));
13
+ this._load();
14
+ }
15
+ async _load() {
16
+ const body = this._overlay.querySelector('#oasis-launch-body');
17
+ try {
18
+ const r = await fetch(`${this._apiUrl}/api/oapp/installed`);
19
+ const data = await r.json();
20
+ const oapps = Array.isArray(data) ? data : (data.result || []);
21
+ if (!oapps.length) { body.innerHTML = '<div class="oasis-cs"><p>No OAPPs installed. Install one first.</p></div>'; return; }
22
+ body.innerHTML = `<table class="oasis-table"><thead><tr><th>OAPP</th><th>Version</th><th>Action</th></tr></thead><tbody>${oapps.map(o=>`<tr><td>${o.name||'—'}</td><td>${o.version||'—'}</td><td><button class="oasis-btn-sm">▶ Launch</button></td></tr>`).join('')}</tbody></table>`;
23
+ } catch { body.innerHTML = '<div class="oasis-msg-error">Failed to load OAPPs.</div>'; }
24
+ }
25
+ close() { if (!this._overlay) return; const el = this._overlay; this._overlay = null; el.classList.remove('is-open'); el.addEventListener('transitionend', () => el.remove(), { once: true }); if (this._onClose) this._onClose(); }
26
+ destroy() { this.close(); }
27
+ }
28
+ window.OasisLaunchOAPP = OasisLaunchOAPP;
@@ -0,0 +1,17 @@
1
+ class OasisManageAutoFailOver {
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">Manage Auto Failover</span><button class="oasis-popup-close">×</button></div><div class="oasis-popup-body"><div class="oasis-cs"><div class="oasis-cs-icon">🔄</div><h3>Manage Auto Failover</h3><p>Configure automatic provider failover rules so the OASIS seamlessly switches providers on outage.</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.OasisManageAutoFailOver = OasisManageAutoFailOver;
@@ -0,0 +1,17 @@
1
+ class OasisManageAutoReplicaton {
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">Manage Auto Replication</span><button class="oasis-popup-close">×</button></div><div class="oasis-popup-body"><div class="oasis-cs"><div class="oasis-cs-icon">🔁</div><h3>Manage Auto Replication</h3><p>Set up automatic data replication across multiple providers for redundancy and availability.</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.OasisManageAutoReplicaton = OasisManageAutoReplicaton;
@@ -0,0 +1,17 @@
1
+ class OasisManageLoadBalancing {
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">Manage Load Balancing</span><button class="oasis-popup-close">×</button></div><div class="oasis-popup-body"><div class="oasis-cs"><div class="oasis-cs-icon">⚖️</div><h3>Manage Load Balancing</h3><p>Distribute requests across providers intelligently to maximise throughput and minimise latency.</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.OasisManageLoadBalancing = OasisManageLoadBalancing;
@@ -0,0 +1,17 @@
1
+ class OasisManageMap {
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">Manage 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">🗑️ Remove Objects</div><div class="oasis-card-sub">Delete map items</div></div><div class="oasis-card"><div class="oasis-card-title">✏️ Edit Objects</div><div class="oasis-card-sub">Modify placed items</div></div><div class="oasis-card"><div class="oasis-card-title">🔒 Lock Region</div><div class="oasis-card-sub">Restrict access</div></div><div class="oasis-card"><div class="oasis-card-title">📊 Map Stats</div><div class="oasis-card-sub">Usage analytics</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.OasisManageMap = OasisManageMap;
@@ -0,0 +1,28 @@
1
+ class OasisManageOAPP {
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-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-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-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 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 OAPPs</span><button class="oasis-popup-close">×</button></div><div class="oasis-popup-body" id="oasis-moapp-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-moapp-body');
17
+ try {
18
+ const r = await fetch(`${this._apiUrl}/api/oapp`);
19
+ const data = await r.json();
20
+ const oapps = Array.isArray(data) ? data : (data.result || []);
21
+ if (!oapps.length) { body.innerHTML = '<div class="oasis-cs"><p>No OAPPs found. Create one first.</p></div>'; return; }
22
+ body.innerHTML = `<div class="oasis-stat-row"><div class="oasis-stat"><div class="oasis-stat-val">${oapps.length}</div><div class="oasis-stat-lbl">Total OAPPs</div></div><div class="oasis-stat"><div class="oasis-stat-val">${oapps.filter(o=>o.status==='live').length}</div><div class="oasis-stat-lbl">Live</div></div></div><table class="oasis-table"><thead><tr><th>Name</th><th>Version</th><th>Status</th></tr></thead><tbody>${oapps.map(o=>`<tr><td>${o.name||'—'}</td><td>${o.version||'—'}</td><td><span class="oasis-badge ${o.status==='live'?'oasis-badge-green':'oasis-badge-yellow'}">${o.status||'draft'}</span></td></tr>`).join('')}</tbody></table>`;
23
+ } catch { body.innerHTML = '<div class="oasis-msg-error">Failed to load OAPPs.</div>'; }
24
+ }
25
+ close() { if (!this._overlay) return; const el = this._overlay; this._overlay = null; el.classList.remove('is-open'); el.addEventListener('transitionend', () => el.remove(), { once: true }); if (this._onClose) this._onClose(); }
26
+ destroy() { this.close(); }
27
+ }
28
+ window.OasisManageOAPP = OasisManageOAPP;
@@ -0,0 +1,17 @@
1
+ class OasisManageProviders {
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">Manage 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>Manage Providers</h3><p>Add, remove, and configure the storage and compute providers connected to your OASIS instance.</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.OasisManageProviders = OasisManageProviders;