feat: update app screens with Mycelium connector, peers and settings UI

This commit is contained in:
2025-10-14 14:57:08 +02:00
parent 4f40912dc9
commit 661e035e19
9 changed files with 11 additions and 179 deletions

BIN
connector.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

BIN
peers.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

BIN
setting.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

View File

@@ -10,7 +10,7 @@ export function PhoneFrame({
return (
<div className={clsx('relative aspect-[366/729]', className)} {...props}>
<Image
src="/images/phoneframe.png"
src="/images/phone-frame.svg"
alt=""
className="pointer-events-none absolute inset-0"
fill

View File

@@ -15,6 +15,7 @@ import { useDebouncedCallback } from 'use-debounce'
import { AppScreen } from '@/components/AppScreen'
import { CircleBackground } from '@/components/CircleBackground'
import { Container } from '@/components/Container'
import Image from 'next/image'
import { PhoneFrame } from '@/components/PhoneFrame'
import {
DiageoLogo,
@@ -37,23 +38,23 @@ interface CustomAnimationProps {
const features = [
{
name: 'Decentralized Nodes',
name: 'Mycelium Connector',
description:
"Mycelium operates through a network of decentralized nodes, similar to how nature's mycelium forms a decentralized network of threads. Each node acts as a connection point in the overall digital ecosystem.",
"Start (and stop) your Mycelium connector to gain access to sites, apps, and workloads available exclusively on the Mycelium Network. View statistics around peers and traffic.",
icon: DeviceUserIcon,
screen: InviteScreen,
},
{
name: 'Efficient Data Routing',
name: 'Mycelium Peers',
description:
'Mycelium optimizes data routing by choosing the most efficient path for communication. Data travels along the shortest path in terms of latency, ensuring that information reaches its destination swiftly.',
'Search and discover active peers on the Mycelium Network, or add your own.',
icon: DeviceNotificationIcon,
screen: StocksScreen,
},
{
name: 'End-to-End Encryption',
name: 'Network Setting',
description:
'Each node in the system is identified by a unique key pair. Data between nodes is encrypted using secret keys derived from these pairs. This ensures that data remains confidential, enhancing the privacy of the network.',
'Find version and network information and trigger light or dark mode.',
icon: DeviceTouchIcon,
screen: InvestScreen,
},
@@ -193,35 +194,7 @@ type ScreenProps =
function InviteScreen(props: ScreenProps) {
return (
<AppScreen className="w-full">
<MotionAppScreenHeader {...(props.animated ? headerAnimation : {})}>
<AppScreen.Title>Invite people</AppScreen.Title>
<AppScreen.Subtitle>
Get tips <span className="text-white">5s sooner</span> for every
invite.
</AppScreen.Subtitle>
</MotionAppScreenHeader>
<MotionAppScreenBody
{...(props.animated ? { ...bodyAnimation, custom: props.custom } : {})}
>
<div className="px-4 py-6">
<div className="space-y-6">
{[
{ label: 'Full name', value: 'Albert H. Wiggin' },
{ label: 'Email address', value: 'awiggin@chase.com' },
].map((field) => (
<div key={field.label}>
<div className="text-sm text-gray-500">{field.label}</div>
<div className="mt-2 border-b border-gray-200 pb-2 text-sm text-gray-900">
{field.value}
</div>
</div>
))}
</div>
<div className="mt-6 rounded-lg bg-cyan-500 px-3 py-2 text-center text-sm font-semibold text-white">
Invite person
</div>
</div>
</MotionAppScreenBody>
<Image src="/images/connector.png" alt="Mycelium Connector" width={366} height={732} />
</AppScreen>
)
}
@@ -229,101 +202,7 @@ function InviteScreen(props: ScreenProps) {
function StocksScreen(props: ScreenProps) {
return (
<AppScreen className="w-full">
<MotionAppScreenHeader {...(props.animated ? headerAnimation : {})}>
<AppScreen.Title>Stocks</AppScreen.Title>
<AppScreen.Subtitle>March 9, 2022</AppScreen.Subtitle>
</MotionAppScreenHeader>
<MotionAppScreenBody
{...(props.animated ? { ...bodyAnimation, custom: props.custom } : {})}
>
<div className="divide-y divide-gray-100">
{[
{
name: 'Laravel',
price: '4,098.01',
change: '+4.98%',
color: '#F9322C',
logo: LaravelLogo,
},
{
name: 'Tuple',
price: '5,451.10',
change: '-3.38%',
color: '#5A67D8',
logo: TupleLogo,
},
{
name: 'Transistor',
price: '4,098.41',
change: '+6.25%',
color: '#2A5B94',
logo: TransistorLogo,
},
{
name: 'Diageo',
price: '250.65',
change: '+1.25%',
color: '#3320A7',
logo: DiageoLogo,
},
{
name: 'StaticKit',
price: '250.65',
change: '-3.38%',
color: '#2A3034',
logo: StaticKitLogo,
},
{
name: 'Statamic',
price: '5,040.85',
change: '-3.11%',
color: '#0EA5E9',
logo: StatamicLogo,
},
{
name: 'Mirage',
price: '140.44',
change: '+9.09%',
color: '#16A34A',
logo: MirageLogo,
},
{
name: 'Reversable',
price: '550.60',
change: '-1.25%',
color: '#8D8D8D',
logo: ReversableLogo,
},
].map((stock) => (
<div key={stock.name} className="flex items-center gap-4 px-4 py-3">
<div
className="flex-none rounded-full"
style={{ backgroundColor: stock.color }}
>
<stock.logo className="h-10 w-10" />
</div>
<div className="flex-auto text-sm text-gray-900">
{stock.name}
</div>
<div className="flex-none text-right">
<div className="text-sm font-medium text-gray-900">
{stock.price}
</div>
<div
className={clsx(
'text-xs/5',
stock.change.startsWith('+')
? 'text-cyan-500'
: 'text-gray-500',
)}
>
{stock.change}
</div>
</div>
</div>
))}
</div>
</MotionAppScreenBody>
<Image src="/images/peers.png" alt="Mycelium Peers" width={366} height={732} />
</AppScreen>
)
}
@@ -331,54 +210,7 @@ function StocksScreen(props: ScreenProps) {
function InvestScreen(props: ScreenProps) {
return (
<AppScreen className="w-full">
<MotionAppScreenHeader {...(props.animated ? headerAnimation : {})}>
<AppScreen.Title>Buy $LA</AppScreen.Title>
<AppScreen.Subtitle>
<span className="text-white">$34.28</span> per share
</AppScreen.Subtitle>
</MotionAppScreenHeader>
<MotionAppScreenBody
{...(props.animated ? { ...bodyAnimation, custom: props.custom } : {})}
>
<div className="px-4 py-6">
<div className="space-y-4">
{[
{ label: 'Number of shares', value: '100' },
{
label: 'Current market price',
value: (
<div className="flex">
$34.28
<svg viewBox="0 0 24 24" fill="none" className="h-6 w-6">
<path
d="M17 15V7H9M17 7 7 17"
stroke="#06B6D4"
strokeWidth="2"
strokeLinecap="round"
strokeLinejoin="round"
/>
</svg>
</div>
),
},
{ label: 'Estimated cost', value: '$3,428.00' },
].map((item) => (
<div
key={item.label}
className="flex justify-between border-b border-gray-100 pb-4"
>
<div className="text-sm text-gray-500">{item.label}</div>
<div className="text-sm font-semibold text-gray-900">
{item.value}
</div>
</div>
))}
<div className="rounded-lg bg-cyan-500 px-3 py-2 text-center text-sm font-semibold text-white">
Buy shares
</div>
</div>
</div>
</MotionAppScreenBody>
<Image src="/images/setting.png" alt="Mycelium Settings" width={366} height={732} />
</AppScreen>
)
}

BIN
src/images/connector.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

BIN
src/images/peers.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

BIN
src/images/phoneframe.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 537 KiB

BIN
src/images/setting.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB