add website
This commit is contained in:
parent
b2ee21999f
commit
21dcc4d97a
1372
website/Cargo.lock
generated
Normal file
1372
website/Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
22
website/Cargo.toml
Normal file
22
website/Cargo.toml
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
[package]
|
||||||
|
name = "freezone-website"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
yew = { version = "0.21", features = ["csr"] }
|
||||||
|
yew-router = "0.18"
|
||||||
|
gloo = "0.11"
|
||||||
|
gloo-timers = { version = "0.3", features = ["futures"] }
|
||||||
|
wasm-bindgen = "0.2"
|
||||||
|
web-sys = { version = "0.3", features = [
|
||||||
|
"console",
|
||||||
|
"Document",
|
||||||
|
"Element",
|
||||||
|
"HtmlElement",
|
||||||
|
"Window",
|
||||||
|
"Location",
|
||||||
|
] }
|
||||||
|
js-sys = "0.3"
|
||||||
|
serde = { version = "1.0", features = ["derive"] }
|
||||||
|
pulldown-cmark = "0.11"
|
7
website/Trunk.toml
Normal file
7
website/Trunk.toml
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
[build]
|
||||||
|
target = "index.html"
|
||||||
|
|
||||||
|
[serve]
|
||||||
|
address = "127.0.0.1"
|
||||||
|
port = 8080
|
||||||
|
open = true
|
22
website/content/defi/features.md
Normal file
22
website/content/defi/features.md
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
# DeFi Features
|
||||||
|
|
||||||
|
## Liquidity Pools
|
||||||
|
Provide liquidity to earn rewards and help facilitate seamless trading across multiple token pairs with competitive APY rates.
|
||||||
|
|
||||||
|
## Leveraged Trading
|
||||||
|
Access up to 100x leverage on major cryptocurrency pairs with advanced risk management tools and real-time margin monitoring.
|
||||||
|
|
||||||
|
## Yield Farming
|
||||||
|
Maximize your returns through strategic yield farming opportunities across multiple protocols and chains.
|
||||||
|
|
||||||
|
## Staking Rewards
|
||||||
|
Stake your tokens to earn passive income while contributing to network security and governance.
|
||||||
|
|
||||||
|
## Decentralized Funds
|
||||||
|
Create or invest in decentralized investment funds with transparent performance tracking and automated rebalancing.
|
||||||
|
|
||||||
|
## Cross-Chain Bridge
|
||||||
|
Seamlessly move assets across different blockchain networks with our secure and efficient bridge technology.
|
||||||
|
|
||||||
|
## Automated Strategies
|
||||||
|
Deploy sophisticated trading and investment strategies with our automated DeFi strategy engine.
|
5
website/content/defi/hero.md
Normal file
5
website/content/defi/hero.md
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
# DeFi Platform
|
||||||
|
|
||||||
|
Access comprehensive decentralized finance functionality including leveraging, liquidity pools, yield farming, and cross-chain trading. The future of finance, today.
|
||||||
|
|
||||||
|
Maximize your returns with AI-powered optimization, risk management, and seamless cross-chain operations.
|
16
website/content/home/about.md
Normal file
16
website/content/home/about.md
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
# About Zanzibar Digital Freezone
|
||||||
|
|
||||||
|
The Zanzibar Digital Freezone is a revolutionary economic zone that enables global entrepreneurs to establish their digital legal entities and residence in one of Africa's most strategic locations. Built on cutting-edge blockchain technology and backed by progressive regulatory frameworks.
|
||||||
|
|
||||||
|
## Our Vision
|
||||||
|
|
||||||
|
To create Africa's premier digital economic zone where global businesses can operate with complete legal certainty, regulatory compliance, and digital asset freedom. Zanzibar's strategic location and forward-thinking government make it the perfect gateway between Africa, Asia, and the Middle East.
|
||||||
|
|
||||||
|
## Core Benefits
|
||||||
|
|
||||||
|
- **Legal Entity Formation**: Establish your digital company with full legal recognition
|
||||||
|
- **Digital Residence**: Obtain digital residency status in Zanzibar
|
||||||
|
- **Asset Trading**: Trade digital assets with regulatory compliance
|
||||||
|
- **Tax Optimization**: Benefit from Zanzibar's competitive tax framework
|
||||||
|
- **Strategic Location**: Access to African, Asian, and Middle Eastern markets
|
||||||
|
- **Regulatory Clarity**: Clear, progressive regulations for digital businesses
|
5
website/content/home/hero.md
Normal file
5
website/content/home/hero.md
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
# Zanzibar Digital Freezone
|
||||||
|
|
||||||
|
Establish your digital legal entity and residence in Zanzibar's premier digital freezone. Experience seamless digital asset trading with full legal protection and regulatory compliance.
|
||||||
|
|
||||||
|
Join global entrepreneurs building their digital future in Africa's most innovative economic zone.
|
19
website/content/marketplace/features.md
Normal file
19
website/content/marketplace/features.md
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
# Marketplace Features
|
||||||
|
|
||||||
|
## Digital Asset Trading
|
||||||
|
Trade a wide variety of digital assets including cryptocurrencies, tokens, and digital commodities with advanced trading tools and real-time market data.
|
||||||
|
|
||||||
|
## NFT Marketplace
|
||||||
|
Discover, buy, and sell unique NFTs from artists, creators, and brands. Support for multiple blockchain networks and advanced filtering options.
|
||||||
|
|
||||||
|
## Service Exchange
|
||||||
|
Connect with service providers and clients in the freezone. From consulting to development, find or offer professional services with crypto payments.
|
||||||
|
|
||||||
|
## Real Estate Tokenization
|
||||||
|
Invest in tokenized real estate properties, enabling fractional ownership and global accessibility to premium real estate markets.
|
||||||
|
|
||||||
|
## Escrow Services
|
||||||
|
Secure transactions with built-in escrow services, ensuring safe and reliable trading for all parties involved.
|
||||||
|
|
||||||
|
## Advanced Analytics
|
||||||
|
Market insights, price tracking, and portfolio management tools to help you make informed trading decisions.
|
5
website/content/marketplace/hero.md
Normal file
5
website/content/marketplace/hero.md
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
# Marketplace
|
||||||
|
|
||||||
|
The future of business digitalization. Transform your real-world assets and services into digital tokens, enabling seamless global commerce within the Zanzibar Digital Freezone.
|
||||||
|
|
||||||
|
Empower your business with blockchain technology, smart contracts, and regulatory compliance for the digital economy.
|
19
website/content/platform/features.md
Normal file
19
website/content/platform/features.md
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
# Platform Features
|
||||||
|
|
||||||
|
## Company Management
|
||||||
|
Establish and manage your digital companies with complete autonomy. Handle registrations, compliance, and operations through our intuitive dashboard.
|
||||||
|
|
||||||
|
## Digital Governance
|
||||||
|
Implement transparent governance structures with built-in voting mechanisms, proposal systems, and stakeholder management tools.
|
||||||
|
|
||||||
|
## Financial Administration
|
||||||
|
Comprehensive financial management including accounting, budgeting, treasury management, and automated reporting systems.
|
||||||
|
|
||||||
|
## Smart Contracts
|
||||||
|
Deploy and manage smart contracts for automated business processes, ensuring trust and transparency in all operations.
|
||||||
|
|
||||||
|
## Analytics & Insights
|
||||||
|
Real-time analytics and business intelligence tools to make data-driven decisions and optimize your operations.
|
||||||
|
|
||||||
|
## Compliance Tools
|
||||||
|
Stay compliant with automated regulatory reporting, audit trails, and compliance monitoring across multiple jurisdictions.
|
5
website/content/platform/hero.md
Normal file
5
website/content/platform/hero.md
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
# Business Management Platform
|
||||||
|
|
||||||
|
Manage, administer and govern your digital companies with unprecedented control and transparency. Built for the future of autonomous business operations.
|
||||||
|
|
||||||
|
Transform how you run your business with smart contracts, automated governance, and comprehensive financial management tools.
|
28
website/index.html
Normal file
28
website/index.html
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||||
|
<title>Freezone - Digital Freedom Platform</title>
|
||||||
|
<base data-trunk-public-url />
|
||||||
|
|
||||||
|
<!-- Bootstrap CSS -->
|
||||||
|
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
|
||||||
|
|
||||||
|
<!-- Custom CSS -->
|
||||||
|
<link data-trunk rel="css" href="styles/main.css" />
|
||||||
|
|
||||||
|
<!-- Bootstrap JS -->
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
|
||||||
|
|
||||||
|
<!-- Custom JS -->
|
||||||
|
<link data-trunk rel="copy-file" href="static/js/animations.js" />
|
||||||
|
|
||||||
|
<!-- Rust WASM -->
|
||||||
|
<link data-trunk rel="rust" data-cargo-features="yew/csr" />
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="app"></div>
|
||||||
|
<script src="animations.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
46
website/src/app.rs
Normal file
46
website/src/app.rs
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
use yew::prelude::*;
|
||||||
|
use yew_router::prelude::*;
|
||||||
|
|
||||||
|
use crate::components::header::Header;
|
||||||
|
use crate::components::footer::Footer;
|
||||||
|
use crate::pages::{Home, Platform, Marketplace, DeFi, NotFound};
|
||||||
|
|
||||||
|
#[derive(Clone, Routable, PartialEq)]
|
||||||
|
pub enum Route {
|
||||||
|
#[at("/")]
|
||||||
|
Home,
|
||||||
|
#[at("/platform")]
|
||||||
|
Platform,
|
||||||
|
#[at("/marketplace")]
|
||||||
|
Marketplace,
|
||||||
|
#[at("/defi")]
|
||||||
|
DeFi,
|
||||||
|
#[not_found]
|
||||||
|
#[at("/404")]
|
||||||
|
NotFound,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn switch(routes: Route) -> Html {
|
||||||
|
match routes {
|
||||||
|
Route::Home => html! { <Home /> },
|
||||||
|
Route::Platform => html! { <Platform /> },
|
||||||
|
Route::Marketplace => html! { <Marketplace /> },
|
||||||
|
Route::DeFi => html! { <DeFi /> },
|
||||||
|
Route::NotFound => html! { <NotFound /> },
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[function_component(App)]
|
||||||
|
pub fn app() -> Html {
|
||||||
|
html! {
|
||||||
|
<BrowserRouter>
|
||||||
|
<div id="app">
|
||||||
|
<Header />
|
||||||
|
<main>
|
||||||
|
<Switch<Route> render={switch} />
|
||||||
|
</main>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
</BrowserRouter>
|
||||||
|
}
|
||||||
|
}
|
102
website/src/components/footer.rs
Normal file
102
website/src/components/footer.rs
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
use yew::prelude::*;
|
||||||
|
use yew_router::prelude::*;
|
||||||
|
use crate::app::Route;
|
||||||
|
|
||||||
|
#[function_component(Footer)]
|
||||||
|
pub fn footer() -> Html {
|
||||||
|
html! {
|
||||||
|
<footer class="footer">
|
||||||
|
<div class="container">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-lg-4 mb-4">
|
||||||
|
<h5 class="mb-3">{"Freezone"}</h5>
|
||||||
|
<p class="text-muted">
|
||||||
|
{"The ultimate digital freedom platform where innovation meets opportunity."}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-lg-2 col-md-6 mb-4">
|
||||||
|
<h6 class="mb-3">{"Platform"}</h6>
|
||||||
|
<ul class="list-unstyled">
|
||||||
|
<li class="mb-2">
|
||||||
|
<Link<Route> to={Route::Platform} classes="text-muted text-decoration-none">
|
||||||
|
{"Overview"}
|
||||||
|
</Link<Route>>
|
||||||
|
</li>
|
||||||
|
<li class="mb-2">
|
||||||
|
<a href="#" class="text-muted text-decoration-none">{"Features"}</a>
|
||||||
|
</li>
|
||||||
|
<li class="mb-2">
|
||||||
|
<a href="#" class="text-muted text-decoration-none">{"Pricing"}</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-lg-2 col-md-6 mb-4">
|
||||||
|
<h6 class="mb-3">{"Marketplace"}</h6>
|
||||||
|
<ul class="list-unstyled">
|
||||||
|
<li class="mb-2">
|
||||||
|
<Link<Route> to={Route::Marketplace} classes="text-muted text-decoration-none">
|
||||||
|
{"Browse"}
|
||||||
|
</Link<Route>>
|
||||||
|
</li>
|
||||||
|
<li class="mb-2">
|
||||||
|
<a href="#" class="text-muted text-decoration-none">{"Sell"}</a>
|
||||||
|
</li>
|
||||||
|
<li class="mb-2">
|
||||||
|
<a href="#" class="text-muted text-decoration-none">{"NFTs"}</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-lg-2 col-md-6 mb-4">
|
||||||
|
<h6 class="mb-3">{"DeFi"}</h6>
|
||||||
|
<ul class="list-unstyled">
|
||||||
|
<li class="mb-2">
|
||||||
|
<Link<Route> to={Route::DeFi} classes="text-muted text-decoration-none">
|
||||||
|
{"Trading"}
|
||||||
|
</Link<Route>>
|
||||||
|
</li>
|
||||||
|
<li class="mb-2">
|
||||||
|
<a href="#" class="text-muted text-decoration-none">{"Staking"}</a>
|
||||||
|
</li>
|
||||||
|
<li class="mb-2">
|
||||||
|
<a href="#" class="text-muted text-decoration-none">{"Pools"}</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-lg-2 col-md-6 mb-4">
|
||||||
|
<h6 class="mb-3">{"Support"}</h6>
|
||||||
|
<ul class="list-unstyled">
|
||||||
|
<li class="mb-2">
|
||||||
|
<a href="#" class="text-muted text-decoration-none">{"Help Center"}</a>
|
||||||
|
</li>
|
||||||
|
<li class="mb-2">
|
||||||
|
<a href="#" class="text-muted text-decoration-none">{"Contact"}</a>
|
||||||
|
</li>
|
||||||
|
<li class="mb-2">
|
||||||
|
<a href="#" class="text-muted text-decoration-none">{"Community"}</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<hr class="my-4" style="border-color: var(--border-color);" />
|
||||||
|
|
||||||
|
<div class="row align-items-center">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<p class="text-muted mb-0">
|
||||||
|
{"© 2024 Freezone. All rights reserved."}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6 text-md-end">
|
||||||
|
<a href="#" class="text-muted text-decoration-none me-3">{"Privacy"}</a>
|
||||||
|
<a href="#" class="text-muted text-decoration-none me-3">{"Terms"}</a>
|
||||||
|
<a href="#" class="text-muted text-decoration-none">{"Security"}</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
}
|
||||||
|
}
|
45
website/src/components/header.rs
Normal file
45
website/src/components/header.rs
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
use yew::prelude::*;
|
||||||
|
use yew_router::prelude::*;
|
||||||
|
use crate::app::Route;
|
||||||
|
|
||||||
|
#[function_component(Header)]
|
||||||
|
pub fn header() -> Html {
|
||||||
|
html! {
|
||||||
|
<nav class="navbar navbar-expand-lg fixed-top">
|
||||||
|
<div class="container">
|
||||||
|
<Link<Route> to={Route::Home} classes="navbar-brand">
|
||||||
|
{"Zanzibar Digital Freezone"}
|
||||||
|
</Link<Route>>
|
||||||
|
|
||||||
|
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav">
|
||||||
|
<span class="navbar-toggler-icon"></span>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<div class="collapse navbar-collapse" id="navbarNav">
|
||||||
|
<ul class="navbar-nav ms-auto">
|
||||||
|
<li class="nav-item">
|
||||||
|
<Link<Route> to={Route::Platform} classes="nav-link">
|
||||||
|
{"Platform"}
|
||||||
|
</Link<Route>>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<Link<Route> to={Route::Marketplace} classes="nav-link">
|
||||||
|
{"Marketplace"}
|
||||||
|
</Link<Route>>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<Link<Route> to={Route::DeFi} classes="nav-link">
|
||||||
|
{"DeFi"}
|
||||||
|
</Link<Route>>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item ms-3">
|
||||||
|
<a href="#" class="btn btn-primary">
|
||||||
|
{"Register"}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
}
|
||||||
|
}
|
131
website/src/components/hero.rs
Normal file
131
website/src/components/hero.rs
Normal file
@ -0,0 +1,131 @@
|
|||||||
|
use yew::prelude::*;
|
||||||
|
use crate::utils::{load_markdown_content, markdown::extract_title_and_description};
|
||||||
|
use crate::components::WorldMap;
|
||||||
|
|
||||||
|
#[derive(Properties, PartialEq)]
|
||||||
|
pub struct HeroProps {
|
||||||
|
pub content_path: String,
|
||||||
|
pub cta_text: String,
|
||||||
|
pub cta_link: String,
|
||||||
|
#[prop_or_default]
|
||||||
|
pub secondary_cta_text: Option<String>,
|
||||||
|
#[prop_or_default]
|
||||||
|
pub secondary_cta_link: Option<String>,
|
||||||
|
#[prop_or_default]
|
||||||
|
pub background_variant: Option<String>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[function_component(Hero)]
|
||||||
|
pub fn hero(props: &HeroProps) -> Html {
|
||||||
|
let content = load_markdown_content(&props.content_path);
|
||||||
|
let (title, description) = extract_title_and_description(&content);
|
||||||
|
|
||||||
|
let background_class = match props.background_variant.as_deref() {
|
||||||
|
Some("marketplace") => "hero-marketplace",
|
||||||
|
Some("platform") => "hero-platform",
|
||||||
|
Some("defi") => "hero-defi",
|
||||||
|
_ => "hero-default"
|
||||||
|
};
|
||||||
|
|
||||||
|
html! {
|
||||||
|
<section class={classes!("hero-section", background_class)}>
|
||||||
|
<div class="container">
|
||||||
|
<div class="row align-items-center min-vh-100">
|
||||||
|
<div class="col-lg-6 hero-content">
|
||||||
|
<div class="fade-in animate">
|
||||||
|
<h1 class="hero-title">{title}</h1>
|
||||||
|
<p class="hero-subtitle">{description}</p>
|
||||||
|
<div class="hero-actions mt-4">
|
||||||
|
<a href={props.cta_link.clone()} class="btn btn-primary btn-lg me-3">
|
||||||
|
{&props.cta_text}
|
||||||
|
</a>
|
||||||
|
{if let Some(secondary_text) = &props.secondary_cta_text {
|
||||||
|
html! {
|
||||||
|
<a href={props.secondary_cta_link.clone().unwrap_or_default()}
|
||||||
|
class="btn btn-outline-primary btn-lg">
|
||||||
|
{secondary_text}
|
||||||
|
</a>
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
html! {}
|
||||||
|
}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-lg-6 slide-in-right animate">
|
||||||
|
<div class="hero-visual">
|
||||||
|
{match props.background_variant.as_deref() {
|
||||||
|
Some("marketplace") => html! {
|
||||||
|
<div class="hero-marketplace-visual">
|
||||||
|
<div class="floating-cards">
|
||||||
|
<div class="floating-card card-1">
|
||||||
|
<div class="card-icon">{"🎨"}</div>
|
||||||
|
<div class="card-title">{"Digital Art"}</div>
|
||||||
|
<div class="card-price">{"2.5 ETH"}</div>
|
||||||
|
</div>
|
||||||
|
<div class="floating-card card-2">
|
||||||
|
<div class="card-icon">{"🏠"}</div>
|
||||||
|
<div class="card-title">{"Real Estate"}</div>
|
||||||
|
<div class="card-price">{"$50K"}</div>
|
||||||
|
</div>
|
||||||
|
<div class="floating-card card-3">
|
||||||
|
<div class="card-icon">{"💼"}</div>
|
||||||
|
<div class="card-title">{"Services"}</div>
|
||||||
|
<div class="card-price">{"100 USDC"}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
},
|
||||||
|
Some("platform") => html! {
|
||||||
|
<div class="hero-platform-visual">
|
||||||
|
<div class="dashboard-preview">
|
||||||
|
<div class="dashboard-header"></div>
|
||||||
|
<div class="dashboard-content">
|
||||||
|
<div class="dashboard-widget"></div>
|
||||||
|
<div class="dashboard-widget"></div>
|
||||||
|
<div class="dashboard-widget large"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
},
|
||||||
|
Some("defi") => html! {
|
||||||
|
<div class="hero-defi-visual">
|
||||||
|
<div class="liquidity-pool-animation">
|
||||||
|
<div class="pool-container">
|
||||||
|
<div class="pool-center">
|
||||||
|
<div class="pool-label">{"Pool"}</div>
|
||||||
|
</div>
|
||||||
|
<div class="asset-flow">
|
||||||
|
<div class="asset-token eth flowing-in">{"ETH"}</div>
|
||||||
|
<div class="asset-token usdc flowing-in">{"USDC"}</div>
|
||||||
|
<div class="asset-token btc flowing-out">{"BTC"}</div>
|
||||||
|
<div class="asset-token dai flowing-out">{"DAI"}</div>
|
||||||
|
</div>
|
||||||
|
<div class="pool-stats">
|
||||||
|
<div class="pool-stat">
|
||||||
|
<span class="stat-label">{"TVL:"}</span>
|
||||||
|
<span class="stat-value">{"$2.4B"}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
},
|
||||||
|
_ => html! {
|
||||||
|
<div class="hero-default-visual">
|
||||||
|
<WorldMap />
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
// Scroll indicator
|
||||||
|
<div class="scroll-indicator">
|
||||||
|
<div class="scroll-arrow"></div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
}
|
||||||
|
}
|
316
website/src/components/marketplace_flow.rs
Normal file
316
website/src/components/marketplace_flow.rs
Normal file
@ -0,0 +1,316 @@
|
|||||||
|
use yew::prelude::*;
|
||||||
|
|
||||||
|
#[derive(Clone, PartialEq)]
|
||||||
|
pub struct MarketplaceItem {
|
||||||
|
pub title: String,
|
||||||
|
pub price: String,
|
||||||
|
pub category: String,
|
||||||
|
pub image: String,
|
||||||
|
pub seller: String,
|
||||||
|
pub rarity: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[function_component(MarketplaceFlow)]
|
||||||
|
pub fn marketplace_flow() -> Html {
|
||||||
|
let items = vec![
|
||||||
|
MarketplaceItem {
|
||||||
|
title: "EcoMobility E-Bike Shares".to_string(),
|
||||||
|
price: "$150".to_string(),
|
||||||
|
category: "Company Shares".to_string(),
|
||||||
|
image: "🚲".to_string(),
|
||||||
|
seller: "GreenTransport Co-op".to_string(),
|
||||||
|
rarity: "Impact Verified".to_string(),
|
||||||
|
},
|
||||||
|
MarketplaceItem {
|
||||||
|
title: "Coral Reef Eco-Resort".to_string(),
|
||||||
|
price: "$2,500".to_string(),
|
||||||
|
category: "Real Estate".to_string(),
|
||||||
|
image: "🏝️".to_string(),
|
||||||
|
seller: "Ocean Conservation Trust".to_string(),
|
||||||
|
rarity: "Carbon Negative".to_string(),
|
||||||
|
},
|
||||||
|
MarketplaceItem {
|
||||||
|
title: "Telemedicine Platform".to_string(),
|
||||||
|
price: "500 USDC".to_string(),
|
||||||
|
category: "HealthTech Services".to_string(),
|
||||||
|
image: "🏥".to_string(),
|
||||||
|
seller: "CommunityHealth DAO".to_string(),
|
||||||
|
rarity: "Community Owned".to_string(),
|
||||||
|
},
|
||||||
|
MarketplaceItem {
|
||||||
|
title: "Mangrove Restoration Credits".to_string(),
|
||||||
|
price: "$12".to_string(),
|
||||||
|
category: "Carbon Credits".to_string(),
|
||||||
|
image: "🌿".to_string(),
|
||||||
|
seller: "Zanzibar Conservation".to_string(),
|
||||||
|
rarity: "Verified Impact".to_string(),
|
||||||
|
},
|
||||||
|
MarketplaceItem {
|
||||||
|
title: "Solar Microgrid Shares".to_string(),
|
||||||
|
price: "$300".to_string(),
|
||||||
|
category: "Renewable Energy".to_string(),
|
||||||
|
image: "☀️".to_string(),
|
||||||
|
seller: "Community Power Co-op".to_string(),
|
||||||
|
rarity: "Grid Connected".to_string(),
|
||||||
|
},
|
||||||
|
MarketplaceItem {
|
||||||
|
title: "Ocean Education Platform".to_string(),
|
||||||
|
price: "250 USDC".to_string(),
|
||||||
|
category: "EdTech Services".to_string(),
|
||||||
|
image: "🐠".to_string(),
|
||||||
|
seller: "Marine Learning DAO".to_string(),
|
||||||
|
rarity: "UNESCO Certified".to_string(),
|
||||||
|
},
|
||||||
|
MarketplaceItem {
|
||||||
|
title: "Spice Farmers Cooperative".to_string(),
|
||||||
|
price: "$75".to_string(),
|
||||||
|
category: "Agricultural Co-op".to_string(),
|
||||||
|
image: "🌶️".to_string(),
|
||||||
|
seller: "Fair Trade Zanzibar".to_string(),
|
||||||
|
rarity: "Fair Trade".to_string(),
|
||||||
|
},
|
||||||
|
MarketplaceItem {
|
||||||
|
title: "Community Banking Token".to_string(),
|
||||||
|
price: "$50".to_string(),
|
||||||
|
category: "FinTech Startup".to_string(),
|
||||||
|
image: "🏦".to_string(),
|
||||||
|
seller: "Financial Inclusion Ltd".to_string(),
|
||||||
|
rarity: "Series A".to_string(),
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
html! {
|
||||||
|
<div class="marketplace-flow-container">
|
||||||
|
<div class="marketplace-items">
|
||||||
|
{items.iter().map(|item| {
|
||||||
|
let rarity_class = match item.rarity.as_str() {
|
||||||
|
"Legendary" => "rarity-legendary",
|
||||||
|
"Ultra Rare" => "rarity-ultra-rare",
|
||||||
|
"Epic" => "rarity-epic",
|
||||||
|
"Premium" => "rarity-premium",
|
||||||
|
"Exclusive" => "rarity-exclusive",
|
||||||
|
_ => "rarity-common"
|
||||||
|
};
|
||||||
|
|
||||||
|
html! {
|
||||||
|
<div class={classes!("marketplace-item", rarity_class)}>
|
||||||
|
<div class="item-header">
|
||||||
|
<div class="item-image">{&item.image}</div>
|
||||||
|
<div class="item-rarity">
|
||||||
|
<span class="rarity-badge">{&item.rarity}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="item-content">
|
||||||
|
<h6 class="item-title">{&item.title}</h6>
|
||||||
|
<p class="item-category">{&item.category}</p>
|
||||||
|
<div class="item-seller">
|
||||||
|
<span class="seller-label">{"by "}</span>
|
||||||
|
<span class="seller-name">{&item.seller}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="item-footer">
|
||||||
|
<div class="item-price">{&item.price}</div>
|
||||||
|
<button class="btn-quick-buy">{"Quick Buy"}</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
}).collect::<Html>()}
|
||||||
|
</div>
|
||||||
|
<div class="flow-overlay-left"></div>
|
||||||
|
<div class="flow-overlay-right"></div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[function_component(InteractiveLiquidityPool)]
|
||||||
|
pub fn interactive_liquidity_pool() -> Html {
|
||||||
|
html! {
|
||||||
|
<div class="interactive-demo">
|
||||||
|
<h5 class="text-center mb-4">{"Live Liquidity Pools"}</h5>
|
||||||
|
<div class="liquidity-pools">
|
||||||
|
<div class="liquidity-pool" data-pool="eth-usdc">
|
||||||
|
<div class="pool-header">
|
||||||
|
<div class="pool-tokens">
|
||||||
|
<div class="token-pair">
|
||||||
|
<div class="token-icon eth"></div>
|
||||||
|
<div class="token-icon usdc"></div>
|
||||||
|
</div>
|
||||||
|
<span class="pool-name">{"ETH/USDC"}</span>
|
||||||
|
</div>
|
||||||
|
<div class="pool-apr">{"12.4% APR"}</div>
|
||||||
|
</div>
|
||||||
|
<div class="pool-stats">
|
||||||
|
<div class="stat">
|
||||||
|
<span class="stat-label">{"TVL"}</span>
|
||||||
|
<span class="stat-value">{"$2.4M"}</span>
|
||||||
|
</div>
|
||||||
|
<div class="stat">
|
||||||
|
<span class="stat-label">{"Volume 24h"}</span>
|
||||||
|
<span class="stat-value">{"$890K"}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="liquidity-pool" data-pool="btc-eth">
|
||||||
|
<div class="pool-header">
|
||||||
|
<div class="pool-tokens">
|
||||||
|
<div class="token-pair">
|
||||||
|
<div class="token-icon btc"></div>
|
||||||
|
<div class="token-icon eth"></div>
|
||||||
|
</div>
|
||||||
|
<span class="pool-name">{"BTC/ETH"}</span>
|
||||||
|
</div>
|
||||||
|
<div class="pool-apr">{"8.7% APR"}</div>
|
||||||
|
</div>
|
||||||
|
<div class="pool-stats">
|
||||||
|
<div class="stat">
|
||||||
|
<span class="stat-label">{"TVL"}</span>
|
||||||
|
<span class="stat-value">{"$5.1M"}</span>
|
||||||
|
</div>
|
||||||
|
<div class="stat">
|
||||||
|
<span class="stat-label">{"Volume 24h"}</span>
|
||||||
|
<span class="stat-value">{"$1.2M"}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="liquidity-pool" data-pool="usdc-dai">
|
||||||
|
<div class="pool-header">
|
||||||
|
<div class="pool-tokens">
|
||||||
|
<div class="token-pair">
|
||||||
|
<div class="token-icon usdc"></div>
|
||||||
|
<div class="token-icon dai"></div>
|
||||||
|
</div>
|
||||||
|
<span class="pool-name">{"USDC/DAI"}</span>
|
||||||
|
</div>
|
||||||
|
<div class="pool-apr">{"4.2% APR"}</div>
|
||||||
|
</div>
|
||||||
|
<div class="pool-stats">
|
||||||
|
<div class="stat">
|
||||||
|
<span class="stat-label">{"TVL"}</span>
|
||||||
|
<span class="stat-value">{"$8.9M"}</span>
|
||||||
|
</div>
|
||||||
|
<div class="stat">
|
||||||
|
<span class="stat-label">{"Volume 24h"}</span>
|
||||||
|
<span class="stat-value">{"$2.1M"}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[function_component(LiveOrderbook)]
|
||||||
|
pub fn live_orderbook() -> Html {
|
||||||
|
html! {
|
||||||
|
<div class="interactive-demo">
|
||||||
|
<h5 class="text-center mb-4">{"Live Order Book - BTC/USDC"}</h5>
|
||||||
|
<div class="orderbook">
|
||||||
|
<div class="orderbook-header">
|
||||||
|
<span>{"Price (USDC)"}</span>
|
||||||
|
<span>{"Amount (BTC)"}</span>
|
||||||
|
<span>{"Total"}</span>
|
||||||
|
</div>
|
||||||
|
<div class="orderbook-content" id="orderbook-content">
|
||||||
|
// Orders will be populated by JavaScript
|
||||||
|
</div>
|
||||||
|
<div class="spread-indicator">
|
||||||
|
<span class="spread-label">{"Spread: "}</span>
|
||||||
|
<span class="spread-value">{"$12.50 (0.03%)"}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[function_component(PlatformWireframe)]
|
||||||
|
pub fn platform_wireframe() -> Html {
|
||||||
|
html! {
|
||||||
|
<div class="interactive-demo">
|
||||||
|
<h5 class="text-center mb-4">{"Platform Dashboard Preview"}</h5>
|
||||||
|
<div class="platform-wireframe wireframe">
|
||||||
|
<div class="wireframe-header">
|
||||||
|
<div class="header-logo"></div>
|
||||||
|
<div class="header-nav">
|
||||||
|
<div class="nav-item active"></div>
|
||||||
|
<div class="nav-item"></div>
|
||||||
|
<div class="nav-item"></div>
|
||||||
|
</div>
|
||||||
|
<div class="header-user"></div>
|
||||||
|
</div>
|
||||||
|
<div class="wireframe-sidebar">
|
||||||
|
<div class="sidebar-item"></div>
|
||||||
|
<div class="sidebar-item active"></div>
|
||||||
|
<div class="sidebar-item"></div>
|
||||||
|
<div class="sidebar-item"></div>
|
||||||
|
</div>
|
||||||
|
<div class="wireframe-main">
|
||||||
|
<div class="main-header">
|
||||||
|
<div class="page-title"></div>
|
||||||
|
<div class="action-buttons">
|
||||||
|
<div class="btn-wireframe primary"></div>
|
||||||
|
<div class="btn-wireframe secondary"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="main-content">
|
||||||
|
<div class="content-grid">
|
||||||
|
<div class="grid-item large"></div>
|
||||||
|
<div class="grid-item medium"></div>
|
||||||
|
<div class="grid-item medium"></div>
|
||||||
|
<div class="grid-item small"></div>
|
||||||
|
<div class="grid-item small"></div>
|
||||||
|
<div class="grid-item small"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[function_component(TradingInterface)]
|
||||||
|
pub fn trading_interface() -> Html {
|
||||||
|
html! {
|
||||||
|
<div class="interactive-demo">
|
||||||
|
<h5 class="text-center mb-4">{"Advanced Trading Interface"}</h5>
|
||||||
|
<div class="trading-interface">
|
||||||
|
<div class="trading-header">
|
||||||
|
<div class="trading-pair">
|
||||||
|
<span class="pair-name">{"BTC/USDC"}</span>
|
||||||
|
<span class="pair-price">{"$42,150.00"}</span>
|
||||||
|
<span class="pair-change positive">{"+2.4%"}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="trading-content">
|
||||||
|
<div class="chart-container">
|
||||||
|
<div class="defi-chart chart" id="trading-chart"></div>
|
||||||
|
</div>
|
||||||
|
<div class="trading-controls">
|
||||||
|
<div class="order-form">
|
||||||
|
<div class="order-tabs">
|
||||||
|
<button class="tab-btn active">{"Buy"}</button>
|
||||||
|
<button class="tab-btn">{"Sell"}</button>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label>{"Amount (BTC)"}</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<input type="text" placeholder="0.00" />
|
||||||
|
<span class="input-suffix">{"BTC"}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label>{"Price (USDC)"}</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<input type="text" placeholder="42,150.00" />
|
||||||
|
<span class="input-suffix">{"USDC"}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<button class="btn-trade buy">{"Place Buy Order"}</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
}
|
19
website/src/components/mod.rs
Normal file
19
website/src/components/mod.rs
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
pub mod header;
|
||||||
|
pub mod footer;
|
||||||
|
pub mod hero;
|
||||||
|
pub mod section;
|
||||||
|
pub mod marketplace_flow;
|
||||||
|
pub mod world_map;
|
||||||
|
|
||||||
|
pub use header::Header;
|
||||||
|
pub use footer::Footer;
|
||||||
|
pub use hero::Hero;
|
||||||
|
pub use section::Section;
|
||||||
|
pub use marketplace_flow::{
|
||||||
|
MarketplaceFlow,
|
||||||
|
InteractiveLiquidityPool,
|
||||||
|
LiveOrderbook,
|
||||||
|
PlatformWireframe,
|
||||||
|
TradingInterface
|
||||||
|
};
|
||||||
|
pub use world_map::WorldMap;
|
127
website/src/components/section.rs
Normal file
127
website/src/components/section.rs
Normal file
@ -0,0 +1,127 @@
|
|||||||
|
use yew::prelude::*;
|
||||||
|
use crate::utils::{load_markdown_content, markdown_to_html};
|
||||||
|
|
||||||
|
#[derive(Properties, PartialEq)]
|
||||||
|
pub struct SectionProps {
|
||||||
|
pub content_path: AttrValue,
|
||||||
|
#[prop_or_default]
|
||||||
|
pub animation_class: Option<AttrValue>,
|
||||||
|
#[prop_or_default]
|
||||||
|
pub background_class: Option<AttrValue>,
|
||||||
|
#[prop_or_default]
|
||||||
|
pub id: Option<AttrValue>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[function_component(Section)]
|
||||||
|
pub fn section(props: &SectionProps) -> Html {
|
||||||
|
let content = match props.content_path.as_str() {
|
||||||
|
"home/about" => html! {
|
||||||
|
<>
|
||||||
|
<h2 class="section-title">{"About the Freezone"}</h2>
|
||||||
|
<p class="section-subtitle">
|
||||||
|
{"The Freezone is a revolutionary digital ecosystem that empowers individuals and businesses to operate with complete autonomy and freedom. Built on cutting-edge blockchain technology, we provide three core platforms that work seamlessly together."}
|
||||||
|
</p>
|
||||||
|
<h3>{"Our Vision"}</h3>
|
||||||
|
<p>
|
||||||
|
{"To create a world where digital sovereignty is not just a concept, but a reality for everyone. Where businesses can thrive without traditional barriers, and individuals can truly own their digital assets and identity."}
|
||||||
|
</p>
|
||||||
|
<h3>{"Core Values"}</h3>
|
||||||
|
<ul>
|
||||||
|
<li><strong>{"Freedom"}</strong>{": Complete autonomy over your digital presence"}</li>
|
||||||
|
<li><strong>{"Innovation"}</strong>{": Cutting-edge technology that pushes boundaries"}</li>
|
||||||
|
<li><strong>{"Community"}</strong>{": A thriving ecosystem of like-minded pioneers"}</li>
|
||||||
|
<li><strong>{"Security"}</strong>{": Bank-grade protection for all your assets"}</li>
|
||||||
|
<li><strong>{"Transparency"}</strong>{": Open, auditable, and trustworthy operations"}</li>
|
||||||
|
</ul>
|
||||||
|
</>
|
||||||
|
},
|
||||||
|
"platform/features" => html! {
|
||||||
|
<>
|
||||||
|
<h2 class="section-title">{"Platform Features"}</h2>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6 mb-4">
|
||||||
|
<h4>{"Company Management"}</h4>
|
||||||
|
<p>{"Establish and manage your digital companies with complete autonomy. Handle registrations, compliance, and operations through our intuitive dashboard."}</p>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6 mb-4">
|
||||||
|
<h4>{"Digital Governance"}</h4>
|
||||||
|
<p>{"Implement transparent governance structures with built-in voting mechanisms, proposal systems, and stakeholder management tools."}</p>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6 mb-4">
|
||||||
|
<h4>{"Financial Administration"}</h4>
|
||||||
|
<p>{"Comprehensive financial management including accounting, budgeting, treasury management, and automated reporting systems."}</p>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6 mb-4">
|
||||||
|
<h4>{"Smart Contracts"}</h4>
|
||||||
|
<p>{"Deploy and manage smart contracts for automated business processes, ensuring trust and transparency in all operations."}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
},
|
||||||
|
"marketplace/features" => html! {
|
||||||
|
<>
|
||||||
|
<h2 class="section-title">{"Marketplace Features"}</h2>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6 mb-4">
|
||||||
|
<h4>{"Digital Asset Trading"}</h4>
|
||||||
|
<p>{"Trade a wide variety of digital assets including cryptocurrencies, tokens, and digital commodities with advanced trading tools and real-time market data."}</p>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6 mb-4">
|
||||||
|
<h4>{"NFT Marketplace"}</h4>
|
||||||
|
<p>{"Discover, buy, and sell unique NFTs from artists, creators, and brands. Support for multiple blockchain networks and advanced filtering options."}</p>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6 mb-4">
|
||||||
|
<h4>{"Service Exchange"}</h4>
|
||||||
|
<p>{"Connect with service providers and clients in the freezone. From consulting to development, find or offer professional services with crypto payments."}</p>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6 mb-4">
|
||||||
|
<h4>{"Real Estate Tokenization"}</h4>
|
||||||
|
<p>{"Invest in tokenized real estate properties, enabling fractional ownership and global accessibility to premium real estate markets."}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
},
|
||||||
|
"defi/features" => html! {
|
||||||
|
<>
|
||||||
|
<h2 class="section-title">{"DeFi Features"}</h2>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6 mb-4">
|
||||||
|
<h4>{"Liquidity Pools"}</h4>
|
||||||
|
<p>{"Provide liquidity to earn rewards and help facilitate seamless trading across multiple token pairs with competitive APY rates."}</p>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6 mb-4">
|
||||||
|
<h4>{"Leveraged Trading"}</h4>
|
||||||
|
<p>{"Access up to 100x leverage on major cryptocurrency pairs with advanced risk management tools and real-time margin monitoring."}</p>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6 mb-4">
|
||||||
|
<h4>{"Yield Farming"}</h4>
|
||||||
|
<p>{"Maximize your returns through strategic yield farming opportunities across multiple protocols and chains."}</p>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6 mb-4">
|
||||||
|
<h4>{"Staking Rewards"}</h4>
|
||||||
|
<p>{"Stake your tokens to earn passive income while contributing to network security and governance."}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
},
|
||||||
|
_ => html! { <h2>{"Content not found"}</h2> }
|
||||||
|
};
|
||||||
|
|
||||||
|
let animation_class = props.animation_class.as_deref().unwrap_or("fade-in").to_string();
|
||||||
|
let background_class = props.background_class.as_deref().unwrap_or("section").to_string();
|
||||||
|
let section_id = props.id.as_ref().map(|id| id.to_string());
|
||||||
|
|
||||||
|
html! {
|
||||||
|
<section class={background_class} id={section_id}>
|
||||||
|
<div class="container">
|
||||||
|
<div class="row justify-content-center">
|
||||||
|
<div class="col-lg-10">
|
||||||
|
<div class={animation_class}>
|
||||||
|
{content}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
}
|
||||||
|
}
|
433
website/src/components/world_map.rs
Normal file
433
website/src/components/world_map.rs
Normal file
@ -0,0 +1,433 @@
|
|||||||
|
use yew::prelude::*;
|
||||||
|
use web_sys::{window, HtmlElement, HtmlScriptElement};
|
||||||
|
use wasm_bindgen::prelude::*;
|
||||||
|
use wasm_bindgen::JsCast;
|
||||||
|
use gloo_timers::callback::{Interval, Timeout};
|
||||||
|
|
||||||
|
#[derive(Clone, PartialEq)]
|
||||||
|
struct ConnectionEntity {
|
||||||
|
id: u32,
|
||||||
|
name: String,
|
||||||
|
entity_type: String, // "Business" or "Resident"
|
||||||
|
location: String,
|
||||||
|
lat: f64,
|
||||||
|
lng: f64,
|
||||||
|
registration_date: String,
|
||||||
|
industry: Option<String>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, PartialEq)]
|
||||||
|
struct ActiveConnection {
|
||||||
|
entity: ConnectionEntity,
|
||||||
|
start_time: f64,
|
||||||
|
progress: f64,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[function_component(WorldMap)]
|
||||||
|
pub fn world_map() -> Html {
|
||||||
|
let map_ref = use_node_ref();
|
||||||
|
let active_connections = use_state(|| Vec::<ActiveConnection>::new());
|
||||||
|
|
||||||
|
// Sample entities from around the world
|
||||||
|
let entities = vec![
|
||||||
|
ConnectionEntity {
|
||||||
|
id: 1,
|
||||||
|
name: "TechCorp Solutions Ltd".to_string(),
|
||||||
|
entity_type: "Business".to_string(),
|
||||||
|
location: "New York, USA".to_string(),
|
||||||
|
lat: 40.7128,
|
||||||
|
lng: -74.0060,
|
||||||
|
registration_date: "2024-01-15".to_string(),
|
||||||
|
industry: Some("Technology".to_string()),
|
||||||
|
},
|
||||||
|
ConnectionEntity {
|
||||||
|
id: 2,
|
||||||
|
name: "Digital Nomad LLC".to_string(),
|
||||||
|
entity_type: "Business".to_string(),
|
||||||
|
location: "London, UK".to_string(),
|
||||||
|
lat: 51.5074,
|
||||||
|
lng: -0.1278,
|
||||||
|
registration_date: "2024-02-03".to_string(),
|
||||||
|
industry: Some("Consulting".to_string()),
|
||||||
|
},
|
||||||
|
ConnectionEntity {
|
||||||
|
id: 3,
|
||||||
|
name: "Sarah Chen".to_string(),
|
||||||
|
entity_type: "Resident".to_string(),
|
||||||
|
location: "Singapore".to_string(),
|
||||||
|
lat: 1.3521,
|
||||||
|
lng: 103.8198,
|
||||||
|
registration_date: "2024-01-28".to_string(),
|
||||||
|
industry: None,
|
||||||
|
},
|
||||||
|
ConnectionEntity {
|
||||||
|
id: 4,
|
||||||
|
name: "Crypto Ventures Ltd".to_string(),
|
||||||
|
entity_type: "Business".to_string(),
|
||||||
|
location: "Dubai, UAE".to_string(),
|
||||||
|
lat: 25.2048,
|
||||||
|
lng: 55.2708,
|
||||||
|
registration_date: "2024-02-10".to_string(),
|
||||||
|
industry: Some("Cryptocurrency".to_string()),
|
||||||
|
},
|
||||||
|
ConnectionEntity {
|
||||||
|
id: 5,
|
||||||
|
name: "Marcus Johnson".to_string(),
|
||||||
|
entity_type: "Resident".to_string(),
|
||||||
|
location: "Sydney, Australia".to_string(),
|
||||||
|
lat: -33.8688,
|
||||||
|
lng: 151.2093,
|
||||||
|
registration_date: "2024-01-20".to_string(),
|
||||||
|
industry: None,
|
||||||
|
},
|
||||||
|
ConnectionEntity {
|
||||||
|
id: 6,
|
||||||
|
name: "FinTech Innovations SA".to_string(),
|
||||||
|
entity_type: "Business".to_string(),
|
||||||
|
location: "São Paulo, Brazil".to_string(),
|
||||||
|
lat: -23.5505,
|
||||||
|
lng: -46.6333,
|
||||||
|
registration_date: "2024-02-05".to_string(),
|
||||||
|
industry: Some("Financial Technology".to_string()),
|
||||||
|
},
|
||||||
|
ConnectionEntity {
|
||||||
|
id: 7,
|
||||||
|
name: "Elena Rodriguez".to_string(),
|
||||||
|
entity_type: "Resident".to_string(),
|
||||||
|
location: "Madrid, Spain".to_string(),
|
||||||
|
lat: 40.4168,
|
||||||
|
lng: -3.7038,
|
||||||
|
registration_date: "2024-01-12".to_string(),
|
||||||
|
industry: None,
|
||||||
|
},
|
||||||
|
ConnectionEntity {
|
||||||
|
id: 8,
|
||||||
|
name: "Green Energy Solutions".to_string(),
|
||||||
|
entity_type: "Business".to_string(),
|
||||||
|
location: "Lagos, Nigeria".to_string(),
|
||||||
|
lat: 6.5244,
|
||||||
|
lng: 3.3792,
|
||||||
|
registration_date: "2024-02-08".to_string(),
|
||||||
|
industry: Some("Renewable Energy".to_string()),
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
// Initialize OpenStreetMap
|
||||||
|
{
|
||||||
|
let map_ref = map_ref.clone();
|
||||||
|
use_effect_with(
|
||||||
|
(),
|
||||||
|
move |_| {
|
||||||
|
if let Some(element) = map_ref.cast::<HtmlElement>() {
|
||||||
|
let window = window().unwrap();
|
||||||
|
|
||||||
|
// Create script element for Leaflet CSS
|
||||||
|
let document = window.document().unwrap();
|
||||||
|
let head = document.head().unwrap();
|
||||||
|
|
||||||
|
// Add Leaflet CSS
|
||||||
|
let css_link = document.create_element("link").unwrap();
|
||||||
|
css_link.set_attribute("rel", "stylesheet").unwrap();
|
||||||
|
css_link.set_attribute("href", "https://unpkg.com/leaflet@1.9.4/dist/leaflet.css").unwrap();
|
||||||
|
css_link.set_attribute("integrity", "sha256-p4NxAoJBhIIN+hmNHrzRCf9tD/miZyoHS5obTRR9BMY=").unwrap();
|
||||||
|
css_link.set_attribute("crossorigin", "").unwrap();
|
||||||
|
head.append_child(&css_link).unwrap();
|
||||||
|
|
||||||
|
// Add Leaflet JS
|
||||||
|
let script = document.create_element("script").unwrap()
|
||||||
|
.dyn_into::<HtmlScriptElement>().unwrap();
|
||||||
|
script.set_src("https://unpkg.com/leaflet@1.9.4/dist/leaflet.js");
|
||||||
|
script.set_attribute("integrity", "sha256-20nQCchB9co0qIjJZRGuk2/Z9VM+kNiyxNV1lvTlZBo=").unwrap();
|
||||||
|
script.set_attribute("crossorigin", "").unwrap();
|
||||||
|
|
||||||
|
let element_clone = element.clone();
|
||||||
|
let onload = Closure::wrap(Box::new(move || {
|
||||||
|
// Initialize map when Leaflet loads
|
||||||
|
let js_code = format!(r#"
|
||||||
|
if (typeof L !== 'undefined') {{
|
||||||
|
const map = L.map('{}', {{
|
||||||
|
zoomControl: false,
|
||||||
|
scrollWheelZoom: false,
|
||||||
|
doubleClickZoom: false,
|
||||||
|
boxZoom: false,
|
||||||
|
keyboard: false,
|
||||||
|
dragging: false,
|
||||||
|
touchZoom: false,
|
||||||
|
attributionControl: false
|
||||||
|
}}).setView([-6.1659, 39.2026], 2);
|
||||||
|
|
||||||
|
L.tileLayer('https://{{s}}.tile.openstreetmap.org/{{z}}/{{x}}/{{y}}.png', {{
|
||||||
|
attribution: '',
|
||||||
|
maxZoom: 18,
|
||||||
|
opacity: 0.9,
|
||||||
|
className: 'map-tiles'
|
||||||
|
}}).addTo(map);
|
||||||
|
|
||||||
|
// Add subtle Zanzibar marker
|
||||||
|
const zanzIcon = L.divIcon({{
|
||||||
|
className: 'zanzibar-marker',
|
||||||
|
html: '<div style="background: #86efac; width: 12px; height: 12px; border-radius: 50%; box-shadow: 0 0 15px #86efac;"></div>',
|
||||||
|
iconSize: [12, 12],
|
||||||
|
iconAnchor: [6, 6]
|
||||||
|
}});
|
||||||
|
L.marker([-6.1659, 39.2026], {{icon: zanzIcon}}).addTo(map);
|
||||||
|
}}
|
||||||
|
"#, element_clone.id());
|
||||||
|
|
||||||
|
js_sys::eval(&js_code).unwrap();
|
||||||
|
}) as Box<dyn FnMut()>);
|
||||||
|
|
||||||
|
script.set_onload(Some(onload.as_ref().unchecked_ref()));
|
||||||
|
onload.forget();
|
||||||
|
|
||||||
|
head.append_child(&script).unwrap();
|
||||||
|
}
|
||||||
|
|| {}
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Animate connections
|
||||||
|
{
|
||||||
|
let active_connections = active_connections.clone();
|
||||||
|
let entities_clone = entities.clone();
|
||||||
|
|
||||||
|
use_effect_with(
|
||||||
|
(),
|
||||||
|
move |_| {
|
||||||
|
let interval = Interval::new(4000, move || {
|
||||||
|
// Pick a random entity to start connection
|
||||||
|
if let Some(entity) = entities_clone.get((js_sys::Math::random() * entities_clone.len() as f64) as usize) {
|
||||||
|
let mut current_connections = (*active_connections).clone();
|
||||||
|
|
||||||
|
// Add new connection
|
||||||
|
current_connections.push(ActiveConnection {
|
||||||
|
entity: entity.clone(),
|
||||||
|
start_time: js_sys::Date::now(),
|
||||||
|
progress: 0.0,
|
||||||
|
});
|
||||||
|
|
||||||
|
active_connections.set(current_connections);
|
||||||
|
|
||||||
|
// Remove connection after animation completes (8 seconds)
|
||||||
|
let active_connections_cleanup = active_connections.clone();
|
||||||
|
let entity_id = entity.id;
|
||||||
|
|
||||||
|
Timeout::new(8000, move || {
|
||||||
|
let mut current_connections = (*active_connections_cleanup).clone();
|
||||||
|
current_connections.retain(|conn| conn.entity.id != entity_id);
|
||||||
|
active_connections_cleanup.set(current_connections);
|
||||||
|
}).forget();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
move || drop(interval)
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update connection progress
|
||||||
|
{
|
||||||
|
let active_connections = active_connections.clone();
|
||||||
|
|
||||||
|
use_effect_with(
|
||||||
|
(),
|
||||||
|
move |_| {
|
||||||
|
let interval = Interval::new(50, move || {
|
||||||
|
let current_time = js_sys::Date::now();
|
||||||
|
let mut updated_connections = (*active_connections).clone();
|
||||||
|
let mut changed = false;
|
||||||
|
|
||||||
|
for connection in &mut updated_connections {
|
||||||
|
let elapsed = current_time - connection.start_time;
|
||||||
|
let new_progress = (elapsed / 6000.0).min(1.0); // 6 second animation
|
||||||
|
|
||||||
|
if (new_progress - connection.progress).abs() > 0.01 {
|
||||||
|
connection.progress = new_progress;
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if changed {
|
||||||
|
active_connections.set(updated_connections);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
move || drop(interval)
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
html! {
|
||||||
|
<div class="world-map-container fade-in animate">
|
||||||
|
<div class="map-wrapper">
|
||||||
|
// OpenStreetMap container
|
||||||
|
<div id="world-map" ref={map_ref} class="leaflet-map"></div>
|
||||||
|
|
||||||
|
// Connection animations overlay
|
||||||
|
<div class="connection-overlay">
|
||||||
|
// Animated connection lines and dots
|
||||||
|
<svg class="connections-svg" viewBox="0 0 1200 600">
|
||||||
|
// Gradient definition for beam effect
|
||||||
|
<defs>
|
||||||
|
<linearGradient id="beamGradient" x1="0%" y1="0%" x2="100%" y2="0%">
|
||||||
|
<stop offset="0%" style="stop-color:rgba(0,255,255,0.1);stop-opacity:1" />
|
||||||
|
<stop offset="50%" style="stop-color:rgba(0,255,255,0.8);stop-opacity:1" />
|
||||||
|
<stop offset="100%" style="stop-color:rgba(0,255,255,0.1);stop-opacity:1" />
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
|
||||||
|
{for active_connections.iter().map(|connection| {
|
||||||
|
let entity = &connection.entity;
|
||||||
|
let progress = connection.progress;
|
||||||
|
|
||||||
|
// Convert lat/lng to SVG coordinates (simplified projection)
|
||||||
|
// Adjust for larger map coverage and proper geographic positioning
|
||||||
|
let start_x = ((entity.lng + 180.0) / 360.0) * 1200.0;
|
||||||
|
let start_y = ((90.0 - entity.lat) / 180.0) * 600.0;
|
||||||
|
|
||||||
|
// Zanzibar coordinates: -6.1659, 39.2026
|
||||||
|
let zanzibar_x = ((39.2026 + 180.0) / 360.0) * 1200.0;
|
||||||
|
let zanzibar_y = ((90.0 - (-6.1659)) / 180.0) * 600.0;
|
||||||
|
let end_x = zanzibar_x;
|
||||||
|
let end_y = zanzibar_y;
|
||||||
|
|
||||||
|
// Calculate current position along straight line
|
||||||
|
let current_x = start_x + (end_x - start_x) * progress;
|
||||||
|
let current_y = start_y + (end_y - start_y) * progress;
|
||||||
|
|
||||||
|
html! {
|
||||||
|
<g key={entity.id}>
|
||||||
|
// Straight beam line
|
||||||
|
<line
|
||||||
|
class="connection-line animated"
|
||||||
|
x1={start_x.to_string()}
|
||||||
|
y1={start_y.to_string()}
|
||||||
|
x2={end_x.to_string()}
|
||||||
|
y2={end_y.to_string()}
|
||||||
|
style={format!("opacity: {}", (0.7 - progress * 0.3).max(0.2))}
|
||||||
|
/>
|
||||||
|
// Moving data dot
|
||||||
|
<circle
|
||||||
|
class="connection-dot moving"
|
||||||
|
cx={current_x.to_string()}
|
||||||
|
cy={current_y.to_string()}
|
||||||
|
r="6"
|
||||||
|
style={format!("opacity: {}", (1.0 - progress * 0.1).max(0.7))}
|
||||||
|
/>
|
||||||
|
</g>
|
||||||
|
}
|
||||||
|
})}
|
||||||
|
|
||||||
|
// Zanzibar hub (always visible) - actual geographic position
|
||||||
|
// Zanzibar coordinates: -6.1659, 39.2026
|
||||||
|
<circle class="zanzibar-hub" cx="731.5" cy="321.1" r="15" />
|
||||||
|
<circle class="zanzibar-pulse" cx="731.5" cy="321.1" r="15" />
|
||||||
|
</svg>
|
||||||
|
|
||||||
|
// Entity cards that appear during connections
|
||||||
|
{for active_connections.iter().map(|connection| {
|
||||||
|
let entity = &connection.entity;
|
||||||
|
let progress = connection.progress;
|
||||||
|
|
||||||
|
// Convert lat/lng to pixel coordinates for card positioning
|
||||||
|
let card_x = ((entity.lng + 180.0) / 360.0) * 100.0; // Percentage
|
||||||
|
let card_y = ((90.0 - entity.lat) / 180.0) * 100.0; // Percentage
|
||||||
|
|
||||||
|
// Card fades out as connection progresses
|
||||||
|
let opacity = (1.0 - progress).max(0.0);
|
||||||
|
|
||||||
|
html! {
|
||||||
|
<div
|
||||||
|
key={entity.id}
|
||||||
|
class="entity-card"
|
||||||
|
style={format!("left: {}%; top: {}%; opacity: {};", card_x, card_y, opacity)}
|
||||||
|
>
|
||||||
|
<div class="entity-header">
|
||||||
|
<span class={format!("entity-type {}", entity.entity_type.to_lowercase())}>
|
||||||
|
{&entity.entity_type}
|
||||||
|
</span>
|
||||||
|
<span class="entity-date">{&entity.registration_date}</span>
|
||||||
|
</div>
|
||||||
|
<div class="entity-name">{&entity.name}</div>
|
||||||
|
<div class="entity-location">
|
||||||
|
<span class="location-icon">{"📍"}</span>
|
||||||
|
{&entity.location}
|
||||||
|
</div>
|
||||||
|
{if let Some(industry) = &entity.industry {
|
||||||
|
html! {
|
||||||
|
<div class="entity-industry">{industry}</div>
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
html! {}
|
||||||
|
}}
|
||||||
|
<div class="entity-status">
|
||||||
|
{if progress < 0.5 {
|
||||||
|
"Connecting to Zanzibar..."
|
||||||
|
} else if progress < 0.9 {
|
||||||
|
"Establishing digital presence..."
|
||||||
|
} else {
|
||||||
|
"Registration complete!"
|
||||||
|
}}
|
||||||
|
</div>
|
||||||
|
<div class="connection-progress">
|
||||||
|
<div class="progress-bar">
|
||||||
|
<div
|
||||||
|
class="progress-fill"
|
||||||
|
style={format!("width: {}%", progress * 100.0)}
|
||||||
|
></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
// Statistics
|
||||||
|
<div class="map-stats">
|
||||||
|
<div class="stat-item">
|
||||||
|
<div class="stat-number">{"17,736"}</div>
|
||||||
|
<div class="stat-label">{"Digital Entities"}</div>
|
||||||
|
</div>
|
||||||
|
<div class="stat-item">
|
||||||
|
<div class="stat-number">{"127"}</div>
|
||||||
|
<div class="stat-label">{"Countries"}</div>
|
||||||
|
</div>
|
||||||
|
<div class="stat-item">
|
||||||
|
<div class="stat-number">{"$2.4B"}</div>
|
||||||
|
<div class="stat-label">{"Assets Under Management"}</div>
|
||||||
|
</div>
|
||||||
|
<div class="stat-item">
|
||||||
|
<div class="stat-number">{"24/7"}</div>
|
||||||
|
<div class="stat-label">{"Global Operations"}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[function_component(GlobalConnections)]
|
||||||
|
pub fn global_connections() -> Html {
|
||||||
|
html! {
|
||||||
|
<section class="section global-connections-section">
|
||||||
|
<div class="container">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-lg-12 text-center mb-5">
|
||||||
|
<h2 class="section-title fade-in">{"Global Digital Hub"}</h2>
|
||||||
|
<p class="section-subtitle fade-in">
|
||||||
|
{"Connecting entrepreneurs worldwide to Zanzibar's digital freezone"}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row justify-content-center">
|
||||||
|
<div class="col-lg-12">
|
||||||
|
<div class="slide-in-right">
|
||||||
|
<WorldMap />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
}
|
||||||
|
}
|
10
website/src/main.rs
Normal file
10
website/src/main.rs
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
mod app;
|
||||||
|
mod components;
|
||||||
|
mod pages;
|
||||||
|
mod utils;
|
||||||
|
|
||||||
|
use app::App;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
yew::Renderer::<App>::new().render();
|
||||||
|
}
|
428
website/src/pages/defi.rs
Normal file
428
website/src/pages/defi.rs
Normal file
@ -0,0 +1,428 @@
|
|||||||
|
use yew::prelude::*;
|
||||||
|
use yew_router::prelude::*;
|
||||||
|
use crate::app::Route;
|
||||||
|
use crate::components::{Hero, Section, TradingInterface, InteractiveLiquidityPool, LiveOrderbook};
|
||||||
|
|
||||||
|
#[function_component(DeFi)]
|
||||||
|
pub fn defi() -> Html {
|
||||||
|
html! {
|
||||||
|
<>
|
||||||
|
<Hero
|
||||||
|
content_path="defi/hero"
|
||||||
|
cta_text="Start Trading"
|
||||||
|
cta_link="#trading"
|
||||||
|
secondary_cta_text="View Pools"
|
||||||
|
secondary_cta_link="#pools"
|
||||||
|
background_variant="defi"
|
||||||
|
/>
|
||||||
|
|
||||||
|
// Live trading interface
|
||||||
|
<section class="section section-alt" id="trading">
|
||||||
|
<div class="container">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-lg-12 text-center mb-5">
|
||||||
|
<h2 class="section-title fade-in animate">{"Trading Interface"}</h2>
|
||||||
|
<p class="section-subtitle fade-in animate">
|
||||||
|
{"Experience professional-grade DeFi trading with real-time data and advanced tools"}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row justify-content-center">
|
||||||
|
<div class="col-lg-12">
|
||||||
|
<div class="fade-in animate">
|
||||||
|
<TradingInterface />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
// DeFi protocols overview
|
||||||
|
<section class="section">
|
||||||
|
<div class="container">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-lg-12 text-center mb-5">
|
||||||
|
<h2 class="section-title fade-in animate">{"DeFi Protocols"}</h2>
|
||||||
|
<p class="section-subtitle fade-in animate">
|
||||||
|
{"Access the full spectrum of decentralized finance opportunities"}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-lg-3 col-md-6 mb-4">
|
||||||
|
<div class="feature-card text-center fade-in animate">
|
||||||
|
<div class="feature-icon mx-auto">
|
||||||
|
{"💧"}
|
||||||
|
</div>
|
||||||
|
<h5>{"Liquidity Pools"}</h5>
|
||||||
|
<p class="text-muted mb-4">
|
||||||
|
{"Provide liquidity and earn fees from trading activity across multiple token pairs."}
|
||||||
|
</p>
|
||||||
|
<div class="protocol-stats">
|
||||||
|
<div class="stat-row">
|
||||||
|
<span>{"TVL:"}</span>
|
||||||
|
<span class="text-success">{"$2.4B"}</span>
|
||||||
|
</div>
|
||||||
|
<div class="stat-row">
|
||||||
|
<span>{"APY:"}</span>
|
||||||
|
<span class="text-info">{"8.5% - 45%"}</span>
|
||||||
|
</div>
|
||||||
|
<div class="stat-row">
|
||||||
|
<span>{"Pools:"}</span>
|
||||||
|
<span>{"150+"}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-lg-3 col-md-6 mb-4">
|
||||||
|
<div class="feature-card text-center fade-in animate">
|
||||||
|
<div class="feature-icon mx-auto">
|
||||||
|
{"📈"}
|
||||||
|
</div>
|
||||||
|
<h5>{"Leveraged Trading"}</h5>
|
||||||
|
<p class="text-muted mb-4">
|
||||||
|
{"Trade with up to 100x leverage on major cryptocurrency pairs with advanced risk management."}
|
||||||
|
</p>
|
||||||
|
<div class="protocol-stats">
|
||||||
|
<div class="stat-row">
|
||||||
|
<span>{"Max Leverage:"}</span>
|
||||||
|
<span class="text-warning">{"100x"}</span>
|
||||||
|
</div>
|
||||||
|
<div class="stat-row">
|
||||||
|
<span>{"Trading Pairs:"}</span>
|
||||||
|
<span>{"50+"}</span>
|
||||||
|
</div>
|
||||||
|
<div class="stat-row">
|
||||||
|
<span>{"24h Volume:"}</span>
|
||||||
|
<span class="text-success">{"$890M"}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-lg-3 col-md-6 mb-4">
|
||||||
|
<div class="feature-card text-center fade-in animate">
|
||||||
|
<div class="feature-icon mx-auto">
|
||||||
|
{"🌾"}
|
||||||
|
</div>
|
||||||
|
<h5>{"Yield Farming"}</h5>
|
||||||
|
<p class="text-muted mb-4">
|
||||||
|
{"Maximize returns through strategic yield farming across multiple protocols and chains."}
|
||||||
|
</p>
|
||||||
|
<div class="protocol-stats">
|
||||||
|
<div class="stat-row">
|
||||||
|
<span>{"Best APY:"}</span>
|
||||||
|
<span class="text-success">{"125%"}</span>
|
||||||
|
</div>
|
||||||
|
<div class="stat-row">
|
||||||
|
<span>{"Active Farms:"}</span>
|
||||||
|
<span>{"85"}</span>
|
||||||
|
</div>
|
||||||
|
<div class="stat-row">
|
||||||
|
<span>{"Total Staked:"}</span>
|
||||||
|
<span>{"$450M"}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-lg-3 col-md-6 mb-4">
|
||||||
|
<div class="feature-card text-center fade-in animate">
|
||||||
|
<div class="feature-icon mx-auto">
|
||||||
|
{"🏦"}
|
||||||
|
</div>
|
||||||
|
<h5>{"Lending & Borrowing"}</h5>
|
||||||
|
<p class="text-muted mb-4">
|
||||||
|
{"Lend your assets to earn interest or borrow against your collateral with competitive rates."}
|
||||||
|
</p>
|
||||||
|
<div class="protocol-stats">
|
||||||
|
<div class="stat-row">
|
||||||
|
<span>{"Supply APY:"}</span>
|
||||||
|
<span class="text-success">{"3.2% - 12%"}</span>
|
||||||
|
</div>
|
||||||
|
<div class="stat-row">
|
||||||
|
<span>{"Borrow APY:"}</span>
|
||||||
|
<span class="text-info">{"5.8% - 18%"}</span>
|
||||||
|
</div>
|
||||||
|
<div class="stat-row">
|
||||||
|
<span>{"Total Supplied:"}</span>
|
||||||
|
<span>{"$1.2B"}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
// Live pools and orderbook
|
||||||
|
<section class="section section-alt" id="pools">
|
||||||
|
<div class="container">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-lg-12 text-center mb-5">
|
||||||
|
<h2 class="section-title fade-in animate">{"Live Market Data"}</h2>
|
||||||
|
<p class="section-subtitle fade-in animate">
|
||||||
|
{"Real-time liquidity pools and order book data"}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-lg-6 mb-4">
|
||||||
|
<div class="fade-in animate">
|
||||||
|
<InteractiveLiquidityPool />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-lg-6 mb-4">
|
||||||
|
<div class="fade-in animate">
|
||||||
|
<LiveOrderbook />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<Section
|
||||||
|
content_path="defi/features"
|
||||||
|
animation_class="fade-in"
|
||||||
|
/>
|
||||||
|
|
||||||
|
// Advanced DeFi strategies
|
||||||
|
<section class="section section-alt">
|
||||||
|
<div class="container">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-lg-12 text-center mb-5">
|
||||||
|
<h2 class="section-title fade-in animate">{"DeFi Strategies"}</h2>
|
||||||
|
<p class="section-subtitle fade-in animate">
|
||||||
|
{"Sophisticated tools for maximizing your DeFi returns"}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-lg-4 mb-4">
|
||||||
|
<div class="feature-card fade-in animate">
|
||||||
|
<div class="feature-icon">
|
||||||
|
{"🔄"}
|
||||||
|
</div>
|
||||||
|
<h5>{"Auto-Compounding"}</h5>
|
||||||
|
<p class="text-muted mb-4">
|
||||||
|
{"Automatically reinvest your yields to maximize compound returns across all positions."}
|
||||||
|
</p>
|
||||||
|
<div class="strategy-demo">
|
||||||
|
<div class="compound-visualization">
|
||||||
|
<div class="compound-layer layer-1">
|
||||||
|
<span>{"Initial: $1,000"}</span>
|
||||||
|
</div>
|
||||||
|
<div class="compound-layer layer-2">
|
||||||
|
<span>{"+ Yield: $120"}</span>
|
||||||
|
</div>
|
||||||
|
<div class="compound-layer layer-3">
|
||||||
|
<span>{"Compounded: $1,134"}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-lg-4 mb-4">
|
||||||
|
<div class="feature-card fade-in animate">
|
||||||
|
<div class="feature-icon">
|
||||||
|
{"⚖️"}
|
||||||
|
</div>
|
||||||
|
<h5>{"Portfolio Rebalancing"}</h5>
|
||||||
|
<p class="text-muted mb-4">
|
||||||
|
{"Maintain optimal portfolio allocation with automated rebalancing strategies."}
|
||||||
|
</p>
|
||||||
|
<div class="strategy-demo">
|
||||||
|
<div class="rebalance-chart">
|
||||||
|
<div class="allocation-bar">
|
||||||
|
<div class="allocation-segment eth" style="width: 40%">{"ETH 40%"}</div>
|
||||||
|
<div class="allocation-segment btc" style="width: 35%">{"BTC 35%"}</div>
|
||||||
|
<div class="allocation-segment stable" style="width: 25%">{"USDC 25%"}</div>
|
||||||
|
</div>
|
||||||
|
<div class="rebalance-arrow">{"⟲"}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-lg-4 mb-4">
|
||||||
|
<div class="feature-card fade-in animate">
|
||||||
|
<div class="feature-icon">
|
||||||
|
{"🛡️"}
|
||||||
|
</div>
|
||||||
|
<h5>{"Risk Management"}</h5>
|
||||||
|
<p class="text-muted mb-4">
|
||||||
|
{"Advanced risk controls with stop-loss, take-profit, and position sizing automation."}
|
||||||
|
</p>
|
||||||
|
<div class="strategy-demo">
|
||||||
|
<div class="risk-gauge">
|
||||||
|
<div class="gauge-container">
|
||||||
|
<div class="gauge-fill" style="--risk-level: 35%"></div>
|
||||||
|
<div class="gauge-label">{"Risk: Low"}</div>
|
||||||
|
</div>
|
||||||
|
<div class="risk-metrics">
|
||||||
|
<div class="risk-metric">
|
||||||
|
<span>{"Max Drawdown:"}</span>
|
||||||
|
<span class="text-success">{"5.2%"}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
// Cross-chain capabilities
|
||||||
|
<section class="section">
|
||||||
|
<div class="container">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-lg-12 text-center mb-5">
|
||||||
|
<h2 class="section-title fade-in animate">{"Cross-Chain DeFi"}</h2>
|
||||||
|
<p class="section-subtitle fade-in animate">
|
||||||
|
{"Access opportunities across multiple blockchain networks"}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-lg-6 mb-4">
|
||||||
|
<div class="network-grid fade-in animate">
|
||||||
|
<div class="network-card ethereum">
|
||||||
|
<div class="network-icon">{"Ξ"}</div>
|
||||||
|
<div class="network-name">{"Ethereum"}</div>
|
||||||
|
<div class="network-stats">
|
||||||
|
<div>{"TVL: $1.2B"}</div>
|
||||||
|
<div>{"APY: 8.5%"}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="network-card polygon">
|
||||||
|
<div class="network-icon">{"⬟"}</div>
|
||||||
|
<div class="network-name">{"Polygon"}</div>
|
||||||
|
<div class="network-stats">
|
||||||
|
<div>{"TVL: $450M"}</div>
|
||||||
|
<div>{"APY: 12.3%"}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="network-card bsc">
|
||||||
|
<div class="network-icon">{"🔶"}</div>
|
||||||
|
<div class="network-name">{"BSC"}</div>
|
||||||
|
<div class="network-stats">
|
||||||
|
<div>{"TVL: $320M"}</div>
|
||||||
|
<div>{"APY: 15.7%"}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="network-card avalanche">
|
||||||
|
<div class="network-icon">{"🔺"}</div>
|
||||||
|
<div class="network-name">{"Avalanche"}</div>
|
||||||
|
<div class="network-stats">
|
||||||
|
<div>{"TVL: $280M"}</div>
|
||||||
|
<div>{"APY: 18.2%"}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-lg-6 mb-4">
|
||||||
|
<div class="fade-in animate">
|
||||||
|
<h4>{"Seamless Cross-Chain Operations"}</h4>
|
||||||
|
<p class="text-muted mb-4">
|
||||||
|
{"Our advanced bridge technology enables instant asset transfers and yield optimization across all major blockchain networks."}
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div class="cross-chain-features">
|
||||||
|
<div class="feature-item">
|
||||||
|
<div class="feature-check">{"✓"}</div>
|
||||||
|
<span>{"Instant cross-chain swaps"}</span>
|
||||||
|
</div>
|
||||||
|
<div class="feature-item">
|
||||||
|
<div class="feature-check">{"✓"}</div>
|
||||||
|
<span>{"Unified portfolio management"}</span>
|
||||||
|
</div>
|
||||||
|
<div class="feature-item">
|
||||||
|
<div class="feature-check">{"✓"}</div>
|
||||||
|
<span>{"Automated yield optimization"}</span>
|
||||||
|
</div>
|
||||||
|
<div class="feature-item">
|
||||||
|
<div class="feature-check">{"✓"}</div>
|
||||||
|
<span>{"Gas fee optimization"}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
// DeFi statistics
|
||||||
|
<section class="section section-alt">
|
||||||
|
<div class="container">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-lg-12 text-center mb-5">
|
||||||
|
<h2 class="section-title fade-in animate">{"DeFi Platform Statistics"}</h2>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-lg-3 col-md-6 mb-4">
|
||||||
|
<div class="text-center fade-in animate">
|
||||||
|
<div class="stat-number counter">{"2400000000"}</div>
|
||||||
|
<p class="stat-label">{"Total Value Locked (USD)"}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-lg-3 col-md-6 mb-4">
|
||||||
|
<div class="text-center fade-in animate">
|
||||||
|
<div class="stat-number counter">{"89000"}</div>
|
||||||
|
<p class="stat-label">{"Active DeFi Users"}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-lg-3 col-md-6 mb-4">
|
||||||
|
<div class="text-center fade-in animate">
|
||||||
|
<div class="stat-number">{"18.5%"}</div>
|
||||||
|
<p class="stat-label">{"Average APY"}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-lg-3 col-md-6 mb-4">
|
||||||
|
<div class="text-center fade-in animate">
|
||||||
|
<div class="stat-number counter">{"1200000000"}</div>
|
||||||
|
<p class="stat-label">{"24h Trading Volume (USD)"}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
// Call to action
|
||||||
|
<section class="section">
|
||||||
|
<div class="container">
|
||||||
|
<div class="row justify-content-center">
|
||||||
|
<div class="col-lg-8 text-center">
|
||||||
|
<div class="fade-in animate">
|
||||||
|
<h2 class="section-title">{"Ready to Maximize Your DeFi Returns?"}</h2>
|
||||||
|
<p class="section-subtitle">
|
||||||
|
{"Join thousands of users earning passive income through our advanced DeFi protocols"}
|
||||||
|
</p>
|
||||||
|
<div class="mt-4">
|
||||||
|
<a href="#register" class="btn btn-primary btn-lg me-3">
|
||||||
|
{"Start Earning"}
|
||||||
|
</a>
|
||||||
|
<Link<Route> to={Route::Platform} classes="btn btn-outline-primary btn-lg">
|
||||||
|
{"Explore Platform"}
|
||||||
|
</Link<Route>>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</>
|
||||||
|
}
|
||||||
|
}
|
265
website/src/pages/home.rs
Normal file
265
website/src/pages/home.rs
Normal file
@ -0,0 +1,265 @@
|
|||||||
|
use yew::prelude::*;
|
||||||
|
use yew_router::prelude::*;
|
||||||
|
use crate::app::Route;
|
||||||
|
use crate::components::{Hero, Section, MarketplaceFlow, InteractiveLiquidityPool, PlatformWireframe, WorldMap};
|
||||||
|
|
||||||
|
#[function_component(Home)]
|
||||||
|
pub fn home() -> Html {
|
||||||
|
html! {
|
||||||
|
<>
|
||||||
|
<Hero
|
||||||
|
content_path="home/hero"
|
||||||
|
cta_text="Get Started"
|
||||||
|
cta_link="#explore"
|
||||||
|
secondary_cta_text="Learn More"
|
||||||
|
secondary_cta_link="#about"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<Section
|
||||||
|
content_path="home/about"
|
||||||
|
animation_class="fade-in"
|
||||||
|
id="about"
|
||||||
|
/>
|
||||||
|
|
||||||
|
|
||||||
|
// Platform preview section with interactive demos
|
||||||
|
<section class="section section-alt" id="explore">
|
||||||
|
<div class="container">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-lg-12 text-center mb-5">
|
||||||
|
<h2 class="section-title fade-in animate">{"Zanzibar Digital Freezone Ecosystem"}</h2>
|
||||||
|
<p class="section-subtitle fade-in animate">
|
||||||
|
{"Three powerful platforms enabling digital entity formation and asset trading in Zanzibar"}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row align-items-center mb-5">
|
||||||
|
<div class="col-lg-6 slide-in-left animate">
|
||||||
|
<div class="feature-card">
|
||||||
|
<div class="feature-icon">
|
||||||
|
{"🏢"}
|
||||||
|
</div>
|
||||||
|
<h3>{"Platform"}</h3>
|
||||||
|
<p class="text-muted mb-4">
|
||||||
|
{"Establish your digital legal entity and residence in Zanzibar. Manage, administer and govern your digital presence with full regulatory compliance."}
|
||||||
|
</p>
|
||||||
|
<div class="feature-highlights mb-4">
|
||||||
|
<div class="highlight-item">
|
||||||
|
<span class="highlight-icon">{"✓"}</span>
|
||||||
|
<span>{"Digital entity formation in Zanzibar"}</span>
|
||||||
|
</div>
|
||||||
|
<div class="highlight-item">
|
||||||
|
<span class="highlight-icon">{"✓"}</span>
|
||||||
|
<span>{"Digital residence establishment"}</span>
|
||||||
|
</div>
|
||||||
|
<div class="highlight-item">
|
||||||
|
<span class="highlight-icon">{"✓"}</span>
|
||||||
|
<span>{"Regulatory compliance & reporting"}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<Link<Route> to={Route::Platform} classes="btn btn-outline-primary">
|
||||||
|
{"Explore Platform"}
|
||||||
|
</Link<Route>>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-lg-6 slide-in-right animate">
|
||||||
|
<PlatformWireframe />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row align-items-center mb-5">
|
||||||
|
<div class="col-lg-6 order-lg-2 slide-in-right animate">
|
||||||
|
<div class="feature-card">
|
||||||
|
<div class="feature-icon">
|
||||||
|
{"🛒"}
|
||||||
|
</div>
|
||||||
|
<h3>{"Marketplace"}</h3>
|
||||||
|
<p class="text-muted mb-4">
|
||||||
|
{"Trade digital assets within the Zanzibar Digital Freezone. Access global markets while operating under favorable regulatory frameworks."}
|
||||||
|
</p>
|
||||||
|
<div class="feature-highlights mb-4">
|
||||||
|
<div class="highlight-item">
|
||||||
|
<span class="highlight-icon">{"✓"}</span>
|
||||||
|
<span>{"Digital asset trading within freezone"}</span>
|
||||||
|
</div>
|
||||||
|
<div class="highlight-item">
|
||||||
|
<span class="highlight-icon">{"✓"}</span>
|
||||||
|
<span>{"Regulatory compliant transactions"}</span>
|
||||||
|
</div>
|
||||||
|
<div class="highlight-item">
|
||||||
|
<span class="highlight-icon">{"✓"}</span>
|
||||||
|
<span>{"Global market access"}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<Link<Route> to={Route::Marketplace} classes="btn btn-outline-primary">
|
||||||
|
{"Explore Marketplace"}
|
||||||
|
</Link<Route>>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-lg-6 order-lg-1 slide-in-left animate">
|
||||||
|
<div class="marketplace-preview">
|
||||||
|
<MarketplaceFlow />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row align-items-center">
|
||||||
|
<div class="col-lg-6 slide-in-left animate">
|
||||||
|
<div class="feature-card">
|
||||||
|
<div class="feature-icon">
|
||||||
|
{"💰"}
|
||||||
|
</div>
|
||||||
|
<h3>{"DeFi"}</h3>
|
||||||
|
<p class="text-muted mb-4">
|
||||||
|
{"Advanced DeFi capabilities for digital asset trading within the Zanzibar Digital Freezone. Leverage, stake, and earn with regulatory clarity."}
|
||||||
|
</p>
|
||||||
|
<div class="feature-highlights mb-4">
|
||||||
|
<div class="highlight-item">
|
||||||
|
<span class="highlight-icon">{"✓"}</span>
|
||||||
|
<span>{"Freezone-compliant DeFi protocols"}</span>
|
||||||
|
</div>
|
||||||
|
<div class="highlight-item">
|
||||||
|
<span class="highlight-icon">{"✓"}</span>
|
||||||
|
<span>{"Digital asset yield generation"}</span>
|
||||||
|
</div>
|
||||||
|
<div class="highlight-item">
|
||||||
|
<span class="highlight-icon">{"✓"}</span>
|
||||||
|
<span>{"Regulated trading environment"}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<Link<Route> to={Route::DeFi} classes="btn btn-outline-primary">
|
||||||
|
{"Start Trading"}
|
||||||
|
</Link<Route>>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-lg-6 slide-in-right animate">
|
||||||
|
<InteractiveLiquidityPool />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
// Why choose Freezone section
|
||||||
|
<section class="section">
|
||||||
|
<div class="container">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-lg-12 text-center mb-5">
|
||||||
|
<h2 class="section-title fade-in animate">{"Why Choose Zanzibar Digital Freezone?"}</h2>
|
||||||
|
<p class="section-subtitle fade-in animate">
|
||||||
|
{"Experience the future of digital entity formation and asset trading with regulatory clarity"}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-lg-4 mb-4">
|
||||||
|
<div class="feature-card text-center fade-in animate">
|
||||||
|
<div class="feature-icon mx-auto">
|
||||||
|
{"🔒"}
|
||||||
|
</div>
|
||||||
|
<h5>{"Secure & Trustless"}</h5>
|
||||||
|
<p class="text-muted mb-4">
|
||||||
|
{"Built on blockchain technology with bank-grade security, multi-signature wallets, and complete transparency in all operations."}
|
||||||
|
</p>
|
||||||
|
<div class="security-indicators">
|
||||||
|
<div class="indicator">
|
||||||
|
<span class="indicator-icon">{"🛡️"}</span>
|
||||||
|
<span>{"Multi-sig security"}</span>
|
||||||
|
</div>
|
||||||
|
<div class="indicator">
|
||||||
|
<span class="indicator-icon">{"🔍"}</span>
|
||||||
|
<span>{"Audited smart contracts"}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-lg-4 mb-4">
|
||||||
|
<div class="feature-card text-center fade-in animate">
|
||||||
|
<div class="feature-icon mx-auto">
|
||||||
|
{"⚡"}
|
||||||
|
</div>
|
||||||
|
<h5>{"Lightning Fast"}</h5>
|
||||||
|
<p class="text-muted mb-4">
|
||||||
|
{"Experience instant transactions and real-time updates across all platforms with sub-second settlement times."}
|
||||||
|
</p>
|
||||||
|
<div class="performance-metrics">
|
||||||
|
<div class="metric">
|
||||||
|
<span class="metric-value">{"<1s"}</span>
|
||||||
|
<span class="metric-label">{"Settlement"}</span>
|
||||||
|
</div>
|
||||||
|
<div class="metric">
|
||||||
|
<span class="metric-value">{"99.9%"}</span>
|
||||||
|
<span class="metric-label">{"Uptime"}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-lg-4 mb-4">
|
||||||
|
<div class="feature-card text-center fade-in animate">
|
||||||
|
<div class="feature-icon mx-auto">
|
||||||
|
{"🌍"}
|
||||||
|
</div>
|
||||||
|
<h5>{"Global Access"}</h5>
|
||||||
|
<p class="text-muted mb-4">
|
||||||
|
{"Access your digital assets and services from anywhere in the world, 24/7, with support for multiple currencies and languages."}
|
||||||
|
</p>
|
||||||
|
<div class="global-stats">
|
||||||
|
<div class="stat">
|
||||||
|
<span class="stat-value">{"150+"}</span>
|
||||||
|
<span class="stat-label">{"Countries"}</span>
|
||||||
|
</div>
|
||||||
|
<div class="stat">
|
||||||
|
<span class="stat-value">{"24/7"}</span>
|
||||||
|
<span class="stat-label">{"Support"}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
// Call to action
|
||||||
|
<section class="section section-alt">
|
||||||
|
<div class="container">
|
||||||
|
<div class="row justify-content-center">
|
||||||
|
<div class="col-lg-8 text-center">
|
||||||
|
<div class="fade-in animate">
|
||||||
|
<h2 class="section-title">{"Ready to Establish Your Digital Presence?"}</h2>
|
||||||
|
<p class="section-subtitle">
|
||||||
|
{"Join the Zanzibar Digital Freezone and unlock global opportunities with regulatory clarity"}
|
||||||
|
</p>
|
||||||
|
<div class="mt-4">
|
||||||
|
<a href="#register" class="btn btn-primary btn-lg me-3">
|
||||||
|
{"Establish Your Entity"}
|
||||||
|
</a>
|
||||||
|
<a href="#learn-more" class="btn btn-outline-primary btn-lg">
|
||||||
|
{"Learn More"}
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="cta-features mt-4">
|
||||||
|
<div class="cta-feature">
|
||||||
|
<span class="cta-icon">{"✓"}</span>
|
||||||
|
<span>{"Digital entity formation"}</span>
|
||||||
|
</div>
|
||||||
|
<div class="cta-feature">
|
||||||
|
<span class="cta-icon">{"✓"}</span>
|
||||||
|
<span>{"Regulatory compliance"}</span>
|
||||||
|
</div>
|
||||||
|
<div class="cta-feature">
|
||||||
|
<span class="cta-icon">{"✓"}</span>
|
||||||
|
<span>{"Global market access"}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</>
|
||||||
|
}
|
||||||
|
}
|
201
website/src/pages/marketplace.rs
Normal file
201
website/src/pages/marketplace.rs
Normal file
@ -0,0 +1,201 @@
|
|||||||
|
use yew::prelude::*;
|
||||||
|
use yew_router::prelude::*;
|
||||||
|
use crate::app::Route;
|
||||||
|
use crate::components::{Hero, Section, MarketplaceFlow, InteractiveLiquidityPool, LiveOrderbook};
|
||||||
|
|
||||||
|
#[function_component(Marketplace)]
|
||||||
|
pub fn marketplace() -> Html {
|
||||||
|
html! {
|
||||||
|
<>
|
||||||
|
// Custom hero with integrated marketplace flow
|
||||||
|
<section class="hero-section hero-marketplace">
|
||||||
|
<div class="container">
|
||||||
|
<div class="row align-items-center min-vh-100">
|
||||||
|
<div class="col-lg-6 hero-content">
|
||||||
|
<div class="fade-in animate">
|
||||||
|
<h1 class="hero-title">{"Marketplace"}</h1>
|
||||||
|
<p class="hero-subtitle">
|
||||||
|
{"The future of business digitalization. Transform your real-world assets and services into digital tokens, enabling seamless global commerce within the Zanzibar Digital Freezone."}
|
||||||
|
</p>
|
||||||
|
<div class="hero-actions mt-4">
|
||||||
|
<a href="#digitize" class="btn btn-primary btn-lg me-3">
|
||||||
|
{"Digitize Assets"}
|
||||||
|
</a>
|
||||||
|
<a href="#features" class="btn btn-outline-primary btn-lg">
|
||||||
|
{"Learn More"}
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-lg-6 slide-in-right animate">
|
||||||
|
// Marketplace flow on the right side
|
||||||
|
<div class="hero-marketplace-flow">
|
||||||
|
<MarketplaceFlow />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
// Scroll indicator
|
||||||
|
<div class="scroll-indicator">
|
||||||
|
<div class="scroll-arrow"></div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
// Real world asset digitalization section
|
||||||
|
<section class="section" id="digitize">
|
||||||
|
<div class="container">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-lg-12 text-center mb-5">
|
||||||
|
<h2 class="section-title fade-in animate">{"Digitalize Real World Assets"}</h2>
|
||||||
|
<p class="section-subtitle fade-in animate">
|
||||||
|
{"Transform traditional assets into digital tokens for global accessibility, fractional ownership, and enhanced liquidity"}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
// Real Estate - Left aligned
|
||||||
|
<div class="row align-items-center mb-5">
|
||||||
|
<div class="col-lg-6 fade-in animate">
|
||||||
|
<div class="asset-showcase">
|
||||||
|
<h3>{"Real Estate Tokenization"}</h3>
|
||||||
|
<p class="lead">
|
||||||
|
{"Tokenize eco-friendly developments, renewable energy projects, and sustainable infrastructure that benefits local communities while preserving Zanzibar's natural beauty."}
|
||||||
|
</p>
|
||||||
|
<ul class="feature-list">
|
||||||
|
<li>{"✓ Solar-powered eco-resorts with community ownership"}</li>
|
||||||
|
<li>{"✓ Mangrove restoration project funding"}</li>
|
||||||
|
<li>{"✓ Sustainable housing cooperatives"}</li>
|
||||||
|
<li>{"✓ Ocean conservation infrastructure"}</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-lg-6 fade-in animate">
|
||||||
|
<div class="asset-visual">
|
||||||
|
<div class="tokenization-demo">
|
||||||
|
<div class="property-card">
|
||||||
|
<div class="property-image"></div>
|
||||||
|
<div class="property-details">
|
||||||
|
<h5>{"Coral Reef Eco-Resort"}</h5>
|
||||||
|
<p>{"$1.2M Total Value • $500 per token • 2400 tokens available"}</p>
|
||||||
|
<div class="progress">
|
||||||
|
<div class="progress-bar" style="width: 78%"></div>
|
||||||
|
</div>
|
||||||
|
<small>{"78% Funded • Carbon Negative"}</small>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
// Services - Right aligned
|
||||||
|
<div class="row align-items-center mb-5">
|
||||||
|
<div class="col-lg-6 order-lg-2 fade-in animate">
|
||||||
|
<div class="asset-showcase">
|
||||||
|
<h3>{"Service Digitalization"}</h3>
|
||||||
|
<p class="lead">
|
||||||
|
{"Transform professional services into smart contract-powered digital offerings with automated execution, milestone tracking, and global marketplace access."}
|
||||||
|
</p>
|
||||||
|
<ul class="feature-list">
|
||||||
|
<li>{"✓ Educational program licensing"}</li>
|
||||||
|
<li>{"✓ Healthcare service contracts"}</li>
|
||||||
|
<li>{"✓ Training and certification services"}</li>
|
||||||
|
<li>{"✓ Professional consulting packages"}</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-lg-6 order-lg-1 fade-in animate">
|
||||||
|
<div class="asset-visual">
|
||||||
|
<div class="service-demo">
|
||||||
|
<div class="service-card">
|
||||||
|
<div class="service-provider">
|
||||||
|
<div class="provider-avatar"></div>
|
||||||
|
<div class="provider-info">
|
||||||
|
<h6>{"Ocean Conservation Consultancy"}</h6>
|
||||||
|
<p>{"$2,500/month • 4.8★ • 89 projects completed"}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="service-contract">
|
||||||
|
<div class="contract-status active">{"Active Program"}</div>
|
||||||
|
<div class="milestones">
|
||||||
|
<div class="milestone completed">{"✓ Community Assessment"}</div>
|
||||||
|
<div class="milestone active">{"⏳ Training Deployment"}</div>
|
||||||
|
<div class="milestone pending">{"○ Impact Measurement"}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
// Software & Shares - Left aligned
|
||||||
|
<div class="row align-items-center">
|
||||||
|
<div class="col-lg-6 fade-in animate">
|
||||||
|
<div class="asset-showcase">
|
||||||
|
<h3>{"Company Share Tokenization"}</h3>
|
||||||
|
<p class="lead">
|
||||||
|
{"Tokenize company shares and equity stakes for enhanced liquidity, fractional ownership, and global investor access across diverse industries and business models."}
|
||||||
|
</p>
|
||||||
|
<ul class="feature-list">
|
||||||
|
<li>{"✓ Agricultural cooperative equity tokens"}</li>
|
||||||
|
<li>{"✓ Environmental project shares"}</li>
|
||||||
|
<li>{"✓ Technology startup equity"}</li>
|
||||||
|
<li>{"✓ Industry-specific investment tokens"}</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-lg-6 fade-in animate">
|
||||||
|
<div class="asset-visual">
|
||||||
|
<div class="digital-assets-demo">
|
||||||
|
<div class="asset-grid">
|
||||||
|
<div class="digital-asset">
|
||||||
|
<div class="asset-type">{"Cooperative Shares"}</div>
|
||||||
|
<h6>{"Zanzibar Spice Farmers Co-op"}</h6>
|
||||||
|
<p>{"1,200 shares • $75 each • Fair Trade Certified"}</p>
|
||||||
|
</div>
|
||||||
|
<div class="digital-asset">
|
||||||
|
<div class="asset-type">{"Carbon Credits"}</div>
|
||||||
|
<h6>{"Mangrove Restoration Project"}</h6>
|
||||||
|
<p>{"5,000 credits • $12 each • Verified Impact"}</p>
|
||||||
|
</div>
|
||||||
|
<div class="digital-asset">
|
||||||
|
<div class="asset-type">{"FinTech Startup"}</div>
|
||||||
|
<h6>{"Community Banking Platform"}</h6>
|
||||||
|
<p>{"Series A • $50 per token • Financial Inclusion"}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
// Call to action
|
||||||
|
<section class="section">
|
||||||
|
<div class="container">
|
||||||
|
<div class="row justify-content-center">
|
||||||
|
<div class="col-lg-8 text-center">
|
||||||
|
<div class="fade-in animate">
|
||||||
|
<h2 class="section-title">{"Ready to Join the Digital Asset Economy?"}</h2>
|
||||||
|
<p class="section-subtitle">
|
||||||
|
{"Transform your traditional assets into digital tokens and unlock global opportunities within the Zanzibar Digital Freezone. Access new markets, enable fractional ownership, and enhance liquidity for your investments."}
|
||||||
|
</p>
|
||||||
|
<div class="mt-4">
|
||||||
|
<a href="#register" class="btn btn-primary btn-lg me-3">
|
||||||
|
{"Start Digitalization"}
|
||||||
|
</a>
|
||||||
|
<Link<Route> to={Route::Platform} classes="btn btn-outline-primary btn-lg">
|
||||||
|
{"Explore Platform"}
|
||||||
|
</Link<Route>>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</>
|
||||||
|
}
|
||||||
|
}
|
11
website/src/pages/mod.rs
Normal file
11
website/src/pages/mod.rs
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
pub mod home;
|
||||||
|
pub mod platform;
|
||||||
|
pub mod marketplace;
|
||||||
|
pub mod defi;
|
||||||
|
pub mod not_found;
|
||||||
|
|
||||||
|
pub use home::Home;
|
||||||
|
pub use platform::Platform;
|
||||||
|
pub use marketplace::Marketplace;
|
||||||
|
pub use defi::DeFi;
|
||||||
|
pub use not_found::NotFound;
|
27
website/src/pages/not_found.rs
Normal file
27
website/src/pages/not_found.rs
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
use yew::prelude::*;
|
||||||
|
use yew_router::prelude::*;
|
||||||
|
use crate::app::Route;
|
||||||
|
|
||||||
|
#[function_component(NotFound)]
|
||||||
|
pub fn not_found() -> Html {
|
||||||
|
html! {
|
||||||
|
<section class="hero-section d-flex align-items-center">
|
||||||
|
<div class="container">
|
||||||
|
<div class="row justify-content-center">
|
||||||
|
<div class="col-lg-6 text-center">
|
||||||
|
<div class="fade-in">
|
||||||
|
<h1 class="display-1 text-primary mb-4">{"404"}</h1>
|
||||||
|
<h2 class="mb-4">{"Page Not Found"}</h2>
|
||||||
|
<p class="text-muted mb-4">
|
||||||
|
{"The page you're looking for doesn't exist in the freezone. Let's get you back on track."}
|
||||||
|
</p>
|
||||||
|
<Link<Route> to={Route::Home} classes="btn btn-primary btn-lg">
|
||||||
|
{"Return Home"}
|
||||||
|
</Link<Route>>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
}
|
||||||
|
}
|
381
website/src/pages/platform.rs
Normal file
381
website/src/pages/platform.rs
Normal file
@ -0,0 +1,381 @@
|
|||||||
|
use yew::prelude::*;
|
||||||
|
use yew_router::prelude::*;
|
||||||
|
use crate::app::Route;
|
||||||
|
use crate::components::{Hero, Section, PlatformWireframe};
|
||||||
|
|
||||||
|
#[function_component(Platform)]
|
||||||
|
pub fn platform() -> Html {
|
||||||
|
html! {
|
||||||
|
<>
|
||||||
|
<Hero
|
||||||
|
content_path="platform/hero"
|
||||||
|
cta_text="Launch Platform"
|
||||||
|
cta_link="#get-started"
|
||||||
|
secondary_cta_text="View Demo"
|
||||||
|
secondary_cta_link="#demo"
|
||||||
|
background_variant="platform"
|
||||||
|
/>
|
||||||
|
|
||||||
|
// Interactive platform demo
|
||||||
|
<section class="section section-alt" id="demo">
|
||||||
|
<div class="container">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-lg-12 text-center mb-5">
|
||||||
|
<h2 class="section-title fade-in animate">{"Platform Interface Preview"}</h2>
|
||||||
|
<p class="section-subtitle fade-in animate">
|
||||||
|
{"Experience the intuitive dashboard that powers digital business management"}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row justify-content-center">
|
||||||
|
<div class="col-lg-10">
|
||||||
|
<div class="fade-in animate">
|
||||||
|
<PlatformWireframe />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
// Core platform features
|
||||||
|
<section class="section">
|
||||||
|
<div class="container">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-lg-12 text-center mb-5">
|
||||||
|
<h2 class="section-title fade-in animate">{"Core Platform Features"}</h2>
|
||||||
|
<p class="section-subtitle fade-in animate">
|
||||||
|
{"Everything you need to manage and govern your digital business empire"}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-lg-6 mb-5">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6 mb-4">
|
||||||
|
<div class="feature-card fade-in animate">
|
||||||
|
<div class="feature-icon">
|
||||||
|
{"🏢"}
|
||||||
|
</div>
|
||||||
|
<h5>{"Company Formation"}</h5>
|
||||||
|
<p class="text-muted">
|
||||||
|
{"Establish digital companies with complete legal framework and automated compliance."}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6 mb-4">
|
||||||
|
<div class="feature-card fade-in animate">
|
||||||
|
<div class="feature-icon">
|
||||||
|
{"⚖️"}
|
||||||
|
</div>
|
||||||
|
<h5>{"Legal Framework"}</h5>
|
||||||
|
<p class="text-muted">
|
||||||
|
{"Built-in legal structures with smart contract enforcement and dispute resolution."}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6 mb-4">
|
||||||
|
<div class="feature-card fade-in animate">
|
||||||
|
<div class="feature-icon">
|
||||||
|
{"💰"}
|
||||||
|
</div>
|
||||||
|
<h5>{"Treasury Management"}</h5>
|
||||||
|
<p class="text-muted">
|
||||||
|
{"Advanced treasury operations with multi-signature wallets and automated accounting."}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6 mb-4">
|
||||||
|
<div class="feature-card fade-in animate">
|
||||||
|
<div class="feature-icon">
|
||||||
|
{"🗳️"}
|
||||||
|
</div>
|
||||||
|
<h5>{"Governance Tools"}</h5>
|
||||||
|
<p class="text-muted">
|
||||||
|
{"Democratic decision-making with voting mechanisms and proposal systems."}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-lg-6 mb-5">
|
||||||
|
<div class="interactive-demo slide-in-right animate">
|
||||||
|
<h5 class="text-center mb-4">{"Live Company Dashboard"}</h5>
|
||||||
|
<div class="company-dashboard">
|
||||||
|
<div class="dashboard-header">
|
||||||
|
<div class="company-info">
|
||||||
|
<div class="company-logo"></div>
|
||||||
|
<div class="company-details">
|
||||||
|
<h6>{"TechCorp Digital Ltd."}</h6>
|
||||||
|
<span class="company-status active">{"Active"}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="dashboard-actions">
|
||||||
|
<button class="btn-dashboard primary">{"New Proposal"}</button>
|
||||||
|
<button class="btn-dashboard secondary">{"Treasury"}</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="dashboard-metrics">
|
||||||
|
<div class="metric-card">
|
||||||
|
<div class="metric-value">{"$2.4M"}</div>
|
||||||
|
<div class="metric-label">{"Treasury Balance"}</div>
|
||||||
|
<div class="metric-change positive">{"+12.5%"}</div>
|
||||||
|
</div>
|
||||||
|
<div class="metric-card">
|
||||||
|
<div class="metric-value">{"156"}</div>
|
||||||
|
<div class="metric-label">{"Shareholders"}</div>
|
||||||
|
<div class="metric-change positive">{"+8"}</div>
|
||||||
|
</div>
|
||||||
|
<div class="metric-card">
|
||||||
|
<div class="metric-value">{"23"}</div>
|
||||||
|
<div class="metric-label">{"Active Proposals"}</div>
|
||||||
|
<div class="metric-change neutral">{"±0"}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="dashboard-content">
|
||||||
|
<div class="content-section">
|
||||||
|
<h6>{"Recent Activity"}</h6>
|
||||||
|
<div class="activity-list">
|
||||||
|
<div class="activity-item">
|
||||||
|
<div class="activity-icon proposal"></div>
|
||||||
|
<div class="activity-text">{"New proposal: Q4 Budget Allocation"}</div>
|
||||||
|
<div class="activity-time">{"2h ago"}</div>
|
||||||
|
</div>
|
||||||
|
<div class="activity-item">
|
||||||
|
<div class="activity-icon treasury"></div>
|
||||||
|
<div class="activity-text">{"Treasury deposit: $50,000 USDC"}</div>
|
||||||
|
<div class="activity-time">{"4h ago"}</div>
|
||||||
|
</div>
|
||||||
|
<div class="activity-item">
|
||||||
|
<div class="activity-icon vote"></div>
|
||||||
|
<div class="activity-text">{"Proposal passed: Marketing Budget"}</div>
|
||||||
|
<div class="activity-time">{"1d ago"}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<Section
|
||||||
|
content_path="platform/features"
|
||||||
|
animation_class="fade-in"
|
||||||
|
background_class="section section-alt"
|
||||||
|
/>
|
||||||
|
|
||||||
|
// Advanced governance section
|
||||||
|
<section class="section">
|
||||||
|
<div class="container">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-lg-12 text-center mb-5">
|
||||||
|
<h2 class="section-title fade-in animate">{"Advanced Governance"}</h2>
|
||||||
|
<p class="section-subtitle fade-in animate">
|
||||||
|
{"Sophisticated tools for democratic business management and stakeholder engagement"}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-lg-4 mb-4">
|
||||||
|
<div class="feature-card fade-in animate">
|
||||||
|
<div class="feature-icon">
|
||||||
|
{"📊"}
|
||||||
|
</div>
|
||||||
|
<h5>{"Proposal System"}</h5>
|
||||||
|
<p class="text-muted mb-4">
|
||||||
|
{"Create, discuss, and vote on business proposals with transparent tracking and automated execution."}
|
||||||
|
</p>
|
||||||
|
<div class="governance-demo">
|
||||||
|
<div class="proposal-item">
|
||||||
|
<div class="proposal-title">{"Q4 Marketing Budget"}</div>
|
||||||
|
<div class="proposal-status passing">{"Passing"}</div>
|
||||||
|
<div class="vote-bar">
|
||||||
|
<div class="vote-progress" style="width: 78%"></div>
|
||||||
|
</div>
|
||||||
|
<div class="vote-stats">
|
||||||
|
<span>{"78% Yes"}</span>
|
||||||
|
<span>{"22% No"}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-lg-4 mb-4">
|
||||||
|
<div class="feature-card fade-in animate">
|
||||||
|
<div class="feature-icon">
|
||||||
|
{"👥"}
|
||||||
|
</div>
|
||||||
|
<h5>{"Stakeholder Management"}</h5>
|
||||||
|
<p class="text-muted mb-4">
|
||||||
|
{"Manage shareholders, voting rights, and stake distributions with complete transparency."}
|
||||||
|
</p>
|
||||||
|
<div class="stakeholder-demo">
|
||||||
|
<div class="stakeholder-chart">
|
||||||
|
<div class="chart-segment" style="--percentage: 35%; --color: var(--pastel-blue)"></div>
|
||||||
|
<div class="chart-segment" style="--percentage: 25%; --color: var(--pastel-purple)"></div>
|
||||||
|
<div class="chart-segment" style="--percentage: 20%; --color: var(--pastel-green)"></div>
|
||||||
|
<div class="chart-segment" style="--percentage: 20%; --color: var(--pastel-pink)"></div>
|
||||||
|
</div>
|
||||||
|
<div class="chart-legend">
|
||||||
|
<div class="legend-item">
|
||||||
|
<div class="legend-color" style="background: var(--pastel-blue)"></div>
|
||||||
|
<span>{"Founders 35%"}</span>
|
||||||
|
</div>
|
||||||
|
<div class="legend-item">
|
||||||
|
<div class="legend-color" style="background: var(--pastel-purple)"></div>
|
||||||
|
<span>{"Investors 25%"}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-lg-4 mb-4">
|
||||||
|
<div class="feature-card fade-in animate">
|
||||||
|
<div class="feature-icon">
|
||||||
|
{"🔐"}
|
||||||
|
</div>
|
||||||
|
<h5>{"Multi-Sig Treasury"}</h5>
|
||||||
|
<p class="text-muted mb-4">
|
||||||
|
{"Secure treasury management with multi-signature requirements and automated compliance."}
|
||||||
|
</p>
|
||||||
|
<div class="multisig-demo">
|
||||||
|
<div class="transaction-item">
|
||||||
|
<div class="tx-header">
|
||||||
|
<span class="tx-amount">{"$100,000 USDC"}</span>
|
||||||
|
<span class="tx-status pending">{"2/3 Signatures"}</span>
|
||||||
|
</div>
|
||||||
|
<div class="tx-description">{"Marketing Campaign Payment"}</div>
|
||||||
|
<div class="signature-progress">
|
||||||
|
<div class="signature signed">{"✓"}</div>
|
||||||
|
<div class="signature signed">{"✓"}</div>
|
||||||
|
<div class="signature pending">{"⏳"}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
// Integration ecosystem
|
||||||
|
<section class="section section-alt">
|
||||||
|
<div class="container">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-lg-12 text-center mb-5">
|
||||||
|
<h2 class="section-title fade-in animate">{"Integration Ecosystem"}</h2>
|
||||||
|
<p class="section-subtitle fade-in animate">
|
||||||
|
{"Seamlessly connect with external services and blockchain networks"}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-lg-3 col-md-6 mb-4">
|
||||||
|
<div class="integration-card fade-in animate">
|
||||||
|
<div class="integration-icon">{"🔗"}</div>
|
||||||
|
<h6>{"Blockchain Networks"}</h6>
|
||||||
|
<p class="small text-muted">{"Ethereum, Polygon, BSC, Avalanche"}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-lg-3 col-md-6 mb-4">
|
||||||
|
<div class="integration-card fade-in animate">
|
||||||
|
<div class="integration-icon">{"💳"}</div>
|
||||||
|
<h6>{"Payment Gateways"}</h6>
|
||||||
|
<p class="small text-muted">{"Stripe, PayPal, Crypto payments"}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-lg-3 col-md-6 mb-4">
|
||||||
|
<div class="integration-card fade-in animate">
|
||||||
|
<div class="integration-icon">{"📊"}</div>
|
||||||
|
<h6>{"Analytics Tools"}</h6>
|
||||||
|
<p class="small text-muted">{"Google Analytics, Mixpanel, Custom"}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-lg-3 col-md-6 mb-4">
|
||||||
|
<div class="integration-card fade-in animate">
|
||||||
|
<div class="integration-icon">{"🛡️"}</div>
|
||||||
|
<h6>{"Security Services"}</h6>
|
||||||
|
<p class="small text-muted">{"Multi-factor auth, KYC, AML"}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
// Success metrics
|
||||||
|
<section class="section">
|
||||||
|
<div class="container">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-lg-12 text-center mb-5">
|
||||||
|
<h2 class="section-title fade-in animate">{"Platform Success Metrics"}</h2>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-lg-3 col-md-6 mb-4">
|
||||||
|
<div class="text-center fade-in animate">
|
||||||
|
<div class="stat-number counter">{"2850"}</div>
|
||||||
|
<p class="stat-label">{"Active Companies"}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-lg-3 col-md-6 mb-4">
|
||||||
|
<div class="text-center fade-in animate">
|
||||||
|
<div class="stat-number counter">{"45000"}</div>
|
||||||
|
<p class="stat-label">{"Platform Users"}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-lg-3 col-md-6 mb-4">
|
||||||
|
<div class="text-center fade-in animate">
|
||||||
|
<div class="stat-number counter">{"1200000000"}</div>
|
||||||
|
<p class="stat-label">{"Assets Under Management (USD)"}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-lg-3 col-md-6 mb-4">
|
||||||
|
<div class="text-center fade-in animate">
|
||||||
|
<div class="stat-number counter">{"12500"}</div>
|
||||||
|
<p class="stat-label">{"Governance Proposals"}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
// Call to action
|
||||||
|
<section class="section section-alt" id="get-started">
|
||||||
|
<div class="container">
|
||||||
|
<div class="row justify-content-center">
|
||||||
|
<div class="col-lg-8 text-center">
|
||||||
|
<div class="fade-in animate">
|
||||||
|
<h2 class="section-title">{"Ready to Launch Your Digital Company?"}</h2>
|
||||||
|
<p class="section-subtitle">
|
||||||
|
{"Join the future of business management with our comprehensive platform"}
|
||||||
|
</p>
|
||||||
|
<div class="mt-4">
|
||||||
|
<a href="#register" class="btn btn-primary btn-lg me-3">
|
||||||
|
{"Start Building"}
|
||||||
|
</a>
|
||||||
|
<Link<Route> to={Route::Marketplace} classes="btn btn-outline-primary btn-lg">
|
||||||
|
{"Explore Marketplace"}
|
||||||
|
</Link<Route>>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</>
|
||||||
|
}
|
||||||
|
}
|
33
website/src/utils/markdown.rs
Normal file
33
website/src/utils/markdown.rs
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
use pulldown_cmark::{Parser, Options, html};
|
||||||
|
|
||||||
|
pub fn render_markdown(markdown: &str) -> String {
|
||||||
|
let mut options = Options::empty();
|
||||||
|
options.insert(Options::ENABLE_STRIKETHROUGH);
|
||||||
|
options.insert(Options::ENABLE_TABLES);
|
||||||
|
options.insert(Options::ENABLE_FOOTNOTES);
|
||||||
|
|
||||||
|
let parser = Parser::new_ext(markdown, options);
|
||||||
|
let mut html_output = String::new();
|
||||||
|
html::push_html(&mut html_output, parser);
|
||||||
|
html_output
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn extract_title_and_description(markdown: &str) -> (String, String) {
|
||||||
|
let lines: Vec<&str> = markdown.lines().collect();
|
||||||
|
|
||||||
|
let title = lines
|
||||||
|
.iter()
|
||||||
|
.find(|line| line.starts_with("# "))
|
||||||
|
.map(|line| line.replace("# ", ""))
|
||||||
|
.unwrap_or_default();
|
||||||
|
|
||||||
|
let description = lines
|
||||||
|
.iter()
|
||||||
|
.skip_while(|line| line.starts_with("#") || line.trim().is_empty())
|
||||||
|
.take_while(|line| !line.trim().is_empty())
|
||||||
|
.map(|s| s.to_string())
|
||||||
|
.collect::<Vec<String>>()
|
||||||
|
.join(" ");
|
||||||
|
|
||||||
|
(title, description)
|
||||||
|
}
|
31
website/src/utils/mod.rs
Normal file
31
website/src/utils/mod.rs
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
pub mod markdown;
|
||||||
|
|
||||||
|
use pulldown_cmark::{Parser, Options, html};
|
||||||
|
|
||||||
|
pub fn markdown_to_html(markdown: &str) -> String {
|
||||||
|
let mut options = Options::empty();
|
||||||
|
options.insert(Options::ENABLE_STRIKETHROUGH);
|
||||||
|
options.insert(Options::ENABLE_TABLES);
|
||||||
|
options.insert(Options::ENABLE_FOOTNOTES);
|
||||||
|
|
||||||
|
let parser = Parser::new_ext(markdown, options);
|
||||||
|
let mut html_output = String::new();
|
||||||
|
html::push_html(&mut html_output, parser);
|
||||||
|
html_output
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn load_markdown_content(path: &str) -> String {
|
||||||
|
// In a real application, you would load this from the file system
|
||||||
|
// For this demo, we'll return the content based on the path
|
||||||
|
match path {
|
||||||
|
"home/hero" => include_str!("../../content/home/hero.md").to_string(),
|
||||||
|
"home/about" => include_str!("../../content/home/about.md").to_string(),
|
||||||
|
"platform/hero" => include_str!("../../content/platform/hero.md").to_string(),
|
||||||
|
"platform/features" => include_str!("../../content/platform/features.md").to_string(),
|
||||||
|
"marketplace/hero" => include_str!("../../content/marketplace/hero.md").to_string(),
|
||||||
|
"marketplace/features" => include_str!("../../content/marketplace/features.md").to_string(),
|
||||||
|
"defi/hero" => include_str!("../../content/defi/hero.md").to_string(),
|
||||||
|
"defi/features" => include_str!("../../content/defi/features.md").to_string(),
|
||||||
|
_ => "Content not found".to_string(),
|
||||||
|
}
|
||||||
|
}
|
557
website/static/js/animations.js
Normal file
557
website/static/js/animations.js
Normal file
@ -0,0 +1,557 @@
|
|||||||
|
// Advanced animations and interactions for Freezone website
|
||||||
|
class FreezoneAnimations {
|
||||||
|
constructor() {
|
||||||
|
this.init();
|
||||||
|
this.setupInteractiveElements();
|
||||||
|
}
|
||||||
|
|
||||||
|
init() {
|
||||||
|
// Initialize on DOM load
|
||||||
|
if (document.readyState === 'loading') {
|
||||||
|
document.addEventListener('DOMContentLoaded', () => this.onReady());
|
||||||
|
} else {
|
||||||
|
this.onReady();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
onReady() {
|
||||||
|
this.setupNavbarEffects();
|
||||||
|
this.setupSmoothScrolling();
|
||||||
|
this.setupMarketplaceFlow();
|
||||||
|
this.setupOrderbookAnimation();
|
||||||
|
this.setupLiquidityPoolAnimation();
|
||||||
|
this.setupWireframeAnimations();
|
||||||
|
this.setupChartAnimations();
|
||||||
|
this.setupCounterAnimations();
|
||||||
|
}
|
||||||
|
|
||||||
|
setupCounterAnimations() {
|
||||||
|
// Simple counter animation for statistics
|
||||||
|
const counters = document.querySelectorAll('.counter');
|
||||||
|
counters.forEach(counter => {
|
||||||
|
const target = parseInt(counter.textContent.replace(/[^\d]/g, ''));
|
||||||
|
const suffix = counter.textContent.replace(/[\d,]/g, '');
|
||||||
|
let current = 0;
|
||||||
|
const increment = target / 100;
|
||||||
|
const timer = setInterval(() => {
|
||||||
|
current += increment;
|
||||||
|
if (current >= target) {
|
||||||
|
current = target;
|
||||||
|
clearInterval(timer);
|
||||||
|
}
|
||||||
|
counter.textContent = Math.floor(current).toLocaleString() + suffix;
|
||||||
|
}, 20);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
setupObservers() {
|
||||||
|
// Intersection Observer for scroll animations
|
||||||
|
this.observerOptions = {
|
||||||
|
threshold: 0.1,
|
||||||
|
rootMargin: '0px 0px -100px 0px'
|
||||||
|
};
|
||||||
|
|
||||||
|
this.observer = new IntersectionObserver((entries) => {
|
||||||
|
entries.forEach(entry => {
|
||||||
|
if (entry.isIntersecting) {
|
||||||
|
entry.target.classList.add('visible');
|
||||||
|
|
||||||
|
// Trigger specific animations based on element type
|
||||||
|
if (entry.target.classList.contains('counter')) {
|
||||||
|
this.animateCounter(entry.target);
|
||||||
|
}
|
||||||
|
if (entry.target.classList.contains('chart')) {
|
||||||
|
this.animateChart(entry.target);
|
||||||
|
}
|
||||||
|
if (entry.target.classList.contains('wireframe')) {
|
||||||
|
this.animateWireframe(entry.target);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}, this.observerOptions);
|
||||||
|
|
||||||
|
// Observe all animated elements
|
||||||
|
this.observeElements();
|
||||||
|
}
|
||||||
|
|
||||||
|
observeElements() {
|
||||||
|
const animatedElements = document.querySelectorAll(
|
||||||
|
'.fade-in, .slide-in-left, .slide-in-right, .scale-in, .counter, .chart, .wireframe'
|
||||||
|
);
|
||||||
|
animatedElements.forEach(el => {
|
||||||
|
el.classList.add('animate');
|
||||||
|
this.observer.observe(el);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
setupScrollAnimations() {
|
||||||
|
// Add stagger effect to grouped elements
|
||||||
|
const groups = document.querySelectorAll('.row');
|
||||||
|
groups.forEach(group => {
|
||||||
|
const children = group.querySelectorAll('.fade-in, .slide-in-left, .slide-in-right');
|
||||||
|
children.forEach((child, index) => {
|
||||||
|
child.style.transitionDelay = `${index * 0.1}s`;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
setupNavbarEffects() {
|
||||||
|
const navbar = document.querySelector('.navbar');
|
||||||
|
if (!navbar) return;
|
||||||
|
|
||||||
|
let lastScrollY = window.scrollY;
|
||||||
|
let ticking = false;
|
||||||
|
|
||||||
|
const updateNavbar = () => {
|
||||||
|
const scrollY = window.scrollY;
|
||||||
|
|
||||||
|
if (scrollY > 100) {
|
||||||
|
navbar.classList.add('scrolled');
|
||||||
|
} else {
|
||||||
|
navbar.classList.remove('scrolled');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Hide/show navbar on scroll
|
||||||
|
if (scrollY > lastScrollY && scrollY > 200) {
|
||||||
|
navbar.style.transform = 'translateY(-100%)';
|
||||||
|
} else {
|
||||||
|
navbar.style.transform = 'translateY(0)';
|
||||||
|
}
|
||||||
|
|
||||||
|
lastScrollY = scrollY;
|
||||||
|
ticking = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
window.addEventListener('scroll', () => {
|
||||||
|
if (!ticking) {
|
||||||
|
requestAnimationFrame(updateNavbar);
|
||||||
|
ticking = true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
setupSmoothScrolling() {
|
||||||
|
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
|
||||||
|
anchor.addEventListener('click', (e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
const target = document.querySelector(anchor.getAttribute('href'));
|
||||||
|
if (target) {
|
||||||
|
target.scrollIntoView({
|
||||||
|
behavior: 'smooth',
|
||||||
|
block: 'start'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
setupMarketplaceFlow() {
|
||||||
|
const containers = document.querySelectorAll('.marketplace-flow-container');
|
||||||
|
containers.forEach(container => {
|
||||||
|
const items = container.querySelector('.marketplace-items');
|
||||||
|
if (!items) return;
|
||||||
|
|
||||||
|
// Clone items for seamless loop
|
||||||
|
const itemsClone = items.cloneNode(true);
|
||||||
|
container.appendChild(itemsClone);
|
||||||
|
|
||||||
|
// Add hover pause effect
|
||||||
|
container.addEventListener('mouseenter', () => {
|
||||||
|
items.style.animationPlayState = 'paused';
|
||||||
|
itemsClone.style.animationPlayState = 'paused';
|
||||||
|
});
|
||||||
|
|
||||||
|
container.addEventListener('mouseleave', () => {
|
||||||
|
items.style.animationPlayState = 'running';
|
||||||
|
itemsClone.style.animationPlayState = 'running';
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
setupOrderbookAnimation() {
|
||||||
|
const orderbooks = document.querySelectorAll('.orderbook');
|
||||||
|
orderbooks.forEach(orderbook => {
|
||||||
|
this.animateOrderbook(orderbook);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
animateOrderbook(orderbook) {
|
||||||
|
const orders = [
|
||||||
|
{ price: '42,150.00', amount: '0.5432', type: 'buy' },
|
||||||
|
{ price: '42,145.50', amount: '1.2100', type: 'buy' },
|
||||||
|
{ price: '42,140.25', amount: '0.8750', type: 'buy' },
|
||||||
|
{ price: '42,155.75', amount: '0.3200', type: 'sell' },
|
||||||
|
{ price: '42,160.00', amount: '0.9800', type: 'sell' },
|
||||||
|
{ price: '42,165.25', amount: '1.5000', type: 'sell' }
|
||||||
|
];
|
||||||
|
|
||||||
|
let currentIndex = 0;
|
||||||
|
|
||||||
|
const addOrder = () => {
|
||||||
|
if (currentIndex >= orders.length) {
|
||||||
|
currentIndex = 0;
|
||||||
|
orderbook.innerHTML = '<div class="text-center text-muted mb-2">Live Orderbook</div>';
|
||||||
|
}
|
||||||
|
|
||||||
|
const order = orders[currentIndex];
|
||||||
|
const orderRow = document.createElement('div');
|
||||||
|
orderRow.className = `order-row order-${order.type}`;
|
||||||
|
orderRow.innerHTML = `
|
||||||
|
<span>$${order.price}</span>
|
||||||
|
<span>${order.amount} BTC</span>
|
||||||
|
`;
|
||||||
|
|
||||||
|
orderbook.appendChild(orderRow);
|
||||||
|
currentIndex++;
|
||||||
|
|
||||||
|
// Remove old orders to keep it manageable
|
||||||
|
const rows = orderbook.querySelectorAll('.order-row');
|
||||||
|
if (rows.length > 8) {
|
||||||
|
rows[1].remove(); // Keep header
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Add orders periodically
|
||||||
|
setInterval(addOrder, 2000);
|
||||||
|
addOrder(); // Initial order
|
||||||
|
}
|
||||||
|
|
||||||
|
setupLiquidityPoolAnimation() {
|
||||||
|
const pools = document.querySelectorAll('.liquidity-pool');
|
||||||
|
pools.forEach(pool => {
|
||||||
|
this.animateLiquidityPool(pool);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
animateLiquidityPool(pool) {
|
||||||
|
const updatePool = () => {
|
||||||
|
const ethAmount = (Math.random() * 1000 + 500).toFixed(2);
|
||||||
|
const usdcAmount = (Math.random() * 2000000 + 1000000).toFixed(0);
|
||||||
|
const apr = (Math.random() * 20 + 5).toFixed(1);
|
||||||
|
|
||||||
|
pool.innerHTML = `
|
||||||
|
<div class="pool-token">
|
||||||
|
<div class="token-icon" style="background: var(--pastel-blue);"></div>
|
||||||
|
<span>ETH: ${ethAmount}</span>
|
||||||
|
</div>
|
||||||
|
<div class="text-center">
|
||||||
|
<div class="text-success">${apr}% APR</div>
|
||||||
|
</div>
|
||||||
|
<div class="pool-token">
|
||||||
|
<div class="token-icon" style="background: var(--pastel-green);"></div>
|
||||||
|
<span>USDC: ${Number(usdcAmount).toLocaleString()}</span>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
};
|
||||||
|
|
||||||
|
updatePool();
|
||||||
|
setInterval(updatePool, 5000);
|
||||||
|
}
|
||||||
|
|
||||||
|
setupWireframeAnimations() {
|
||||||
|
const wireframes = document.querySelectorAll('.platform-wireframe');
|
||||||
|
wireframes.forEach(wireframe => {
|
||||||
|
this.createWireframeContent(wireframe);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
createWireframeContent(wireframe) {
|
||||||
|
wireframe.innerHTML = `
|
||||||
|
<div class="wireframe-header"></div>
|
||||||
|
<div class="wireframe-content">
|
||||||
|
<div class="wireframe-block"></div>
|
||||||
|
<div class="wireframe-block"></div>
|
||||||
|
<div class="wireframe-block"></div>
|
||||||
|
<div class="wireframe-block"></div>
|
||||||
|
</div>
|
||||||
|
<div class="wireframe-content">
|
||||||
|
<div class="wireframe-block" style="grid-column: 1 / -1; height: 40px;"></div>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
|
||||||
|
animateWireframe(wireframe) {
|
||||||
|
const blocks = wireframe.querySelectorAll('.wireframe-block');
|
||||||
|
blocks.forEach((block, index) => {
|
||||||
|
setTimeout(() => {
|
||||||
|
block.style.background = 'var(--pastel-blue)';
|
||||||
|
setTimeout(() => {
|
||||||
|
block.style.background = 'var(--border-color)';
|
||||||
|
}, 500);
|
||||||
|
}, index * 200);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
setupChartAnimations() {
|
||||||
|
const charts = document.querySelectorAll('.defi-chart');
|
||||||
|
charts.forEach(chart => {
|
||||||
|
this.createChart(chart);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
createChart(chart) {
|
||||||
|
const canvas = document.createElement('canvas');
|
||||||
|
canvas.width = chart.offsetWidth;
|
||||||
|
canvas.height = chart.offsetHeight;
|
||||||
|
chart.appendChild(canvas);
|
||||||
|
|
||||||
|
const ctx = canvas.getContext('2d');
|
||||||
|
this.animateChart(chart, ctx, canvas);
|
||||||
|
}
|
||||||
|
|
||||||
|
animateChart(chart, ctx, canvas) {
|
||||||
|
if (!ctx || !canvas) return;
|
||||||
|
|
||||||
|
const points = [];
|
||||||
|
const numPoints = 50;
|
||||||
|
|
||||||
|
// Generate random chart data
|
||||||
|
for (let i = 0; i < numPoints; i++) {
|
||||||
|
points.push({
|
||||||
|
x: (i / numPoints) * canvas.width,
|
||||||
|
y: Math.random() * canvas.height * 0.6 + canvas.height * 0.2
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
let animationProgress = 0;
|
||||||
|
|
||||||
|
const animate = () => {
|
||||||
|
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
||||||
|
|
||||||
|
// Draw grid
|
||||||
|
ctx.strokeStyle = 'rgba(255, 255, 255, 0.05)';
|
||||||
|
ctx.lineWidth = 1;
|
||||||
|
for (let i = 0; i < 10; i++) {
|
||||||
|
const y = (i / 10) * canvas.height;
|
||||||
|
ctx.beginPath();
|
||||||
|
ctx.moveTo(0, y);
|
||||||
|
ctx.lineTo(canvas.width, y);
|
||||||
|
ctx.stroke();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Draw chart line
|
||||||
|
const gradient = ctx.createLinearGradient(0, 0, canvas.width, 0);
|
||||||
|
gradient.addColorStop(0, '#a7f3d0');
|
||||||
|
gradient.addColorStop(0.5, '#c4b5fd');
|
||||||
|
gradient.addColorStop(1, '#fbb6ce');
|
||||||
|
|
||||||
|
ctx.strokeStyle = gradient;
|
||||||
|
ctx.lineWidth = 3;
|
||||||
|
ctx.beginPath();
|
||||||
|
|
||||||
|
const visiblePoints = Math.floor(animationProgress * points.length);
|
||||||
|
|
||||||
|
for (let i = 0; i < visiblePoints; i++) {
|
||||||
|
if (i === 0) {
|
||||||
|
ctx.moveTo(points[i].x, points[i].y);
|
||||||
|
} else {
|
||||||
|
ctx.lineTo(points[i].x, points[i].y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx.stroke();
|
||||||
|
|
||||||
|
// Fill area under curve
|
||||||
|
ctx.fillStyle = 'rgba(167, 243, 208, 0.1)';
|
||||||
|
ctx.beginPath();
|
||||||
|
ctx.moveTo(points[0].x, canvas.height);
|
||||||
|
for (let i = 0; i < visiblePoints; i++) {
|
||||||
|
ctx.lineTo(points[i].x, points[i].y);
|
||||||
|
}
|
||||||
|
ctx.lineTo(points[visiblePoints - 1]?.x || 0, canvas.height);
|
||||||
|
ctx.closePath();
|
||||||
|
ctx.fill();
|
||||||
|
|
||||||
|
animationProgress += 0.02;
|
||||||
|
if (animationProgress < 1) {
|
||||||
|
requestAnimationFrame(animate);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
animate();
|
||||||
|
}
|
||||||
|
|
||||||
|
setupCounterAnimations() {
|
||||||
|
// Counter animation will be triggered by intersection observer
|
||||||
|
}
|
||||||
|
|
||||||
|
animateCounter(element) {
|
||||||
|
const target = parseInt(element.textContent.replace(/[^\d]/g, ''));
|
||||||
|
const duration = 2000;
|
||||||
|
const start = performance.now();
|
||||||
|
const suffix = element.textContent.replace(/[\d,]/g, '');
|
||||||
|
|
||||||
|
const animate = (currentTime) => {
|
||||||
|
const elapsed = currentTime - start;
|
||||||
|
const progress = Math.min(elapsed / duration, 1);
|
||||||
|
|
||||||
|
// Easing function
|
||||||
|
const easeOut = 1 - Math.pow(1 - progress, 3);
|
||||||
|
const current = Math.floor(target * easeOut);
|
||||||
|
|
||||||
|
element.textContent = current.toLocaleString() + suffix;
|
||||||
|
|
||||||
|
if (progress < 1) {
|
||||||
|
requestAnimationFrame(animate);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
requestAnimationFrame(animate);
|
||||||
|
}
|
||||||
|
|
||||||
|
setupParallaxEffects() {
|
||||||
|
const parallaxElements = document.querySelectorAll('.hero-section');
|
||||||
|
|
||||||
|
window.addEventListener('scroll', () => {
|
||||||
|
const scrolled = window.pageYOffset;
|
||||||
|
|
||||||
|
parallaxElements.forEach(element => {
|
||||||
|
const speed = 0.3;
|
||||||
|
element.style.transform = `translateY(${scrolled * speed}px)`;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
setupInteractiveElements() {
|
||||||
|
// Add hover effects to cards
|
||||||
|
const cards = document.querySelectorAll('.feature-card');
|
||||||
|
cards.forEach(card => {
|
||||||
|
card.addEventListener('mouseenter', () => {
|
||||||
|
card.style.transform = 'translateY(-15px) scale(1.02)';
|
||||||
|
});
|
||||||
|
|
||||||
|
card.addEventListener('mouseleave', () => {
|
||||||
|
card.style.transform = 'translateY(0) scale(1)';
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// Add click ripple effect to buttons
|
||||||
|
const buttons = document.querySelectorAll('.btn');
|
||||||
|
buttons.forEach(button => {
|
||||||
|
button.addEventListener('click', (e) => {
|
||||||
|
const ripple = document.createElement('span');
|
||||||
|
const rect = button.getBoundingClientRect();
|
||||||
|
const size = Math.max(rect.width, rect.height);
|
||||||
|
const x = e.clientX - rect.left - size / 2;
|
||||||
|
const y = e.clientY - rect.top - size / 2;
|
||||||
|
|
||||||
|
ripple.style.cssText = `
|
||||||
|
position: absolute;
|
||||||
|
width: ${size}px;
|
||||||
|
height: ${size}px;
|
||||||
|
left: ${x}px;
|
||||||
|
top: ${y}px;
|
||||||
|
background: rgba(255, 255, 255, 0.3);
|
||||||
|
border-radius: 50%;
|
||||||
|
transform: scale(0);
|
||||||
|
animation: ripple 0.6s ease-out;
|
||||||
|
pointer-events: none;
|
||||||
|
`;
|
||||||
|
|
||||||
|
button.style.position = 'relative';
|
||||||
|
button.style.overflow = 'hidden';
|
||||||
|
button.appendChild(ripple);
|
||||||
|
|
||||||
|
setTimeout(() => ripple.remove(), 600);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
setupParticleSystem() {
|
||||||
|
const heroSections = document.querySelectorAll('.hero-section');
|
||||||
|
heroSections.forEach(section => {
|
||||||
|
this.createParticles(section);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
createParticles(container) {
|
||||||
|
const canvas = document.createElement('canvas');
|
||||||
|
canvas.style.position = 'absolute';
|
||||||
|
canvas.style.top = '0';
|
||||||
|
canvas.style.left = '0';
|
||||||
|
canvas.style.width = '100%';
|
||||||
|
canvas.style.height = '100%';
|
||||||
|
canvas.style.pointerEvents = 'none';
|
||||||
|
canvas.style.zIndex = '1';
|
||||||
|
|
||||||
|
container.appendChild(canvas);
|
||||||
|
|
||||||
|
const ctx = canvas.getContext('2d');
|
||||||
|
const particles = [];
|
||||||
|
|
||||||
|
const resizeCanvas = () => {
|
||||||
|
canvas.width = container.offsetWidth;
|
||||||
|
canvas.height = container.offsetHeight;
|
||||||
|
};
|
||||||
|
|
||||||
|
resizeCanvas();
|
||||||
|
window.addEventListener('resize', resizeCanvas);
|
||||||
|
|
||||||
|
// Create particles
|
||||||
|
for (let i = 0; i < 50; i++) {
|
||||||
|
particles.push({
|
||||||
|
x: Math.random() * canvas.width,
|
||||||
|
y: Math.random() * canvas.height,
|
||||||
|
vx: (Math.random() - 0.5) * 0.5,
|
||||||
|
vy: (Math.random() - 0.5) * 0.5,
|
||||||
|
size: Math.random() * 2 + 1,
|
||||||
|
opacity: Math.random() * 0.5 + 0.1
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const animate = () => {
|
||||||
|
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
||||||
|
|
||||||
|
particles.forEach(particle => {
|
||||||
|
particle.x += particle.vx;
|
||||||
|
particle.y += particle.vy;
|
||||||
|
|
||||||
|
// Wrap around edges
|
||||||
|
if (particle.x < 0) particle.x = canvas.width;
|
||||||
|
if (particle.x > canvas.width) particle.x = 0;
|
||||||
|
if (particle.y < 0) particle.y = canvas.height;
|
||||||
|
if (particle.y > canvas.height) particle.y = 0;
|
||||||
|
|
||||||
|
// Draw particle
|
||||||
|
ctx.beginPath();
|
||||||
|
ctx.arc(particle.x, particle.y, particle.size, 0, Math.PI * 2);
|
||||||
|
ctx.fillStyle = `rgba(167, 243, 208, ${particle.opacity})`;
|
||||||
|
ctx.fill();
|
||||||
|
});
|
||||||
|
|
||||||
|
requestAnimationFrame(animate);
|
||||||
|
};
|
||||||
|
|
||||||
|
animate();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Public method to reinitialize animations (for SPA navigation)
|
||||||
|
reinitialize() {
|
||||||
|
this.observeElements();
|
||||||
|
this.setupMarketplaceFlow();
|
||||||
|
this.setupOrderbookAnimation();
|
||||||
|
this.setupLiquidityPoolAnimation();
|
||||||
|
this.setupWireframeAnimations();
|
||||||
|
this.setupChartAnimations();
|
||||||
|
this.setupParticleSystem();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add CSS for ripple animation
|
||||||
|
const style = document.createElement('style');
|
||||||
|
style.textContent = `
|
||||||
|
@keyframes ripple {
|
||||||
|
to {
|
||||||
|
transform: scale(2);
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
document.head.appendChild(style);
|
||||||
|
|
||||||
|
// Initialize animations
|
||||||
|
const freezoneAnimations = new FreezoneAnimations();
|
||||||
|
|
||||||
|
// Export for use in Yew components
|
||||||
|
window.freezoneAnimations = freezoneAnimations;
|
||||||
|
window.reinitializeAnimations = () => freezoneAnimations.reinitialize();
|
3312
website/styles/main.css
Normal file
3312
website/styles/main.css
Normal file
File diff suppressed because it is too large
Load Diff
954
website/styles/main.scss
Normal file
954
website/styles/main.scss
Normal file
@ -0,0 +1,954 @@
|
|||||||
|
// Custom variables
|
||||||
|
:root {
|
||||||
|
--primary-color: #6366f1;
|
||||||
|
--secondary-color: #8b5cf6;
|
||||||
|
--accent-color: #06b6d4;
|
||||||
|
--success-color: #10b981;
|
||||||
|
--warning-color: #f59e0b;
|
||||||
|
--danger-color: #ef4444;
|
||||||
|
--dark-bg: #0f172a;
|
||||||
|
--darker-bg: #020617;
|
||||||
|
--light-text: #f8fafc;
|
||||||
|
--muted-text: #94a3b8;
|
||||||
|
--border-color: #334155;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Dark theme by default
|
||||||
|
body {
|
||||||
|
background-color: var(--dark-bg);
|
||||||
|
color: var(--light-text);
|
||||||
|
font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
||||||
|
line-height: 1.6;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Custom scrollbar
|
||||||
|
::-webkit-scrollbar {
|
||||||
|
width: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
::-webkit-scrollbar-track {
|
||||||
|
background: var(--darker-bg);
|
||||||
|
}
|
||||||
|
|
||||||
|
::-webkit-scrollbar-thumb {
|
||||||
|
background: var(--border-color);
|
||||||
|
border-radius: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
::-webkit-scrollbar-thumb:hover {
|
||||||
|
background: var(--muted-text);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Header styles
|
||||||
|
.navbar {
|
||||||
|
background-color: rgba(15, 23, 42, 0.95) !important;
|
||||||
|
backdrop-filter: blur(10px);
|
||||||
|
border-bottom: 1px solid var(--border-color);
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.navbar-brand {
|
||||||
|
font-weight: 700;
|
||||||
|
font-size: 1.5rem;
|
||||||
|
background: linear-gradient(135deg, var(--primary-color), var(--secondary-color));
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
background-clip: text;
|
||||||
|
}
|
||||||
|
|
||||||
|
.navbar-nav .nav-link {
|
||||||
|
color: var(--light-text) !important;
|
||||||
|
font-weight: 500;
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
position: relative;
|
||||||
|
margin: 0 1.5rem;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: var(--primary-color) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
&::after {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
bottom: -5px;
|
||||||
|
left: 50%;
|
||||||
|
width: 0;
|
||||||
|
height: 2px;
|
||||||
|
background: linear-gradient(135deg, var(--primary-color), var(--secondary-color));
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
transform: translateX(-50%);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover::after {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Button styles
|
||||||
|
.btn-primary {
|
||||||
|
background: linear-gradient(135deg, var(--primary-color), var(--secondary-color));
|
||||||
|
border: none;
|
||||||
|
border-radius: 8px;
|
||||||
|
padding: 12px 24px;
|
||||||
|
font-weight: 600;
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
transform: translateY(-2px);
|
||||||
|
box-shadow: 0 10px 25px rgba(99, 102, 241, 0.3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-outline-primary {
|
||||||
|
border: 2px solid var(--primary-color);
|
||||||
|
color: var(--primary-color);
|
||||||
|
background: transparent;
|
||||||
|
border-radius: 8px;
|
||||||
|
padding: 10px 22px;
|
||||||
|
font-weight: 600;
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background: var(--primary-color);
|
||||||
|
color: white;
|
||||||
|
transform: translateY(-2px);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Hero section
|
||||||
|
.hero-section {
|
||||||
|
min-height: 100vh;
|
||||||
|
background: linear-gradient(135deg, var(--darker-bg) 0%, var(--dark-bg) 100%);
|
||||||
|
position: relative;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
|
&::before {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
background: radial-gradient(circle at 30% 20%, rgba(99, 102, 241, 0.1) 0%, transparent 50%),
|
||||||
|
radial-gradient(circle at 70% 80%, rgba(139, 92, 246, 0.1) 0%, transparent 50%);
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.hero-content {
|
||||||
|
position: relative;
|
||||||
|
z-index: 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hero-title {
|
||||||
|
font-size: 4rem;
|
||||||
|
font-weight: 800;
|
||||||
|
background: linear-gradient(135deg, var(--light-text), var(--muted-text));
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
background-clip: text;
|
||||||
|
margin-bottom: 1.5rem;
|
||||||
|
|
||||||
|
@media (max-width: 768px) {
|
||||||
|
font-size: 2.5rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.hero-subtitle {
|
||||||
|
font-size: 1.25rem;
|
||||||
|
color: var(--muted-text);
|
||||||
|
margin-bottom: 2rem;
|
||||||
|
max-width: 600px;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Section styles
|
||||||
|
.section {
|
||||||
|
padding: 100px 0;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.section-title {
|
||||||
|
font-size: 2.5rem;
|
||||||
|
font-weight: 700;
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
background: linear-gradient(135deg, var(--light-text), var(--muted-text));
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
background-clip: text;
|
||||||
|
}
|
||||||
|
|
||||||
|
.section-subtitle {
|
||||||
|
font-size: 1.1rem;
|
||||||
|
color: var(--muted-text);
|
||||||
|
margin-bottom: 3rem;
|
||||||
|
max-width: 600px;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Card styles
|
||||||
|
.feature-card {
|
||||||
|
background: rgba(51, 65, 85, 0.1);
|
||||||
|
border: 1px solid var(--border-color);
|
||||||
|
border-radius: 16px;
|
||||||
|
padding: 2rem;
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
backdrop-filter: blur(10px);
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
transform: translateY(-10px);
|
||||||
|
border-color: var(--primary-color);
|
||||||
|
box-shadow: 0 20px 40px rgba(0, 0, 0, 0.3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.feature-icon {
|
||||||
|
width: 60px;
|
||||||
|
height: 60px;
|
||||||
|
background: linear-gradient(135deg, var(--primary-color), var(--secondary-color));
|
||||||
|
border-radius: 12px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
margin-bottom: 1.5rem;
|
||||||
|
font-size: 1.5rem;
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Marketplace animation
|
||||||
|
.marketplace-items {
|
||||||
|
display: flex;
|
||||||
|
gap: 1rem;
|
||||||
|
animation: flow 20s linear infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
.marketplace-item {
|
||||||
|
min-width: 200px;
|
||||||
|
background: rgba(51, 65, 85, 0.2);
|
||||||
|
border: 1px solid var(--border-color);
|
||||||
|
border-radius: 12px;
|
||||||
|
padding: 1rem;
|
||||||
|
backdrop-filter: blur(10px);
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes flow {
|
||||||
|
0% {
|
||||||
|
transform: translateX(0);
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
transform: translateX(-100%);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Scroll animations
|
||||||
|
.fade-in {
|
||||||
|
opacity: 0;
|
||||||
|
transform: translateY(30px);
|
||||||
|
transition: all 0.8s ease;
|
||||||
|
|
||||||
|
&.visible {
|
||||||
|
opacity: 1;
|
||||||
|
transform: translateY(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.slide-in-left {
|
||||||
|
opacity: 0;
|
||||||
|
transform: translateX(-50px);
|
||||||
|
transition: all 0.8s ease;
|
||||||
|
|
||||||
|
&.visible {
|
||||||
|
opacity: 1;
|
||||||
|
transform: translateX(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.slide-in-right {
|
||||||
|
opacity: 0;
|
||||||
|
transform: translateX(50px);
|
||||||
|
transition: all 0.8s ease;
|
||||||
|
|
||||||
|
&.visible {
|
||||||
|
opacity: 1;
|
||||||
|
transform: translateX(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Footer
|
||||||
|
.footer {
|
||||||
|
background-color: var(--darker-bg);
|
||||||
|
border-top: 1px solid var(--border-color);
|
||||||
|
padding: 3rem 0;
|
||||||
|
margin-top: 5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Asset showcase styles
|
||||||
|
.asset-showcase {
|
||||||
|
padding: 2rem 0;
|
||||||
|
|
||||||
|
|
||||||
|
h3 {
|
||||||
|
font-size: 2rem;
|
||||||
|
font-weight: 700;
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
color: var(--light-text);
|
||||||
|
}
|
||||||
|
|
||||||
|
.lead {
|
||||||
|
font-size: 1.2rem;
|
||||||
|
color: var(--muted-text);
|
||||||
|
margin-bottom: 2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.feature-list {
|
||||||
|
list-style: none;
|
||||||
|
padding: 0;
|
||||||
|
|
||||||
|
li {
|
||||||
|
padding: 0.5rem 0;
|
||||||
|
color: var(--light-text);
|
||||||
|
font-size: 1.1rem;
|
||||||
|
|
||||||
|
&::before {
|
||||||
|
content: '';
|
||||||
|
display: inline-block;
|
||||||
|
width: 4px;
|
||||||
|
height: 4px;
|
||||||
|
background: var(--primary-color);
|
||||||
|
border-radius: 50%;
|
||||||
|
margin-right: 1rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.asset-visual {
|
||||||
|
padding: 2rem;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Property tokenization demo
|
||||||
|
.tokenization-demo {
|
||||||
|
.property-card {
|
||||||
|
background: rgba(51, 65, 85, 0.2);
|
||||||
|
border: 1px solid var(--border-color);
|
||||||
|
border-radius: 16px;
|
||||||
|
padding: 1.5rem;
|
||||||
|
backdrop-filter: blur(10px);
|
||||||
|
max-width: 300px;
|
||||||
|
|
||||||
|
.property-image {
|
||||||
|
height: 120px;
|
||||||
|
background: linear-gradient(135deg, var(--primary-color), var(--secondary-color));
|
||||||
|
border-radius: 8px;
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
&::after {
|
||||||
|
content: '🏢';
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
font-size: 2rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.property-details {
|
||||||
|
h5 {
|
||||||
|
color: var(--light-text);
|
||||||
|
margin-bottom: 0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
color: var(--muted-text);
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.progress {
|
||||||
|
height: 8px;
|
||||||
|
background: rgba(51, 65, 85, 0.5);
|
||||||
|
border-radius: 4px;
|
||||||
|
margin-bottom: 0.5rem;
|
||||||
|
|
||||||
|
.progress-bar {
|
||||||
|
background: linear-gradient(135deg, var(--success-color), var(--accent-color));
|
||||||
|
border-radius: 4px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
small {
|
||||||
|
color: var(--success-color);
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Service demo
|
||||||
|
.service-demo {
|
||||||
|
.service-card {
|
||||||
|
background: rgba(51, 65, 85, 0.2);
|
||||||
|
border: 1px solid var(--border-color);
|
||||||
|
border-radius: 16px;
|
||||||
|
padding: 1.5rem;
|
||||||
|
backdrop-filter: blur(10px);
|
||||||
|
max-width: 320px;
|
||||||
|
|
||||||
|
.service-provider {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
margin-bottom: 1.5rem;
|
||||||
|
|
||||||
|
.provider-avatar {
|
||||||
|
width: 50px;
|
||||||
|
height: 50px;
|
||||||
|
background: linear-gradient(135deg, var(--secondary-color), var(--primary-color));
|
||||||
|
border-radius: 50%;
|
||||||
|
margin-right: 1rem;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
&::after {
|
||||||
|
content: '👨💼';
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
font-size: 1.5rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.provider-info {
|
||||||
|
h6 {
|
||||||
|
color: var(--light-text);
|
||||||
|
margin-bottom: 0.25rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
color: var(--muted-text);
|
||||||
|
font-size: 0.9rem;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.service-contract {
|
||||||
|
.contract-status {
|
||||||
|
background: var(--success-color);
|
||||||
|
color: white;
|
||||||
|
padding: 0.5rem 1rem;
|
||||||
|
border-radius: 20px;
|
||||||
|
font-size: 0.8rem;
|
||||||
|
font-weight: 600;
|
||||||
|
display: inline-block;
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.milestones {
|
||||||
|
.milestone {
|
||||||
|
padding: 0.5rem 0;
|
||||||
|
color: var(--muted-text);
|
||||||
|
|
||||||
|
&.completed {
|
||||||
|
color: var(--success-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
&.active {
|
||||||
|
color: var(--warning-color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Digital assets demo
|
||||||
|
.digital-assets-demo {
|
||||||
|
.asset-grid {
|
||||||
|
display: grid;
|
||||||
|
gap: 1rem;
|
||||||
|
|
||||||
|
.digital-asset {
|
||||||
|
background: rgba(51, 65, 85, 0.2);
|
||||||
|
border: 1px solid var(--border-color);
|
||||||
|
border-radius: 12px;
|
||||||
|
padding: 1rem;
|
||||||
|
backdrop-filter: blur(10px);
|
||||||
|
|
||||||
|
.asset-type {
|
||||||
|
background: var(--primary-color);
|
||||||
|
color: white;
|
||||||
|
padding: 0.25rem 0.75rem;
|
||||||
|
border-radius: 12px;
|
||||||
|
font-size: 0.8rem;
|
||||||
|
font-weight: 600;
|
||||||
|
display: inline-block;
|
||||||
|
margin-bottom: 0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
h6 {
|
||||||
|
color: var(--light-text);
|
||||||
|
margin-bottom: 0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
color: var(--muted-text);
|
||||||
|
font-size: 0.9rem;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Responsive
|
||||||
|
@media (max-width: 768px) {
|
||||||
|
.section {
|
||||||
|
padding: 60px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.section-title {
|
||||||
|
font-size: 2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.feature-card {
|
||||||
|
margin-bottom: 2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.asset-showcase {
|
||||||
|
text-align: center;
|
||||||
|
margin-bottom: 3rem;
|
||||||
|
|
||||||
|
|
||||||
|
h3 {
|
||||||
|
font-size: 1.5rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.asset-visual {
|
||||||
|
margin-bottom: 2rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Enhanced Asset Digitalization Styles
|
||||||
|
.asset-showcase {
|
||||||
|
padding: 2rem 0;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
|
||||||
|
h3 {
|
||||||
|
font-size: 2.5rem;
|
||||||
|
font-weight: 700;
|
||||||
|
margin-bottom: 1.5rem;
|
||||||
|
color: var(--light-text);
|
||||||
|
background: linear-gradient(135deg, var(--light-text), var(--primary-color));
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
background-clip: text;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lead {
|
||||||
|
font-size: 1.25rem;
|
||||||
|
color: var(--muted-text);
|
||||||
|
margin-bottom: 2rem;
|
||||||
|
line-height: 1.6;
|
||||||
|
}
|
||||||
|
|
||||||
|
.feature-list {
|
||||||
|
list-style: none;
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
|
||||||
|
li {
|
||||||
|
padding: 0.75rem 0;
|
||||||
|
color: var(--muted-text);
|
||||||
|
font-size: 1.1rem;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: var(--light-text);
|
||||||
|
transform: translateX(5px);
|
||||||
|
}
|
||||||
|
|
||||||
|
&::before {
|
||||||
|
content: '';
|
||||||
|
display: inline-block;
|
||||||
|
width: 6px;
|
||||||
|
height: 6px;
|
||||||
|
background: var(--success-color);
|
||||||
|
border-radius: 50%;
|
||||||
|
margin-right: 1rem;
|
||||||
|
box-shadow: 0 0 8px var(--success-color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.asset-visual {
|
||||||
|
padding: 2rem;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Enhanced Property Tokenization Demo
|
||||||
|
.tokenization-demo {
|
||||||
|
width: 100%;
|
||||||
|
max-width: 400px;
|
||||||
|
|
||||||
|
.property-card {
|
||||||
|
background: rgba(51, 65, 85, 0.1);
|
||||||
|
border: 1px solid var(--border-color);
|
||||||
|
border-radius: 20px;
|
||||||
|
padding: 2rem;
|
||||||
|
backdrop-filter: blur(15px);
|
||||||
|
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
|
||||||
|
position: relative;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
|
&::before {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
height: 2px;
|
||||||
|
background: linear-gradient(90deg, transparent, var(--primary-color), transparent);
|
||||||
|
opacity: 0;
|
||||||
|
transition: opacity 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
transform: translateY(-5px);
|
||||||
|
border-color: var(--primary-color);
|
||||||
|
box-shadow: 0 20px 40px rgba(0, 0, 0, 0.3);
|
||||||
|
|
||||||
|
&::before {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.property-image {
|
||||||
|
height: 140px;
|
||||||
|
background: linear-gradient(135deg, var(--primary-color), var(--secondary-color));
|
||||||
|
border-radius: 12px;
|
||||||
|
margin-bottom: 1.5rem;
|
||||||
|
position: relative;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
font-size: 3rem;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
|
&::after {
|
||||||
|
content: '🏢';
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
font-size: 3rem;
|
||||||
|
filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.3));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.property-details {
|
||||||
|
h5 {
|
||||||
|
color: var(--light-text);
|
||||||
|
margin-bottom: 0.75rem;
|
||||||
|
font-weight: 600;
|
||||||
|
font-size: 1.2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
color: var(--muted-text);
|
||||||
|
margin-bottom: 1.5rem;
|
||||||
|
font-size: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.progress {
|
||||||
|
height: 10px;
|
||||||
|
background: rgba(51, 65, 85, 0.5);
|
||||||
|
border-radius: 5px;
|
||||||
|
margin-bottom: 0.75rem;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
|
.progress-bar {
|
||||||
|
background: linear-gradient(90deg, var(--success-color), var(--accent-color));
|
||||||
|
border-radius: 5px;
|
||||||
|
transition: width 0.3s ease;
|
||||||
|
box-shadow: 0 0 10px rgba(16, 185, 129, 0.5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
small {
|
||||||
|
color: var(--success-color);
|
||||||
|
font-weight: 600;
|
||||||
|
font-size: 0.9rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Enhanced Service Demo
|
||||||
|
.service-demo {
|
||||||
|
width: 100%;
|
||||||
|
max-width: 400px;
|
||||||
|
|
||||||
|
.service-card {
|
||||||
|
background: rgba(51, 65, 85, 0.1);
|
||||||
|
border: 1px solid var(--border-color);
|
||||||
|
border-radius: 20px;
|
||||||
|
padding: 2rem;
|
||||||
|
backdrop-filter: blur(15px);
|
||||||
|
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
|
||||||
|
position: relative;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
|
&::before {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
height: 2px;
|
||||||
|
background: linear-gradient(90deg, transparent, var(--secondary-color), transparent);
|
||||||
|
opacity: 0;
|
||||||
|
transition: opacity 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
transform: translateY(-5px);
|
||||||
|
border-color: var(--secondary-color);
|
||||||
|
box-shadow: 0 20px 40px rgba(0, 0, 0, 0.3);
|
||||||
|
|
||||||
|
&::before {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.service-provider {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
margin-bottom: 1.5rem;
|
||||||
|
padding-bottom: 1rem;
|
||||||
|
border-bottom: 1px solid var(--border-color);
|
||||||
|
|
||||||
|
.provider-avatar {
|
||||||
|
width: 60px;
|
||||||
|
height: 60px;
|
||||||
|
background: linear-gradient(135deg, var(--secondary-color), var(--primary-color));
|
||||||
|
border-radius: 50%;
|
||||||
|
margin-right: 1rem;
|
||||||
|
position: relative;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
font-size: 2rem;
|
||||||
|
box-shadow: 0 4px 15px rgba(139, 92, 246, 0.3);
|
||||||
|
|
||||||
|
&::after {
|
||||||
|
content: '👨💼';
|
||||||
|
filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.3));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.provider-info {
|
||||||
|
h6 {
|
||||||
|
color: var(--light-text);
|
||||||
|
margin-bottom: 0.25rem;
|
||||||
|
font-weight: 600;
|
||||||
|
font-size: 1.1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
color: var(--muted-text);
|
||||||
|
font-size: 0.9rem;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.service-contract {
|
||||||
|
.contract-status {
|
||||||
|
background: var(--success-color);
|
||||||
|
color: white;
|
||||||
|
padding: 0.5rem 1rem;
|
||||||
|
border-radius: 20px;
|
||||||
|
font-size: 0.85rem;
|
||||||
|
font-weight: 600;
|
||||||
|
display: inline-block;
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
box-shadow: 0 2px 8px rgba(16, 185, 129, 0.3);
|
||||||
|
|
||||||
|
&.active {
|
||||||
|
background: var(--success-color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.milestones {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 0.5rem;
|
||||||
|
|
||||||
|
.milestone {
|
||||||
|
padding: 0.75rem 1rem;
|
||||||
|
border-radius: 8px;
|
||||||
|
font-size: 0.9rem;
|
||||||
|
font-weight: 500;
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
|
||||||
|
&.completed {
|
||||||
|
background: rgba(16, 185, 129, 0.1);
|
||||||
|
color: var(--success-color);
|
||||||
|
border-left: 3px solid var(--success-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
&.active {
|
||||||
|
background: rgba(245, 158, 11, 0.1);
|
||||||
|
color: var(--warning-color);
|
||||||
|
border-left: 3px solid var(--warning-color);
|
||||||
|
animation: pulse 2s infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.pending {
|
||||||
|
background: rgba(51, 65, 85, 0.1);
|
||||||
|
color: var(--muted-text);
|
||||||
|
border-left: 3px solid var(--border-color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Enhanced Digital Assets Demo
|
||||||
|
.digital-assets-demo {
|
||||||
|
width: 100%;
|
||||||
|
max-width: 450px;
|
||||||
|
|
||||||
|
.asset-grid {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: 1fr;
|
||||||
|
gap: 1rem;
|
||||||
|
|
||||||
|
.digital-asset {
|
||||||
|
background: rgba(51, 65, 85, 0.1);
|
||||||
|
border: 1px solid var(--border-color);
|
||||||
|
border-radius: 16px;
|
||||||
|
padding: 1.5rem;
|
||||||
|
backdrop-filter: blur(10px);
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
position: relative;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
|
&::before {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
height: 1px;
|
||||||
|
background: linear-gradient(90deg, transparent, var(--primary-color), transparent);
|
||||||
|
opacity: 0;
|
||||||
|
transition: opacity 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
transform: translateY(-3px);
|
||||||
|
border-color: var(--primary-color);
|
||||||
|
box-shadow: 0 10px 25px rgba(0, 0, 0, 0.2);
|
||||||
|
|
||||||
|
&::before {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.asset-type {
|
||||||
|
background: linear-gradient(135deg, var(--primary-color), var(--secondary-color));
|
||||||
|
color: white;
|
||||||
|
padding: 0.4rem 1rem;
|
||||||
|
border-radius: 20px;
|
||||||
|
font-size: 0.8rem;
|
||||||
|
font-weight: 600;
|
||||||
|
display: inline-block;
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
text-transform: uppercase;
|
||||||
|
letter-spacing: 0.5px;
|
||||||
|
box-shadow: 0 2px 8px rgba(99, 102, 241, 0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
h6 {
|
||||||
|
color: var(--light-text);
|
||||||
|
margin-bottom: 0.75rem;
|
||||||
|
font-weight: 600;
|
||||||
|
font-size: 1.1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
color: var(--muted-text);
|
||||||
|
font-size: 0.95rem;
|
||||||
|
margin: 0;
|
||||||
|
line-height: 1.4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Enhanced responsive styles for asset digitalization
|
||||||
|
@media (max-width: 768px) {
|
||||||
|
.asset-showcase {
|
||||||
|
text-align: center;
|
||||||
|
margin-bottom: 3rem;
|
||||||
|
|
||||||
|
|
||||||
|
h3 {
|
||||||
|
font-size: 2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lead {
|
||||||
|
font-size: 1.1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.feature-list li {
|
||||||
|
font-size: 1rem;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.asset-visual {
|
||||||
|
margin-bottom: 2rem;
|
||||||
|
padding: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.property-card,
|
||||||
|
.service-card,
|
||||||
|
.digital-assets-demo {
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 576px) {
|
||||||
|
.asset-showcase {
|
||||||
|
padding: 1rem 0;
|
||||||
|
|
||||||
|
|
||||||
|
h3 {
|
||||||
|
font-size: 1.75rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lead {
|
||||||
|
font-size: 1rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.property-card,
|
||||||
|
.service-card {
|
||||||
|
padding: 1.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.digital-asset {
|
||||||
|
padding: 1.25rem;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user