feat: donation banner, About tab, settings UI improvements
Some checks failed
Lint & Test / test (push) Has been cancelled

- Dismissible donation/open-source banner after 3+ sessions (30-day snooze)
- New About tab in Settings: version, repo link, license info
- Centralize project URLs (REPO_URL, DONATE_URL) in __init__.py, served via /health
- Center settings tab bar, reduce tab padding for 6-tab fit
- External URL save button: icon button instead of full-width text button
- Remove redundant settings footer close button
- Footer "Source Code" link replaced with "About" opening settings
- i18n keys for en/ru/zh
This commit is contained in:
2026-03-27 21:09:34 +03:00
parent f61a0206d4
commit f3d07fc47f
18 changed files with 442 additions and 49 deletions

View File

@@ -12,11 +12,14 @@ from fastapi.staticfiles import StaticFiles
from fastapi.templating import Jinja2Templates
from starlette.requests import Request
from wled_controller import __version__
from wled_controller import __version__, GITEA_BASE_URL, GITEA_REPO
from wled_controller.api import router
from wled_controller.api.dependencies import init_dependencies
from wled_controller.config import get_config
from wled_controller.core.processing.processor_manager import ProcessorDependencies, ProcessorManager
from wled_controller.core.processing.processor_manager import (
ProcessorDependencies,
ProcessorManager,
)
from wled_controller.storage import DeviceStore
from wled_controller.storage.template_store import TemplateStore
from wled_controller.storage.postprocessing_template_store import PostprocessingTemplateStore
@@ -31,7 +34,9 @@ from wled_controller.storage.value_source_store import ValueSourceStore
from wled_controller.storage.automation_store import AutomationStore
from wled_controller.storage.scene_preset_store import ScenePresetStore
from wled_controller.storage.sync_clock_store import SyncClockStore
from wled_controller.storage.color_strip_processing_template_store import ColorStripProcessingTemplateStore
from wled_controller.storage.color_strip_processing_template_store import (
ColorStripProcessingTemplateStore,
)
from wled_controller.storage.gradient_store import GradientStore
from wled_controller.storage.weather_source_store import WeatherSourceStore
from wled_controller.storage.asset_store import AssetStore
@@ -61,6 +66,7 @@ db = Database(config.storage.database_file)
# Seed demo data after DB is ready (first-run only)
if config.demo:
from wled_controller.core.demo_seed import seed_demo_data
seed_demo_data(db)
# Initialize storage and processing
@@ -148,7 +154,8 @@ async def lifespan(app: FastAPI):
# Create automation engine (needs processor_manager + mqtt_service + stores for scene activation)
automation_engine = AutomationEngine(
automation_store, processor_manager,
automation_store,
processor_manager,
mqtt_service=mqtt_service,
scene_preset_store=scene_preset_store,
target_store=output_target_store,
@@ -165,8 +172,8 @@ async def lifespan(app: FastAPI):
# Create update service (checks for new releases)
_release_provider = GiteaReleaseProvider(
base_url="https://git.dolgolyov-family.by",
repo="alexei.dolgolyov/wled-screen-controller-mixed",
base_url=GITEA_BASE_URL,
repo=GITEA_REPO,
)
update_service = UpdateService(
provider=_release_provider,
@@ -177,7 +184,9 @@ async def lifespan(app: FastAPI):
# Initialize API dependencies
init_dependencies(
device_store, template_store, processor_manager,
device_store,
template_store,
processor_manager,
database=db,
pp_template_store=pp_template_store,
pattern_template_store=pattern_template_store,
@@ -309,6 +318,7 @@ async def lifespan(app: FastAPI):
except Exception as e:
logger.error(f"Error stopping MQTT service: {e}")
# Create FastAPI application
app = FastAPI(
title="LED Grab",
@@ -363,6 +373,7 @@ async def _no_cache_static(request: Request, call_next):
return response
return await call_next(request)
# Mount static files
static_path = Path(__file__).parent / "static"
if static_path.exists():