Self-hostable uptime monitor and status page on Django: HTTP checks, Lighthouse audits, SEO crawls, and email and Discord alerts.
djangodockerhandcodedpythonself-hostedsqlitestatus-pageuptime-monitoringvite
1@use "variables" as *;
2
3@use "bootstrap/scss/bootstrap" with (
4 $font-family-sans-serif: $font-family-sans-serif,
5 $font-family-monospace: $font-family-monospace,
6 $headings-font-family: $headings-font-family,
7 $headings-font-weight: $headings-font-weight,
8 $font-size-base: $font-size-base,
9 $line-height-base: $line-height-base,
10 $headings-line-height: $headings-line-height,
11
12 $white: $white,
13 $gray-100: $gray-100,
14 $gray-200: $gray-200,
15 $gray-300: $gray-300,
16 $gray-400: $gray-400,
17 $gray-500: $gray-500,
18 $gray-600: $gray-600,
19 $gray-700: $gray-700,
20 $gray-800: $gray-800,
21 $gray-900: $gray-900,
22 $black: $black,
23
24 $body-bg: $body-bg,
25 $body-color: $body-color,
26
27 $primary: $primary,
28 $secondary: $secondary,
29 $success: $success,
30 $info: $info,
31 $warning: $warning,
32 $danger: $danger,
33 $light: $light,
34 $dark: $dark,
35
36 $link-color: $link-color,
37 $link-hover-color: $link-hover-color,
38 $link-decoration: $link-decoration,
39 $link-hover-decoration: $link-hover-decoration,
40
41 $border-color: $border-color,
42 $border-radius: $border-radius,
43 $border-radius-sm: $border-radius-sm,
44 $border-radius-lg: $border-radius-lg,
45
46 $card-bg: $card-bg,
47 $card-border-color: $card-border-color,
48 $card-color: $card-color,
49 $card-cap-bg: $card-cap-bg,
50
51 $input-bg: $input-bg,
52 $input-color: $input-color,
53 $input-border-color: $input-border-color,
54 $input-focus-bg: $input-focus-bg,
55 $input-focus-color: $input-focus-color,
56 $input-focus-border-color: $input-focus-border-color,
57 $input-focus-box-shadow: $input-focus-box-shadow,
58 $input-placeholder-color: $input-placeholder-color,
59
60 $navbar-dark-color: $navbar-dark-color,
61 $navbar-dark-hover-color: $navbar-dark-hover-color,
62 $navbar-dark-active-color: $navbar-dark-active-color,
63
64 $list-group-bg: $list-group-bg,
65 $list-group-border-color: $list-group-border-color,
66 $list-group-hover-bg: $list-group-hover-bg,
67 $list-group-action-color: $list-group-action-color,
68 $list-group-action-hover-color: $list-group-action-hover-color,
69 $list-group-action-active-bg: $list-group-action-active-bg,
70 $list-group-action-active-color: $list-group-action-active-color,
71 $list-group-active-bg: $list-group-active-bg,
72 $list-group-active-border-color: $list-group-active-border-color,
73 $list-group-active-color: $list-group-active-color,
74
75 $breadcrumb-active-color: $breadcrumb-active-color,
76 $breadcrumb-divider-color: $breadcrumb-divider-color,
77
78 $dropdown-bg: $dropdown-bg,
79 $dropdown-border-color: $dropdown-border-color,
80 $dropdown-color: $dropdown-color,
81 $dropdown-link-color: $dropdown-link-color,
82 $dropdown-link-hover-color: $dropdown-link-hover-color,
83 $dropdown-link-hover-bg: $dropdown-link-hover-bg,
84
85 $btn-close-color: $btn-close-color,
86
87 $modal-content-bg: $modal-content-bg,
88 $modal-content-border-color: $modal-content-border-color,
89 $modal-header-border-color: $modal-header-border-color,
90 $modal-footer-border-color: $modal-footer-border-color,
91 $modal-backdrop-bg: $modal-backdrop-bg,
92 $modal-backdrop-opacity: $modal-backdrop-opacity,
93
94 $progress-bg: $progress-bg,
95 $progress-bar-bg: $progress-bar-bg,
96
97 $table-bg: $table-bg,
98 $table-color: $table-color,
99 $table-border-color: $table-border-color,
100);
101
102
103// ── Surface utilities ──
104
105.bg-surface {
106 background: #13120e !important;
107}
108
109.bg-surface-2 {
110 background: #18160f !important;
111}
112
113.bg-deep {
114 background: #09080626 !important; // very subtle warm black
115}
116
117.bg-deep,
118.bg-black {
119 background-color: #090806 !important;
120}
121
122.border-subtle {
123 border-color: rgba(107, 158, 120, 0.1) !important;
124}
125
126.text-muted {
127 color: #9e968a !important;
128}
129
130.text-green {
131 color: $green-bright !important;
132}
133
134.text-amber {
135 color: $amber !important;
136}
137
138// Legacy utility aliases used by existing templates
139.bg-teal-900 { background-color: #090806 !important; }
140.bg-teal-800 { background-color: #0e0d0a !important; }
141
142.link-footer {
143 color: $gray-400;
144 text-decoration: none;
145 transition: color 200ms ease;
146
147 &:hover {
148 color: $white;
149 }
150}
151
152.breadcrumb {
153 display: block;
154 flex-wrap: nowrap;
155 white-space: nowrap;
156 margin-bottom: 0;
157
158 .breadcrumb-item {
159 font-size: 0.82em;
160 white-space: nowrap;
161 display: inline-block;
162
163 a {
164 color: $gray-400;
165 text-decoration: none;
166 transition: color 150ms ease;
167
168 &:hover {
169 color: $green-bright;
170 }
171 }
172
173 &.active {
174 color: $gray-200;
175 }
176 }
177}
178
179// Buttons — flat, no glow
180.btn {
181 letter-spacing: 0.02em;
182 font-weight: 500;
183 transition: background-color 180ms ease, border-color 180ms ease, color 180ms ease;
184}
185
186.btn-primary {
187 color: #0b0a08;
188 background: $green;
189 border-color: $green;
190
191 &:hover,
192 &:focus {
193 color: #0b0a08;
194 background: $green-bright;
195 border-color: $green-bright;
196 }
197}
198
199.btn-success {
200 color: #0b0a08;
201 background: $green;
202 border-color: $green;
203
204 &:hover,
205 &:focus {
206 color: #0b0a08;
207 background: $green-bright;
208 border-color: $green-bright;
209 }
210}
211
212.btn-outline-light {
213 border-color: rgba(221, 215, 205, 0.18);
214 color: $gray-200;
215
216 &:hover,
217 &:focus {
218 background: rgba(221, 215, 205, 0.05);
219 border-color: rgba(221, 215, 205, 0.35);
220 color: $white;
221 }
222}
223
224.btn-outline-danger {
225 color: $terracotta;
226 border-color: $terracotta-border;
227
228 &:hover,
229 &:focus {
230 background: $terracotta-dim;
231 color: #d88870;
232 border-color: rgba(196, 112, 85, 0.4);
233 }
234}
235
236.btn-link {
237 color: $green-bright;
238}
239
240// Alerts for dark
241.alert { border-radius: $border-radius; }
242
243.alert-info {
244 background: rgba(126, 170, 184, 0.08);
245 border-color: rgba(126, 170, 184, 0.2);
246 color: #9ec5d2;
247}
248
249.alert-warning {
250 background: $amber-dim;
251 border-color: $amber-border;
252 color: #ddc06a;
253}
254
255.alert-danger {
256 background: $terracotta-dim;
257 border-color: $terracotta-border;
258 color: #e38871;
259}
260
261.alert-success {
262 background: $green-dim;
263 border-color: $green-border;
264 color: $green-bright;
265}
266
267// Forms
268.form-control,
269.form-select {
270 background-color: $input-bg;
271 border-color: $input-border-color;
272 color: $input-color;
273
274 &:focus {
275 background-color: $input-focus-bg;
276 }
277}
278
279.form-floating > label {
280 color: #665f56;
281}
282
283// Badges
284.badge {
285 font-weight: 500;
286 letter-spacing: 0.04em;
287 padding: 0.35em 0.55em;
288}
289
290// Pagination
291.page-link {
292 background: $card-bg;
293 border-color: $card-border-color;
294 color: $gray-300;
295
296 &:hover {
297 background: #1a1812;
298 border-color: $green-border;
299 color: $green-bright;
300 }
301}
302
303.page-item.active .page-link {
304 background: $green-dim;
305 border-color: $green-border;
306 color: $green-bright;
307}
308
309.page-item.disabled .page-link {
310 background: $card-bg;
311 border-color: $card-border-color;
312 color: #4a443c;
313}