Sfoglia il codice sorgente

Initial commit

master
The Dod 21 ore fa
commit
53bd7a7eb3
63 ha cambiato i file con 59976 aggiunte e 0 eliminazioni
  1. 3
    0
      .gitignore
  2. 138
    0
      HuzzahAPDistance/HuzzahAPDistance.ino
  3. 28
    0
      app.py
  4. 12
    0
      requirements.txt
  5. 4085
    0
      static/bootstrap/css/bootstrap-grid.css
  6. 1
    0
      static/bootstrap/css/bootstrap-grid.css.map
  7. 6
    0
      static/bootstrap/css/bootstrap-grid.min.css
  8. 1
    0
      static/bootstrap/css/bootstrap-grid.min.css.map
  9. 4084
    0
      static/bootstrap/css/bootstrap-grid.rtl.css
  10. 1
    0
      static/bootstrap/css/bootstrap-grid.rtl.css.map
  11. 6
    0
      static/bootstrap/css/bootstrap-grid.rtl.min.css
  12. 1
    0
      static/bootstrap/css/bootstrap-grid.rtl.min.css.map
  13. 601
    0
      static/bootstrap/css/bootstrap-reboot.css
  14. 1
    0
      static/bootstrap/css/bootstrap-reboot.css.map
  15. 6
    0
      static/bootstrap/css/bootstrap-reboot.min.css
  16. 1
    0
      static/bootstrap/css/bootstrap-reboot.min.css.map
  17. 598
    0
      static/bootstrap/css/bootstrap-reboot.rtl.css
  18. 1
    0
      static/bootstrap/css/bootstrap-reboot.rtl.css.map
  19. 6
    0
      static/bootstrap/css/bootstrap-reboot.rtl.min.css
  20. 1
    0
      static/bootstrap/css/bootstrap-reboot.rtl.min.css.map
  21. 5406
    0
      static/bootstrap/css/bootstrap-utilities.css
  22. 1
    0
      static/bootstrap/css/bootstrap-utilities.css.map
  23. 6
    0
      static/bootstrap/css/bootstrap-utilities.min.css
  24. 1
    0
      static/bootstrap/css/bootstrap-utilities.min.css.map
  25. 5397
    0
      static/bootstrap/css/bootstrap-utilities.rtl.css
  26. 1
    0
      static/bootstrap/css/bootstrap-utilities.rtl.css.map
  27. 6
    0
      static/bootstrap/css/bootstrap-utilities.rtl.min.css
  28. 1
    0
      static/bootstrap/css/bootstrap-utilities.rtl.min.css.map
  29. 12048
    0
      static/bootstrap/css/bootstrap.css
  30. 1
    0
      static/bootstrap/css/bootstrap.css.map
  31. 6
    0
      static/bootstrap/css/bootstrap.min.css
  32. 1
    0
      static/bootstrap/css/bootstrap.min.css.map
  33. 12021
    0
      static/bootstrap/css/bootstrap.rtl.css
  34. 1
    0
      static/bootstrap/css/bootstrap.rtl.css.map
  35. 6
    0
      static/bootstrap/css/bootstrap.rtl.min.css
  36. 1
    0
      static/bootstrap/css/bootstrap.rtl.min.css.map
  37. 6312
    0
      static/bootstrap/js/bootstrap.bundle.js
  38. 1
    0
      static/bootstrap/js/bootstrap.bundle.js.map
  39. 7
    0
      static/bootstrap/js/bootstrap.bundle.min.js
  40. 1
    0
      static/bootstrap/js/bootstrap.bundle.min.js.map
  41. 4447
    0
      static/bootstrap/js/bootstrap.esm.js
  42. 1
    0
      static/bootstrap/js/bootstrap.esm.js.map
  43. 7
    0
      static/bootstrap/js/bootstrap.esm.min.js
  44. 1
    0
      static/bootstrap/js/bootstrap.esm.min.js.map
  45. 4494
    0
      static/bootstrap/js/bootstrap.js
  46. 1
    0
      static/bootstrap/js/bootstrap.js.map
  47. 7
    0
      static/bootstrap/js/bootstrap.min.js
  48. 1
    0
      static/bootstrap/js/bootstrap.min.js.map
  49. 22
    0
      static/css/h-ticker.css
  50. 74
    0
      static/css/ticker.css
  51. BIN
      static/gfx/antenna.png
  52. BIN
      static/gfx/eye-horus.png
  53. BIN
      static/gfx/gaza.png
  54. BIN
      static/gfx/gaza.webp
  55. BIN
      static/gfx/horizon.png
  56. 2
    0
      static/js/jquery-3.7.1.min.js
  57. 1
    0
      static/js/jquery-3.7.1.min.map
  58. 1
    0
      static/js/jquery.marquee.min.js
  59. 1
    0
      static/text/hossam-shabat.txt
  60. BIN
      static/video/hossam-shabat-bg-effect.mp4
  61. BIN
      static/video/hossam-shabat1b.mp4
  62. 65
    0
      templates/index.html
  63. 45
    0
      templates/progbar.html

+ 3
- 0
.gitignore Vedi File

@@ -0,0 +1,3 @@
1
+venv
2
+__pycache__
3
+work/

+ 138
- 0
HuzzahAPDistance/HuzzahAPDistance.ino Vedi File

@@ -0,0 +1,138 @@
1
+/*
2
+   Copyright (c) 2015, Majenko Technologies
3
+   All rights reserved.
4
+
5
+   Redistribution and use in source and binary forms, with or without modification,
6
+   are permitted provided that the following conditions are met:
7
+
8
+ * * Redistributions of source code must retain the above copyright notice, this
9
+     list of conditions and the following disclaimer.
10
+
11
+ * * Redistributions in binary form must reproduce the above copyright notice, this
12
+     list of conditions and the following disclaimer in the documentation and/or
13
+     other materials provided with the distribution.
14
+
15
+ * * Neither the name of Majenko Technologies nor the names of its
16
+     contributors may be used to endorse or promote products derived from
17
+     this software without specific prior written permission.
18
+
19
+   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20
+   ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21
+   WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22
+   DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
23
+   ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24
+   (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25
+   LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
26
+   ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27
+   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28
+   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
+*/
30
+
31
+/* Create a WiFi access point and provide a web server on it. */
32
+
33
+#include <ESP8266WiFi.h>
34
+#include <WiFiClient.h>
35
+#include <ESP8266WebServer.h>
36
+
37
+IPAddress local_IP(192, 168, 115, 23);
38
+IPAddress gateway(192, 168, 115, 1); // bogus
39
+IPAddress subnet(255, 255, 255, 0);
40
+
41
+#ifndef APSSID
42
+#define APSSID "batcave"
43
+#define APPSK  "superfokensonic"
44
+#endif
45
+
46
+/* Set these to your desired credentials. */
47
+const char *ssid = APSSID;
48
+const char *password = APPSK;
49
+
50
+ESP8266WebServer server(80);
51
+
52
+const int trigPin = 12;
53
+const int echoPin = 13;
54
+
55
+
56
+unsigned long measureDistance() {
57
+  digitalWrite(trigPin, LOW);
58
+  delayMicroseconds(2);
59
+  digitalWrite(trigPin, HIGH);
60
+  delayMicroseconds(10);
61
+  digitalWrite(trigPin, LOW);
62
+  unsigned long duration = pulseIn(echoPin, HIGH);
63
+  return (duration * 343) / 2000; // speed of sound is 0.343 mm/microsec (halve because 2 way)
64
+}
65
+
66
+void handleRoot() {
67
+  struct station_info *stat_info;
68
+  stat_info = wifi_softap_get_station_info();
69
+  uint8_t client_count = wifi_softap_get_station_num();
70
+  u32_t address;
71
+  String str = "Number of clients = ";
72
+  str += String(client_count);
73
+  str += "<br/>\r\nList of clients : <br/>\r\n";
74
+  int i = 1;
75
+  while (stat_info != NULL) {
76
+    str += "Station #";
77
+    str += String(i);
78
+    str += " : ";
79
+    str += String(stat_info->bssid[0], HEX);
80
+    str += ":";
81
+    str += String(stat_info->bssid[1], HEX);
82
+    str += ":";
83
+    str += String(stat_info->bssid[2], HEX);
84
+    str += ":";
85
+    str += String(stat_info->bssid[3], HEX);
86
+    str += ":";
87
+    str += String(stat_info->bssid[4], HEX);
88
+    str += ":";
89
+    str += String(stat_info->bssid[5], HEX);
90
+    str += " ";
91
+    address = (&stat_info->ip)->addr;
92
+    str += ((unsigned char*)&address)[0];
93
+    str += ".";
94
+    str += ((unsigned char*)&address)[1];
95
+    str += ".";
96
+    str += ((unsigned char*)&address)[2];
97
+    str += ".";
98
+    str += ((unsigned char*)&address)[3];
99
+    str += "<br/>\r\n";
100
+    i++;
101
+    stat_info = STAILQ_NEXT(stat_info, next);
102
+  }
103
+  str += "<a target=\"_blank\" href=\"d\">Distance</a><br/>\r\n";
104
+  server.send(200, "text/html", str);
105
+}
106
+
107
+void handleDistance() {
108
+  unsigned long distance = measureDistance();
109
+  // Serial.println(distance);
110
+  String str = "{\"distance\":" + String(distance, DEC) + "}";
111
+  server.send(200, "application/json", str);
112
+}
113
+
114
+void setup() {
115
+  pinMode(trigPin, OUTPUT);
116
+  pinMode(echoPin, INPUT);
117
+  delay(1000);
118
+  Serial.begin(115200);
119
+  Serial.println();
120
+  Serial.print("Configuring access point...");
121
+  /* You can remove the password parameter if you want the AP to be open. */
122
+  Serial.print("Setting soft-AP configuration ... ");
123
+  Serial.println(WiFi.softAPConfig(local_IP, gateway, subnet) ? "Ready" : "Failed!");
124
+
125
+  WiFi.softAP(ssid, password);
126
+
127
+  IPAddress myIP = WiFi.softAPIP();
128
+  Serial.print("AP IP address: ");
129
+  Serial.println(myIP);
130
+  server.on("/", handleRoot);
131
+  server.on("/d", handleDistance);
132
+  server.begin();
133
+  Serial.println("HTTP server started");
134
+}
135
+
136
+void loop() {
137
+  server.handleClient();
138
+}

+ 28
- 0
app.py Vedi File

@@ -0,0 +1,28 @@
1
+import requests
2
+import logging
3
+from flask import Flask
4
+from flask import render_template
5
+
6
+DISTANCE_URL = "http://192.168.115.23/d"
7
+
8
+def get_distance():
9
+    response = requests.get(DISTANCE_URL)
10
+    try:
11
+        return response.json()["distance"]
12
+    except Exception as e:
13
+        logging.error(e)
14
+        return 0
15
+
16
+app = Flask(__name__)
17
+
18
+@app.route("/")
19
+def main():
20
+    return render_template("index.html")
21
+
22
+@app.route("/d")
23
+def distance():
24
+    return {"distance": get_distance()}
25
+
26
+@app.route("/p")
27
+def progbar():
28
+    return render_template("progbar.html")

+ 12
- 0
requirements.txt Vedi File

@@ -0,0 +1,12 @@
1
+blinker==1.9.0
2
+certifi==2025.8.3
3
+charset-normalizer==3.4.3
4
+click==8.2.1
5
+Flask==3.1.2
6
+idna==3.10
7
+itsdangerous==2.2.0
8
+Jinja2==3.1.6
9
+MarkupSafe==3.0.2
10
+requests==2.32.5
11
+urllib3==2.5.0
12
+Werkzeug==3.1.3

+ 4085
- 0
static/bootstrap/css/bootstrap-grid.css
File diff soppresso perché troppo grande
Vedi File


+ 1
- 0
static/bootstrap/css/bootstrap-grid.css.map
File diff soppresso perché troppo grande
Vedi File


+ 6
- 0
static/bootstrap/css/bootstrap-grid.min.css
File diff soppresso perché troppo grande
Vedi File


+ 1
- 0
static/bootstrap/css/bootstrap-grid.min.css.map
File diff soppresso perché troppo grande
Vedi File


+ 4084
- 0
static/bootstrap/css/bootstrap-grid.rtl.css
File diff soppresso perché troppo grande
Vedi File


+ 1
- 0
static/bootstrap/css/bootstrap-grid.rtl.css.map
File diff soppresso perché troppo grande
Vedi File


+ 6
- 0
static/bootstrap/css/bootstrap-grid.rtl.min.css
File diff soppresso perché troppo grande
Vedi File


+ 1
- 0
static/bootstrap/css/bootstrap-grid.rtl.min.css.map
File diff soppresso perché troppo grande
Vedi File


+ 601
- 0
static/bootstrap/css/bootstrap-reboot.css Vedi File

@@ -0,0 +1,601 @@
1
+/*!
2
+ * Bootstrap Reboot v5.3.8 (https://getbootstrap.com/)
3
+ * Copyright 2011-2025 The Bootstrap Authors
4
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5
+ */
6
+:root,
7
+[data-bs-theme=light] {
8
+  --bs-blue: #0d6efd;
9
+  --bs-indigo: #6610f2;
10
+  --bs-purple: #6f42c1;
11
+  --bs-pink: #d63384;
12
+  --bs-red: #dc3545;
13
+  --bs-orange: #fd7e14;
14
+  --bs-yellow: #ffc107;
15
+  --bs-green: #198754;
16
+  --bs-teal: #20c997;
17
+  --bs-cyan: #0dcaf0;
18
+  --bs-black: #000;
19
+  --bs-white: #fff;
20
+  --bs-gray: #6c757d;
21
+  --bs-gray-dark: #343a40;
22
+  --bs-gray-100: #f8f9fa;
23
+  --bs-gray-200: #e9ecef;
24
+  --bs-gray-300: #dee2e6;
25
+  --bs-gray-400: #ced4da;
26
+  --bs-gray-500: #adb5bd;
27
+  --bs-gray-600: #6c757d;
28
+  --bs-gray-700: #495057;
29
+  --bs-gray-800: #343a40;
30
+  --bs-gray-900: #212529;
31
+  --bs-primary: #0d6efd;
32
+  --bs-secondary: #6c757d;
33
+  --bs-success: #198754;
34
+  --bs-info: #0dcaf0;
35
+  --bs-warning: #ffc107;
36
+  --bs-danger: #dc3545;
37
+  --bs-light: #f8f9fa;
38
+  --bs-dark: #212529;
39
+  --bs-primary-rgb: 13, 110, 253;
40
+  --bs-secondary-rgb: 108, 117, 125;
41
+  --bs-success-rgb: 25, 135, 84;
42
+  --bs-info-rgb: 13, 202, 240;
43
+  --bs-warning-rgb: 255, 193, 7;
44
+  --bs-danger-rgb: 220, 53, 69;
45
+  --bs-light-rgb: 248, 249, 250;
46
+  --bs-dark-rgb: 33, 37, 41;
47
+  --bs-primary-text-emphasis: #052c65;
48
+  --bs-secondary-text-emphasis: #2b2f32;
49
+  --bs-success-text-emphasis: #0a3622;
50
+  --bs-info-text-emphasis: #055160;
51
+  --bs-warning-text-emphasis: #664d03;
52
+  --bs-danger-text-emphasis: #58151c;
53
+  --bs-light-text-emphasis: #495057;
54
+  --bs-dark-text-emphasis: #495057;
55
+  --bs-primary-bg-subtle: #cfe2ff;
56
+  --bs-secondary-bg-subtle: #e2e3e5;
57
+  --bs-success-bg-subtle: #d1e7dd;
58
+  --bs-info-bg-subtle: #cff4fc;
59
+  --bs-warning-bg-subtle: #fff3cd;
60
+  --bs-danger-bg-subtle: #f8d7da;
61
+  --bs-light-bg-subtle: #fcfcfd;
62
+  --bs-dark-bg-subtle: #ced4da;
63
+  --bs-primary-border-subtle: #9ec5fe;
64
+  --bs-secondary-border-subtle: #c4c8cb;
65
+  --bs-success-border-subtle: #a3cfbb;
66
+  --bs-info-border-subtle: #9eeaf9;
67
+  --bs-warning-border-subtle: #ffe69c;
68
+  --bs-danger-border-subtle: #f1aeb5;
69
+  --bs-light-border-subtle: #e9ecef;
70
+  --bs-dark-border-subtle: #adb5bd;
71
+  --bs-white-rgb: 255, 255, 255;
72
+  --bs-black-rgb: 0, 0, 0;
73
+  --bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
74
+  --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
75
+  --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));
76
+  --bs-body-font-family: var(--bs-font-sans-serif);
77
+  --bs-body-font-size: 1rem;
78
+  --bs-body-font-weight: 400;
79
+  --bs-body-line-height: 1.5;
80
+  --bs-body-color: #212529;
81
+  --bs-body-color-rgb: 33, 37, 41;
82
+  --bs-body-bg: #fff;
83
+  --bs-body-bg-rgb: 255, 255, 255;
84
+  --bs-emphasis-color: #000;
85
+  --bs-emphasis-color-rgb: 0, 0, 0;
86
+  --bs-secondary-color: rgba(33, 37, 41, 0.75);
87
+  --bs-secondary-color-rgb: 33, 37, 41;
88
+  --bs-secondary-bg: #e9ecef;
89
+  --bs-secondary-bg-rgb: 233, 236, 239;
90
+  --bs-tertiary-color: rgba(33, 37, 41, 0.5);
91
+  --bs-tertiary-color-rgb: 33, 37, 41;
92
+  --bs-tertiary-bg: #f8f9fa;
93
+  --bs-tertiary-bg-rgb: 248, 249, 250;
94
+  --bs-heading-color: inherit;
95
+  --bs-link-color: #0d6efd;
96
+  --bs-link-color-rgb: 13, 110, 253;
97
+  --bs-link-decoration: underline;
98
+  --bs-link-hover-color: #0a58ca;
99
+  --bs-link-hover-color-rgb: 10, 88, 202;
100
+  --bs-code-color: #d63384;
101
+  --bs-highlight-color: #212529;
102
+  --bs-highlight-bg: #fff3cd;
103
+  --bs-border-width: 1px;
104
+  --bs-border-style: solid;
105
+  --bs-border-color: #dee2e6;
106
+  --bs-border-color-translucent: rgba(0, 0, 0, 0.175);
107
+  --bs-border-radius: 0.375rem;
108
+  --bs-border-radius-sm: 0.25rem;
109
+  --bs-border-radius-lg: 0.5rem;
110
+  --bs-border-radius-xl: 1rem;
111
+  --bs-border-radius-xxl: 2rem;
112
+  --bs-border-radius-2xl: var(--bs-border-radius-xxl);
113
+  --bs-border-radius-pill: 50rem;
114
+  --bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
115
+  --bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);
116
+  --bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);
117
+  --bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);
118
+  --bs-focus-ring-width: 0.25rem;
119
+  --bs-focus-ring-opacity: 0.25;
120
+  --bs-focus-ring-color: rgba(13, 110, 253, 0.25);
121
+  --bs-form-valid-color: #198754;
122
+  --bs-form-valid-border-color: #198754;
123
+  --bs-form-invalid-color: #dc3545;
124
+  --bs-form-invalid-border-color: #dc3545;
125
+}
126
+
127
+[data-bs-theme=dark] {
128
+  color-scheme: dark;
129
+  --bs-body-color: #dee2e6;
130
+  --bs-body-color-rgb: 222, 226, 230;
131
+  --bs-body-bg: #212529;
132
+  --bs-body-bg-rgb: 33, 37, 41;
133
+  --bs-emphasis-color: #fff;
134
+  --bs-emphasis-color-rgb: 255, 255, 255;
135
+  --bs-secondary-color: rgba(222, 226, 230, 0.75);
136
+  --bs-secondary-color-rgb: 222, 226, 230;
137
+  --bs-secondary-bg: #343a40;
138
+  --bs-secondary-bg-rgb: 52, 58, 64;
139
+  --bs-tertiary-color: rgba(222, 226, 230, 0.5);
140
+  --bs-tertiary-color-rgb: 222, 226, 230;
141
+  --bs-tertiary-bg: #2b3035;
142
+  --bs-tertiary-bg-rgb: 43, 48, 53;
143
+  --bs-primary-text-emphasis: #6ea8fe;
144
+  --bs-secondary-text-emphasis: #a7acb1;
145
+  --bs-success-text-emphasis: #75b798;
146
+  --bs-info-text-emphasis: #6edff6;
147
+  --bs-warning-text-emphasis: #ffda6a;
148
+  --bs-danger-text-emphasis: #ea868f;
149
+  --bs-light-text-emphasis: #f8f9fa;
150
+  --bs-dark-text-emphasis: #dee2e6;
151
+  --bs-primary-bg-subtle: #031633;
152
+  --bs-secondary-bg-subtle: #161719;
153
+  --bs-success-bg-subtle: #051b11;
154
+  --bs-info-bg-subtle: #032830;
155
+  --bs-warning-bg-subtle: #332701;
156
+  --bs-danger-bg-subtle: #2c0b0e;
157
+  --bs-light-bg-subtle: #343a40;
158
+  --bs-dark-bg-subtle: #1a1d20;
159
+  --bs-primary-border-subtle: #084298;
160
+  --bs-secondary-border-subtle: #41464b;
161
+  --bs-success-border-subtle: #0f5132;
162
+  --bs-info-border-subtle: #087990;
163
+  --bs-warning-border-subtle: #997404;
164
+  --bs-danger-border-subtle: #842029;
165
+  --bs-light-border-subtle: #495057;
166
+  --bs-dark-border-subtle: #343a40;
167
+  --bs-heading-color: inherit;
168
+  --bs-link-color: #6ea8fe;
169
+  --bs-link-hover-color: #8bb9fe;
170
+  --bs-link-color-rgb: 110, 168, 254;
171
+  --bs-link-hover-color-rgb: 139, 185, 254;
172
+  --bs-code-color: #e685b5;
173
+  --bs-highlight-color: #dee2e6;
174
+  --bs-highlight-bg: #664d03;
175
+  --bs-border-color: #495057;
176
+  --bs-border-color-translucent: rgba(255, 255, 255, 0.15);
177
+  --bs-form-valid-color: #75b798;
178
+  --bs-form-valid-border-color: #75b798;
179
+  --bs-form-invalid-color: #ea868f;
180
+  --bs-form-invalid-border-color: #ea868f;
181
+}
182
+
183
+*,
184
+*::before,
185
+*::after {
186
+  box-sizing: border-box;
187
+}
188
+
189
+@media (prefers-reduced-motion: no-preference) {
190
+  :root {
191
+    scroll-behavior: smooth;
192
+  }
193
+}
194
+
195
+body {
196
+  margin: 0;
197
+  font-family: var(--bs-body-font-family);
198
+  font-size: var(--bs-body-font-size);
199
+  font-weight: var(--bs-body-font-weight);
200
+  line-height: var(--bs-body-line-height);
201
+  color: var(--bs-body-color);
202
+  text-align: var(--bs-body-text-align);
203
+  background-color: var(--bs-body-bg);
204
+  -webkit-text-size-adjust: 100%;
205
+  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
206
+}
207
+
208
+hr {
209
+  margin: 1rem 0;
210
+  color: inherit;
211
+  border: 0;
212
+  border-top: var(--bs-border-width) solid;
213
+  opacity: 0.25;
214
+}
215
+
216
+h6, h5, h4, h3, h2, h1 {
217
+  margin-top: 0;
218
+  margin-bottom: 0.5rem;
219
+  font-weight: 500;
220
+  line-height: 1.2;
221
+  color: var(--bs-heading-color);
222
+}
223
+
224
+h1 {
225
+  font-size: calc(1.375rem + 1.5vw);
226
+}
227
+@media (min-width: 1200px) {
228
+  h1 {
229
+    font-size: 2.5rem;
230
+  }
231
+}
232
+
233
+h2 {
234
+  font-size: calc(1.325rem + 0.9vw);
235
+}
236
+@media (min-width: 1200px) {
237
+  h2 {
238
+    font-size: 2rem;
239
+  }
240
+}
241
+
242
+h3 {
243
+  font-size: calc(1.3rem + 0.6vw);
244
+}
245
+@media (min-width: 1200px) {
246
+  h3 {
247
+    font-size: 1.75rem;
248
+  }
249
+}
250
+
251
+h4 {
252
+  font-size: calc(1.275rem + 0.3vw);
253
+}
254
+@media (min-width: 1200px) {
255
+  h4 {
256
+    font-size: 1.5rem;
257
+  }
258
+}
259
+
260
+h5 {
261
+  font-size: 1.25rem;
262
+}
263
+
264
+h6 {
265
+  font-size: 1rem;
266
+}
267
+
268
+p {
269
+  margin-top: 0;
270
+  margin-bottom: 1rem;
271
+}
272
+
273
+abbr[title] {
274
+  -webkit-text-decoration: underline dotted;
275
+  text-decoration: underline dotted;
276
+  cursor: help;
277
+  -webkit-text-decoration-skip-ink: none;
278
+  text-decoration-skip-ink: none;
279
+}
280
+
281
+address {
282
+  margin-bottom: 1rem;
283
+  font-style: normal;
284
+  line-height: inherit;
285
+}
286
+
287
+ol,
288
+ul {
289
+  padding-left: 2rem;
290
+}
291
+
292
+ol,
293
+ul,
294
+dl {
295
+  margin-top: 0;
296
+  margin-bottom: 1rem;
297
+}
298
+
299
+ol ol,
300
+ul ul,
301
+ol ul,
302
+ul ol {
303
+  margin-bottom: 0;
304
+}
305
+
306
+dt {
307
+  font-weight: 700;
308
+}
309
+
310
+dd {
311
+  margin-bottom: 0.5rem;
312
+  margin-left: 0;
313
+}
314
+
315
+blockquote {
316
+  margin: 0 0 1rem;
317
+}
318
+
319
+b,
320
+strong {
321
+  font-weight: bolder;
322
+}
323
+
324
+small {
325
+  font-size: 0.875em;
326
+}
327
+
328
+mark {
329
+  padding: 0.1875em;
330
+  color: var(--bs-highlight-color);
331
+  background-color: var(--bs-highlight-bg);
332
+}
333
+
334
+sub,
335
+sup {
336
+  position: relative;
337
+  font-size: 0.75em;
338
+  line-height: 0;
339
+  vertical-align: baseline;
340
+}
341
+
342
+sub {
343
+  bottom: -0.25em;
344
+}
345
+
346
+sup {
347
+  top: -0.5em;
348
+}
349
+
350
+a {
351
+  color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1));
352
+  text-decoration: underline;
353
+}
354
+a:hover {
355
+  --bs-link-color-rgb: var(--bs-link-hover-color-rgb);
356
+}
357
+
358
+a:not([href]):not([class]), a:not([href]):not([class]):hover {
359
+  color: inherit;
360
+  text-decoration: none;
361
+}
362
+
363
+pre,
364
+code,
365
+kbd,
366
+samp {
367
+  font-family: var(--bs-font-monospace);
368
+  font-size: 1em;
369
+}
370
+
371
+pre {
372
+  display: block;
373
+  margin-top: 0;
374
+  margin-bottom: 1rem;
375
+  overflow: auto;
376
+  font-size: 0.875em;
377
+}
378
+pre code {
379
+  font-size: inherit;
380
+  color: inherit;
381
+  word-break: normal;
382
+}
383
+
384
+code {
385
+  font-size: 0.875em;
386
+  color: var(--bs-code-color);
387
+  word-wrap: break-word;
388
+}
389
+a > code {
390
+  color: inherit;
391
+}
392
+
393
+kbd {
394
+  padding: 0.1875rem 0.375rem;
395
+  font-size: 0.875em;
396
+  color: var(--bs-body-bg);
397
+  background-color: var(--bs-body-color);
398
+  border-radius: 0.25rem;
399
+}
400
+kbd kbd {
401
+  padding: 0;
402
+  font-size: 1em;
403
+}
404
+
405
+figure {
406
+  margin: 0 0 1rem;
407
+}
408
+
409
+img,
410
+svg {
411
+  vertical-align: middle;
412
+}
413
+
414
+table {
415
+  caption-side: bottom;
416
+  border-collapse: collapse;
417
+}
418
+
419
+caption {
420
+  padding-top: 0.5rem;
421
+  padding-bottom: 0.5rem;
422
+  color: var(--bs-secondary-color);
423
+  text-align: left;
424
+}
425
+
426
+th {
427
+  text-align: inherit;
428
+  text-align: -webkit-match-parent;
429
+}
430
+
431
+thead,
432
+tbody,
433
+tfoot,
434
+tr,
435
+td,
436
+th {
437
+  border-color: inherit;
438
+  border-style: solid;
439
+  border-width: 0;
440
+}
441
+
442
+label {
443
+  display: inline-block;
444
+}
445
+
446
+button {
447
+  border-radius: 0;
448
+}
449
+
450
+button:focus:not(:focus-visible) {
451
+  outline: 0;
452
+}
453
+
454
+input,
455
+button,
456
+select,
457
+optgroup,
458
+textarea {
459
+  margin: 0;
460
+  font-family: inherit;
461
+  font-size: inherit;
462
+  line-height: inherit;
463
+}
464
+
465
+button,
466
+select {
467
+  text-transform: none;
468
+}
469
+
470
+[role=button] {
471
+  cursor: pointer;
472
+}
473
+
474
+select {
475
+  word-wrap: normal;
476
+}
477
+select:disabled {
478
+  opacity: 1;
479
+}
480
+
481
+[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator {
482
+  display: none !important;
483
+}
484
+
485
+button,
486
+[type=button],
487
+[type=reset],
488
+[type=submit] {
489
+  -webkit-appearance: button;
490
+}
491
+button:not(:disabled),
492
+[type=button]:not(:disabled),
493
+[type=reset]:not(:disabled),
494
+[type=submit]:not(:disabled) {
495
+  cursor: pointer;
496
+}
497
+
498
+::-moz-focus-inner {
499
+  padding: 0;
500
+  border-style: none;
501
+}
502
+
503
+textarea {
504
+  resize: vertical;
505
+}
506
+
507
+fieldset {
508
+  min-width: 0;
509
+  padding: 0;
510
+  margin: 0;
511
+  border: 0;
512
+}
513
+
514
+legend {
515
+  float: left;
516
+  width: 100%;
517
+  padding: 0;
518
+  margin-bottom: 0.5rem;
519
+  line-height: inherit;
520
+  font-size: calc(1.275rem + 0.3vw);
521
+}
522
+@media (min-width: 1200px) {
523
+  legend {
524
+    font-size: 1.5rem;
525
+  }
526
+}
527
+legend + * {
528
+  clear: left;
529
+}
530
+
531
+::-webkit-datetime-edit-fields-wrapper,
532
+::-webkit-datetime-edit-text,
533
+::-webkit-datetime-edit-minute,
534
+::-webkit-datetime-edit-hour-field,
535
+::-webkit-datetime-edit-day-field,
536
+::-webkit-datetime-edit-month-field,
537
+::-webkit-datetime-edit-year-field {
538
+  padding: 0;
539
+}
540
+
541
+::-webkit-inner-spin-button {
542
+  height: auto;
543
+}
544
+
545
+[type=search] {
546
+  -webkit-appearance: textfield;
547
+  outline-offset: -2px;
548
+}
549
+[type=search]::-webkit-search-cancel-button {
550
+  cursor: pointer;
551
+  filter: grayscale(1);
552
+}
553
+
554
+/* rtl:raw:
555
+[type="tel"],
556
+[type="url"],
557
+[type="email"],
558
+[type="number"] {
559
+  direction: ltr;
560
+}
561
+*/
562
+::-webkit-search-decoration {
563
+  -webkit-appearance: none;
564
+}
565
+
566
+::-webkit-color-swatch-wrapper {
567
+  padding: 0;
568
+}
569
+
570
+::-webkit-file-upload-button {
571
+  font: inherit;
572
+  -webkit-appearance: button;
573
+}
574
+
575
+::file-selector-button {
576
+  font: inherit;
577
+  -webkit-appearance: button;
578
+}
579
+
580
+output {
581
+  display: inline-block;
582
+}
583
+
584
+iframe {
585
+  border: 0;
586
+}
587
+
588
+summary {
589
+  display: list-item;
590
+  cursor: pointer;
591
+}
592
+
593
+progress {
594
+  vertical-align: baseline;
595
+}
596
+
597
+[hidden] {
598
+  display: none !important;
599
+}
600
+
601
+/*# sourceMappingURL=bootstrap-reboot.css.map */

+ 1
- 0
static/bootstrap/css/bootstrap-reboot.css.map
File diff soppresso perché troppo grande
Vedi File


+ 6
- 0
static/bootstrap/css/bootstrap-reboot.min.css
File diff soppresso perché troppo grande
Vedi File


+ 1
- 0
static/bootstrap/css/bootstrap-reboot.min.css.map
File diff soppresso perché troppo grande
Vedi File


+ 598
- 0
static/bootstrap/css/bootstrap-reboot.rtl.css Vedi File

@@ -0,0 +1,598 @@
1
+/*!
2
+ * Bootstrap Reboot v5.3.8 (https://getbootstrap.com/)
3
+ * Copyright 2011-2025 The Bootstrap Authors
4
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5
+ */
6
+:root,
7
+[data-bs-theme=light] {
8
+  --bs-blue: #0d6efd;
9
+  --bs-indigo: #6610f2;
10
+  --bs-purple: #6f42c1;
11
+  --bs-pink: #d63384;
12
+  --bs-red: #dc3545;
13
+  --bs-orange: #fd7e14;
14
+  --bs-yellow: #ffc107;
15
+  --bs-green: #198754;
16
+  --bs-teal: #20c997;
17
+  --bs-cyan: #0dcaf0;
18
+  --bs-black: #000;
19
+  --bs-white: #fff;
20
+  --bs-gray: #6c757d;
21
+  --bs-gray-dark: #343a40;
22
+  --bs-gray-100: #f8f9fa;
23
+  --bs-gray-200: #e9ecef;
24
+  --bs-gray-300: #dee2e6;
25
+  --bs-gray-400: #ced4da;
26
+  --bs-gray-500: #adb5bd;
27
+  --bs-gray-600: #6c757d;
28
+  --bs-gray-700: #495057;
29
+  --bs-gray-800: #343a40;
30
+  --bs-gray-900: #212529;
31
+  --bs-primary: #0d6efd;
32
+  --bs-secondary: #6c757d;
33
+  --bs-success: #198754;
34
+  --bs-info: #0dcaf0;
35
+  --bs-warning: #ffc107;
36
+  --bs-danger: #dc3545;
37
+  --bs-light: #f8f9fa;
38
+  --bs-dark: #212529;
39
+  --bs-primary-rgb: 13, 110, 253;
40
+  --bs-secondary-rgb: 108, 117, 125;
41
+  --bs-success-rgb: 25, 135, 84;
42
+  --bs-info-rgb: 13, 202, 240;
43
+  --bs-warning-rgb: 255, 193, 7;
44
+  --bs-danger-rgb: 220, 53, 69;
45
+  --bs-light-rgb: 248, 249, 250;
46
+  --bs-dark-rgb: 33, 37, 41;
47
+  --bs-primary-text-emphasis: #052c65;
48
+  --bs-secondary-text-emphasis: #2b2f32;
49
+  --bs-success-text-emphasis: #0a3622;
50
+  --bs-info-text-emphasis: #055160;
51
+  --bs-warning-text-emphasis: #664d03;
52
+  --bs-danger-text-emphasis: #58151c;
53
+  --bs-light-text-emphasis: #495057;
54
+  --bs-dark-text-emphasis: #495057;
55
+  --bs-primary-bg-subtle: #cfe2ff;
56
+  --bs-secondary-bg-subtle: #e2e3e5;
57
+  --bs-success-bg-subtle: #d1e7dd;
58
+  --bs-info-bg-subtle: #cff4fc;
59
+  --bs-warning-bg-subtle: #fff3cd;
60
+  --bs-danger-bg-subtle: #f8d7da;
61
+  --bs-light-bg-subtle: #fcfcfd;
62
+  --bs-dark-bg-subtle: #ced4da;
63
+  --bs-primary-border-subtle: #9ec5fe;
64
+  --bs-secondary-border-subtle: #c4c8cb;
65
+  --bs-success-border-subtle: #a3cfbb;
66
+  --bs-info-border-subtle: #9eeaf9;
67
+  --bs-warning-border-subtle: #ffe69c;
68
+  --bs-danger-border-subtle: #f1aeb5;
69
+  --bs-light-border-subtle: #e9ecef;
70
+  --bs-dark-border-subtle: #adb5bd;
71
+  --bs-white-rgb: 255, 255, 255;
72
+  --bs-black-rgb: 0, 0, 0;
73
+  --bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
74
+  --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
75
+  --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));
76
+  --bs-body-font-family: var(--bs-font-sans-serif);
77
+  --bs-body-font-size: 1rem;
78
+  --bs-body-font-weight: 400;
79
+  --bs-body-line-height: 1.5;
80
+  --bs-body-color: #212529;
81
+  --bs-body-color-rgb: 33, 37, 41;
82
+  --bs-body-bg: #fff;
83
+  --bs-body-bg-rgb: 255, 255, 255;
84
+  --bs-emphasis-color: #000;
85
+  --bs-emphasis-color-rgb: 0, 0, 0;
86
+  --bs-secondary-color: rgba(33, 37, 41, 0.75);
87
+  --bs-secondary-color-rgb: 33, 37, 41;
88
+  --bs-secondary-bg: #e9ecef;
89
+  --bs-secondary-bg-rgb: 233, 236, 239;
90
+  --bs-tertiary-color: rgba(33, 37, 41, 0.5);
91
+  --bs-tertiary-color-rgb: 33, 37, 41;
92
+  --bs-tertiary-bg: #f8f9fa;
93
+  --bs-tertiary-bg-rgb: 248, 249, 250;
94
+  --bs-heading-color: inherit;
95
+  --bs-link-color: #0d6efd;
96
+  --bs-link-color-rgb: 13, 110, 253;
97
+  --bs-link-decoration: underline;
98
+  --bs-link-hover-color: #0a58ca;
99
+  --bs-link-hover-color-rgb: 10, 88, 202;
100
+  --bs-code-color: #d63384;
101
+  --bs-highlight-color: #212529;
102
+  --bs-highlight-bg: #fff3cd;
103
+  --bs-border-width: 1px;
104
+  --bs-border-style: solid;
105
+  --bs-border-color: #dee2e6;
106
+  --bs-border-color-translucent: rgba(0, 0, 0, 0.175);
107
+  --bs-border-radius: 0.375rem;
108
+  --bs-border-radius-sm: 0.25rem;
109
+  --bs-border-radius-lg: 0.5rem;
110
+  --bs-border-radius-xl: 1rem;
111
+  --bs-border-radius-xxl: 2rem;
112
+  --bs-border-radius-2xl: var(--bs-border-radius-xxl);
113
+  --bs-border-radius-pill: 50rem;
114
+  --bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
115
+  --bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);
116
+  --bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);
117
+  --bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);
118
+  --bs-focus-ring-width: 0.25rem;
119
+  --bs-focus-ring-opacity: 0.25;
120
+  --bs-focus-ring-color: rgba(13, 110, 253, 0.25);
121
+  --bs-form-valid-color: #198754;
122
+  --bs-form-valid-border-color: #198754;
123
+  --bs-form-invalid-color: #dc3545;
124
+  --bs-form-invalid-border-color: #dc3545;
125
+}
126
+
127
+[data-bs-theme=dark] {
128
+  color-scheme: dark;
129
+  --bs-body-color: #dee2e6;
130
+  --bs-body-color-rgb: 222, 226, 230;
131
+  --bs-body-bg: #212529;
132
+  --bs-body-bg-rgb: 33, 37, 41;
133
+  --bs-emphasis-color: #fff;
134
+  --bs-emphasis-color-rgb: 255, 255, 255;
135
+  --bs-secondary-color: rgba(222, 226, 230, 0.75);
136
+  --bs-secondary-color-rgb: 222, 226, 230;
137
+  --bs-secondary-bg: #343a40;
138
+  --bs-secondary-bg-rgb: 52, 58, 64;
139
+  --bs-tertiary-color: rgba(222, 226, 230, 0.5);
140
+  --bs-tertiary-color-rgb: 222, 226, 230;
141
+  --bs-tertiary-bg: #2b3035;
142
+  --bs-tertiary-bg-rgb: 43, 48, 53;
143
+  --bs-primary-text-emphasis: #6ea8fe;
144
+  --bs-secondary-text-emphasis: #a7acb1;
145
+  --bs-success-text-emphasis: #75b798;
146
+  --bs-info-text-emphasis: #6edff6;
147
+  --bs-warning-text-emphasis: #ffda6a;
148
+  --bs-danger-text-emphasis: #ea868f;
149
+  --bs-light-text-emphasis: #f8f9fa;
150
+  --bs-dark-text-emphasis: #dee2e6;
151
+  --bs-primary-bg-subtle: #031633;
152
+  --bs-secondary-bg-subtle: #161719;
153
+  --bs-success-bg-subtle: #051b11;
154
+  --bs-info-bg-subtle: #032830;
155
+  --bs-warning-bg-subtle: #332701;
156
+  --bs-danger-bg-subtle: #2c0b0e;
157
+  --bs-light-bg-subtle: #343a40;
158
+  --bs-dark-bg-subtle: #1a1d20;
159
+  --bs-primary-border-subtle: #084298;
160
+  --bs-secondary-border-subtle: #41464b;
161
+  --bs-success-border-subtle: #0f5132;
162
+  --bs-info-border-subtle: #087990;
163
+  --bs-warning-border-subtle: #997404;
164
+  --bs-danger-border-subtle: #842029;
165
+  --bs-light-border-subtle: #495057;
166
+  --bs-dark-border-subtle: #343a40;
167
+  --bs-heading-color: inherit;
168
+  --bs-link-color: #6ea8fe;
169
+  --bs-link-hover-color: #8bb9fe;
170
+  --bs-link-color-rgb: 110, 168, 254;
171
+  --bs-link-hover-color-rgb: 139, 185, 254;
172
+  --bs-code-color: #e685b5;
173
+  --bs-highlight-color: #dee2e6;
174
+  --bs-highlight-bg: #664d03;
175
+  --bs-border-color: #495057;
176
+  --bs-border-color-translucent: rgba(255, 255, 255, 0.15);
177
+  --bs-form-valid-color: #75b798;
178
+  --bs-form-valid-border-color: #75b798;
179
+  --bs-form-invalid-color: #ea868f;
180
+  --bs-form-invalid-border-color: #ea868f;
181
+}
182
+
183
+*,
184
+*::before,
185
+*::after {
186
+  box-sizing: border-box;
187
+}
188
+
189
+@media (prefers-reduced-motion: no-preference) {
190
+  :root {
191
+    scroll-behavior: smooth;
192
+  }
193
+}
194
+
195
+body {
196
+  margin: 0;
197
+  font-family: var(--bs-body-font-family);
198
+  font-size: var(--bs-body-font-size);
199
+  font-weight: var(--bs-body-font-weight);
200
+  line-height: var(--bs-body-line-height);
201
+  color: var(--bs-body-color);
202
+  text-align: var(--bs-body-text-align);
203
+  background-color: var(--bs-body-bg);
204
+  -webkit-text-size-adjust: 100%;
205
+  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
206
+}
207
+
208
+hr {
209
+  margin: 1rem 0;
210
+  color: inherit;
211
+  border: 0;
212
+  border-top: var(--bs-border-width) solid;
213
+  opacity: 0.25;
214
+}
215
+
216
+h6, h5, h4, h3, h2, h1 {
217
+  margin-top: 0;
218
+  margin-bottom: 0.5rem;
219
+  font-weight: 500;
220
+  line-height: 1.2;
221
+  color: var(--bs-heading-color);
222
+}
223
+
224
+h1 {
225
+  font-size: calc(1.375rem + 1.5vw);
226
+}
227
+@media (min-width: 1200px) {
228
+  h1 {
229
+    font-size: 2.5rem;
230
+  }
231
+}
232
+
233
+h2 {
234
+  font-size: calc(1.325rem + 0.9vw);
235
+}
236
+@media (min-width: 1200px) {
237
+  h2 {
238
+    font-size: 2rem;
239
+  }
240
+}
241
+
242
+h3 {
243
+  font-size: calc(1.3rem + 0.6vw);
244
+}
245
+@media (min-width: 1200px) {
246
+  h3 {
247
+    font-size: 1.75rem;
248
+  }
249
+}
250
+
251
+h4 {
252
+  font-size: calc(1.275rem + 0.3vw);
253
+}
254
+@media (min-width: 1200px) {
255
+  h4 {
256
+    font-size: 1.5rem;
257
+  }
258
+}
259
+
260
+h5 {
261
+  font-size: 1.25rem;
262
+}
263
+
264
+h6 {
265
+  font-size: 1rem;
266
+}
267
+
268
+p {
269
+  margin-top: 0;
270
+  margin-bottom: 1rem;
271
+}
272
+
273
+abbr[title] {
274
+  -webkit-text-decoration: underline dotted;
275
+  text-decoration: underline dotted;
276
+  cursor: help;
277
+  -webkit-text-decoration-skip-ink: none;
278
+  text-decoration-skip-ink: none;
279
+}
280
+
281
+address {
282
+  margin-bottom: 1rem;
283
+  font-style: normal;
284
+  line-height: inherit;
285
+}
286
+
287
+ol,
288
+ul {
289
+  padding-right: 2rem;
290
+}
291
+
292
+ol,
293
+ul,
294
+dl {
295
+  margin-top: 0;
296
+  margin-bottom: 1rem;
297
+}
298
+
299
+ol ol,
300
+ul ul,
301
+ol ul,
302
+ul ol {
303
+  margin-bottom: 0;
304
+}
305
+
306
+dt {
307
+  font-weight: 700;
308
+}
309
+
310
+dd {
311
+  margin-bottom: 0.5rem;
312
+  margin-right: 0;
313
+}
314
+
315
+blockquote {
316
+  margin: 0 0 1rem;
317
+}
318
+
319
+b,
320
+strong {
321
+  font-weight: bolder;
322
+}
323
+
324
+small {
325
+  font-size: 0.875em;
326
+}
327
+
328
+mark {
329
+  padding: 0.1875em;
330
+  color: var(--bs-highlight-color);
331
+  background-color: var(--bs-highlight-bg);
332
+}
333
+
334
+sub,
335
+sup {
336
+  position: relative;
337
+  font-size: 0.75em;
338
+  line-height: 0;
339
+  vertical-align: baseline;
340
+}
341
+
342
+sub {
343
+  bottom: -0.25em;
344
+}
345
+
346
+sup {
347
+  top: -0.5em;
348
+}
349
+
350
+a {
351
+  color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1));
352
+  text-decoration: underline;
353
+}
354
+a:hover {
355
+  --bs-link-color-rgb: var(--bs-link-hover-color-rgb);
356
+}
357
+
358
+a:not([href]):not([class]), a:not([href]):not([class]):hover {
359
+  color: inherit;
360
+  text-decoration: none;
361
+}
362
+
363
+pre,
364
+code,
365
+kbd,
366
+samp {
367
+  font-family: var(--bs-font-monospace);
368
+  font-size: 1em;
369
+}
370
+
371
+pre {
372
+  display: block;
373
+  margin-top: 0;
374
+  margin-bottom: 1rem;
375
+  overflow: auto;
376
+  font-size: 0.875em;
377
+}
378
+pre code {
379
+  font-size: inherit;
380
+  color: inherit;
381
+  word-break: normal;
382
+}
383
+
384
+code {
385
+  font-size: 0.875em;
386
+  color: var(--bs-code-color);
387
+  word-wrap: break-word;
388
+}
389
+a > code {
390
+  color: inherit;
391
+}
392
+
393
+kbd {
394
+  padding: 0.1875rem 0.375rem;
395
+  font-size: 0.875em;
396
+  color: var(--bs-body-bg);
397
+  background-color: var(--bs-body-color);
398
+  border-radius: 0.25rem;
399
+}
400
+kbd kbd {
401
+  padding: 0;
402
+  font-size: 1em;
403
+}
404
+
405
+figure {
406
+  margin: 0 0 1rem;
407
+}
408
+
409
+img,
410
+svg {
411
+  vertical-align: middle;
412
+}
413
+
414
+table {
415
+  caption-side: bottom;
416
+  border-collapse: collapse;
417
+}
418
+
419
+caption {
420
+  padding-top: 0.5rem;
421
+  padding-bottom: 0.5rem;
422
+  color: var(--bs-secondary-color);
423
+  text-align: right;
424
+}
425
+
426
+th {
427
+  text-align: inherit;
428
+  text-align: -webkit-match-parent;
429
+}
430
+
431
+thead,
432
+tbody,
433
+tfoot,
434
+tr,
435
+td,
436
+th {
437
+  border-color: inherit;
438
+  border-style: solid;
439
+  border-width: 0;
440
+}
441
+
442
+label {
443
+  display: inline-block;
444
+}
445
+
446
+button {
447
+  border-radius: 0;
448
+}
449
+
450
+button:focus:not(:focus-visible) {
451
+  outline: 0;
452
+}
453
+
454
+input,
455
+button,
456
+select,
457
+optgroup,
458
+textarea {
459
+  margin: 0;
460
+  font-family: inherit;
461
+  font-size: inherit;
462
+  line-height: inherit;
463
+}
464
+
465
+button,
466
+select {
467
+  text-transform: none;
468
+}
469
+
470
+[role=button] {
471
+  cursor: pointer;
472
+}
473
+
474
+select {
475
+  word-wrap: normal;
476
+}
477
+select:disabled {
478
+  opacity: 1;
479
+}
480
+
481
+[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator {
482
+  display: none !important;
483
+}
484
+
485
+button,
486
+[type=button],
487
+[type=reset],
488
+[type=submit] {
489
+  -webkit-appearance: button;
490
+}
491
+button:not(:disabled),
492
+[type=button]:not(:disabled),
493
+[type=reset]:not(:disabled),
494
+[type=submit]:not(:disabled) {
495
+  cursor: pointer;
496
+}
497
+
498
+::-moz-focus-inner {
499
+  padding: 0;
500
+  border-style: none;
501
+}
502
+
503
+textarea {
504
+  resize: vertical;
505
+}
506
+
507
+fieldset {
508
+  min-width: 0;
509
+  padding: 0;
510
+  margin: 0;
511
+  border: 0;
512
+}
513
+
514
+legend {
515
+  float: right;
516
+  width: 100%;
517
+  padding: 0;
518
+  margin-bottom: 0.5rem;
519
+  line-height: inherit;
520
+  font-size: calc(1.275rem + 0.3vw);
521
+}
522
+@media (min-width: 1200px) {
523
+  legend {
524
+    font-size: 1.5rem;
525
+  }
526
+}
527
+legend + * {
528
+  clear: right;
529
+}
530
+
531
+::-webkit-datetime-edit-fields-wrapper,
532
+::-webkit-datetime-edit-text,
533
+::-webkit-datetime-edit-minute,
534
+::-webkit-datetime-edit-hour-field,
535
+::-webkit-datetime-edit-day-field,
536
+::-webkit-datetime-edit-month-field,
537
+::-webkit-datetime-edit-year-field {
538
+  padding: 0;
539
+}
540
+
541
+::-webkit-inner-spin-button {
542
+  height: auto;
543
+}
544
+
545
+[type=search] {
546
+  -webkit-appearance: textfield;
547
+  outline-offset: -2px;
548
+}
549
+[type=search]::-webkit-search-cancel-button {
550
+  cursor: pointer;
551
+  filter: grayscale(1);
552
+}
553
+
554
+[type="tel"],
555
+[type="url"],
556
+[type="email"],
557
+[type="number"] {
558
+  direction: ltr;
559
+}
560
+::-webkit-search-decoration {
561
+  -webkit-appearance: none;
562
+}
563
+
564
+::-webkit-color-swatch-wrapper {
565
+  padding: 0;
566
+}
567
+
568
+::-webkit-file-upload-button {
569
+  font: inherit;
570
+  -webkit-appearance: button;
571
+}
572
+
573
+::file-selector-button {
574
+  font: inherit;
575
+  -webkit-appearance: button;
576
+}
577
+
578
+output {
579
+  display: inline-block;
580
+}
581
+
582
+iframe {
583
+  border: 0;
584
+}
585
+
586
+summary {
587
+  display: list-item;
588
+  cursor: pointer;
589
+}
590
+
591
+progress {
592
+  vertical-align: baseline;
593
+}
594
+
595
+[hidden] {
596
+  display: none !important;
597
+}
598
+/*# sourceMappingURL=bootstrap-reboot.rtl.css.map */

+ 1
- 0
static/bootstrap/css/bootstrap-reboot.rtl.css.map
File diff soppresso perché troppo grande
Vedi File


+ 6
- 0
static/bootstrap/css/bootstrap-reboot.rtl.min.css
File diff soppresso perché troppo grande
Vedi File


+ 1
- 0
static/bootstrap/css/bootstrap-reboot.rtl.min.css.map
File diff soppresso perché troppo grande
Vedi File


+ 5406
- 0
static/bootstrap/css/bootstrap-utilities.css
File diff soppresso perché troppo grande
Vedi File


+ 1
- 0
static/bootstrap/css/bootstrap-utilities.css.map
File diff soppresso perché troppo grande
Vedi File


+ 6
- 0
static/bootstrap/css/bootstrap-utilities.min.css
File diff soppresso perché troppo grande
Vedi File


+ 1
- 0
static/bootstrap/css/bootstrap-utilities.min.css.map
File diff soppresso perché troppo grande
Vedi File


+ 5397
- 0
static/bootstrap/css/bootstrap-utilities.rtl.css
File diff soppresso perché troppo grande
Vedi File


+ 1
- 0
static/bootstrap/css/bootstrap-utilities.rtl.css.map
File diff soppresso perché troppo grande
Vedi File


+ 6
- 0
static/bootstrap/css/bootstrap-utilities.rtl.min.css
File diff soppresso perché troppo grande
Vedi File


+ 1
- 0
static/bootstrap/css/bootstrap-utilities.rtl.min.css.map
File diff soppresso perché troppo grande
Vedi File


+ 12048
- 0
static/bootstrap/css/bootstrap.css
File diff soppresso perché troppo grande
Vedi File


+ 1
- 0
static/bootstrap/css/bootstrap.css.map
File diff soppresso perché troppo grande
Vedi File


+ 6
- 0
static/bootstrap/css/bootstrap.min.css
File diff soppresso perché troppo grande
Vedi File


+ 1
- 0
static/bootstrap/css/bootstrap.min.css.map
File diff soppresso perché troppo grande
Vedi File


+ 12021
- 0
static/bootstrap/css/bootstrap.rtl.css
File diff soppresso perché troppo grande
Vedi File


+ 1
- 0
static/bootstrap/css/bootstrap.rtl.css.map
File diff soppresso perché troppo grande
Vedi File


+ 6
- 0
static/bootstrap/css/bootstrap.rtl.min.css
File diff soppresso perché troppo grande
Vedi File


+ 1
- 0
static/bootstrap/css/bootstrap.rtl.min.css.map
File diff soppresso perché troppo grande
Vedi File


+ 6312
- 0
static/bootstrap/js/bootstrap.bundle.js
File diff soppresso perché troppo grande
Vedi File


+ 1
- 0
static/bootstrap/js/bootstrap.bundle.js.map
File diff soppresso perché troppo grande
Vedi File


+ 7
- 0
static/bootstrap/js/bootstrap.bundle.min.js
File diff soppresso perché troppo grande
Vedi File


+ 1
- 0
static/bootstrap/js/bootstrap.bundle.min.js.map
File diff soppresso perché troppo grande
Vedi File


+ 4447
- 0
static/bootstrap/js/bootstrap.esm.js
File diff soppresso perché troppo grande
Vedi File


+ 1
- 0
static/bootstrap/js/bootstrap.esm.js.map
File diff soppresso perché troppo grande
Vedi File


+ 7
- 0
static/bootstrap/js/bootstrap.esm.min.js
File diff soppresso perché troppo grande
Vedi File


+ 1
- 0
static/bootstrap/js/bootstrap.esm.min.js.map
File diff soppresso perché troppo grande
Vedi File


+ 4494
- 0
static/bootstrap/js/bootstrap.js
File diff soppresso perché troppo grande
Vedi File


+ 1
- 0
static/bootstrap/js/bootstrap.js.map
File diff soppresso perché troppo grande
Vedi File


+ 7
- 0
static/bootstrap/js/bootstrap.min.js
File diff soppresso perché troppo grande
Vedi File


+ 1
- 0
static/bootstrap/js/bootstrap.min.js.map
File diff soppresso perché troppo grande
Vedi File


+ 22
- 0
static/css/h-ticker.css Vedi File

@@ -0,0 +1,22 @@
1
+/* (A) FORCE ALL ITEMS INTO SINGLE ROW */
2
+/* (A) FORCE ALL ITEMS INTO SINGLE ROW */
3
+.hmove { display: flex; }
4
+.hitem { width: 100%; flex-shrink: 0; }
5
+.hwrap {
6
+   overflow: hidden;
7
+
8
+   direction:rtl;
9
+   position:fixed; left:0; bottom:0; z-index:23;
10
+   background:#ff00007f;
11
+   width:100vw;
12
+   font-size: 250%;
13
+ }
14
+
15
+/* (B) MOVE ITEMS FROM RIGHT TO LEFT */
16
+/* first item = 0, fourth item = -300% */
17
+@keyframes tickerh {
18
+  0% { transform: translatex(-100%); }
19
+  100% { transform: translatex(400%); }
20
+}
21
+.hmove { animation: tickerh linear 40s infinite; }
22
+/* .hmove:hover { animation-play-state: paused; } */

+ 74
- 0
static/css/ticker.css Vedi File

@@ -0,0 +1,74 @@
1
+* { box-sizing: border-box; }
2
+$duration: 30s;
3
+
4
+@-webkit-keyframes ticker {
5
+  0% {
6
+    -webkit-transform: translate3d(0, 0, 0);
7
+    transform: translate3d(0, 0, 0);
8
+    visibility: visible;
9
+  }
10
+
11
+  100% {
12
+    -webkit-transform: translate3d(-100%, 0, 0);
13
+    transform: translate3d(-100%, 0, 0);
14
+  }
15
+}
16
+
17
+@keyframes ticker {
18
+  0% {
19
+    -webkit-transform: translate3d(0, 0, 0);
20
+    transform: translate3d(0, 0, 0);
21
+    visibility: visible;
22
+  }
23
+
24
+  100% {
25
+    -webkit-transform: translate3d(-100%, 0, 0);
26
+    transform: translate3d(-100%, 0, 0);
27
+  }
28
+}
29
+
30
+.ticker-wrap {
31
+
32
+  position: fixed;
33
+  bottom: 0;
34
+  width: 100%;
35
+  overflow: hidden;
36
+  height: 4rem;
37
+  background-color: rgba(#000, 0.9);
38
+  padding-left: 100%;
39
+  box-sizing: content-box;
40
+
41
+  .ticker {
42
+
43
+    display: inline-block;
44
+    height: 4rem;
45
+    line-height: 4rem;
46
+    white-space: nowrap;
47
+    padding-right: 100%;
48
+    box-sizing: content-box;
49
+
50
+    -webkit-animation-iteration-count: infinite;
51
+            animation-iteration-count: infinite;
52
+    -webkit-animation-timing-function: linear;
53
+            animation-timing-function: linear;
54
+   -webkit-animation-name: ticker;
55
+           animation-name: ticker;
56
+    -webkit-animation-duration: $duration;
57
+            animation-duration: $duration;
58
+
59
+    &__item {
60
+
61
+      display: inline-block;
62
+
63
+      padding: 0 2rem;
64
+      font-size: 2rem;
65
+      color: white;
66
+
67
+    }
68
+
69
+  }
70
+
71
+}
72
+
73
+body { padding-bottom: 5rem; }
74
+h1,h2,p {padding: 0 5%;}

BIN
static/gfx/antenna.png Vedi File


BIN
static/gfx/eye-horus.png Vedi File


BIN
static/gfx/gaza.png Vedi File


BIN
static/gfx/gaza.webp Vedi File


BIN
static/gfx/horizon.png Vedi File


+ 2
- 0
static/js/jquery-3.7.1.min.js
File diff soppresso perché troppo grande
Vedi File


+ 1
- 0
static/js/jquery-3.7.1.min.map
File diff soppresso perché troppo grande
Vedi File


+ 1
- 0
static/js/jquery.marquee.min.js
File diff soppresso perché troppo grande
Vedi File


+ 1
- 0
static/text/hossam-shabat.txt Vedi File

@@ -0,0 +1 @@
1
+חוסל מחבל חמאס שעבד עם "אל-ג'זירה" • ברצועה מדווחים על הרוגים בתקיפות במחנה נוסיראת ובדרום חאן יונס • בין ההרוגים - כתב "פלשתין אל יום" וכתב "אל-ג'זירה" חוסאם שבאת • צה"ל חשף כי לפי מידע מודיעיני, חוסאם שבאת הוא מחבל בגדוד בית חאנון של ארגון הטרור חמאס • שחר קליימן, ישראל היום, 24/2/25

BIN
static/video/hossam-shabat-bg-effect.mp4 Vedi File


BIN
static/video/hossam-shabat1b.mp4 Vedi File


+ 65
- 0
templates/index.html Vedi File

@@ -0,0 +1,65 @@
1
+<!doctype html>
2
+<html lang="en">
3
+<head>
4
+  <meta charset="utf-8">
5
+  <meta name="viewport" content="width=device-width, initial-scale=1">
6
+  <title>Eye of Beholder</title>
7
+  <link href="/static/bootstrap/css/bootstrap.min.css" rel="stylesheet">
8
+  <link rel="icon" href="/static/gfx/eye-horus.png">
9
+</head>
10
+<body data-bs-theme="dark">
11
+  <div class="container-fluid text-center">
12
+    <div class="row">
13
+      <div class="col12">
14
+        <video id="the-video" style="height:100vh; margin:0 auto" class="object-fit-contain" muted autoplay loop>
15
+          <source src="/static/video/hossam-shabat-bg-effect.mp4"/>
16
+        </video>
17
+      </div>
18
+    </div>
19
+    <div class="row">
20
+      <div class="col12">
21
+        <div id="the-ticker" class="marquee alert alert-danger text-white h2 fw-bolder w100 opacity-50 text-nowrap" role="alert" style="direction:rtl; position:fixed; left:0; bottom:4rem; z-index:23">
22
+          חוסל מחבל חמאס שעבד עם "אל-ג'זירה" • ברצועה מדווחים על הרוגים בתקיפות במחנה נוסיראת ובדרום חאן יונס • בין ההרוגים - כתב "פלשתין אל יום" וכתב "אל-ג'זירה" חוסאם שבאת • צה"ל חשף כי לפי מידע מודיעיני, חוסאם שבאת הוא מחבל בגדוד בית חאנון של ארגון הטרור חמאס • שחר קליימן, ישראל היום, 24/2/25
23
+        </div>
24
+      </div>
25
+    </div>
26
+  </div>
27
+  <script src="/static/js/jquery-3.7.1.min.js"></script>
28
+  <script src="/static/js/jquery.marquee.min.js"></script>
29
+  <script src="/static/bootstrap/js/bootstrap.bundle.min.js"></script>
30
+  <script>
31
+  $(()=> {
32
+    $(".marquee").marquee({
33
+      "direction": "right",
34
+      "duplicated": true,
35
+      "speed": 69
36
+    });
37
+  });
38
+  async function getDistance() {
39
+    try {
40
+      let response = await fetch("/d");
41
+      let data = await response.json();
42
+      return data.distance;
43
+    } catch {
44
+      return 0;
45
+    }
46
+  };
47
+  const MAX_DIST = 2000;
48
+  const MIN_DIST = 300;
49
+  const VID_BLUR_FACTOR = MAX_DIST/16.0; // float
50
+  const TICKER_BLUR_FACTOR = MAX_DIST/32.0; // float
51
+  async function updateDistance() {
52
+    var dist = await getDistance();
53
+    var vidblur = 0; tickerblur = 0;
54
+    if (dist>MIN_DIST && dist<MAX_DIST) {
55
+      vidblur = parseInt((MAX_DIST-dist)/VID_BLUR_FACTOR);
56
+      tickerblur = parseInt(dist/TICKER_BLUR_FACTOR);
57
+    }
58
+    //console.log(`${vidblur}, ${tickerblur}`);
59
+    document.getElementById("the-video").style.filter=`blur(${vidblur}px)`;
60
+    document.getElementById("the-ticker").style.filter=`blur(${tickerblur}px)`;
61
+  }
62
+  window.update_interval = setInterval(updateDistance, 200);
63
+  </script>
64
+</body>
65
+</html>

+ 45
- 0
templates/progbar.html Vedi File

@@ -0,0 +1,45 @@
1
+<!doctype html>
2
+<html lang="en">
3
+<head>
4
+  <meta charset="utf-8">
5
+  <meta name="viewport" content="width=device-width, initial-scale=1">
6
+  <title>Distance measurement</title>
7
+  <link href="/static/bootstrap/css/bootstrap.min.css" rel="stylesheet">
8
+  <link href="/static/css/h-ticker.css" rel="stylesheet">
9
+  <link rel="icon" href="/static/gfx/antenna.png">
10
+</head>
11
+<body data-bs-theme="dark">
12
+  <div class="container-fluid text-center">
13
+    <div class="row">
14
+      <div class="col12">
15
+        <h1>Distance measurement</h1>
16
+        <div class="progress" role="progressbar" aria-label="Success striped example" style="height: 4rem">
17
+          <div id="distance-bar" class="progress-bar h2 progress-bar-striped progress-bar-animated bg-success" style="width: 25%"></div>
18
+        </div>
19
+      </div>
20
+    </div>
21
+  </div>
22
+  <script src="/static/js/jquery-3.7.1.min.js"></script>
23
+  <script src="/static/js/jquery.marquee.min.js"></script>
24
+  <script src="/static/bootstrap/js/bootstrap.bundle.min.js"></script>
25
+  <script>
26
+    async function getDistance() {
27
+      try {
28
+        let response = await fetch("/d");
29
+        let data = await response.json();
30
+        return data.distance;
31
+      } catch {
32
+        return 0;
33
+      }
34
+    };
35
+    async function updateDistance() {
36
+      var dist = await getDistance();
37
+      var bar = document.getElementById("distance-bar");
38
+      var percentage = dist>2000 ? 100 : parseInt((100.0*dist)/2000.0);
39
+      bar.style.width=`${percentage}%`;
40
+      bar.textContent = dist;
41
+    }
42
+    window.update_interval = setInterval(updateDistance, 200);
43
+  </script>
44
+</body>
45
+</html>

Loading…
Annulla
Salva