@oasisomniverse/svelte 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 (120) hide show
  1. package/package.json +36 -0
  2. package/src/components/AvatarConnect.svelte +61 -0
  3. package/src/components/AvatarProfile.svelte +124 -0
  4. package/src/components/ComingSoon.svelte +13 -0
  5. package/src/components/Confirmation.svelte +21 -0
  6. package/src/components/Contact.svelte +38 -0
  7. package/src/components/Eggs.svelte +40 -0
  8. package/src/components/ForgotPassword.svelte +67 -0
  9. package/src/components/Game.svelte +28 -0
  10. package/src/components/HyperDrive.svelte +42 -0
  11. package/src/components/KarmaPanel.svelte +74 -0
  12. package/src/components/KarmaToast.svelte +23 -0
  13. package/src/components/Login.svelte +88 -0
  14. package/src/components/Map.svelte +41 -0
  15. package/src/components/MenuMessage.svelte +59 -0
  16. package/src/components/Messaging.svelte +41 -0
  17. package/src/components/Mission.svelte +31 -0
  18. package/src/components/NFT.svelte +37 -0
  19. package/src/components/NavBar.svelte +63 -0
  20. package/src/components/OApp.svelte +36 -0
  21. package/src/components/ONET.svelte +35 -0
  22. package/src/components/ONODE.svelte +36 -0
  23. package/src/components/OasisModal.svelte +35 -0
  24. package/src/components/ProviderDropdown.svelte +35 -0
  25. package/src/components/Providers.svelte +29 -0
  26. package/src/components/Quest.svelte +34 -0
  27. package/src/components/ResetPassword.svelte +28 -0
  28. package/src/components/SearchAvatars.svelte +44 -0
  29. package/src/components/Seeds.svelte +39 -0
  30. package/src/components/Settings.svelte +59 -0
  31. package/src/components/Signup.svelte +115 -0
  32. package/src/components/StarField.svelte +47 -0
  33. package/src/components/VerifyEmail.svelte +18 -0
  34. package/src/components/Wallet.svelte +42 -0
  35. package/src/components/avatar/AvatarWallet.svelte +17 -0
  36. package/src/components/avatar/EditAvatar.svelte +17 -0
  37. package/src/components/avatar/SearchAvatar.svelte +17 -0
  38. package/src/components/avatar/ViewAvatar.svelte +17 -0
  39. package/src/components/comingsoon/ComingSoon.svelte +17 -0
  40. package/src/components/confirmation/Confirmation.svelte +17 -0
  41. package/src/components/contact/Contact.svelte +17 -0
  42. package/src/components/data-screen/AddData.svelte +17 -0
  43. package/src/components/data-screen/CrossChainManagement.svelte +17 -0
  44. package/src/components/data-screen/LoadData.svelte +17 -0
  45. package/src/components/data-screen/ManageData.svelte +17 -0
  46. package/src/components/data-screen/OffChainManagement.svelte +17 -0
  47. package/src/components/data-screen/SearchData.svelte +17 -0
  48. package/src/components/eggs/ManageEggs.svelte +17 -0
  49. package/src/components/eggs/SearchEggs.svelte +17 -0
  50. package/src/components/eggs/ViewEggs.svelte +17 -0
  51. package/src/components/game/SearchProfiles.svelte +17 -0
  52. package/src/components/game/ViewAchievements.svelte +17 -0
  53. package/src/components/game/ViewLeagues.svelte +17 -0
  54. package/src/components/game/ViewTournaments.svelte +17 -0
  55. package/src/components/karma/SearchKarma.svelte +17 -0
  56. package/src/components/karma/ViewAvatarKarma.svelte +17 -0
  57. package/src/components/karma/ViewKarma.svelte +17 -0
  58. package/src/components/karma/VoteKarma.svelte +17 -0
  59. package/src/components/map/Add2dObjectMap.svelte +17 -0
  60. package/src/components/map/Add3dObjectMap.svelte +17 -0
  61. package/src/components/map/AddQuestToMap.svelte +17 -0
  62. package/src/components/map/DownloadOurWorld.svelte +17 -0
  63. package/src/components/map/ManageMap.svelte +17 -0
  64. package/src/components/map/PlotRouteOnMap.svelte +17 -0
  65. package/src/components/map/SearchMap.svelte +17 -0
  66. package/src/components/map/ViewGlobal3dMap.svelte +17 -0
  67. package/src/components/map/ViewHalonsOnMap.svelte +17 -0
  68. package/src/components/map/ViewOappOnMap.svelte +17 -0
  69. package/src/components/map/ViewQuestOnMap.svelte +17 -0
  70. package/src/components/messages/Message.svelte +17 -0
  71. package/src/components/mission/ManageMission.svelte +17 -0
  72. package/src/components/mission/SearchMission.svelte +17 -0
  73. package/src/components/mission/ViewMission.svelte +17 -0
  74. package/src/components/nft/ContactPopup.svelte +17 -0
  75. package/src/components/nft/ManageOasisNft.svelte +17 -0
  76. package/src/components/nft/PurchaseOasisNft.svelte +17 -0
  77. package/src/components/nft/PurchaseOasisVirtualLandNft.svelte +17 -0
  78. package/src/components/nft/SearchOasisNft.svelte +17 -0
  79. package/src/components/nft/Solana.svelte +17 -0
  80. package/src/components/nft/ViewOasisNft.svelte +17 -0
  81. package/src/components/oapp/CreateOAPP.svelte +17 -0
  82. package/src/components/oapp/DeployOAPP.svelte +17 -0
  83. package/src/components/oapp/DownloadOurWorld.svelte +17 -0
  84. package/src/components/oapp/EditOAPP.svelte +17 -0
  85. package/src/components/oapp/InstallOAPP.svelte +17 -0
  86. package/src/components/oapp/LaunchOAPP.svelte +17 -0
  87. package/src/components/oapp/ManageOAPP.svelte +17 -0
  88. package/src/components/oapp/SearchOAPP.svelte +17 -0
  89. package/src/components/provider/ActivityPub.svelte +17 -0
  90. package/src/components/provider/CompareProviderSpeeds.svelte +17 -0
  91. package/src/components/provider/Eosio.svelte +17 -0
  92. package/src/components/provider/Ethereum.svelte +17 -0
  93. package/src/components/provider/Holochain.svelte +17 -0
  94. package/src/components/provider/Ipfs.svelte +17 -0
  95. package/src/components/provider/ManageAutoFailOver.svelte +17 -0
  96. package/src/components/provider/ManageAutoReplicaton.svelte +17 -0
  97. package/src/components/provider/ManageLoadBalancing.svelte +17 -0
  98. package/src/components/provider/ManageProviders.svelte +17 -0
  99. package/src/components/provider/MongoDb.svelte +17 -0
  100. package/src/components/provider/Neo4j.svelte +17 -0
  101. package/src/components/provider/SearchProviders.svelte +17 -0
  102. package/src/components/provider/Seeds.svelte +17 -0
  103. package/src/components/provider/Solid.svelte +17 -0
  104. package/src/components/provider/SqlLite.svelte +17 -0
  105. package/src/components/provider/ThreeFold.svelte +17 -0
  106. package/src/components/provider/ViewProviderStats.svelte +17 -0
  107. package/src/components/provider/ViewProviders.svelte +17 -0
  108. package/src/components/quest/ManageQuest.svelte +17 -0
  109. package/src/components/quest/SearchQuest.svelte +17 -0
  110. package/src/components/quest/ViewQuest.svelte +17 -0
  111. package/src/components/seeds/AcceptInvite.svelte +17 -0
  112. package/src/components/seeds/DonateSeeds.svelte +17 -0
  113. package/src/components/seeds/ManageSeeds.svelte +17 -0
  114. package/src/components/seeds/PayWithSeeds.svelte +17 -0
  115. package/src/components/seeds/RewardSeeds.svelte +17 -0
  116. package/src/components/seeds/SearchSeeds.svelte +17 -0
  117. package/src/components/seeds/SendInvite.svelte +17 -0
  118. package/src/components/seeds/ViewOrganizations.svelte +17 -0
  119. package/src/components/seeds/ViewSeeds.svelte +17 -0
  120. package/src/index.ts +139 -0
@@ -0,0 +1,34 @@
1
+ <script lang="ts">
2
+ interface Quest { id: string; title: string; description: string; reward: number; difficulty: string; accepted: boolean; completed: boolean }
3
+ let quests: Quest[] = [
4
+ { id: '1', title: 'Avatar Awakening', description: 'Complete your avatar profile and connect your first provider.', reward: 200, difficulty: 'Easy', accepted: true, completed: true },
5
+ { id: '2', title: 'Karma Seeker', description: 'Earn 1000 karma through good deeds and OASIS contributions.', reward: 500, difficulty: 'Medium', accepted: true, completed: false },
6
+ { id: '3', title: 'The NFT Collector', description: 'Acquire 5 unique NFTs across different categories.', reward: 1000, difficulty: 'Hard', accepted: false, completed: false },
7
+ { id: '4', title: 'Omniverse Explorer', description: 'Visit every major hub location on the OASIS map.', reward: 2500, difficulty: 'Legendary', accepted: false, completed: false },
8
+ ]
9
+ function accept(q: Quest) { q.accepted = true; quests = [...quests] }
10
+ function complete(q: Quest) { q.completed = true; quests = [...quests] }
11
+ </script>
12
+ <div class="qst-shell">
13
+ <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>
14
+ <div class="qst-list">
15
+ {#each quests as q (q.id)}
16
+ <div class="qst-card" class:qst-card--active={q.accepted && !q.completed} class:qst-card--done={q.completed}>
17
+ <div class="qst-diff qst-diff--{q.difficulty.toLowerCase()}">{q.difficulty}</div>
18
+ <div class="qst-body">
19
+ <div class="qst-title-text">{q.title}</div>
20
+ <div class="qst-desc">{q.description}</div>
21
+ <div class="qst-reward">+{q.reward} karma</div>
22
+ </div>
23
+ <div class="qst-actions">
24
+ {#if q.completed}<div class="qst-done">✅ Done</div>
25
+ {:else if !q.accepted}<button class="qst-btn" on:click={() => accept(q)}>Accept Quest</button>
26
+ {:else}<button class="qst-btn qst-btn--finish" on:click={() => complete(q)}>Finish</button>{/if}
27
+ </div>
28
+ </div>
29
+ {/each}
30
+ </div>
31
+ </div>
32
+ <style>
33
+ .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}
34
+ </style>
@@ -0,0 +1,28 @@
1
+ <script lang="ts">
2
+ import { createEventDispatcher } from 'svelte'
3
+ import { OASISClient } from '@oasisomniverse/web4-api'
4
+ const dispatch = createEventDispatcher<{ switchTo: 'login' }>()
5
+ let password = '', confirmPassword = '', loading = false, error = '', done = false
6
+ async function submit() {
7
+ if (!password || !confirmPassword) { error = 'Please fill in all fields.'; return }
8
+ if (password !== confirmPassword) { error = 'Passwords do not match.'; return }
9
+ if (password.length < 6) { error = 'Password must be at least 6 characters.'; return }
10
+ loading = true; error = ''
11
+ try { const oasis = new OASISClient({ baseUrl: 'https://api.web4.oasisomniverse.one' }); await (oasis.auth as any).resetPassword({ password }); done = true }
12
+ catch (e: any) { error = e?.message ?? 'Reset failed. Please try again.' } finally { loading = false }
13
+ }
14
+ </script>
15
+ <div class="oasis-auth-form">
16
+ <div class="oasis-auth-header"><h2 class="oasis-auth-title">Reset Password</h2><p class="oasis-auth-sub">Enter your new password below.</p></div>
17
+ {#if error}<div class="oasis-auth-error">{error}</div>{/if}
18
+ {#if !done}
19
+ <div class="oasis-field"><label class="oasis-label">New Password</label><input class="oasis-input" type="password" bind:value={password} placeholder="min 6 characters" autocomplete="new-password" /></div>
20
+ <div class="oasis-field"><label class="oasis-label">Confirm Password</label><input class="oasis-input" type="password" bind:value={confirmPassword} placeholder="••••••••" autocomplete="new-password" /></div>
21
+ <button class="oasis-btn" disabled={loading} on:click={submit}>{loading ? 'Resetting…' : 'Reset Password'}</button>
22
+ {:else}
23
+ <div class="oasis-auth-success">✅ Password reset! <a class="oasis-link" href="#" on:click|preventDefault={() => dispatch('switchTo', 'login')}>Beam In</a></div>
24
+ {/if}
25
+ </div>
26
+ <style>
27
+ .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}
28
+ </style>
@@ -0,0 +1,44 @@
1
+ <script lang="ts">
2
+ import { OASISClient } from '@oasisomniverse/web4-api'
3
+ interface AvatarResult { id: string; username: string; firstName: string; lastName: string; karma: number }
4
+ let query = '', loading = false, error = '', searched = false
5
+ let results: AvatarResult[] = []
6
+ async function search() {
7
+ if (!query.trim()) return
8
+ loading = true; error = ''; searched = false; results = []
9
+ try {
10
+ const oasis = new OASISClient({ baseUrl: 'https://api.web4.oasisomniverse.one' })
11
+ const res: any = await (oasis.avatar as any).searchAvatars({ searchQuery: query })
12
+ results = Array.isArray(res?.result) ? res.result : []
13
+ searched = true
14
+ } catch (e: any) { error = e?.message ?? 'Search failed.' }
15
+ finally { loading = false }
16
+ }
17
+ </script>
18
+ <div class="sa-shell">
19
+ <div class="sa-header">
20
+ <h2 class="sa-title">🔍 Search Avatars</h2>
21
+ <p class="sa-sub">Find other OASIS avatars by username or name.</p>
22
+ </div>
23
+ <div class="sa-search-row">
24
+ <input class="oasis-input" type="text" bind:value={query} placeholder="Search by username…" on:keydown={(e) => e.key === 'Enter' && search()} />
25
+ <button class="oasis-btn" disabled={loading || !query.trim()} on:click={search}>{loading ? '…' : 'Search'}</button>
26
+ </div>
27
+ {#if error}<div class="oasis-auth-error">{error}</div>{/if}
28
+ {#if results.length > 0}
29
+ <div class="sa-results">
30
+ {#each results as a (a.id)}
31
+ <div 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
+ {/each}
37
+ </div>
38
+ {:else if searched && !loading}
39
+ <div class="sa-empty">No avatars found for "{query}".</div>
40
+ {/if}
41
+ </div>
42
+ <style>
43
+ .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}
44
+ </style>
@@ -0,0 +1,39 @@
1
+ <script lang="ts">
2
+ interface Seed { id: string; name: string; type: string; rarity: string; karma: number; planted: boolean }
3
+ let seeds: Seed[] = [
4
+ { id: '1', name: 'Wisdom Seed', type: 'Spiritual', rarity: 'Rare', karma: 50, planted: false },
5
+ { id: '2', name: 'Healing Seed', type: 'Health', rarity: 'Common', karma: 20, planted: false },
6
+ { id: '3', name: 'Unity Seed', type: 'Community', rarity: 'Epic', karma: 150, planted: false },
7
+ { id: '4', name: 'Truth Seed', type: 'Knowledge', rarity: 'Legendary', karma: 500, planted: false },
8
+ { id: '5', name: 'Love Seed', type: 'Spiritual', rarity: 'Common', karma: 30, planted: false },
9
+ { id: '6', name: 'Peace Seed', type: 'Community', rarity: 'Rare', karma: 75, planted: false },
10
+ ]
11
+ const icons: Record<string, string> = { Spiritual: '✨', Health: '💚', Community: '🤝', Knowledge: '📖' }
12
+ function seedIcon(type: string) { return icons[type] ?? '🌱' }
13
+ function plant(s: Seed) { s.planted = true; seeds = [...seeds] }
14
+ </script>
15
+ <div class="seeds-shell">
16
+ <div class="seeds-header">
17
+ <h2 class="seeds-title">🌱 Seeds</h2>
18
+ <p class="seeds-sub">Plant seeds to grow your OASIS avatar and earn karma.</p>
19
+ </div>
20
+ <div class="seeds-grid">
21
+ {#each seeds as s (s.id)}
22
+ <div class="seed-card" class:seed-card--planted={s.planted}>
23
+ <div class="seed-rarity seed-rarity--{s.rarity.toLowerCase()}">{s.rarity}</div>
24
+ <div class="seed-icon">{seedIcon(s.type)}</div>
25
+ <div class="seed-name">{s.name}</div>
26
+ <div class="seed-type">{s.type}</div>
27
+ <div class="seed-karma">+{s.karma} Karma</div>
28
+ {#if !s.planted}
29
+ <button class="seed-btn" on:click={() => plant(s)}>Plant Seed</button>
30
+ {:else}
31
+ <div class="seed-planted-label">🌿 Growing…</div>
32
+ {/if}
33
+ </div>
34
+ {/each}
35
+ </div>
36
+ </div>
37
+ <style>
38
+ .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}
39
+ </style>
@@ -0,0 +1,59 @@
1
+ <script lang="ts">
2
+ let openSection = '', saved = false
3
+ let prefs: Record<string, any> = { notifications: true, darkMode: true, sound: false, autoSave: true, language: 'English', theme: 'Dark Space', currency: 'ETH' }
4
+ const sections = [
5
+ { icon: '🔔', label: 'Notifications', options: [
6
+ { key: 'notifications', name: 'Enable Notifications', desc: 'Receive alerts for karma, messages and quests.', type: 'toggle' },
7
+ { key: 'sound', name: 'Sound Effects', desc: 'Play sounds for OASIS events.', type: 'toggle' },
8
+ ]},
9
+ { icon: '🎨', label: 'Appearance', options: [
10
+ { key: 'darkMode', name: 'Dark Mode', desc: 'Use the dark space theme.', type: 'toggle' },
11
+ { key: 'theme', name: 'Theme', desc: 'Select your OASIS visual theme.', type: 'select', choices: ['Dark Space', 'Neon City', 'Forest Realm'] },
12
+ ]},
13
+ { icon: '🌐', label: 'Language & Region', options: [
14
+ { key: 'language', name: 'Language', desc: 'Select your preferred language.', type: 'select', choices: ['English', 'Spanish', 'French', 'German', 'Japanese'] },
15
+ { key: 'currency', name: 'Currency', desc: 'Display currency for prices.', type: 'select', choices: ['ETH', 'SOL', 'USD', 'GBP', 'EUR'] },
16
+ ]},
17
+ { icon: '💾', label: 'Data', options: [
18
+ { key: 'autoSave', name: 'Auto-save Progress', desc: 'Automatically save your OASIS progress.', type: 'toggle' },
19
+ ]},
20
+ ]
21
+ function toggleSection(label: string) { openSection = openSection === label ? '' : label }
22
+ function togglePref(key: string) { prefs[key] = !prefs[key]; prefs = { ...prefs } }
23
+ function save() { saved = true; setTimeout(() => saved = false, 2000) }
24
+ </script>
25
+ <div class="sett-shell">
26
+ <div class="sett-header"><h2 class="sett-title">⚙️ Settings</h2><p class="sett-sub">Manage your OASIS account and preferences.</p></div>
27
+ <div class="sett-sections">
28
+ {#each sections as sec}
29
+ <div class="sett-section" class:sett-section--open={openSection === sec.label}>
30
+ <div class="sett-section-header" on:click={() => toggleSection(sec.label)}>
31
+ <span class="sett-section-icon">{sec.icon}</span>
32
+ <span class="sett-section-label">{sec.label}</span>
33
+ <span class="sett-chevron">{openSection === sec.label ? '▲' : '▼'}</span>
34
+ </div>
35
+ {#if openSection === sec.label}
36
+ <div class="sett-section-body">
37
+ {#each sec.options as opt}
38
+ <div class="sett-opt">
39
+ <div class="sett-opt-info"><div class="sett-opt-name">{opt.name}</div><div class="sett-opt-desc">{opt.desc}</div></div>
40
+ {#if opt.type === 'toggle'}
41
+ <div class="sett-toggle" class:sett-toggle--on={prefs[opt.key]} on:click={() => togglePref(opt.key)}><div class="sett-toggle-knob"></div></div>
42
+ {/if}
43
+ {#if opt.type === 'select'}
44
+ <select class="sett-select" bind:value={prefs[opt.key]}>
45
+ {#each opt.choices as c}<option value={c}>{c}</option>{/each}
46
+ </select>
47
+ {/if}
48
+ </div>
49
+ {/each}
50
+ </div>
51
+ {/if}
52
+ </div>
53
+ {/each}
54
+ </div>
55
+ <button class="oasis-btn" on:click={save}>{saved ? '✅ Saved!' : 'Save Settings'}</button>
56
+ </div>
57
+ <style>
58
+ .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}
59
+ </style>
@@ -0,0 +1,115 @@
1
+ <script lang="ts">
2
+ import { createEventDispatcher } from 'svelte'
3
+ import { register } from './oasisStore'
4
+
5
+ const dispatch = createEventDispatcher<{ switchTo: 'login' }>()
6
+
7
+ let firstName = '', lastName = '', username = '', email = ''
8
+ let password = '', confirmPassword = ''
9
+ let acceptTerms = false
10
+ let loading = false
11
+ let error = ''
12
+ let success = false
13
+
14
+ async function submit() {
15
+ if (!firstName || !lastName || !username || !email || !password) {
16
+ error = 'Please fill in all fields.'; return
17
+ }
18
+ if (password !== confirmPassword) { error = 'Passwords do not match.'; return }
19
+ if (password.length < 6) { error = 'Password must be at least 6 characters.'; return }
20
+ if (!acceptTerms) { error = 'Please accept the Terms of Service.'; return }
21
+ loading = true
22
+ error = ''
23
+ try {
24
+ await register(firstName, lastName, username, email, password)
25
+ success = true
26
+ } catch (e: any) {
27
+ error = e?.message ?? 'Registration failed. Please try again.'
28
+ } finally {
29
+ loading = false
30
+ }
31
+ }
32
+ </script>
33
+
34
+ <div class="oasis-auth-form">
35
+ <div class="oasis-auth-header">
36
+ <h2 class="oasis-auth-title">Sign Up</h2>
37
+ <p class="oasis-auth-sub">
38
+ Already have an account?
39
+ <a class="oasis-link" href="#" on:click|preventDefault={() => dispatch('switchTo', 'login')}>Beam In</a>
40
+ </p>
41
+ </div>
42
+
43
+ {#if error}
44
+ <div class="oasis-auth-error">{error}</div>
45
+ {/if}
46
+
47
+ {#if !success}
48
+ <div class="oasis-grid-2">
49
+ <div class="oasis-field">
50
+ <label class="oasis-label" for="su-first">First Name</label>
51
+ <input class="oasis-input" id="su-first" type="text" bind:value={firstName} placeholder="John" />
52
+ </div>
53
+ <div class="oasis-field">
54
+ <label class="oasis-label" for="su-last">Last Name</label>
55
+ <input class="oasis-input" id="su-last" type="text" bind:value={lastName} placeholder="Doe" />
56
+ </div>
57
+ </div>
58
+
59
+ <div class="oasis-grid-2">
60
+ <div class="oasis-field">
61
+ <label class="oasis-label" for="su-username">Username</label>
62
+ <input class="oasis-input" id="su-username" type="text" bind:value={username} placeholder="johndoe" autocomplete="username" />
63
+ </div>
64
+ <div class="oasis-field">
65
+ <label class="oasis-label" for="su-email">Email</label>
66
+ <input class="oasis-input" id="su-email" type="email" bind:value={email} placeholder="name@example.com" autocomplete="email" />
67
+ </div>
68
+ </div>
69
+
70
+ <div class="oasis-grid-2">
71
+ <div class="oasis-field">
72
+ <label class="oasis-label" for="su-pwd">Password</label>
73
+ <input class="oasis-input" id="su-pwd" type="password" bind:value={password} placeholder="min 6 characters" autocomplete="new-password" />
74
+ </div>
75
+ <div class="oasis-field">
76
+ <label class="oasis-label" for="su-cpwd">Confirm Password</label>
77
+ <input class="oasis-input" id="su-cpwd" type="password" bind:value={confirmPassword} placeholder="••••••••" autocomplete="new-password" />
78
+ </div>
79
+ </div>
80
+
81
+ <div class="oasis-field oasis-field--row">
82
+ <input class="oasis-checkbox" id="su-terms" type="checkbox" bind:checked={acceptTerms} />
83
+ <label class="oasis-label oasis-label--inline" for="su-terms">I accept the Terms of Service</label>
84
+ </div>
85
+
86
+ <button class="oasis-btn" type="button" disabled={loading} on:click={submit}>
87
+ {loading ? 'Creating account…' : 'Create Account'}
88
+ </button>
89
+ {:else}
90
+ <div class="oasis-auth-success">
91
+ ✅ Account created!
92
+ <a class="oasis-link" href="#" on:click|preventDefault={() => dispatch('switchTo', 'login')}>Beam In</a>
93
+ </div>
94
+ {/if}
95
+ </div>
96
+
97
+ <style>
98
+ .oasis-auth-form { display:flex; flex-direction:column; gap:18px; }
99
+ .oasis-auth-header { text-align:center; }
100
+ .oasis-auth-title { font-family:'Orbitron',sans-serif; font-size:22px; color:#fff; margin:0 0 6px; }
101
+ .oasis-auth-sub { font-size:13px; color:#7a9bbf; margin:0; }
102
+ .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; }
103
+ .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; }
104
+ .oasis-grid-2 { display:grid; grid-template-columns:1fr 1fr; gap:14px; }
105
+ .oasis-field { display:flex; flex-direction:column; gap:6px; }
106
+ .oasis-field--row { flex-direction:row; align-items:center; gap:10px; }
107
+ .oasis-label { font-size:12px; font-weight:600; letter-spacing:.06em; color:#7a9bbf; text-transform:uppercase; }
108
+ .oasis-label--inline { text-transform:none; font-size:13px; color:#a8bfd8; }
109
+ .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; }
110
+ .oasis-input:focus { border-color:rgba(0,200,255,.5); }
111
+ .oasis-checkbox { width:16px; height:16px; accent-color:#00c8ff; cursor:pointer; flex-shrink:0; }
112
+ .oasis-link { color:#00c8ff; text-decoration:none; cursor:pointer; }
113
+ .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; }
114
+ .oasis-btn:disabled { opacity:.5; cursor:not-allowed; }
115
+ </style>
@@ -0,0 +1,47 @@
1
+ <script lang="ts">
2
+ import { onMount, onDestroy } from 'svelte'
3
+ let canvas: HTMLCanvasElement
4
+ let animId = 0
5
+
6
+ onMount(() => {
7
+ const ctx = canvas.getContext('2d')!
8
+ const stars = Array.from({ length: 160 }, () => ({
9
+ x: Math.random(), y: Math.random(),
10
+ r: Math.random() * 1.2 + 0.2,
11
+ o: Math.random(),
12
+ s: (Math.random() - 0.5) * 0.002,
13
+ }))
14
+
15
+ const resize = () => { canvas.width = window.innerWidth; canvas.height = window.innerHeight }
16
+ resize()
17
+ window.addEventListener('resize', resize)
18
+
19
+ const draw = () => {
20
+ ctx.clearRect(0, 0, canvas.width, canvas.height)
21
+ for (const s of stars) {
22
+ s.o += s.s
23
+ if (s.o < 0.1 || s.o > 1) s.s = -s.s
24
+ ctx.beginPath()
25
+ ctx.arc(s.x * canvas.width, s.y * canvas.height, s.r, 0, Math.PI * 2)
26
+ ctx.fillStyle = `rgba(200,220,255,${s.o.toFixed(2)})`
27
+ ctx.fill()
28
+ }
29
+ animId = requestAnimationFrame(draw)
30
+ }
31
+ draw()
32
+
33
+ return () => {
34
+ cancelAnimationFrame(animId)
35
+ window.removeEventListener('resize', resize)
36
+ }
37
+ })
38
+ </script>
39
+
40
+ <canvas bind:this={canvas} class="star-canvas" />
41
+
42
+ <style>
43
+ .star-canvas {
44
+ position: fixed; inset: 0; z-index: 0;
45
+ pointer-events: none; width: 100%; height: 100%;
46
+ }
47
+ </style>
@@ -0,0 +1,18 @@
1
+ <script lang="ts">
2
+ import { OASISClient } from '@oasisomniverse/web4-api'
3
+ let loading = false, error = '', sent = false
4
+ async function resend() {
5
+ loading = true; error = ''; sent = false
6
+ try { const oasis = new OASISClient({ baseUrl: 'https://api.web4.oasisomniverse.one' }); await (oasis.auth as any).resendVerificationEmail(); sent = true }
7
+ catch (e: any) { error = e?.message ?? 'Failed to resend.' } finally { loading = false }
8
+ }
9
+ </script>
10
+ <div class="oasis-auth-form">
11
+ <div class="oasis-auth-header"><div style="font-size:48px;margin-bottom:12px">📧</div><h2 class="oasis-auth-title">Verify Your Email</h2><p class="oasis-auth-sub">Check your inbox and click the link to activate your account.</p></div>
12
+ {#if error}<div class="oasis-auth-error">{error}</div>{/if}
13
+ {#if sent}<div class="oasis-auth-success">✅ Verification email resent!</div>{/if}
14
+ <button class="oasis-btn oasis-btn--ghost" disabled={loading} on:click={resend}>{loading ? 'Sending…' : 'Resend Verification Email'}</button>
15
+ </div>
16
+ <style>
17
+ .oasis-auth-form{display:flex;flex-direction:column;gap:20px;text-align:center}.oasis-auth-header{display:flex;flex-direction:column;align-items:center}.oasis-auth-title{font-family:'Orbitron',sans-serif;font-size:20px;color:#fff;margin:0 0 8px}.oasis-auth-sub{font-size:13px;color:#7a9bbf;margin:0;line-height:1.6}.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-btn{border:none;border-radius:8px;font-family:'Orbitron',sans-serif;font-size:13px;font-weight:700;letter-spacing:.08em;padding:12px;cursor:pointer;transition:opacity .2s}.oasis-btn--ghost{background:transparent;border:1px solid rgba(0,200,255,.3);color:#00c8ff}.oasis-btn:disabled{opacity:.5;cursor:not-allowed}
18
+ </style>
@@ -0,0 +1,42 @@
1
+ <script lang="ts">
2
+ const balances = [
3
+ { icon: '⟠', currency: 'Ethereum', network: 'Mainnet', amount: '0.4821', symbol: 'ETH' },
4
+ { icon: '◎', currency: 'Solana', network: 'Mainnet', amount: '12.305', symbol: 'SOL' },
5
+ { icon: '⬡', currency: 'Polygon', network: 'Mainnet', amount: '245.00', symbol: 'MATIC' },
6
+ ]
7
+ const transactions = [
8
+ { id: '1', type: 'in', amount: 0.05, currency: 'ETH', description: 'NFT Sale — Cosmic Warrior', date: '2 hours ago' },
9
+ { id: '2', type: 'out', amount: 12, currency: 'SOL', description: 'Quest Reward Conversion', date: '1 day ago' },
10
+ { id: '3', type: 'in', amount: 100, currency: 'MATIC', description: 'Karma Reward Payout', date: '3 days ago' },
11
+ ]
12
+ </script>
13
+ <div class="wlt-shell">
14
+ <div class="wlt-header"><h2 class="wlt-title">💰 Wallet</h2><p class="wlt-sub">Your OASIS multi-chain wallet.</p></div>
15
+ <div class="wlt-balances">
16
+ {#each balances as b (b.currency)}
17
+ <div class="wlt-balance-card">
18
+ <div class="wlt-currency-icon">{b.icon}</div>
19
+ <div class="wlt-currency-info"><div class="wlt-currency-name">{b.currency}</div><div class="wlt-currency-net">{b.network}</div></div>
20
+ <div class="wlt-amount">{b.amount} <span class="wlt-symbol">{b.symbol}</span></div>
21
+ </div>
22
+ {/each}
23
+ </div>
24
+ <div class="wlt-actions">
25
+ <button class="wlt-action-btn">📤 Send</button>
26
+ <button class="wlt-action-btn">📥 Receive</button>
27
+ <button class="wlt-action-btn">🔄 Swap</button>
28
+ </div>
29
+ <div class="wlt-tx-header">Recent Transactions</div>
30
+ <div class="wlt-tx-list">
31
+ {#each transactions as t (t.id)}
32
+ <div class="wlt-tx">
33
+ <div class="wlt-tx-icon wlt-tx-icon--{t.type}">{t.type === 'in' ? '↓' : '↑'}</div>
34
+ <div class="wlt-tx-info"><div class="wlt-tx-desc">{t.description}</div><div class="wlt-tx-date">{t.date}</div></div>
35
+ <div class="wlt-tx-amount wlt-tx-amount--{t.type}">{t.type === 'in' ? '+' : '-'}{t.amount} {t.currency}</div>
36
+ </div>
37
+ {/each}
38
+ </div>
39
+ </div>
40
+ <style>
41
+ .wlt-shell{display:flex;flex-direction:column;gap:18px}.wlt-header{text-align:center}.wlt-title{font-family:'Orbitron',sans-serif;font-size:20px;color:#fff;margin:0 0 6px}.wlt-sub{font-size:13px;color:#7a9bbf;margin:0}.wlt-balances{display:flex;flex-direction:column;gap:10px}.wlt-balance-card{display:flex;align-items:center;gap:14px;background:rgba(255,255,255,.04);border:1px solid rgba(0,200,255,.12);border-radius:10px;padding:14px 16px}.wlt-currency-icon{font-size:24px}.wlt-currency-info{flex:1}.wlt-currency-name{font-family:'Orbitron',sans-serif;font-size:13px;color:#fff}.wlt-currency-net{font-size:11px;color:#7a9bbf;margin-top:2px}.wlt-amount{font-family:'Share Tech Mono',monospace;font-size:16px;color:#00c8ff;font-weight:600}.wlt-symbol{font-size:12px;color:#7a9bbf}.wlt-actions{display:flex;gap:10px}.wlt-action-btn{flex:1;background:rgba(0,200,255,.08);border:1px solid rgba(0,200,255,.2);border-radius:8px;color:#00c8ff;font-family:'Orbitron',sans-serif;font-size:11px;font-weight:700;letter-spacing:.06em;padding:10px;cursor:pointer;transition:all .2s}.wlt-action-btn:hover{background:rgba(0,200,255,.15)}.wlt-tx-header{font-family:'Orbitron',sans-serif;font-size:12px;color:#7a9bbf;letter-spacing:.06em;text-transform:uppercase}.wlt-tx-list{display:flex;flex-direction:column;gap:8px}.wlt-tx{display:flex;align-items:center;gap:12px;padding:10px 14px;background:rgba(255,255,255,.03);border:1px solid rgba(0,200,255,.08);border-radius:8px}.wlt-tx-icon{width:28px;height:28px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:14px;font-weight:700;flex-shrink:0}.wlt-tx-icon--in{background:rgba(72,220,130,.15);color:#48dc82}.wlt-tx-icon--out{background:rgba(255,107,107,.15);color:#ff6b6b}.wlt-tx-info{flex:1}.wlt-tx-desc{font-size:13px;color:#e0f0ff}.wlt-tx-date{font-size:11px;color:#4a6a88;margin-top:2px}.wlt-tx-amount{font-family:'Share Tech Mono',monospace;font-size:13px;font-weight:600;white-space:nowrap}.wlt-tx-amount--in{color:#48dc82}.wlt-tx-amount--out{color:#ff6b6b}
42
+ </style>
@@ -0,0 +1,17 @@
1
+ <script lang="ts">
2
+ import { createEventDispatcher } from 'svelte'
3
+ export let show = false
4
+ const dispatch = createEventDispatcher()
5
+ function close() { dispatch('hide') }
6
+ </script>
7
+ {#if show}
8
+ <div class="cs-shell">
9
+ <div class="cs-icon">ℹ️</div>
10
+ <h2 class="cs-title">Avatar Wallet</h2>
11
+ <p class="cs-body">UI Coming Soon — use the OASIS API from the Developer menu for this functionality.</p>
12
+ <button class="cs-btn" on:click={close}>OK</button>
13
+ </div>
14
+ {/if}
15
+ <style>
16
+ .cs-shell{display:flex;flex-direction:column;align-items:center;gap:16px;padding:40px 20px;text-align:center}.cs-icon{font-size:48px}.cs-title{font-family:Orbitron,sans-serif;font-size:18px;color:#fff;margin:0}.cs-body{font-size:13px;color:#7a9bbf;line-height:1.6;margin:0;max-width:340px}.cs-btn{margin-top:8px;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 28px;cursor:pointer}
17
+ </style>
@@ -0,0 +1,17 @@
1
+ <script lang="ts">
2
+ import { createEventDispatcher } from 'svelte'
3
+ export let show = false
4
+ const dispatch = createEventDispatcher()
5
+ function close() { dispatch('hide') }
6
+ </script>
7
+ {#if show}
8
+ <div class="cs-shell">
9
+ <div class="cs-icon">ℹ️</div>
10
+ <h2 class="cs-title">Edit Avatar</h2>
11
+ <p class="cs-body">UI Coming Soon — use the OASIS API from the Developer menu for this functionality.</p>
12
+ <button class="cs-btn" on:click={close}>OK</button>
13
+ </div>
14
+ {/if}
15
+ <style>
16
+ .cs-shell{display:flex;flex-direction:column;align-items:center;gap:16px;padding:40px 20px;text-align:center}.cs-icon{font-size:48px}.cs-title{font-family:Orbitron,sans-serif;font-size:18px;color:#fff;margin:0}.cs-body{font-size:13px;color:#7a9bbf;line-height:1.6;margin:0;max-width:340px}.cs-btn{margin-top:8px;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 28px;cursor:pointer}
17
+ </style>
@@ -0,0 +1,17 @@
1
+ <script lang="ts">
2
+ import { createEventDispatcher } from 'svelte'
3
+ export let show = false
4
+ const dispatch = createEventDispatcher()
5
+ function close() { dispatch('hide') }
6
+ </script>
7
+ {#if show}
8
+ <div class="cs-shell">
9
+ <div class="cs-icon">ℹ️</div>
10
+ <h2 class="cs-title">Search Avatar</h2>
11
+ <p class="cs-body">UI Coming Soon — use the OASIS API from the Developer menu for this functionality.</p>
12
+ <button class="cs-btn" on:click={close}>OK</button>
13
+ </div>
14
+ {/if}
15
+ <style>
16
+ .cs-shell{display:flex;flex-direction:column;align-items:center;gap:16px;padding:40px 20px;text-align:center}.cs-icon{font-size:48px}.cs-title{font-family:Orbitron,sans-serif;font-size:18px;color:#fff;margin:0}.cs-body{font-size:13px;color:#7a9bbf;line-height:1.6;margin:0;max-width:340px}.cs-btn{margin-top:8px;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 28px;cursor:pointer}
17
+ </style>
@@ -0,0 +1,17 @@
1
+ <script lang="ts">
2
+ import { createEventDispatcher } from 'svelte'
3
+ export let show = false
4
+ const dispatch = createEventDispatcher()
5
+ function close() { dispatch('hide') }
6
+ </script>
7
+ {#if show}
8
+ <div class="cs-shell">
9
+ <div class="cs-icon">ℹ️</div>
10
+ <h2 class="cs-title">View Avatar</h2>
11
+ <p class="cs-body">UI Coming Soon — use the OASIS API from the Developer menu for this functionality.</p>
12
+ <button class="cs-btn" on:click={close}>OK</button>
13
+ </div>
14
+ {/if}
15
+ <style>
16
+ .cs-shell{display:flex;flex-direction:column;align-items:center;gap:16px;padding:40px 20px;text-align:center}.cs-icon{font-size:48px}.cs-title{font-family:Orbitron,sans-serif;font-size:18px;color:#fff;margin:0}.cs-body{font-size:13px;color:#7a9bbf;line-height:1.6;margin:0;max-width:340px}.cs-btn{margin-top:8px;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 28px;cursor:pointer}
17
+ </style>
@@ -0,0 +1,17 @@
1
+ <script lang="ts">
2
+ import { createEventDispatcher } from 'svelte'
3
+ export let show = false
4
+ const dispatch = createEventDispatcher()
5
+ function close() { dispatch('hide') }
6
+ </script>
7
+ {#if show}
8
+ <div class="cs-shell">
9
+ <div class="cs-icon">ℹ️</div>
10
+ <h2 class="cs-title">Coming Soon</h2>
11
+ <p class="cs-body">UI Coming Soon — use the OASIS API from the Developer menu for this functionality.</p>
12
+ <button class="cs-btn" on:click={close}>OK</button>
13
+ </div>
14
+ {/if}
15
+ <style>
16
+ .cs-shell{display:flex;flex-direction:column;align-items:center;gap:16px;padding:40px 20px;text-align:center}.cs-icon{font-size:48px}.cs-title{font-family:Orbitron,sans-serif;font-size:18px;color:#fff;margin:0}.cs-body{font-size:13px;color:#7a9bbf;line-height:1.6;margin:0;max-width:340px}.cs-btn{margin-top:8px;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 28px;cursor:pointer}
17
+ </style>
@@ -0,0 +1,17 @@
1
+ <script lang="ts">
2
+ import { createEventDispatcher } from 'svelte'
3
+ export let show = false
4
+ const dispatch = createEventDispatcher()
5
+ function close() { dispatch('hide') }
6
+ </script>
7
+ {#if show}
8
+ <div class="cs-shell">
9
+ <div class="cs-icon">ℹ️</div>
10
+ <h2 class="cs-title">Confirmation</h2>
11
+ <p class="cs-body">UI Coming Soon — use the OASIS API from the Developer menu for this functionality.</p>
12
+ <button class="cs-btn" on:click={close}>OK</button>
13
+ </div>
14
+ {/if}
15
+ <style>
16
+ .cs-shell{display:flex;flex-direction:column;align-items:center;gap:16px;padding:40px 20px;text-align:center}.cs-icon{font-size:48px}.cs-title{font-family:Orbitron,sans-serif;font-size:18px;color:#fff;margin:0}.cs-body{font-size:13px;color:#7a9bbf;line-height:1.6;margin:0;max-width:340px}.cs-btn{margin-top:8px;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 28px;cursor:pointer}
17
+ </style>
@@ -0,0 +1,17 @@
1
+ <script lang="ts">
2
+ import { createEventDispatcher } from 'svelte'
3
+ export let show = false
4
+ const dispatch = createEventDispatcher()
5
+ function close() { dispatch('hide') }
6
+ </script>
7
+ {#if show}
8
+ <div class="cs-shell">
9
+ <div class="cs-icon">ℹ️</div>
10
+ <h2 class="cs-title">Contact</h2>
11
+ <p class="cs-body">UI Coming Soon — use the OASIS API from the Developer menu for this functionality.</p>
12
+ <button class="cs-btn" on:click={close}>OK</button>
13
+ </div>
14
+ {/if}
15
+ <style>
16
+ .cs-shell{display:flex;flex-direction:column;align-items:center;gap:16px;padding:40px 20px;text-align:center}.cs-icon{font-size:48px}.cs-title{font-family:Orbitron,sans-serif;font-size:18px;color:#fff;margin:0}.cs-body{font-size:13px;color:#7a9bbf;line-height:1.6;margin:0;max-width:340px}.cs-btn{margin-top:8px;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 28px;cursor:pointer}
17
+ </style>
@@ -0,0 +1,17 @@
1
+ <script lang="ts">
2
+ import { createEventDispatcher } from 'svelte'
3
+ export let show = false
4
+ const dispatch = createEventDispatcher()
5
+ function close() { dispatch('hide') }
6
+ </script>
7
+ {#if show}
8
+ <div class="cs-shell">
9
+ <div class="cs-icon">ℹ️</div>
10
+ <h2 class="cs-title">Add Data</h2>
11
+ <p class="cs-body">UI Coming Soon — use the OASIS API from the Developer menu for this functionality.</p>
12
+ <button class="cs-btn" on:click={close}>OK</button>
13
+ </div>
14
+ {/if}
15
+ <style>
16
+ .cs-shell{display:flex;flex-direction:column;align-items:center;gap:16px;padding:40px 20px;text-align:center}.cs-icon{font-size:48px}.cs-title{font-family:Orbitron,sans-serif;font-size:18px;color:#fff;margin:0}.cs-body{font-size:13px;color:#7a9bbf;line-height:1.6;margin:0;max-width:340px}.cs-btn{margin-top:8px;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 28px;cursor:pointer}
17
+ </style>
@@ -0,0 +1,17 @@
1
+ <script lang="ts">
2
+ import { createEventDispatcher } from 'svelte'
3
+ export let show = false
4
+ const dispatch = createEventDispatcher()
5
+ function close() { dispatch('hide') }
6
+ </script>
7
+ {#if show}
8
+ <div class="cs-shell">
9
+ <div class="cs-icon">ℹ️</div>
10
+ <h2 class="cs-title">Cross-Chain Management</h2>
11
+ <p class="cs-body">UI Coming Soon — use the OASIS API from the Developer menu for this functionality.</p>
12
+ <button class="cs-btn" on:click={close}>OK</button>
13
+ </div>
14
+ {/if}
15
+ <style>
16
+ .cs-shell{display:flex;flex-direction:column;align-items:center;gap:16px;padding:40px 20px;text-align:center}.cs-icon{font-size:48px}.cs-title{font-family:Orbitron,sans-serif;font-size:18px;color:#fff;margin:0}.cs-body{font-size:13px;color:#7a9bbf;line-height:1.6;margin:0;max-width:340px}.cs-btn{margin-top:8px;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 28px;cursor:pointer}
17
+ </style>