Compare commits
4 Commits
5e31f00b77
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| c6a6f4cd0c | |||
|
|
30db21f4af | ||
|
|
a169999ff1 | ||
|
|
8b175557dc |
1
.gitignore
vendored
@@ -21,3 +21,4 @@ target/
|
|||||||
.env.production
|
.env.production
|
||||||
uploads/
|
uploads/
|
||||||
*.report.html
|
*.report.html
|
||||||
|
favicon_io.zip
|
||||||
|
|||||||
@@ -4,6 +4,8 @@ gitara.farmeris.sk {
|
|||||||
@static path /static/*
|
@static path /static/*
|
||||||
header @static Cache-Control "public, max-age=2592000"
|
header @static Cache-Control "public, max-age=2592000"
|
||||||
|
|
||||||
|
rewrite /favicon.ico /static/favicon/favicon.ico
|
||||||
|
|
||||||
reverse_proxy gitara-web:5150
|
reverse_proxy gitara-web:5150
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
60
Cargo.lock
generated
@@ -1523,6 +1523,36 @@ dependencies = [
|
|||||||
"wasip3",
|
"wasip3",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "gitara_web"
|
||||||
|
version = "0.1.0"
|
||||||
|
dependencies = [
|
||||||
|
"async-trait",
|
||||||
|
"axum",
|
||||||
|
"axum-extra",
|
||||||
|
"bytes",
|
||||||
|
"chrono",
|
||||||
|
"dotenvy",
|
||||||
|
"fluent-templates",
|
||||||
|
"include_dir",
|
||||||
|
"insta",
|
||||||
|
"loco-rs",
|
||||||
|
"migration",
|
||||||
|
"regex",
|
||||||
|
"rstest",
|
||||||
|
"sea-orm",
|
||||||
|
"serde",
|
||||||
|
"serde_json",
|
||||||
|
"serial_test",
|
||||||
|
"time",
|
||||||
|
"tokio",
|
||||||
|
"tracing",
|
||||||
|
"tracing-subscriber",
|
||||||
|
"unic-langid",
|
||||||
|
"uuid",
|
||||||
|
"validator",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "glob"
|
name = "glob"
|
||||||
version = "0.3.3"
|
version = "0.3.3"
|
||||||
@@ -5052,36 +5082,6 @@ version = "0.2.6"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853"
|
checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "gitara_web"
|
|
||||||
version = "0.1.0"
|
|
||||||
dependencies = [
|
|
||||||
"async-trait",
|
|
||||||
"axum",
|
|
||||||
"axum-extra",
|
|
||||||
"bytes",
|
|
||||||
"chrono",
|
|
||||||
"dotenvy",
|
|
||||||
"fluent-templates",
|
|
||||||
"include_dir",
|
|
||||||
"insta",
|
|
||||||
"loco-rs",
|
|
||||||
"migration",
|
|
||||||
"regex",
|
|
||||||
"rstest",
|
|
||||||
"sea-orm",
|
|
||||||
"serde",
|
|
||||||
"serde_json",
|
|
||||||
"serial_test",
|
|
||||||
"time",
|
|
||||||
"tokio",
|
|
||||||
"tracing",
|
|
||||||
"tracing-subscriber",
|
|
||||||
"unic-langid",
|
|
||||||
"uuid",
|
|
||||||
"validator",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "unsafe-libyaml"
|
name = "unsafe-libyaml"
|
||||||
version = "0.2.11"
|
version = "0.2.11"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
brand = Universal Web
|
brand = My guitar
|
||||||
hello-world = Hello world!
|
hello-world = Hello world!
|
||||||
meta-description = A guitar player's personal site. News, blog posts, albums, and songs in one place.
|
meta-description = A guitar player's personal site. News, blog posts, albums, and songs in one place.
|
||||||
nav-home = Home
|
nav-home = Home
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
brand = Universal Web
|
brand = My guitar
|
||||||
hello-world = Hello world!
|
hello-world = Hello world!
|
||||||
meta-description = A guitar player's personal site. News, blog posts, albums, and songs in one place.
|
meta-description = A guitar player's personal site. News, blog posts, albums, and songs in one place.
|
||||||
nav-home = Home
|
nav-home = Home
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
brand = Universal Web
|
brand = Moja gitara
|
||||||
hello-world = Ahoj svet!
|
hello-world = Ahoj svet!
|
||||||
meta-description = Osobná stránka gitaristu. Novinky, blog, albumy a skladby na jednom mieste.
|
meta-description = Osobná stránka gitaristu. Novinky, blog, albumy a skladby na jednom mieste.
|
||||||
nav-home = Domov
|
nav-home = Domov
|
||||||
|
|||||||
@@ -95,10 +95,13 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* === 3. Terminal look & feel ================================ */
|
/* === 3. Terminal look & feel ================================ */
|
||||||
|
/* Root font-size drives every rem in this file and in app.css.
|
||||||
|
* Bump this to scale the whole UI; drop to shrink. */
|
||||||
|
html { font-size: 19px; }
|
||||||
body {
|
body {
|
||||||
font-family: "JetBrains Mono", "Cascadia Code", "Fira Code",
|
font-family: "JetBrains Mono", "Cascadia Code", "Fira Code",
|
||||||
ui-monospace, SFMono-Regular, Menlo, Consolas, "Liberation Mono", monospace;
|
ui-monospace, SFMono-Regular, Menlo, Consolas, "Liberation Mono", monospace;
|
||||||
font-size: 15px;
|
font-size: 1rem;
|
||||||
line-height: 1.6;
|
line-height: 1.6;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -142,7 +145,7 @@ body {
|
|||||||
.t-green { color: oklch(var(--su)); }
|
.t-green { color: oklch(var(--su)); }
|
||||||
.t-yellow { color: oklch(var(--wa)); }
|
.t-yellow { color: oklch(var(--wa)); }
|
||||||
.t-red { color: oklch(var(--er)); }
|
.t-red { color: oklch(var(--er)); }
|
||||||
.t-dim { color: oklch(var(--bc) / 0.5); }
|
.t-dim { color: oklch(var(--bc) / 0.75); }
|
||||||
|
|
||||||
/* --- window titlebar (the header) -------------------------- */
|
/* --- window titlebar (the header) -------------------------- */
|
||||||
.term-titlebar {
|
.term-titlebar {
|
||||||
@@ -230,7 +233,7 @@ body {
|
|||||||
line-height: 1.15;
|
line-height: 1.15;
|
||||||
color: oklch(var(--p));
|
color: oklch(var(--p));
|
||||||
}
|
}
|
||||||
.term-sub { margin-top: 0.2rem; font-size: 0.85rem; color: oklch(var(--bc) / 0.55); }
|
.term-sub { margin-top: 0.2rem; font-size: 0.85rem; color: oklch(var(--bc) / 0.8); }
|
||||||
.term-cmd-actions { display: flex; gap: 0.5rem; flex-wrap: wrap; }
|
.term-cmd-actions { display: flex; gap: 0.5rem; flex-wrap: wrap; }
|
||||||
|
|
||||||
/* --- responsive card grid ---------------------------------- */
|
/* --- responsive card grid ---------------------------------- */
|
||||||
@@ -529,13 +532,36 @@ body {
|
|||||||
.uw-queue-remove:hover { color: oklch(var(--er)); border-color: oklch(var(--er)); }
|
.uw-queue-remove:hover { color: oklch(var(--er)); border-color: oklch(var(--er)); }
|
||||||
|
|
||||||
@media (max-width: 640px) {
|
@media (max-width: 640px) {
|
||||||
|
/* Two-row layout: [title][prev][next][queue][close] on top,
|
||||||
|
* full-width <audio> scrubber underneath. */
|
||||||
.uw-player-tag { display: none; }
|
.uw-player-tag { display: none; }
|
||||||
.uw-player-title { max-width: 7rem; font-size: 0.95rem; }
|
.uw-player-inner {
|
||||||
.uw-player-inner { padding: 0.75rem 0.95rem; gap: 0.6rem; }
|
flex-wrap: wrap;
|
||||||
.uw-playing body { padding-bottom: 5.75rem; }
|
padding: 0.6rem 0.75rem;
|
||||||
.uw-player-btn { min-width: 2.4rem; height: 2.4rem; padding: 0 0.4rem; font-size: 0.95rem; }
|
gap: 0.4rem;
|
||||||
.uw-player-close { width: 2.4rem; height: 2.4rem; }
|
row-gap: 0.5rem;
|
||||||
#uw-audio { height: 2.7rem; min-width: 7rem; }
|
}
|
||||||
|
.uw-player-title {
|
||||||
|
flex: 1 1 auto;
|
||||||
|
min-width: 0;
|
||||||
|
max-width: none;
|
||||||
|
font-size: 0.95rem;
|
||||||
|
}
|
||||||
|
.uw-player-btn {
|
||||||
|
min-width: 2.2rem;
|
||||||
|
height: 2.2rem;
|
||||||
|
padding: 0 0.35rem;
|
||||||
|
font-size: 0.9rem;
|
||||||
|
}
|
||||||
|
.uw-player-close { width: 2.2rem; height: 2.2rem; font-size: 0.95rem; }
|
||||||
|
#uw-audio {
|
||||||
|
order: 99;
|
||||||
|
flex: 1 1 100%;
|
||||||
|
width: 100%;
|
||||||
|
min-width: 0;
|
||||||
|
height: 2.4rem;
|
||||||
|
}
|
||||||
|
.uw-playing body { padding-bottom: 8.25rem; }
|
||||||
.uw-queue-head, .uw-queue-item { padding-left: 0.95rem; padding-right: 0.95rem; }
|
.uw-queue-head, .uw-queue-item { padding-left: 0.95rem; padding-right: 0.95rem; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
BIN
assets/static/favicon/android-chrome-192x192.png
Normal file
|
After Width: | Height: | Size: 31 KiB |
BIN
assets/static/favicon/android-chrome-512x512.png
Normal file
|
After Width: | Height: | Size: 187 KiB |
BIN
assets/static/favicon/apple-touch-icon.png
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
assets/static/favicon/favicon-16x16.png
Normal file
|
After Width: | Height: | Size: 601 B |
BIN
assets/static/favicon/favicon-32x32.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
assets/static/favicon/favicon.ico
Normal file
|
After Width: | Height: | Size: 15 KiB |
1
assets/static/favicon/site.webmanifest
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{"name":"","short_name":"","icons":[{"src":"/static/favicon/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/static/favicon/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"}
|
||||||
1
assets/static/vendor/htmx/htmx-1.9.12.min.js
vendored
Normal file
@@ -4,6 +4,12 @@
|
|||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
<title>{% block title %}{{ t(key="admin-title", lang=lang | default(value='sk')) }}{% endblock title %}</title>
|
<title>{% block title %}{{ t(key="admin-title", lang=lang | default(value='sk')) }}{% endblock title %}</title>
|
||||||
|
<meta name="description" content="{% block meta_description %}{{ t(key="meta-description", lang=lang | default(value='sk')) }}{% endblock meta_description %}">
|
||||||
|
<link rel="icon" type="image/x-icon" href="/static/favicon/favicon.ico">
|
||||||
|
<link rel="icon" type="image/png" sizes="32x32" href="/static/favicon/favicon-32x32.png">
|
||||||
|
<link rel="icon" type="image/png" sizes="16x16" href="/static/favicon/favicon-16x16.png">
|
||||||
|
<link rel="apple-touch-icon" sizes="180x180" href="/static/favicon/apple-touch-icon.png">
|
||||||
|
<link rel="manifest" href="/static/favicon/site.webmanifest">
|
||||||
<script>
|
<script>
|
||||||
function applyTheme(t) {
|
function applyTheme(t) {
|
||||||
var dark = t === 'dark'
|
var dark = t === 'dark'
|
||||||
@@ -36,10 +42,10 @@
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
<link href="/static/css/app.css" rel="stylesheet" type="text/css">
|
<link href="/static/css/app.css?v=2026-05-20b" rel="stylesheet" type="text/css">
|
||||||
{% block head %}{% endblock head %}
|
{% block head %}{% endblock head %}
|
||||||
<link href="/static/css/theme.css" rel="stylesheet" type="text/css">
|
<link href="/static/css/theme.css?v=2026-05-20b" rel="stylesheet" type="text/css">
|
||||||
<script src="https://unpkg.com/htmx.org@1.9.12"></script>
|
<script src="/static/vendor/htmx/htmx-1.9.12.min.js"></script>
|
||||||
<style>
|
<style>
|
||||||
@media (min-width: 768px) {
|
@media (min-width: 768px) {
|
||||||
.nav-menu { flex-direction: row; }
|
.nav-menu { flex-direction: row; }
|
||||||
|
|||||||
@@ -4,6 +4,12 @@
|
|||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
<title>{% block title %}{{ t(key="brand", lang=lang | default(value='sk')) }}{% endblock title %}</title>
|
<title>{% block title %}{{ t(key="brand", lang=lang | default(value='sk')) }}{% endblock title %}</title>
|
||||||
|
<meta name="description" content="{% block meta_description %}{{ t(key="meta-description", lang=lang | default(value='sk')) }}{% endblock meta_description %}">
|
||||||
|
<link rel="icon" type="image/x-icon" href="/static/favicon/favicon.ico">
|
||||||
|
<link rel="icon" type="image/png" sizes="32x32" href="/static/favicon/favicon-32x32.png">
|
||||||
|
<link rel="icon" type="image/png" sizes="16x16" href="/static/favicon/favicon-16x16.png">
|
||||||
|
<link rel="apple-touch-icon" sizes="180x180" href="/static/favicon/apple-touch-icon.png">
|
||||||
|
<link rel="manifest" href="/static/favicon/site.webmanifest">
|
||||||
<script>
|
<script>
|
||||||
function applyTheme(t) {
|
function applyTheme(t) {
|
||||||
var dark = t === 'dark'
|
var dark = t === 'dark'
|
||||||
@@ -220,9 +226,9 @@
|
|||||||
if (e.target.closest('#uw-close')) { uwClear(); return; }
|
if (e.target.closest('#uw-close')) { uwClear(); return; }
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
<link href="/static/css/app.css" rel="stylesheet" type="text/css">
|
<link href="/static/css/app.css?v=2026-05-20b" rel="stylesheet" type="text/css">
|
||||||
<link href="/static/css/theme.css" rel="stylesheet" type="text/css">
|
<link href="/static/css/theme.css?v=2026-05-20b" rel="stylesheet" type="text/css">
|
||||||
<script src="https://unpkg.com/htmx.org@1.9.12"></script>
|
<script src="/static/vendor/htmx/htmx-1.9.12.min.js"></script>
|
||||||
<style>
|
<style>
|
||||||
@media (min-width: 768px) {
|
@media (min-width: 768px) {
|
||||||
.nav-menu { flex-direction: row; }
|
.nav-menu { flex-direction: row; }
|
||||||
|
|||||||
@@ -1,9 +1,11 @@
|
|||||||
services:
|
services:
|
||||||
universal-web:
|
gitara-web:
|
||||||
container_name: gitara-web
|
container_name: gitara-web
|
||||||
build:
|
build:
|
||||||
context: .
|
context: .
|
||||||
dockerfile: Dockerfile
|
dockerfile: Dockerfile
|
||||||
|
extra_hosts:
|
||||||
|
- "host.docker.internal:host-gateway"
|
||||||
env_file:
|
env_file:
|
||||||
- .env.production
|
- .env.production
|
||||||
volumes:
|
volumes:
|
||||||
@@ -24,4 +26,5 @@ networks:
|
|||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
gitara_web_data:
|
gitara_web_data:
|
||||||
|
external: true
|
||||||
name: gitara_web_data
|
name: gitara_web_data
|
||||||
|
|||||||
BIN
favicon/android-chrome-192x192.png
Normal file
|
After Width: | Height: | Size: 31 KiB |
BIN
favicon/android-chrome-512x512.png
Normal file
|
After Width: | Height: | Size: 187 KiB |
BIN
favicon/apple-touch-icon.png
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
favicon/favicon-16x16.png
Normal file
|
After Width: | Height: | Size: 601 B |
BIN
favicon/favicon-32x32.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
favicon/favicon.ico
Normal file
|
After Width: | Height: | Size: 15 KiB |
1
favicon/site.webmanifest
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"}
|
||||||