diff --git a/requirements-ci.txt b/requirements-ci.txt index 3bbe292..aa83afa 100644 --- a/requirements-ci.txt +++ b/requirements-ci.txt @@ -8,4 +8,6 @@ lxml zeep fastapi uvicorn -mcp; python_version >= "3.10" \ No newline at end of file +# mcp 2.0 renamed/moved FastMCP (mcp.server.fastmcp.FastMCP -> mcp.server.mcpserver.MCPServer) +# with an incompatible constructor, breaking TimeTrackerMCP_Server.py; pinned until it's migrated. +mcp<2.0; python_version >= "3.10" \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index c9eedf0..70570c2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,4 +7,6 @@ spyne lxml fastapi uvicorn -mcp; python_version >= "3.10" \ No newline at end of file +# mcp 2.0 renamed/moved FastMCP (mcp.server.fastmcp.FastMCP -> mcp.server.mcpserver.MCPServer) +# with an incompatible constructor, breaking TimeTrackerMCP_Server.py; pinned until it's migrated. +mcp<2.0; python_version >= "3.10" \ No newline at end of file diff --git a/sl/SL_Menu.py b/sl/SL_Menu.py index b10f1fe..924615d 100644 --- a/sl/SL_Menu.py +++ b/sl/SL_Menu.py @@ -155,6 +155,20 @@ def render_icon_button_css(): row-gap: 0 !important; }} + /* Adds breathing room above the toolbar itself. Deliberately its own + rule rather than folded into the one above: that one's selector + (:has st-key-toolbar_new_popover) never actually matches anything + - st.popover()'s key= doesn't get reflected as a "st-key-*" class + in this Streamlit version (same root cause worked around in + button_selectors above) - so touching it would newly activate its + existing align-items/column-gap rules too, changing more than + just spacing. st-key-toolbar_today_btn is a plain st.button, whose + key correctly does become a class, so it reliably identifies the + same toolbar row without that side effect. */ + [data-testid="stHorizontalBlock"]:has([class*="st-key-toolbar_today_btn"]) {{ + margin-top: 1rem !important; + }} + [data-testid="column"]:has([class*="st-key-toolbar_"]), [data-testid="column"]:has([class*="st-key-main_done_button"]), [data-testid="column"]:has([class*="st-key-main_edit_button"]), diff --git a/sl/style_blue.css b/sl/style_blue.css index 55de807..8484cdf 100644 --- a/sl/style_blue.css +++ b/sl/style_blue.css @@ -234,8 +234,12 @@ h5, h6 { with white text) shares that same pseudo-element with the out-of-month filler cells above, so it lost its fill too - leaving white-on-transparent text that's invisible against this theme's light background. Restore a - solid, on-brand circle behind just the selected day. */ -[data-baseweb="calendar"] .st-cj::after { + solid, on-brand circle behind just the selected day. + Matched via aria-label (BaseWeb prefixes it with "Selected" only for that + one cell) rather than a class name: Streamlit/emotion assigns those + classes by render order, so the exact class standing for "selected" here + can differ from page to page - it is not a stable hook. */ +[data-baseweb="calendar"] [aria-label^="Selected"]::after { background-color: var(--tc-accent) !important; } diff --git a/sl/style_claude.css b/sl/style_claude.css index 03930db..990063e 100644 --- a/sl/style_claude.css +++ b/sl/style_claude.css @@ -235,8 +235,12 @@ h5, h6 { with white text) shares that same pseudo-element with the out-of-month filler cells above, so it lost its fill too - leaving white-on-transparent text that's invisible against this theme's light background. Restore a - solid, on-brand circle behind just the selected day. */ -[data-baseweb="calendar"] .st-cj::after { + solid, on-brand circle behind just the selected day. + Matched via aria-label (BaseWeb prefixes it with "Selected" only for that + one cell) rather than a class name: Streamlit/emotion assigns those + classes by render order, so the exact class standing for "selected" here + can differ from page to page - it is not a stable hook. */ +[data-baseweb="calendar"] [aria-label^="Selected"]::after { background-color: var(--tc-accent) !important; } diff --git a/sl/style_dark.css b/sl/style_dark.css index 57c8b89..f74b161 100644 --- a/sl/style_dark.css +++ b/sl/style_dark.css @@ -202,13 +202,33 @@ h5, h6 { background-color: transparent !important; } +/* BaseWeb sets its own default near-black text color (meant for a light + background) directly on the day-number cells and the month/year nav + buttons, rather than leaving it to inherit from the calendar-level color + rule above - so that rule alone never reaches them, and the numbers are + nearly invisible against this theme's dark popover background. Override + both directly: full text color for the day numbers themselves (primary + content), the muted tone for the nav buttons and weekday-initials row + (secondary chrome), matching how the rest of this stylesheet treats + labels/captions. */ +[data-baseweb="calendar"] [role="gridcell"] { + color: var(--tc-text) !important; +} + +[data-baseweb="calendar"] [role="presentation"], +[data-baseweb="calendar"] button { + color: var(--tc-text-muted) !important; +} + /* The selected day's own indicator (a circular ::after ring BaseWeb pairs with white text) shares that same pseudo-element with the out-of-month - filler cells above, so it lost its fill too. Text still happens to read - fine here since this theme's regular day text is already light-on-dark, - but give the selected day its own solid, on-brand circle too rather than - relying on that coincidence. */ -[data-baseweb="calendar"] .st-cj::after { + filler cells above, so it lost its fill too. Give the selected day its + own solid, on-brand circle instead. + Matched via aria-label (BaseWeb prefixes it with "Selected" only for that + one cell) rather than a class name: Streamlit/emotion assigns those + classes by render order, so the exact class standing for "selected" here + can differ from page to page - it is not a stable hook. */ +[data-baseweb="calendar"] [aria-label^="Selected"]::after { background-color: var(--tc-accent) !important; } diff --git a/tt/TimeTracker.py b/tt/TimeTracker.py index a364f88..ebad6d0 100644 --- a/tt/TimeTracker.py +++ b/tt/TimeTracker.py @@ -38,7 +38,7 @@ class TimeTracker: The data is loaded from and saved to a JSON file. """ - VERSION = "3.24" + VERSION = "3.25" STATUS_OPEN = "open" STATUS_CLOSED = "closed" STATUS_DONE = "done"