@oasisomniverse/vue 1.0.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 (117) hide show
  1. package/package.json +37 -0
  2. package/src/components/Avatar/AvatarWallet.vue +29 -0
  3. package/src/components/Avatar/EditAvatar.vue +21 -0
  4. package/src/components/Avatar/SearchAvatar.vue +24 -0
  5. package/src/components/Avatar/ViewAvatar.vue +19 -0
  6. package/src/components/AvatarConnect/AvatarConnect.vue +64 -0
  7. package/src/components/AvatarProfile/AvatarProfile.vue +123 -0
  8. package/src/components/ComingSoon/ComingSoon.vue +14 -0
  9. package/src/components/Confirmation/Confirmation.vue +18 -0
  10. package/src/components/Contact/Contact.vue +40 -0
  11. package/src/components/DataScreen/AddData.vue +26 -0
  12. package/src/components/DataScreen/CrossChainManagement.vue +14 -0
  13. package/src/components/DataScreen/LoadData.vue +24 -0
  14. package/src/components/DataScreen/ManageData.vue +14 -0
  15. package/src/components/DataScreen/OffChainManagement.vue +14 -0
  16. package/src/components/DataScreen/SearchData.vue +24 -0
  17. package/src/components/Eggs/Eggs.vue +40 -0
  18. package/src/components/Eggs/ManageEggs.vue +14 -0
  19. package/src/components/Eggs/SearchEggs.vue +24 -0
  20. package/src/components/Eggs/ViewEggs.vue +20 -0
  21. package/src/components/ForgotPassword/ForgotPassword.vue +71 -0
  22. package/src/components/Game/Game.vue +29 -0
  23. package/src/components/Game/SearchProfiles.vue +24 -0
  24. package/src/components/Game/ViewAchievements.vue +25 -0
  25. package/src/components/Game/ViewLeagues.vue +25 -0
  26. package/src/components/Game/ViewTournaments.vue +27 -0
  27. package/src/components/HyperDrive/HyperDrive.vue +46 -0
  28. package/src/components/Karma/SearchKarma.vue +24 -0
  29. package/src/components/Karma/ViewAvatarKarma.vue +20 -0
  30. package/src/components/Karma/ViewKarma.vue +30 -0
  31. package/src/components/Karma/VoteKarma.vue +26 -0
  32. package/src/components/KarmaPanel/KarmaPanel.vue +71 -0
  33. package/src/components/KarmaToast/KarmaToast.vue +29 -0
  34. package/src/components/Login/Login.vue +90 -0
  35. package/src/components/Map/Add2dObjectMap.vue +23 -0
  36. package/src/components/Map/Add3dObjectMap.vue +24 -0
  37. package/src/components/Map/AddQuestToMap.vue +22 -0
  38. package/src/components/Map/DownloadOurWorld.vue +18 -0
  39. package/src/components/Map/ManageMap.vue +14 -0
  40. package/src/components/Map/Map.vue +38 -0
  41. package/src/components/Map/PlotRouteOnMap.vue +25 -0
  42. package/src/components/Map/SearchMap.vue +24 -0
  43. package/src/components/Map/ViewGlobal3dMap.vue +14 -0
  44. package/src/components/Map/ViewHalonsOnMap.vue +27 -0
  45. package/src/components/Map/ViewOappOnMap.vue +14 -0
  46. package/src/components/Map/ViewQuestOnMap.vue +20 -0
  47. package/src/components/MenuMessage/MenuMessage.vue +72 -0
  48. package/src/components/Message/Message.vue +50 -0
  49. package/src/components/Messaging/Messaging.vue +44 -0
  50. package/src/components/Mission/ManageMission.vue +14 -0
  51. package/src/components/Mission/Mission.vue +32 -0
  52. package/src/components/Mission/SearchMission.vue +24 -0
  53. package/src/components/Mission/ViewMission.vue +21 -0
  54. package/src/components/NFT/ContactPopup.vue +36 -0
  55. package/src/components/NFT/ManageOasisNft.vue +14 -0
  56. package/src/components/NFT/NFT.vue +36 -0
  57. package/src/components/NFT/PurchaseOasisNft.vue +21 -0
  58. package/src/components/NFT/PurchaseOasisVirtualLandNft.vue +23 -0
  59. package/src/components/NFT/SearchOasisNft.vue +30 -0
  60. package/src/components/NFT/Solana.vue +27 -0
  61. package/src/components/NFT/ViewOasisNft.vue +20 -0
  62. package/src/components/NavBar/NavBar.vue +71 -0
  63. package/src/components/OApp/CreateOAPP.vue +31 -0
  64. package/src/components/OApp/DeployOAPP.vue +23 -0
  65. package/src/components/OApp/DownloadOurWorld.vue +18 -0
  66. package/src/components/OApp/EditOAPP.vue +21 -0
  67. package/src/components/OApp/InstallOAPP.vue +23 -0
  68. package/src/components/OApp/LaunchOAPP.vue +19 -0
  69. package/src/components/OApp/ManageOAPP.vue +14 -0
  70. package/src/components/OApp/OApp.vue +40 -0
  71. package/src/components/OApp/SearchOAPP.vue +30 -0
  72. package/src/components/ONET/ONET.vue +40 -0
  73. package/src/components/ONODE/ONODE.vue +42 -0
  74. package/src/components/OasisModal/OasisModal.vue +36 -0
  75. package/src/components/Provider/ActivityPub.vue +14 -0
  76. package/src/components/Provider/CompareProviderSpeeds.vue +32 -0
  77. package/src/components/Provider/Eosio.vue +14 -0
  78. package/src/components/Provider/Ethereum.vue +14 -0
  79. package/src/components/Provider/Holochain.vue +14 -0
  80. package/src/components/Provider/Ipfs.vue +14 -0
  81. package/src/components/Provider/ManageAutoFailOver.vue +14 -0
  82. package/src/components/Provider/ManageAutoReplicaton.vue +14 -0
  83. package/src/components/Provider/ManageLoadBalancing.vue +14 -0
  84. package/src/components/Provider/ManageProviders.vue +27 -0
  85. package/src/components/Provider/MongoDb.vue +14 -0
  86. package/src/components/Provider/Neo4j.vue +14 -0
  87. package/src/components/Provider/SearchProviders.vue +24 -0
  88. package/src/components/Provider/Seeds.vue +14 -0
  89. package/src/components/Provider/Solid.vue +14 -0
  90. package/src/components/Provider/SqlLite.vue +14 -0
  91. package/src/components/Provider/ThreeFold.vue +14 -0
  92. package/src/components/Provider/ViewProviderStats.vue +27 -0
  93. package/src/components/Provider/ViewProviders.vue +30 -0
  94. package/src/components/ProviderDropdown/ProviderDropdown.vue +34 -0
  95. package/src/components/Providers/Providers.vue +30 -0
  96. package/src/components/Quest/ManageQuest.vue +14 -0
  97. package/src/components/Quest/Quest.vue +35 -0
  98. package/src/components/Quest/SearchQuest.vue +30 -0
  99. package/src/components/Quest/ViewQuest.vue +23 -0
  100. package/src/components/ResetPassword/ResetPassword.vue +39 -0
  101. package/src/components/SearchAvatars/SearchAvatars.vue +42 -0
  102. package/src/components/Seeds/AcceptInvite.vue +26 -0
  103. package/src/components/Seeds/DonateSeeds.vue +34 -0
  104. package/src/components/Seeds/ManageSeeds.vue +14 -0
  105. package/src/components/Seeds/PayWithSeeds.vue +34 -0
  106. package/src/components/Seeds/RewardSeeds.vue +20 -0
  107. package/src/components/Seeds/SearchSeeds.vue +18 -0
  108. package/src/components/Seeds/Seeds.vue +37 -0
  109. package/src/components/Seeds/SendInvite.vue +34 -0
  110. package/src/components/Seeds/ViewOrganizations.vue +27 -0
  111. package/src/components/Seeds/ViewSeeds.vue +34 -0
  112. package/src/components/Settings/Settings.vue +52 -0
  113. package/src/components/Signup/Signup.vue +121 -0
  114. package/src/components/StarField/StarField.vue +55 -0
  115. package/src/components/VerifyEmail/VerifyEmail.vue +21 -0
  116. package/src/components/Wallet/Wallet.vue +41 -0
  117. package/src/index.ts +143 -0
@@ -0,0 +1,42 @@
1
+ <script setup lang="ts">
2
+ import { ref } from 'vue'
3
+ const running = ref(false)
4
+ const metrics = [
5
+ { label: 'CPU', value: '18%' },
6
+ { label: 'RAM', value: '2.1 GB' },
7
+ { label: 'Storage', value: '47 GB' },
8
+ { label: 'Blocks', value: '12,450' },
9
+ ]
10
+ const logs = [
11
+ { time: '09:42:01', level: 'info', message: 'ONODE started. Connecting to ONET…' },
12
+ { time: '09:42:02', level: 'info', message: 'Connected to 12 peers.' },
13
+ { time: '09:42:05', level: 'info', message: 'Block #12450 validated.' },
14
+ { time: '09:42:08', level: 'warn', message: 'Peer ONODE-77 latency high: 340ms.' },
15
+ { time: '09:42:12', level: 'info', message: 'Data sync complete. 100% coverage.' },
16
+ ]
17
+ </script>
18
+ <template>
19
+ <div class="nd-shell">
20
+ <div class="nd-header"><h2 class="nd-title">🖥️ ONODE</h2><p class="nd-sub">Your personal OASIS node. Store, validate, and relay data.</p></div>
21
+ <div class="nd-status-row">
22
+ <div class="nd-status-pill" :class="{ 'nd-status-pill--running': running }">{{ running ? '● Running' : '○ Stopped' }}</div>
23
+ <button class="nd-btn" :class="{ 'nd-btn--stop': running }" @click="running = !running">{{ running ? 'Stop Node' : 'Start Node' }}</button>
24
+ </div>
25
+ <template v-if="running">
26
+ <div class="nd-metrics">
27
+ <div v-for="m in metrics" :key="m.label" class="nd-metric"><div class="nd-metric-val">{{ m.value }}</div><div class="nd-metric-label">{{ m.label }}</div></div>
28
+ </div>
29
+ <div class="nd-logs-header">Node Logs</div>
30
+ <div class="nd-logs">
31
+ <div v-for="l in logs" :key="l.time" class="nd-log" :class="`nd-log--${l.level}`">
32
+ <span class="nd-log-time">{{ l.time }}</span>
33
+ <span class="nd-log-level">[{{ l.level.toUpperCase() }}]</span>
34
+ <span class="nd-log-msg">{{ l.message }}</span>
35
+ </div>
36
+ </div>
37
+ </template>
38
+ </div>
39
+ </template>
40
+ <style scoped>
41
+ .nd-shell{display:flex;flex-direction:column;gap:18px}.nd-header{text-align:center}.nd-title{font-family:'Orbitron',sans-serif;font-size:20px;color:#fff;margin:0 0 6px}.nd-sub{font-size:13px;color:#7a9bbf;margin:0}.nd-status-row{display:flex;align-items:center;gap:14px}.nd-status-pill{flex:1;background:rgba(255,255,255,.04);border:1px solid rgba(255,80,80,.2);border-radius:8px;padding:10px 14px;font-family:'Orbitron',sans-serif;font-size:13px;color:#ff6b6b}.nd-status-pill--running{border-color:rgba(72,220,130,.3);color:#48dc82}.nd-btn{background:linear-gradient(135deg,#00c8ff,#0080ff);border:none;border-radius:8px;color:#fff;font-family:'Orbitron',sans-serif;font-size:12px;font-weight:700;letter-spacing:.08em;padding:10px 20px;cursor:pointer}.nd-btn--stop{background:rgba(255,80,80,.2);border:1px solid rgba(255,80,80,.35);color:#ff6b6b}.nd-metrics{display:grid;grid-template-columns:repeat(4,1fr);gap:10px}.nd-metric{background:rgba(255,255,255,.04);border:1px solid rgba(0,200,255,.1);border-radius:10px;padding:12px;text-align:center}.nd-metric-val{font-family:'Share Tech Mono',monospace;font-size:16px;color:#00c8ff;font-weight:600}.nd-metric-label{font-size:10px;color:#7a9bbf;margin-top:4px;text-transform:uppercase;letter-spacing:.06em}.nd-logs-header{font-family:'Orbitron',sans-serif;font-size:12px;color:#7a9bbf;letter-spacing:.06em;text-transform:uppercase}.nd-logs{background:#020a14;border:1px solid rgba(0,200,255,.1);border-radius:8px;padding:12px;display:flex;flex-direction:column;gap:5px;max-height:160px;overflow-y:auto;font-family:'Share Tech Mono',monospace}.nd-log{display:flex;gap:10px;font-size:11px}.nd-log-time{color:#4a6a88;flex-shrink:0}.nd-log--info .nd-log-level{color:#00c8ff}.nd-log--warn .nd-log-level{color:#ffb43c}.nd-log--error .nd-log-level{color:#ff6b6b}.nd-log-msg{color:#7a9bbf}
42
+ </style>
@@ -0,0 +1,36 @@
1
+ <template>
2
+ <Teleport to="body">
3
+ <Transition name="modal">
4
+ <div v-if="open" class="modal-backdrop" @click="$emit('close')">
5
+ <div class="modal-box" :style="{ borderColor: accentColor }" @click.stop>
6
+ <button class="modal-close" @click="$emit('close')">✕</button>
7
+ <slot />
8
+ </div>
9
+ </div>
10
+ </Transition>
11
+ </Teleport>
12
+ </template>
13
+
14
+ <script setup lang="ts">
15
+ defineProps<{ open: boolean; accentColor?: string }>()
16
+ defineEmits<{ close: [] }>()
17
+ </script>
18
+
19
+ <style scoped>
20
+ .modal-backdrop {
21
+ position: fixed; inset: 0; z-index: 9000;
22
+ background: rgba(3,7,20,.85); backdrop-filter: blur(8px);
23
+ display: flex; align-items: center; justify-content: center; padding: 20px;
24
+ }
25
+ .modal-box {
26
+ background: #0a1535; border: 1px solid rgba(0,232,124,.25); border-radius: 20px;
27
+ padding: 40px 36px; max-width: 520px; width: 100%;
28
+ position: relative; max-height: 90vh; overflow-y: auto;
29
+ }
30
+ .modal-close {
31
+ position: absolute; top: 16px; right: 18px;
32
+ background: none; border: none; color: #a8bfd8; font-size: 20px; cursor: pointer;
33
+ }
34
+ .modal-enter-active, .modal-leave-active { transition: all .25s ease; }
35
+ .modal-enter-from, .modal-leave-to { opacity: 0; transform: scale(.96); }
36
+ </style>
@@ -0,0 +1,14 @@
1
+ <script setup lang="ts">
2
+ const emit = defineEmits<{ close: [] }>()
3
+ </script>
4
+ <template>
5
+ <div class="p-shell">
6
+ <div class="p-icon">🐘</div>
7
+ <h2 class="p-title">ActivityPub Provider</h2>
8
+ <p class="p-body">ActivityPub integration with the OASIS is coming soon — enabling federated social networking across Mastodon, Pixelfed, PeerTube and other ActivityPub-compatible platforms.</p>
9
+ <button class="p-btn" @click="emit('close')">OK</button>
10
+ </div>
11
+ </template>
12
+ <style scoped>
13
+ .p-shell{display:flex;flex-direction:column;align-items:center;gap:16px;padding:32px 20px;text-align:center}.p-icon{font-size:44px}.p-title{font-family:'Orbitron',sans-serif;font-size:18px;color:#fff;margin:0}.p-body{font-size:14px;color:#a8bfd8;line-height:1.6;margin:0;max-width:360px}.p-btn{background:linear-gradient(135deg,#00c8ff,#0080ff);border:none;border-radius:8px;color:#fff;font-family:'Orbitron',sans-serif;font-size:12px;font-weight:700;letter-spacing:.08em;padding:11px 28px;cursor:pointer;transition:opacity .2s}.p-btn:hover{opacity:.85}
14
+ </style>
@@ -0,0 +1,32 @@
1
+ <script setup lang="ts">
2
+ const emit = defineEmits<{ close: [] }>()
3
+ const providers = [
4
+ { name: 'Holochain', read: 95, write: 92, score: 94 },
5
+ { name: 'MongoDB', read: 88, write: 85, score: 87 },
6
+ { name: 'SQLite', read: 99, write: 96, score: 98 },
7
+ { name: 'IPFS', read: 60, write: 45, score: 53 },
8
+ { name: 'Ethereum', read: 40, write: 30, score: 35 },
9
+ ]
10
+ </script>
11
+ <template>
12
+ <div class="p-shell">
13
+ <h2 class="p-title">⚡ Compare Provider Speeds</h2>
14
+ <div class="p-table-wrap">
15
+ <table class="p-table">
16
+ <thead><tr><th>Provider</th><th>Read</th><th>Write</th><th>Score</th></tr></thead>
17
+ <tbody>
18
+ <tr v-for="p in providers" :key="p.name">
19
+ <td>{{ p.name }}</td>
20
+ <td><div class="p-bar-wrap"><div class="p-bar" :style="{ width: p.read + '%' }"></div><span>{{ p.read }}</span></div></td>
21
+ <td><div class="p-bar-wrap"><div class="p-bar p-bar--write" :style="{ width: p.write + '%' }"></div><span>{{ p.write }}</span></div></td>
22
+ <td class="p-score">{{ p.score }}</td>
23
+ </tr>
24
+ </tbody>
25
+ </table>
26
+ </div>
27
+ <button class="p-btn" @click="emit('close')">Close</button>
28
+ </div>
29
+ </template>
30
+ <style scoped>
31
+ .p-shell{display:flex;flex-direction:column;gap:18px;padding:24px 20px}.p-title{font-family:'Orbitron',sans-serif;font-size:18px;color:#fff;margin:0}.p-table-wrap{overflow-x:auto;border-radius:10px;border:1px solid rgba(0,200,255,.15)}.p-table{width:100%;border-collapse:collapse;font-size:13px}.p-table th{background:rgba(0,200,255,.08);color:#00c8ff;font-family:'Orbitron',sans-serif;font-size:11px;font-weight:700;letter-spacing:.06em;padding:10px 12px;text-align:left}.p-table td{color:#c8dff0;padding:9px 12px;border-top:1px solid rgba(255,255,255,.05)}.p-bar-wrap{display:flex;align-items:center;gap:8px}.p-bar{height:6px;border-radius:999px;background:linear-gradient(90deg,#00c8ff,#0080ff);transition:width .4s}.p-bar--write{background:linear-gradient(90deg,#b87fff,#7040cc)}.p-score{color:#ffb43c;font-family:'Orbitron',sans-serif;font-weight:700}.p-btn{align-self:flex-end;background:linear-gradient(135deg,#00c8ff,#0080ff);border:none;border-radius:8px;color:#fff;font-family:'Orbitron',sans-serif;font-size:12px;font-weight:700;letter-spacing:.08em;padding:10px 24px;cursor:pointer;transition:opacity .2s}.p-btn:hover{opacity:.85}
32
+ </style>
@@ -0,0 +1,14 @@
1
+ <script setup lang="ts">
2
+ const emit = defineEmits<{ close: [] }>()
3
+ </script>
4
+ <template>
5
+ <div class="p-shell">
6
+ <div class="p-icon">⚡</div>
7
+ <h2 class="p-title">EOSIO Provider</h2>
8
+ <p class="p-body">EOSIO blockchain integration with the OASIS is coming soon — enabling high-throughput decentralised applications and smart contracts via the EOS network.</p>
9
+ <button class="p-btn" @click="emit('close')">OK</button>
10
+ </div>
11
+ </template>
12
+ <style scoped>
13
+ .p-shell{display:flex;flex-direction:column;align-items:center;gap:16px;padding:32px 20px;text-align:center}.p-icon{font-size:44px}.p-title{font-family:'Orbitron',sans-serif;font-size:18px;color:#fff;margin:0}.p-body{font-size:14px;color:#a8bfd8;line-height:1.6;margin:0;max-width:360px}.p-btn{background:linear-gradient(135deg,#00c8ff,#0080ff);border:none;border-radius:8px;color:#fff;font-family:'Orbitron',sans-serif;font-size:12px;font-weight:700;letter-spacing:.08em;padding:11px 28px;cursor:pointer;transition:opacity .2s}.p-btn:hover{opacity:.85}
14
+ </style>
@@ -0,0 +1,14 @@
1
+ <script setup lang="ts">
2
+ const emit = defineEmits<{ close: [] }>()
3
+ </script>
4
+ <template>
5
+ <div class="p-shell">
6
+ <div class="p-icon">💎</div>
7
+ <h2 class="p-title">Ethereum Provider</h2>
8
+ <p class="p-body">Ethereum blockchain integration with the OASIS — enabling smart contracts, NFTs, DeFi and decentralised identity across the Ethereum network and L2 chains.</p>
9
+ <button class="p-btn" @click="emit('close')">OK</button>
10
+ </div>
11
+ </template>
12
+ <style scoped>
13
+ .p-shell{display:flex;flex-direction:column;align-items:center;gap:16px;padding:32px 20px;text-align:center}.p-icon{font-size:44px}.p-title{font-family:'Orbitron',sans-serif;font-size:18px;color:#fff;margin:0}.p-body{font-size:14px;color:#a8bfd8;line-height:1.6;margin:0;max-width:360px}.p-btn{background:linear-gradient(135deg,#00c8ff,#0080ff);border:none;border-radius:8px;color:#fff;font-family:'Orbitron',sans-serif;font-size:12px;font-weight:700;letter-spacing:.08em;padding:11px 28px;cursor:pointer;transition:opacity .2s}.p-btn:hover{opacity:.85}
14
+ </style>
@@ -0,0 +1,14 @@
1
+ <script setup lang="ts">
2
+ const emit = defineEmits<{ close: [] }>()
3
+ </script>
4
+ <template>
5
+ <div class="p-shell">
6
+ <div class="p-icon">🔮</div>
7
+ <h2 class="p-title">Holochain Provider</h2>
8
+ <p class="p-body">Holochain is the primary OASIS provider — a truly peer-to-peer distributed computing platform with agent-centric architecture and no global consensus bottleneck.</p>
9
+ <button class="p-btn" @click="emit('close')">OK</button>
10
+ </div>
11
+ </template>
12
+ <style scoped>
13
+ .p-shell{display:flex;flex-direction:column;align-items:center;gap:16px;padding:32px 20px;text-align:center}.p-icon{font-size:44px}.p-title{font-family:'Orbitron',sans-serif;font-size:18px;color:#fff;margin:0}.p-body{font-size:14px;color:#a8bfd8;line-height:1.6;margin:0;max-width:360px}.p-btn{background:linear-gradient(135deg,#00c8ff,#0080ff);border:none;border-radius:8px;color:#fff;font-family:'Orbitron',sans-serif;font-size:12px;font-weight:700;letter-spacing:.08em;padding:11px 28px;cursor:pointer;transition:opacity .2s}.p-btn:hover{opacity:.85}
14
+ </style>
@@ -0,0 +1,14 @@
1
+ <script setup lang="ts">
2
+ const emit = defineEmits<{ close: [] }>()
3
+ </script>
4
+ <template>
5
+ <div class="p-shell">
6
+ <div class="p-icon">📁</div>
7
+ <h2 class="p-title">IPFS Provider</h2>
8
+ <p class="p-body">IPFS (InterPlanetary File System) integration with the OASIS — decentralised content-addressed file storage for avatars, OAPPs, NFT media, and map assets.</p>
9
+ <button class="p-btn" @click="emit('close')">OK</button>
10
+ </div>
11
+ </template>
12
+ <style scoped>
13
+ .p-shell{display:flex;flex-direction:column;align-items:center;gap:16px;padding:32px 20px;text-align:center}.p-icon{font-size:44px}.p-title{font-family:'Orbitron',sans-serif;font-size:18px;color:#fff;margin:0}.p-body{font-size:14px;color:#a8bfd8;line-height:1.6;margin:0;max-width:360px}.p-btn{background:linear-gradient(135deg,#00c8ff,#0080ff);border:none;border-radius:8px;color:#fff;font-family:'Orbitron',sans-serif;font-size:12px;font-weight:700;letter-spacing:.08em;padding:11px 28px;cursor:pointer;transition:opacity .2s}.p-btn:hover{opacity:.85}
14
+ </style>
@@ -0,0 +1,14 @@
1
+ <script setup lang="ts">
2
+ const emit = defineEmits<{ close: [] }>()
3
+ </script>
4
+ <template>
5
+ <div class="p-shell">
6
+ <div class="p-icon">🔄</div>
7
+ <h2 class="p-title">Manage Auto Fail-Over</h2>
8
+ <p class="p-body">Auto fail-over configuration is coming soon — automatically switch to backup providers when your primary provider becomes unavailable, ensuring zero-downtime for your OASIS data.</p>
9
+ <button class="p-btn" @click="emit('close')">OK</button>
10
+ </div>
11
+ </template>
12
+ <style scoped>
13
+ .p-shell{display:flex;flex-direction:column;align-items:center;gap:16px;padding:32px 20px;text-align:center}.p-icon{font-size:44px}.p-title{font-family:'Orbitron',sans-serif;font-size:18px;color:#fff;margin:0}.p-body{font-size:14px;color:#a8bfd8;line-height:1.6;margin:0;max-width:360px}.p-btn{background:linear-gradient(135deg,#00c8ff,#0080ff);border:none;border-radius:8px;color:#fff;font-family:'Orbitron',sans-serif;font-size:12px;font-weight:700;letter-spacing:.08em;padding:11px 28px;cursor:pointer;transition:opacity .2s}.p-btn:hover{opacity:.85}
14
+ </style>
@@ -0,0 +1,14 @@
1
+ <script setup lang="ts">
2
+ const emit = defineEmits<{ close: [] }>()
3
+ </script>
4
+ <template>
5
+ <div class="p-shell">
6
+ <div class="p-icon">📋</div>
7
+ <h2 class="p-title">Manage Auto Replication</h2>
8
+ <p class="p-body">Auto replication settings are coming soon — mirror your OASIS data across multiple providers simultaneously for redundancy and increased resilience.</p>
9
+ <button class="p-btn" @click="emit('close')">OK</button>
10
+ </div>
11
+ </template>
12
+ <style scoped>
13
+ .p-shell{display:flex;flex-direction:column;align-items:center;gap:16px;padding:32px 20px;text-align:center}.p-icon{font-size:44px}.p-title{font-family:'Orbitron',sans-serif;font-size:18px;color:#fff;margin:0}.p-body{font-size:14px;color:#a8bfd8;line-height:1.6;margin:0;max-width:360px}.p-btn{background:linear-gradient(135deg,#00c8ff,#0080ff);border:none;border-radius:8px;color:#fff;font-family:'Orbitron',sans-serif;font-size:12px;font-weight:700;letter-spacing:.08em;padding:11px 28px;cursor:pointer;transition:opacity .2s}.p-btn:hover{opacity:.85}
14
+ </style>
@@ -0,0 +1,14 @@
1
+ <script setup lang="ts">
2
+ const emit = defineEmits<{ close: [] }>()
3
+ </script>
4
+ <template>
5
+ <div class="p-shell">
6
+ <div class="p-icon">⚖️</div>
7
+ <h2 class="p-title">Manage Load Balancing</h2>
8
+ <p class="p-body">Load balancing configuration is coming soon — distribute read and write operations intelligently across your active OASIS providers for optimal performance.</p>
9
+ <button class="p-btn" @click="emit('close')">OK</button>
10
+ </div>
11
+ </template>
12
+ <style scoped>
13
+ .p-shell{display:flex;flex-direction:column;align-items:center;gap:16px;padding:32px 20px;text-align:center}.p-icon{font-size:44px}.p-title{font-family:'Orbitron',sans-serif;font-size:18px;color:#fff;margin:0}.p-body{font-size:14px;color:#a8bfd8;line-height:1.6;margin:0;max-width:360px}.p-btn{background:linear-gradient(135deg,#00c8ff,#0080ff);border:none;border-radius:8px;color:#fff;font-family:'Orbitron',sans-serif;font-size:12px;font-weight:700;letter-spacing:.08em;padding:11px 28px;cursor:pointer;transition:opacity .2s}.p-btn:hover{opacity:.85}
14
+ </style>
@@ -0,0 +1,27 @@
1
+ <script setup lang="ts">
2
+ const emit = defineEmits<{ close: [] }>()
3
+ const providers = [
4
+ { name: 'Holochain', status: 'Active', type: 'P2P', priority: 1 },
5
+ { name: 'MongoDB', status: 'Active', type: 'Database', priority: 2 },
6
+ { name: 'IPFS', status: 'Standby', type: 'File', priority: 3 },
7
+ { name: 'Ethereum', status: 'Inactive', type: 'Blockchain', priority: 4 },
8
+ ]
9
+ </script>
10
+ <template>
11
+ <div class="p-shell">
12
+ <h2 class="p-title">⚙️ Manage Providers</h2>
13
+ <div class="p-list">
14
+ <div v-for="p in providers" :key="p.name" class="p-item">
15
+ <div class="p-item-info">
16
+ <span class="p-item-name">{{ p.name }}</span>
17
+ <span class="p-item-type">{{ p.type }} · Priority {{ p.priority }}</span>
18
+ </div>
19
+ <span class="p-status" :class="`p-status--${p.status.toLowerCase()}`">{{ p.status }}</span>
20
+ </div>
21
+ </div>
22
+ <button class="p-btn" @click="emit('close')">Close</button>
23
+ </div>
24
+ </template>
25
+ <style scoped>
26
+ .p-shell{display:flex;flex-direction:column;gap:18px;padding:24px 20px}.p-title{font-family:'Orbitron',sans-serif;font-size:18px;color:#fff;margin:0}.p-list{display:flex;flex-direction:column;gap:8px}.p-item{display:flex;align-items:center;justify-content:space-between;background:rgba(255,255,255,.04);border:1px solid rgba(0,200,255,.12);border-radius:10px;padding:12px 14px}.p-item-info{display:flex;flex-direction:column;gap:3px}.p-item-name{font-family:'Orbitron',sans-serif;font-size:13px;color:#fff;font-weight:700}.p-item-type{font-size:11px;color:#7a9bbf}.p-status{font-size:11px;font-weight:700;letter-spacing:.06em;border-radius:999px;padding:3px 10px;border:1px solid currentColor;text-transform:uppercase}.p-status--active{color:#00e676}.p-status--standby{color:#ffb43c}.p-status--inactive{color:#5a7a9a}.p-btn{align-self:flex-end;background:linear-gradient(135deg,#00c8ff,#0080ff);border:none;border-radius:8px;color:#fff;font-family:'Orbitron',sans-serif;font-size:12px;font-weight:700;letter-spacing:.08em;padding:10px 24px;cursor:pointer;transition:opacity .2s}.p-btn:hover{opacity:.85}
27
+ </style>
@@ -0,0 +1,14 @@
1
+ <script setup lang="ts">
2
+ const emit = defineEmits<{ close: [] }>()
3
+ </script>
4
+ <template>
5
+ <div class="p-shell">
6
+ <div class="p-icon">🍃</div>
7
+ <h2 class="p-title">MongoDB Provider</h2>
8
+ <p class="p-body">MongoDB integration with the OASIS — a flexible NoSQL database provider for storing avatar data, OAPPs, quests and off-chain OASIS state.</p>
9
+ <button class="p-btn" @click="emit('close')">OK</button>
10
+ </div>
11
+ </template>
12
+ <style scoped>
13
+ .p-shell{display:flex;flex-direction:column;align-items:center;gap:16px;padding:32px 20px;text-align:center}.p-icon{font-size:44px}.p-title{font-family:'Orbitron',sans-serif;font-size:18px;color:#fff;margin:0}.p-body{font-size:14px;color:#a8bfd8;line-height:1.6;margin:0;max-width:360px}.p-btn{background:linear-gradient(135deg,#00c8ff,#0080ff);border:none;border-radius:8px;color:#fff;font-family:'Orbitron',sans-serif;font-size:12px;font-weight:700;letter-spacing:.08em;padding:11px 28px;cursor:pointer;transition:opacity .2s}.p-btn:hover{opacity:.85}
14
+ </style>
@@ -0,0 +1,14 @@
1
+ <script setup lang="ts">
2
+ const emit = defineEmits<{ close: [] }>()
3
+ </script>
4
+ <template>
5
+ <div class="p-shell">
6
+ <div class="p-icon">🕸️</div>
7
+ <h2 class="p-title">Neo4j Provider</h2>
8
+ <p class="p-body">Neo4j graph database integration with the OASIS — enabling complex relationship queries across avatars, quests, OAPPs and social connections.</p>
9
+ <button class="p-btn" @click="emit('close')">OK</button>
10
+ </div>
11
+ </template>
12
+ <style scoped>
13
+ .p-shell{display:flex;flex-direction:column;align-items:center;gap:16px;padding:32px 20px;text-align:center}.p-icon{font-size:44px}.p-title{font-family:'Orbitron',sans-serif;font-size:18px;color:#fff;margin:0}.p-body{font-size:14px;color:#a8bfd8;line-height:1.6;margin:0;max-width:360px}.p-btn{background:linear-gradient(135deg,#00c8ff,#0080ff);border:none;border-radius:8px;color:#fff;font-family:'Orbitron',sans-serif;font-size:12px;font-weight:700;letter-spacing:.08em;padding:11px 28px;cursor:pointer;transition:opacity .2s}.p-btn:hover{opacity:.85}
14
+ </style>
@@ -0,0 +1,24 @@
1
+ <script setup lang="ts">
2
+ import { ref } from 'vue'
3
+ const emit = defineEmits<{ close: []; submit: [{ query: string; type: string }] }>()
4
+ const form = ref({ query: '', type: 'All' })
5
+ function handleSubmit() { emit('submit', { ...form.value }) }
6
+ </script>
7
+ <template>
8
+ <div class="p-shell">
9
+ <h2 class="p-title">🔍 Search Providers</h2>
10
+ <form class="p-form" @submit.prevent="handleSubmit">
11
+ <div class="p-row"><label class="p-label">Provider Name</label><input class="p-input" v-model="form.query" placeholder="Search providers..." /></div>
12
+ <div class="p-row">
13
+ <label class="p-label">Type</label>
14
+ <select class="p-input" v-model="form.type">
15
+ <option>All</option><option>Blockchain</option><option>Database</option><option>P2P</option><option>File Storage</option><option>Social</option>
16
+ </select>
17
+ </div>
18
+ <div class="p-actions"><button class="p-btn-cancel" type="button" @click="emit('close')">Cancel</button><button class="p-btn" type="submit">Search</button></div>
19
+ </form>
20
+ </div>
21
+ </template>
22
+ <style scoped>
23
+ .p-shell{display:flex;flex-direction:column;gap:20px;padding:24px 20px}.p-title{font-family:'Orbitron',sans-serif;font-size:18px;color:#fff;margin:0}.p-form{display:flex;flex-direction:column;gap:14px}.p-row{display:flex;flex-direction:column;gap:6px}.p-label{font-size:12px;color:#7a9bbf;font-weight:600;letter-spacing:.05em}.p-input{background:rgba(255,255,255,.06);border:1px solid rgba(0,200,255,.2);border-radius:8px;color:#fff;font-size:14px;padding:10px 12px;width:100%;box-sizing:border-box;outline:none;transition:border-color .2s}.p-input:focus{border-color:rgba(0,200,255,.5)}.p-actions{display:flex;gap:10px;justify-content:flex-end;margin-top:4px}.p-btn{background:linear-gradient(135deg,#00c8ff,#0080ff);border:none;border-radius:8px;color:#fff;font-family:'Orbitron',sans-serif;font-size:12px;font-weight:700;letter-spacing:.08em;padding:10px 24px;cursor:pointer;transition:opacity .2s}.p-btn:hover{opacity:.85}.p-btn-cancel{background:transparent;border:1px solid rgba(0,200,255,.3);border-radius:8px;color:#00c8ff;font-family:'Orbitron',sans-serif;font-size:12px;font-weight:700;letter-spacing:.08em;padding:10px 24px;cursor:pointer}
24
+ </style>
@@ -0,0 +1,14 @@
1
+ <script setup lang="ts">
2
+ const emit = defineEmits<{ close: [] }>()
3
+ </script>
4
+ <template>
5
+ <div class="p-shell">
6
+ <div class="p-icon">🌱</div>
7
+ <h2 class="p-title">SEEDS Provider</h2>
8
+ <p class="p-body">SEEDS blockchain integration with the OASIS — a regenerative currency and governance system for a thriving civilisation. Connect your SEEDS account to send and receive SEEDS tokens.</p>
9
+ <button class="p-btn" @click="emit('close')">OK</button>
10
+ </div>
11
+ </template>
12
+ <style scoped>
13
+ .p-shell{display:flex;flex-direction:column;align-items:center;gap:16px;padding:32px 20px;text-align:center}.p-icon{font-size:44px}.p-title{font-family:'Orbitron',sans-serif;font-size:18px;color:#fff;margin:0}.p-body{font-size:14px;color:#a8bfd8;line-height:1.6;margin:0;max-width:360px}.p-btn{background:linear-gradient(135deg,#00c8ff,#0080ff);border:none;border-radius:8px;color:#fff;font-family:'Orbitron',sans-serif;font-size:12px;font-weight:700;letter-spacing:.08em;padding:11px 28px;cursor:pointer;transition:opacity .2s}.p-btn:hover{opacity:.85}
14
+ </style>
@@ -0,0 +1,14 @@
1
+ <script setup lang="ts">
2
+ const emit = defineEmits<{ close: [] }>()
3
+ </script>
4
+ <template>
5
+ <div class="p-shell">
6
+ <div class="p-icon">💠</div>
7
+ <h2 class="p-title">Solid Provider</h2>
8
+ <p class="p-body">Solid (Social Linked Data) integration with the OASIS — enabling personal data pods where users own and control their own data, interoperable with any Solid-compatible application.</p>
9
+ <button class="p-btn" @click="emit('close')">OK</button>
10
+ </div>
11
+ </template>
12
+ <style scoped>
13
+ .p-shell{display:flex;flex-direction:column;align-items:center;gap:16px;padding:32px 20px;text-align:center}.p-icon{font-size:44px}.p-title{font-family:'Orbitron',sans-serif;font-size:18px;color:#fff;margin:0}.p-body{font-size:14px;color:#a8bfd8;line-height:1.6;margin:0;max-width:360px}.p-btn{background:linear-gradient(135deg,#00c8ff,#0080ff);border:none;border-radius:8px;color:#fff;font-family:'Orbitron',sans-serif;font-size:12px;font-weight:700;letter-spacing:.08em;padding:11px 28px;cursor:pointer;transition:opacity .2s}.p-btn:hover{opacity:.85}
14
+ </style>
@@ -0,0 +1,14 @@
1
+ <script setup lang="ts">
2
+ const emit = defineEmits<{ close: [] }>()
3
+ </script>
4
+ <template>
5
+ <div class="p-shell">
6
+ <div class="p-icon">🗄️</div>
7
+ <h2 class="p-title">SQLite Provider</h2>
8
+ <p class="p-body">SQLite integration with the OASIS — a lightweight local database provider for offline and edge-device OASIS deployments with full SQL query support.</p>
9
+ <button class="p-btn" @click="emit('close')">OK</button>
10
+ </div>
11
+ </template>
12
+ <style scoped>
13
+ .p-shell{display:flex;flex-direction:column;align-items:center;gap:16px;padding:32px 20px;text-align:center}.p-icon{font-size:44px}.p-title{font-family:'Orbitron',sans-serif;font-size:18px;color:#fff;margin:0}.p-body{font-size:14px;color:#a8bfd8;line-height:1.6;margin:0;max-width:360px}.p-btn{background:linear-gradient(135deg,#00c8ff,#0080ff);border:none;border-radius:8px;color:#fff;font-family:'Orbitron',sans-serif;font-size:12px;font-weight:700;letter-spacing:.08em;padding:11px 28px;cursor:pointer;transition:opacity .2s}.p-btn:hover{opacity:.85}
14
+ </style>
@@ -0,0 +1,14 @@
1
+ <script setup lang="ts">
2
+ const emit = defineEmits<{ close: [] }>()
3
+ </script>
4
+ <template>
5
+ <div class="p-shell">
6
+ <div class="p-icon">♾️</div>
7
+ <h2 class="p-title">ThreeFold Provider</h2>
8
+ <p class="p-body">ThreeFold integration with the OASIS — a decentralised cloud infrastructure provider offering peer-to-peer compute, storage and networking built on the ThreeFold grid.</p>
9
+ <button class="p-btn" @click="emit('close')">OK</button>
10
+ </div>
11
+ </template>
12
+ <style scoped>
13
+ .p-shell{display:flex;flex-direction:column;align-items:center;gap:16px;padding:32px 20px;text-align:center}.p-icon{font-size:44px}.p-title{font-family:'Orbitron',sans-serif;font-size:18px;color:#fff;margin:0}.p-body{font-size:14px;color:#a8bfd8;line-height:1.6;margin:0;max-width:360px}.p-btn{background:linear-gradient(135deg,#00c8ff,#0080ff);border:none;border-radius:8px;color:#fff;font-family:'Orbitron',sans-serif;font-size:12px;font-weight:700;letter-spacing:.08em;padding:11px 28px;cursor:pointer;transition:opacity .2s}.p-btn:hover{opacity:.85}
14
+ </style>
@@ -0,0 +1,27 @@
1
+ <script setup lang="ts">
2
+ defineProps<{ providerName?: string }>()
3
+ const emit = defineEmits<{ close: [] }>()
4
+ const stats = [
5
+ { label: 'Total Reads', value: '1,248,530' },
6
+ { label: 'Total Writes', value: '524,120' },
7
+ { label: 'Avg Response', value: '12ms' },
8
+ { label: 'Uptime', value: '99.97%' },
9
+ { label: 'Data Stored', value: '14.2 GB' },
10
+ { label: 'Active Connections', value: '342' },
11
+ ]
12
+ </script>
13
+ <template>
14
+ <div class="p-shell">
15
+ <h2 class="p-title">📊 {{ providerName ?? 'Provider' }} Stats</h2>
16
+ <div class="p-grid">
17
+ <div v-for="s in stats" :key="s.label" class="p-stat">
18
+ <span class="p-stat-label">{{ s.label }}</span>
19
+ <span class="p-stat-value">{{ s.value }}</span>
20
+ </div>
21
+ </div>
22
+ <button class="p-btn" @click="emit('close')">Close</button>
23
+ </div>
24
+ </template>
25
+ <style scoped>
26
+ .p-shell{display:flex;flex-direction:column;gap:18px;padding:24px 20px}.p-title{font-family:'Orbitron',sans-serif;font-size:18px;color:#fff;margin:0}.p-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px}.p-stat{background:rgba(0,200,255,.04);border:1px solid rgba(0,200,255,.12);border-radius:10px;padding:14px;display:flex;flex-direction:column;gap:6px}.p-stat-label{font-size:11px;color:#7a9bbf;font-weight:600;letter-spacing:.06em;text-transform:uppercase}.p-stat-value{font-family:'Orbitron',sans-serif;font-size:18px;color:#fff;font-weight:700}.p-btn{align-self:flex-end;background:linear-gradient(135deg,#00c8ff,#0080ff);border:none;border-radius:8px;color:#fff;font-family:'Orbitron',sans-serif;font-size:12px;font-weight:700;letter-spacing:.08em;padding:10px 24px;cursor:pointer;transition:opacity .2s}.p-btn:hover{opacity:.85}
27
+ </style>
@@ -0,0 +1,30 @@
1
+ <script setup lang="ts">
2
+ const emit = defineEmits<{ close: [] }>()
3
+ const providers = [
4
+ { name: 'Holochain', type: 'P2P', status: 'Active', icon: '🔮' },
5
+ { name: 'MongoDB', type: 'Database', status: 'Active', icon: '🍃' },
6
+ { name: 'IPFS', type: 'File', status: 'Active', icon: '📁' },
7
+ { name: 'Ethereum', type: 'Blockchain', status: 'Inactive', icon: '💎' },
8
+ { name: 'Neo4j', type: 'Graph DB', status: 'Active', icon: '🕸️' },
9
+ { name: 'SQLite', type: 'Local DB', status: 'Active', icon: '🗄️' },
10
+ { name: 'SEEDS', type: 'Blockchain', status: 'Inactive', icon: '🌱' },
11
+ { name: 'Solid', type: 'Data Pod', status: 'Standby', icon: '💠' },
12
+ ]
13
+ </script>
14
+ <template>
15
+ <div class="p-shell">
16
+ <h2 class="p-title">🔌 All Providers</h2>
17
+ <div class="p-grid">
18
+ <div v-for="p in providers" :key="p.name" class="p-card">
19
+ <span class="p-card-icon">{{ p.icon }}</span>
20
+ <span class="p-card-name">{{ p.name }}</span>
21
+ <span class="p-card-type">{{ p.type }}</span>
22
+ <span class="p-status" :class="`p-status--${p.status.toLowerCase()}`">{{ p.status }}</span>
23
+ </div>
24
+ </div>
25
+ <button class="p-btn" @click="emit('close')">Close</button>
26
+ </div>
27
+ </template>
28
+ <style scoped>
29
+ .p-shell{display:flex;flex-direction:column;gap:18px;padding:24px 20px}.p-title{font-family:'Orbitron',sans-serif;font-size:18px;color:#fff;margin:0}.p-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:10px}.p-card{background:rgba(255,255,255,.04);border:1px solid rgba(0,200,255,.12);border-radius:10px;padding:14px 10px;display:flex;flex-direction:column;align-items:center;gap:6px;text-align:center}.p-card-icon{font-size:24px}.p-card-name{font-family:'Orbitron',sans-serif;font-size:11px;color:#fff;font-weight:700}.p-card-type{font-size:10px;color:#7a9bbf}.p-status{font-size:10px;font-weight:700;letter-spacing:.06em;border-radius:999px;padding:3px 8px;border:1px solid currentColor;text-transform:uppercase}.p-status--active{color:#00e676}.p-status--standby{color:#ffb43c}.p-status--inactive{color:#5a7a9a}.p-btn{align-self:flex-end;background:linear-gradient(135deg,#00c8ff,#0080ff);border:none;border-radius:8px;color:#fff;font-family:'Orbitron',sans-serif;font-size:12px;font-weight:700;letter-spacing:.08em;padding:10px 24px;cursor:pointer;transition:opacity .2s}.p-btn:hover{opacity:.85}
30
+ </style>
@@ -0,0 +1,34 @@
1
+ <script setup lang="ts">
2
+ import { ref } from 'vue'
3
+ interface Provider { id: string; name: string; icon: string; color: string }
4
+ const emit = defineEmits<{ providerChange: [p: Provider] }>()
5
+ const providers: Provider[] = [
6
+ { id: 'ethereum', name: 'Ethereum', icon: '⟠', color: '#627eea' },
7
+ { id: 'solana', name: 'Solana', icon: '◎', color: '#9945ff' },
8
+ { id: 'polygon', name: 'Polygon', icon: '⬡', color: '#8247e5' },
9
+ { id: 'arbitrum', name: 'Arbitrum', icon: '🔵', color: '#2d9cdb' },
10
+ { id: 'eosio', name: 'EOSIO', icon: '🔮', color: '#443f54' },
11
+ { id: 'holochain', name: 'Holochain', icon: '⬡', color: '#00e5be' },
12
+ ]
13
+ const open = ref(false)
14
+ const selected = ref<Provider>(providers[0])
15
+ function select(p: Provider) { selected.value = p; open.value = false; emit('providerChange', p) }
16
+ </script>
17
+ <template>
18
+ <div class="pd-shell">
19
+ <div class="pd-trigger" :class="{ 'pd-trigger--open': open }" @click="open = !open">
20
+ <div class="pd-icon" :style="{ color: selected.color }">{{ selected.icon }}</div>
21
+ <div class="pd-label"><div class="pd-name">{{ selected.name }}</div><div class="pd-sub">Active Provider</div></div>
22
+ <div class="pd-arrow" :class="{ 'pd-arrow--open': open }">▼</div>
23
+ </div>
24
+ <div v-if="open" class="pd-menu">
25
+ <div v-for="p in providers" :key="p.id" class="pd-option" :class="{ 'pd-option--selected': p.id === selected.id }" @click="select(p)">
26
+ <div class="pd-opt-icon" :style="{ color: p.color }">{{ p.icon }}</div>
27
+ <div class="pd-opt-name">{{ p.name }}</div>
28
+ </div>
29
+ </div>
30
+ </div>
31
+ </template>
32
+ <style scoped>
33
+ .pd-shell{position:relative}.pd-trigger{display:flex;align-items:center;gap:10px;background:rgba(255,255,255,.05);border:1px solid rgba(0,200,255,.25);border-radius:10px;padding:10px 14px;cursor:pointer;transition:border-color .2s;color:#fff}.pd-trigger:hover,.pd-trigger--open{border-color:rgba(0,200,255,.5)}.pd-icon{font-size:20px;width:28px;text-align:center}.pd-label{flex:1}.pd-name{font-family:'Orbitron',sans-serif;font-size:13px;font-weight:700;color:#fff}.pd-sub{font-size:11px;color:#7a9bbf;margin-top:2px}.pd-arrow{font-size:10px;color:#7a9bbf;transition:transform .2s}.pd-arrow--open{transform:rotate(180deg)}.pd-menu{position:absolute;top:calc(100% + 6px);left:0;right:0;background:#0d1b2e;border:1px solid rgba(0,200,255,.2);border-radius:10px;overflow:hidden;z-index:100;box-shadow:0 8px 32px rgba(0,0,0,.5)}.pd-option{display:flex;align-items:center;gap:10px;padding:10px 14px;cursor:pointer;transition:background .15s;color:#e0f0ff}.pd-option:hover{background:rgba(0,200,255,.1)}.pd-option--selected{background:rgba(0,200,255,.12);border-left:3px solid #00c8ff}.pd-opt-icon{font-size:18px;width:24px;text-align:center}.pd-opt-name{font-family:'Orbitron',sans-serif;font-size:12px;font-weight:700}
34
+ </style>
@@ -0,0 +1,30 @@
1
+ <script setup lang="ts">
2
+ import { ref } from 'vue'
3
+ interface Provider { id: string; name: string; icon: string; color: string; type: string; connected: boolean; description: string }
4
+ const providers = ref<Provider[]>([
5
+ { id: '1', name: 'Ethereum', icon: '⟠', color: '#627eea', type: 'Blockchain', description: 'Connect your Ethereum wallet (MetaMask, WalletConnect).', connected: false },
6
+ { id: '2', name: 'Solana', icon: '◎', color: '#9945ff', type: 'Blockchain', description: 'Connect your Solana wallet (Phantom, Solflare).', connected: false },
7
+ { id: '3', name: 'EOSIO', icon: '🔮', color: '#443f54', type: 'Blockchain', description: 'Connect via EOSIO for high-speed transactions.', connected: false },
8
+ { id: '4', name: 'Holochain', icon: '⬡', color: '#00e5be', type: 'P2P Network', description: 'Peer-to-peer data storage on Holochain.', connected: false },
9
+ { id: '5', name: 'The Graph', icon: '📊', color: '#6f4cff', type: 'Indexer', description: 'Query blockchain data with The Graph protocol.', connected: false },
10
+ ])
11
+ function toggle(p: Provider) { p.connected = !p.connected }
12
+ </script>
13
+ <template>
14
+ <div class="prov-shell">
15
+ <div class="prov-header"><h2 class="prov-title">🔗 Providers</h2><p class="prov-sub">Connect blockchain providers to your OASIS avatar.</p></div>
16
+ <div class="prov-list">
17
+ <div v-for="p in providers" :key="p.id" class="prov-card" :class="{ 'prov-card--connected': p.connected }">
18
+ <div class="prov-icon" :style="{ color: p.color }">{{ p.icon }}</div>
19
+ <div class="prov-info"><div class="prov-name">{{ p.name }}</div><div class="prov-type">{{ p.type }}</div><div class="prov-desc">{{ p.description }}</div></div>
20
+ <div class="prov-actions">
21
+ <div class="prov-status-dot" :class="{ 'prov-status-dot--on': p.connected }"></div>
22
+ <button class="prov-btn" :class="{ 'prov-btn--disconnect': p.connected }" @click="toggle(p)">{{ p.connected ? 'Disconnect' : 'Connect' }}</button>
23
+ </div>
24
+ </div>
25
+ </div>
26
+ </div>
27
+ </template>
28
+ <style scoped>
29
+ .prov-shell{display:flex;flex-direction:column;gap:18px}.prov-header{text-align:center}.prov-title{font-family:'Orbitron',sans-serif;font-size:20px;color:#fff;margin:0 0 6px}.prov-sub{font-size:13px;color:#7a9bbf;margin:0}.prov-list{display:flex;flex-direction:column;gap:10px}.prov-card{display:flex;align-items:center;gap:14px;background:rgba(255,255,255,.04);border:1px solid rgba(0,200,255,.12);border-radius:12px;padding:14px 16px;transition:border-color .2s}.prov-card--connected{border-color:rgba(72,220,130,.3);background:rgba(72,220,130,.03)}.prov-icon{font-size:26px;flex-shrink:0}.prov-info{flex:1}.prov-name{font-family:'Orbitron',sans-serif;font-size:13px;color:#fff;margin-bottom:2px}.prov-type{font-size:11px;color:#5ba8ff;text-transform:uppercase;letter-spacing:.06em;margin-bottom:4px}.prov-desc{font-size:12px;color:#7a9bbf}.prov-actions{display:flex;flex-direction:column;align-items:center;gap:8px;flex-shrink:0}.prov-status-dot{width:8px;height:8px;border-radius:50%;background:#4a6a88}.prov-status-dot--on{background:#48dc82;box-shadow:0 0 6px #48dc82}.prov-btn{background:linear-gradient(135deg,#00c8ff,#0080ff);border:none;border-radius:7px;color:#fff;font-family:'Orbitron',sans-serif;font-size:10px;font-weight:700;letter-spacing:.06em;padding:7px 14px;cursor:pointer;white-space:nowrap}.prov-btn--disconnect{background:rgba(255,80,80,.15);border:1px solid rgba(255,80,80,.3);color:#ff6b6b}
30
+ </style>
@@ -0,0 +1,14 @@
1
+ <script setup lang="ts">
2
+ const emit = defineEmits<{ close: [] }>()
3
+ </script>
4
+ <template>
5
+ <div class="p-shell">
6
+ <div class="p-icon">⚔️</div>
7
+ <h2 class="p-title">Manage Quest</h2>
8
+ <p class="p-body">Quest management tools are coming soon — create, edit, assign objectives and track completions for your OASIS quests across all providers.</p>
9
+ <button class="p-btn" @click="emit('close')">OK</button>
10
+ </div>
11
+ </template>
12
+ <style scoped>
13
+ .p-shell{display:flex;flex-direction:column;align-items:center;gap:16px;padding:32px 20px;text-align:center}.p-icon{font-size:44px}.p-title{font-family:'Orbitron',sans-serif;font-size:18px;color:#fff;margin:0}.p-body{font-size:14px;color:#a8bfd8;line-height:1.6;margin:0;max-width:360px}.p-btn{background:linear-gradient(135deg,#00c8ff,#0080ff);border:none;border-radius:8px;color:#fff;font-family:'Orbitron',sans-serif;font-size:12px;font-weight:700;letter-spacing:.08em;padding:11px 28px;cursor:pointer;transition:opacity .2s}.p-btn:hover{opacity:.85}
14
+ </style>
@@ -0,0 +1,35 @@
1
+ <script setup lang="ts">
2
+ import { ref } from 'vue'
3
+ interface Quest { id: string; title: string; description: string; reward: number; difficulty: string; accepted: boolean; completed: boolean }
4
+ const quests = ref<Quest[]>([
5
+ { id: '1', title: 'Avatar Awakening', description: 'Complete your avatar profile and connect your first provider.', reward: 200, difficulty: 'Easy', accepted: true, completed: true },
6
+ { id: '2', title: 'Karma Seeker', description: 'Earn 1000 karma through good deeds and OASIS contributions.', reward: 500, difficulty: 'Medium', accepted: true, completed: false },
7
+ { id: '3', title: 'The NFT Collector', description: 'Acquire 5 unique NFTs across different categories.', reward: 1000, difficulty: 'Hard', accepted: false, completed: false },
8
+ { id: '4', title: 'Omniverse Explorer', description: 'Visit every major hub location on the OASIS map.', reward: 2500, difficulty: 'Legendary', accepted: false, completed: false },
9
+ ])
10
+ function accept(q: Quest) { q.accepted = true }
11
+ function complete(q: Quest) { q.completed = true }
12
+ </script>
13
+ <template>
14
+ <div class="qst-shell">
15
+ <div class="qst-header"><h2 class="qst-title">⚔️ Quests</h2><p class="qst-sub">Embark on quests to gain karma and rare rewards.</p></div>
16
+ <div class="qst-list">
17
+ <div v-for="q in quests" :key="q.id" class="qst-card" :class="{ 'qst-card--active': q.accepted && !q.completed, 'qst-card--done': q.completed }">
18
+ <div class="qst-diff" :class="`qst-diff--${q.difficulty.toLowerCase()}`">{{ q.difficulty }}</div>
19
+ <div class="qst-body">
20
+ <div class="qst-title-text">{{ q.title }}</div>
21
+ <div class="qst-desc">{{ q.description }}</div>
22
+ <div class="qst-reward">+{{ q.reward }} karma</div>
23
+ </div>
24
+ <div class="qst-actions">
25
+ <div v-if="q.completed" class="qst-done">✅ Done</div>
26
+ <button v-else-if="!q.accepted" class="qst-btn" @click="accept(q)">Accept Quest</button>
27
+ <button v-else class="qst-btn qst-btn--finish" @click="complete(q)">Finish</button>
28
+ </div>
29
+ </div>
30
+ </div>
31
+ </div>
32
+ </template>
33
+ <style scoped>
34
+ .qst-shell{display:flex;flex-direction:column;gap:18px}.qst-header{text-align:center}.qst-title{font-family:'Orbitron',sans-serif;font-size:20px;color:#fff;margin:0 0 6px}.qst-sub{font-size:13px;color:#7a9bbf;margin:0}.qst-list{display:flex;flex-direction:column;gap:12px}.qst-card{display:flex;gap:14px;align-items:flex-start;background:rgba(255,255,255,.04);border:1px solid rgba(0,200,255,.12);border-radius:12px;padding:16px;transition:border-color .2s}.qst-card--active{border-color:rgba(0,200,255,.4)}.qst-card--done{opacity:.6;border-color:rgba(72,220,130,.2)}.qst-diff{font-size:10px;font-weight:700;letter-spacing:.1em;text-transform:uppercase;border-radius:999px;padding:4px 10px;border:1px solid currentColor;white-space:nowrap;flex-shrink:0}.qst-diff--easy{color:#48dc82;border-color:rgba(72,220,130,.3)}.qst-diff--medium{color:#ffb43c;border-color:rgba(255,180,60,.3)}.qst-diff--hard{color:#ff6b6b;border-color:rgba(255,107,107,.3)}.qst-diff--legendary{color:#b87fff;border-color:rgba(184,127,255,.3)}.qst-body{flex:1}.qst-title-text{font-family:'Orbitron',sans-serif;font-size:13px;color:#fff;margin-bottom:4px}.qst-desc{font-size:12px;color:#7a9bbf;line-height:1.5;margin-bottom:6px}.qst-reward{font-size:12px;color:#48dc82;font-weight:600}.qst-actions{flex-shrink:0}.qst-btn{background:linear-gradient(135deg,#00c8ff,#0080ff);border:none;border-radius:7px;color:#fff;font-family:'Orbitron',sans-serif;font-size:11px;font-weight:700;letter-spacing:.08em;padding:8px 16px;cursor:pointer;white-space:nowrap}.qst-btn--finish{background:linear-gradient(135deg,#48dc82,#00aa55)}.qst-done{font-size:13px;color:#48dc82;font-weight:600}
35
+ </style>