diff options
| -rw-r--r-- | src/app.py | 5 | ||||
| -rw-r--r-- | src/favicon.svg | 56 | ||||
| -rw-r--r-- | src/index.html | 1 |
3 files changed, 62 insertions, 0 deletions
| @@ -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") | ||
| 55 | def favicon_svg(): | ||
| 56 | return send_from_directory(app.root_path, "favicon.svg") | ||
| 57 | |||
| 58 | |||
| 54 | @app.route("/uploads/<filename>") | 59 | @app.route("/uploads/<filename>") |
| 55 | def uploads(filename: str): | 60 | def 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> |
