#!/usr/bin/env python3 """Shared page-shell helpers for inline HTML templates.""" PAGE_LINKS = ( ("search", "Search", "/"), ("config", "Config", "/config"), ("watchlist", "Watchlist", "/watchlist"), ) BROWSER_API_HELPER = r""" async function api(path, options = {}) { const headers = new Headers(options.headers || {}); if (options.body && !headers.has("Content-Type")) { headers.set("Content-Type", "application/json"); } const response = await fetch(path, { ...options, headers }); const raw = await response.text(); let data = {}; if (raw) { try { data = JSON.parse(raw); } catch (_error) { data = { error: raw }; } } if (!response.ok) throw new Error(data.error || response.statusText || "Request failed"); return data; } """ BROWSER_POLL_HELPER = r""" function startSerialPoll(callback, intervalMs) { let inFlight = false; return window.setInterval(async () => { if (inFlight) return; inFlight = true; try { await callback(); } finally { inFlight = false; } }, intervalMs); } """ def render_sidebar_brand(note, badge, badge_id=""): badge_attr = f' id="{badge_id}"' if badge_id else "" return ( '
\n' '
\n' '

ani-cli web

\n' f"

{note}

\n" "
\n" f" {badge}\n" "
\n" ) def render_page_links(active_page): links = [] for key, label, href in PAGE_LINKS: class_name = "page-link active" if key == active_page else "page-link" links.append(f' {label}') return "
\n" + "\n".join(links) + "\n
\n"