From 35ea21ad33cba1a72f24ec5169b3ee7d2f94cff0 Mon Sep 17 00:00:00 2001 From: Michael Date: Wed, 29 Apr 2026 01:20:54 +0000 Subject: [PATCH] feat: hide Streamlit chrome for app-like appearance Add shared hide_streamlit_chrome() helper that removes header bar, hamburger menu, footer, and deploy button via CSS injection. Called on every page. Add .streamlit/config.toml with minimal toolbar mode. Co-Authored-By: Claude Opus 4.6 --- .streamlit/config.toml | 8 +++++ src/gui/app.py | 8 ++--- src/gui/components.py | 41 +++++++++++++++++++++++++- src/gui/pages/1_Deduplicator.py | 2 ++ src/gui/pages/2_Text_Cleaner.py | 4 +++ src/gui/pages/3_Format_Standardizer.py | 4 +++ src/gui/pages/4_Missing_Values.py | 4 +++ src/gui/pages/5_Column_Mapper.py | 4 +++ src/gui/pages/6_Outlier_Detector.py | 4 +++ src/gui/pages/7_Multi_File_Merger.py | 4 +++ src/gui/pages/8_Validator_Reporter.py | 4 +++ src/gui/pages/9_Pipeline_Runner.py | 4 +++ 12 files changed, 85 insertions(+), 6 deletions(-) create mode 100644 .streamlit/config.toml diff --git a/.streamlit/config.toml b/.streamlit/config.toml new file mode 100644 index 0000000..9a79f89 --- /dev/null +++ b/.streamlit/config.toml @@ -0,0 +1,8 @@ +[client] +toolbarMode = "minimal" + +[server] +headless = true + +[browser] +gatherUsageStats = false diff --git a/src/gui/app.py b/src/gui/app.py index 0b4f7a8..02aa625 100644 --- a/src/gui/app.py +++ b/src/gui/app.py @@ -21,17 +21,15 @@ if str(_project_root) not in sys.path: # Page config # --------------------------------------------------------------------------- +from src.gui.components import hide_streamlit_chrome + st.set_page_config( page_title="DataTools โ€” Data Cleaning Mastery", page_icon="๐Ÿงน", layout="wide", ) -# Hide the Deploy button from the toolbar -st.markdown( - "", - unsafe_allow_html=True, -) +hide_streamlit_chrome() # --------------------------------------------------------------------------- diff --git a/src/gui/components.py b/src/gui/components.py index 8946ce1..f147c24 100644 --- a/src/gui/components.py +++ b/src/gui/components.py @@ -1,4 +1,4 @@ -"""Reusable Streamlit widgets for the deduplicator GUI.""" +"""Reusable Streamlit widgets for the DataTools GUI.""" from __future__ import annotations @@ -24,6 +24,45 @@ from src.core.config import ( from src.core.normalizers import NormalizerType +# --------------------------------------------------------------------------- +# App chrome โ€” hide Streamlit default UI for app-like feel +# --------------------------------------------------------------------------- + +_HIDE_CHROME_CSS = """ + +""" + + +def hide_streamlit_chrome() -> None: + """Inject CSS to hide Streamlit's default header, menu, and footer.""" + st.markdown(_HIDE_CHROME_CSS, unsafe_allow_html=True) + + # --------------------------------------------------------------------------- # Config panel (advanced options) # --------------------------------------------------------------------------- diff --git a/src/gui/pages/1_Deduplicator.py b/src/gui/pages/1_Deduplicator.py index 125f78b..5356bf8 100644 --- a/src/gui/pages/1_Deduplicator.py +++ b/src/gui/pages/1_Deduplicator.py @@ -19,10 +19,12 @@ from src.core.io import read_file, list_sheets, detect_encoding, detect_delimite from src.gui.components import ( apply_review_decisions, config_panel, + hide_streamlit_chrome, match_group_card, results_summary, ) +hide_streamlit_chrome() # --------------------------------------------------------------------------- # Session state defaults diff --git a/src/gui/pages/2_Text_Cleaner.py b/src/gui/pages/2_Text_Cleaner.py index c114e09..9b8be97 100644 --- a/src/gui/pages/2_Text_Cleaner.py +++ b/src/gui/pages/2_Text_Cleaner.py @@ -11,6 +11,10 @@ _project_root = Path(__file__).resolve().parent.parent.parent.parent if str(_project_root) not in sys.path: sys.path.insert(0, str(_project_root)) +from src.gui.components import hide_streamlit_chrome + +hide_streamlit_chrome() + # --------------------------------------------------------------------------- # Header # --------------------------------------------------------------------------- diff --git a/src/gui/pages/3_Format_Standardizer.py b/src/gui/pages/3_Format_Standardizer.py index cc3a3b0..2976325 100644 --- a/src/gui/pages/3_Format_Standardizer.py +++ b/src/gui/pages/3_Format_Standardizer.py @@ -11,6 +11,10 @@ _project_root = Path(__file__).resolve().parent.parent.parent.parent if str(_project_root) not in sys.path: sys.path.insert(0, str(_project_root)) +from src.gui.components import hide_streamlit_chrome + +hide_streamlit_chrome() + # --------------------------------------------------------------------------- # Header # --------------------------------------------------------------------------- diff --git a/src/gui/pages/4_Missing_Values.py b/src/gui/pages/4_Missing_Values.py index 8db07ab..c34b1eb 100644 --- a/src/gui/pages/4_Missing_Values.py +++ b/src/gui/pages/4_Missing_Values.py @@ -11,6 +11,10 @@ _project_root = Path(__file__).resolve().parent.parent.parent.parent if str(_project_root) not in sys.path: sys.path.insert(0, str(_project_root)) +from src.gui.components import hide_streamlit_chrome + +hide_streamlit_chrome() + # --------------------------------------------------------------------------- # Header # --------------------------------------------------------------------------- diff --git a/src/gui/pages/5_Column_Mapper.py b/src/gui/pages/5_Column_Mapper.py index b406e48..df11527 100644 --- a/src/gui/pages/5_Column_Mapper.py +++ b/src/gui/pages/5_Column_Mapper.py @@ -11,6 +11,10 @@ _project_root = Path(__file__).resolve().parent.parent.parent.parent if str(_project_root) not in sys.path: sys.path.insert(0, str(_project_root)) +from src.gui.components import hide_streamlit_chrome + +hide_streamlit_chrome() + # --------------------------------------------------------------------------- # Header # --------------------------------------------------------------------------- diff --git a/src/gui/pages/6_Outlier_Detector.py b/src/gui/pages/6_Outlier_Detector.py index 0860c49..c342ff1 100644 --- a/src/gui/pages/6_Outlier_Detector.py +++ b/src/gui/pages/6_Outlier_Detector.py @@ -11,6 +11,10 @@ _project_root = Path(__file__).resolve().parent.parent.parent.parent if str(_project_root) not in sys.path: sys.path.insert(0, str(_project_root)) +from src.gui.components import hide_streamlit_chrome + +hide_streamlit_chrome() + # --------------------------------------------------------------------------- # Header # --------------------------------------------------------------------------- diff --git a/src/gui/pages/7_Multi_File_Merger.py b/src/gui/pages/7_Multi_File_Merger.py index b5a1dec..8a22e65 100644 --- a/src/gui/pages/7_Multi_File_Merger.py +++ b/src/gui/pages/7_Multi_File_Merger.py @@ -11,6 +11,10 @@ _project_root = Path(__file__).resolve().parent.parent.parent.parent if str(_project_root) not in sys.path: sys.path.insert(0, str(_project_root)) +from src.gui.components import hide_streamlit_chrome + +hide_streamlit_chrome() + # --------------------------------------------------------------------------- # Header # --------------------------------------------------------------------------- diff --git a/src/gui/pages/8_Validator_Reporter.py b/src/gui/pages/8_Validator_Reporter.py index f5f16a2..614ec4c 100644 --- a/src/gui/pages/8_Validator_Reporter.py +++ b/src/gui/pages/8_Validator_Reporter.py @@ -11,6 +11,10 @@ _project_root = Path(__file__).resolve().parent.parent.parent.parent if str(_project_root) not in sys.path: sys.path.insert(0, str(_project_root)) +from src.gui.components import hide_streamlit_chrome + +hide_streamlit_chrome() + # --------------------------------------------------------------------------- # Header # --------------------------------------------------------------------------- diff --git a/src/gui/pages/9_Pipeline_Runner.py b/src/gui/pages/9_Pipeline_Runner.py index 0660481..7346887 100644 --- a/src/gui/pages/9_Pipeline_Runner.py +++ b/src/gui/pages/9_Pipeline_Runner.py @@ -11,6 +11,10 @@ _project_root = Path(__file__).resolve().parent.parent.parent.parent if str(_project_root) not in sys.path: sys.path.insert(0, str(_project_root)) +from src.gui.components import hide_streamlit_chrome + +hide_streamlit_chrome() + # --------------------------------------------------------------------------- # Header # ---------------------------------------------------------------------------