diff --git a/packages/dashboard/index.html b/packages/dashboard/index.html index 0cca8f9..d787cc9 100644 --- a/packages/dashboard/index.html +++ b/packages/dashboard/index.html @@ -212,6 +212,91 @@ .hidden { display: none !important; } .loading { text-align: center; padding: 2rem; color: var(--text-dim); } + /* Hype Cycle Visualization */ + .hype-viz { position: relative; } + .hype-svg-wrap { + background: var(--surface); + border: 1px solid var(--border); + border-radius: 8px; + padding: 1.5rem; + overflow-x: auto; + } + .hype-svg-wrap svg { display: block; margin: 0 auto; } + .hype-dot { + cursor: pointer; + transition: r 0.2s, filter 0.2s; + } + .hype-dot:hover { filter: brightness(1.3); } + .hype-label { + font-size: 11px; + fill: var(--text); + pointer-events: none; + font-family: 'Inter', sans-serif; + } + .hype-phase-label { + font-size: 10px; + fill: var(--text-dim); + text-anchor: middle; + font-family: 'Inter', sans-serif; + } + .hype-detail-panel { + position: fixed; + top: 0; right: 0; + width: 420px; + height: 100vh; + background: var(--surface); + border-left: 1px solid var(--border); + box-shadow: -8px 0 32px rgba(0,0,0,0.5); + z-index: 1000; + overflow-y: auto; + transform: translateX(100%); + transition: transform 0.3s ease; + padding: 1.5rem; + } + .hype-detail-panel.open { transform: translateX(0); } + .hype-detail-close { + position: absolute; + top: 1rem; right: 1rem; + background: var(--surface2); + border: 1px solid var(--border); + color: var(--text); + width: 32px; height: 32px; + border-radius: 6px; + cursor: pointer; + font-size: 1.1rem; + display: flex; + align-items: center; + justify-content: center; + } + .hype-detail-close:hover { background: var(--border); } + .hype-detail-title { font-size: 1.3rem; font-weight: 700; margin-bottom: 0.25rem; } + .hype-detail-phase { font-size: 0.85rem; margin-bottom: 1.5rem; } + .hype-stat-grid { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 0.75rem; + margin-bottom: 1.5rem; + } + .hype-stat { + background: var(--surface2); + border-radius: 6px; + padding: 0.75rem; + } + .hype-stat-label { font-size: 0.7rem; text-transform: uppercase; color: var(--text-dim); letter-spacing: 0.05em; } + .hype-stat-value { font-size: 1.4rem; font-weight: 700; margin-top: 0.25rem; } + .hype-forecast-title { font-size: 0.85rem; font-weight: 600; text-transform: uppercase; color: var(--text-dim); margin-bottom: 0.75rem; } + .hype-forecast-bar { + display: flex; + align-items: center; + gap: 0.5rem; + margin-bottom: 0.4rem; + font-size: 0.85rem; + } + .hype-forecast-bar .year { width: 40px; color: var(--text-dim); font-variant-numeric: tabular-nums; } + .hype-forecast-bar .bar-track { flex: 1; height: 6px; background: var(--surface2); border-radius: 3px; overflow: hidden; } + .hype-forecast-bar .bar-fill { height: 100%; border-radius: 3px; transition: width 0.5s; } + .hype-forecast-bar .pct { width: 45px; text-align: right; font-variant-numeric: tabular-nums; color: var(--text-dim); } + @keyframes pulse { 0%,100% { opacity:1; } 50% { opacity:0.5; } } .animate-pulse { animation: pulse 2s infinite; } @@ -303,17 +388,39 @@