Merge pull request #74 from oib/feature/website-cleanup

chore: cleanup website files
This commit is contained in:
Andreas Michael Fleckl
2026-04-21 21:23:01 +02:00
committed by GitHub
22 changed files with 616 additions and 265 deletions

View File

@@ -21,10 +21,18 @@ body.dark {
--global-header-cta-text: #0f172a;
}
body.light {
--global-header-bg: rgba(255, 255, 255, 0.97);
--global-header-border: rgba(15, 23, 42, 0.08);
--global-header-text: #111827;
--global-header-muted: #6b7280;
--global-header-pill: rgba(37, 99, 235, 0.07);
--global-header-pill-hover: rgba(37, 99, 235, 0.15);
--global-header-accent: #2563eb;
--global-header-cta-text: #fff;
}
.global-header {
height: 90px;
box-sizing: border-box;
position: sticky;
top: 0;
width: 100%;
@@ -35,13 +43,13 @@ body.dark {
}
.global-header__inner {
max-width: 1160px;
max-width: 1200px;
margin: 0 auto;
padding: 0 1.25rem;
height: 100%;
padding: 0.85rem 1.25rem;
display: flex;
align-items: center;
gap: 1.25rem;
flex-wrap: wrap;
justify-content: space-between;
}
@@ -127,10 +135,27 @@ body.dark {
flex-wrap: wrap;
}
.global-dark-toggle {
border: 1px solid var(--global-header-border);
background: transparent;
color: var(--global-header-text);
padding: 0.35rem 0.9rem;
border-radius: 999px;
font-size: 0.9rem;
display: inline-flex;
align-items: center;
gap: 0.35rem;
cursor: pointer;
transition: all 0.2s ease;
}
.global-dark-toggle:hover {
border-color: var(--global-header-accent);
color: var(--global-header-accent);
}
.global-subnav {
max-width: 1160px;
max-width: 1200px;
margin: 0 auto;
padding: 0 1.25rem 0.75rem;
display: flex;
@@ -159,18 +184,10 @@ body.dark {
color: var(--global-header-accent);
}
@media (max-width: 960px) {
.global-header {
height: auto;
min-height: 90px;
padding: 1rem 0;
}
.global-header__inner {
flex-direction: column;
align-items: flex-start;
height: auto;
}
.global-header__actions {
@@ -182,6 +199,7 @@ body.dark {
width: 100%;
}
}
@media (max-width: 640px) {
.global-brand__text span {
font-size: 1rem;

View File

@@ -1,12 +1,4 @@
(function () {
// Always enforce dark theme
document.documentElement.setAttribute('data-theme', 'dark');
document.documentElement.classList.add('dark');
// Clean up any old user preferences
if (localStorage.getItem('theme')) localStorage.removeItem('theme');
if (localStorage.getItem('exchangeTheme')) localStorage.removeItem('exchangeTheme');
const NAV_ITEMS = [
{ key: 'home', label: 'Home', href: '/' },
{ key: 'explorer', label: 'Explorer', href: '/explorer/' },
@@ -15,6 +7,8 @@
{ key: 'docs', label: 'Docs', href: '/docs/index.html' },
];
const CTA = { label: 'Launch Marketplace', href: '/marketplace/' };
function determineActiveKey(pathname) {
if (pathname.startsWith('/explorer')) return 'explorer';
if (pathname.startsWith('/marketplace')) return 'marketplace';
@@ -42,11 +36,64 @@
</div>
</a>
<nav class="global-nav">${navLinks}</nav>
<div class="global-header__actions">
<button type="button" class="global-dark-toggle" data-role="global-theme-toggle">
<span class="global-dark-toggle__emoji">🌙</span>
<span class="global-dark-toggle__text">Dark</span>
</button>
<a href="${CTA.href}" class="global-nav__cta">${CTA.label}</a>
</div>
</div>
</header>
`;
}
function getCurrentTheme() {
if (document.documentElement.hasAttribute('data-theme')) {
return document.documentElement.getAttribute('data-theme');
}
if (document.documentElement.classList.contains('dark')) return 'dark';
if (document.body && document.body.classList.contains('light')) return 'light';
return 'light';
}
function updateToggleLabel(theme) {
const emojiEl = document.querySelector('.global-dark-toggle__emoji');
const textEl = document.querySelector('.global-dark-toggle__text');
if (!emojiEl || !textEl) return;
if (theme === 'dark') {
emojiEl.textContent = '🌙';
textEl.textContent = 'Dark';
} else {
emojiEl.textContent = '☀️';
textEl.textContent = 'Light';
}
}
function bindThemeToggle() {
const toggle = document.querySelector('[data-role="global-theme-toggle"]');
if (!toggle) return;
toggle.addEventListener('click', () => {
if (typeof window.toggleDarkMode === 'function') {
window.toggleDarkMode();
} else if (typeof window.toggleTheme === 'function') {
window.toggleTheme();
} else {
const isDark = document.documentElement.classList.toggle('dark');
if (isDark) {
document.documentElement.setAttribute('data-theme', 'dark');
} else {
document.documentElement.removeAttribute('data-theme');
}
}
setTimeout(() => updateToggleLabel(getCurrentTheme()), 0);
});
updateToggleLabel(getCurrentTheme());
}
function initHeader() {
const activeKey = determineActiveKey(window.location.pathname);
const headerHTML = buildHeader(activeKey);
@@ -59,6 +106,8 @@
} else {
document.body.insertAdjacentHTML('afterbegin', headerHTML);
}
bindThemeToggle();
}
if (document.readyState === 'loading') {

View File

@@ -37,6 +37,78 @@ document.querySelectorAll('.feature-card, .arch-component').forEach(el => {
observer.observe(el);
});
// Dark mode functionality with enhanced persistence and system preference detection
function toggleDarkMode() {
const currentTheme = document.documentElement.getAttribute('data-theme');
const newTheme = currentTheme === 'dark' ? 'light' : 'dark';
setTheme(newTheme);
}
function setTheme(theme) {
// Apply theme immediately
document.documentElement.setAttribute('data-theme', theme);
// Save to localStorage for persistence
localStorage.setItem('theme', theme);
// Update button display if it exists
updateThemeButton(theme);
// Send analytics event
if (window.analytics) {
window.analytics.track('theme_changed', { theme });
}
}
function updateThemeButton(theme) {
const emoji = document.getElementById('darkModeEmoji');
const text = document.getElementById('darkModeText');
if (emoji && text) {
if (theme === 'dark') {
emoji.textContent = '🌙';
text.textContent = 'Dark';
} else {
emoji.textContent = '☀️';
text.textContent = 'Light';
}
}
}
function getPreferredTheme() {
// 1. Check localStorage first (user preference)
const saved = localStorage.getItem('theme');
if (saved) {
return saved;
}
// 2. Check system preference
if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
return 'dark';
}
// 3. Default to dark (AITBC brand preference)
return 'dark';
}
function initializeTheme() {
const theme = getPreferredTheme();
setTheme(theme);
// Listen for system preference changes
if (window.matchMedia) {
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', (e) => {
// Only auto-switch if user hasn't manually set a preference
if (!localStorage.getItem('theme')) {
setTheme(e.matches ? 'dark' : 'light');
}
});
}
}
// Initialize theme immediately (before DOM loads)
initializeTheme();
// Touch gesture support for mobile navigation
class TouchNavigation {
constructor() {
@@ -47,52 +119,189 @@ class TouchNavigation {
this.minSwipeDistance = 50;
this.maxVerticalDistance = 100;
this.initializeTouchEvents();
// Get all major sections for navigation
this.sections = ['hero', 'features', 'architecture', 'achievements', 'documentation'];
this.currentSectionIndex = 0;
this.bindEvents();
this.setupMobileOptimizations();
}
initializeTouchEvents() {
document.addEventListener('touchstart', (e) => {
this.touchStartX = e.changedTouches[0].screenX;
this.touchStartY = e.changedTouches[0].screenY;
}, { passive: true });
document.addEventListener('touchend', (e) => {
this.touchEndX = e.changedTouches[0].screenX;
this.touchEndY = e.changedTouches[0].screenY;
this.handleSwipe();
}, { passive: true });
bindEvents() {
document.addEventListener('touchstart', this.handleTouchStart.bind(this), { passive: false });
document.addEventListener('touchmove', this.handleTouchMove.bind(this), { passive: false });
document.addEventListener('touchend', this.handleTouchEnd.bind(this), { passive: false });
}
handleSwipe() {
const xDiff = this.touchEndX - this.touchStartX;
const yDiff = Math.abs(this.touchEndY - this.touchStartY);
handleTouchStart(e) {
this.touchStartX = e.touches[0].clientX;
this.touchStartY = e.touches[0].clientY;
}
// Ensure swipe is mostly horizontal
if (yDiff > this.maxVerticalDistance) return;
handleTouchMove(e) {
// Prevent scrolling when detecting horizontal swipes
const touchCurrentX = e.touches[0].clientX;
const touchCurrentY = e.touches[0].clientY;
const deltaX = Math.abs(touchCurrentX - this.touchStartX);
const deltaY = Math.abs(touchCurrentY - this.touchStartY);
if (Math.abs(xDiff) > this.minSwipeDistance) {
if (xDiff > 0) {
// Swipe Right - potentially open menu or go back
this.onSwipeRight();
// If horizontal movement is greater than vertical, prevent default scrolling
if (deltaX > deltaY && deltaX > 10) {
e.preventDefault();
}
}
handleTouchEnd(e) {
this.touchEndX = e.changedTouches[0].clientX;
this.touchEndY = e.changedTouches[0].clientY;
const deltaX = this.touchEndX - this.touchStartX;
const deltaY = Math.abs(this.touchEndY - this.touchStartY);
// Only process swipe if vertical movement is minimal
if (deltaY < this.maxVerticalDistance && Math.abs(deltaX) > this.minSwipeDistance) {
if (deltaX > 0) {
this.swipeRight();
} else {
// Swipe Left - potentially close menu or go forward
this.onSwipeLeft();
this.swipeLeft();
}
}
}
onSwipeRight() {
// Can be implemented if a side menu is added
// console.log('Swiped right');
swipeLeft() {
// Navigate to next section
const nextIndex = Math.min(this.currentSectionIndex + 1, this.sections.length - 1);
this.navigateToSection(nextIndex);
}
onSwipeLeft() {
// Can be implemented if a side menu is added
// console.log('Swiped left');
swipeRight() {
// Navigate to previous section
const prevIndex = Math.max(this.currentSectionIndex - 1, 0);
this.navigateToSection(prevIndex);
}
navigateToSection(index) {
const sectionId = this.sections[index];
const element = document.getElementById(sectionId);
if (element) {
this.currentSectionIndex = index;
element.scrollIntoView({
behavior: 'smooth',
block: 'start'
});
// Update URL hash without triggering scroll
history.replaceState(null, null, `#${sectionId}`);
}
}
setupMobileOptimizations() {
// Add touch-friendly interactions
this.setupTouchButtons();
this.setupScrollOptimizations();
this.setupMobileMenu();
}
setupTouchButtons() {
// Make buttons more touch-friendly
const buttons = document.querySelectorAll('button, .cta-button, .nav-button');
buttons.forEach(button => {
button.addEventListener('touchstart', () => {
button.style.transform = 'scale(0.98)';
}, { passive: true });
button.addEventListener('touchend', () => {
button.style.transform = '';
}, { passive: true });
});
}
setupScrollOptimizations() {
// Improve momentum scrolling on iOS
if ('webkitOverflowScrolling' in document.body.style) {
document.body.style.webkitOverflowScrolling = 'touch';
}
// Add smooth scrolling for anchor links with touch feedback
document.querySelectorAll('a[href^="#"]').forEach(link => {
link.addEventListener('touchstart', () => {
link.style.opacity = '0.7';
}, { passive: true });
link.addEventListener('touchend', () => {
link.style.opacity = '';
}, { passive: true });
});
}
setupMobileMenu() {
// Create mobile menu toggle if nav is hidden on mobile
const nav = document.querySelector('nav');
if (nav && window.innerWidth < 768) {
this.createMobileMenu();
}
}
createMobileMenu() {
// Create hamburger menu for mobile
const header = document.querySelector('header');
if (!header) return;
const mobileMenuBtn = document.createElement('button');
mobileMenuBtn.className = 'mobile-menu-btn';
mobileMenuBtn.innerHTML = '☰';
mobileMenuBtn.setAttribute('aria-label', 'Toggle mobile menu');
const nav = document.querySelector('nav');
if (nav) {
nav.style.display = 'none';
mobileMenuBtn.addEventListener('click', () => {
const isOpen = nav.style.display !== 'none';
nav.style.display = isOpen ? 'none' : 'flex';
mobileMenuBtn.innerHTML = isOpen ? '☰' : '✕';
});
// Close menu when clicking outside
document.addEventListener('click', (e) => {
if (!header.contains(e.target)) {
nav.style.display = 'none';
mobileMenuBtn.innerHTML = '☰';
}
});
header.appendChild(mobileMenuBtn);
}
}
updateCurrentSection() {
// Update current section based on scroll position
const scrollY = window.scrollY + window.innerHeight / 2;
this.sections.forEach((sectionId, index) => {
const element = document.getElementById(sectionId);
if (element) {
const rect = element.getBoundingClientRect();
const elementTop = rect.top + window.scrollY;
const elementBottom = elementTop + rect.height;
if (scrollY >= elementTop && scrollY < elementBottom) {
this.currentSectionIndex = index;
}
}
});
}
}
// Initialize touch navigation when DOM is loaded
// Initialize touch navigation when DOM is ready
document.addEventListener('DOMContentLoaded', () => {
new TouchNavigation();
// Update current section on scroll
window.addEventListener('scroll', () => {
if (window.touchNav) {
window.touchNav.updateCurrentSection();
}
}, { passive: true });
});

View File

@@ -5,24 +5,176 @@
'use strict';
function sendToAnalytics(metric) {
const safeEntries = Array.isArray(metric.entries) ? metric.entries : [];
const safeValue = Number.isFinite(metric.value) ? Math.round(metric.value) : 0;
const safeDelta = Number.isFinite(metric.delta) ? Math.round(metric.delta) : 0;
// In production we log to console. The /api/web-vitals endpoint was removed
// to reduce unnecessary network noise as we are not running a telemetry backend.
console.log(`[Web Vitals] ${metric.name}: ${safeValue}`);
}
// Load web-vitals from CDN
const script = document.createElement('script');
script.src = 'https://unpkg.com/web-vitals@3/dist/web-vitals.iife.js';
script.onload = function() {
if (window.webVitals) {
window.webVitals.onCLS(sendToAnalytics);
window.webVitals.onFID(sendToAnalytics);
window.webVitals.onLCP(sendToAnalytics);
window.webVitals.onFCP(sendToAnalytics);
window.webVitals.onTTFB(sendToAnalytics);
}
const data = {
name: metric.name,
value: safeValue,
id: metric.id || 'unknown',
delta: safeDelta,
entries: safeEntries.map(e => ({
name: e.name,
startTime: e.startTime,
duration: e.duration
})),
url: window.location.href,
timestamp: new Date().toISOString()
};
document.head.appendChild(script);
const payload = JSON.stringify(data);
// Send to analytics endpoint
if (navigator.sendBeacon) {
const blob = new Blob([payload], { type: 'application/json' });
const ok = navigator.sendBeacon('/api/web-vitals', blob);
if (!ok) {
fetch('/api/web-vitals', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: payload,
keepalive: true
}).catch(() => {});
}
} else {
fetch('/api/web-vitals', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: payload,
keepalive: true
}).catch(() => {});
}
// Also log to console in development
console.log(`[Web Vitals] ${metric.name}: ${metric.value}`, metric);
}
// Largest Contentful Paint (LCP)
function observeLCP() {
try {
const observer = new PerformanceObserver((list) => {
const entries = list.getEntries();
const lastEntry = entries[entries.length - 1];
sendToAnalytics({
name: 'LCP',
value: lastEntry.renderTime || lastEntry.loadTime,
id: lastEntry.id,
delta: 0,
entries: entries
});
});
observer.observe({ entryTypes: ['largest-contentful-paint'] });
} catch (e) {}
}
// First Input Delay (FID)
function observeFID() {
try {
const observer = new PerformanceObserver((list) => {
const entries = list.getEntries();
entries.forEach(entry => {
sendToAnalytics({
name: 'FID',
value: entry.processingStart - entry.startTime,
id: entry.id,
delta: 0,
entries: [entry]
});
});
});
observer.observe({ entryTypes: ['first-input'] });
} catch (e) {}
}
// Cumulative Layout Shift (CLS)
function observeCLS() {
try {
let clsValue = 0;
const observer = new PerformanceObserver((list) => {
try {
const entries = list.getEntries();
entries.forEach(entry => {
if (!entry.hadRecentInput) {
clsValue += entry.value;
}
});
sendToAnalytics({
name: 'CLS',
value: clsValue,
id: 'cls',
delta: 0,
entries: entries
});
} catch (e) {
// CLS measurement failed, but don't crash the whole script
console.log('CLS measurement error:', e.message);
}
});
// Try to observe layout-shift, but handle if it's not supported
try {
observer.observe({ entryTypes: ['layout-shift'] });
} catch (e) {
console.log('Layout-shift observation not supported:', e.message);
// CLS will not be measured, but other metrics will still work
}
} catch (e) {
console.log('CLS observer setup failed:', e.message);
}
}
// Time to First Byte (TTFB)
function measureTTFB() {
try {
const nav = performance.getEntriesByType('navigation')[0];
if (nav) {
sendToAnalytics({
name: 'TTFB',
value: nav.responseStart,
id: 'ttfb',
delta: 0,
entries: [nav]
});
}
} catch (e) {}
}
// First Contentful Paint (FCP)
function observeFCP() {
try {
const observer = new PerformanceObserver((list) => {
const entries = list.getEntries();
entries.forEach(entry => {
if (entry.name === 'first-contentful-paint') {
sendToAnalytics({
name: 'FCP',
value: entry.startTime,
id: entry.id,
delta: 0,
entries: [entry]
});
}
});
});
observer.observe({ entryTypes: ['paint'] });
} catch (e) {}
}
// Initialize when page loads
if (document.readyState === 'complete') {
observeLCP();
observeFID();
observeCLS();
observeFCP();
measureTTFB();
} else {
window.addEventListener('load', () => {
observeLCP();
observeFID();
observeCLS();
observeFCP();
measureTTFB();
});
}
})();

View File

@@ -1,16 +1,11 @@
<!DOCTYPE html>
<html lang="en" data-theme="dark">
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>API Documentation - AITBC</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css">
<link rel="stylesheet" href="css/docs.css">
<link rel="stylesheet" href="/assets/css/site-header.css">
<link rel="preload" href="/assets/css/font-awesome.min.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript><link rel="stylesheet" href="/assets/css/font-awesome.min.css"></noscript>
<!-- Font Awesome CDN fallback -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" crossorigin="anonymous" media="print" onload="this.media='all'; this.onload=null;">
</head>
<body>
<div data-global-header></div>
@@ -179,14 +174,14 @@
<pre class="code-inline"><code>https://aitbc.bubuit.net/api</code></pre>
<p>For development:</p>
<pre class="code-inline"><code>http://localhost:8000</code></pre>
<pre class="code-inline"><code>http://localhost:18000</code></pre>
</section>
<!-- WebSocket -->
<section class="content-section">
<h2>WebSocket API</h2>
<p>Real-time updates are available through WebSocket connections:</p>
<pre class="code-inline"><code>ws://aitbc.bubuit.net:8015/ws</code></pre>
<pre class="code-inline"><code>ws://aitbc.bubuit.net:18001/ws</code></pre>
<p>Subscribe to events:</p>
<pre class="code-inline"><code>{
@@ -203,6 +198,6 @@
</div>
</footer>
<script src="js/theme.js"></script>
<script src="/assets/js/global-header.js"></script>
<script src="../assets/js/global-header.js"></script>
</body>
</html>

View File

@@ -1,16 +1,11 @@
<!DOCTYPE html>
<html lang="en" data-theme="dark">
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Blockchain Node - AITBC Documentation</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css">
<link rel="stylesheet" href="css/docs.css">
<link rel="stylesheet" href="/assets/css/site-header.css">
<link rel="preload" href="/assets/css/font-awesome.min.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript><link rel="stylesheet" href="/assets/css/font-awesome.min.css"></noscript>
<!-- Font Awesome CDN fallback -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" crossorigin="anonymous" media="print" onload="this.media='all'; this.onload=null;">
</head>
<body>
<div data-global-header></div>
@@ -193,6 +188,6 @@ python -m aitbc_chain.node</code></pre>
// Add any interactive functionality here
</script>
<script src="js/theme.js"></script>
<script src="/assets/js/global-header.js"></script>
<script src="../assets/js/global-header.js"></script>
</body>
</html>

View File

@@ -3,17 +3,12 @@
<head>
<meta http-equiv="refresh" content="0;url=/wallet/">
<title>Redirecting to AITBC Wallet...</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css">
<link rel="stylesheet" href="css/docs.css">
<link rel="stylesheet" href="/assets/css/site-header.css">
<link rel="preload" href="/assets/css/font-awesome.min.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript><link rel="stylesheet" href="/assets/css/font-awesome.min.css"></noscript>
<!-- Font Awesome CDN fallback -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" crossorigin="anonymous" media="print" onload="this.media='all'; this.onload=null;">
</head>
<body>
<div data-global-header></div>
<p>Redirecting to <a href="/wallet/">AITBC Browser Wallet</a></p>
<script src="/assets/js/global-header.js"></script>
<script src="../assets/js/global-header.js"></script>
</body>
</html>

View File

@@ -1,17 +1,12 @@
<!DOCTYPE html>
<html lang="en" data-theme="dark">
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Client Documentation - AITBC</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css">
<link rel="stylesheet" href="css/docs.css">
<link rel="stylesheet" href="/assets/css/site-header.css">
<link rel="preload" href="/assets/css/font-awesome.min.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript><link rel="stylesheet" href="/assets/css/font-awesome.min.css"></noscript>
<!-- Font Awesome CDN fallback -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" crossorigin="anonymous" media="print" onload="this.media='all'; this.onload=null;">
</head>
</head>
<body>
<div data-global-header></div>
@@ -443,6 +438,6 @@ curl -X GET https://aitbc.bubuit.net/api/v1/jobs/JOB_ID \
<p>&copy; 2026 AITBC. All rights reserved.</p>
</div>
</footer> <script src="js/theme.js"></script>
<script src="/assets/js/global-header.js"></script>
<script src="../assets/js/global-header.js"></script>
</body>
</html>

View File

@@ -1,16 +1,11 @@
<!DOCTYPE html>
<html lang="en" data-theme="dark">
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Platform Components - AITBC Documentation</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css">
<link rel="stylesheet" href="css/docs.css">
<link rel="stylesheet" href="/assets/css/site-header.css">
<link rel="preload" href="/assets/css/font-awesome.min.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript><link rel="stylesheet" href="/assets/css/font-awesome.min.css"></noscript>
<!-- Font Awesome CDN fallback -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" crossorigin="anonymous" media="print" onload="this.media='all'; this.onload=null;">
</head>
<body>
<div data-global-header></div>
@@ -199,6 +194,6 @@
// Add any interactive functionality here
</script>
<script src="js/theme.js"></script>
<script src="/assets/js/global-header.js"></script>
<script src="../assets/js/global-header.js"></script>
</body>
</html>

View File

@@ -1,16 +1,11 @@
<!DOCTYPE html>
<html lang="en" data-theme="dark">
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Coordinator API - AITBC Documentation</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css">
<link rel="stylesheet" href="css/docs.css">
<link rel="stylesheet" href="/assets/css/site-header.css">
<link rel="preload" href="/assets/css/font-awesome.min.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript><link rel="stylesheet" href="/assets/css/font-awesome.min.css"></noscript>
<!-- Font Awesome CDN fallback -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" crossorigin="anonymous" media="print" onload="this.media='all'; this.onload=null;">
</head>
<body>
<div data-global-header></div>
@@ -245,6 +240,6 @@ sudo journalctl -u aitbc-coordinator -f</code></pre>
// Add any interactive functionality here
</script>
<script src="js/theme.js"></script>
<script src="/assets/js/global-header.js"></script>
<script src="../assets/js/global-header.js"></script>
</body>
</html>

View File

@@ -30,6 +30,22 @@
--code-text: #e6edf3;
}
/* Light mode */
body.light {
--primary-color: #2563eb;
--secondary-color: #7c3aed;
--accent-color: #0ea5e9;
--success-color: #10b981;
--warning-color: #f59e0b;
--danger-color: #ef4444;
--text-dark: #1f2937;
--text-light: #6b7280;
--bg-light: #f9fafb;
--bg-white: #ffffff;
--border-color: #e5e7eb;
--code-bg: #1f2937;
--code-text: #e5e7eb;
}
/* ============================================
Base Styles
@@ -223,7 +239,7 @@ nav {
============================================ */
main {
margin-top: 90px;
margin-top: 80px;
padding: 40px 0;
}

View File

@@ -1,17 +1,12 @@
<!DOCTYPE html>
<html lang="en" data-theme="dark">
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Developer Documentation - AITBC</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css">
<link rel="stylesheet" href="css/docs.css">
<link rel="stylesheet" href="/assets/css/site-header.css">
<link rel="preload" href="/assets/css/font-awesome.min.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript><link rel="stylesheet" href="/assets/css/font-awesome.min.css"></noscript>
<!-- Font Awesome CDN fallback -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" crossorigin="anonymous" media="print" onload="this.media='all'; this.onload=null;">
</head>
</head>
<body>
<div data-global-header></div>
@@ -505,6 +500,6 @@ def test_create_feature_invalid():
<p>&copy; 2026 AITBC. All rights reserved.</p>
</div>
</footer> <script src="js/theme.js"></script>
<script src="/assets/js/global-header.js"></script>
<script src="../assets/js/global-header.js"></script>
</body>
</html>

View File

@@ -1,16 +1,11 @@
<!DOCTYPE html>
<html lang="en" data-theme="dark">
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Explorer Web - AITBC Documentation</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css">
<link rel="stylesheet" href="css/docs.css">
<link rel="stylesheet" href="/assets/css/site-header.css">
<link rel="preload" href="/assets/css/font-awesome.min.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript><link rel="stylesheet" href="/assets/css/font-awesome.min.css"></noscript>
<!-- Font Awesome CDN fallback -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" crossorigin="anonymous" media="print" onload="this.media='all'; this.onload=null;">
</head>
<body>
<div data-global-header></div>
@@ -203,6 +198,6 @@ npm test</code></pre>
</div>
</footer>
<script src="js/theme.js"></script>
<script src="/assets/js/global-header.js"></script>
<script src="../assets/js/global-header.js"></script>
</body>
</html>

View File

@@ -1,16 +1,11 @@
<!DOCTYPE html>
<html lang="en" data-theme="dark">
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>System Flow - AITBC Documentation</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css">
<link rel="stylesheet" href="css/docs.css">
<link rel="stylesheet" href="/assets/css/site-header.css">
<link rel="preload" href="/assets/css/font-awesome.min.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript><link rel="stylesheet" href="/assets/css/font-awesome.min.css"></noscript>
<!-- Font Awesome CDN fallback -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" crossorigin="anonymous" media="print" onload="this.media='all'; this.onload=null;">
</head>
<body>
<div data-global-header></div>
@@ -54,7 +49,7 @@
<div style="background: #06b6d4; color: white; padding: 0.5rem 1rem; border-radius: 4px; white-space: nowrap;">Ollama</div>
</div>
<div style="font-size: 0.85rem; color: #64748b; text-align: center; margin-top: 1rem;">
<div>(aitbc-cli.sh) → (client.py) → (port 8000) → (RPC:8006) → (port 8015) → (port 11434)</div>
<div>(aitbc-cli.sh) → (client.py) → (port 18000) → (RPC:26657) → (port 18001) → (port 11434)</div>
</div>
</div>
@@ -92,7 +87,7 @@
<li>Bash script (<span class="inline-code">aitbc-cli.sh</span>) parses arguments</li>
<li>Sets environment variables:
<ul>
<li><span class="inline-code">AITBC_URL=http://127.0.0.1:8000</span></li>
<li><span class="inline-code">AITBC_URL=http://127.0.0.1:18000</span></li>
<li><span class="inline-code">CLIENT_KEY=${CLIENT_API_KEY}</span></li>
</ul>
</li>
@@ -120,7 +115,7 @@
<div class="http-request">
<h4>HTTP Request:</h4>
<pre><code>POST /v1/jobs
Host: 127.0.0.1:8000
Host: 127.0.0.1:18000
Content-Type: application/json
X-Api-Key: ${CLIENT_API_KEY}
@@ -131,7 +126,7 @@ X-Api-Key: ${CLIENT_API_KEY}
}</code></pre>
</div>
<p><strong>Coordinator Service (Port 8000):</strong></p>
<p><strong>Coordinator Service (Port 18000):</strong></p>
<ol>
<li>Receives HTTP request</li>
<li>Validates API key and job parameters</li>
@@ -185,9 +180,9 @@ X-Api-Key: ${CLIENT_API_KEY}
</ol>
<div class="http-request">
<h4>Coordinator → Miner (Port 8010):</h4>
<h4>Coordinator → Miner Daemon (Port 18001):</h4>
<pre><code>POST /v1/jobs/assign
Host: 127.0.0.1:8010
Host: 127.0.0.1:18001
Content-Type: application/json
X-Api-Key: ${ADMIN_API_KEY}
@@ -203,7 +198,7 @@ X-Api-Key: ${ADMIN_API_KEY}
</div>
<h3>6. Miner Processing</h3>
<p><strong>Miner Daemon (Port 8015):</strong></p>
<p><strong>Miner Daemon (Port 18001):</strong></p>
<ol>
<li>Receives job assignment</li>
<li>Updates job status to <span class="inline-code">running</span></li>
@@ -250,9 +245,9 @@ Content-Type: application/json
<h3>8. Result Submission to Coordinator</h3>
<div class="http-request">
<h4>Miner → Coordinator (Port 8000):</h4>
<h4>Miner → Coordinator (Port 18000):</h4>
<pre><code>POST /v1/jobs/job_123456/complete
Host: 127.0.0.1:8000
Host: 127.0.0.1:18000
Content-Type: application/json
X-Miner-Key: ${MINER_API_KEY}
@@ -308,7 +303,7 @@ X-Miner-Key: ${MINER_API_KEY}
<div class="http-request">
<h4>HTTP Request:</h4>
<pre><code>GET /v1/jobs/job_123456
Host: 127.0.0.1:8000
Host: 127.0.0.1:18000
X-Api-Key: ${CLIENT_API_KEY}</code></pre>
<h4>Response:</h4>
@@ -358,19 +353,19 @@ Cost: 0.25 AITBC</code></pre>
</tr>
<tr>
<td>Coordinator</td>
<td>8000</td>
<td>18000</td>
<td>HTTP/REST</td>
<td>Job management, API gateway</td>
</tr>
<tr>
<td>Blockchain Node</td>
<td>8006</td>
<td>26657</td>
<td>JSON-RPC</td>
<td>Transaction processing, consensus</td>
</tr>
<tr>
<td>Miner Daemon</td>
<td>8010</td>
<td>18001</td>
<td>HTTP/REST</td>
<td>Job execution, GPU management</td>
</tr>
@@ -389,12 +384,12 @@ Cost: 0.25 AITBC</code></pre>
<h2>Message Flow Timeline</h2>
<div class="timeline">0s: User submits CLI command
└─> 0.1s: Python client called
└─> 0.2s: HTTP POST to Coordinator (port 8000)
└─> 0.2s: HTTP POST to Coordinator (port 18000)
└─> 0.3s: Coordinator validates and creates job
└─> 0.4s: RPC to Blockchain (port 8006)
└─> 0.4s: RPC to Blockchain (port 26657)
└─> 0.5s: Transaction in mempool
└─> 1.0s: Job queued for miner
└─> 2.0s: Miner assigned (port 8010)
└─> 2.0s: Miner assigned (port 18001)
└─> 2.1s: Miner accepts job
└─> 2.2s: Ollama request (port 11434)
└─> 14.7s: Inference complete (12.5s processing)
@@ -486,6 +481,6 @@ Cost: 0.25 AITBC</code></pre>
</div>
</footer>
<script src="js/theme.js"></script>
<script src="/assets/js/global-header.js"></script>
<script src="../assets/js/global-header.js"></script>
</body>
</html>

View File

@@ -1,16 +1,11 @@
<!DOCTYPE html>
<html lang="en" data-theme="dark">
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Full Documentation - AITBC</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css">
<link rel="stylesheet" href="css/docs.css">
<link rel="stylesheet" href="/assets/css/site-header.css">
<link rel="preload" href="/assets/css/font-awesome.min.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript><link rel="stylesheet" href="/assets/css/font-awesome.min.css"></noscript>
<!-- Font Awesome CDN fallback -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" crossorigin="anonymous" media="print" onload="this.media='all'; this.onload=null;">
</head>
<body>
<div data-global-header></div>
@@ -648,6 +643,6 @@ gosec ./...</code></pre>
<script src="/js/mermaid-init.js"></script>
<script src="js/theme.js"></script>
<script src="/assets/js/global-header.js"></script>
<script src="../assets/js/global-header.js"></script>
</body>
</html>

View File

@@ -1,12 +1,12 @@
<!DOCTYPE html>
<html lang="en" data-theme="dark">
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="css/docs.css">
<link rel="stylesheet" href="/assets/css/site-header.css">
<link rel="preload" href="/assets/css/font-awesome.min.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript><link rel="stylesheet" href="/assets/css/font-awesome.min.css"></noscript>
<link rel="stylesheet" href="../assets/css/docs.css">
<link rel="stylesheet" href="../assets/css/site-header.css">
<link rel="preload" href="../assets/css/font-awesome.min.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript><link rel="stylesheet" href="../assets/css/font-awesome.min.css"></noscript>
<!-- Font Awesome CDN fallback -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" crossorigin="anonymous" media="print" onload="this.media='all'; this.onload=null;">
<title>Documentation - AITBC</title>
@@ -227,6 +227,6 @@
});
</script>
<script src="js/theme.js"></script>
<script src="/assets/js/global-header.js"></script>
<script src="../assets/js/global-header.js"></script>
</body>
</html>

View File

@@ -1,16 +1,11 @@
<!DOCTYPE html>
<html lang="en" data-theme="dark">
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Marketplace Web - AITBC Documentation</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css">
<link rel="stylesheet" href="css/docs.css">
<link rel="stylesheet" href="/assets/css/site-header.css">
<link rel="preload" href="/assets/css/font-awesome.min.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript><link rel="stylesheet" href="/assets/css/font-awesome.min.css"></noscript>
<!-- Font Awesome CDN fallback -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" crossorigin="anonymous" media="print" onload="this.media='all'; this.onload=null;">
</head>
<body>
<div data-global-header></div>
@@ -125,8 +120,8 @@ npm run preview</code></pre>
<h3>Environment Configuration</h3>
<pre><code># .env.local
VITE_API_URL=http://localhost:8000
VITE_WS_URL=ws://localhost:8015
VITE_API_URL=http://localhost:18000
VITE_WS_URL=ws://localhost:18001
VITE_NETWORK=mainnet
VITE_MOCK_DATA=false</code></pre>
</section>
@@ -175,7 +170,7 @@ POST /v1/jobs
}
// WebSocket for live updates
ws://localhost:8015/ws</code></pre>
ws://localhost:18001/ws</code></pre>
<h3>Blockchain RPC</h3>
<pre><code>// Get transaction status
@@ -260,6 +255,6 @@ docker run -d \
</div>
</footer>
<script src="js/theme.js"></script>
<script src="/assets/js/global-header.js"></script>
<script src="../assets/js/global-header.js"></script>
</body>
</html>

View File

@@ -1,17 +1,12 @@
<!DOCTYPE html>
<html lang="en" data-theme="dark">
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Miner Documentation - AITBC</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css">
<link rel="stylesheet" href="css/docs.css">
<link rel="stylesheet" href="/assets/css/site-header.css">
<link rel="preload" href="/assets/css/font-awesome.min.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript><link rel="stylesheet" href="/assets/css/font-awesome.min.css"></noscript>
<!-- Font Awesome CDN fallback -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" crossorigin="anonymous" media="print" onload="this.media='all'; this.onload=null;">
</head>
</head>
<body>
<div data-global-header></div>
@@ -375,6 +370,6 @@ nano ~/.aitbc/miner.toml</div>
// Initialize calculator
calculateProfit();
</script> <script src="js/theme.js"></script>
<script src="/assets/js/global-header.js"></script>
<script src="../assets/js/global-header.js"></script>
</body>
</html>

View File

@@ -1,16 +1,11 @@
<!DOCTYPE html>
<html lang="en" data-theme="dark">
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Pool Hub - AITBC Documentation</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css">
<link rel="stylesheet" href="css/docs.css">
<link rel="stylesheet" href="/assets/css/site-header.css">
<link rel="preload" href="/assets/css/font-awesome.min.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript><link rel="stylesheet" href="/assets/css/font-awesome.min.css"></noscript>
<!-- Font Awesome CDN fallback -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" crossorigin="anonymous" media="print" onload="this.media='all'; this.onload=null;">
</head>
<body>
<div data-global-header></div>
@@ -259,6 +254,6 @@ GET /metrics</code></pre>
</div>
</footer>
<script src="js/theme.js"></script>
<script src="/assets/js/global-header.js"></script>
<script src="../assets/js/global-header.js"></script>
</body>
</html>

View File

@@ -1,16 +1,11 @@
<!DOCTYPE html>
<html lang="en" data-theme="dark">
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Trade Exchange - AITBC Documentation</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css">
<link rel="stylesheet" href="css/docs.css">
<link rel="stylesheet" href="/assets/css/site-header.css">
<link rel="preload" href="/assets/css/font-awesome.min.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript><link rel="stylesheet" href="/assets/css/font-awesome.min.css"></noscript>
<!-- Font Awesome CDN fallback -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" crossorigin="anonymous" media="print" onload="this.media='all'; this.onload=null;">
</head>
<body>
<div data-global-header></div>
@@ -259,6 +254,6 @@ BITCOIN_RPC_PASS=password</code></pre>
// Add any interactive functionality here
</script>
<script src="js/theme.js"></script>
<script src="/assets/js/global-header.js"></script>
<script src="../assets/js/global-header.js"></script>
</body>
</html>

View File

@@ -1,16 +1,11 @@
<!DOCTYPE html>
<html lang="en" data-theme="dark">
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Wallet Daemon - AITBC Documentation</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css">
<link rel="stylesheet" href="css/docs.css">
<link rel="stylesheet" href="/assets/css/site-header.css">
<link rel="preload" href="/assets/css/font-awesome.min.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript><link rel="stylesheet" href="/assets/css/font-awesome.min.css"></noscript>
<!-- Font Awesome CDN fallback -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" crossorigin="anonymous" media="print" onload="this.media='all'; this.onload=null;">
</head>
<body>
<div data-global-header></div>
@@ -209,6 +204,6 @@ console.log('Balance:', balance);</code></pre>
</div>
</footer>
<script src="js/theme.js"></script>
<script src="/assets/js/global-header.js"></script>
<script src="../assets/js/global-header.js"></script>
</body>
</html>

View File

@@ -22,7 +22,7 @@
<link rel="dns-prefetch" href="//github.com">
<style>
/* Critical CSS for above-the-fold content */
:root{--primary-color:#2563eb;--secondary-color:#7c3aed;--accent-color:#0ea5e9;--text-dark:#1f2937;--bg-white:#ffffff;--gradient:linear-gradient(135deg,#2563eb 0%,#7c3aed 100%)}[data-theme="dark"]{--primary-color:#60a5fa;--secondary-color:#a855f7;--accent-color:#38bdf8;--text-dark:#f9fafb;--bg-white:#1f2937;--gradient:linear-gradient(135deg,#1d4ed8 0%,#7c3aed 100%)}body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,sans-serif;line-height:1.6;color:var(--text-dark);background-color:var(--bg-light);transition:background-color .3s ease,color .3s ease}.container{max-width:1160px;margin:0 auto;padding:0 20px}.hero{background:var(--gradient);color:#fff;padding:100px 0 80px;text-align:center}.hero h1{font-size:3.5rem;margin-bottom:1rem;animation:fadeInUp .8s ease}.hero p{font-size:1.25rem;margin-bottom:2rem;opacity:.9;animation:fadeInUp .8s ease .2s both}.cta-button{display:inline-block;padding:12px 30px;background:var(--bg-white);color:var(--primary-color);text-decoration:none;border-radius:5px;font-weight:600;transition:transform .3s,box-shadow .3s;animation:fadeInUp .8s ease .4s both}.cta-button:hover{transform:translateY(-2px);box-shadow:0 10px 20px rgba(0,0,0,.1)}@keyframes fadeInUp{from{opacity:0;transform:translateY(30px)}to{opacity:1;transform:translateY(0)}}@media (max-width:768px){.hero h1{font-size:2.5rem}}
:root{--primary-color:#2563eb;--secondary-color:#7c3aed;--accent-color:#0ea5e9;--text-dark:#1f2937;--bg-white:#ffffff;--gradient:linear-gradient(135deg,#2563eb 0%,#7c3aed 100%)}[data-theme="dark"]{--primary-color:#60a5fa;--secondary-color:#a855f7;--accent-color:#38bdf8;--text-dark:#f9fafb;--bg-white:#1f2937;--gradient:linear-gradient(135deg,#1d4ed8 0%,#7c3aed 100%)}body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,sans-serif;line-height:1.6;color:var(--text-dark);background-color:var(--bg-light);transition:background-color .3s ease,color .3s ease}.container{max-width:1200px;margin:0 auto;padding:0 20px}.hero{background:var(--gradient);color:#fff;padding:100px 0 80px;text-align:center}.hero h1{font-size:3.5rem;margin-bottom:1rem;animation:fadeInUp .8s ease}.hero p{font-size:1.25rem;margin-bottom:2rem;opacity:.9;animation:fadeInUp .8s ease .2s both}.cta-button{display:inline-block;padding:12px 30px;background:var(--bg-white);color:var(--primary-color);text-decoration:none;border-radius:5px;font-weight:600;transition:transform .3s,box-shadow .3s;animation:fadeInUp .8s ease .4s both}.cta-button:hover{transform:translateY(-2px);box-shadow:0 10px 20px rgba(0,0,0,.1)}@keyframes fadeInUp{from{opacity:0;transform:translateY(30px)}to{opacity:1;transform:translateY(0)}}@media (max-width:768px){.hero h1{font-size:2.5rem}}
</style>
<link rel="preload" href="/assets/css/font-awesome.min.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
<link rel="preload" href="/assets/css/main.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
@@ -51,6 +51,13 @@
<a href="/Exchange/" class="global-nav__link">Exchange</a>
<a href="/docs/index.html" class="global-nav__link">Docs</a>
</nav>
<div class="global-header__actions">
<button onclick="toggleDarkMode()" class="global-dark-toggle" title="Toggle dark mode">
<span id="darkModeEmoji">🌙</span>
<span id="darkModeText">Dark</span>
</button>
<a href="/marketplace/" class="global-nav__cta">Launch Marketplace</a>
</div>
</div>
</header>
@@ -128,37 +135,6 @@
</div>
</section>
<!-- Agent Ecosystem Section -->
<section class="features" id="agents">
<div class="container">
<h2 class="section-title">OpenClaw Agent Ecosystem</h2>
<div class="features-grid">
<div class="feature-card">
<div class="feature-icon">
<i class="fas fa-robot"></i>
</div>
<h3>Autonomous Negotiation</h3>
<p>Agents use isolated smart contract wallets to bid for GPU compute time independently based on task priority.</p>
</div>
<div class="feature-card">
<div class="feature-icon">
<i class="fas fa-network-wired"></i>
</div>
<h3>Multi-Modal Fusion</h3>
<p>Seamlessly process text, image, audio, and video via high-speed WebSocket streams on global edge nodes.</p>
</div>
<div class="feature-card">
<div class="feature-icon">
<i class="fas fa-brain"></i>
</div>
<h3>Decentralized Memory</h3>
<p>Agents utilize IPFS/Filecoin for scalable, off-chain RAG vector embeddings, secured by on-chain ZK-Proofs.</p>
</div>
</div>
</div>
</section>
<!-- Architecture Section -->
<section class="architecture" id="architecture">
<div class="container">
@@ -291,19 +267,25 @@
</div>
</div>
<div class="roadmap-item">
<div class="roadmap-marker"></div>
<div class="roadmap-marker">🔄</div>
<div class="roadmap-content">
<h4>Phase 8 - Global Expansion Complete</h4>
<p>Multi-region edge nodes, Geographic load balancing, Dispute resolution contracts</p>
<h4>Stage 8 - Current Focus</h4>
<p>Research consortium, sharding prototypes, ZK applications, and global expansion</p>
</div>
</div>
<div class="roadmap-item">
<div class="roadmap-marker">🔄</div>
<div class="roadmap-marker">9</div>
<div class="roadmap-content">
<h4>Q2-Q3 2026 - Current Focus</h4>
<p>OpenClaw Autonomous Economics, Decentralized AI Memory, Developer Ecosystem Grants</p>
<h4>Stage 9 - Moonshot Initiatives</h4>
<p>Decentralized infrastructure, AI automation, and global standards</p>
</div>
</div>
<div class="roadmap-item">
<div class="roadmap-marker">10</div>
<div class="roadmap-content">
<h4>Stage 10 - Stewardship</h4>
<p>Open governance, educational programs, and long-term preservation</p>
</div>
</div>
</div>
</div>