/ layouts.py
layouts.py
1 import dash 2 from dash import html, dcc 3 from config import RIVERS 4 5 def create_header(): 6 """Create the application header with modern styling""" 7 return html.Div([ 8 html.H1( 9 "Fäbu's App", 10 className="app-header" 11 ), 12 ], style={"padding": "10px"}) 13 14 def create_latest_measurements_section(): 15 """Create the latest measurements dashboard with modern design""" 16 rivers = ["aare", "reuss"] 17 18 measurements_grid = [] 19 for river in rivers: 20 river_config = RIVERS.get(river, {}) 21 measurements_grid.append( 22 html.Div([ 23 html.H3( 24 river_config.get("display_name", river.title()), 25 className="river-header", 26 ), 27 html.Div([ 28 html.Div([ 29 html.Div("Temperatur:", className="measurement-label"), 30 html.Div(id=f"{river}-temp-value", className="measurement-value"), 31 ], className="measurement-item"), 32 html.Div([ 33 html.Div("Abfluss:", className="measurement-label"), 34 html.Div(id=f"{river}-flow-value", className="measurement-value"), 35 ], className="measurement-item"), 36 html.Div([ 37 html.Div("Wasserstand:", className="measurement-label"), 38 html.Div(id=f"{river}-level-value", className="measurement-value"), 39 ], className="measurement-item"), 40 ], className="measurement-grid"), 41 ], className="measurement-card") 42 ) 43 44 return html.Div([ 45 html.H2( 46 "Aktuelle Messwerte", 47 className="dashboard-title", 48 ), 49 html.Div( 50 measurements_grid, 51 style={ 52 "display": "flex", 53 "gap": "1.5rem", 54 "marginBottom": "1.5rem", 55 "flexWrap": "wrap", 56 }, 57 ), 58 html.Div( 59 id="last-updated", 60 className="last-updated", 61 ), 62 ], className="measurement-card") 63 64 def create_river_section(river_name: str): 65 """Create a river section with temperature and flow graphs""" 66 river_config = RIVERS.get(river_name, {}) 67 river_title = river_config.get("display_name", river_name.title()) 68 69 return html.Div([ 70 html.H2(river_title, className="river-title"), 71 html.Div([ 72 dcc.Graph( 73 id=f"{river_name}-temp-graph", 74 config={"displayModeBar": False}, 75 className="graph-container", 76 ), 77 dcc.Graph( 78 id=f"{river_name}-flow-graph", 79 config={"displayModeBar": False}, 80 className="graph-container", 81 ), 82 ], className="graphs-container"), 83 ], className="river-section") 84 85 def create_layout(): 86 """Create the complete layout with modern styling""" 87 return html.Div([ 88 create_header(), 89 create_latest_measurements_section(), 90 create_river_section("aare"), 91 create_river_section("reuss"), 92 dcc.Interval( 93 id="interval-refresh", 94 interval=10 * 60 * 1000, 95 n_intervals=0 96 ), 97 ], style={"padding": "20px", "maxWidth": "1200px", "margin": "0 auto", "fontFamily": "Inter, sans-serif"})