From 6c3939d21bd6043d58822cd37abe54639e259d13 Mon Sep 17 00:00:00 2001 From: Michael Date: Tue, 19 May 2026 01:50:18 +0000 Subject: [PATCH] =?UTF-8?q?feat(brand):=20"Letter=20D=20(sans)"=20app=20ic?= =?UTF-8?q?on=20=E2=80=94=20favicon=20+=20sidebar=20chip?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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) --- src/gui/_home.py | 4 +++- src/gui/assets/datatools_icon.svg | 19 +++++++++++++++++++ src/gui/components/_legacy.py | 8 ++++++-- src/gui/pages/99_Close.py | 4 +++- src/gui/pages/_Activate.py | 4 +++- 5 files changed, 34 insertions(+), 5 deletions(-) create mode 100644 src/gui/assets/datatools_icon.svg diff --git a/src/gui/_home.py b/src/gui/_home.py index b59aa8e..4780657 100644 --- a/src/gui/_home.py +++ b/src/gui/_home.py @@ -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() diff --git a/src/gui/assets/datatools_icon.svg b/src/gui/assets/datatools_icon.svg new file mode 100644 index 0000000..cee8da4 --- /dev/null +++ b/src/gui/assets/datatools_icon.svg @@ -0,0 +1,19 @@ + + + + + D + diff --git a/src/gui/components/_legacy.py b/src/gui/components/_legacy.py index 27f1282..4f0e8a2 100644 --- a/src/gui/components/_legacy.py +++ b/src/gui/components/_legacy.py @@ -201,6 +201,10 @@ body, .stApp { height: 100%; flex: 1; } +/* "Letter D (sans)" wordmark per Business/DataTools/app_icons.html + ยง03: 28px ink-filled rounded square, cream "D" in Geist 700 with + -0.04em tracking. Same shape used for the favicon SVG so the chip + in the sidebar reads as a scaled-up copy of the OS app icon. */ .dt-brand-mark { width: 28px; height: 28px; @@ -211,9 +215,9 @@ body, .stApp { justify-content: center; color: var(--accent-fill); font-family: var(--font-sans); - font-weight: 600; + font-weight: 700; font-size: 16px; - letter-spacing: -0.02em; + letter-spacing: -0.04em; line-height: 1; flex-shrink: 0; } diff --git a/src/gui/pages/99_Close.py b/src/gui/pages/99_Close.py index 9479ba3..a870ec2 100644 --- a/src/gui/pages/99_Close.py +++ b/src/gui/pages/99_Close.py @@ -20,9 +20,11 @@ if str(_project_root) not in sys.path: from src.gui.components import hide_streamlit_chrome, shutdown_app from src.i18n import t +from pathlib import Path as _Path +_ICON_PATH = str(_Path(__file__).parent.parent / "assets" / "datatools_icon.svg") st.set_page_config( page_title=t("close_page.page_title"), - page_icon="๐Ÿ›‘", + page_icon=_ICON_PATH, layout="wide", ) hide_streamlit_chrome() diff --git a/src/gui/pages/_Activate.py b/src/gui/pages/_Activate.py index 22b26b5..c0bb2b7 100644 --- a/src/gui/pages/_Activate.py +++ b/src/gui/pages/_Activate.py @@ -26,9 +26,11 @@ from src.gui.components import ( ) from src.i18n import t +from pathlib import Path as _Path +_ICON_PATH = str(_Path(__file__).parent.parent / "assets" / "datatools_icon.svg") st.set_page_config( page_title=t("activation.page_title"), - page_icon="๐Ÿ”‘", + page_icon=_ICON_PATH, layout="wide", )