nimazasinich
Market and analysis pages (#114)
bb4c54e
<!DOCTYPE html>
<html lang="en" dir="ltr" data-theme="light">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Technical Indicator Services - Bollinger Bands, Stochastic RSI, ATR, SMA, EMA, MACD, RSI">
<meta name="theme-color" content="#14b8a6">
<title>Indicator Services | Crypto Monitor</title>
<!-- Favicon -->
<link rel="icon" type="image/svg+xml" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Cdefs%3E%3ClinearGradient id='g' x1='0%25' y1='0%25' x2='100%25' y2='100%25'%3E%3Cstop offset='0%25' stop-color='%232dd4bf'/%3E%3Cstop offset='50%25' stop-color='%2322d3ee'/%3E%3Cstop offset='100%25' stop-color='%233b82f6'/%3E%3C/linearGradient%3E%3C/defs%3E%3Ccircle cx='50' cy='50' r='45' fill='url(%23g)'/%3E%3Cpath d='M50 25 L65 45 L50 40 L35 45 Z M50 75 L35 55 L50 60 L65 55 Z' fill='white'/%3E%3C/svg%3E">
<!-- Preconnect -->
<link rel="preconnect" href="https://fonts.googleapis.com" crossorigin>
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<!-- Critical CSS -->
<style>
:root{--teal-dark:#0d7377;--teal:#14b8a6;--teal-light:#2dd4bf;--cyan:#22d3ee;--text-primary:#0f2926;--text-secondary:#2a5f5a;--text-muted:#64748b;--bg-main:#ffffff;--bg-secondary:#f8fdfc;--sidebar-width:260px}
*,*::before,*::after{margin:0;padding:0;box-sizing:border-box}
html{font-size:14px;-webkit-font-smoothing:antialiased}
body{font-family:system-ui,-apple-system,sans-serif;font-size:14px;line-height:1.5;color:var(--text-secondary);background:var(--bg-main);min-height:100vh}
.app-container{display:flex;min-height:100vh}
.sidebar{position:fixed;left:0;top:0;bottom:0;width:var(--sidebar-width);background:linear-gradient(180deg,#fff 0%,#f8fdfc 100%);border-right:1px solid rgba(20,184,166,0.12);z-index:100}
.main-content{flex:1;margin-left:var(--sidebar-width);min-height:100vh}
.page-content{padding:1.5rem;max-width:1400px;margin:0 auto}
@media(max-width:768px){.sidebar{transform:translateX(-100%)}.main-content{margin-left:0}}
</style>
<!-- CSS -->
<link rel="stylesheet" href="/static/shared/css/design-system.css?v=3.0" media="print" onload="this.media='all'">
<noscript><link rel="stylesheet" href="/static/shared/css/design-system.css?v=3.0"></noscript>
<link rel="stylesheet" href="/static/shared/css/global.css?v=3.0" media="print" onload="this.media='all'">
<noscript><link rel="stylesheet" href="/static/shared/css/global.css?v=3.0"></noscript>
<link rel="stylesheet" href="/static/shared/css/components.css" media="print" onload="this.media='all'">
<noscript><link rel="stylesheet" href="/static/shared/css/components.css"></noscript>
<link rel="stylesheet" href="/static/shared/css/layout.css" media="print" onload="this.media='all'">
<noscript><link rel="stylesheet" href="/static/shared/css/layout.css"></noscript>
<link rel="stylesheet" href="/static/pages/services/services.css?v=1.0" media="print" onload="this.media='all'">
<noscript><link rel="stylesheet" href="/static/pages/services/services.css?v=1.0"></noscript>
<!-- Scripts -->
<script src="/static/shared/js/utils/error-suppressor.js"></script>
<script src="/static/js/api-config.js"></script>
</head>
<body>
<div class="app-container">
<!-- Sidebar -->
<aside id="sidebar-container"></aside>
<!-- Main Content -->
<main class="main-content">
<!-- Header -->
<header id="header-container"></header>
<!-- Services Content -->
<div class="page-content">
<!-- Page Header -->
<div class="page-header">
<div class="page-title">
<h1>
<span class="page-icon">
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="url(#iconGradient)" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<defs>
<linearGradient id="iconGradient" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" stop-color="#2dd4bf"/>
<stop offset="50%" stop-color="#22d3ee"/>
<stop offset="100%" stop-color="#3b82f6"/>
</linearGradient>
</defs>
<line x1="12" y1="1" x2="12" y2="23"></line>
<path d="M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6"></path>
</svg>
</span>
Indicator Services
</h1>
<p class="page-subtitle">Technical Analysis Tools & Real-time Indicators</p>
</div>
<div class="page-actions">
<button id="refresh-btn" class="btn-icon" title="Refresh" aria-label="Refresh data">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8"/>
<path d="M21 3v5h-5"/>
</svg>
</button>
<span id="last-update" class="last-update">Loading...</span>
</div>
</div>
<!-- Symbol Selector -->
<div class="symbol-selector glass-card">
<div class="form-group">
<label for="symbol-input">Symbol</label>
<input type="text" id="symbol-input" class="form-input" value="BTC" placeholder="Enter symbol (e.g., BTC, ETH)">
</div>
<div class="form-group">
<label for="timeframe-select">Timeframe</label>
<select id="timeframe-select" class="form-select">
<option value="1h" selected>1 Hour</option>
<option value="4h">4 Hours</option>
<option value="1d">1 Day</option>
</select>
</div>
<button id="analyze-all-btn" class="btn btn-gradient">
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<polyline points="22 12 18 12 15 21 9 3 6 12 2 12"></polyline>
</svg>
Analyze All Indicators
</button>
</div>
<!-- Services Categories -->
<div class="services-categories">
<button class="category-btn active" data-category="all">All Services</button>
<button class="category-btn" data-category="volatility">Volatility</button>
<button class="category-btn" data-category="momentum">Momentum</button>
<button class="category-btn" data-category="trend">Trend</button>
</div>
<!-- Services Grid -->
<div id="services-grid" class="services-grid">
<!-- Will be populated by JavaScript -->
<div class="loading-state">
<div class="loading-spinner"></div>
<p>Loading services...</p>
</div>
</div>
<!-- Results Section -->
<div id="results-section" class="results-section" style="display: none;">
<h2 class="section-title">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<path d="M12 8V4H8"/>
<rect x="2" y="14" width="4" height="6" rx="1"/>
<rect x="10" y="10" width="4" height="10" rx="1"/>
<rect x="18" y="6" width="4" height="14" rx="1"/>
<path d="m8 4 4 4"/>
</svg>
Analysis Results
</h2>
<div id="results-container" class="results-container">
<!-- Results will be rendered here -->
</div>
</div>
</div>
</main>
</div>
<!-- Toast Container -->
<div id="toast-container" aria-live="polite"></div>
<script type="module">
(async function() {
try {
const { LayoutManager } = await import('/static/shared/js/core/layout-manager.js?v=3.0');
await LayoutManager.init('services');
const { default: ServicesPage } = await import('/static/pages/services/services.js?v=1.0');
window.servicesPage = ServicesPage;
} catch (error) {
console.error('Failed to initialize services page:', error);
}
})();
</script>
</body>
</html>