feat(brand): "Letter D (sans)" app icon — favicon + sidebar chip

Implements ``Business/DataTools/app_icons.html`` §03 "Letter D (sans)"
as the canonical app mark.

- New ``src/gui/assets/datatools_icon.svg`` — 64×64 SVG, 14px corner
  radius, ink ground (#1c1917), cream "D" (#fef4ed) in
  Geist 700 / -0.04em tracking. Pure SVG so it renders sharp at
  every favicon size; font stack falls back through Geist →
  system sans where the webfont isn't installed (favicons can't load
  Google Fonts).

- ``_home.py``, ``_Activate.py``, ``99_Close.py``: page_icon now
  resolves the SVG path via ``Path(__file__).parent / "assets" /
  "datatools_icon.svg"`` instead of the broom 🧹 / 🔑 / 🛑
  emojis. Streamlit inlines it as a ``data:image/svg+xml;base64,...``
  link tag so the browser tab + OS app-icon for ``python -m src.gui``
  matches the sidebar chip.

- Sidebar ``.dt-brand-mark`` tightened to match the spec's "Letter D
  (sans)" rendering: ``font-weight: 700`` and
  ``letter-spacing: -0.04em`` (was 600 / -0.02em). The on-screen
  chip is now a scaled-up copy of the OS icon.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-19 01:50:18 +00:00
parent d436e34a45
commit 6c3939d21b
5 changed files with 34 additions and 5 deletions

View File

@@ -171,9 +171,11 @@ def _home_page() -> None:
from src.gui.components._legacy import _run_analysis_on_upload
from src.i18n import t
from pathlib import Path as _Path
_ICON_PATH = str(_Path(__file__).parent / "assets" / "datatools_icon.svg")
st.set_page_config(
page_title=t("home.page_title"),
page_icon="🧹",
page_icon=_ICON_PATH,
layout="wide",
)
hide_streamlit_chrome()