@oasisomniverse/react 1.0.0 β 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +68 -53
- package/package.json +72 -72
- package/src/components/common/AvatarConnect.jsx +89 -89
- package/src/components/common/Contact.jsx +60 -60
- package/src/components/common/Eggs.jsx +50 -50
- package/src/components/common/Game.jsx +36 -36
- package/src/components/common/HyperDrive.jsx +50 -50
- package/src/components/common/KarmaToast.jsx +38 -38
- package/src/components/common/Map.jsx +42 -42
- package/src/components/common/MenuMessage.jsx +70 -70
- package/src/components/common/Messaging.jsx +74 -74
- package/src/components/common/Mission.jsx +40 -40
- package/src/components/common/NFT.jsx +42 -42
- package/src/components/common/NavBar.jsx +52 -52
- package/src/components/common/OApp.jsx +41 -41
- package/src/components/common/ONET.jsx +50 -50
- package/src/components/common/ONODE.jsx +49 -49
- package/src/components/common/OasisModal.css +9 -9
- package/src/components/common/OasisModal.jsx +29 -29
- package/src/components/common/ProviderDropdown.jsx +61 -61
- package/src/components/common/Providers.jsx +38 -38
- package/src/components/common/Quest.jsx +40 -40
- package/src/components/common/SearchAvatars.jsx +49 -49
- package/src/components/common/Seeds.jsx +39 -39
- package/src/components/common/Settings.jsx +70 -70
- package/src/components/common/StarField.jsx +56 -56
- package/src/components/common/Wallet.jsx +45 -45
- package/src/components/index.js +26 -26
|
@@ -1,49 +1,49 @@
|
|
|
1
|
-
import { useState } from 'react';
|
|
2
|
-
import { OASISClient } from '@oasisomniverse/web4-api';
|
|
3
|
-
|
|
4
|
-
export function SearchAvatars() {
|
|
5
|
-
const [query, setQuery] = useState('');
|
|
6
|
-
const [loading, setLoading] = useState(false);
|
|
7
|
-
const [error, setError] = useState('');
|
|
8
|
-
const [results, setResults] = useState([]);
|
|
9
|
-
const [searched, setSearched] = useState(false);
|
|
10
|
-
|
|
11
|
-
async function search() {
|
|
12
|
-
if (!query.trim()) return;
|
|
13
|
-
setLoading(true); setError(''); setResults([]); setSearched(false);
|
|
14
|
-
try {
|
|
15
|
-
const oasis = new OASISClient({ baseUrl: 'https://api.web4.oasisomniverse.one' });
|
|
16
|
-
const res = await oasis.avatar?.searchAvatars?.({ searchQuery: query });
|
|
17
|
-
setResults(Array.isArray(res?.result) ? res.result : []);
|
|
18
|
-
setSearched(true);
|
|
19
|
-
} catch (e) { setError(e?.message ?? 'Search failed.'); }
|
|
20
|
-
finally { setLoading(false); }
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
return (
|
|
24
|
-
<div style={{ display: 'flex', flexDirection: 'column', gap: 18 }}>
|
|
25
|
-
<div style={{ textAlign: 'center' }}>
|
|
26
|
-
<h2 style={{ fontFamily: "'Orbitron',sans-serif", fontSize: 20, color: '#fff', margin: '0 0 6px' }}>π Search Avatars</h2>
|
|
27
|
-
<p style={{ fontSize: 13, color: '#7a9bbf', margin: 0 }}>Find other OASIS avatars by username or name.</p>
|
|
28
|
-
</div>
|
|
29
|
-
<div style={{ display: 'flex', gap: 10 }}>
|
|
30
|
-
<input style={{ flex: 1, background: 'rgba(255,255,255,.05)', border: '1px solid rgba(0,200,255,.2)', borderRadius: 8, padding: '10px 14px', color: '#fff', fontSize: 14, outline: 'none' }} value={query} onChange={e => setQuery(e.target.value)} onKeyDown={e => e.key === 'Enter' && search()} placeholder="Search by usernameβ¦" />
|
|
31
|
-
<button onClick={search} disabled={loading || !query.trim()} style={{ background: 'linear-gradient(135deg,#00c8ff,#0080ff)', border: 'none', borderRadius: 8, color: '#fff', fontFamily: "'Orbitron',sans-serif", fontSize: 12, fontWeight: 700, letterSpacing: '.08em', padding: '10px 20px', cursor: 'pointer', opacity: loading || !query.trim() ? .4 : 1 }}>{loading ? 'β¦' : 'Search'}</button>
|
|
32
|
-
</div>
|
|
33
|
-
{error && <div style={{ background: 'rgba(255,80,80,.12)', border: '1px solid rgba(255,80,80,.3)', color: '#ff6b6b', borderRadius: 8, padding: '10px 14px', fontSize: 13 }}>{error}</div>}
|
|
34
|
-
{results.length > 0 ? (
|
|
35
|
-
<div style={{ display: 'flex', flexDirection: 'column', gap: 10 }}>
|
|
36
|
-
{results.map(a => (
|
|
37
|
-
<div key={a.id} style={{ display: 'flex', alignItems: 'center', gap: 14, padding: '14px 16px', background: 'rgba(255,255,255,.04)', border: '1px solid rgba(0,200,255,.12)', borderRadius: 10 }}>
|
|
38
|
-
<div style={{ fontSize: 28 }}>π€</div>
|
|
39
|
-
<div style={{ flex: 1 }}><div style={{ fontFamily: "'Orbitron',sans-serif", fontSize: 13, color: '#fff' }}>{a.username}</div><div style={{ fontSize: 12, color: '#7a9bbf', marginTop: 2 }}>{a.firstName} {a.lastName}</div></div>
|
|
40
|
-
<div style={{ fontSize: 12, color: '#48dc82', fontWeight: 600, whiteSpace: 'nowrap' }}>{a.karma} karma</div>
|
|
41
|
-
</div>
|
|
42
|
-
))}
|
|
43
|
-
</div>
|
|
44
|
-
) : searched && !loading ? (
|
|
45
|
-
<div style={{ textAlign: 'center', color: '#4a6a88', fontSize: 14, padding: 24 }}>No avatars found for "{query}".</div>
|
|
46
|
-
) : null}
|
|
47
|
-
</div>
|
|
48
|
-
);
|
|
49
|
-
}
|
|
1
|
+
import { useState } from 'react';
|
|
2
|
+
import { OASISClient } from '@oasisomniverse/web4-api';
|
|
3
|
+
|
|
4
|
+
export function SearchAvatars() {
|
|
5
|
+
const [query, setQuery] = useState('');
|
|
6
|
+
const [loading, setLoading] = useState(false);
|
|
7
|
+
const [error, setError] = useState('');
|
|
8
|
+
const [results, setResults] = useState([]);
|
|
9
|
+
const [searched, setSearched] = useState(false);
|
|
10
|
+
|
|
11
|
+
async function search() {
|
|
12
|
+
if (!query.trim()) return;
|
|
13
|
+
setLoading(true); setError(''); setResults([]); setSearched(false);
|
|
14
|
+
try {
|
|
15
|
+
const oasis = new OASISClient({ baseUrl: 'https://api.web4.oasisomniverse.one' });
|
|
16
|
+
const res = await oasis.avatar?.searchAvatars?.({ searchQuery: query });
|
|
17
|
+
setResults(Array.isArray(res?.result) ? res.result : []);
|
|
18
|
+
setSearched(true);
|
|
19
|
+
} catch (e) { setError(e?.message ?? 'Search failed.'); }
|
|
20
|
+
finally { setLoading(false); }
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
return (
|
|
24
|
+
<div style={{ display: 'flex', flexDirection: 'column', gap: 18 }}>
|
|
25
|
+
<div style={{ textAlign: 'center' }}>
|
|
26
|
+
<h2 style={{ fontFamily: "'Orbitron',sans-serif", fontSize: 20, color: '#fff', margin: '0 0 6px' }}>π Search Avatars</h2>
|
|
27
|
+
<p style={{ fontSize: 13, color: '#7a9bbf', margin: 0 }}>Find other OASIS avatars by username or name.</p>
|
|
28
|
+
</div>
|
|
29
|
+
<div style={{ display: 'flex', gap: 10 }}>
|
|
30
|
+
<input style={{ flex: 1, background: 'rgba(255,255,255,.05)', border: '1px solid rgba(0,200,255,.2)', borderRadius: 8, padding: '10px 14px', color: '#fff', fontSize: 14, outline: 'none' }} value={query} onChange={e => setQuery(e.target.value)} onKeyDown={e => e.key === 'Enter' && search()} placeholder="Search by usernameβ¦" />
|
|
31
|
+
<button onClick={search} disabled={loading || !query.trim()} style={{ background: 'linear-gradient(135deg,#00c8ff,#0080ff)', border: 'none', borderRadius: 8, color: '#fff', fontFamily: "'Orbitron',sans-serif", fontSize: 12, fontWeight: 700, letterSpacing: '.08em', padding: '10px 20px', cursor: 'pointer', opacity: loading || !query.trim() ? .4 : 1 }}>{loading ? 'β¦' : 'Search'}</button>
|
|
32
|
+
</div>
|
|
33
|
+
{error && <div style={{ background: 'rgba(255,80,80,.12)', border: '1px solid rgba(255,80,80,.3)', color: '#ff6b6b', borderRadius: 8, padding: '10px 14px', fontSize: 13 }}>{error}</div>}
|
|
34
|
+
{results.length > 0 ? (
|
|
35
|
+
<div style={{ display: 'flex', flexDirection: 'column', gap: 10 }}>
|
|
36
|
+
{results.map(a => (
|
|
37
|
+
<div key={a.id} style={{ display: 'flex', alignItems: 'center', gap: 14, padding: '14px 16px', background: 'rgba(255,255,255,.04)', border: '1px solid rgba(0,200,255,.12)', borderRadius: 10 }}>
|
|
38
|
+
<div style={{ fontSize: 28 }}>π€</div>
|
|
39
|
+
<div style={{ flex: 1 }}><div style={{ fontFamily: "'Orbitron',sans-serif", fontSize: 13, color: '#fff' }}>{a.username}</div><div style={{ fontSize: 12, color: '#7a9bbf', marginTop: 2 }}>{a.firstName} {a.lastName}</div></div>
|
|
40
|
+
<div style={{ fontSize: 12, color: '#48dc82', fontWeight: 600, whiteSpace: 'nowrap' }}>{a.karma} karma</div>
|
|
41
|
+
</div>
|
|
42
|
+
))}
|
|
43
|
+
</div>
|
|
44
|
+
) : searched && !loading ? (
|
|
45
|
+
<div style={{ textAlign: 'center', color: '#4a6a88', fontSize: 14, padding: 24 }}>No avatars found for "{query}".</div>
|
|
46
|
+
) : null}
|
|
47
|
+
</div>
|
|
48
|
+
);
|
|
49
|
+
}
|
|
@@ -1,39 +1,39 @@
|
|
|
1
|
-
import { useState } from 'react';
|
|
2
|
-
|
|
3
|
-
const RARITY_COLORS = { Common: '#7a9bbf', Rare: '#5ba8ff', Epic: '#b87fff', Legendary: '#ffb43c' };
|
|
4
|
-
const ICONS = { Spiritual: 'β¨', Health: 'π', Community: 'π€', Knowledge: 'π' };
|
|
5
|
-
const INITIAL = [
|
|
6
|
-
{ id: '1', name: 'Wisdom Seed', type: 'Spiritual', rarity: 'Rare', karma: 50, planted: false },
|
|
7
|
-
{ id: '2', name: 'Healing Seed', type: 'Health', rarity: 'Common', karma: 20, planted: false },
|
|
8
|
-
{ id: '3', name: 'Unity Seed', type: 'Community', rarity: 'Epic', karma: 150, planted: false },
|
|
9
|
-
{ id: '4', name: 'Truth Seed', type: 'Knowledge', rarity: 'Legendary', karma: 500, planted: false },
|
|
10
|
-
{ id: '5', name: 'Love Seed', type: 'Spiritual', rarity: 'Common', karma: 30, planted: false },
|
|
11
|
-
{ id: '6', name: 'Peace Seed', type: 'Community', rarity: 'Rare', karma: 75, planted: false },
|
|
12
|
-
];
|
|
13
|
-
|
|
14
|
-
export function Seeds() {
|
|
15
|
-
const [seeds, setSeeds] = useState(INITIAL);
|
|
16
|
-
function plant(id) { setSeeds(s => s.map(x => x.id === id ? { ...x, planted: true } : x)); }
|
|
17
|
-
return (
|
|
18
|
-
<div style={{ display: 'flex', flexDirection: 'column', gap: 20 }}>
|
|
19
|
-
<div style={{ textAlign: 'center' }}>
|
|
20
|
-
<h2 style={{ fontFamily: "'Orbitron',sans-serif", fontSize: 20, color: '#fff', margin: '0 0 6px' }}>π± Seeds</h2>
|
|
21
|
-
<p style={{ fontSize: 13, color: '#7a9bbf', margin: 0 }}>Plant seeds to grow your OASIS avatar and earn karma.</p>
|
|
22
|
-
</div>
|
|
23
|
-
<div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fill,minmax(160px,1fr))', gap: 16 }}>
|
|
24
|
-
{seeds.map(s => (
|
|
25
|
-
<div key={s.id} style={{ background: s.planted ? 'rgba(72,220,130,.04)' : 'rgba(255,255,255,.04)', border: `1px solid ${s.planted ? 'rgba(72,220,130,.3)' : 'rgba(0,200,255,.15)'}`, borderRadius: 12, padding: '18px 14px', display: 'flex', flexDirection: 'column', alignItems: 'center', gap: 10 }}>
|
|
26
|
-
<div style={{ fontSize: 10, fontWeight: 700, letterSpacing: '.1em', textTransform: 'uppercase', borderRadius: 999, padding: '3px 10px', border: `1px solid ${RARITY_COLORS[s.rarity]}44`, color: RARITY_COLORS[s.rarity] }}>{s.rarity}</div>
|
|
27
|
-
<div style={{ fontSize: 36 }}>{ICONS[s.type] ?? 'π±'}</div>
|
|
28
|
-
<div style={{ fontFamily: "'Orbitron',sans-serif", fontSize: 13, color: '#fff', textAlign: 'center' }}>{s.name}</div>
|
|
29
|
-
<div style={{ fontSize: 11, color: '#7a9bbf' }}>{s.type}</div>
|
|
30
|
-
<div style={{ fontSize: 12, color: '#48dc82', fontWeight: 600 }}>+{s.karma} Karma</div>
|
|
31
|
-
{s.planted
|
|
32
|
-
? <div style={{ fontSize: 12, color: '#48dc82', fontWeight: 600 }}>πΏ Growingβ¦</div>
|
|
33
|
-
: <button style={{ width: '100%', background: 'linear-gradient(135deg,#00c8ff,#0080ff)', border: 'none', borderRadius: 7, color: '#fff', fontFamily: "'Orbitron',sans-serif", fontSize: 11, fontWeight: 700, letterSpacing: '.08em', padding: 8, cursor: 'pointer' }} onClick={() => plant(s.id)}>Plant Seed</button>}
|
|
34
|
-
</div>
|
|
35
|
-
))}
|
|
36
|
-
</div>
|
|
37
|
-
</div>
|
|
38
|
-
);
|
|
39
|
-
}
|
|
1
|
+
import { useState } from 'react';
|
|
2
|
+
|
|
3
|
+
const RARITY_COLORS = { Common: '#7a9bbf', Rare: '#5ba8ff', Epic: '#b87fff', Legendary: '#ffb43c' };
|
|
4
|
+
const ICONS = { Spiritual: 'β¨', Health: 'π', Community: 'π€', Knowledge: 'π' };
|
|
5
|
+
const INITIAL = [
|
|
6
|
+
{ id: '1', name: 'Wisdom Seed', type: 'Spiritual', rarity: 'Rare', karma: 50, planted: false },
|
|
7
|
+
{ id: '2', name: 'Healing Seed', type: 'Health', rarity: 'Common', karma: 20, planted: false },
|
|
8
|
+
{ id: '3', name: 'Unity Seed', type: 'Community', rarity: 'Epic', karma: 150, planted: false },
|
|
9
|
+
{ id: '4', name: 'Truth Seed', type: 'Knowledge', rarity: 'Legendary', karma: 500, planted: false },
|
|
10
|
+
{ id: '5', name: 'Love Seed', type: 'Spiritual', rarity: 'Common', karma: 30, planted: false },
|
|
11
|
+
{ id: '6', name: 'Peace Seed', type: 'Community', rarity: 'Rare', karma: 75, planted: false },
|
|
12
|
+
];
|
|
13
|
+
|
|
14
|
+
export function Seeds() {
|
|
15
|
+
const [seeds, setSeeds] = useState(INITIAL);
|
|
16
|
+
function plant(id) { setSeeds(s => s.map(x => x.id === id ? { ...x, planted: true } : x)); }
|
|
17
|
+
return (
|
|
18
|
+
<div style={{ display: 'flex', flexDirection: 'column', gap: 20 }}>
|
|
19
|
+
<div style={{ textAlign: 'center' }}>
|
|
20
|
+
<h2 style={{ fontFamily: "'Orbitron',sans-serif", fontSize: 20, color: '#fff', margin: '0 0 6px' }}>π± Seeds</h2>
|
|
21
|
+
<p style={{ fontSize: 13, color: '#7a9bbf', margin: 0 }}>Plant seeds to grow your OASIS avatar and earn karma.</p>
|
|
22
|
+
</div>
|
|
23
|
+
<div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fill,minmax(160px,1fr))', gap: 16 }}>
|
|
24
|
+
{seeds.map(s => (
|
|
25
|
+
<div key={s.id} style={{ background: s.planted ? 'rgba(72,220,130,.04)' : 'rgba(255,255,255,.04)', border: `1px solid ${s.planted ? 'rgba(72,220,130,.3)' : 'rgba(0,200,255,.15)'}`, borderRadius: 12, padding: '18px 14px', display: 'flex', flexDirection: 'column', alignItems: 'center', gap: 10 }}>
|
|
26
|
+
<div style={{ fontSize: 10, fontWeight: 700, letterSpacing: '.1em', textTransform: 'uppercase', borderRadius: 999, padding: '3px 10px', border: `1px solid ${RARITY_COLORS[s.rarity]}44`, color: RARITY_COLORS[s.rarity] }}>{s.rarity}</div>
|
|
27
|
+
<div style={{ fontSize: 36 }}>{ICONS[s.type] ?? 'π±'}</div>
|
|
28
|
+
<div style={{ fontFamily: "'Orbitron',sans-serif", fontSize: 13, color: '#fff', textAlign: 'center' }}>{s.name}</div>
|
|
29
|
+
<div style={{ fontSize: 11, color: '#7a9bbf' }}>{s.type}</div>
|
|
30
|
+
<div style={{ fontSize: 12, color: '#48dc82', fontWeight: 600 }}>+{s.karma} Karma</div>
|
|
31
|
+
{s.planted
|
|
32
|
+
? <div style={{ fontSize: 12, color: '#48dc82', fontWeight: 600 }}>πΏ Growingβ¦</div>
|
|
33
|
+
: <button style={{ width: '100%', background: 'linear-gradient(135deg,#00c8ff,#0080ff)', border: 'none', borderRadius: 7, color: '#fff', fontFamily: "'Orbitron',sans-serif", fontSize: 11, fontWeight: 700, letterSpacing: '.08em', padding: 8, cursor: 'pointer' }} onClick={() => plant(s.id)}>Plant Seed</button>}
|
|
34
|
+
</div>
|
|
35
|
+
))}
|
|
36
|
+
</div>
|
|
37
|
+
</div>
|
|
38
|
+
);
|
|
39
|
+
}
|
|
@@ -1,70 +1,70 @@
|
|
|
1
|
-
import { useState } from 'react';
|
|
2
|
-
|
|
3
|
-
const SECTIONS = [
|
|
4
|
-
{ icon: 'π', label: 'Notifications', options: [
|
|
5
|
-
{ key: 'notifications', name: 'Enable Notifications', desc: 'Receive alerts for karma, messages and quests.', type: 'toggle' },
|
|
6
|
-
{ key: 'sound', name: 'Sound Effects', desc: 'Play sounds for OASIS events.', type: 'toggle' },
|
|
7
|
-
]},
|
|
8
|
-
{ icon: 'π¨', label: 'Appearance', options: [
|
|
9
|
-
{ key: 'darkMode', name: 'Dark Mode', desc: 'Use the dark space theme.', type: 'toggle' },
|
|
10
|
-
{ key: 'theme', name: 'Theme', desc: 'Select your OASIS visual theme.', type: 'select', choices: ['Dark Space', 'Neon City', 'Forest Realm'] },
|
|
11
|
-
]},
|
|
12
|
-
{ icon: 'π', label: 'Language & Region', options: [
|
|
13
|
-
{ key: 'language', name: 'Language', desc: 'Select your preferred language.', type: 'select', choices: ['English', 'Spanish', 'French', 'German', 'Japanese'] },
|
|
14
|
-
{ key: 'currency', name: 'Display Currency', desc: 'Currency for prices.', type: 'select', choices: ['ETH', 'SOL', 'USD', 'GBP', 'EUR'] },
|
|
15
|
-
]},
|
|
16
|
-
{ icon: 'πΎ', label: 'Data', options: [
|
|
17
|
-
{ key: 'autoSave', name: 'Auto-save Progress', desc: 'Automatically save your OASIS progress.', type: 'toggle' },
|
|
18
|
-
]},
|
|
19
|
-
];
|
|
20
|
-
|
|
21
|
-
export function Settings() {
|
|
22
|
-
const [open, setOpen] = useState('');
|
|
23
|
-
const [prefs, setPrefs] = useState({ notifications: true, darkMode: true, sound: false, autoSave: true, language: 'English', theme: 'Dark Space', currency: 'ETH' });
|
|
24
|
-
const [saved, setSaved] = useState(false);
|
|
25
|
-
function togglePref(k) { setPrefs(p => ({ ...p, [k]: !p[k] })); }
|
|
26
|
-
function setPref(k, v) { setPrefs(p => ({ ...p, [k]: v })); }
|
|
27
|
-
function save() { setSaved(true); setTimeout(() => setSaved(false), 2000); }
|
|
28
|
-
return (
|
|
29
|
-
<div style={{ display: 'flex', flexDirection: 'column', gap: 18 }}>
|
|
30
|
-
<div style={{ textAlign: 'center' }}>
|
|
31
|
-
<h2 style={{ fontFamily: "'Orbitron',sans-serif", fontSize: 20, color: '#fff', margin: '0 0 6px' }}>βοΈ Settings</h2>
|
|
32
|
-
<p style={{ fontSize: 13, color: '#7a9bbf', margin: 0 }}>Manage your OASIS account and preferences.</p>
|
|
33
|
-
</div>
|
|
34
|
-
<div style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>
|
|
35
|
-
{SECTIONS.map(sec => (
|
|
36
|
-
<div key={sec.label} style={{ background: 'rgba(255,255,255,.04)', border: `1px solid ${open === sec.label ? 'rgba(0,200,255,.3)' : 'rgba(0,200,255,.12)'}`, borderRadius: 10, overflow: 'hidden' }}>
|
|
37
|
-
<div onClick={() => setOpen(o => o === sec.label ? '' : sec.label)} style={{ display: 'flex', alignItems: 'center', gap: 10, padding: '14px 16px', cursor: 'pointer', userSelect: 'none' }}>
|
|
38
|
-
<span style={{ fontSize: 18 }}>{sec.icon}</span>
|
|
39
|
-
<span style={{ fontFamily: "'Orbitron',sans-serif", fontSize: 13, color: '#fff', flex: 1 }}>{sec.label}</span>
|
|
40
|
-
<span style={{ fontSize: 10, color: '#7a9bbf' }}>{open === sec.label ? 'β²' : 'βΌ'}</span>
|
|
41
|
-
</div>
|
|
42
|
-
{open === sec.label && (
|
|
43
|
-
<div style={{ padding: '0 16px 16px', display: 'flex', flexDirection: 'column', gap: 14 }}>
|
|
44
|
-
{sec.options.map(opt => (
|
|
45
|
-
<div key={opt.key} style={{ display: 'flex', alignItems: 'center', gap: 14 }}>
|
|
46
|
-
<div style={{ flex: 1 }}>
|
|
47
|
-
<div style={{ fontSize: 13, color: '#e0f0ff' }}>{opt.name}</div>
|
|
48
|
-
<div style={{ fontSize: 11, color: '#4a6a88', marginTop: 2 }}>{opt.desc}</div>
|
|
49
|
-
</div>
|
|
50
|
-
{opt.type === 'toggle' && (
|
|
51
|
-
<div onClick={() => togglePref(opt.key)} style={{ width: 44, height: 24, borderRadius: 999, background: prefs[opt.key] ? 'linear-gradient(135deg,#00c8ff,#0080ff)' : 'rgba(255,255,255,.1)', cursor: 'pointer', position: 'relative', flexShrink: 0 }}>
|
|
52
|
-
<div style={{ position: 'absolute', top: 3, left: prefs[opt.key] ? 23 : 3, width: 18, height: 18, borderRadius: '50%', background: '#fff', transition: 'left .2s' }} />
|
|
53
|
-
</div>
|
|
54
|
-
)}
|
|
55
|
-
{opt.type === 'select' && (
|
|
56
|
-
<select value={prefs[opt.key]} onChange={e => setPref(opt.key, e.target.value)} style={{ background: 'rgba(255,255,255,.05)', border: '1px solid rgba(0,200,255,.2)', borderRadius: 7, color: '#fff', fontSize: 12, padding: '6px 10px', outline: 'none' }}>
|
|
57
|
-
{opt.choices.map(c => <option key={c} value={c}>{c}</option>)}
|
|
58
|
-
</select>
|
|
59
|
-
)}
|
|
60
|
-
</div>
|
|
61
|
-
))}
|
|
62
|
-
</div>
|
|
63
|
-
)}
|
|
64
|
-
</div>
|
|
65
|
-
))}
|
|
66
|
-
</div>
|
|
67
|
-
<button onClick={save} style={{ background: 'linear-gradient(135deg,#00c8ff,#0080ff)', border: 'none', borderRadius: 8, color: '#fff', fontFamily: "'Orbitron',sans-serif", fontSize: 13, fontWeight: 700, letterSpacing: '.08em', padding: 12, cursor: 'pointer' }}>{saved ? 'β
Saved!' : 'Save Settings'}</button>
|
|
68
|
-
</div>
|
|
69
|
-
);
|
|
70
|
-
}
|
|
1
|
+
import { useState } from 'react';
|
|
2
|
+
|
|
3
|
+
const SECTIONS = [
|
|
4
|
+
{ icon: 'π', label: 'Notifications', options: [
|
|
5
|
+
{ key: 'notifications', name: 'Enable Notifications', desc: 'Receive alerts for karma, messages and quests.', type: 'toggle' },
|
|
6
|
+
{ key: 'sound', name: 'Sound Effects', desc: 'Play sounds for OASIS events.', type: 'toggle' },
|
|
7
|
+
]},
|
|
8
|
+
{ icon: 'π¨', label: 'Appearance', options: [
|
|
9
|
+
{ key: 'darkMode', name: 'Dark Mode', desc: 'Use the dark space theme.', type: 'toggle' },
|
|
10
|
+
{ key: 'theme', name: 'Theme', desc: 'Select your OASIS visual theme.', type: 'select', choices: ['Dark Space', 'Neon City', 'Forest Realm'] },
|
|
11
|
+
]},
|
|
12
|
+
{ icon: 'π', label: 'Language & Region', options: [
|
|
13
|
+
{ key: 'language', name: 'Language', desc: 'Select your preferred language.', type: 'select', choices: ['English', 'Spanish', 'French', 'German', 'Japanese'] },
|
|
14
|
+
{ key: 'currency', name: 'Display Currency', desc: 'Currency for prices.', type: 'select', choices: ['ETH', 'SOL', 'USD', 'GBP', 'EUR'] },
|
|
15
|
+
]},
|
|
16
|
+
{ icon: 'πΎ', label: 'Data', options: [
|
|
17
|
+
{ key: 'autoSave', name: 'Auto-save Progress', desc: 'Automatically save your OASIS progress.', type: 'toggle' },
|
|
18
|
+
]},
|
|
19
|
+
];
|
|
20
|
+
|
|
21
|
+
export function Settings() {
|
|
22
|
+
const [open, setOpen] = useState('');
|
|
23
|
+
const [prefs, setPrefs] = useState({ notifications: true, darkMode: true, sound: false, autoSave: true, language: 'English', theme: 'Dark Space', currency: 'ETH' });
|
|
24
|
+
const [saved, setSaved] = useState(false);
|
|
25
|
+
function togglePref(k) { setPrefs(p => ({ ...p, [k]: !p[k] })); }
|
|
26
|
+
function setPref(k, v) { setPrefs(p => ({ ...p, [k]: v })); }
|
|
27
|
+
function save() { setSaved(true); setTimeout(() => setSaved(false), 2000); }
|
|
28
|
+
return (
|
|
29
|
+
<div style={{ display: 'flex', flexDirection: 'column', gap: 18 }}>
|
|
30
|
+
<div style={{ textAlign: 'center' }}>
|
|
31
|
+
<h2 style={{ fontFamily: "'Orbitron',sans-serif", fontSize: 20, color: '#fff', margin: '0 0 6px' }}>βοΈ Settings</h2>
|
|
32
|
+
<p style={{ fontSize: 13, color: '#7a9bbf', margin: 0 }}>Manage your OASIS account and preferences.</p>
|
|
33
|
+
</div>
|
|
34
|
+
<div style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>
|
|
35
|
+
{SECTIONS.map(sec => (
|
|
36
|
+
<div key={sec.label} style={{ background: 'rgba(255,255,255,.04)', border: `1px solid ${open === sec.label ? 'rgba(0,200,255,.3)' : 'rgba(0,200,255,.12)'}`, borderRadius: 10, overflow: 'hidden' }}>
|
|
37
|
+
<div onClick={() => setOpen(o => o === sec.label ? '' : sec.label)} style={{ display: 'flex', alignItems: 'center', gap: 10, padding: '14px 16px', cursor: 'pointer', userSelect: 'none' }}>
|
|
38
|
+
<span style={{ fontSize: 18 }}>{sec.icon}</span>
|
|
39
|
+
<span style={{ fontFamily: "'Orbitron',sans-serif", fontSize: 13, color: '#fff', flex: 1 }}>{sec.label}</span>
|
|
40
|
+
<span style={{ fontSize: 10, color: '#7a9bbf' }}>{open === sec.label ? 'β²' : 'βΌ'}</span>
|
|
41
|
+
</div>
|
|
42
|
+
{open === sec.label && (
|
|
43
|
+
<div style={{ padding: '0 16px 16px', display: 'flex', flexDirection: 'column', gap: 14 }}>
|
|
44
|
+
{sec.options.map(opt => (
|
|
45
|
+
<div key={opt.key} style={{ display: 'flex', alignItems: 'center', gap: 14 }}>
|
|
46
|
+
<div style={{ flex: 1 }}>
|
|
47
|
+
<div style={{ fontSize: 13, color: '#e0f0ff' }}>{opt.name}</div>
|
|
48
|
+
<div style={{ fontSize: 11, color: '#4a6a88', marginTop: 2 }}>{opt.desc}</div>
|
|
49
|
+
</div>
|
|
50
|
+
{opt.type === 'toggle' && (
|
|
51
|
+
<div onClick={() => togglePref(opt.key)} style={{ width: 44, height: 24, borderRadius: 999, background: prefs[opt.key] ? 'linear-gradient(135deg,#00c8ff,#0080ff)' : 'rgba(255,255,255,.1)', cursor: 'pointer', position: 'relative', flexShrink: 0 }}>
|
|
52
|
+
<div style={{ position: 'absolute', top: 3, left: prefs[opt.key] ? 23 : 3, width: 18, height: 18, borderRadius: '50%', background: '#fff', transition: 'left .2s' }} />
|
|
53
|
+
</div>
|
|
54
|
+
)}
|
|
55
|
+
{opt.type === 'select' && (
|
|
56
|
+
<select value={prefs[opt.key]} onChange={e => setPref(opt.key, e.target.value)} style={{ background: 'rgba(255,255,255,.05)', border: '1px solid rgba(0,200,255,.2)', borderRadius: 7, color: '#fff', fontSize: 12, padding: '6px 10px', outline: 'none' }}>
|
|
57
|
+
{opt.choices.map(c => <option key={c} value={c}>{c}</option>)}
|
|
58
|
+
</select>
|
|
59
|
+
)}
|
|
60
|
+
</div>
|
|
61
|
+
))}
|
|
62
|
+
</div>
|
|
63
|
+
)}
|
|
64
|
+
</div>
|
|
65
|
+
))}
|
|
66
|
+
</div>
|
|
67
|
+
<button onClick={save} style={{ background: 'linear-gradient(135deg,#00c8ff,#0080ff)', border: 'none', borderRadius: 8, color: '#fff', fontFamily: "'Orbitron',sans-serif", fontSize: 13, fontWeight: 700, letterSpacing: '.08em', padding: 12, cursor: 'pointer' }}>{saved ? 'β
Saved!' : 'Save Settings'}</button>
|
|
68
|
+
</div>
|
|
69
|
+
);
|
|
70
|
+
}
|
|
@@ -1,56 +1,56 @@
|
|
|
1
|
-
import React, { useEffect, useRef } from 'react';
|
|
2
|
-
|
|
3
|
-
export default function StarField({ starCount = 160, speed = 0.3, style = {} }) {
|
|
4
|
-
const canvasRef = useRef(null);
|
|
5
|
-
|
|
6
|
-
useEffect(() => {
|
|
7
|
-
const canvas = canvasRef.current;
|
|
8
|
-
const ctx = canvas.getContext('2d');
|
|
9
|
-
let raf;
|
|
10
|
-
let stars = [];
|
|
11
|
-
|
|
12
|
-
function resize() {
|
|
13
|
-
canvas.width = window.innerWidth;
|
|
14
|
-
canvas.height = window.innerHeight;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
function init() {
|
|
18
|
-
stars = Array.from({ length: starCount }, () => ({
|
|
19
|
-
x: Math.random() * canvas.width,
|
|
20
|
-
y: Math.random() * canvas.height,
|
|
21
|
-
r: Math.random() * 1.4 + 0.3,
|
|
22
|
-
o: Math.random() * 0.6 + 0.2,
|
|
23
|
-
dy: (Math.random() * 0.3 + 0.1) * speed,
|
|
24
|
-
}));
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
function tick() {
|
|
28
|
-
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
|
29
|
-
for (const s of stars) {
|
|
30
|
-
ctx.beginPath();
|
|
31
|
-
ctx.arc(s.x, s.y, s.r, 0, Math.PI * 2);
|
|
32
|
-
ctx.fillStyle = `rgba(200,230,255,${s.o})`;
|
|
33
|
-
ctx.fill();
|
|
34
|
-
s.y -= s.dy;
|
|
35
|
-
if (s.y < -2) { s.y = canvas.height + 2; s.x = Math.random() * canvas.width; }
|
|
36
|
-
}
|
|
37
|
-
raf = requestAnimationFrame(tick);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
window.addEventListener('resize', resize);
|
|
41
|
-
resize();
|
|
42
|
-
init();
|
|
43
|
-
raf = requestAnimationFrame(tick);
|
|
44
|
-
return () => {
|
|
45
|
-
cancelAnimationFrame(raf);
|
|
46
|
-
window.removeEventListener('resize', resize);
|
|
47
|
-
};
|
|
48
|
-
}, [starCount, speed]);
|
|
49
|
-
|
|
50
|
-
return (
|
|
51
|
-
<canvas
|
|
52
|
-
ref={canvasRef}
|
|
53
|
-
style={{ position: 'fixed', inset: 0, width: '100%', height: '100%', pointerEvents: 'none', zIndex: 0, ...style }}
|
|
54
|
-
/>
|
|
55
|
-
);
|
|
56
|
-
}
|
|
1
|
+
import React, { useEffect, useRef } from 'react';
|
|
2
|
+
|
|
3
|
+
export default function StarField({ starCount = 160, speed = 0.3, style = {} }) {
|
|
4
|
+
const canvasRef = useRef(null);
|
|
5
|
+
|
|
6
|
+
useEffect(() => {
|
|
7
|
+
const canvas = canvasRef.current;
|
|
8
|
+
const ctx = canvas.getContext('2d');
|
|
9
|
+
let raf;
|
|
10
|
+
let stars = [];
|
|
11
|
+
|
|
12
|
+
function resize() {
|
|
13
|
+
canvas.width = window.innerWidth;
|
|
14
|
+
canvas.height = window.innerHeight;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function init() {
|
|
18
|
+
stars = Array.from({ length: starCount }, () => ({
|
|
19
|
+
x: Math.random() * canvas.width,
|
|
20
|
+
y: Math.random() * canvas.height,
|
|
21
|
+
r: Math.random() * 1.4 + 0.3,
|
|
22
|
+
o: Math.random() * 0.6 + 0.2,
|
|
23
|
+
dy: (Math.random() * 0.3 + 0.1) * speed,
|
|
24
|
+
}));
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function tick() {
|
|
28
|
+
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
|
29
|
+
for (const s of stars) {
|
|
30
|
+
ctx.beginPath();
|
|
31
|
+
ctx.arc(s.x, s.y, s.r, 0, Math.PI * 2);
|
|
32
|
+
ctx.fillStyle = `rgba(200,230,255,${s.o})`;
|
|
33
|
+
ctx.fill();
|
|
34
|
+
s.y -= s.dy;
|
|
35
|
+
if (s.y < -2) { s.y = canvas.height + 2; s.x = Math.random() * canvas.width; }
|
|
36
|
+
}
|
|
37
|
+
raf = requestAnimationFrame(tick);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
window.addEventListener('resize', resize);
|
|
41
|
+
resize();
|
|
42
|
+
init();
|
|
43
|
+
raf = requestAnimationFrame(tick);
|
|
44
|
+
return () => {
|
|
45
|
+
cancelAnimationFrame(raf);
|
|
46
|
+
window.removeEventListener('resize', resize);
|
|
47
|
+
};
|
|
48
|
+
}, [starCount, speed]);
|
|
49
|
+
|
|
50
|
+
return (
|
|
51
|
+
<canvas
|
|
52
|
+
ref={canvasRef}
|
|
53
|
+
style={{ position: 'fixed', inset: 0, width: '100%', height: '100%', pointerEvents: 'none', zIndex: 0, ...style }}
|
|
54
|
+
/>
|
|
55
|
+
);
|
|
56
|
+
}
|
|
@@ -1,45 +1,45 @@
|
|
|
1
|
-
const BALANCES = [
|
|
2
|
-
{ icon: 'β ', currency: 'Ethereum', network: 'Mainnet', amount: '0.4821', symbol: 'ETH' },
|
|
3
|
-
{ icon: 'β', currency: 'Solana', network: 'Mainnet', amount: '12.305', symbol: 'SOL' },
|
|
4
|
-
{ icon: '⬑', currency: 'Polygon', network: 'Mainnet', amount: '245.00', symbol: 'MATIC' },
|
|
5
|
-
];
|
|
6
|
-
const TXS = [
|
|
7
|
-
{ id: '1', type: 'in', amount: 0.05, currency: 'ETH', description: 'NFT Sale β Cosmic Warrior', date: '2 hours ago' },
|
|
8
|
-
{ id: '2', type: 'out', amount: 12, currency: 'SOL', description: 'Quest Reward Conversion', date: '1 day ago' },
|
|
9
|
-
{ id: '3', type: 'in', amount: 100, currency: 'MATIC', description: 'Karma Reward Payout', date: '3 days ago' },
|
|
10
|
-
];
|
|
11
|
-
|
|
12
|
-
export function Wallet() {
|
|
13
|
-
return (
|
|
14
|
-
<div style={{ display: 'flex', flexDirection: 'column', gap: 18 }}>
|
|
15
|
-
<div style={{ textAlign: 'center' }}>
|
|
16
|
-
<h2 style={{ fontFamily: "'Orbitron',sans-serif", fontSize: 20, color: '#fff', margin: '0 0 6px' }}>π° Wallet</h2>
|
|
17
|
-
<p style={{ fontSize: 13, color: '#7a9bbf', margin: 0 }}>Your OASIS multi-chain wallet.</p>
|
|
18
|
-
</div>
|
|
19
|
-
<div style={{ display: 'flex', flexDirection: 'column', gap: 10 }}>
|
|
20
|
-
{BALANCES.map(b => (
|
|
21
|
-
<div key={b.currency} style={{ display: 'flex', alignItems: 'center', gap: 14, background: 'rgba(255,255,255,.04)', border: '1px solid rgba(0,200,255,.12)', borderRadius: 10, padding: '14px 16px' }}>
|
|
22
|
-
<div style={{ fontSize: 24 }}>{b.icon}</div>
|
|
23
|
-
<div style={{ flex: 1 }}><div style={{ fontFamily: "'Orbitron',sans-serif", fontSize: 13, color: '#fff' }}>{b.currency}</div><div style={{ fontSize: 11, color: '#7a9bbf', marginTop: 2 }}>{b.network}</div></div>
|
|
24
|
-
<div style={{ fontFamily: "'Share Tech Mono',monospace", fontSize: 16, color: '#00c8ff', fontWeight: 600 }}>{b.amount} <span style={{ fontSize: 12, color: '#7a9bbf' }}>{b.symbol}</span></div>
|
|
25
|
-
</div>
|
|
26
|
-
))}
|
|
27
|
-
</div>
|
|
28
|
-
<div style={{ display: 'flex', gap: 10 }}>
|
|
29
|
-
{['π€ Send', 'π₯ Receive', 'π Swap'].map(a => (
|
|
30
|
-
<button key={a} style={{ flex: 1, background: 'rgba(0,200,255,.08)', border: '1px solid rgba(0,200,255,.2)', borderRadius: 8, color: '#00c8ff', fontFamily: "'Orbitron',sans-serif", fontSize: 11, fontWeight: 700, letterSpacing: '.06em', padding: 10, cursor: 'pointer' }}>{a}</button>
|
|
31
|
-
))}
|
|
32
|
-
</div>
|
|
33
|
-
<div style={{ fontFamily: "'Orbitron',sans-serif", fontSize: 12, color: '#7a9bbf', letterSpacing: '.06em', textTransform: 'uppercase' }}>Recent Transactions</div>
|
|
34
|
-
<div style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>
|
|
35
|
-
{TXS.map(t => (
|
|
36
|
-
<div key={t.id} style={{ display: 'flex', alignItems: 'center', gap: 12, padding: '10px 14px', background: 'rgba(255,255,255,.03)', border: '1px solid rgba(0,200,255,.08)', borderRadius: 8 }}>
|
|
37
|
-
<div style={{ width: 28, height: 28, borderRadius: '50%', display: 'flex', alignItems: 'center', justifyContent: 'center', fontSize: 14, fontWeight: 700, flexShrink: 0, background: t.type === 'in' ? 'rgba(72,220,130,.15)' : 'rgba(255,107,107,.15)', color: t.type === 'in' ? '#48dc82' : '#ff6b6b' }}>{t.type === 'in' ? 'β' : 'β'}</div>
|
|
38
|
-
<div style={{ flex: 1 }}><div style={{ fontSize: 13, color: '#e0f0ff' }}>{t.description}</div><div style={{ fontSize: 11, color: '#4a6a88', marginTop: 2 }}>{t.date}</div></div>
|
|
39
|
-
<div style={{ fontFamily: "'Share Tech Mono',monospace", fontSize: 13, fontWeight: 600, color: t.type === 'in' ? '#48dc82' : '#ff6b6b' }}>{t.type === 'in' ? '+' : '-'}{t.amount} {t.currency}</div>
|
|
40
|
-
</div>
|
|
41
|
-
))}
|
|
42
|
-
</div>
|
|
43
|
-
</div>
|
|
44
|
-
);
|
|
45
|
-
}
|
|
1
|
+
const BALANCES = [
|
|
2
|
+
{ icon: 'β ', currency: 'Ethereum', network: 'Mainnet', amount: '0.4821', symbol: 'ETH' },
|
|
3
|
+
{ icon: 'β', currency: 'Solana', network: 'Mainnet', amount: '12.305', symbol: 'SOL' },
|
|
4
|
+
{ icon: '⬑', currency: 'Polygon', network: 'Mainnet', amount: '245.00', symbol: 'MATIC' },
|
|
5
|
+
];
|
|
6
|
+
const TXS = [
|
|
7
|
+
{ id: '1', type: 'in', amount: 0.05, currency: 'ETH', description: 'NFT Sale β Cosmic Warrior', date: '2 hours ago' },
|
|
8
|
+
{ id: '2', type: 'out', amount: 12, currency: 'SOL', description: 'Quest Reward Conversion', date: '1 day ago' },
|
|
9
|
+
{ id: '3', type: 'in', amount: 100, currency: 'MATIC', description: 'Karma Reward Payout', date: '3 days ago' },
|
|
10
|
+
];
|
|
11
|
+
|
|
12
|
+
export function Wallet() {
|
|
13
|
+
return (
|
|
14
|
+
<div style={{ display: 'flex', flexDirection: 'column', gap: 18 }}>
|
|
15
|
+
<div style={{ textAlign: 'center' }}>
|
|
16
|
+
<h2 style={{ fontFamily: "'Orbitron',sans-serif", fontSize: 20, color: '#fff', margin: '0 0 6px' }}>π° Wallet</h2>
|
|
17
|
+
<p style={{ fontSize: 13, color: '#7a9bbf', margin: 0 }}>Your OASIS multi-chain wallet.</p>
|
|
18
|
+
</div>
|
|
19
|
+
<div style={{ display: 'flex', flexDirection: 'column', gap: 10 }}>
|
|
20
|
+
{BALANCES.map(b => (
|
|
21
|
+
<div key={b.currency} style={{ display: 'flex', alignItems: 'center', gap: 14, background: 'rgba(255,255,255,.04)', border: '1px solid rgba(0,200,255,.12)', borderRadius: 10, padding: '14px 16px' }}>
|
|
22
|
+
<div style={{ fontSize: 24 }}>{b.icon}</div>
|
|
23
|
+
<div style={{ flex: 1 }}><div style={{ fontFamily: "'Orbitron',sans-serif", fontSize: 13, color: '#fff' }}>{b.currency}</div><div style={{ fontSize: 11, color: '#7a9bbf', marginTop: 2 }}>{b.network}</div></div>
|
|
24
|
+
<div style={{ fontFamily: "'Share Tech Mono',monospace", fontSize: 16, color: '#00c8ff', fontWeight: 600 }}>{b.amount} <span style={{ fontSize: 12, color: '#7a9bbf' }}>{b.symbol}</span></div>
|
|
25
|
+
</div>
|
|
26
|
+
))}
|
|
27
|
+
</div>
|
|
28
|
+
<div style={{ display: 'flex', gap: 10 }}>
|
|
29
|
+
{['π€ Send', 'π₯ Receive', 'π Swap'].map(a => (
|
|
30
|
+
<button key={a} style={{ flex: 1, background: 'rgba(0,200,255,.08)', border: '1px solid rgba(0,200,255,.2)', borderRadius: 8, color: '#00c8ff', fontFamily: "'Orbitron',sans-serif", fontSize: 11, fontWeight: 700, letterSpacing: '.06em', padding: 10, cursor: 'pointer' }}>{a}</button>
|
|
31
|
+
))}
|
|
32
|
+
</div>
|
|
33
|
+
<div style={{ fontFamily: "'Orbitron',sans-serif", fontSize: 12, color: '#7a9bbf', letterSpacing: '.06em', textTransform: 'uppercase' }}>Recent Transactions</div>
|
|
34
|
+
<div style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>
|
|
35
|
+
{TXS.map(t => (
|
|
36
|
+
<div key={t.id} style={{ display: 'flex', alignItems: 'center', gap: 12, padding: '10px 14px', background: 'rgba(255,255,255,.03)', border: '1px solid rgba(0,200,255,.08)', borderRadius: 8 }}>
|
|
37
|
+
<div style={{ width: 28, height: 28, borderRadius: '50%', display: 'flex', alignItems: 'center', justifyContent: 'center', fontSize: 14, fontWeight: 700, flexShrink: 0, background: t.type === 'in' ? 'rgba(72,220,130,.15)' : 'rgba(255,107,107,.15)', color: t.type === 'in' ? '#48dc82' : '#ff6b6b' }}>{t.type === 'in' ? 'β' : 'β'}</div>
|
|
38
|
+
<div style={{ flex: 1 }}><div style={{ fontSize: 13, color: '#e0f0ff' }}>{t.description}</div><div style={{ fontSize: 11, color: '#4a6a88', marginTop: 2 }}>{t.date}</div></div>
|
|
39
|
+
<div style={{ fontFamily: "'Share Tech Mono',monospace", fontSize: 13, fontWeight: 600, color: t.type === 'in' ? '#48dc82' : '#ff6b6b' }}>{t.type === 'in' ? '+' : '-'}{t.amount} {t.currency}</div>
|
|
40
|
+
</div>
|
|
41
|
+
))}
|
|
42
|
+
</div>
|
|
43
|
+
</div>
|
|
44
|
+
);
|
|
45
|
+
}
|
package/src/components/index.js
CHANGED
|
@@ -1,26 +1,26 @@
|
|
|
1
|
-
// @oasisomniverse/react β OASIS Omniverse React components
|
|
2
|
-
|
|
3
|
-
export { AvatarConnect } from './common/AvatarConnect';
|
|
4
|
-
export { Contact } from './common/Contact';
|
|
5
|
-
export { Eggs } from './common/Eggs';
|
|
6
|
-
export { Game } from './common/Game';
|
|
7
|
-
export { HyperDrive } from './common/HyperDrive';
|
|
8
|
-
export { KarmaToast } from './common/KarmaToast';
|
|
9
|
-
export { Map } from './common/Map';
|
|
10
|
-
export { MenuMessage } from './common/MenuMessage';
|
|
11
|
-
export { Messaging } from './common/Messaging';
|
|
12
|
-
export { Mission } from './common/Mission';
|
|
13
|
-
export { NavBar } from './common/NavBar';
|
|
14
|
-
export { NFT } from './common/NFT';
|
|
15
|
-
export { OApp } from './common/OApp';
|
|
16
|
-
export { OasisModal } from './common/OasisModal';
|
|
17
|
-
export { ONET } from './common/ONET';
|
|
18
|
-
export { ONODE } from './common/ONODE';
|
|
19
|
-
export { ProviderDropdown } from './common/ProviderDropdown';
|
|
20
|
-
export { Providers } from './common/Providers';
|
|
21
|
-
export { Quest } from './common/Quest';
|
|
22
|
-
export { SearchAvatars } from './common/SearchAvatars';
|
|
23
|
-
export { Seeds } from './common/Seeds';
|
|
24
|
-
export { Settings } from './common/Settings';
|
|
25
|
-
export { StarField } from './common/StarField';
|
|
26
|
-
export { Wallet } from './common/Wallet';
|
|
1
|
+
// @oasisomniverse/react β OASIS Omniverse React components
|
|
2
|
+
|
|
3
|
+
export { AvatarConnect } from './common/AvatarConnect';
|
|
4
|
+
export { Contact } from './common/Contact';
|
|
5
|
+
export { Eggs } from './common/Eggs';
|
|
6
|
+
export { Game } from './common/Game';
|
|
7
|
+
export { HyperDrive } from './common/HyperDrive';
|
|
8
|
+
export { KarmaToast } from './common/KarmaToast';
|
|
9
|
+
export { Map } from './common/Map';
|
|
10
|
+
export { MenuMessage } from './common/MenuMessage';
|
|
11
|
+
export { Messaging } from './common/Messaging';
|
|
12
|
+
export { Mission } from './common/Mission';
|
|
13
|
+
export { NavBar } from './common/NavBar';
|
|
14
|
+
export { NFT } from './common/NFT';
|
|
15
|
+
export { OApp } from './common/OApp';
|
|
16
|
+
export { OasisModal } from './common/OasisModal';
|
|
17
|
+
export { ONET } from './common/ONET';
|
|
18
|
+
export { ONODE } from './common/ONODE';
|
|
19
|
+
export { ProviderDropdown } from './common/ProviderDropdown';
|
|
20
|
+
export { Providers } from './common/Providers';
|
|
21
|
+
export { Quest } from './common/Quest';
|
|
22
|
+
export { SearchAvatars } from './common/SearchAvatars';
|
|
23
|
+
export { Seeds } from './common/Seeds';
|
|
24
|
+
export { Settings } from './common/Settings';
|
|
25
|
+
export { StarField } from './common/StarField';
|
|
26
|
+
export { Wallet } from './common/Wallet';
|