From 5f22aaace78d29018fc485dccbb93602236f3cfc Mon Sep 17 00:00:00 2001 From: sasha-astiadi Date: Thu, 4 Sep 2025 13:32:54 +0200 Subject: [PATCH 01/27] add gitignore --- .gitignore | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ce50eae --- /dev/null +++ b/.gitignore @@ -0,0 +1,83 @@ +node_modules + +# Next.js build outputs and generated files +.next/ +next-env.d.ts + +# Environment variables +.env* + +# Logs +*.log +npm-debug.log* + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Coverage directory used by tools like istanbul +coverage/ + +# nyc test coverage +.nyc_output + +# Dependency directories +node_modules/ + +# Optional npm cache directory +.npm + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next + +# Nuxt.js build / generate output +.nuxt + +# Gatsby files +.cache/ +public + +# Storybook build outputs +.out +.storybook-out + +# Temporary folders +tmp/ +temp/ + +# OS generated files +.DS_Store +.DS_Store? +._* +.Spotlight-V100 +.Trashes +ehthumbs.db +Thumbs.db + +# IDE files +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# Vercel +.vercel + +# Local Netlify folder +.netlify From 6548a6b3d2251a6cfa5dc88a5dd2f130fe31c902 Mon Sep 17 00:00:00 2001 From: sasha-astiadi Date: Thu, 4 Sep 2025 13:36:42 +0200 Subject: [PATCH 02/27] edit home --- src/components/Hero.tsx | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/components/Hero.tsx b/src/components/Hero.tsx index 50e9514..65d4815 100644 --- a/src/components/Hero.tsx +++ b/src/components/Hero.tsx @@ -105,12 +105,16 @@ export function Hero() {

- Invest at the perfect time. + MYCELIUM

+

+ Unleashing the Power of Decentralized Networks +

- By leveraging insights from our network of industry insiders, - you’ll know exactly when to buy to maximize profit, and exactly - when to sell to avoid painful losses. + Discover Mycelium, an end-to-end encrypted IPv6 overlay network. The future of secure, efficient, and scalable networking. +

+

+ Coming Soon: New Decentralized Features

From 375dc774416765e9e2313d9539a919085273c2c7 Mon Sep 17 00:00:00 2001 From: sasha-astiadi Date: Thu, 4 Sep 2025 14:29:31 +0200 Subject: [PATCH 03/27] replace all --- src/app/(main)/page.tsx | 6 +- src/app/layout.tsx | 6 +- src/components/Benefits.tsx | 72 ++++++++++++ src/components/Faqs.tsx | 37 +++--- src/components/PrimaryFeatures.tsx | 24 ++-- src/components/Reviews.tsx | 170 ++++++++++++++++++++------- src/components/SecondaryFeatures.tsx | 33 +++--- 7 files changed, 247 insertions(+), 101 deletions(-) create mode 100644 src/components/Benefits.tsx diff --git a/src/app/(main)/page.tsx b/src/app/(main)/page.tsx index b842a88..1aa354a 100644 --- a/src/app/(main)/page.tsx +++ b/src/app/(main)/page.tsx @@ -5,16 +5,16 @@ import { Pricing } from '@/components/Pricing' import { PrimaryFeatures } from '@/components/PrimaryFeatures' import { Reviews } from '@/components/Reviews' import { SecondaryFeatures } from '@/components/SecondaryFeatures' +import { Benefits } from '@/components/Benefits' export default function Home() { return ( <> - + - - + ) diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 8aaba25..8ad1a0b 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -12,11 +12,11 @@ const inter = Inter({ export const metadata: Metadata = { title: { - template: '%s - Pocket', - default: 'Pocket - Invest at the perfect time.', + template: '%s - Mycelium', + default: 'Mycelium - Redefining Digital Communication', }, description: - 'By leveraging insights from our network of industry insiders, you’ll know exactly when to buy to maximize profit, and exactly when to sell to avoid painful losses.', + 'Mycelium is designed to improve how we connect and communicate in the digital world. Its goal is to create a secure, efficient, and scalable digital ecosystem where data flows seamlessly and remains protected.', } export default function RootLayout({ diff --git a/src/components/Benefits.tsx b/src/components/Benefits.tsx new file mode 100644 index 0000000..0237202 --- /dev/null +++ b/src/components/Benefits.tsx @@ -0,0 +1,72 @@ +const features = [ + { + name: 'Communication & Collaboration', + description: + 'Encrypted voice/video calls. Self-hosted messaging systems. Secure document collaboration. Private file sharing between trusted nodes. Secure remote work collaboration.', + }, + { + name: 'Cloud & Infrastructure', + description: `Private cloud computing resources +Virtual private networks (VPNs) +Secure backup systems +Remote system administration`, + }, + { + name: 'IoT & Networks', + description: `Secure IoT device networks +Private DNS systems.`, + }, + { + name: 'Media & Content', + description: `Private media streaming +Protected content distribution +Personal cloud storage +Secure game servers.`, + }, + { + name: 'Development & Services', + description: `Self-hosted web services +Personal email servers +Private git repositories`, + }, + { + name: 'Security & Privacy Layers', + description: `Encrypted network for all devices +End-to-end privacy across applications`, + }, +] + +export function Benefits() { + return ( +
+
+
+

+ Powering Secure & Decentralized Connectivity +

+

+ Mycelium, a key component of the ThreeFold Grid, can be installed on any computer (macOS, Linux, Windows) and smartphone (iOS, Android). With seamless integration, it enables secure and private communication across devices. +

+

+ The ThreeFold Dashboard offers dozens of applications with built-in Mycelium support, making it easy to deploy and utilize. Once installed, Mycelium provides a secure, encrypted network for a wide range of use cases, from private communication to decentralized infrastructure. +

+
+
    + {features.map((feature) => ( +
  • +

    {feature.name}

    +
      + {feature.description.replace(/\.\s+/g, '\n').split('\n').filter((item: string) => item.trim()).map((item: string, index: number) => ( +
    • {item.trim()}
    • + ))} +
    +
  • + ))} +
+
+
+ ) +} diff --git a/src/components/Faqs.tsx b/src/components/Faqs.tsx index d76acee..a750b8e 100644 --- a/src/components/Faqs.tsx +++ b/src/components/Faqs.tsx @@ -3,53 +3,48 @@ import { Container } from '@/components/Container' const faqs = [ [ { - question: 'How do I know the tips are good?', + question: 'What is Mycelium?', answer: - 'Our whole business depends on our tips being good, so it’s in our best interest that they are. The results of our customers speak for themselves, just trust us.', + 'Mycelium is an end-to-end encrypted IPv6 overlay network written in Rust. Each node joining the network receives an IP in the 400::/7 range, facilitating secure and private communications.', }, { - question: 'Isn’t this insider trading?', + question: 'Is mycelium ready to scale to the world?', answer: - 'Yes exactly. But at scale! Historically you could only make insider trades with knowledge from your direct network. Pocket brings you insider trading tips from people you don’t even know.', + 'No, Mycelium is not yet fully scalable to a global level. Currently, each network can support around 100,000 users, but multiple networks can be deployed to expand capacity. We anticipate resolving these scalability challenges by 2025.', }, { - question: 'But isn’t insider trading illegal?', + question: 'How do I install Mycelium?', answer: - 'Here’s the thing: you’re the one doing the insider trading, not us. We’re just giving you the tips and some tools to make trades. We’re not doing anything wrong here.', + 'The Mycelium app supports iOS, macOS, Android and Windows. For Linux, a binary is available. Installation guides are available for both local machines and virtual machines running on the TFGrid. Note that Windows users need to have wintun.dll in the same directory as the Mycelium executable.', }, ], [ { - question: 'Do the people giving you tips realize what they are doing?', + question: 'How can I find and use my Mycelium address?', answer: - 'Again I would argue this isn’t really our responsibility. People make their own choices. If they don’t research the consequences that’s on them, not on us.', + 'Upon using the Mycelium app, you\'re assigned a unique Mycelium address. To copy this address, click the button located to the right of the displayed address in the app interface.', }, { - question: 'Where is Pocket based?', + question: 'Can I deploy workloads on the TFGrid using Mycelium?', answer: - 'Let’s just say it’s not somewhere where the SEC is going to find us.', + 'Yes, after installing Mycelium, you can deploy workloads on the TFGrid and connect to them using the Mycelium network. Detailed deployment guides are available in the documentation.', }, { - question: 'Is there any age limit to trading on Pocket?', + question: 'Is there an API available for Mycelium?', answer: - 'For our free plan, the age limit is based on the minimum age to trade in your country of residence. Our VIP plan uses advanced transaction anonymization though, so you can use that plan even if you’re 9 years old. Or a dog.', + 'Yes, Mycelium offers an API for administrative operations, peer management, and message subsystem operations. Comprehensive API documentation can be found in the official Mycelium GitHub repository.', }, ], [ { - question: 'How did you get this on the App Store?', + question: 'What should I do if I encounter issues during installation or usage?', answer: - 'Honestly we were surprised too, but eventually we found out that the app reviewer found the app so compelling they approved it just so they could use it themselves.', + 'If you face any challenges, refer to the troubleshooting section in the Mycelium documentation. Additionally, ensure that all prerequisites are met, such as having wintun.dll in the correct directory for Windows installations.', }, { - question: 'How do I explain the money I withdraw from Pocket to the IRS?', + question: 'How does Mycelium handle routing within its network?', answer: - 'This feels like one-hundred percent a you problem. Pocket is not responsible in any way for your tax returns.', - }, - { - question: 'How do I become an insider?', - answer: - 'Contact us with some details about your industry and the type of access you have to apply for an insider account. Once approved, we’ll send you a guide on collecting insider information without being detected at work.', + 'Mycelium incorporates core principles of the Babel routing protocol, enabling efficient and dynamic routing within its encrypted IPv6 overlay network.', }, ], ] diff --git a/src/components/PrimaryFeatures.tsx b/src/components/PrimaryFeatures.tsx index c4b2f7b..bbd8386 100644 --- a/src/components/PrimaryFeatures.tsx +++ b/src/components/PrimaryFeatures.tsx @@ -37,23 +37,23 @@ interface CustomAnimationProps { const features = [ { - name: 'Invite friends for better returns', + name: 'Decentralized Nodes', description: - 'For every friend you invite to Pocket, you get insider notifications 5 seconds sooner. And it’s 10 seconds if you invite an insider.', + "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.", icon: DeviceUserIcon, screen: InviteScreen, }, { - name: 'Notifications on stock dips', + name: 'Efficient Data Routing', description: - 'Get a push notification every time we find out something that’s going to lower the share price on your holdings so you can sell before the information hits the public markets.', + '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.', icon: DeviceNotificationIcon, screen: StocksScreen, }, { - name: 'Invest what you want', + name: 'End-to-End Encryption', description: - 'We hide your stock purchases behind thousands of anonymous trading accounts, so suspicious activity can never be traced back to you.', + '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.', icon: DeviceTouchIcon, screen: InvestScreen, }, @@ -577,13 +577,13 @@ export function PrimaryFeatures() {

- Every feature you need to win. Try it for yourself. + Discover Mycelium

-

- Pocket was built for investors like you who play by their own rules - and aren’t going to let SEC regulations get in the way of their - dreams. If other investing tools are afraid to build it, Pocket has - it. +

+ Mycelium is an unbreakable network, always finding the shortest path and providing 100% secure, peer-to-peer communication. But this is just the beginning. +

+

+ Our mission is to create a sustainable digital ecosystem where communication is seamless, data is secure, and scalability knows no bounds.

diff --git a/src/components/Reviews.tsx b/src/components/Reviews.tsx index 2e0bb02..7b7c712 100644 --- a/src/components/Reviews.tsx +++ b/src/components/Reviews.tsx @@ -1,8 +1,25 @@ 'use client' -import { useEffect, useMemo, useRef, useState } from 'react' +import React, { useEffect, useMemo, useRef, useState } from 'react' import clsx from 'clsx' import { useInView } from 'framer-motion' +import { + ArchiveBoxIcon, + ChatBubbleBottomCenterIcon, + CloudIcon, + CodeBracketIcon, + ComputerDesktopIcon, + CpuChipIcon, + DocumentIcon, + EnvelopeIcon, + GlobeAltIcon, + GlobeAmericasIcon, + PlayCircleIcon, + ShareIcon, + EyeSlashIcon, + UserGroupIcon, + VideoCameraIcon, +} from '@heroicons/react/24/solid' import { Container } from '@/components/Container' @@ -15,86 +32,127 @@ interface Review { const reviews: Array = [ { - title: 'It really works.', - body: 'I downloaded Pocket today and turned $5000 into $25,000 in half an hour.', + title: 'Secure remote work collaboration.', + body: 'Mycelium provides a secure, encrypted network for a wide range of use cases, from private communication to decentralized infrastructure.', author: 'CrazyInvestor', rating: 5, }, { - title: 'You need this app.', - body: 'I didn’t understand the stock market at all before Pocket. I still don’t, but at least I’m rich now.', + title: 'Private file sharing between trusted nodes.', + body: 'Mycelium enables private file sharing between trusted nodes, ensuring that sensitive information remains confidential and secure.', author: 'CluelessButRich', rating: 5, }, { - title: 'This shouldn’t be legal.', - body: 'Pocket makes it so easy to win big in the stock market that I can’t believe it’s actually legal.', + title: 'Encrypted voice/video calls.', + body: 'Mycelium enables secure voice and video calls between users, ensuring that conversations remain private and protected from eavesdropping.', author: 'LivingDaDream', rating: 5, }, { - title: 'Screw financial advisors.', - body: 'I barely made any money investing in mutual funds. With Pocket, I’m doubling my net-worth every single month.', + title: 'Self-hosted messaging systems.', + body: 'Mycelium allows users to create their own self-hosted messaging systems, ensuring complete control over their communications.', author: 'JordanBelfort1962', rating: 5, }, { - title: 'I love it!', - body: 'I started providing insider information myself and now I get new insider tips every 5 minutes. I don’t even have time to act on all of them. New Lamborghini is being delivered next week!', + title: 'Secure document collaboration.', + body: 'Mycelium enables secure document collaboration between users, ensuring that sensitive information remains confidential and protected.', author: 'MrBurns', rating: 5, }, { - title: 'Too good to be true.', - body: 'I was making money so fast with Pocket that it felt like a scam. But I sold my shares and withdrew the money and it’s really there, right in my bank account. This app is crazy!', + title: 'Private cloud computing resources.', + body: 'Mycelium provides private cloud computing resources, allowing users to run their applications in a secure and isolated environment.', author: 'LazyRich99', rating: 5, }, { - title: 'Wish I could give 6 stars', - body: 'This is literally the most important app you will ever download in your life. Get on this before it’s so popular that everyone else is getting these tips too.', + title: 'Secure IoT device networks.', + body: 'Mycelium provides secure IoT device networks, ensuring that all connected devices can communicate privately and securely.', author: 'SarahLuvzCash', rating: 5, }, { - title: 'Bought an island.', - body: 'Yeah, you read that right. Want your own island too? Get Pocket.', + title: 'Remote system administration.', + body: 'Mycelium enables secure remote system administration, allowing users to manage their systems from anywhere without compromising security.', author: 'ScroogeMcduck', rating: 5, }, { - title: 'No more debt!', - body: 'After 2 weeks of trading on Pocket I was debt-free. Why did I even go to school at all when Pocket exists?', + title: 'Virtual private networks (VPNs).', + body: 'Mycelium enables the creation of virtual private networks (VPNs), allowing users to securely connect to remote networks and access resources without compromising their privacy.', author: 'BruceWayne', rating: 5, }, { - title: 'I’m 13 and I’m rich.', - body: 'I love that with Pocket’s transaction anonymization I could sign up and start trading when I was 12 years old. I had a million dollars before I had armpit hair!', + title: 'Secure backup systems.', + body: 'Mycelium provides secure backup systems, ensuring that users can easily and safely back up their important data without the risk of unauthorized access.', author: 'RichieRich', rating: 5, }, { - title: 'Started an investment firm.', - body: 'I charge clients a 3% management fee and just throw all their investments into Pocket. Easy money!', + title: 'Self-hosted web services.', + body: 'Mycelium allows users to create their own self-hosted web services, ensuring complete control over their data and applications.', author: 'TheCountOfMonteChristo', rating: 5, }, { - title: 'It’s like a superpower.', - body: 'Every tip Pocket has sent me has paid off. It’s like playing Blackjack but knowing exactly what card is coming next!', + title: 'Private file sharing between trusted nodes.', + body: 'Mycelium enables private file sharing between trusted nodes, ensuring that sensitive information remains confidential and secure.', author: 'ClarkKent', rating: 5, }, { - title: 'Quit my job.', - body: 'I downloaded Pocket three days ago and quit my job today. I can’t believe no one else thought to build a stock trading app that works this way!', + title: 'Private DNS systems.', + body: 'Mycelium enables the creation of private DNS systems, allowing users to maintain control over their domain name resolution and protect their privacy.', author: 'GeorgeCostanza', rating: 5, }, { - title: 'Don’t download this app', - body: 'Unless you want to have the best life ever! I am literally writing this from a yacht.', + title: 'Personal email servers.', + body: 'Mycelium allows users to create their own personal email servers, ensuring complete control over their communications and data.', + author: 'JeffBezos', + rating: 5, + }, + { + title: 'Secure document collaboration.', + body: 'Mycelium enables secure document collaboration between users, ensuring that sensitive information remains confidential and protected.', + author: 'JeffBezos', + rating: 5, + }, + { + title: 'Private media streaming.', + body: 'Mycelium enables private media streaming between users, ensuring that sensitive content remains confidential and protected.', + author: 'JeffBezos', + rating: 5, + }, + { + title: 'Personal cloud storage.', + body: 'Mycelium allows users to create their own personal cloud storage solutions, ensuring complete control over their data and privacy.', + author: 'JeffBezos', + rating: 5, + }, + { + title: 'Personal email servers.', + body: 'Mycelium allows users to create their own personal email servers, ensuring complete control over their communications and data.', + author: 'JeffBezos', + rating: 5, + }, + { + title: 'Protected content distribution.', + body: 'Mycelium enables protected content distribution, allowing users to securely share and distribute sensitive information without compromising its confidentiality.', + author: 'JeffBezos', + rating: 5, + }, + { + title: 'Secure game servers.', + body: 'Mycelium enables the creation of secure game servers, allowing users to host and manage their own gaming environments with complete control over their data and privacy.', + author: 'JeffBezos', + rating: 5, + }, { + title: 'Private git repositories.', + body: 'Mycelium enables the creation of private git repositories, allowing users to host and manage their own version control systems with complete control over their data and privacy.', author: 'JeffBezos', rating: 5, }, @@ -124,6 +182,28 @@ function StarRating({ rating }: { rating: Review['rating'] }) { ) } +function getReviewIcon(title: string) { + if (title.toLowerCase().includes('collaboration')) return UserGroupIcon; + if (title.toLowerCase().includes('file sharing')) return ShareIcon; + if (title.toLowerCase().includes('voice') || title.toLowerCase().includes('video')) return VideoCameraIcon; + if (title.toLowerCase().includes('messaging')) return ChatBubbleBottomCenterIcon; + if (title.toLowerCase().includes('document')) return DocumentIcon; + if (title.toLowerCase().includes('cloud')) return CloudIcon; + if (title.toLowerCase().includes('iot')) return CpuChipIcon; + if (title.toLowerCase().includes('administration')) return ComputerDesktopIcon; + if (title.toLowerCase().includes('vpn')) return GlobeAmericasIcon; + if (title.toLowerCase().includes('backup')) return ArchiveBoxIcon; + if (title.toLowerCase().includes('web services')) return GlobeAltIcon; + if (title.toLowerCase().includes('dns')) return GlobeAmericasIcon; + if (title.toLowerCase().includes('email')) return EnvelopeIcon; + if (title.toLowerCase().includes('media streaming') || title.toLowerCase().includes('streaming')) return PlayCircleIcon; + if (title.toLowerCase().includes('storage')) return CloudIcon; + if (title.toLowerCase().includes('distribution')) return EyeSlashIcon; + if (title.toLowerCase().includes('game')) return ComputerDesktopIcon; + if (title.toLowerCase().includes('git')) return CodeBracketIcon; + return ComputerDesktopIcon; // default +} + function Review({ title, body, @@ -149,15 +229,13 @@ function Review({ {...props} >
- -

+ {React.createElement(getReviewIcon(title), { className: "h-6 w-6 text-gray-700 mb-2" })} +

{title}

-

{body}

+

{body}

-
- {author} -
+ ) } @@ -277,16 +355,18 @@ export function Reviews() { aria-labelledby="reviews-title" className="pt-20 pb-16 sm:pt-32 sm:pb-24" > - -

- Everyone is changing their life with Pocket. -

-

- Thousands of people have doubled their net-worth in the last 30 days. -

+ +
+

+ Powering Secure & Decentralized Connectivity +

+

+ The ThreeFold Dashboard offers dozens of applications with built-in Mycelium support, making it easy to deploy and utilize. Once installed, Mycelium provides a secure, encrypted network for a wide range of use cases, from private communication to decentralized infrastructure. +

+
diff --git a/src/components/SecondaryFeatures.tsx b/src/components/SecondaryFeatures.tsx index bae7900..68e4959 100644 --- a/src/components/SecondaryFeatures.tsx +++ b/src/components/SecondaryFeatures.tsx @@ -4,39 +4,39 @@ import { Container } from '@/components/Container' const features = [ { - name: 'Invest any amount', + name: 'Quantum Safe Storage Functionality', description: - 'Whether it’s $1 or $1,000,000, we can put your money to work for you.', + "Mycelium's quantum safe storage enables flexible, scalable, and efficient data distribution across a decentralized network, ensuring redundancy and security.", icon: DeviceArrowIcon, }, { - name: 'Build a balanced portfolio', + name: 'Entry and Exit Points for AI Workloads', description: - 'Invest in different industries to find the most opportunities to win huge.', + 'Seamlessly connect AI applications to Mycelium, providing optimized and secured data pipelines for training, inference, and real-time processing.', icon: DeviceCardsIcon, }, { - name: 'Trade in real-time', + name: 'Data Storage and Retrieval Mechanisms', description: - 'Get insider tips on big stock moves and act on them within seconds.', + 'Users can choose between storing data locally for quick access or utilizing the distributed grid for enhanced scalability and resilience.', icon: DeviceClockIcon, }, { - name: 'Profit from your network', + name: 'Integrated Name Services (DNS)', description: - 'Invite new insiders to get tips faster and beat even other Pocket users.', + 'The Integrated DNS system efficiently finds the shortest path between users and websites, automatically balancing loads and identifying alternative routes in case of internet issues.', icon: DeviceListIcon, }, { - name: 'Encrypted and anonymized', + name: 'Frontend/Backend Integration', description: - 'Cutting-edge security technology that even the NSA doesn’t know about keeps you hidden.', + 'Mycelium provides seamless integration with existing applications, enabling developers to leverage decentralized storage across both frontend and backend architectures.', icon: DeviceLockIcon, }, { - name: 'Portfolio tracking', + name: 'CDN (Content Delivery Network)', description: - 'Watch your investments grow exponentially, leaving other investors in the dust.', + 'Mycelium accelerates data distribution by acting as a decentralized CDN, ensuring fast, secure, and efficient content delivery across global nodes with minimal latency.', icon: DeviceChartIcon, }, ] @@ -194,13 +194,12 @@ export function SecondaryFeatures() { className="py-20 sm:py-32" > -
+

- Now is the time to build your portfolio. + Coming Soon: The Future of Mycelium

-

- With typical market returns, you have to start young to secure your - future. With Pocket, it’s never too late to build your nest egg. +

+ Mycelium is evolving to bring even more powerful decentralized features, designed to enhance your experience and expand possibilities. Be the first to explore what's coming next by staying connected with our latest updates.

    Date: Thu, 4 Sep 2025 18:40:15 +0200 Subject: [PATCH 04/27] ok --- README.md | 4 +- src/app/(main)/page.tsx | 7 +- src/app/favicon.ico | Bin 15406 -> 15406 bytes src/app/layout.tsx | 4 +- src/components/About.tsx | 32 ++++++++ src/components/AndroidLink.tsx | 71 ++++++++++++++++++ src/components/AppStoreLink.tsx | 2 +- src/components/Benefits.tsx | 74 ++++++++----------- src/components/CallToAction.tsx | 18 +++-- src/components/DownloadLink.tsx | 15 ++++ src/components/Footer.tsx | 6 +- src/components/Header.tsx | 25 ++++--- src/components/Hero.tsx | 10 +-- src/components/LinuxLink.tsx | 36 +++++++++ src/components/NavLinks.tsx | 5 +- src/components/PrimaryFeatures.tsx | 7 +- src/components/{Reviews.tsx => UseCases.tsx} | 8 +- src/components/WindowsLink.tsx | 39 ++++++++++ src/images/android.svg | 1 + src/images/favicon.svg | 1 + src/images/linux.png | Bin 0 -> 44069 bytes src/images/linux.svg | 3 + src/images/mycelium.svg | 1 + 23 files changed, 282 insertions(+), 87 deletions(-) create mode 100644 src/components/About.tsx create mode 100644 src/components/AndroidLink.tsx create mode 100644 src/components/DownloadLink.tsx create mode 100644 src/components/LinuxLink.tsx rename src/components/{Reviews.tsx => UseCases.tsx} (99%) create mode 100644 src/components/WindowsLink.tsx create mode 100644 src/images/android.svg create mode 100644 src/images/favicon.svg create mode 100644 src/images/linux.png create mode 100644 src/images/linux.svg create mode 100644 src/images/mycelium.svg diff --git a/README.md b/README.md index 32268db..7c5504b 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# Pocket +# Mycelium -Pocket is a [Tailwind Plus](https://tailwindcss.com/plus) site template built using [Tailwind CSS](https://tailwindcss.com) and [Next.js](https://nextjs.org). +Mycelium is a [Tailwind Plus](https://tailwindcss.com/plus) site template built using [Tailwind CSS](https://tailwindcss.com) and [Next.js](https://nextjs.org). ## Getting started diff --git a/src/app/(main)/page.tsx b/src/app/(main)/page.tsx index 1aa354a..7ab1cbb 100644 --- a/src/app/(main)/page.tsx +++ b/src/app/(main)/page.tsx @@ -3,16 +3,19 @@ import { Faqs } from '@/components/Faqs' import { Hero } from '@/components/Hero' import { Pricing } from '@/components/Pricing' import { PrimaryFeatures } from '@/components/PrimaryFeatures' -import { Reviews } from '@/components/Reviews' +import { UseCases } from '@/components/UseCases' import { SecondaryFeatures } from '@/components/SecondaryFeatures' import { Benefits } from '@/components/Benefits' +import { About } from '@/components/About' export default function Home() { return ( <> + + - + diff --git a/src/app/favicon.ico b/src/app/favicon.ico index 88b1f7a98a9c12d0a3a1aac0006c111ec46e9b33..2c1a304eb6a6c3b3e0a3d4f3ff30b43054dcd846 100644 GIT binary patch literal 15406 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 literal 15406 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 C@7Npw diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 8ad1a0b..b06e386 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -13,10 +13,10 @@ const inter = Inter({ export const metadata: Metadata = { title: { template: '%s - Mycelium', - default: 'Mycelium - Redefining Digital Communication', + default: 'Mycelium - Unleash the Power of Decentralized Networks', }, description: - 'Mycelium is designed to improve how we connect and communicate in the digital world. Its goal is to create a secure, efficient, and scalable digital ecosystem where data flows seamlessly and remains protected.', + 'Discover Mycelium, an end-to-end encrypted IPv6 overlay network. The future of secure, efficient, and scalable networking.', } export default function RootLayout({ diff --git a/src/components/About.tsx b/src/components/About.tsx new file mode 100644 index 0000000..8641491 --- /dev/null +++ b/src/components/About.tsx @@ -0,0 +1,32 @@ +import { AppStoreLink } from '@/components/AppStoreLink' +import { CircleBackground } from '@/components/CircleBackground' +import { Container } from '@/components/Container' + +export function About() { + return ( +
    +
    + +
    + +
    +

    + Discover Mycelium +

    +

    + Mycelium is an unbreakable network, always finding the shortest path and providing 100% secure, peer-to-peer communication. But this is just the beginning. +

    +

    + Our mission is to create a sustainable digital ecosystem where communication is seamless, data is secure, and scalability knows no bounds. +

    +
    + +
    +
    +
    +
    + ) +} diff --git a/src/components/AndroidLink.tsx b/src/components/AndroidLink.tsx new file mode 100644 index 0000000..eb1a12f --- /dev/null +++ b/src/components/AndroidLink.tsx @@ -0,0 +1,71 @@ +import Link from 'next/link' +import clsx from 'clsx' + +export function AndroidLink({ + color = 'black', +}: { + color?: 'black' | 'white' +}) { + return ( + + {/* Android SVG (converted for JSX) */} + + + {/* Text */} +
    + Download for + Android +
    + + ) +} diff --git a/src/components/AppStoreLink.tsx b/src/components/AppStoreLink.tsx index a970540..24b4dc0 100644 --- a/src/components/AppStoreLink.tsx +++ b/src/components/AppStoreLink.tsx @@ -8,7 +8,7 @@ export function AppStoreLink({ }) { return ( +

    - Powering Secure & Decentralized Connectivity + Nature's Blueprint for Digital Connectivity

    - Mycelium, a key component of the ThreeFold Grid, can be installed on any computer (macOS, Linux, Windows) and smartphone (iOS, Android). With seamless integration, it enables secure and private communication across devices. + Just as nature's mycelium network serves as a critical component in the ecosystems of forests, connecting trees and plants underground, the Mycelium technology offers reliable connectivity in an efficient and resilient way.

    -

    - The ThreeFold Dashboard offers dozens of applications with built-in Mycelium support, making it easy to deploy and utilize. Once installed, Mycelium provides a secure, encrypted network for a wide range of use cases, from private communication to decentralized infrastructure. -

      {features.map((feature) => ( @@ -57,16 +44,17 @@ export function Benefits() { key={feature.name} className="rounded-2xl border border-gray-200 p-8 dark:border-gray-700" > -

      {feature.name}

      -
        - {feature.description.replace(/\.\s+/g, '\n').split('\n').filter((item: string) => item.trim()).map((item: string, index: number) => ( -
      • {item.trim()}
      • - ))} -
      + {feature.name} +

      {feature.name}

      +

      {feature.description}

      ))}
    -
+ ) } diff --git a/src/components/CallToAction.tsx b/src/components/CallToAction.tsx index 9a4f4ab..2493e09 100644 --- a/src/components/CallToAction.tsx +++ b/src/components/CallToAction.tsx @@ -1,4 +1,7 @@ import { AppStoreLink } from '@/components/AppStoreLink' +import { WindowsLink } from '@/components/WindowsLink' +import { AndroidLink } from './AndroidLink' +import { LinuxLink } from '@/components/LinuxLink' import { CircleBackground } from '@/components/CircleBackground' import { Container } from '@/components/Container' @@ -12,17 +15,18 @@ export function CallToAction() {
-
+

- Get your first tips today + Get Started Today

-

- It takes 30 seconds to sign up. Download the app and create an - account today and we’ll send you a tip guaranteed to double your - first investment. +

+ Download the Mycelium app and step into the future of secure, peer-to-peer networking; fast, private, and decentralized.

-
+
+ + +
diff --git a/src/components/DownloadLink.tsx b/src/components/DownloadLink.tsx new file mode 100644 index 0000000..70aa105 --- /dev/null +++ b/src/components/DownloadLink.tsx @@ -0,0 +1,15 @@ +import Link from 'next/link' +import { ArrowDownTrayIcon } from '@heroicons/react/24/solid' + +export function DownloadLink() { + return ( + + + Get Mycelium + + ) +} diff --git a/src/components/Footer.tsx b/src/components/Footer.tsx index 439307e..378a3f4 100644 --- a/src/components/Footer.tsx +++ b/src/components/Footer.tsx @@ -29,8 +29,8 @@ export function Footer() {
-

Pocket

-

Invest at the perfect time.

+

Mycelium

+

Unleash the Power of Decentralized Networks

diff --git a/src/components/Header.tsx b/src/components/Header.tsx index a89b0cc..08e87f0 100644 --- a/src/components/Header.tsx +++ b/src/components/Header.tsx @@ -108,22 +108,25 @@ export function Header() { className="absolute inset-x-0 top-0 z-0 origin-top rounded-b-2xl bg-gray-50 px-6 pt-32 pb-6 shadow-2xl shadow-gray-900/20" >
+ + About + + + Benefits + Features - - Reviews - - - Pricing + + Use Cases FAQs
- - +
@@ -133,10 +136,10 @@ export function Header() { )}
- - +
diff --git a/src/components/Hero.tsx b/src/components/Hero.tsx index 65d4815..7994fed 100644 --- a/src/components/Hero.tsx +++ b/src/components/Hero.tsx @@ -3,7 +3,7 @@ import Image from 'next/image' import clsx from 'clsx' import { AppDemo } from '@/components/AppDemo' -import { AppStoreLink } from '@/components/AppStoreLink' +import { DownloadLink } from '@/components/DownloadLink' import { Button } from '@/components/Button' import { Container } from '@/components/Container' import { PhoneFrame } from '@/components/PhoneFrame' @@ -105,7 +105,7 @@ export function Hero() {

- MYCELIUM + Mycelium

Unleashing the Power of Decentralized Networks @@ -117,13 +117,13 @@ export function Hero() { Coming Soon: New Decentralized Features

- +

diff --git a/src/components/LinuxLink.tsx b/src/components/LinuxLink.tsx new file mode 100644 index 0000000..ede0070 --- /dev/null +++ b/src/components/LinuxLink.tsx @@ -0,0 +1,36 @@ +import Link from 'next/link' +import clsx from 'clsx' + +export function LinuxLink({ + color = 'black', +}: { + color?: 'black' | 'white' +}) { + return ( + + {/* Linux SVG */} + + + {/* Text */} +
+ Download for + Linux +
+ + ) +} diff --git a/src/components/NavLinks.tsx b/src/components/NavLinks.tsx index ea08e3b..d89909e 100644 --- a/src/components/NavLinks.tsx +++ b/src/components/NavLinks.tsx @@ -9,9 +9,10 @@ export function NavLinks() { let timeoutRef = useRef(null) return [ + ['About', '/#about'], + ['Benefits', '/#benefits'], ['Features', '/#features'], - ['Reviews', '/#reviews'], - ['Pricing', '/#pricing'], + ['Use Cases', '/#usecases'], ['FAQs', '/#faqs'], ].map(([label, href], index) => (

- Discover Mycelium + How Mycelium Operates

- Mycelium is an unbreakable network, always finding the shortest path and providing 100% secure, peer-to-peer communication. But this is just the beginning. -

-

- Our mission is to create a sustainable digital ecosystem where communication is seamless, data is secure, and scalability knows no bounds. + Mycelium, like its natural namesake, thrives on decentralization, efficiency, and security, making it a truly powerful force in the world of decentralized networks.

diff --git a/src/components/Reviews.tsx b/src/components/UseCases.tsx similarity index 99% rename from src/components/Reviews.tsx rename to src/components/UseCases.tsx index 7b7c712..a338d3a 100644 --- a/src/components/Reviews.tsx +++ b/src/components/UseCases.tsx @@ -348,17 +348,17 @@ function ReviewGrid() { ) } -export function Reviews() { +export function UseCases() { return (

Powering Secure & Decentralized Connectivity diff --git a/src/components/WindowsLink.tsx b/src/components/WindowsLink.tsx new file mode 100644 index 0000000..df72ec6 --- /dev/null +++ b/src/components/WindowsLink.tsx @@ -0,0 +1,39 @@ +import Link from 'next/link' +import clsx from 'clsx' + +export function WindowsLink({ + color = 'black', +}: { + color?: 'black' | 'white' +}) { + return ( + + {/* Windows logo */} + + + {/* Text */} +
+ Download for + Windows +
+ + ) +} diff --git a/src/images/android.svg b/src/images/android.svg new file mode 100644 index 0000000..94353d8 --- /dev/null +++ b/src/images/android.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/images/favicon.svg b/src/images/favicon.svg new file mode 100644 index 0000000..9c8883a --- /dev/null +++ b/src/images/favicon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/images/linux.png b/src/images/linux.png new file mode 100644 index 0000000000000000000000000000000000000000..e0a349c950500bbe1a44ceff55bf490cff3fdfec GIT binary patch literal 44069 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 D;1ps@ literal 0 HcmV?d00001 diff --git a/src/images/linux.svg b/src/images/linux.svg new file mode 100644 index 0000000..91ffe3e --- /dev/null +++ b/src/images/linux.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/images/mycelium.svg b/src/images/mycelium.svg new file mode 100644 index 0000000..4eb60f2 --- /dev/null +++ b/src/images/mycelium.svg @@ -0,0 +1 @@ + \ No newline at end of file From b08de471aef4de7d8b76b39f5b4aeae522eb1160 Mon Sep 17 00:00:00 2001 From: sasha-astiadi Date: Thu, 25 Sep 2025 15:36:30 +0200 Subject: [PATCH 05/27] replace logo --- src/components/DownloadLink.tsx | 2 +- src/components/Footer.tsx | 3 +- src/components/Header.tsx | 2 +- src/components/Logo.tsx | 115 ++++++++++++++++++++++++++++---- 4 files changed, 104 insertions(+), 18 deletions(-) diff --git a/src/components/DownloadLink.tsx b/src/components/DownloadLink.tsx index 70aa105..07938e7 100644 --- a/src/components/DownloadLink.tsx +++ b/src/components/DownloadLink.tsx @@ -6,7 +6,7 @@ export function DownloadLink() { Get Mycelium diff --git a/src/components/Footer.tsx b/src/components/Footer.tsx index 378a3f4..d8587c3 100644 --- a/src/components/Footer.tsx +++ b/src/components/Footer.tsx @@ -4,7 +4,6 @@ import Link from 'next/link' import { Button } from '@/components/Button' import { Container } from '@/components/Container' import { TextField } from '@/components/Fields' -import { Logomark } from '@/components/Logo' import { NavLinks } from '@/components/NavLinks' import qrCode from '@/images/qr-code.svg' @@ -27,7 +26,7 @@ export function Footer() {
- + Mycelium Logomark

Mycelium

Unleash the Power of Decentralized Networks

diff --git a/src/components/Header.tsx b/src/components/Header.tsx index 08e87f0..6ca40d7 100644 --- a/src/components/Header.tsx +++ b/src/components/Header.tsx @@ -126,7 +126,7 @@ export function Header() { - +
diff --git a/src/components/Logo.tsx b/src/components/Logo.tsx index 8267549..b1255ff 100644 --- a/src/components/Logo.tsx +++ b/src/components/Logo.tsx @@ -1,23 +1,110 @@ export function Logomark(props: React.ComponentPropsWithoutRef<'svg'>) { return ( - + + + + + + + + + + + + + + + + + + + + + + + ) } export function Logo(props: React.ComponentPropsWithoutRef<'svg'>) { return ( - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ) } From 409535d9dc9c16ae81e4a70db8cde543f0acfe9f Mon Sep 17 00:00:00 2001 From: sasha-astiadi Date: Thu, 25 Sep 2025 16:27:28 +0200 Subject: [PATCH 06/27] ok --- src/components/Header.tsx | 2 +- src/components/Hero.tsx | 13 ++++++++----- src/components/PhoneFrame.tsx | 32 +++++++------------------------- 3 files changed, 16 insertions(+), 31 deletions(-) diff --git a/src/components/Header.tsx b/src/components/Header.tsx index 6ca40d7..d85b851 100644 --- a/src/components/Header.tsx +++ b/src/components/Header.tsx @@ -139,7 +139,7 @@ export function Header() { - +
diff --git a/src/components/Hero.tsx b/src/components/Hero.tsx index 7994fed..1ba18a2 100644 --- a/src/components/Hero.tsx +++ b/src/components/Hero.tsx @@ -2,11 +2,9 @@ import { useId } from 'react' import Image from 'next/image' import clsx from 'clsx' -import { AppDemo } from '@/components/AppDemo' import { DownloadLink } from '@/components/DownloadLink' import { Button } from '@/components/Button' import { Container } from '@/components/Container' -import { PhoneFrame } from '@/components/PhoneFrame' import logoBbc from '@/images/logos/bbc.svg' import logoCbs from '@/images/logos/cbs.svg' import logoCnn from '@/images/logos/cnn.svg' @@ -130,9 +128,14 @@ export function Hero() {
- - - + Mycelium application demo
diff --git a/src/components/PhoneFrame.tsx b/src/components/PhoneFrame.tsx index 6ca4cb5..3759948 100644 --- a/src/components/PhoneFrame.tsx +++ b/src/components/PhoneFrame.tsx @@ -1,22 +1,6 @@ import Image from 'next/image' import clsx from 'clsx' -import frame from '@/images/phone-frame.svg' - -function PlaceholderFrame(props: React.ComponentPropsWithoutRef<'svg'>) { - return ( - - ) -} - export function PhoneFrame({ className, children, @@ -24,19 +8,17 @@ export function PhoneFrame({ ...props }: React.ComponentPropsWithoutRef<'div'> & { priority?: boolean }) { return ( -
-
-
- {children} -
- +
+
+ {children} +
) } From 5e34e6826f1149d1fbf0b6c79b70cfbb609cb991 Mon Sep 17 00:00:00 2001 From: sasha-astiadi Date: Mon, 13 Oct 2025 16:10:09 +0200 Subject: [PATCH 07/27] feat: wrap homepage sections in AnimatedSection components for scroll animations --- src/app/(main)/page.tsx | 34 ++++++++++++++++++++++-------- src/components/AnimatedSection.tsx | 23 ++++++++++++++++++++ 2 files changed, 48 insertions(+), 9 deletions(-) create mode 100644 src/components/AnimatedSection.tsx diff --git a/src/app/(main)/page.tsx b/src/app/(main)/page.tsx index 7ab1cbb..5002a15 100644 --- a/src/app/(main)/page.tsx +++ b/src/app/(main)/page.tsx @@ -1,7 +1,7 @@ +import { AnimatedSection } from '@/components/AnimatedSection' import { CallToAction } from '@/components/CallToAction' import { Faqs } from '@/components/Faqs' import { Hero } from '@/components/Hero' -import { Pricing } from '@/components/Pricing' import { PrimaryFeatures } from '@/components/PrimaryFeatures' import { UseCases } from '@/components/UseCases' import { SecondaryFeatures } from '@/components/SecondaryFeatures' @@ -11,14 +11,30 @@ import { About } from '@/components/About' export default function Home() { return ( <> - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + ) } diff --git a/src/components/AnimatedSection.tsx b/src/components/AnimatedSection.tsx new file mode 100644 index 0000000..a1402e0 --- /dev/null +++ b/src/components/AnimatedSection.tsx @@ -0,0 +1,23 @@ +'use client' + +import { useRef } from 'react' +import { motion, useInView } from 'framer-motion' + +export function AnimatedSection({ children }: { children: React.ReactNode }) { + const ref = useRef(null) + const isInView = useInView(ref, { once: false, margin: '-50% 0px -50% 0px' }) + + return ( + + {children} + + ) +} From 8b7f5f728607b890f26dcc9d8331991f6ce8ee4d Mon Sep 17 00:00:00 2001 From: sasha-astiadi Date: Mon, 13 Oct 2025 16:49:00 +0200 Subject: [PATCH 08/27] refactor: replace Benefits component with Features and remove featured section from Hero --- src/app/(main)/page.tsx | 3 +- src/components/Features.tsx | 126 ++++++++++++++++++ src/components/Hero.tsx | 4 +- src/components/Pathfinding.tsx | 233 +++++++++++++++++++++++++++++++++ 4 files changed, 363 insertions(+), 3 deletions(-) create mode 100644 src/components/Features.tsx create mode 100644 src/components/Pathfinding.tsx diff --git a/src/app/(main)/page.tsx b/src/app/(main)/page.tsx index 5002a15..6e175fe 100644 --- a/src/app/(main)/page.tsx +++ b/src/app/(main)/page.tsx @@ -7,6 +7,7 @@ import { UseCases } from '@/components/UseCases' import { SecondaryFeatures } from '@/components/SecondaryFeatures' import { Benefits } from '@/components/Benefits' import { About } from '@/components/About' +import { Features } from '@/components/Features' export default function Home() { return ( @@ -18,7 +19,7 @@ export default function Home() { - + diff --git a/src/components/Features.tsx b/src/components/Features.tsx new file mode 100644 index 0000000..c29d33b --- /dev/null +++ b/src/components/Features.tsx @@ -0,0 +1,126 @@ +import Pathfinding from '@/components/Pathfinding' + +export function Features() { + return ( +
+
+

+ Network Capabilities +

+

+ If you have anything else you want to ask,{' '} + + reach out to us + + . +

+
+
+
+
+ +
+

Routing

+

+ Automatic pathfinding +

+

+ The Mycelium Network automatically discovers the shortest and fastest routes between nodes, + ensuring optimal data flow and network efficiency without manual configuration. +

+
+
+
+
+
+
+
+ +
+

Communication

+

+ Distributed message bus +

+

+ Acts as a global message layer that lets nodes exchange information seamlessly. + Enables resilient, asynchronous communication across the entire decentralized mesh. +

+
+
+
+
+
+
+
+ +
+

Discovery

+

+ Automatic proxy detection +

+

+ The system continuously scans for open SOCKS5 proxies within the network, + making it effortless to find available connection points without manual setup. +

+
+
+
+
+
+
+
+ +
+

Connectivity

+

+ Seamless proxy forwarding +

+

+ Local SOCKS5 connections can be forwarded through nearby nodes or remote proxies. + When browsers use the local proxy, traffic moves securely through the mesh—like a built-in VPN. +

+
+
+
+
+
+
+
+ +
+

Delivery

+

+ Decentralized content distribution +

+

+ Mycelium can serve data from distributed 0-DBs, creating a CDN-like layer that delivers + content faster and more reliably—without relying on centralized servers. +

+
+
+
+
+
+
+
+ ) +} diff --git a/src/components/Hero.tsx b/src/components/Hero.tsx index 1ba18a2..caa136a 100644 --- a/src/components/Hero.tsx +++ b/src/components/Hero.tsx @@ -138,7 +138,7 @@ export function Hero() { />
-
+ {/*

As featured in

@@ -161,7 +161,7 @@ export function Hero() { ))} -
+
*/}
diff --git a/src/components/Pathfinding.tsx b/src/components/Pathfinding.tsx new file mode 100644 index 0000000..718c240 --- /dev/null +++ b/src/components/Pathfinding.tsx @@ -0,0 +1,233 @@ +// pathfinding.tsx +// Animated SVG illustrating "Automatic pathfinding" +// - Central hub + surrounding nodes +// - Arrows fade/slide in +// - Shortest path highlights on loop +// - Respects prefers-reduced-motion +'use client'; + +import * as React from 'react'; +import { motion, useReducedMotion } from 'framer-motion'; +import clsx from 'clsx'; + + +type Props = { + className?: string; // e.g. "w-full h-64" + accent?: string; // main accent color + stroke?: string; // neutral stroke color + bg?: string; // background color +}; + +const Node = ({ + cx, + cy, + r = 16, + fill = "#00b8db", + ring = "#E5E7EB", + pulse = false, + rMotion = 2, +}: { + cx: number; + cy: number; + r?: number; + fill?: string; + ring?: string; + pulse?: boolean; + rMotion?: number; +}) => { + const prefersReduced = useReducedMotion(); + + return ( + <> + {/* outer ring */} + + {/* core node */} + + + ); +}; + +const Arrow = ({ + d, + color = "#111827", + delay = 0, +}: { + d: string; + color?: string; + delay?: number; +}) => ( + +); + +const DashedPath = ({ + d, + color = "#9CA3AF", + dash = 6, + delay = 0, + loop = false, +}: { + d: string; + color?: string; + dash?: number; + delay?: number; + loop?: boolean; +}) => { + const prefersReduced = useReducedMotion(); + + return ( + + ); +}; + +export default function Pathfinding({ + className, + accent = "#00b8db", // indigo-800 vibe + stroke = "#111827", // gray-900 + bg = "#FFFFFF", +}: Props) { + // Canvas + const W = 760; + const H = 420; + + // Layout (simple radial) + const center = { x: 380, y: 210 }; + const nodes = [ + { x: 130, y: 210 }, // left + { x: 670, y: 210 }, // right + { x: 380, y: 70 }, // top + { x: 280, y: 340 }, // bottom-left + { x: 500, y: 340 }, // bottom-right + ]; + + // Helper to make arrow path with a small head + const arrowTo = (from: { x: number; y: number }, to: { x: number; y: number }) => { + const dx = to.x - from.x; + const dy = to.y - from.y; + const len = Math.hypot(dx, dy); + const ux = dx / len; + const uy = dy / len; + const end = { x: to.x - ux * 18, y: to.y - uy * 18 }; // inset a bit + const headL = { + x: end.x - uy * 8 - ux * 6, + y: end.y + ux * 8 - uy * 6, + }; + const headR = { + x: end.x + uy * 8 - ux * 6, + y: end.y - ux * 8 - uy * 6, + }; + return `M ${from.x} ${from.y} L ${end.x} ${end.y} M ${headL.x} ${headL.y} L ${end.x} ${end.y} L ${headR.x} ${headR.y}`; + }; + + // "Shortest" highlighted route: left -> center -> bottom-right + const highlightA = `M ${nodes[0].x} ${nodes[0].y} L ${center.x} ${center.y}`; + const highlightB = `M ${center.x} ${center.y} L ${nodes[4].x} ${nodes[4].y}`; + + // Faint alternative routes + const alt1 = `M ${nodes[2].x} ${nodes[2].y} L ${center.x} ${center.y}`; + const alt2 = `M ${nodes[3].x} ${nodes[3].y} L ${center.x} ${center.y}`; + const alt3 = `M ${center.x} ${center.y} L ${nodes[1].x} ${nodes[1].y}`; + + return ( + + ); +} From ce162cd169fc275e131e976b54acaacdcb4abfef Mon Sep 17 00:00:00 2001 From: sasha-astiadi Date: Mon, 13 Oct 2025 17:39:47 +0200 Subject: [PATCH 09/27] feat: replace static images with MessageBus and ProxyDetection components in Features section --- src/components/Features.tsx | 21 +--- src/components/MessageBus.tsx | 150 ++++++++++++++++++++++ src/components/ProxyDetection.tsx | 194 +++++++++++++++++++++++++++++ src/components/ProxyForwarding.tsx | 175 ++++++++++++++++++++++++++ 4 files changed, 525 insertions(+), 15 deletions(-) create mode 100644 src/components/MessageBus.tsx create mode 100644 src/components/ProxyDetection.tsx create mode 100644 src/components/ProxyForwarding.tsx diff --git a/src/components/Features.tsx b/src/components/Features.tsx index c29d33b..367e4d7 100644 --- a/src/components/Features.tsx +++ b/src/components/Features.tsx @@ -1,4 +1,7 @@ import Pathfinding from '@/components/Pathfinding' +import MessageBus from '@/components/MessageBus' +import ProxyDetection from '@/components/ProxyDetection' +import ProxyForwarding from '@/components/ProxyForwarding' export function Features() { return ( @@ -38,11 +41,7 @@ export function Features() {
- +

Communication

@@ -59,11 +58,7 @@ export function Features() {

- +

Discovery

@@ -101,11 +96,7 @@ export function Features() {

- +

Delivery

diff --git a/src/components/MessageBus.tsx b/src/components/MessageBus.tsx new file mode 100644 index 0000000..b63c4ba --- /dev/null +++ b/src/components/MessageBus.tsx @@ -0,0 +1,150 @@ +'use client'; + +import * as React from 'react'; +import { motion, useReducedMotion } from 'framer-motion'; + +type Props = { + className?: string; // e.g. "w-full h-72" + bg?: string; // default white +}; + +/** Palette (gray/black + accent only) */ +const ACCENT = '#00b8db'; +const STROKE = '#111827'; // black-ish +const GRAY = '#9CA3AF'; +const GRAY_LT = '#E5E7EB'; + +function Envelope({ + x, y, w = 88, h = 56, fill = GRAY_LT, accent = false, delay = 0, duration = 1.6, + path = 'none', // 'left1' | 'left2' | 'rightTop' | 'rightBottom' | 'none' + reverse = false, +}: { + x: number; y: number; w?: number; h?: number; fill?: string; accent?: boolean; + delay?: number; duration?: number; path?: 'left1'|'left2'|'rightTop'|'rightBottom'|'none'; reverse?: boolean; +}) { + const prefersReduced = useReducedMotion(); + + // simple keyframe paths (straight line segments) + const paths: Record = { + left1: { x: [x, 380], y: [y, 220] }, + left2: { x: [x, 380], y: [y, 220] }, + rightTop: { x: [380, 720], y: [220, 150] }, + rightBottom: { x: [380, 720], y: [220, 290] }, + none: { x: [x], y: [y] }, + }; + + const k = paths[path]; + + return ( + + {/* envelope body */} + + {/* flap */} + + + ); +} + +export default function MessageBus({ className, bg = '#ffffff' }: Props) { + const W = 900; + const H = 460; + + return ( +

+ ); +} diff --git a/src/components/ProxyDetection.tsx b/src/components/ProxyDetection.tsx new file mode 100644 index 0000000..6ddaeb7 --- /dev/null +++ b/src/components/ProxyDetection.tsx @@ -0,0 +1,194 @@ +'use client'; + +import * as React from 'react'; +import { motion, useReducedMotion } from 'framer-motion'; + +type Props = { + className?: string; // e.g. "w-full h-64" + bg?: string; // defaults to white +}; + +// Palette (only these) +const ACCENT = '#00b8db'; +const STROKE = '#111827'; +const GRAY = '#9CA3AF'; +const GRAY_LT = '#E5E7EB'; + +function Magnifier({ + x = 0, + y = 0, + flip = false, + delay = 0, + duration = 3, +}: { + x?: number; + y?: number; + flip?: boolean; // rotate handle direction + delay?: number; + duration?: number; +}) { + const prefersReduced = useReducedMotion(); + + return ( + + {/* glass */} + + {/* subtle scanning pulse inside the glass */} + + {/* handle */} + + + + + + ); +} + +function ServerBox({ + x, + y, + w = 88, + h = 50, + delay = 0, + accentPulse = false, +}: { + x: number; + y: number; + w?: number; + h?: number; + delay?: number; + accentPulse?: boolean; +}) { + const prefersReduced = useReducedMotion(); + + return ( + + {/* outer box */} + + {/* top bar */} + + {/* activity line */} + + {/* “detected” indicator */} + + + ); +} + +export default function ProxyDetection({ className, bg = '#ffffff' }: Props) { + // Canvas + const W = 900; + const H = 180; + + // Layout: a row of proxy servers + const rowY = H / 2; + const xs = [180, 320, 460, 600, 740]; + + // Sequence timings so boxes light up as magnifier passes + const delays = [0.8, 0.6, 0.4, 0.2, 0.0]; + + return ( + + ); +} diff --git a/src/components/ProxyForwarding.tsx b/src/components/ProxyForwarding.tsx new file mode 100644 index 0000000..a76517e --- /dev/null +++ b/src/components/ProxyForwarding.tsx @@ -0,0 +1,175 @@ +'use client'; + +import * as React from 'react'; +import { motion, useReducedMotion } from 'framer-motion'; + +type Props = { + className?: string; // e.g. "w-full h-72" + bg?: string; // default white +}; + +/** Palette */ +const ACCENT = '#00b8db'; +const STROKE = '#111827'; // black-ish +const GRAY = '#9CA3AF'; +const GRAY_LT = '#E5E7EB'; + +function Laptop({ x, y }: { x: number; y: number }) { + return ( + + {/* screen */} + + + {/* base */} + + + ); +} + +function ServerStack({ x, y }: { x: number; y: number }) { + return ( + + {[0, 1, 2].map((i) => ( + + + + + + + + ))} + {/* tiny rack base */} + + + + ); +} + +function Cloud({ x, y }: { x: number; y: number }) { + return ( + + + + + + + + ); +} + +function Arrow({ d, delay = 0 }: { d: string; delay?: number }) { + return ( + + ); +} + +/** Small packet traveling along keyframe x/y arrays */ +function Packet({ + xs, + ys, + delay = 0, + color = ACCENT, + duration = 2.2, +}: { + xs: number[]; + ys: number[]; + delay?: number; + color?: string; + duration?: number; +}) { + const prefersReduced = useReducedMotion(); + return ( + + ); +} + +export default function ProxyForwarding({ className, bg = '#ffffff' }: Props) { + const W = 1000; + const H = 420; + + // Key points + const C1 = { x: 140, y: 90 }; + const C2 = { x: 140, y: 210 }; + const C3 = { x: 140, y: 330 }; + + const PROXY = { x: 420, y: 210 }; + const CLOUD = { x: 640, y: 210 }; + const DEST = { x: 860, y: 210 }; + + return ( + + ); +} From b320f3e506349bfeab87dd6ee17795cfc410959f Mon Sep 17 00:00:00 2001 From: sasha-astiadi Date: Mon, 13 Oct 2025 17:53:35 +0200 Subject: [PATCH 10/27] feat: replace placeholder image with ProxyForwarding component and add ContentDistribution section --- src/components/ContentDistribution.tsx | 182 +++++++++++++++++++++++++ src/components/Features.tsx | 9 +- 2 files changed, 185 insertions(+), 6 deletions(-) create mode 100644 src/components/ContentDistribution.tsx diff --git a/src/components/ContentDistribution.tsx b/src/components/ContentDistribution.tsx new file mode 100644 index 0000000..c45af40 --- /dev/null +++ b/src/components/ContentDistribution.tsx @@ -0,0 +1,182 @@ +'use client'; + +import * as React from 'react'; +import { motion, useReducedMotion } from 'framer-motion'; + +type Props = { + className?: string; // e.g. "w-full h-80" + bg?: string; // default white +}; + +/** Palette */ +const ACCENT = '#00b8db'; +const STROKE = '#111827'; +const GRAY = '#9CA3AF'; +const GRAY_LT = '#E5E7EB'; + +/* ---------- small generic icons (no brands) ---------- */ +const IconSquare = () => ( + +); +const IconTriangle = () => ( + +); +const IconHex = () => ( + +); +const IconBolt = () => ( + +); +const IconPlay = () => ( + +); +const IconDB = () => ( + <> + + + + +); + +/* icon inside white circular badge */ +function Badge({ children }: { children: React.ReactNode }) { + return ( + <> + + {children} + + + + + ); +} + +/* ---------- central cloud ---------- */ +function Cloud({ pulse = true }: { pulse?: boolean }) { + const prefersReduced = useReducedMotion(); + return ( + + + + + + + + {/* subtle accent aura */} + + + ); +} + +/* a small packet line from center to a node */ +function Beam({ + x2, + y2, + delay = 0, +}: { + x2: number; + y2: number; + delay?: number; +}) { + const prefersReduced = useReducedMotion(); + return ( + + ); +} + +export default function ContentDistribution({ className, bg = '#ffffff' }: Props) { + const W = 900; + const H = 560; + + // ring radii + const rings = [110, 190, 270]; + + // positions (angle degrees) for badges on rings + const layout = [ + { r: rings[1], a: -20, icon: }, + { r: rings[2], a: 20, icon: }, + { r: rings[0], a: 155, icon: }, + { r: rings[2], a: -145, icon: }, + { r: rings[1], a: 210, icon: }, + { r: rings[0], a: 60, icon: }, + ]; + + const prefersReduced = useReducedMotion(); + + return ( + + ); +} diff --git a/src/components/Features.tsx b/src/components/Features.tsx index 367e4d7..cc6614e 100644 --- a/src/components/Features.tsx +++ b/src/components/Features.tsx @@ -2,6 +2,7 @@ import Pathfinding from '@/components/Pathfinding' import MessageBus from '@/components/MessageBus' import ProxyDetection from '@/components/ProxyDetection' import ProxyForwarding from '@/components/ProxyForwarding' +import ContentDistribution from '@/components/ContentDistribution' export function Features() { return ( @@ -75,11 +76,7 @@ export function Features() {
- +

Connectivity

@@ -96,7 +93,7 @@ export function Features() {

- +

Delivery

From ad1d11cdf1fde0dff5da9645db3ab6c721725c31 Mon Sep 17 00:00:00 2001 From: sasha-astiadi Date: Tue, 14 Oct 2025 11:25:07 +0200 Subject: [PATCH 11/27] style: update UI with darker background, remove animations and adjust layout spacing --- hooks/useScrollDirection.ts | 46 ++++++++++++++++++++++++++ src/components/About.tsx | 4 +-- src/components/ContentDistribution.tsx | 15 ++++++--- src/components/LinuxLink.tsx | 2 +- src/components/PrimaryFeatures.tsx | 2 +- 5 files changed, 61 insertions(+), 8 deletions(-) create mode 100644 hooks/useScrollDirection.ts diff --git a/hooks/useScrollDirection.ts b/hooks/useScrollDirection.ts new file mode 100644 index 0000000..c360c5f --- /dev/null +++ b/hooks/useScrollDirection.ts @@ -0,0 +1,46 @@ +'use client'; + +import { useState, useEffect } from 'react'; + +export type ScrollDirection = 'up' | 'down'; + +/** + * A hook to detect the scroll direction. + * It uses requestAnimationFrame for performance, comparing the current scroll position + * with the previous one to determine if the user is scrolling up or down. + * + * @returns {ScrollDirection | null} The current scroll direction ('up' or 'down'), or null on the initial render. + */ +export function useScrollDirection(): ScrollDirection | null { + const [scrollDirection, setScrollDirection] = useState(null); + + useEffect(() => { + let lastScrollY = window.pageYOffset; + let ticking = false; + + const updateScrollDirection = () => { + const scrollY = window.pageYOffset; + + if (Math.abs(scrollY - lastScrollY) < 10) { + ticking = false; + return; + } + setScrollDirection(scrollY > lastScrollY ? 'down' : 'up'); + lastScrollY = scrollY > 0 ? scrollY : 0; + ticking = false; + }; + + const onScroll = () => { + if (!ticking) { + window.requestAnimationFrame(updateScrollDirection); + ticking = true; + } + }; + + window.addEventListener('scroll', onScroll); + + return () => window.removeEventListener('scroll', onScroll); + }, []); + + return scrollDirection; +} \ No newline at end of file diff --git a/src/components/About.tsx b/src/components/About.tsx index 8641491..d9595fd 100644 --- a/src/components/About.tsx +++ b/src/components/About.tsx @@ -6,10 +6,10 @@ export function About() { return (

- +
diff --git a/src/components/ContentDistribution.tsx b/src/components/ContentDistribution.tsx index c45af40..af24c64 100644 --- a/src/components/ContentDistribution.tsx +++ b/src/components/ContentDistribution.tsx @@ -153,24 +153,31 @@ export default function ContentDistribution({ className, bg = '#ffffff' }: Props {/* central cloud */} - {/* rotating layer with badges */} + {/* rotating layer with badges and beams */} + {/* Beams */} + {layout.map((n, i) => { + const rad = (n.a * Math.PI) / 180; + const x = n.r * Math.cos(rad); + const y = n.r * Math.sin(rad); + return ; + })} + + {/* Badges */} {layout.map((n, i) => { const rad = (n.a * Math.PI) / 180; const x = n.r * Math.cos(rad); const y = n.r * Math.sin(rad); return ( - + {n.icon} - {/* beam from center to this node (animated) */} - ); })} diff --git a/src/components/LinuxLink.tsx b/src/components/LinuxLink.tsx index ede0070..1e0f251 100644 --- a/src/components/LinuxLink.tsx +++ b/src/components/LinuxLink.tsx @@ -8,7 +8,7 @@ export function LinuxLink({ }) { return ( Date: Tue, 14 Oct 2025 12:01:33 +0200 Subject: [PATCH 12/27] refactor: update UI styling and download link to point to GitHub releases --- src/app/(auth)/login/page.tsx | 49 --------------------- src/app/(auth)/register/page.tsx | 75 -------------------------------- src/app/(main)/download/page.tsx | 12 +++++ src/components/About.tsx | 4 +- src/components/DownloadLink.tsx | 4 +- src/components/Header.tsx | 2 +- src/components/Hero.tsx | 2 +- 7 files changed, 19 insertions(+), 129 deletions(-) delete mode 100644 src/app/(auth)/login/page.tsx delete mode 100644 src/app/(auth)/register/page.tsx create mode 100644 src/app/(main)/download/page.tsx diff --git a/src/app/(auth)/login/page.tsx b/src/app/(auth)/login/page.tsx deleted file mode 100644 index 013dbbd..0000000 --- a/src/app/(auth)/login/page.tsx +++ /dev/null @@ -1,49 +0,0 @@ -import { type Metadata } from 'next' -import Link from 'next/link' - -import { AuthLayout } from '@/components/AuthLayout' -import { Button } from '@/components/Button' -import { TextField } from '@/components/Fields' - -export const metadata: Metadata = { - title: 'Sign In', -} - -export default function Login() { - return ( - - Don’t have an account?{' '} - - Sign up - {' '} - for a free trial. - - } - > -
-
- - -
- -
-
- ) -} diff --git a/src/app/(auth)/register/page.tsx b/src/app/(auth)/register/page.tsx deleted file mode 100644 index 1434f9b..0000000 --- a/src/app/(auth)/register/page.tsx +++ /dev/null @@ -1,75 +0,0 @@ -import { type Metadata } from 'next' -import Link from 'next/link' - -import { AuthLayout } from '@/components/AuthLayout' -import { Button } from '@/components/Button' -import { SelectField, TextField } from '@/components/Fields' - -export const metadata: Metadata = { - title: 'Sign Up', -} - -export default function Register() { - return ( - - Already registered?{' '} - - Sign in - {' '} - to your account. - - } - > -
-
- - - - - - - - - - -
- -
-
- ) -} diff --git a/src/app/(main)/download/page.tsx b/src/app/(main)/download/page.tsx new file mode 100644 index 0000000..3e3373f --- /dev/null +++ b/src/app/(main)/download/page.tsx @@ -0,0 +1,12 @@ +import { AnimatedSection } from '@/components/AnimatedSection' +import { Hero } from '@/components/Hero' + +export default function Download() { + return ( + <> + + + + + ) +} diff --git a/src/components/About.tsx b/src/components/About.tsx index d9595fd..8641491 100644 --- a/src/components/About.tsx +++ b/src/components/About.tsx @@ -6,10 +6,10 @@ export function About() { return (
- +
diff --git a/src/components/DownloadLink.tsx b/src/components/DownloadLink.tsx index 07938e7..ebaa618 100644 --- a/src/components/DownloadLink.tsx +++ b/src/components/DownloadLink.tsx @@ -4,8 +4,10 @@ import { ArrowDownTrayIcon } from '@heroicons/react/24/solid' export function DownloadLink() { return ( diff --git a/src/components/Header.tsx b/src/components/Header.tsx index d85b851..34a7ff8 100644 --- a/src/components/Header.tsx +++ b/src/components/Header.tsx @@ -126,7 +126,7 @@ export function Header() { - +
diff --git a/src/components/Hero.tsx b/src/components/Hero.tsx index caa136a..fe54ea0 100644 --- a/src/components/Hero.tsx +++ b/src/components/Hero.tsx @@ -98,7 +98,7 @@ function PlayIcon(props: React.ComponentPropsWithoutRef<'svg'>) { export function Hero() { return ( -
+
From 8f860926bbb7912a97dccfe6fcb4e7add25df753 Mon Sep 17 00:00:00 2001 From: sasha-astiadi Date: Tue, 14 Oct 2025 12:41:18 +0200 Subject: [PATCH 13/27] refactor: reorganize landing page sections and add hover animations to feature cards --- src/app/(main)/download/page.tsx | 4 +- src/app/(main)/page.tsx | 5 +- src/components/About.tsx | 3 -- src/components/DownloadHero.tsx | 77 ++++++++++++++++++++++++++++ src/components/Features.tsx | 12 ++--- src/components/Footer.tsx | 31 ++++------- src/components/Header.tsx | 2 +- src/components/PrimaryFeatures.tsx | 4 +- src/components/SecondaryFeatures.tsx | 2 +- src/images/android.svg | 2 +- src/images/apple.svg | 1 + src/images/github.svg | 4 ++ src/images/linux.svg | 4 +- src/images/windows.svg | 1 + 14 files changed, 107 insertions(+), 45 deletions(-) create mode 100644 src/components/DownloadHero.tsx create mode 100644 src/images/apple.svg create mode 100644 src/images/github.svg create mode 100644 src/images/windows.svg diff --git a/src/app/(main)/download/page.tsx b/src/app/(main)/download/page.tsx index 3e3373f..dc253a5 100644 --- a/src/app/(main)/download/page.tsx +++ b/src/app/(main)/download/page.tsx @@ -1,11 +1,11 @@ import { AnimatedSection } from '@/components/AnimatedSection' -import { Hero } from '@/components/Hero' +import DownloadHero from '@/components/DownloadHero' export default function Download() { return ( <> - + ) diff --git a/src/app/(main)/page.tsx b/src/app/(main)/page.tsx index 6e175fe..db00e55 100644 --- a/src/app/(main)/page.tsx +++ b/src/app/(main)/page.tsx @@ -25,14 +25,11 @@ export default function Home() { - + - - - diff --git a/src/components/About.tsx b/src/components/About.tsx index 8641491..7c280fc 100644 --- a/src/components/About.tsx +++ b/src/components/About.tsx @@ -22,9 +22,6 @@ export function About() {

Our mission is to create a sustainable digital ecosystem where communication is seamless, data is secure, and scalability knows no bounds.

-
- -
diff --git a/src/components/DownloadHero.tsx b/src/components/DownloadHero.tsx new file mode 100644 index 0000000..eaf5810 --- /dev/null +++ b/src/components/DownloadHero.tsx @@ -0,0 +1,77 @@ +import Image from 'next/image'; +import appleIcon from '@/images/apple.svg'; +import windowsIcon from '@/images/windows.svg'; +import androidIcon from '@/images/android.svg'; +import linuxIcon from '@/images/linux.svg'; + +const features = [ + { + name: 'Download for iOS & MacOS', + description: 'Download Mycelium App from the Apple Store.', + href: 'https://apps.apple.com/us/app/mycelium-network/id6504277565', + icon: appleIcon, + }, + { + name: 'Download for Windows', + description: 'Download the Mycelium App for Windows directly from its Github repository.', + href: 'https://github.com/threefoldtech/myceliumflut/releases', + icon: windowsIcon, + }, + { + name: 'Download for Android', + description: 'Download Mycelium from the Google Play Store.', + href: 'https://play.google.com/store/apps/details?id=tech.threefold.mycelium&pli=1', + icon: androidIcon, + }, + { + name: 'Download for Linux', + description: 'Download the Mycelium binary for Linux directly from its Github repository.', + href: 'https://github.com/threefoldtech/mycelium/releases/tag/v0.6.1', + icon: linuxIcon, + }, +]; + +export default function DownloadHero() { + return ( +
+
+
+

+ Download Mycelium +

+

+ Get Mycelium for Android, Windows, macOS, and iOS to securely connect, store, and interact with the decentralized network—seamlessly and efficiently. Not sure how it works?{' '} + + Read the manual. + +

+
+
+
+ {features.map((feature) => ( +
+
+
+ +
+ {feature.name} +
+
+

{feature.description}

+

+ + Download Now + +

+
+
+ ))} +
+
+
+
+ ); +} diff --git a/src/components/Features.tsx b/src/components/Features.tsx index cc6614e..c43179a 100644 --- a/src/components/Features.tsx +++ b/src/components/Features.tsx @@ -21,8 +21,8 @@ export function Features() { .

-
-
+
+
@@ -39,7 +39,7 @@ export function Features() {
-
+
@@ -56,7 +56,7 @@ export function Features() {
-
+
@@ -73,7 +73,7 @@ export function Features() {
-
+
@@ -90,7 +90,7 @@ export function Features() {
-
+
diff --git a/src/components/Footer.tsx b/src/components/Footer.tsx index d8587c3..9ee891d 100644 --- a/src/components/Footer.tsx +++ b/src/components/Footer.tsx @@ -5,28 +5,16 @@ import { Button } from '@/components/Button' import { Container } from '@/components/Container' import { TextField } from '@/components/Fields' import { NavLinks } from '@/components/NavLinks' -import qrCode from '@/images/qr-code.svg' - -function QrCodeBorder(props: React.ComponentPropsWithoutRef<'svg'>) { - return ( - - ) -} +import github from '@/images/github.svg' export function Footer() { return (