basic-report 0.2.2__tar.gz → 0.3.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. {basic_report-0.2.2 → basic_report-0.3.0}/PKG-INFO +1 -1
  2. {basic_report-0.2.2 → basic_report-0.3.0}/pyproject.toml +1 -1
  3. basic_report-0.3.0/src/basic_report/configs/default.yaml +500 -0
  4. basic_report-0.3.0/src/basic_report/css_and_scripts/basic_report/section_title.css +41 -0
  5. {basic_report-0.2.2 → basic_report-0.3.0}/src/basic_report/page.py +133 -0
  6. {basic_report-0.2.2 → basic_report-0.3.0}/src/basic_report/report.py +81 -3
  7. {basic_report-0.2.2 → basic_report-0.3.0}/src/basic_report/templates/base.html +1 -0
  8. {basic_report-0.2.2 → basic_report-0.3.0}/src/basic_report/templates/css/colors.css +12 -0
  9. basic_report-0.3.0/src/basic_report/templates/elements/cards.html +22 -0
  10. {basic_report-0.2.2 → basic_report-0.3.0}/src/basic_report/templates/elements/report_ball_section.html +9 -9
  11. basic_report-0.3.0/src/basic_report/templates/elements/section_title.html +5 -0
  12. {basic_report-0.2.2 → basic_report-0.3.0}/src/basic_report/utils.py +9 -19
  13. basic_report-0.2.2/src/basic_report/configs/default.yaml +0 -243
  14. {basic_report-0.2.2 → basic_report-0.3.0}/LICENSE.md +0 -0
  15. {basic_report-0.2.2 → basic_report-0.3.0}/README.md +0 -0
  16. {basic_report-0.2.2 → basic_report-0.3.0}/src/basic_report/__init__.py +0 -0
  17. {basic_report-0.2.2 → basic_report-0.3.0}/src/basic_report/css_and_scripts/bootstrap/bootstrap.min.css +0 -0
  18. {basic_report-0.2.2 → basic_report-0.3.0}/src/basic_report/css_and_scripts/bootstrap/bootstrap.min.js +0 -0
  19. {basic_report-0.2.2 → basic_report-0.3.0}/src/basic_report/css_and_scripts/bootstrap/jquery-3.3.1.slim.min.js +0 -0
  20. {basic_report-0.2.2 → basic_report-0.3.0}/src/basic_report/css_and_scripts/bootstrap/popper.min.js +0 -0
  21. {basic_report-0.2.2 → basic_report-0.3.0}/src/basic_report/css_and_scripts/datatables/dataTables.bootstrap4.min.js +0 -0
  22. {basic_report-0.2.2 → basic_report-0.3.0}/src/basic_report/css_and_scripts/datatables/jquery.dataTables.min.js +0 -0
  23. {basic_report-0.2.2 → basic_report-0.3.0}/src/basic_report/css_and_scripts/heatmap/CalendarLabel.min.js +0 -0
  24. {basic_report-0.2.2 → basic_report-0.3.0}/src/basic_report/css_and_scripts/heatmap/Legend.min.js +0 -0
  25. {basic_report-0.2.2 → basic_report-0.3.0}/src/basic_report/css_and_scripts/heatmap/Tooltip.min.js +0 -0
  26. {basic_report-0.2.2 → basic_report-0.3.0}/src/basic_report/css_and_scripts/heatmap/cal-heatmap.css +0 -0
  27. {basic_report-0.2.2 → basic_report-0.3.0}/src/basic_report/css_and_scripts/heatmap/cal-heatmap.min.js +0 -0
  28. {basic_report-0.2.2 → basic_report-0.3.0}/src/basic_report/css_and_scripts/heatmap/d3.v7.min.js +0 -0
  29. {basic_report-0.2.2 → basic_report-0.3.0}/src/basic_report/css_and_scripts/heatmap/popper.min.js +0 -0
  30. {basic_report-0.2.2 → basic_report-0.3.0}/src/basic_report/heatmap.py +0 -0
  31. {basic_report-0.2.2 → basic_report-0.3.0}/src/basic_report/templates/css/accordion.css +0 -0
  32. {basic_report-0.2.2 → basic_report-0.3.0}/src/basic_report/templates/css/heatmap.css +0 -0
  33. {basic_report-0.2.2 → basic_report-0.3.0}/src/basic_report/templates/css/navbar.css +0 -0
  34. {basic_report-0.2.2 → basic_report-0.3.0}/src/basic_report/templates/css/site.css +0 -0
  35. {basic_report-0.2.2 → basic_report-0.3.0}/src/basic_report/templates/css/table.css +0 -0
  36. {basic_report-0.2.2 → basic_report-0.3.0}/src/basic_report/templates/css/tabs.css +0 -0
  37. {basic_report-0.2.2 → basic_report-0.3.0}/src/basic_report/templates/elements/accordion.html +0 -0
  38. {basic_report-0.2.2 → basic_report-0.3.0}/src/basic_report/templates/elements/columns.html +0 -0
  39. {basic_report-0.2.2 → basic_report-0.3.0}/src/basic_report/templates/elements/global_links.html +0 -0
  40. {basic_report-0.2.2 → basic_report-0.3.0}/src/basic_report/templates/elements/header.html +0 -0
  41. {basic_report-0.2.2 → basic_report-0.3.0}/src/basic_report/templates/elements/image.html +0 -0
  42. {basic_report-0.2.2 → basic_report-0.3.0}/src/basic_report/templates/elements/list.html +0 -0
  43. {basic_report-0.2.2 → basic_report-0.3.0}/src/basic_report/templates/elements/navbar_left.html +0 -0
  44. {basic_report-0.2.2 → basic_report-0.3.0}/src/basic_report/templates/elements/navbar_right.html +0 -0
  45. {basic_report-0.2.2 → basic_report-0.3.0}/src/basic_report/templates/elements/navbar_top.html +0 -0
  46. {basic_report-0.2.2 → basic_report-0.3.0}/src/basic_report/templates/elements/report_header.html +0 -0
  47. {basic_report-0.2.2 → basic_report-0.3.0}/src/basic_report/templates/elements/sublevel.html +0 -0
  48. {basic_report-0.2.2 → basic_report-0.3.0}/src/basic_report/templates/elements/table.html +0 -0
  49. {basic_report-0.2.2 → basic_report-0.3.0}/src/basic_report/templates/elements/tabs.html +0 -0
  50. {basic_report-0.2.2 → basic_report-0.3.0}/src/basic_report/templates/elements/text.html +0 -0
  51. {basic_report-0.2.2 → basic_report-0.3.0}/src/basic_report/templates/heatmap/base.html +0 -0
  52. {basic_report-0.2.2 → basic_report-0.3.0}/src/basic_report/templates/heatmap/button_next.html +0 -0
  53. {basic_report-0.2.2 → basic_report-0.3.0}/src/basic_report/templates/heatmap/button_prev.html +0 -0
  54. {basic_report-0.2.2 → basic_report-0.3.0}/src/basic_report/templates/heatmap/heatmap.html +0 -0
  55. {basic_report-0.2.2 → basic_report-0.3.0}/src/basic_report/templates/heatmap/legend.html +0 -0
  56. {basic_report-0.2.2 → basic_report-0.3.0}/src/basic_report/templates/heatmap/script.html +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: basic-report
3
- Version: 0.2.2
3
+ Version: 0.3.0
4
4
  Summary: A lightweight Python package for generating clean, professional static HTML reports.
5
5
  Keywords: html,report,static,responsive,website
6
6
  Author: Björn Scholz
@@ -4,7 +4,7 @@ build-backend = "uv_build"
4
4
 
5
5
  [project]
6
6
  name = "basic-report"
7
- version = "0.2.2"
7
+ version = "0.3.0"
8
8
  description = "A lightweight Python package for generating clean, professional static HTML reports."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -0,0 +1,500 @@
1
+ timezone: 'Europe/Berlin'
2
+
3
+ css:
4
+ site:
5
+ dark:
6
+ site_face_color: '#fefefa'
7
+ site_background_color: '#1f1f1f'
8
+ light:
9
+ site_face_color: '#1f1f1f'
10
+ site_background_color: '#fefefa'
11
+
12
+ tabs:
13
+ dark:
14
+ tab_border_bottom_color: '#414951'
15
+ tab_border_bottom_size: '2px'
16
+ tab_inactive_font_color: '#7a848c'
17
+ tab_inactive_font_weight: 'lighter'
18
+ tab_hover_font_color: '#dae2ef'
19
+ tab_active_font_color: '#dae2ef'
20
+ tab_active_font_weight: 'bolder'
21
+ tab_active_background_color: 'none'
22
+ tab_active_border_bottom_color: '#dae2ef'
23
+ tab_active_border_bottom_size: '2px'
24
+ light:
25
+ tab_border_bottom_color: '#abb1bc'
26
+ tab_border_bottom_size: '2px'
27
+ tab_inactive_font_color: '#abb1bc'
28
+ tab_inactive_font_weight: 'lighter'
29
+ tab_hover_font_color: '#414951'
30
+ tab_active_font_color: '#414951'
31
+ tab_active_font_weight: 'bolder'
32
+ tab_active_background_color: 'none'
33
+ tab_active_border_bottom_color: '#414951'
34
+ tab_active_border_bottom_size: '2px'
35
+
36
+ accordion:
37
+ dark:
38
+ accordion_border_color: '#414951'
39
+ accordion_border_size: '1px'
40
+ accordion_link_color: '#dae2ef'
41
+ accordion_header_background_color: '#2a2d2e'
42
+ accordion_body_top_border_color: '#dae2ef'
43
+ accordion_body_top_border_size: '1px'
44
+ accordion_body_background_color: '#313131'
45
+ accordion_body_font_color: '#dae2ef'
46
+ light:
47
+ accordion_border_color: '#cbcbc7'
48
+ accordion_border_size: '1px'
49
+ accordion_link_color: '#91989d'
50
+ accordion_header_background_color: '#f1f1ed'
51
+ accordion_body_top_border_color: '#bebeba'
52
+ accordion_body_top_border_size: '1px'
53
+ accordion_body_background_color: '#fefffa'
54
+ accordion_body_font_color: '#828995'
55
+
56
+ table:
57
+ dark:
58
+ table_controls_background_color: '#2a2d2e'
59
+ table_controls_border_color: '#555'
60
+ table_controls_font_color: '#dae2ef'
61
+ table_pagination_border_color: '#313131'
62
+ table_pagination_hover_border_color: '#66b2ff'
63
+ table_pagination_hover_font_color: '#66b2ff'
64
+ table_pagination_active_background_color: '#66b2ff'
65
+ table_pagination_active_border_color: '#66b2ff'
66
+ table_pagination_active_font_color: '#000'
67
+ light:
68
+ table_controls_background_color: '#f1f1ed'
69
+ table_controls_border_color: '#dee2e6'
70
+ table_controls_font_color: '#414951'
71
+ table_pagination_border_color: '#313131'
72
+ table_pagination_hover_border_color: '#66b2ff'
73
+ table_pagination_hover_font_color: '#66b2ff'
74
+ table_pagination_active_background_color: '#66b2ff'
75
+ table_pagination_active_border_color: '#66b2ff'
76
+ table_pagination_active_font_color: '#000'
77
+
78
+ default_color_profiles:
79
+ dark:
80
+ report_header: steel
81
+ header: slate
82
+ sub-header: slate
83
+ table: slate
84
+ report_ball: slate
85
+ text: slate
86
+ navbar: slate
87
+ section_title:
88
+ text: slate
89
+ bars: slate
90
+ card:
91
+ text: steel
92
+ background: dark-gray
93
+ border: steel
94
+ header_text: medium-gray
95
+ header_background: ultra-dark-gray
96
+ header_border: steel
97
+ footer_text: medium-gray
98
+ footer_background: ultra-dark-gray
99
+ footer_border: steel
100
+
101
+ light:
102
+ report_header: steel
103
+ header: slate
104
+ sub-header: slate
105
+ table: slate
106
+ report_ball: slate
107
+ text: slate
108
+ navbar: slate
109
+ section_title:
110
+ text: slate
111
+ bars: slate
112
+ card:
113
+ text: slate
114
+ background: white
115
+ border: slate
116
+ header_text: slate
117
+ header_background: ultra-light-gray
118
+ header_border: slate
119
+ footer_text: slate
120
+ footer_background: ultra-light-gray
121
+ footer_border: slate
122
+
123
+ custom_colors:
124
+ black:
125
+ border_dark: '#000'
126
+ border_light: '#000'
127
+ font_and_background: '#000'
128
+ face_color: '#fff0f3'
129
+ link: '#449adc'
130
+ hover: '#b7dbff'
131
+
132
+ white:
133
+ border_dark: '#000'
134
+ border_light: '#1e1e1e'
135
+ font_and_background: '#fff'
136
+ face_color: '#52595d'
137
+ link: '#449adc'
138
+ hover: '#b7dbff'
139
+
140
+ ultra-light-gray:
141
+ border_dark: '#000'
142
+ border_light: '#1e1e1e'
143
+ font_and_background: '#d3d3d3'
144
+ face_color: '#52595d'
145
+ link: '#449adc'
146
+ hover: '#b7dbff'
147
+
148
+ light-gray:
149
+ border_dark: '#000'
150
+ border_light: '#1e1e1e'
151
+ font_and_background: '#a9a9a9'
152
+ face_color: '#52595d'
153
+ link: '#449adc'
154
+ hover: '#b7dbff'
155
+
156
+ medium-gray:
157
+ border_dark: '#000'
158
+ border_light: '#1e1e1e'
159
+ font_and_background: '#686a6c'
160
+ face_color: '#fff0f3'
161
+ link: '#449adc'
162
+ hover: '#b7dbff'
163
+
164
+ dark-gray:
165
+ border_dark: '#000'
166
+ border_light: '#1e1e1e'
167
+ font_and_background: '#3a3b3c'
168
+ face_color: '#fff0f3'
169
+ link: '#449adc'
170
+ hover: '#b7dbff'
171
+
172
+ ultra-dark-gray:
173
+ border_dark: '#000'
174
+ border_light: '#1e1e1e'
175
+ font_and_background: '#1c1c1c'
176
+ face_color: '#fff0f3'
177
+ link: '#449adc'
178
+ hover: '#b7dbff'
179
+
180
+ steel:
181
+ border_dark: '#000'
182
+ border_light: '#1e1e1e'
183
+ font_and_background: '#495057'
184
+ face_color: '#fff0f3'
185
+ link: '#ced4da'
186
+ hover: '#212529'
187
+
188
+ slate:
189
+ border_dark: '#000'
190
+ border_light: '#1e1e1e'
191
+ font_and_background: '#708090'
192
+ face_color: '#fff0f3'
193
+ link: '#abc4dc'
194
+ hover: '#374550'
195
+
196
+ broccoli:
197
+ border_dark: '#000'
198
+ border_light: '#1e1e1e'
199
+ font_and_background: '#026c3d'
200
+ face_color: '#fff0f3'
201
+ link: '#a1c5a1'
202
+ hover: '#001f11'
203
+
204
+ forest:
205
+ border_dark: '#000'
206
+ border_light: '#1e1e1e'
207
+ font_and_background: '#5d805d'
208
+ face_color: '#fff0f3'
209
+ link: '#c2c5aa'
210
+ hover: '#253325'
211
+
212
+ basil:
213
+ border_dark: '#000'
214
+ border_light: '#1e1e1e'
215
+ font_and_background: '#829f82'
216
+ face_color: '#fff0f3'
217
+ link: '#516351'
218
+ hover: '#191f19'
219
+
220
+ alpine:
221
+ border_dark: '#000'
222
+ border_light: '#1e1e1e'
223
+ font_and_background: '#1b5448'
224
+ face_color: '#fff0f3'
225
+ link: '#8cc8c8'
226
+ hover: '#14364a'
227
+
228
+ teal:
229
+ border_dark: '#000'
230
+ border_light: '#1e1e1e'
231
+ font_and_background: '#045d5d'
232
+ face_color: '#fff0f3'
233
+ link: '#a9d6e5'
234
+ hover: '#14364a'
235
+
236
+ lagoon:
237
+ border_dark: '#000'
238
+ border_light: '#1e1e1e'
239
+ font_and_background: '#8cc8c8'
240
+ face_color: '#fff0f3'
241
+ link: '#045d5d'
242
+ hover: '#0a201c'
243
+
244
+ navy:
245
+ border_dark: '#000'
246
+ border_light: '#1e1e1e'
247
+ font_and_background: '#003366'
248
+ face_color: '#fff0f3'
249
+ link: '#a9d6e5'
250
+ hover: '#14364a'
251
+
252
+ ocean:
253
+ border_dark: '#000'
254
+ border_light: '#1e1e1e'
255
+ font_and_background: '#2a6f97'
256
+ face_color: '#fff0f3'
257
+ link: '#a9d6e5'
258
+ hover: '#14364a'
259
+
260
+ sky:
261
+ border_dark: '#000'
262
+ border_light: '#1e1e1e'
263
+ font_and_background: '#87afc7'
264
+ face_color: '#fff0f3'
265
+ link: '#4c6270'
266
+ hover: '#14364a'
267
+
268
+ burgundy:
269
+ border_dark: '#000'
270
+ border_light: '#1e1e1e'
271
+ font_and_background: '#800020'
272
+ face_color: '#fff0f3'
273
+ link: '#ff8fa3'
274
+ hover: '#ac605e'
275
+
276
+ cherry:
277
+ border_dark: '#000'
278
+ border_light: '#1e1e1e'
279
+ font_and_background: '#c9184a'
280
+ face_color: '#fff0f3'
281
+ link: '#ff8fa3'
282
+ hover: '#800f2f'
283
+
284
+ peach:
285
+ border_dark: '#000'
286
+ border_light: '#1e1e1e'
287
+ font_and_background: '#f98b88'
288
+ face_color: '#fff0f3'
289
+ link: '#800020'
290
+ hover: '#c9184a'
291
+
292
+ cocoa:
293
+ border_dark: '#000'
294
+ border_light: '#1e1e1e'
295
+ font_and_background: '#35281e'
296
+ face_color: '#fff0f3'
297
+ link: '#e6b8a2'
298
+ hover: '#50362a'
299
+
300
+ earth:
301
+ border_dark: '#000'
302
+ border_light: '#1e1e1e'
303
+ font_and_background: '#9d6b53'
304
+ face_color: '#fff0f3'
305
+ link: '#e6b8a2'
306
+ hover: '#50362a'
307
+
308
+ cappuccino:
309
+ border_dark: '#000'
310
+ border_light: '#1e1e1e'
311
+ font_and_background: '#c09881'
312
+ face_color: '#fff0f3'
313
+ link: '#ffc394'
314
+ hover: '#1e1611'
315
+
316
+ papaya:
317
+ border_dark: '#000'
318
+ border_light: '#1e1e1e'
319
+ font_and_background: '#ff5f1f'
320
+ face_color: '#fff0f3'
321
+ link: '#ffc16a'
322
+ hover: '#582820'
323
+
324
+ sunset:
325
+ border_dark: '#000'
326
+ border_light: '#1e1e1e'
327
+ font_and_background: '#f25c54'
328
+ face_color: '#fff0f3'
329
+ link: '#ffc16a'
330
+ hover: '#582820'
331
+
332
+ coral:
333
+ border_dark: '#000'
334
+ border_light: '#1e1e1e'
335
+ font_and_background: '#f9966b'
336
+ face_color: '#fff0f3'
337
+ link: '#ffd9c2'
338
+ hover: '#582820'
339
+
340
+ saffron:
341
+ border_dark: '#000'
342
+ border_light: '#1e1e1e'
343
+ font_and_background: '#fbb917'
344
+ face_color: '#fff'
345
+ link: '#ffe2bd'
346
+ hover: '#eb6758'
347
+
348
+ sunrise:
349
+ border_dark: '#000'
350
+ border_light: '#1e1e1e'
351
+ font_and_background: '#f3b360'
352
+ face_color: '#fff'
353
+ link: '#ffe2bd'
354
+ hover: '#eb6758'
355
+
356
+ vanilla:
357
+ border_dark: '#000'
358
+ border_light: '#1e1e1e'
359
+ font_and_background: '#f3e5ab'
360
+ face_color: '#52595d'
361
+ link: '#9d6b53'
362
+ hover: '#eb6758'
363
+
364
+ ice:
365
+ border_dark: '#000'
366
+ border_light: '#1e1e1e'
367
+ font_and_background: '#f0f8ff'
368
+ face_color: '#4a7b9d'
369
+ link: '#449adc'
370
+ hover: '#b7dbff'
371
+
372
+ parchment:
373
+ border_dark: '#000'
374
+ border_light: '#1e1e1e'
375
+ font_and_background: '#fefbe3'
376
+ face_color: '#8b6a4d'
377
+ link: '#cca67a'
378
+ hover: '#e1cdad'
379
+
380
+ mpg-green:
381
+ border_dark: '#000'
382
+ border_light: '#1e1e1e'
383
+ font_and_background: '#006c66'
384
+ face_color: '#fff0f3'
385
+ link: '#00b8ae'
386
+ hover: '#00201e'
387
+
388
+ mpg-secondary-green:
389
+ border_dark: '#000'
390
+ border_light: '#1e1e1e'
391
+ font_and_background: '#005555'
392
+ face_color: '#fff0f3'
393
+ link: '#00a1a1'
394
+ hover: '#00201e'
395
+
396
+ mpg-blue:
397
+ border_dark: '#000'
398
+ border_light: '#1e1e1e'
399
+ font_and_background: '#29485d'
400
+ face_color: '#fff0f3'
401
+ link: '#5aa0cf'
402
+ hover: '#000d13'
403
+
404
+ mpg-secondary-blue:
405
+ border_dark: '#000'
406
+ border_light: '#1e1e1e'
407
+ font_and_background: '#006699'
408
+ face_color: '#fff0f3'
409
+ link: '#57b0ff'
410
+ hover: '#000d13'
411
+
412
+ mpg-lime:
413
+ border_dark: '#000'
414
+ border_light: '#1e1e1e'
415
+ font_and_background: '#cadb2a'
416
+ face_color: '#52595d'
417
+ link: '#6a7416'
418
+ hover: '#000d13'
419
+
420
+ mpg-secondary-lime:
421
+ border_dark: '#000'
422
+ border_light: '#1e1e1e'
423
+ font_and_background: '#d9e371'
424
+ face_color: '#52595d'
425
+ link: '#5e6330'
426
+ hover: '#000d13'
427
+
428
+ mpg-orange:
429
+ border_dark: '#000'
430
+ border_light: '#1e1e1e'
431
+ font_and_background: '#f58220'
432
+ face_color: '#fff0f3'
433
+ link: '#ffd15e'
434
+ hover: '#000d13'
435
+
436
+ mpg-secondary-orange:
437
+ border_dark: '#000'
438
+ border_light: '#1e1e1e'
439
+ font_and_background: '#f8a35c'
440
+ face_color: '#fff0f3'
441
+ link: '#774e2c'
442
+ hover: '#000d13'
443
+
444
+ heatmap:
445
+ misc:
446
+ range: 5
447
+ animation_duration: 200
448
+ vertical_orientation: False
449
+ tooltip_enabled: True
450
+ tooltip_function: 'predefined:date+value'
451
+ tooltip_precision: 2
452
+ legend_width: 300
453
+ legend_label: 'Test Legend'
454
+ legend_font_size: 14
455
+ legend_font_weight: 450
456
+
457
+ domain:
458
+ type: 'month' # hour, day, week, month, year
459
+ gutter: 4
460
+ padding: [0,0,0,0]
461
+ dynamic_dimensions: False
462
+ sort: 'asc'
463
+
464
+ label:
465
+ text: 'MMM' # YY, YYYY, M, MM, MMM, MMMM, D, DD, d, dd, ddd, dddd, H, HH, h, hh, null
466
+ position: 'bottom' # top, right, bottom, left
467
+ align: 'middle' # start, middle, end
468
+ offset: [0, 0]
469
+ rotate: null
470
+ width: 100
471
+ height: 100
472
+ font_size: 16
473
+ font_weight: 450
474
+
475
+ subdomain:
476
+ type: 'day' # minute, hour, day, week, month, xDay, ghDay
477
+ gutter: 2
478
+ width: 30
479
+ height: 30
480
+ radius: 0
481
+ sort: 'asc' # asc, desc
482
+ label: 'D' #M, MM, MMM, MMMM, D, DD, d, dd, ddd, dddd, H, HH, h, hh, m, mm, null
483
+ font_size: 14
484
+ font_weight: 450
485
+ background_color: '#ededed'
486
+
487
+ date:
488
+ start: '2026-03-01'
489
+ min: null
490
+ max: null
491
+ highlight: ['today']
492
+ weekstart: 1
493
+ timezone: 'Europe/Berlin'
494
+
495
+ color:
496
+ domain: [0, 10] # Plot range, for linear interpolation use min max. For thresholds use more
497
+ scheme: 'YlOrRd' # https://d3js.org/d3-scale-chromatic, set to null if range is used
498
+ range: null # Hex codes to use as colormap, set to null if scheme is used
499
+ interpolate: null # rgb, hsl, lab, hcl, null
500
+ type: 'linear' # https://cal-heatmap.com/docs/options/scale#type
@@ -0,0 +1,41 @@
1
+ .section-title {
2
+ display: flex;
3
+ align-items: center;
4
+ gap: 10px;
5
+ margin: 0 1em 10px 1em;
6
+ font-weight: 500;
7
+ letter-spacing: 2px;
8
+ }
9
+
10
+ .section-title::before,
11
+ .section-title::after {
12
+ content: "";
13
+ height: 2px;
14
+ background: #616161;
15
+ flex: 0 1 80px;
16
+ min-width: 0;
17
+ }
18
+
19
+ .section-title.center {
20
+ justify-content: center;
21
+ }
22
+
23
+ .section-title.left {
24
+ justify-content: flex-start;
25
+ }
26
+
27
+ .section-title.left::before {
28
+ display: none;
29
+ }
30
+
31
+ .section-title.left::after {
32
+ flex: 0 1 80px;
33
+ }
34
+
35
+ .section-title.right {
36
+ justify-content: flex-end;
37
+ }
38
+
39
+ .section-title.right::after {
40
+ display: none;
41
+ }
@@ -2,6 +2,7 @@ import datetime
2
2
  import numpy as np
3
3
  import pandas as pd
4
4
  import shutil
5
+ import json
5
6
 
6
7
  from collections import defaultdict, ChainMap
7
8
  from jinja2 import Environment, FileSystemLoader
@@ -225,6 +226,41 @@ class ReportPage:
225
226
  self._update_content(html)
226
227
  self.close_sublevel()
227
228
 
229
+ # region Section Title
230
+ # --------------------
231
+ def add_section_title(
232
+ self,
233
+ title_text: str,
234
+ text_color: Optional[str]=None,
235
+ bar_color: Optional[str]=None,
236
+ alignment: Optional[Literal['left', 'center', 'right']]=None,
237
+ ):
238
+ """ Add a section title to the page
239
+
240
+ Args:
241
+ title_text (str): Title text
242
+ text_color (Optional[str]): Color of the title text
243
+ bar_color (Optional[str]): Color of the bars
244
+ alignment (Optional[str]): Alignment of the title. If left or right is chosen the bar will be omitted on the
245
+ chosen side
246
+ """
247
+ valid_alignments = {'left', 'center', 'right', None}
248
+ if alignment not in valid_alignments :
249
+ msg = f'Unknown alignment `{alignment}`. Use one of {valid_alignments}'
250
+ logger.error(msg)
251
+ raise RuntimeError(msg)
252
+
253
+ alignment = default(alignment, 'center')
254
+ text_color = default(text_color, self.color_map.get_default_color('section_title.text'))
255
+ bar_color = default(bar_color, self.color_map.get_default_color('section_title.bars'))
256
+
257
+ template = self.jinja_env.get_template('elements/section_title.html')
258
+ html = template.render(title_text=title_text,
259
+ text_color=text_color,
260
+ bar_color=bar_color,
261
+ alignment=alignment)
262
+ self._update_content(html)
263
+
228
264
  # region Table
229
265
  # ------------
230
266
  def add_table(
@@ -523,6 +559,103 @@ class ReportPage:
523
559
  tab_id = 'tabID_{}'.format(self.id_counter)
524
560
  self.page_buffers[-1].content_ids.append((name, tab_id))
525
561
 
562
+ # region Cards
563
+ # ------------
564
+ def open_cards(self, cards_type: Literal['group', 'deck', 'columns']):
565
+ """ Open a new cards environment
566
+
567
+ Args:
568
+ cards_type (Literal['group', 'deck', 'columns']): Define the layout of how cards are grouped together
569
+ """
570
+ self.page_buffers.append(PageBuffer('cards'))
571
+ self.page_buffers[-1].info = cards_type
572
+
573
+ def close_cards(self):
574
+ """ Close current cards environment """
575
+ self._is_page_in_status('cards')
576
+
577
+ card_items = []
578
+ for card in self.page_buffers[-1].content_ids:
579
+ card_body = '\n'.join(self.page_buffers[-1].content_buffer[card])
580
+ card_cfg = json.loads(card[0])
581
+ item = ChainMap(card_cfg, {'card_body': card_body})
582
+ card_items.append(item)
583
+ template = self.jinja_env.get_template('elements/cards.html')
584
+ html = template.render(
585
+ cards_type=self.page_buffers[-1].info,
586
+ card_items=card_items,
587
+ )
588
+
589
+ self.page_buffers = self.page_buffers[:-1]
590
+ self._update_content(html)
591
+
592
+ def add_card(
593
+ self,
594
+ *,
595
+ background_color: str | None = None,
596
+ border_color: str | None = None,
597
+ image: str | None = None,
598
+ header_text: str | None = None,
599
+ header_text_color: str | None = None,
600
+ header_background_color: str | None = None,
601
+ header_border_color: str | None = None,
602
+ footer_text: str | None = None,
603
+ footer_text_color: str | None = None,
604
+ footer_background_color: str | None = None,
605
+ footer_border_color: str | None = None,
606
+ max_width: str='18rem'
607
+ ):
608
+ """ Add a section title to the page
609
+
610
+ Args:
611
+ background_color (str | None): The name of the background color for the whole card
612
+ border_color (str | None): The name of the border color for the whole card
613
+ image (str | None): A header image for the card. The source image will not be deleted!
614
+ header_text (str | None): Text to be shown as header of the card
615
+ header_text_color (str | None): The name of the header text color
616
+ header_background_color (str | None): The name of the background color for the header section
617
+ header_border_color (str | None): The name of the border color for the header section, only really
618
+ footer_text (str | None): Text to be shown as footer of the card
619
+ footer_text_color (str | None): The name of the footer text color
620
+ footer_background_color (str | None): The name of the background color for the footer section
621
+ footer_border_color (str | None): The name of the border color for the footer section, only really
622
+ affects the line between the footer and the body
623
+ max_width (str): The maximum width of the card
624
+ """
625
+ self._is_page_in_status('cards')
626
+
627
+ self.img_dir.mkdir(parents=True, exist_ok=True)
628
+
629
+ if image is not None:
630
+ image_source = Path(image)
631
+ image_name = image_source.name
632
+ image_dest = self.img_dir / image_name
633
+ shutil.copyfile(image_source, image_dest)
634
+ image = (self.rel_dir / 'images' / image_name).as_posix()
635
+
636
+ card_cfg = {
637
+ 'image_source': image,
638
+ 'max_width': max_width,
639
+
640
+ 'background_color': default(background_color, self.color_map.get_default_color('card.background')),
641
+ 'border_color': default(border_color, self.color_map.get_default_color('card.border')),
642
+
643
+ 'header_text': header_text,
644
+ 'header_text_color': default(header_text_color, self.color_map.get_default_color('card.header_text')),
645
+ 'header_background_color': default(header_background_color, self.color_map.get_default_color('card.header_background')),
646
+ 'header_border_color': default(header_border_color, self.color_map.get_default_color('card.header_border')),
647
+
648
+ 'footer_text': footer_text,
649
+ 'footer_text_color': default(footer_text_color, self.color_map.get_default_color('card.footer_text')),
650
+ 'footer_background_color': default(footer_background_color, self.color_map.get_default_color('card.footer_background')),
651
+ 'footer_border_color': default(footer_border_color, self.color_map.get_default_color('card.footer_border')),
652
+ }
653
+ card_cfg = json.dumps(card_cfg)
654
+
655
+ self.id_counter += 1
656
+ card_id = 'cardID_{}'.format(self.id_counter)
657
+ self.page_buffers[-1].content_ids.append((card_cfg, card_id))
658
+
526
659
  # region Navbar
527
660
  # -------------
528
661
  def open_navbar(