@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.
- package/package.json +37 -0
- package/src/components/Avatar/AvatarWallet.vue +29 -0
- package/src/components/Avatar/EditAvatar.vue +21 -0
- package/src/components/Avatar/SearchAvatar.vue +24 -0
- package/src/components/Avatar/ViewAvatar.vue +19 -0
- package/src/components/AvatarConnect/AvatarConnect.vue +64 -0
- package/src/components/AvatarProfile/AvatarProfile.vue +123 -0
- package/src/components/ComingSoon/ComingSoon.vue +14 -0
- package/src/components/Confirmation/Confirmation.vue +18 -0
- package/src/components/Contact/Contact.vue +40 -0
- package/src/components/DataScreen/AddData.vue +26 -0
- package/src/components/DataScreen/CrossChainManagement.vue +14 -0
- package/src/components/DataScreen/LoadData.vue +24 -0
- package/src/components/DataScreen/ManageData.vue +14 -0
- package/src/components/DataScreen/OffChainManagement.vue +14 -0
- package/src/components/DataScreen/SearchData.vue +24 -0
- package/src/components/Eggs/Eggs.vue +40 -0
- package/src/components/Eggs/ManageEggs.vue +14 -0
- package/src/components/Eggs/SearchEggs.vue +24 -0
- package/src/components/Eggs/ViewEggs.vue +20 -0
- package/src/components/ForgotPassword/ForgotPassword.vue +71 -0
- package/src/components/Game/Game.vue +29 -0
- package/src/components/Game/SearchProfiles.vue +24 -0
- package/src/components/Game/ViewAchievements.vue +25 -0
- package/src/components/Game/ViewLeagues.vue +25 -0
- package/src/components/Game/ViewTournaments.vue +27 -0
- package/src/components/HyperDrive/HyperDrive.vue +46 -0
- package/src/components/Karma/SearchKarma.vue +24 -0
- package/src/components/Karma/ViewAvatarKarma.vue +20 -0
- package/src/components/Karma/ViewKarma.vue +30 -0
- package/src/components/Karma/VoteKarma.vue +26 -0
- package/src/components/KarmaPanel/KarmaPanel.vue +71 -0
- package/src/components/KarmaToast/KarmaToast.vue +29 -0
- package/src/components/Login/Login.vue +90 -0
- package/src/components/Map/Add2dObjectMap.vue +23 -0
- package/src/components/Map/Add3dObjectMap.vue +24 -0
- package/src/components/Map/AddQuestToMap.vue +22 -0
- package/src/components/Map/DownloadOurWorld.vue +18 -0
- package/src/components/Map/ManageMap.vue +14 -0
- package/src/components/Map/Map.vue +38 -0
- package/src/components/Map/PlotRouteOnMap.vue +25 -0
- package/src/components/Map/SearchMap.vue +24 -0
- package/src/components/Map/ViewGlobal3dMap.vue +14 -0
- package/src/components/Map/ViewHalonsOnMap.vue +27 -0
- package/src/components/Map/ViewOappOnMap.vue +14 -0
- package/src/components/Map/ViewQuestOnMap.vue +20 -0
- package/src/components/MenuMessage/MenuMessage.vue +72 -0
- package/src/components/Message/Message.vue +50 -0
- package/src/components/Messaging/Messaging.vue +44 -0
- package/src/components/Mission/ManageMission.vue +14 -0
- package/src/components/Mission/Mission.vue +32 -0
- package/src/components/Mission/SearchMission.vue +24 -0
- package/src/components/Mission/ViewMission.vue +21 -0
- package/src/components/NFT/ContactPopup.vue +36 -0
- package/src/components/NFT/ManageOasisNft.vue +14 -0
- package/src/components/NFT/NFT.vue +36 -0
- package/src/components/NFT/PurchaseOasisNft.vue +21 -0
- package/src/components/NFT/PurchaseOasisVirtualLandNft.vue +23 -0
- package/src/components/NFT/SearchOasisNft.vue +30 -0
- package/src/components/NFT/Solana.vue +27 -0
- package/src/components/NFT/ViewOasisNft.vue +20 -0
- package/src/components/NavBar/NavBar.vue +71 -0
- package/src/components/OApp/CreateOAPP.vue +31 -0
- package/src/components/OApp/DeployOAPP.vue +23 -0
- package/src/components/OApp/DownloadOurWorld.vue +18 -0
- package/src/components/OApp/EditOAPP.vue +21 -0
- package/src/components/OApp/InstallOAPP.vue +23 -0
- package/src/components/OApp/LaunchOAPP.vue +19 -0
- package/src/components/OApp/ManageOAPP.vue +14 -0
- package/src/components/OApp/OApp.vue +40 -0
- package/src/components/OApp/SearchOAPP.vue +30 -0
- package/src/components/ONET/ONET.vue +40 -0
- package/src/components/ONODE/ONODE.vue +42 -0
- package/src/components/OasisModal/OasisModal.vue +36 -0
- package/src/components/Provider/ActivityPub.vue +14 -0
- package/src/components/Provider/CompareProviderSpeeds.vue +32 -0
- package/src/components/Provider/Eosio.vue +14 -0
- package/src/components/Provider/Ethereum.vue +14 -0
- package/src/components/Provider/Holochain.vue +14 -0
- package/src/components/Provider/Ipfs.vue +14 -0
- package/src/components/Provider/ManageAutoFailOver.vue +14 -0
- package/src/components/Provider/ManageAutoReplicaton.vue +14 -0
- package/src/components/Provider/ManageLoadBalancing.vue +14 -0
- package/src/components/Provider/ManageProviders.vue +27 -0
- package/src/components/Provider/MongoDb.vue +14 -0
- package/src/components/Provider/Neo4j.vue +14 -0
- package/src/components/Provider/SearchProviders.vue +24 -0
- package/src/components/Provider/Seeds.vue +14 -0
- package/src/components/Provider/Solid.vue +14 -0
- package/src/components/Provider/SqlLite.vue +14 -0
- package/src/components/Provider/ThreeFold.vue +14 -0
- package/src/components/Provider/ViewProviderStats.vue +27 -0
- package/src/components/Provider/ViewProviders.vue +30 -0
- package/src/components/ProviderDropdown/ProviderDropdown.vue +34 -0
- package/src/components/Providers/Providers.vue +30 -0
- package/src/components/Quest/ManageQuest.vue +14 -0
- package/src/components/Quest/Quest.vue +35 -0
- package/src/components/Quest/SearchQuest.vue +30 -0
- package/src/components/Quest/ViewQuest.vue +23 -0
- package/src/components/ResetPassword/ResetPassword.vue +39 -0
- package/src/components/SearchAvatars/SearchAvatars.vue +42 -0
- package/src/components/Seeds/AcceptInvite.vue +26 -0
- package/src/components/Seeds/DonateSeeds.vue +34 -0
- package/src/components/Seeds/ManageSeeds.vue +14 -0
- package/src/components/Seeds/PayWithSeeds.vue +34 -0
- package/src/components/Seeds/RewardSeeds.vue +20 -0
- package/src/components/Seeds/SearchSeeds.vue +18 -0
- package/src/components/Seeds/Seeds.vue +37 -0
- package/src/components/Seeds/SendInvite.vue +34 -0
- package/src/components/Seeds/ViewOrganizations.vue +27 -0
- package/src/components/Seeds/ViewSeeds.vue +34 -0
- package/src/components/Settings/Settings.vue +52 -0
- package/src/components/Signup/Signup.vue +121 -0
- package/src/components/StarField/StarField.vue +55 -0
- package/src/components/VerifyEmail/VerifyEmail.vue +21 -0
- package/src/components/Wallet/Wallet.vue +41 -0
- package/src/index.ts +143 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { ref } from 'vue'
|
|
3
|
+
const emit = defineEmits<{ close: []; submit: [{ query: string; status: string; difficulty: string }] }>()
|
|
4
|
+
const form = ref({ query: '', status: 'All', difficulty: 'All' })
|
|
5
|
+
function handleSubmit() { emit('submit', { ...form.value }) }
|
|
6
|
+
</script>
|
|
7
|
+
<template>
|
|
8
|
+
<div class="p-shell">
|
|
9
|
+
<h2 class="p-title">๐ Search Quest</h2>
|
|
10
|
+
<form class="p-form" @submit.prevent="handleSubmit">
|
|
11
|
+
<div class="p-row"><label class="p-label">Quest Name</label><input class="p-input" v-model="form.query" placeholder="Search quests..." /></div>
|
|
12
|
+
<div class="p-row">
|
|
13
|
+
<label class="p-label">Status</label>
|
|
14
|
+
<select class="p-input" v-model="form.status">
|
|
15
|
+
<option>All</option><option>Available</option><option>Active</option><option>Completed</option>
|
|
16
|
+
</select>
|
|
17
|
+
</div>
|
|
18
|
+
<div class="p-row">
|
|
19
|
+
<label class="p-label">Difficulty</label>
|
|
20
|
+
<select class="p-input" v-model="form.difficulty">
|
|
21
|
+
<option>All</option><option>Easy</option><option>Medium</option><option>Hard</option><option>Legendary</option>
|
|
22
|
+
</select>
|
|
23
|
+
</div>
|
|
24
|
+
<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>
|
|
25
|
+
</form>
|
|
26
|
+
</div>
|
|
27
|
+
</template>
|
|
28
|
+
<style scoped>
|
|
29
|
+
.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}
|
|
30
|
+
</style>
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
defineProps<{ name?: string; description?: string; difficulty?: string; reward?: string; xp?: number }>()
|
|
3
|
+
const emit = defineEmits<{ close: []; accept: [] }>()
|
|
4
|
+
</script>
|
|
5
|
+
<template>
|
|
6
|
+
<div class="p-shell">
|
|
7
|
+
<div class="p-icon">โ๏ธ</div>
|
|
8
|
+
<h2 class="p-title">{{ name ?? 'Quest Details' }}</h2>
|
|
9
|
+
<div class="p-diff-badge" v-if="difficulty" :class="`p-diff--${difficulty.toLowerCase()}`">{{ difficulty }}</div>
|
|
10
|
+
<p class="p-body">{{ description ?? 'Venture forth into the OASIS and complete this quest to earn rewards and karma.' }}</p>
|
|
11
|
+
<div class="p-rewards">
|
|
12
|
+
<div class="p-reward" v-if="reward"><span class="p-reward-label">Reward</span><span class="p-reward-value">{{ reward }}</span></div>
|
|
13
|
+
<div class="p-reward" v-if="xp !== undefined"><span class="p-reward-label">XP</span><span class="p-reward-value">+{{ xp }}</span></div>
|
|
14
|
+
</div>
|
|
15
|
+
<div class="p-actions">
|
|
16
|
+
<button class="p-btn-cancel" @click="emit('close')">Close</button>
|
|
17
|
+
<button class="p-btn" @click="emit('accept')">Accept Quest</button>
|
|
18
|
+
</div>
|
|
19
|
+
</div>
|
|
20
|
+
</template>
|
|
21
|
+
<style scoped>
|
|
22
|
+
.p-shell{display:flex;flex-direction:column;align-items:center;gap:16px;padding:32px 20px;text-align:center}.p-icon{font-size:48px}.p-title{font-family:'Orbitron',sans-serif;font-size:18px;color:#fff;margin:0}.p-diff-badge{font-size:11px;font-weight:700;letter-spacing:.1em;text-transform:uppercase;border-radius:999px;padding:4px 12px;border:1px solid currentColor}.p-diff--easy{color:#00e676}.p-diff--medium{color:#ffb43c}.p-diff--hard{color:#ff7744}.p-diff--legendary{color:#b87fff}.p-body{font-size:14px;color:#a8bfd8;line-height:1.6;margin:0;max-width:360px}.p-rewards{display:flex;gap:12px}.p-reward{background:rgba(255,180,60,.06);border:1px solid rgba(255,180,60,.2);border-radius:8px;padding:10px 16px;display:flex;flex-direction:column;gap:4px;align-items:center}.p-reward-label{font-size:11px;color:#7a9bbf;font-weight:600;letter-spacing:.08em;text-transform:uppercase}.p-reward-value{font-family:'Orbitron',sans-serif;font-size:15px;color:#ffb43c;font-weight:700}.p-actions{display:flex;gap:12px}.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}.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:11px 28px;cursor:pointer}
|
|
23
|
+
</style>
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { ref } from 'vue'
|
|
3
|
+
import { OASISClient } from '@oasisomniverse/web4-api'
|
|
4
|
+
|
|
5
|
+
const emit = defineEmits<{ switchTo: [view: 'login'] }>()
|
|
6
|
+
const password = ref(''); const confirmPassword = ref('')
|
|
7
|
+
const loading = ref(false); const error = ref(''); const done = ref(false)
|
|
8
|
+
|
|
9
|
+
async function submit() {
|
|
10
|
+
if (!password.value || !confirmPassword.value) { error.value = 'Please fill in all fields.'; return }
|
|
11
|
+
if (password.value !== confirmPassword.value) { error.value = 'Passwords do not match.'; return }
|
|
12
|
+
if (password.value.length < 6) { error.value = 'Password must be at least 6 characters.'; return }
|
|
13
|
+
loading.value = true; error.value = ''
|
|
14
|
+
try {
|
|
15
|
+
const oasis = new OASISClient({ baseUrl: 'https://api.web4.oasisomniverse.one' })
|
|
16
|
+
await (oasis.auth as any).resetPassword({ password: password.value })
|
|
17
|
+
done.value = true
|
|
18
|
+
} catch (e: any) { error.value = e?.message ?? 'Reset failed. Please try again.' }
|
|
19
|
+
finally { loading.value = false }
|
|
20
|
+
}
|
|
21
|
+
</script>
|
|
22
|
+
<template>
|
|
23
|
+
<div class="oasis-auth-form">
|
|
24
|
+
<div class="oasis-auth-header">
|
|
25
|
+
<h2 class="oasis-auth-title">Reset Password</h2>
|
|
26
|
+
<p class="oasis-auth-sub">Enter your new password below.</p>
|
|
27
|
+
</div>
|
|
28
|
+
<div v-if="error" class="oasis-auth-error">{{ error }}</div>
|
|
29
|
+
<template v-if="!done">
|
|
30
|
+
<div class="oasis-field"><label class="oasis-label">New Password</label><input class="oasis-input" type="password" v-model="password" placeholder="min 6 characters" autocomplete="new-password" /></div>
|
|
31
|
+
<div class="oasis-field"><label class="oasis-label">Confirm Password</label><input class="oasis-input" type="password" v-model="confirmPassword" placeholder="โขโขโขโขโขโขโขโข" autocomplete="new-password" /></div>
|
|
32
|
+
<button class="oasis-btn" :disabled="loading" @click="submit">{{ loading ? 'Resettingโฆ' : 'Reset Password' }}</button>
|
|
33
|
+
</template>
|
|
34
|
+
<div v-else class="oasis-auth-success">โ
Password reset! <a class="oasis-link" href="#" @click.prevent="emit('switchTo','login')">Beam In</a></div>
|
|
35
|
+
</div>
|
|
36
|
+
</template>
|
|
37
|
+
<style scoped>
|
|
38
|
+
.oasis-auth-form{display:flex;flex-direction:column;gap:20px}.oasis-auth-header{text-align:center}.oasis-auth-title{font-family:'Orbitron',sans-serif;font-size:20px;color:#fff;margin:0 0 6px}.oasis-auth-sub{font-size:13px;color:#7a9bbf;margin:0}.oasis-auth-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}.oasis-auth-success{background:rgba(72,220,130,.12);border:1px solid rgba(72,220,130,.3);color:#48dc82;border-radius:8px;padding:10px 14px;font-size:13px}.oasis-field{display:flex;flex-direction:column;gap:6px}.oasis-label{font-size:12px;font-weight:600;letter-spacing:.06em;color:#7a9bbf;text-transform:uppercase}.oasis-input{width:100%;background:rgba(255,255,255,.05);border:1px solid rgba(0,200,255,.2);border-radius:8px;padding:10px 14px;color:#fff;font-size:14px;outline:none;box-sizing:border-box;transition:border-color .2s}.oasis-input:focus{border-color:rgba(0,200,255,.5)}.oasis-link{color:#00c8ff;text-decoration:none;cursor:pointer}.oasis-btn{background:linear-gradient(135deg,#00c8ff,#0080ff);border:none;border-radius:8px;color:#fff;font-family:'Orbitron',sans-serif;font-size:13px;font-weight:700;letter-spacing:.08em;padding:12px;cursor:pointer;transition:opacity .2s}.oasis-btn:disabled{opacity:.5;cursor:not-allowed}
|
|
39
|
+
</style>
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { ref } from 'vue'
|
|
3
|
+
import { OASISClient } from '@oasisomniverse/web4-api'
|
|
4
|
+
interface AvatarResult { id: string; username: string; firstName: string; lastName: string; karma: number }
|
|
5
|
+
const query = ref(''), loading = ref(false), error = ref(''), searched = ref(false)
|
|
6
|
+
const results = ref<AvatarResult[]>([])
|
|
7
|
+
async function search() {
|
|
8
|
+
if (!query.value.trim()) return
|
|
9
|
+
loading.value = true; error.value = ''; searched.value = false; results.value = []
|
|
10
|
+
try {
|
|
11
|
+
const oasis = new OASISClient({ baseUrl: 'https://api.web4.oasisomniverse.one' })
|
|
12
|
+
const res: any = await (oasis.avatar as any).searchAvatars({ searchQuery: query.value })
|
|
13
|
+
results.value = Array.isArray(res?.result) ? res.result : []
|
|
14
|
+
searched.value = true
|
|
15
|
+
} catch (e: any) { error.value = e?.message ?? 'Search failed.' }
|
|
16
|
+
finally { loading.value = false }
|
|
17
|
+
}
|
|
18
|
+
</script>
|
|
19
|
+
<template>
|
|
20
|
+
<div class="sa-shell">
|
|
21
|
+
<div class="sa-header">
|
|
22
|
+
<h2 class="sa-title">๐ Search Avatars</h2>
|
|
23
|
+
<p class="sa-sub">Find other OASIS avatars by username or name.</p>
|
|
24
|
+
</div>
|
|
25
|
+
<div class="sa-search-row">
|
|
26
|
+
<input class="oasis-input" type="text" v-model="query" placeholder="Search by usernameโฆ" @keydown.enter="search" />
|
|
27
|
+
<button class="oasis-btn" :disabled="loading || !query.trim()" @click="search">{{ loading ? 'โฆ' : 'Search' }}</button>
|
|
28
|
+
</div>
|
|
29
|
+
<div v-if="error" class="oasis-auth-error">{{ error }}</div>
|
|
30
|
+
<div v-if="results.length > 0" class="sa-results">
|
|
31
|
+
<div v-for="a in results" :key="a.id" class="sa-card">
|
|
32
|
+
<div class="sa-avatar-icon">๐ค</div>
|
|
33
|
+
<div class="sa-info"><div class="sa-username">{{ a.username }}</div><div class="sa-name">{{ a.firstName }} {{ a.lastName }}</div></div>
|
|
34
|
+
<div class="sa-karma">{{ a.karma }} karma</div>
|
|
35
|
+
</div>
|
|
36
|
+
</div>
|
|
37
|
+
<div v-else-if="searched && !loading" class="sa-empty">No avatars found for "{{ query }}".</div>
|
|
38
|
+
</div>
|
|
39
|
+
</template>
|
|
40
|
+
<style scoped>
|
|
41
|
+
.sa-shell{display:flex;flex-direction:column;gap:18px}.sa-header{text-align:center}.sa-title{font-family:'Orbitron',sans-serif;font-size:20px;color:#fff;margin:0 0 6px}.sa-sub{font-size:13px;color:#7a9bbf;margin:0}.sa-search-row{display:flex;gap:10px}.oasis-input{flex:1;background:rgba(255,255,255,.05);border:1px solid rgba(0,200,255,.2);border-radius:8px;padding:10px 14px;color:#fff;font-size:14px;outline:none;transition:border-color .2s;font-family:inherit}.oasis-input:focus{border-color:rgba(0,200,255,.5)}.oasis-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;white-space:nowrap;transition:opacity .2s}.oasis-btn:disabled{opacity:.4;cursor:not-allowed}.oasis-auth-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}.sa-results{display:flex;flex-direction:column;gap:10px}.sa-card{display:flex;align-items:center;gap:14px;padding:14px 16px;background:rgba(255,255,255,.04);border:1px solid rgba(0,200,255,.12);border-radius:10px}.sa-avatar-icon{font-size:28px}.sa-info{flex:1}.sa-username{font-family:'Orbitron',sans-serif;font-size:13px;color:#fff}.sa-name{font-size:12px;color:#7a9bbf;margin-top:2px}.sa-karma{font-size:12px;color:#48dc82;font-weight:600;white-space:nowrap}.sa-empty{text-align:center;color:#4a6a88;font-size:14px;padding:24px}
|
|
42
|
+
</style>
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { ref } from 'vue'
|
|
3
|
+
const emit = defineEmits<{ close: []; submit: [{ group: string; username: string; inviteSecret: string }] }>()
|
|
4
|
+
const form = ref({ group: 'avatar', username: '', inviteSecret: '' })
|
|
5
|
+
function handleSubmit() { emit('submit', { ...form.value }) }
|
|
6
|
+
</script>
|
|
7
|
+
<template>
|
|
8
|
+
<div class="p-shell">
|
|
9
|
+
<h2 class="p-title">๐ฑ Accept Invite to Join Seeds</h2>
|
|
10
|
+
<form class="p-form" @submit.prevent="handleSubmit">
|
|
11
|
+
<div class="p-row">
|
|
12
|
+
<label class="p-label">Search by</label>
|
|
13
|
+
<div class="p-radio-group">
|
|
14
|
+
<label class="p-radio"><input type="radio" v-model="form.group" value="avatar" /> Avatar</label>
|
|
15
|
+
<label class="p-radio"><input type="radio" v-model="form.group" value="seedUsername" /> Seed Username</label>
|
|
16
|
+
</div>
|
|
17
|
+
</div>
|
|
18
|
+
<div class="p-row"><label class="p-label">{{ form.group === 'avatar' ? 'Avatar Username' : 'Seed Username' }}</label><input class="p-input" v-model="form.username" placeholder="username" /></div>
|
|
19
|
+
<div class="p-row"><label class="p-label">Invite Secret</label><input class="p-input" v-model="form.inviteSecret" placeholder="Your invite secret code" /></div>
|
|
20
|
+
<div class="p-actions"><button class="p-btn-cancel" type="button" @click="emit('close')">Cancel</button><button class="p-btn" type="submit">Accept Invitation</button></div>
|
|
21
|
+
</form>
|
|
22
|
+
</div>
|
|
23
|
+
</template>
|
|
24
|
+
<style scoped>
|
|
25
|
+
.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-radio-group{display:flex;gap:20px}.p-radio{display:flex;align-items:center;gap:6px;font-size:13px;color:#c8dff0;cursor:pointer}.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}
|
|
26
|
+
</style>
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { ref } from 'vue'
|
|
3
|
+
const emit = defineEmits<{ close: []; submit: [{ group: string; avatar: string; seedUser: string; amount: string; note: string }] }>()
|
|
4
|
+
const form = ref({ group: 'avatar', avatar: '', seedUser: '', amount: '', note: '' })
|
|
5
|
+
function handleSubmit() { emit('submit', { ...form.value }) }
|
|
6
|
+
</script>
|
|
7
|
+
<template>
|
|
8
|
+
<div class="p-shell">
|
|
9
|
+
<h2 class="p-title">๐ฑ Donate Seeds</h2>
|
|
10
|
+
<form class="p-form" @submit.prevent="handleSubmit">
|
|
11
|
+
<div class="p-row">
|
|
12
|
+
<label class="p-label p-radio-label">
|
|
13
|
+
<input type="radio" v-model="form.group" value="avatar" />
|
|
14
|
+
Avatar
|
|
15
|
+
</label>
|
|
16
|
+
<input class="p-input" v-model="form.avatar" placeholder="Avatar username" :disabled="form.group !== 'avatar'" />
|
|
17
|
+
</div>
|
|
18
|
+
<div class="p-or">OR</div>
|
|
19
|
+
<div class="p-row">
|
|
20
|
+
<label class="p-label p-radio-label">
|
|
21
|
+
<input type="radio" v-model="form.group" value="seedUser" />
|
|
22
|
+
Seed Username
|
|
23
|
+
</label>
|
|
24
|
+
<input class="p-input" v-model="form.seedUser" placeholder="Seed username" :disabled="form.group !== 'seedUser'" />
|
|
25
|
+
</div>
|
|
26
|
+
<div class="p-row"><label class="p-label">Amount</label><input class="p-input" v-model="form.amount" type="number" placeholder="Amount of SEEDS" /></div>
|
|
27
|
+
<div class="p-row"><label class="p-label">Note</label><input class="p-input" v-model="form.note" placeholder="Optional note" /></div>
|
|
28
|
+
<div class="p-actions"><button class="p-btn-cancel" type="button" @click="emit('close')">Cancel</button><button class="p-btn" type="submit">Donate</button></div>
|
|
29
|
+
</form>
|
|
30
|
+
</div>
|
|
31
|
+
</template>
|
|
32
|
+
<style scoped>
|
|
33
|
+
.p-shell{display:flex;flex-direction:column;gap:16px;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:12px}.p-row{display:flex;flex-direction:column;gap:6px}.p-label{font-size:12px;color:#7a9bbf;font-weight:600;letter-spacing:.05em}.p-radio-label{display:flex;align-items:center;gap:8px;font-size:13px;color:#c8dff0;cursor:pointer}.p-or{text-align:center;font-family:'Orbitron',sans-serif;font-size:11px;color:#5a7a9a;letter-spacing:.1em}.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-input:disabled{opacity:.4;cursor:not-allowed}.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}
|
|
34
|
+
</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 Seeds</h2>
|
|
8
|
+
<p class="p-body">SEEDS management tools are coming soon โ view your balance, transaction history, trusted connections and regenerative impact score all in one place.</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,34 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { ref } from 'vue'
|
|
3
|
+
const emit = defineEmits<{ close: []; submit: [{ group: string; avatar: string; seedUser: string; amount: number; note: string }] }>()
|
|
4
|
+
const form = ref({ group: 'avatar', avatar: '', seedUser: '', amount: 0, note: '' })
|
|
5
|
+
function handleSubmit() { emit('submit', { ...form.value }) }
|
|
6
|
+
</script>
|
|
7
|
+
<template>
|
|
8
|
+
<div class="p-shell">
|
|
9
|
+
<h2 class="p-title">๐ธ Pay with Seeds</h2>
|
|
10
|
+
<form class="p-form" @submit.prevent="handleSubmit">
|
|
11
|
+
<div class="p-row">
|
|
12
|
+
<label class="p-label p-radio-label">
|
|
13
|
+
<input type="radio" v-model="form.group" value="avatar" />
|
|
14
|
+
Avatar
|
|
15
|
+
</label>
|
|
16
|
+
<input class="p-input" v-model="form.avatar" placeholder="Avatar username" :disabled="form.group !== 'avatar'" />
|
|
17
|
+
</div>
|
|
18
|
+
<div class="p-or">OR</div>
|
|
19
|
+
<div class="p-row">
|
|
20
|
+
<label class="p-label p-radio-label">
|
|
21
|
+
<input type="radio" v-model="form.group" value="seedUser" />
|
|
22
|
+
Seed Username
|
|
23
|
+
</label>
|
|
24
|
+
<input class="p-input" v-model="form.seedUser" placeholder="Seed Username" :disabled="form.group !== 'seedUser'" />
|
|
25
|
+
</div>
|
|
26
|
+
<div class="p-row"><label class="p-label">Amount</label><input class="p-input" v-model.number="form.amount" type="number" placeholder="Amount" :disabled="form.group !== 'seedUser'" /></div>
|
|
27
|
+
<div class="p-row"><label class="p-label">Note</label><input class="p-input" v-model="form.note" placeholder="Note" /></div>
|
|
28
|
+
<div class="p-actions"><button class="p-btn-cancel" type="button" @click="emit('close')">Cancel</button><button class="p-btn" type="submit">Pay</button></div>
|
|
29
|
+
</form>
|
|
30
|
+
</div>
|
|
31
|
+
</template>
|
|
32
|
+
<style scoped>
|
|
33
|
+
.p-shell{display:flex;flex-direction:column;gap:16px;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:12px}.p-row{display:flex;flex-direction:column;gap:6px}.p-label{font-size:12px;color:#7a9bbf;font-weight:600;letter-spacing:.05em}.p-radio-label{display:flex;align-items:center;gap:8px;font-size:13px;color:#c8dff0;cursor:pointer}.p-or{text-align:center;font-family:'Orbitron',sans-serif;font-size:11px;color:#5a7a9a;letter-spacing:.1em}.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-input:disabled{opacity:.4;cursor:not-allowed}.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}
|
|
34
|
+
</style>
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { ref } from 'vue'
|
|
3
|
+
const emit = defineEmits<{ close: []; submit: [{ avatar: string; amount: number; reason: string }] }>()
|
|
4
|
+
const form = ref({ avatar: '', amount: 0, reason: '' })
|
|
5
|
+
function handleSubmit() { emit('submit', { ...form.value }) }
|
|
6
|
+
</script>
|
|
7
|
+
<template>
|
|
8
|
+
<div class="p-shell">
|
|
9
|
+
<h2 class="p-title">๐ Reward Seeds</h2>
|
|
10
|
+
<form class="p-form" @submit.prevent="handleSubmit">
|
|
11
|
+
<div class="p-row"><label class="p-label">Avatar to Reward</label><input class="p-input" v-model="form.avatar" placeholder="Avatar username" /></div>
|
|
12
|
+
<div class="p-row"><label class="p-label">Amount of SEEDS</label><input class="p-input" v-model.number="form.amount" type="number" placeholder="0" /></div>
|
|
13
|
+
<div class="p-row"><label class="p-label">Reason</label><textarea class="p-textarea" v-model="form.reason" placeholder="Why are you rewarding this avatar?"></textarea></div>
|
|
14
|
+
<div class="p-actions"><button class="p-btn-cancel" type="button" @click="emit('close')">Cancel</button><button class="p-btn" type="submit">Reward</button></div>
|
|
15
|
+
</form>
|
|
16
|
+
</div>
|
|
17
|
+
</template>
|
|
18
|
+
<style scoped>
|
|
19
|
+
.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,.p-textarea{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,.p-textarea:focus{border-color:rgba(0,200,255,.5)}.p-textarea{min-height:80px;resize:vertical}.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}
|
|
20
|
+
</style>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { ref } from 'vue'
|
|
3
|
+
const emit = defineEmits<{ close: []; submit: [{ query: string }] }>()
|
|
4
|
+
const form = ref({ query: '' })
|
|
5
|
+
function handleSubmit() { emit('submit', { ...form.value }) }
|
|
6
|
+
</script>
|
|
7
|
+
<template>
|
|
8
|
+
<div class="p-shell">
|
|
9
|
+
<h2 class="p-title">๐ Search Seeds</h2>
|
|
10
|
+
<form class="p-form" @submit.prevent="handleSubmit">
|
|
11
|
+
<div class="p-row"><label class="p-label">Avatar or Seed Username</label><input class="p-input" v-model="form.query" placeholder="Search by username..." /></div>
|
|
12
|
+
<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>
|
|
13
|
+
</form>
|
|
14
|
+
</div>
|
|
15
|
+
</template>
|
|
16
|
+
<style scoped>
|
|
17
|
+
.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}
|
|
18
|
+
</style>
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { ref } from 'vue'
|
|
3
|
+
interface Seed { id: string; name: string; type: string; rarity: string; karma: number; planted: boolean }
|
|
4
|
+
const seeds = ref<Seed[]>([
|
|
5
|
+
{ id: '1', name: 'Wisdom Seed', type: 'Spiritual', rarity: 'Rare', karma: 50, planted: false },
|
|
6
|
+
{ id: '2', name: 'Healing Seed', type: 'Health', rarity: 'Common', karma: 20, planted: false },
|
|
7
|
+
{ id: '3', name: 'Unity Seed', type: 'Community', rarity: 'Epic', karma: 150, planted: false },
|
|
8
|
+
{ id: '4', name: 'Truth Seed', type: 'Knowledge', rarity: 'Legendary', karma: 500, planted: false },
|
|
9
|
+
{ id: '5', name: 'Love Seed', type: 'Spiritual', rarity: 'Common', karma: 30, planted: false },
|
|
10
|
+
{ id: '6', name: 'Peace Seed', type: 'Community', rarity: 'Rare', karma: 75, planted: false },
|
|
11
|
+
])
|
|
12
|
+
const icons: Record<string, string> = { Spiritual: 'โจ', Health: '๐', Community: '๐ค', Knowledge: '๐' }
|
|
13
|
+
function seedIcon(type: string) { return icons[type] ?? '๐ฑ' }
|
|
14
|
+
function plant(s: Seed) { s.planted = true }
|
|
15
|
+
</script>
|
|
16
|
+
<template>
|
|
17
|
+
<div class="seeds-shell">
|
|
18
|
+
<div class="seeds-header">
|
|
19
|
+
<h2 class="seeds-title">๐ฑ Seeds</h2>
|
|
20
|
+
<p class="seeds-sub">Plant seeds to grow your OASIS avatar and earn karma.</p>
|
|
21
|
+
</div>
|
|
22
|
+
<div class="seeds-grid">
|
|
23
|
+
<div v-for="s in seeds" :key="s.id" class="seed-card" :class="{ 'seed-card--planted': s.planted }">
|
|
24
|
+
<div class="seed-rarity" :class="`seed-rarity--${s.rarity.toLowerCase()}`">{{ s.rarity }}</div>
|
|
25
|
+
<div class="seed-icon">{{ seedIcon(s.type) }}</div>
|
|
26
|
+
<div class="seed-name">{{ s.name }}</div>
|
|
27
|
+
<div class="seed-type">{{ s.type }}</div>
|
|
28
|
+
<div class="seed-karma">+{{ s.karma }} Karma</div>
|
|
29
|
+
<button v-if="!s.planted" class="seed-btn" @click="plant(s)">Plant Seed</button>
|
|
30
|
+
<div v-else class="seed-planted-label">๐ฟ Growingโฆ</div>
|
|
31
|
+
</div>
|
|
32
|
+
</div>
|
|
33
|
+
</div>
|
|
34
|
+
</template>
|
|
35
|
+
<style scoped>
|
|
36
|
+
.seeds-shell{display:flex;flex-direction:column;gap:20px}.seeds-header{text-align:center}.seeds-title{font-family:'Orbitron',sans-serif;font-size:20px;color:#fff;margin:0 0 6px}.seeds-sub{font-size:13px;color:#7a9bbf;margin:0}.seeds-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:16px}.seed-card{background:rgba(255,255,255,.04);border:1px solid rgba(0,200,255,.15);border-radius:12px;padding:18px 14px;display:flex;flex-direction:column;align-items:center;gap:10px;transition:border-color .2s}.seed-card:hover{border-color:rgba(0,200,255,.35)}.seed-card--planted{border-color:rgba(72,220,130,.3);background:rgba(72,220,130,.04)}.seed-rarity{font-size:10px;font-weight:700;letter-spacing:.1em;text-transform:uppercase;border-radius:999px;padding:3px 10px;border:1px solid currentColor}.seed-rarity--common{color:#7a9bbf;border-color:rgba(122,155,191,.3)}.seed-rarity--rare{color:#5ba8ff;border-color:rgba(91,168,255,.3)}.seed-rarity--epic{color:#b87fff;border-color:rgba(184,127,255,.3)}.seed-rarity--legendary{color:#ffb43c;border-color:rgba(255,180,60,.3)}.seed-icon{font-size:36px}.seed-name{font-family:'Orbitron',sans-serif;font-size:13px;color:#fff;text-align:center}.seed-type{font-size:11px;color:#7a9bbf}.seed-karma{font-size:12px;color:#48dc82;font-weight:600}.seed-btn{width:100%;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;cursor:pointer;transition:opacity .2s}.seed-btn:hover{opacity:.85}.seed-planted-label{font-size:12px;color:#48dc82;font-weight:600}
|
|
37
|
+
</style>
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { ref } from 'vue'
|
|
3
|
+
const emit = defineEmits<{ close: []; submit: [{ group: string; avatar: string; seedUser: string; amount: string; note: string }] }>()
|
|
4
|
+
const form = ref({ group: 'avatar', avatar: '', seedUser: '', amount: '', note: '' })
|
|
5
|
+
function handleSubmit() { emit('submit', { ...form.value }) }
|
|
6
|
+
</script>
|
|
7
|
+
<template>
|
|
8
|
+
<div class="p-shell">
|
|
9
|
+
<h2 class="p-title">โ๏ธ Send Seeds Invite</h2>
|
|
10
|
+
<form class="p-form" @submit.prevent="handleSubmit">
|
|
11
|
+
<div class="p-row">
|
|
12
|
+
<label class="p-label p-radio-label">
|
|
13
|
+
<input type="radio" v-model="form.group" value="avatar" />
|
|
14
|
+
Avatar
|
|
15
|
+
</label>
|
|
16
|
+
<input class="p-input" v-model="form.avatar" placeholder="Avatar username" :disabled="form.group !== 'avatar'" />
|
|
17
|
+
</div>
|
|
18
|
+
<div class="p-or">OR</div>
|
|
19
|
+
<div class="p-row">
|
|
20
|
+
<label class="p-label p-radio-label">
|
|
21
|
+
<input type="radio" v-model="form.group" value="seedUser" />
|
|
22
|
+
Seed Username
|
|
23
|
+
</label>
|
|
24
|
+
<input class="p-input" v-model="form.seedUser" placeholder="Seed Username" :disabled="form.group !== 'seedUser'" />
|
|
25
|
+
</div>
|
|
26
|
+
<div class="p-row"><label class="p-label">Amount</label><input class="p-input" v-model="form.amount" type="number" placeholder="Amount" :disabled="form.group !== 'seedUser'" /></div>
|
|
27
|
+
<div class="p-row"><label class="p-label">Note</label><input class="p-input" v-model="form.note" placeholder="Optional message" /></div>
|
|
28
|
+
<div class="p-actions"><button class="p-btn-cancel" type="button" @click="emit('close')">Cancel</button><button class="p-btn" type="submit">Send Invite</button></div>
|
|
29
|
+
</form>
|
|
30
|
+
</div>
|
|
31
|
+
</template>
|
|
32
|
+
<style scoped>
|
|
33
|
+
.p-shell{display:flex;flex-direction:column;gap:16px;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:12px}.p-row{display:flex;flex-direction:column;gap:6px}.p-label{font-size:12px;color:#7a9bbf;font-weight:600;letter-spacing:.05em}.p-radio-label{display:flex;align-items:center;gap:8px;font-size:13px;color:#c8dff0;cursor:pointer}.p-or{text-align:center;font-family:'Orbitron',sans-serif;font-size:11px;color:#5a7a9a;letter-spacing:.1em}.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-input:disabled{opacity:.4;cursor:not-allowed}.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}
|
|
34
|
+
</style>
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
const emit = defineEmits<{ close: [] }>()
|
|
3
|
+
const orgs = [
|
|
4
|
+
{ name: 'SEEDS Foundation', members: 12400, type: 'Foundation', status: 'Active' },
|
|
5
|
+
{ name: 'OASIS Collective', members: 3200, type: 'Collective', status: 'Active' },
|
|
6
|
+
{ name: 'Our World Community', members: 8900, type: 'Community', status: 'Active' },
|
|
7
|
+
{ name: 'Earth Regenerators', members: 5600, type: 'Movement', status: 'Growing' },
|
|
8
|
+
]
|
|
9
|
+
</script>
|
|
10
|
+
<template>
|
|
11
|
+
<div class="p-shell">
|
|
12
|
+
<h2 class="p-title">๐ฟ SEEDS Organizations</h2>
|
|
13
|
+
<div class="p-list">
|
|
14
|
+
<div v-for="o in orgs" :key="o.name" class="p-item">
|
|
15
|
+
<div class="p-item-info">
|
|
16
|
+
<span class="p-item-name">{{ o.name }}</span>
|
|
17
|
+
<span class="p-item-desc">{{ o.type }} ยท {{ o.members.toLocaleString() }} members</span>
|
|
18
|
+
</div>
|
|
19
|
+
<span class="p-status" :class="`p-status--${o.status.toLowerCase()}`">{{ o.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-desc{font-size:12px;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--growing{color:#ffb43c}.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,34 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
defineProps<{ balance?: number; username?: string; impact?: string }>()
|
|
3
|
+
const emit = defineEmits<{ close: [] }>()
|
|
4
|
+
const transactions = [
|
|
5
|
+
{ date: '2024-01-10', description: 'Quest reward', amount: '+50' },
|
|
6
|
+
{ date: '2024-01-08', description: 'Donation to Earth Regen', amount: '-20' },
|
|
7
|
+
{ date: '2024-01-05', description: 'Welcome seeds', amount: '+100' },
|
|
8
|
+
]
|
|
9
|
+
</script>
|
|
10
|
+
<template>
|
|
11
|
+
<div class="p-shell">
|
|
12
|
+
<div class="p-icon">๐ฑ</div>
|
|
13
|
+
<h2 class="p-title">{{ username ?? 'My' }} Seeds</h2>
|
|
14
|
+
<div class="p-balance">
|
|
15
|
+
<span class="p-balance-label">Balance</span>
|
|
16
|
+
<span class="p-balance-value">{{ (balance ?? 0).toLocaleString() }} SEEDS</span>
|
|
17
|
+
</div>
|
|
18
|
+
<div class="p-table-wrap">
|
|
19
|
+
<table class="p-table">
|
|
20
|
+
<thead><tr><th>Date</th><th>Description</th><th>Amount</th></tr></thead>
|
|
21
|
+
<tbody>
|
|
22
|
+
<tr v-for="(t, i) in transactions" :key="i">
|
|
23
|
+
<td>{{ t.date }}</td><td>{{ t.description }}</td>
|
|
24
|
+
<td :class="t.amount.startsWith('+') ? 'pos' : 'neg'">{{ t.amount }}</td>
|
|
25
|
+
</tr>
|
|
26
|
+
</tbody>
|
|
27
|
+
</table>
|
|
28
|
+
</div>
|
|
29
|
+
<button class="p-btn" @click="emit('close')">Close</button>
|
|
30
|
+
</div>
|
|
31
|
+
</template>
|
|
32
|
+
<style scoped>
|
|
33
|
+
.p-shell{display:flex;flex-direction:column;gap:18px;padding:24px 20px;align-items:center;text-align:center}.p-icon{font-size:44px}.p-title{font-family:'Orbitron',sans-serif;font-size:18px;color:#fff;margin:0}.p-balance{background:rgba(0,200,255,.06);border:1px solid rgba(0,200,255,.2);border-radius:10px;padding:14px 24px;display:flex;flex-direction:column;gap:6px}.p-balance-label{font-size:11px;color:#7a9bbf;font-weight:600;letter-spacing:.1em;text-transform:uppercase}.p-balance-value{font-family:'Orbitron',sans-serif;font-size:24px;color:#00e676;font-weight:700}.p-table-wrap{width:100%;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)}.pos{color:#00e676;font-weight:700}.neg{color:#ff4444;font-weight:700}.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}
|
|
34
|
+
</style>
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { ref } from 'vue'
|
|
3
|
+
const openSection = ref('')
|
|
4
|
+
const saved = ref(false)
|
|
5
|
+
const prefs = ref<Record<string, any>>({ notifications: true, darkMode: true, sound: false, autoSave: true, language: 'English', theme: 'Dark Space', currency: 'ETH' })
|
|
6
|
+
const sections = [
|
|
7
|
+
{ icon: '๐', label: 'Notifications', options: [
|
|
8
|
+
{ key: 'notifications', name: 'Enable Notifications', desc: 'Receive alerts for karma, messages and quests.', type: 'toggle' },
|
|
9
|
+
{ key: 'sound', name: 'Sound Effects', desc: 'Play sounds for OASIS events.', type: 'toggle' },
|
|
10
|
+
]},
|
|
11
|
+
{ icon: '๐จ', label: 'Appearance', options: [
|
|
12
|
+
{ key: 'darkMode', name: 'Dark Mode', desc: 'Use the dark space theme.', type: 'toggle' },
|
|
13
|
+
{ key: 'theme', name: 'Theme', desc: 'Select your OASIS visual theme.', type: 'select', choices: ['Dark Space', 'Neon City', 'Forest Realm'] },
|
|
14
|
+
]},
|
|
15
|
+
{ icon: '๐', label: 'Language & Region', options: [
|
|
16
|
+
{ key: 'language', name: 'Language', desc: 'Select your preferred language.', type: 'select', choices: ['English', 'Spanish', 'French', 'German', 'Japanese'] },
|
|
17
|
+
{ key: 'currency', name: 'Display Currency', desc: 'Currency for prices and values.', type: 'select', choices: ['ETH', 'SOL', 'USD', 'GBP', 'EUR'] },
|
|
18
|
+
]},
|
|
19
|
+
{ icon: '๐พ', label: 'Data', options: [
|
|
20
|
+
{ key: 'autoSave', name: 'Auto-save Progress', desc: 'Automatically save your OASIS progress.', type: 'toggle' },
|
|
21
|
+
]},
|
|
22
|
+
]
|
|
23
|
+
function toggle(sec: string) { openSection.value = openSection.value === sec ? '' : sec }
|
|
24
|
+
function save() { saved.value = true; setTimeout(() => saved.value = false, 2000) }
|
|
25
|
+
</script>
|
|
26
|
+
<template>
|
|
27
|
+
<div class="sett-shell">
|
|
28
|
+
<div class="sett-header"><h2 class="sett-title">โ๏ธ Settings</h2><p class="sett-sub">Manage your OASIS account and preferences.</p></div>
|
|
29
|
+
<div class="sett-sections">
|
|
30
|
+
<div v-for="sec in sections" :key="sec.label" class="sett-section" :class="{ 'sett-section--open': openSection === sec.label }" @click="toggle(sec.label)">
|
|
31
|
+
<div class="sett-section-header">
|
|
32
|
+
<span class="sett-section-icon">{{ sec.icon }}</span>
|
|
33
|
+
<span class="sett-section-label">{{ sec.label }}</span>
|
|
34
|
+
<span class="sett-chevron">{{ openSection === sec.label ? 'โฒ' : 'โผ' }}</span>
|
|
35
|
+
</div>
|
|
36
|
+
<div v-if="openSection === sec.label" class="sett-section-body" @click.stop>
|
|
37
|
+
<div v-for="opt in sec.options" :key="opt.key" class="sett-opt">
|
|
38
|
+
<div class="sett-opt-info"><div class="sett-opt-name">{{ opt.name }}</div><div class="sett-opt-desc">{{ opt.desc }}</div></div>
|
|
39
|
+
<div v-if="opt.type === 'toggle'" class="sett-toggle" :class="{ 'sett-toggle--on': prefs[opt.key] }" @click="prefs[opt.key] = !prefs[opt.key]"><div class="sett-toggle-knob"></div></div>
|
|
40
|
+
<select v-if="opt.type === 'select'" class="sett-select" v-model="prefs[opt.key]">
|
|
41
|
+
<option v-for="c in opt.choices" :key="c" :value="c">{{ c }}</option>
|
|
42
|
+
</select>
|
|
43
|
+
</div>
|
|
44
|
+
</div>
|
|
45
|
+
</div>
|
|
46
|
+
</div>
|
|
47
|
+
<button class="oasis-btn" @click="save">{{ saved ? 'โ
Saved!' : 'Save Settings' }}</button>
|
|
48
|
+
</div>
|
|
49
|
+
</template>
|
|
50
|
+
<style scoped>
|
|
51
|
+
.sett-shell{display:flex;flex-direction:column;gap:18px}.sett-header{text-align:center}.sett-title{font-family:'Orbitron',sans-serif;font-size:20px;color:#fff;margin:0 0 6px}.sett-sub{font-size:13px;color:#7a9bbf;margin:0}.sett-sections{display:flex;flex-direction:column;gap:8px}.sett-section{background:rgba(255,255,255,.04);border:1px solid rgba(0,200,255,.12);border-radius:10px;overflow:hidden;transition:border-color .2s}.sett-section--open{border-color:rgba(0,200,255,.3)}.sett-section-header{display:flex;align-items:center;gap:10px;padding:14px 16px;cursor:pointer;user-select:none}.sett-section-icon{font-size:18px}.sett-section-label{flex:1;font-family:'Orbitron',sans-serif;font-size:13px;color:#fff}.sett-chevron{font-size:10px;color:#7a9bbf}.sett-section-body{padding:0 16px 16px;display:flex;flex-direction:column;gap:14px}.sett-opt{display:flex;align-items:center;gap:14px}.sett-opt-info{flex:1}.sett-opt-name{font-size:13px;color:#e0f0ff}.sett-opt-desc{font-size:11px;color:#4a6a88;margin-top:2px}.sett-toggle{width:44px;height:24px;border-radius:999px;background:rgba(255,255,255,.1);cursor:pointer;transition:background .2s;position:relative;flex-shrink:0}.sett-toggle--on{background:linear-gradient(135deg,#00c8ff,#0080ff)}.sett-toggle-knob{position:absolute;top:3px;left:3px;width:18px;height:18px;border-radius:50%;background:#fff;transition:transform .2s}.sett-toggle--on .sett-toggle-knob{transform:translateX(20px)}.sett-select{background:rgba(255,255,255,.05);border:1px solid rgba(0,200,255,.2);border-radius:7px;color:#fff;font-size:12px;padding:6px 10px;outline:none}.oasis-btn{background:linear-gradient(135deg,#00c8ff,#0080ff);border:none;border-radius:8px;color:#fff;font-family:'Orbitron',sans-serif;font-size:13px;font-weight:700;letter-spacing:.08em;padding:12px;cursor:pointer}
|
|
52
|
+
</style>
|