View raw

1 <!doctype html> 2 <html lang="en" data-bs-theme="light"> 3 <head> 4 <meta charset="utf-8"> 5 <title><%= title %></title> 6 <meta name="viewport" content="width=device-width, initial-scale=1"> 7 <link rel="preconnect" href="https://fonts.googleapis.com"> 8 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> 9 <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Figtree:wght@400;500;600;700;800&display=swap"> 10 <link 11 rel="stylesheet" 12 href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" 13 integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" 14 crossorigin="anonymous"> 15 <link rel="stylesheet" href="/css/app.css"> 16 </head> 17 <body> 18 19 <a class="visually-hidden-focusable" href="#main-content">Skip to main content</a> 20 21 % my $nav_page = stash('nav_page') // ''; 22 <nav id="navbar" class="navbar navbar-expand-md d-none d-md-flex bg-body border-bottom shadow-sm sticky-top mb-3" aria-label="Dashboard navigation"> 23 <div class="container-fluid px-3"> 24 <a id="navbar-brand" class="navbar-brand fw-bold text-success" href="/">FAPG</a> 25 26 <ul class="navbar-nav ms-auto"> 27 <li class="nav-item dropdown"> 28 <a class="nav-link fw-semibold dropdown-toggle<%== $nav_page eq 'probes' ? ' active' : '' %>" 29 href="#" 30 role="button" 31 data-bs-toggle="dropdown" 32 aria-expanded="false" 33 <%== $nav_page eq 'probes' ? 'aria-current="page"' : '' %>>Probes</a> 34 <ul class="dropdown-menu"> 35 <li><a class="dropdown-item" href="/probes">Readings</a></li> 36 <li><a class="dropdown-item" href="/probes/status">Status</a></li> 37 </ul> 38 </li> 39 <li class="nav-item"> 40 <a class="nav-link fw-semibold<%== $nav_page eq 'insights' ? ' active' : '' %>" href="/insights"<%== $nav_page eq 'insights' ? ' aria-current="page"' : '' %>>Insights</a> 41 </li> 42 <li class="nav-item"> 43 <a class="nav-link fw-semibold<%== $nav_page eq 'weather' ? ' active' : '' %>" href="/weather"<%== $nav_page eq 'weather' ? ' aria-current="page"' : '' %>>Weather</a> 44 </li> 45 <li class="nav-item"> 46 <a class="nav-link fw-semibold<%== $nav_page eq 'downloads' ? ' active' : '' %>" href="/downloads"<%== $nav_page eq 'downloads' ? ' aria-current="page"' : '' %>>Downloads</a> 47 </li> 48 </ul> 49 </div> 50 </nav> 51 52 <nav class="mobile-bottom-nav d-md-none" aria-label="Primary navigation" data-mobile-navigation> 53 <a class="mobile-bottom-nav-link<%== $nav_page eq 'home' ? ' active' : '' %>" href="/"<%== $nav_page eq 'home' ? ' aria-current="page"' : '' %>>Home</a> 54 <a class="mobile-bottom-nav-link<%== $nav_page eq 'insights' ? ' active' : '' %>" href="/insights"<%== $nav_page eq 'insights' ? ' aria-current="page"' : '' %>>Insights</a> 55 <a class="mobile-bottom-nav-link<%== $nav_page eq 'probes' ? ' active' : '' %>" href="/probes"<%== $nav_page eq 'probes' ? ' aria-current="page"' : '' %>>Probes</a> 56 <a class="mobile-bottom-nav-link<%== $nav_page eq 'weather' ? ' active' : '' %>" href="/weather"<%== $nav_page eq 'weather' ? ' aria-current="page"' : '' %>>Weather</a> 57 </nav> 58 59 <main id="main-content" class="container"> 60 % if (stash('page_title')) { 61 <h1 class="visually-hidden"><%= stash('page_title') %></h1> 62 % } 63 %= include 'dashboard/toolbar', breadcrumbs => (stash('breadcrumbs') // []), graph_control_aria_label => stash('graph_control_aria_label') 64 <%= content %> 65 </main> 66 67 <footer id="site-footer" class="text-center text-body-secondary small py-3 mt-4 bg-body-tertiary border-top"> 68 <p class="mb-0"> 69 <a class="text-body-secondary" href="https://www.lafermeaquaponique.com/">lafermeaquaponique.com</a> 70 </p> 71 <p class="mb-0">Copyright &copy; 2026 Marius Peter</p> 72 </footer> 73 74 <script 75 src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js" 76 integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" 77 crossorigin="anonymous"></script> 78 % if (stash('use_charts')) { 79 <script 80 src="https://cdn.jsdelivr.net/npm/chart.js@4.5.1/dist/chart.umd.min.js" 81 integrity="sha384-jb8JQMbMoBUzgWatfe6COACi2ljcDdZQ2OxczGA3bGNeWe+6DChMTBJemed7ZnvJ" 82 crossorigin="anonymous"></script> 83 % } 84 <script type="module" src="/js/dashboard.js"></script> 85 </body> 86 </html> 87