Compare commits
6 Commits
354e897e55
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4605b51236 | ||
|
|
b7cb257d05 | ||
|
|
e3c69b6188 | ||
|
|
7fae8dc958 | ||
|
|
89de32ee25 | ||
|
|
e1bda360f4 |
50
zuss/app.js
50
zuss/app.js
@@ -4,7 +4,7 @@
|
||||
* - Install/Update Overlay mit beforeinstallprompt.prompt()
|
||||
*/
|
||||
|
||||
const APP_VERSION = "2025.12.24.6";
|
||||
const APP_VERSION = "2025.12.24.19";
|
||||
const TOKEN = "T9e7WESBXxy6rSD";
|
||||
const BASE = "https://home.x-s.at";
|
||||
const SHARE_DAV = `${BASE}/public.php/dav/files/${TOKEN}`;
|
||||
@@ -247,28 +247,27 @@ function renderList(items, currentDir) {
|
||||
|
||||
if (pdfs.length === 0) {
|
||||
setStatus("Keine PDFs gefunden.");
|
||||
const cnt = $("titleCount"); if (cnt) cnt.textContent = "(0)";
|
||||
return;
|
||||
}
|
||||
|
||||
setStatus(`PDFs: ${pdfs.length}`);
|
||||
setStatus("");
|
||||
const cnt = $("titleCount"); if (cnt) cnt.textContent = `(${pdfs.length})`;
|
||||
|
||||
for (const it of pdfs) {
|
||||
const a = document.createElement("a");
|
||||
a.className = "row";
|
||||
a.href = "#";
|
||||
a.addEventListener("click", (e) => {
|
||||
e.preventDefault();
|
||||
|
||||
// Build relative path within share
|
||||
// href includes /public.php/dav/files/<token>/...; we want path after that
|
||||
const marker = `/public.php/dav/files/${TOKEN}`;
|
||||
const idx = it.href.indexOf(marker);
|
||||
let rel = "/";
|
||||
if (idx >= 0) rel = it.href.slice(idx + marker.length);
|
||||
if (!rel.startsWith("/")) rel = "/" + rel;
|
||||
|
||||
window.location.href = toPdfJsUrl(rel);
|
||||
});
|
||||
// Build relative path within share for viewer URL
|
||||
const marker = `/public.php/dav/files/${TOKEN}`;
|
||||
const idx = it.href.indexOf(marker);
|
||||
let rel = "/";
|
||||
if (idx >= 0) rel = it.href.slice(idx + marker.length);
|
||||
if (!rel.startsWith("/")) rel = "/" + rel;
|
||||
const targetUrl = toPdfJsUrl(rel);
|
||||
a.href = targetUrl;
|
||||
a.target = "_blank";
|
||||
a.rel = "noopener noreferrer";
|
||||
|
||||
const ico = document.createElement("div");
|
||||
ico.className = "ico";
|
||||
@@ -311,6 +310,7 @@ async function loadList() {
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
setStatus("Fehler");
|
||||
const cnt = $("titleCount"); if (cnt) cnt.textContent = "";
|
||||
showError(String(e && e.message ? e.message : e));
|
||||
}
|
||||
}
|
||||
@@ -326,6 +326,19 @@ async function registerSW() {
|
||||
}
|
||||
}
|
||||
|
||||
function closeAushang(){
|
||||
try { window.close(); } catch {}
|
||||
// Fallbacks: first try history back, then blank
|
||||
setTimeout(() => {
|
||||
if (document.visibilityState === "hidden") return; // tab closed
|
||||
history.back();
|
||||
setTimeout(() => {
|
||||
if (document.visibilityState === "hidden") return;
|
||||
location.replace("about:blank");
|
||||
}, 200);
|
||||
}, 120);
|
||||
}
|
||||
|
||||
function applyTheme(t){
|
||||
document.documentElement.setAttribute("data-theme", t);
|
||||
localStorage.setItem("wfw_theme", t);
|
||||
@@ -377,12 +390,7 @@ document.addEventListener("click", (e) => {
|
||||
|
||||
document.addEventListener("DOMContentLoaded", async () => {
|
||||
$("refreshBtn").addEventListener("click", (e) => { e.preventDefault(); loadList(); });
|
||||
$("closeBtn").addEventListener("click", (e) => {
|
||||
e.preventDefault();
|
||||
// Kiosk-ish: close tab if possible, else just go back
|
||||
window.close();
|
||||
setTimeout(() => { history.back(); }, 150);
|
||||
});
|
||||
$("closeBtn").addEventListener("click", (e) => { e.preventDefault(); closeAushang(); });
|
||||
initTheme();
|
||||
$("themeBtn").addEventListener("click", () => {
|
||||
const current = document.documentElement.getAttribute("data-theme") || "dark";
|
||||
|
||||
135
zuss/index.html
135
zuss/index.html
@@ -6,143 +6,24 @@
|
||||
<meta name="theme-color" content="#0b1020" />
|
||||
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||
<meta name="mobile-web-app-capable" content="yes">
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
|
||||
|
||||
<link rel="manifest" href="./manifest.webmanifest">
|
||||
<link rel="icon" href="./icons/icon-192.png">
|
||||
<link rel="apple-touch-icon" href="./icons/icon-192.png">
|
||||
<link rel="stylesheet" href="./style.css">
|
||||
|
||||
<title>WFW-Aushang</title>
|
||||
|
||||
<style>
|
||||
:root,
|
||||
:root[data-theme="dark"]{
|
||||
--bg:#0b1020; --card:#121a33; --text:#e8eeff; --muted:#9fb0ff;
|
||||
--line:rgba(255,255,255,.12); --btn:#2b60ff; --btn2:#1c254b;
|
||||
--ok:#2bff9f; --warn:#ffd36b;
|
||||
}
|
||||
:root[data-theme="light"]{
|
||||
--bg:#f6f7fb; --card:#ffffff; --text:#0b1020; --muted:#5060a8;
|
||||
--line:rgba(0,0,0,.10); --btn:#2b60ff; --btn2:#eef1ff;
|
||||
}
|
||||
|
||||
|
||||
*{ box-sizing:border-box; }
|
||||
body{
|
||||
margin:0; font-family: system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Arial;
|
||||
background:var(--bg); color:var(--text);
|
||||
}
|
||||
.wrap{
|
||||
max-width: 860px; margin: 0 auto; padding: 16px 16px 92px;
|
||||
}
|
||||
h1{ font-size: 20px; margin: 8px 0 14px; letter-spacing:.3px; }
|
||||
.list{
|
||||
display:flex; flex-direction:column; gap:10px;
|
||||
}
|
||||
.row{
|
||||
display:flex; align-items:center; gap:12px;
|
||||
background:var(--card); border:1px solid var(--line);
|
||||
border-radius:16px; padding:12px 14px;
|
||||
text-decoration:none; color:inherit;
|
||||
}
|
||||
.row:active{ transform: scale(0.995); }
|
||||
.ico{
|
||||
width:38px; height:38px; border-radius:12px;
|
||||
display:grid; place-items:center;
|
||||
background:rgba(43,96,255,.16);
|
||||
border:1px solid rgba(43,96,255,.22);
|
||||
flex:0 0 auto;
|
||||
}
|
||||
.name{ font-size: 16px; line-height:1.2; }
|
||||
.sub{ font-size: 12px; color: var(--muted); margin-top:3px; }
|
||||
.spacer{ flex:1; }
|
||||
.badge{
|
||||
font-size:12px; color:var(--muted);
|
||||
border:1px solid var(--line); padding:6px 10px; border-radius:999px;
|
||||
background:rgba(0,0,0,.08);
|
||||
}
|
||||
|
||||
.footer{
|
||||
position:fixed; left:0; right:0; bottom:0;
|
||||
padding:12px 12px calc(12px + env(safe-area-inset-bottom));
|
||||
background:linear-gradient(to top, rgba(11,16,32,.95), rgba(11,16,32,.55), rgba(11,16,32,0));
|
||||
pointer-events:none;
|
||||
}
|
||||
@media (prefers-color-scheme: light){
|
||||
.footer{ background:linear-gradient(to top, rgba(246,247,251,.95), rgba(246,247,251,.55), rgba(246,247,251,0)); }
|
||||
}
|
||||
.footerInner{
|
||||
max-width: 860px; margin:0 auto; display:flex; gap:10px; pointer-events:auto;
|
||||
}
|
||||
|
||||
/* BIG BUTTONS */
|
||||
.btn{
|
||||
border:0; border-radius:18px;
|
||||
padding:18px 18px; /* bigger */
|
||||
font-size:18px; /* bigger */
|
||||
font-weight:800;
|
||||
min-height:64px; /* bigger */
|
||||
display:flex; align-items:center; justify-content:center;
|
||||
cursor:pointer;
|
||||
box-shadow: 0 10px 30px rgba(0,0,0,.22);
|
||||
text-decoration:none;
|
||||
user-select:none;
|
||||
-webkit-tap-highlight-color: transparent;
|
||||
}
|
||||
.btnPrimary{ background:var(--btn); color:white; flex:1; }
|
||||
.btnSecondary{ background:var(--btn2); color:var(--text); flex:1; border:1px solid var(--line); box-shadow:none; }
|
||||
.btn:active{ transform: scale(0.995); }
|
||||
|
||||
.status{
|
||||
margin: 8px 0 14px; color: var(--muted); font-size: 13px;
|
||||
}
|
||||
.error{
|
||||
background: rgba(255,80,80,.12);
|
||||
border:1px solid rgba(255,80,80,.25);
|
||||
color: #ffb7b7;
|
||||
padding: 10px 12px;
|
||||
border-radius: 14px;
|
||||
font-size: 13px;
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
|
||||
/* INSTALL/UPDATE OVERLAY */
|
||||
#installOverlay{
|
||||
position:fixed; inset:0;
|
||||
display:none;
|
||||
z-index:2147483647;
|
||||
background: rgba(0,0,0,.55);
|
||||
backdrop-filter: blur(10px);
|
||||
pointer-events:auto;
|
||||
padding: 18px 14px;
|
||||
}
|
||||
#installOverlay *{ pointer-events:auto; }
|
||||
.ovCard{
|
||||
max-width: 560px;
|
||||
margin: 10vh auto 0;
|
||||
background: var(--card);
|
||||
border: 1px solid var(--line);
|
||||
border-radius: 22px;
|
||||
padding: 18px 16px;
|
||||
box-shadow: 0 20px 70px rgba(0,0,0,.35);
|
||||
}
|
||||
.ovTitle{ font-size: 18px; font-weight: 850; margin: 6px 0 6px; }
|
||||
.ovText{ color: var(--muted); font-size: 14px; line-height: 1.35; margin: 0 0 14px; }
|
||||
.ovBtns{ display:flex; gap:12px; margin-top: 10px; }
|
||||
.ovBtns .btn{ flex:1; }
|
||||
.ovHint{
|
||||
margin-top: 12px;
|
||||
font-size: 12px;
|
||||
color: var(--muted);
|
||||
border-top: 1px solid var(--line);
|
||||
padding-top: 12px;
|
||||
line-height: 1.35;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="wrap">
|
||||
<h1>WFW-Aushang</h1>
|
||||
<div class="titleRow">
|
||||
<div class="titleIcon" aria-hidden="true"></div>
|
||||
<h1>WFW-Aushang</h1>
|
||||
<span id="titleCount" class="titleCount"></span>
|
||||
</div>
|
||||
<div id="status" class="status">Lade Liste…</div>
|
||||
<div id="err" class="error" style="display:none"></div>
|
||||
<div id="list" class="list"></div>
|
||||
@@ -168,6 +49,6 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="./app.js?v=2025.12.24.6"></script>
|
||||
<script src="./app.js?v=2025.12.24.19"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
"short_name": "WFW-Aushang",
|
||||
"start_url": "/zuss/?source=pwa",
|
||||
"scope": "/zuss/",
|
||||
"display": "standalone",
|
||||
"display": "fullscreen",
|
||||
"orientation": "portrait",
|
||||
"background_color": "#0b1020",
|
||||
"theme_color": "#0b1020",
|
||||
@@ -12,4 +12,3 @@
|
||||
{ "src": "/zuss/icons/icon-512.png", "sizes": "512x512", "type": "image/png" }
|
||||
]
|
||||
}
|
||||
|
||||
|
||||
144
zuss/style.css
Normal file
144
zuss/style.css
Normal file
@@ -0,0 +1,144 @@
|
||||
:root,
|
||||
:root[data-theme="dark"]{
|
||||
--bg:#0b1020; --card:#121a33; --text:#e8eeff; --muted:#9fb0ff;
|
||||
--line:rgba(255,255,255,.12); --btn:#2b60ff; --btn2:#1c254b;
|
||||
--ok:#2bff9f; --warn:#ffd36b;
|
||||
}
|
||||
:root[data-theme="light"]{
|
||||
--bg:#f6f7fb; --card:#ffffff; --text:#0b1020; --muted:#5060a8;
|
||||
--line:rgba(0,0,0,.10); --btn:#2b60ff; --btn2:#eef1ff;
|
||||
}
|
||||
|
||||
*{ box-sizing:border-box; }
|
||||
body{
|
||||
margin:0; font-family: system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Arial;
|
||||
background:var(--bg); color:var(--text);
|
||||
}
|
||||
.wrap{
|
||||
max-width: 860px; margin: 0 auto; padding: 16px 16px 92px;
|
||||
}
|
||||
.titleRow{
|
||||
display:flex; align-items:center; gap:10px;
|
||||
margin: 6px 0 12px;
|
||||
}
|
||||
.titleIcon{
|
||||
width:54px; height:54px; border-radius:18px;
|
||||
display:grid; place-items:center; flex:0 0 auto;
|
||||
background:rgba(43,96,255,.16); border:1px solid rgba(43,96,255,.22);
|
||||
background-image: url("https://home.x-s.at/zuss/icons/icon-192.png");
|
||||
background-size: cover;
|
||||
background-position: center;
|
||||
background-repeat: no-repeat;
|
||||
overflow:hidden;
|
||||
}
|
||||
h1{ font-size: 20px; margin: 0; letter-spacing:.3px; }
|
||||
.titleCount{
|
||||
font-size:12px; color:var(--muted);
|
||||
border:1px solid var(--line);
|
||||
padding:6px 10px;
|
||||
border-radius:999px;
|
||||
background:rgba(0,0,0,.08);
|
||||
margin-left:4px;
|
||||
}
|
||||
.list{
|
||||
display:flex; flex-direction:column; gap:10px;
|
||||
}
|
||||
.row{
|
||||
display:flex; align-items:center; gap:12px;
|
||||
background:var(--card); border:1px solid var(--line);
|
||||
border-radius:16px; padding:12px 14px;
|
||||
text-decoration:none; color:inherit;
|
||||
}
|
||||
.row:active{ transform: scale(0.995); }
|
||||
.ico{
|
||||
width:38px; height:38px; border-radius:12px;
|
||||
display:grid; place-items:center;
|
||||
background:rgba(43,96,255,.16);
|
||||
border:1px solid rgba(43,96,255,.22);
|
||||
flex:0 0 auto;
|
||||
}
|
||||
.name{ font-size: 16px; line-height:1.2; }
|
||||
.sub{ font-size: 12px; color: var(--muted); margin-top:3px; }
|
||||
.spacer{ flex:1; }
|
||||
.badge{
|
||||
font-size:12px; color:var(--muted);
|
||||
border:1px solid var(--line); padding:6px 10px; border-radius:999px;
|
||||
background:rgba(0,0,0,.08);
|
||||
}
|
||||
|
||||
.footer{
|
||||
position:fixed; left:0; right:0; bottom:0;
|
||||
padding:12px 12px calc(12px + env(safe-area-inset-bottom));
|
||||
background:linear-gradient(to top, rgba(11,16,32,.95), rgba(11,16,32,.55), rgba(11,16,32,0));
|
||||
pointer-events:none;
|
||||
}
|
||||
@media (prefers-color-scheme: light){
|
||||
.footer{ background:linear-gradient(to top, rgba(246,247,251,.95), rgba(246,247,251,.55), rgba(246,247,251,0)); }
|
||||
}
|
||||
.footerInner{
|
||||
max-width: 860px; margin:0 auto; display:flex; gap:10px; pointer-events:auto;
|
||||
}
|
||||
|
||||
/* BIG BUTTONS */
|
||||
.btn{
|
||||
border:0; border-radius:18px;
|
||||
padding:18px 18px; /* bigger */
|
||||
font-size:18px; /* bigger */
|
||||
font-weight:800;
|
||||
min-height:64px; /* bigger */
|
||||
display:flex; align-items:center; justify-content:center;
|
||||
cursor:pointer;
|
||||
box-shadow: 0 10px 30px rgba(0,0,0,.22);
|
||||
text-decoration:none;
|
||||
user-select:none;
|
||||
-webkit-tap-highlight-color: transparent;
|
||||
}
|
||||
.btnPrimary{ background:var(--btn); color:white; flex:1; }
|
||||
.btnSecondary{ background:var(--btn2); color:var(--text); flex:1; border:1px solid var(--line); box-shadow:none; }
|
||||
.btn:active{ transform: scale(0.995); }
|
||||
|
||||
.status{
|
||||
margin: 8px 0 14px; color: var(--muted); font-size: 13px;
|
||||
}
|
||||
.error{
|
||||
background: rgba(255,80,80,.12);
|
||||
border:1px solid rgba(255,80,80,.25);
|
||||
color: #ffb7b7;
|
||||
padding: 10px 12px;
|
||||
border-radius: 14px;
|
||||
font-size: 13px;
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
|
||||
/* INSTALL/UPDATE OVERLAY */
|
||||
#installOverlay{
|
||||
position:fixed; inset:0;
|
||||
display:none;
|
||||
z-index:2147483647;
|
||||
background: rgba(0,0,0,.55);
|
||||
backdrop-filter: blur(10px);
|
||||
pointer-events:auto;
|
||||
padding: 18px 14px;
|
||||
}
|
||||
#installOverlay *{ pointer-events:auto; }
|
||||
.ovCard{
|
||||
max-width: 560px;
|
||||
margin: 10vh auto 0;
|
||||
background: var(--card);
|
||||
border: 1px solid var(--line);
|
||||
border-radius: 22px;
|
||||
padding: 18px 16px;
|
||||
box-shadow: 0 20px 70px rgba(0,0,0,.35);
|
||||
}
|
||||
.ovTitle{ font-size: 18px; font-weight: 850; margin: 6px 0 6px; }
|
||||
.ovText{ color: var(--muted); font-size: 14px; line-height: 1.35; margin: 0 0 14px; }
|
||||
.ovBtns{ display:flex; gap:12px; margin-top: 10px; }
|
||||
.ovBtns .btn{ flex:1; }
|
||||
.ovHint{
|
||||
margin-top: 12px;
|
||||
font-size: 12px;
|
||||
color: var(--muted);
|
||||
border-top: 1px solid var(--line);
|
||||
padding-top: 12px;
|
||||
line-height: 1.35;
|
||||
}
|
||||
@@ -1,9 +1,10 @@
|
||||
const CACHE = "wfw-aushang-2025.12.24.6";
|
||||
const CACHE = "wfw-aushang-2025.12.24.19";
|
||||
|
||||
const ASSETS = [
|
||||
"/zuss/",
|
||||
"/zuss/index.html",
|
||||
"/zuss/app.js",
|
||||
"/zuss/style.css",
|
||||
"/zuss/manifest.webmanifest",
|
||||
"/zuss/version.json",
|
||||
"/zuss/icons/icon-192.png",
|
||||
@@ -40,7 +41,7 @@ self.addEventListener("fetch", (event) => {
|
||||
return fresh;
|
||||
} catch {
|
||||
const cached = await caches.match(req);
|
||||
return cached || new Response('{"version":"2025.12.24.6"}', { headers: { "Content-Type": "application/json" } });
|
||||
return cached || new Response('{"version":"2025.12.24.19"}', { headers: { "Content-Type": "application/json" } });
|
||||
}
|
||||
})());
|
||||
return;
|
||||
|
||||
@@ -1 +1 @@
|
||||
{ "version": "2025.12.24.6" }
|
||||
{ "version": "2025.12.24.19" }
|
||||
|
||||
Reference in New Issue
Block a user