"""Loads and concatenates the modular CSS files under ``static/css/``. Modules are loaded in a deterministic order that matches the cascade: variables first, then layout, then components, then dark-mode overrides. Adding a new stylesheet? Append it to ``_LOAD_ORDER`` below. """ from __future__ import annotations from pathlib import Path _CSS_DIR = Path(__file__).parent / "static" / "css" _LOAD_ORDER = ( "_variables.css", # CSS custom properties (light + dark) "_layout.css", # html/body/container/font "_chatbot.css", # chat bubble / markdown / table rules "_chat.css", # custom chat surface layout (loaded AFTER _chatbot # so our overrides for #hy-chat-host / .message.user # win conflicts with the !important rules above) "_perf.css", # content-visibility / containment for long convos "_math.css", # KaTeX math rendering "_thinking.css", # collapsible reasoning block "_legacy.css", # form/label/prose tweaks (Svelte-hash-free) "_input.css", # message input, send/new buttons "_misc.css", # request-id, code blocks, blockquote, slider "_modals.css", # tool area + html preview modal "_typing.css", # typing indicator (waiting for model) "_examples.css", # empty-state examples overlay "_hide.css", # hide gradio defaults (avatars/buttons) "_dark.css", # remaining dark-mode overrides (sliders, scrollbars) ) def _load_css() -> str: parts: list[str] = [] for name in _LOAD_ORDER: path = _CSS_DIR / name parts.append(f"/* === {name} === */\n{path.read_text(encoding='utf-8')}") return "\n".join(parts) CSS = _load_css()