Weiter am Chastity Ingame gearbeitet
Some checks failed
Host-Based Deploy (Java 21 Fix) / build-and-run (push) Has been cancelled

This commit is contained in:
2026-04-27 17:41:00 +02:00
parent 0aa794600e
commit 34e5fcd777
53 changed files with 905 additions and 847 deletions

View File

@@ -0,0 +1,54 @@
function tpChange(prefix, delta, seg) {
let d = parseInt(document.getElementById(prefix + '_d').value) || 0;
let h = parseInt(document.getElementById(prefix + '_h')?.value) || 0;
let m = parseInt(document.getElementById(prefix + '_m')?.value) || 0;
if (seg === 'm') m += delta;
else if (seg === 'h') h += delta;
else d += delta;
if (m >= 60) { h += Math.floor(m/60); m %= 60; }
if (m < 0) { const b = Math.ceil(-m/60); h -= b; m += b*60; }
if (h >= 24) { d += Math.floor(h/24); h %= 24; }
if (h < 0) { const b = Math.ceil(-h/24); d -= b; h += b*24; }
if (d < 0) d = 0;
document.getElementById(prefix + '_d').value = d;
if (document.getElementById(prefix + '_h'))
document.getElementById(prefix + '_h').value = String(h).padStart(2, '0');
if (document.getElementById(prefix + '_m'))
document.getElementById(prefix + '_m').value = String(m).padStart(2, '0');
}
function tpToMinutes(prefix) {
const d = parseInt(document.getElementById(prefix + '_d').value) || 0;
const h = parseInt(document.getElementById(prefix + '_h')?.value) || 0;
const m = parseInt(document.getElementById(prefix + '_m')?.value) || 0;
return d * 1440 + h * 60 + m;
}
function tpFromMinutes(prefix, total) {
total = total || 0;
const d = Math.floor(total / 1440);
const h = Math.floor((total % 1440) / 60);
const m = total % 60;
document.getElementById(prefix + '_d').value = d;
if (document.getElementById(prefix + '_h'))
document.getElementById(prefix + '_h').value = String(h).padStart(2, '0');
if (document.getElementById(prefix + '_m'))
document.getElementById(prefix + '_m').value = String(m).padStart(2, '0');
}
function tpHtml(prefix, initD, initH, initM) {
const d = initD ?? 0, h = initH ?? 0, m = initM ?? 0;
return `<div class="time-picker">` +
`<div class="tp-seg"><button type="button" onclick="tpChange('${prefix}',-1,'d')"></button><input type="text" id="${prefix}_d" value="${d}" readonly><button type="button" onclick="tpChange('${prefix}',1,'d')">+</button><span class="tp-label">Tage</span></div>` +
`<div class="tp-seg"><button type="button" onclick="tpChange('${prefix}',-1,'h')"></button><input type="text" id="${prefix}_h" value="${String(h).padStart(2,'0')}" readonly><button type="button" onclick="tpChange('${prefix}',1,'h')">+</button><span class="tp-label">Stunden</span></div>` +
`<div class="tp-seg"><button type="button" onclick="tpChange('${prefix}',-1,'m')"></button><input type="text" id="${prefix}_m" value="${String(m).padStart(2,'0')}" readonly><button type="button" onclick="tpChange('${prefix}',1,'m')">+</button><span class="tp-label">Minuten</span></div>` +
`</div>`;
}
function tpHtmlDH(prefix, initD, initH) {
const d = initD ?? 0, h = initH ?? 0;
return `<div class="time-picker">` +
`<div class="tp-seg"><button type="button" onclick="tpChange('${prefix}',-1,'d')"></button><input type="text" id="${prefix}_d" value="${d}" readonly><button type="button" onclick="tpChange('${prefix}',1,'d')">+</button><span class="tp-label">Tage</span></div>` +
`<div class="tp-seg"><button type="button" onclick="tpChange('${prefix}',-1,'h')"></button><input type="text" id="${prefix}_h" value="${String(h).padStart(2,'0')}" readonly><button type="button" onclick="tpChange('${prefix}',1,'h')">+</button><span class="tp-label">Stunden</span></div>` +
`</div>`;
}

View File

@@ -35,15 +35,15 @@
</div>
<div class="topbar-right">
<button class="topbar-btn" id="topbarMsgBtn" title="Nachrichten">
${IC('MESSAGES')}
<img src="/img/icons/envelope.png" style="width:1.875rem;height:1.875rem;object-fit:contain;display:block;" alt="">
<span class="topbar-badge" id="topbarMsgBadge"></span>
</button>
<button class="topbar-btn" id="topbarNotifBtn" title="Benachrichtigungen">
${IC('NOTIFICATIONS')}
<img src="/img/icons/bell.png" style="width:1.875rem;height:1.875rem;object-fit:contain;display:block;" alt="">
<span class="topbar-badge" id="topbarNotifBadge"></span>
</button>
<button class="topbar-btn" id="topbarInvBtn" title="Einladungen">
${IC('INVITATIONS')}
<img src="/img/icons/stars.png" style="width:1.875rem;height:1.875rem;object-fit:contain;display:block;" alt="">
<span class="topbar-badge" id="topbarInvBadge"></span>
</button>
<button class="topbar-btn topbar-profile-btn" id="topbarProfileBtn">
@@ -57,7 +57,7 @@
document.body.insertAdjacentHTML('beforeend', `
<div class="topbar-panel" id="topbarMsgPanel">
<div class="topbar-panel-header">
<span>${IC('MESSAGES')} Nachrichten</span>
<span><img src="/img/icons/envelope.png" style="width:1rem;height:1rem;object-fit:contain;vertical-align:middle;margin-right:0.3rem;" alt=""> Nachrichten</span>
<button class="topbar-panel-close" onclick="window.__topbarCloseAll()">✕</button>
</div>
<div class="topbar-panel-body" id="topbarMsgBody"></div>
@@ -66,7 +66,7 @@
<div class="topbar-panel" id="topbarNotifPanel">
<div class="topbar-panel-header">
<span>${IC('NOTIFICATIONS')} Benachrichtigungen</span>
<span><img src="/img/icons/bell.png" style="width:1rem;height:1rem;object-fit:contain;vertical-align:middle;margin-right:0.3rem;" alt=""> Benachrichtigungen</span>
<button class="topbar-panel-close" onclick="window.__topbarCloseAll()">✕</button>
</div>
<div class="topbar-panel-body" id="topbarNotifBody"></div>
@@ -75,7 +75,7 @@
<div class="topbar-panel" id="topbarInvPanel">
<div class="topbar-panel-header">
<span>${IC('INVITATIONS')} Einladungen</span>
<span><img src="/img/icons/stars.png" style="width:1rem;height:1rem;object-fit:contain;vertical-align:middle;margin-right:0.3rem;" alt=""> Einladungen</span>
<button class="topbar-panel-close" onclick="window.__topbarCloseAll()">✕</button>
</div>
<div class="topbar-panel-body" id="topbarInvBody"></div>