summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorkj_sh6042026-03-31 18:18:55 -0400
committerkj_sh6042026-03-31 18:18:55 -0400
commit91bb7d3b8362684b1fe6510e3265ab3a4f6b7af6 (patch)
tree389ad86e710baa657ff8ef1d635b60b49e1fafb2 /src
parent64d8fc9ce9922f38780cc677478cbfb47b21a87e (diff)
refactor: add favicon
Diffstat (limited to 'src')
-rw-r--r--src/app.py5
-rw-r--r--src/favicon.svg56
-rw-r--r--src/index.html1
3 files changed, 62 insertions, 0 deletions
diff --git a/src/app.py b/src/app.py
index 7d75f2b..d74d11d 100644
--- a/src/app.py
+++ b/src/app.py
@@ -51,6 +51,11 @@ def index():
51 return send_from_directory(app.root_path, "index.html") 51 return send_from_directory(app.root_path, "index.html")
52 52
53 53
54@app.route("/favicon.svg")
55def favicon_svg():
56 return send_from_directory(app.root_path, "favicon.svg")
57
58
54@app.route("/uploads/<filename>") 59@app.route("/uploads/<filename>")
55def uploads(filename: str): 60def uploads(filename: str):
56 return send_from_directory(UPLOAD_DIR, filename) 61 return send_from_directory(UPLOAD_DIR, filename)
diff --git a/src/favicon.svg b/src/favicon.svg
new file mode 100644
index 0000000..4e6f83f
--- /dev/null
+++ b/src/favicon.svg
@@ -0,0 +1,56 @@
1<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
3
4<svg
5 width="800px"
6 height="800px"
7 viewBox="0 0 24 24"
8 fill="none"
9 version="1.1"
10 id="svg6"
11 xmlns="http://www.w3.org/2000/svg"
12 xmlns:svg="http://www.w3.org/2000/svg">
13 <defs
14 id="defs6" />
15 <path
16 d="M2 2H22"
17 stroke="#1C274C"
18 stroke-width="1.5"
19 stroke-linecap="round"
20 id="path1"
21 style="stroke:#7e9bc6;stroke-opacity:1" />
22 <path
23 d="M9 10.5L10.2929 9.20711C10.6262 8.87377 10.7929 8.70711 11 8.70711C11.2071 8.70711 11.3738 8.87377 11.7071 9.20711L12.2929 9.79289C12.6262 10.1262 12.7929 10.2929 13 10.2929C13.2071 10.2929 13.3738 10.1262 13.7071 9.79289L15 8.5"
24 stroke="#1C274C"
25 stroke-width="1.5"
26 stroke-linecap="round"
27 id="path2"
28 style="stroke:#7e9bc6;stroke-opacity:1" />
29 <path
30 d="M12 21L12 17"
31 stroke="#1C274C"
32 stroke-width="1.5"
33 stroke-linecap="round"
34 id="path3"
35 style="stroke:#7e9bc6;stroke-opacity:1" />
36 <path
37 d="M10 22L12 21"
38 stroke="#1C274C"
39 stroke-width="1.5"
40 stroke-linecap="round"
41 id="path4"
42 style="stroke:#7e9bc6;stroke-opacity:1" />
43 <path
44 d="M14 22L12 21"
45 stroke="#1C274C"
46 stroke-width="1.5"
47 stroke-linecap="round"
48 id="path5"
49 style="stroke:#7e9bc6;stroke-opacity:1" />
50 <path
51 d="M20 2V10.5C20 13.5641 20 15.0962 18.9958 16.0481C17.9916 17 16.3753 17 13.1429 17H10.8571C7.62465 17 6.00841 17 5.00421 16.0481C4 15.0962 4 13.5641 4 10.5V2"
52 stroke="#1C274C"
53 stroke-width="1.5"
54 id="path6"
55 style="stroke:#7e9bc6;stroke-opacity:1" />
56</svg>
diff --git a/src/index.html b/src/index.html
index ef2f584..d658012 100644
--- a/src/index.html
+++ b/src/index.html
@@ -5,6 +5,7 @@
5 <meta charset="UTF-8"> 5 <meta charset="UTF-8">
6 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 <meta name="viewport" content="width=device-width, initial-scale=1.0">
7 <title>sent-web</title> 7 <title>sent-web</title>
8 <link rel="icon" type="image/svg+xml" href="/favicon.svg">
8 <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/kj-sh604/noir.css@latest/out/noir.min.css"> 9 <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/kj-sh604/noir.css@latest/out/noir.min.css">
9 <style> :root { --sent-fg: #000000; --sent-bg: #ffffff; --sent-font: 'Noto Color Emoji', 'DejaVu Sans', sans-serif; } body { max-width: 960px; margin: 0 auto; padding: 1rem; } .subtitle { opacity: 0.6; font-size: 0.9em; margin-top: -0.8em; } /* ── controls ── */ #controls { display: flex; flex-wrap: wrap; gap: 1rem; align-items: center; margin-bottom: 1rem; padding: 0.75rem; border: 1px solid currentColor; border-radius: 4px; } #controls label { display: flex; align-items: center; gap: 0.4rem; font-size: 0.9rem; } #controls input[type="color"] { width: 2rem; height: 2rem; padding: 0; border: 1px solid currentColor; cursor: pointer; background: none; } #controls select { max-width: 200px; } .upload-area { display: flex; align-items: center; gap: 0.5rem; } #upload-input { display: none; } #upload-status { font-size: 0.85rem; opacity: 0.7; } /* ── editor ── */ #input { width: 100%; min-height: 420px; font-family: monospace; font-size: 0.95rem; resize: vertical; tab-size: 4; } .btn-row { display: flex; gap: 0.5rem; margin-top: 0.5rem; } .hint { font-size: 0.8rem; opacity: 0.5; margin-top: 0.25rem; } /* ── presentation overlay ── */ #presentation { position: fixed; inset: 0; z-index: 9999; display: none; align-items: center; justify-content: flex-start; background: var(--sent-bg); color: var(--sent-fg); cursor: none; overflow: hidden; padding-left: 7.5%; } #presentation.active { display: flex; } #slide-content { text-align: left; white-space: pre-line; word-wrap: break-word; font-family: var(--sent-font); } #slide-content img { display: block; max-width: 85vw; max-height: 85vh; object-fit: contain; } </style> 10 <style> :root { --sent-fg: #000000; --sent-bg: #ffffff; --sent-font: 'Noto Color Emoji', 'DejaVu Sans', sans-serif; } body { max-width: 960px; margin: 0 auto; padding: 1rem; } .subtitle { opacity: 0.6; font-size: 0.9em; margin-top: -0.8em; } /* ── controls ── */ #controls { display: flex; flex-wrap: wrap; gap: 1rem; align-items: center; margin-bottom: 1rem; padding: 0.75rem; border: 1px solid currentColor; border-radius: 4px; } #controls label { display: flex; align-items: center; gap: 0.4rem; font-size: 0.9rem; } #controls input[type="color"] { width: 2rem; height: 2rem; padding: 0; border: 1px solid currentColor; cursor: pointer; background: none; } #controls select { max-width: 200px; } .upload-area { display: flex; align-items: center; gap: 0.5rem; } #upload-input { display: none; } #upload-status { font-size: 0.85rem; opacity: 0.7; } /* ── editor ── */ #input { width: 100%; min-height: 420px; font-family: monospace; font-size: 0.95rem; resize: vertical; tab-size: 4; } .btn-row { display: flex; gap: 0.5rem; margin-top: 0.5rem; } .hint { font-size: 0.8rem; opacity: 0.5; margin-top: 0.25rem; } /* ── presentation overlay ── */ #presentation { position: fixed; inset: 0; z-index: 9999; display: none; align-items: center; justify-content: flex-start; background: var(--sent-bg); color: var(--sent-fg); cursor: none; overflow: hidden; padding-left: 7.5%; } #presentation.active { display: flex; } #slide-content { text-align: left; white-space: pre-line; word-wrap: break-word; font-family: var(--sent-font); } #slide-content img { display: block; max-width: 85vw; max-height: 85vh; object-fit: contain; } </style>
10 <script> 11 <script>