chore: cleanup website files
- Remove website/dashboards/ directory - Remove website/aitbc-proxy.conf - Remove website/README.md - Update website documentation files with minimum Python version - Update website assets (CSS, JS) for improved performance - Update docs/ with minimum Python version and updated paths
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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') {
|
||||
|
||||
@@ -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}`);
|
||||
}
|
||||
}
|
||||
|
||||
// Initialize touch navigation when DOM is loaded
|
||||
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 ready
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
new TouchNavigation();
|
||||
|
||||
// Update current section on scroll
|
||||
window.addEventListener('scroll', () => {
|
||||
if (window.touchNav) {
|
||||
window.touchNav.updateCurrentSection();
|
||||
}
|
||||
}, { passive: true });
|
||||
});
|
||||
|
||||
@@ -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();
|
||||
});
|
||||
}
|
||||
})();
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>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>
|
||||
<body>
|
||||
<div data-global-header></div>
|
||||
@@ -443,6 +438,6 @@ curl -X GET https://aitbc.bubuit.net/api/v1/jobs/JOB_ID \
|
||||
<p>© 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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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>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>
|
||||
<body>
|
||||
<div data-global-header></div>
|
||||
@@ -505,6 +500,6 @@ def test_create_feature_invalid():
|
||||
<p>© 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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>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>
|
||||
<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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user