Update pages/type_text.py
Browse files- pages/type_text.py +125 -81
pages/type_text.py
CHANGED
@@ -10,97 +10,141 @@ import os
|
|
10 |
os.getenv("HF_TOKEN")
|
11 |
|
12 |
|
13 |
-
#
|
14 |
-
#
|
15 |
-
|
16 |
-
|
17 |
-
|
18 |
-
|
19 |
-
|
20 |
-
|
21 |
-
|
22 |
-
|
23 |
-
|
24 |
-
|
25 |
-
#
|
26 |
-
#
|
27 |
-
#
|
28 |
-
# Streamlit's default
|
29 |
-
# Streamlit's default
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
|
62 |
-
|
63 |
-
|
64 |
-
|
65 |
-
|
66 |
-
|
67 |
-
|
68 |
-
|
|
|
|
|
|
|
69 |
"""
|
70 |
-
st.markdown(
|
71 |
|
72 |
-
#
|
73 |
-
#
|
|
|
74 |
|
75 |
-
|
|
|
|
|
76 |
|
77 |
-
#
|
78 |
-
|
79 |
-
#
|
|
|
|
|
|
|
|
|
|
|
80 |
|
81 |
-
# Example using columns for layout
|
82 |
-
header_cols = st.columns([3, 2]) # Adjust ratios as needed
|
83 |
-
with header_cols[0]:
|
84 |
-
st.subheader("Dashboard Overview π")
|
85 |
-
# You could put a logo here: st.image("logo.png", width=100)
|
86 |
-
with header_cols[1]:
|
87 |
-
# Call your stStatusWidget or place its constituent widgets here
|
88 |
-
st.status(label="StatusIcon") # Our placeholder status widget
|
89 |
|
90 |
-
|
|
|
|
|
|
|
|
|
91 |
|
92 |
-
# 3. Add the rest of your page content to demonstrate scrolling
|
93 |
-
st.markdown("## Main Content Area")
|
94 |
-
st.write("Scroll down to see the header stick.")
|
95 |
|
96 |
-
|
97 |
-
|
98 |
-
if (
|
99 |
-
|
|
|
100 |
|
101 |
-
st.markdown("---")
|
102 |
-
st.write("End of content.")
|
103 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
104 |
|
105 |
|
106 |
|
|
|
10 |
os.getenv("HF_TOKEN")
|
11 |
|
12 |
|
13 |
+
# --- PAGE CONFIG (Optional: Must be the first Streamlit command) ---
|
14 |
+
# st.set_page_config(layout="wide") # Example: Use wide mode
|
15 |
+
|
16 |
+
# --- NAVIGATION LOGIC ---
|
17 |
+
# Initialize session state for page navigation if it doesn't exist
|
18 |
+
if "page" not in st.session_state:
|
19 |
+
st.session_state.page = "Home"
|
20 |
+
|
21 |
+
# Function to change the current page
|
22 |
+
def set_page(page_name):
|
23 |
+
st.session_state.page = page_name
|
24 |
+
|
25 |
+
# --- CSS FOR STICKY NAVBAR ---
|
26 |
+
# You might need to adjust 'top' if Streamlit's default header is visible
|
27 |
+
# and you want your navbar to be below it. Streamlit's header is approx 3rem-3.5rem.
|
28 |
+
# If you've hidden Streamlit's default header, 'top: 0;' should work.
|
29 |
+
# Let's assume Streamlit's default header IS visible for this example.
|
30 |
+
STREAMLIT_DEFAULT_HEADER_HEIGHT = "3.5rem" # Approximate
|
31 |
+
|
32 |
+
# Define the CSS for the sticky navbar
|
33 |
+
# We will wrap our Streamlit columns/buttons in a div with class "sticky-navbar-container"
|
34 |
+
navbar_style = f"""
|
35 |
+
<style>
|
36 |
+
.sticky-navbar-container {{
|
37 |
+
position: sticky;
|
38 |
+
top: {STREAMLIT_DEFAULT_HEADER_HEIGHT}; /* Stick below Streamlit's default header */
|
39 |
+
background-color: #FFFFFF; /* Or your app's background color e.g. #F0F2F6 */
|
40 |
+
z-index: 1001; /* High z-index to keep it on top */
|
41 |
+
padding: 0.75rem 1rem; /* Adjust padding as needed */
|
42 |
+
box-shadow: 0 2px 4px -1px rgba(0,0,0,0.1); /* Optional: subtle shadow */
|
43 |
+
border-bottom: 1px solid #E0E0E0; /* Optional: subtle border */
|
44 |
+
width: 100%; /* Ensure it spans the full width */
|
45 |
+
}}
|
46 |
+
/* Optional: Style for the buttons for a more 'navbar' look */
|
47 |
+
.sticky-navbar-container .stButton>button {{
|
48 |
+
border: none; /* Remove default button border */
|
49 |
+
padding: 0.5rem 1rem; /* Adjust button padding */
|
50 |
+
margin: 0 0.25rem; /* Spacing between buttons */
|
51 |
+
/* background-color: transparent; */ /* Make button background transparent */
|
52 |
+
/* color: #31333F; */ /* Set text color */
|
53 |
+
font-weight: 500;
|
54 |
+
}}
|
55 |
+
.sticky-navbar-container .stButton>button:hover {{
|
56 |
+
/* background-color: #E0E0E0; */ /* Hover effect */
|
57 |
+
/* color: #000000; */
|
58 |
+
}}
|
59 |
+
.sticky-navbar-container .stButton>button:focus {{
|
60 |
+
/* outline: 2px solid #007bff; */ /* Focus outline */
|
61 |
+
/* box-shadow: none; */
|
62 |
+
}}
|
63 |
+
/* Style for an active-like button (if you want to highlight current page) */
|
64 |
+
.sticky-navbar-container .stButton.active-button>button {{
|
65 |
+
/* background-color: #007bff; */
|
66 |
+
/* color: white; */
|
67 |
+
font-weight: bold;
|
68 |
+
border-bottom: 2px solid #007BFF; /* Example active indicator */
|
69 |
+
}}
|
70 |
+
|
71 |
+
</style>
|
72 |
"""
|
73 |
+
st.markdown(navbar_style, unsafe_allow_html=True)
|
74 |
|
75 |
+
# --- NAVBAR HTML STRUCTURE ---
|
76 |
+
# Start the div container for the navbar
|
77 |
+
st.markdown('<div class="sticky-navbar-container">', unsafe_allow_html=True)
|
78 |
|
79 |
+
# Create columns for navigation items
|
80 |
+
# Adjust the column ratios as needed, e.g., for a logo or app title
|
81 |
+
nav_cols = st.columns([1, 1, 1, 1, 3]) # 4 nav items, 1 larger space for title/logo
|
82 |
|
83 |
+
# Navigation buttons
|
84 |
+
with nav_cols[0]:
|
85 |
+
# Add 'active-button' class conditionally for styling
|
86 |
+
active_class = "active-button" if st.session_state.page == "Home" else ""
|
87 |
+
if st.button("π Home", on_click=set_page, args=("Home",), use_container_width=True, key="nav_home", type="secondary"): # type can be "primary" or "secondary"
|
88 |
+
pass # on_click handles the logic
|
89 |
+
# Applying class via JS hack (if needed, st.button doesn't directly support class attribute)
|
90 |
+
if active_class: st.markdown(f"<script>document.querySelector('[data-testid=\"stButton\"] button[key*=\"nav_home\"]').closest('.stButton').classList.add('{active_class}');</script>", unsafe_allow_html=True)
|
91 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
92 |
|
93 |
+
with nav_cols[1]:
|
94 |
+
active_class = "active-button" if st.session_state.page == "Dashboard" else ""
|
95 |
+
if st.button("π Dashboard", on_click=set_page, args=("Dashboard",), use_container_width=True, key="nav_dashboard"):
|
96 |
+
pass
|
97 |
+
if active_class: st.markdown(f"<script>document.querySelector('[data-testid=\"stButton\"] button[key*=\"nav_dashboard\"]').closest('.stButton').classList.add('{active_class}');</script>", unsafe_allow_html=True)
|
98 |
|
|
|
|
|
|
|
99 |
|
100 |
+
with nav_cols[2]:
|
101 |
+
active_class = "active-button" if st.session_state.page == "Settings" else ""
|
102 |
+
if st.button("βοΈ Settings", on_click=set_page, args=("Settings",), use_container_width=True, key="nav_settings"):
|
103 |
+
pass
|
104 |
+
if active_class: st.markdown(f"<script>document.querySelector('[data-testid=\"stButton\"] button[key*=\"nav_settings\"]').closest('.stButton').classList.add('{active_class}');</script>", unsafe_allow_html=True)
|
105 |
|
|
|
|
|
106 |
|
107 |
+
with nav_cols[3]:
|
108 |
+
active_class = "active-button" if st.session_state.page == "About" else ""
|
109 |
+
if st.button("π€ About", on_click=set_page, args=("About",), use_container_width=True, key="nav_about"):
|
110 |
+
pass
|
111 |
+
if active_class: st.markdown(f"<script>document.querySelector('[data-testid=\"stButton\"] button[key*=\"nav_about\"]').closest('.stButton').classList.add('{active_class}');</script>", unsafe_allow_html=True)
|
112 |
+
|
113 |
+
|
114 |
+
# Optional: App title or logo in the navbar
|
115 |
+
with nav_cols[4]:
|
116 |
+
st.markdown("<h3 style='text-align:right; margin:0; padding-top:0.1rem;'>My Sticky App</h3>", unsafe_allow_html=True)
|
117 |
+
|
118 |
+
# Close the div container for the navbar
|
119 |
+
st.markdown('</div>', unsafe_allow_html=True)
|
120 |
+
|
121 |
+
|
122 |
+
# --- MAIN PAGE CONTENT ---
|
123 |
+
# Display content based on the selected page
|
124 |
+
if st.session_state.page == "Home":
|
125 |
+
st.header("π Home Page")
|
126 |
+
st.write("Welcome to the home page! This navbar will stick to the top as you scroll.")
|
127 |
+
for i in range(50):
|
128 |
+
st.write(f"Home: Scrollable content line {i+1}")
|
129 |
+
elif st.session_state.page == "Dashboard":
|
130 |
+
st.header("π Dashboard")
|
131 |
+
st.write("This is your main dashboard. Notice the sticky navigation.")
|
132 |
+
for i in range(50):
|
133 |
+
st.write(f"Dashboard: Scrollable content line {i+1}")
|
134 |
+
elif st.session_state.page == "Settings":
|
135 |
+
st.header("βοΈ Settings")
|
136 |
+
st.write("Configure your application settings here.")
|
137 |
+
for i in range(50):
|
138 |
+
st.write(f"Settings: Scrollable content line {i+1}")
|
139 |
+
elif st.session_state.page == "About":
|
140 |
+
st.header("π€ About Us")
|
141 |
+
st.write("Information about this application and its sticky navigation feature.")
|
142 |
+
for i in range(50):
|
143 |
+
st.write(f"About: Scrollable content line {i+1}")
|
144 |
+
|
145 |
+
# --- FOOTER (Example) ---
|
146 |
+
st.markdown("---")
|
147 |
+
st.write("This is the footer of the page.")
|
148 |
|
149 |
|
150 |
|