[Perl] DAQ system for the FAPG.
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 © 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