Design-System Sprint A: utilities.css + 948 Inline-Styles → Utility-Klassen, SW by-v1102
PHASE 1 — Sofort-Cleanup ohne Risiko: - Neue Datei utilities.css mit ~25 Klassen für häufige Kombinationen: * text-xs-muted, text-xs-secondary, text-sm-muted, text-sm-secondary * flex-gap-2/3, flex-col-gap-2/3/4, flex-center-gap-1/2/3 * flex-between, flex-1-min, mb-1/3, mt-1/3 * icon-xs/sm/md/lg, label-block, caption - index.html bindet utilities.css ein - mb-3/mt-3 ergänzt (waren in design-system.css unvollständig) PHASE 2 — .by-tab Modifier für Vereinheitlichung: - .by-tabs.grid (mit --tab-cols Variable für Admin/Health/etc.) - .by-tabs.sticky (Desktop vertikale Tabs für Admin) - .by-tabs.wrap (Zuchthunde, flex-wrap statt scroll) - .by-tabs.separated (Sitting, mit eigenem Hintergrund + Border) PHASE 3 — Inline-Style → Klassen-Migration (Python-Script): - 948 Inline-Styles entfernt (5101 → 4153, -18%) - 962 Migrationen über 47 Page-Dateien - Top-Treffer: admin.js (180), health.js (67), dog-profile.js (67), litters.js (62), settings.js (61), zuchthunde.js (51) - Patterns: text-muted, text-secondary, text-danger, text-xs-muted, text-sm-muted, grid-2 (Duplikat-Bug behoben!), flex-col-gap-3, p-3/4, mb-2/3/4, hidden, w-full, flex-1, ... - Bewahrt bestehende class-Attribute (mergt korrekt) Alle 19 Tests grün. Kein visueller Diff erwartet (gleiche Property-Werte).
This commit is contained in:
parent
279f76714e
commit
459cd425f2
54 changed files with 1809 additions and 956 deletions
|
|
@ -101,22 +101,22 @@ window.Page_dog_profile = (() => {
|
|||
: `<p style="margin:0 0 var(--space-2)"></p>`}
|
||||
|
||||
<!-- Rassen-Community-Chip (wird async geladen) -->
|
||||
<div id="dp-same-breed-chip" style="margin-bottom:var(--space-4)"></div>
|
||||
<div id="dp-same-breed-chip" class="mb-4"></div>
|
||||
|
||||
<!-- Info-Grid -->
|
||||
<div style="display:grid;grid-template-columns:1fr 1fr;gap:var(--space-3);
|
||||
margin-bottom:var(--space-5);text-align:left">
|
||||
${geburtstag ? `
|
||||
<div class="card" style="padding:var(--space-3)">
|
||||
<div class="card p-3">
|
||||
<div class="dp-info-label"><svg class="ph-icon" aria-hidden="true"><use href="/icons/phosphor.svg#calendar-dots"></use></svg> Geburtstag</div>
|
||||
<div style="font-weight:500;font-size:var(--text-sm)">${geburtstag}</div>
|
||||
<div style="font-size:var(--text-xs);color:var(--c-text-secondary)">
|
||||
<div class="text-xs-secondary">
|
||||
${_calcAlter(dog.geburtstag)}
|
||||
</div>
|
||||
</div>
|
||||
` : ''}
|
||||
${dog.geschlecht ? `
|
||||
<div class="card" style="padding:var(--space-3)">
|
||||
<div class="card p-3">
|
||||
<div class="dp-info-label">${dog.geschlecht === 'm' ? '<svg class="ph-icon" aria-hidden="true"><use href="/icons/phosphor.svg#gender-male"></use></svg>' : '<svg class="ph-icon" aria-hidden="true"><use href="/icons/phosphor.svg#gender-female"></use></svg>'} Geschlecht</div>
|
||||
<div style="font-weight:500;font-size:var(--text-sm)">
|
||||
${dog.geschlecht === 'm' ? 'Rüde' : 'Hündin'}
|
||||
|
|
@ -130,19 +130,19 @@ window.Page_dog_profile = (() => {
|
|||
</div>
|
||||
` : ''}
|
||||
${dog.widerrist_cm ? `
|
||||
<div class="card" style="padding:var(--space-3)">
|
||||
<div class="card p-3">
|
||||
<div class="dp-info-label"><svg class="ph-icon" aria-hidden="true"><use href="/icons/phosphor.svg#ruler"></use></svg> Widerrist</div>
|
||||
<div style="font-weight:500;font-size:var(--text-sm)">${dog.widerrist_cm} cm</div>
|
||||
</div>
|
||||
` : ''}
|
||||
<div class="card" style="padding:var(--space-3)">
|
||||
<div class="card p-3">
|
||||
<div style="font-size:var(--text-xs);color:var(--c-text-secondary);
|
||||
margin-bottom:2px">
|
||||
<svg class="ph-icon" aria-hidden="true"><use href="/icons/phosphor.svg#wave-sine"></use></svg> Transponder
|
||||
</div>
|
||||
${dog.chip_nr
|
||||
? `<div style="font-size:var(--text-xs);font-weight:500;word-break:break-all">${_esc(dog.chip_nr)}</div>`
|
||||
: `<div style="font-size:var(--text-xs);color:var(--c-text-muted)">nicht eingetragen
|
||||
: `<div class="text-xs-muted">nicht eingetragen
|
||||
<button class="btn btn-link btn-sm" id="dp-chip-edit-btn"
|
||||
style="padding:0 0 0 var(--space-1);font-size:var(--text-xs)">Eintragen</button>
|
||||
</div>`
|
||||
|
|
@ -230,12 +230,12 @@ window.Page_dog_profile = (() => {
|
|||
<div class="card" style="margin-bottom:var(--space-5)">
|
||||
<div style="padding:var(--space-4);border-bottom:1px solid var(--c-border)">
|
||||
<div style="font-weight:600">Sitter-Zugang</div>
|
||||
<div style="font-size:var(--text-xs);color:var(--c-text-secondary)">
|
||||
<div class="text-xs-secondary">
|
||||
Gib einem Freund temporären Schreibzugang für diesen Hund.
|
||||
Deine bestehenden Daten und Medien bleiben unsichtbar und privat — der Sitter kann nur neue Einträge anlegen.
|
||||
</div>
|
||||
</div>
|
||||
<div id="dp-sitting-access" style="padding:var(--space-4)">Lade…</div>
|
||||
<div id="dp-sitting-access" class="p-4">Lade…</div>
|
||||
</div>
|
||||
` : ''}
|
||||
`;
|
||||
|
|
@ -340,7 +340,7 @@ window.Page_dog_profile = (() => {
|
|||
};
|
||||
|
||||
const sitztBlock = sitzt.length ? `
|
||||
<div style="margin-bottom:var(--space-3)">
|
||||
<div class="mb-3">
|
||||
<div style="font-size:var(--text-xs);font-weight:var(--weight-semibold);
|
||||
color:var(--c-text-secondary);margin-bottom:var(--space-2);
|
||||
text-transform:uppercase;letter-spacing:.04em">Sitzt</div>
|
||||
|
|
@ -360,7 +360,7 @@ window.Page_dog_profile = (() => {
|
|||
</div>` : '';
|
||||
|
||||
el.innerHTML = `
|
||||
<div class="card" style="padding:var(--space-4)">
|
||||
<div class="card p-4">
|
||||
<div style="display:flex;align-items:center;gap:var(--space-2);margin-bottom:var(--space-3)">
|
||||
<svg class="ph-icon" style="width:16px;height:16px;color:var(--c-primary)" aria-hidden="true">
|
||||
<use href="/icons/phosphor.svg#list-checks"></use>
|
||||
|
|
@ -409,7 +409,7 @@ window.Page_dog_profile = (() => {
|
|||
: '';
|
||||
|
||||
el.innerHTML = `
|
||||
<div class="card" style="padding:var(--space-4)">
|
||||
<div class="card p-4">
|
||||
<div style="display:flex;align-items:center;gap:var(--space-2);margin-bottom:var(--space-3)">
|
||||
<span style="font-size:1.1em">🛁</span>
|
||||
<span style="font-size:var(--text-sm);font-weight:600">
|
||||
|
|
@ -457,7 +457,7 @@ window.Page_dog_profile = (() => {
|
|||
const katTipps = data.tipps.filter(t=>t.kategorie===kat);
|
||||
const katBadge = kat === 'Fell' ? pflegeArtBadge : '';
|
||||
return `
|
||||
<div style="margin-bottom:var(--space-3)">
|
||||
<div class="mb-3">
|
||||
<div style="font-size:11px;font-weight:700;color:var(--c-text-muted);
|
||||
text-transform:uppercase;margin-bottom:8px;display:flex;align-items:center">
|
||||
${kat_icons[kat]||_ph('paw-print')} ${_esc(kat)}${katBadge}</div>
|
||||
|
|
@ -528,7 +528,7 @@ window.Page_dog_profile = (() => {
|
|||
<svg class="ph-icon" aria-hidden="true"><use href="/icons/phosphor.svg#user"></use></svg>
|
||||
<div style="flex:1;font-size:var(--text-sm)">
|
||||
<strong>${_esc(s.sitter_name)}</strong>
|
||||
<span style="color:var(--c-text-muted)"> · bis ${_esc(s.valid_until)}</span>
|
||||
<span class="text-muted"> · bis ${_esc(s.valid_until)}</span>
|
||||
</div>
|
||||
<button class="btn btn-link btn-sm sa-revoke-btn" data-sub-id="${s.id}"
|
||||
style="color:var(--c-danger);padding:0">
|
||||
|
|
@ -547,26 +547,26 @@ window.Page_dog_profile = (() => {
|
|||
wrap.innerHTML = `
|
||||
${activeHtml}
|
||||
${friends.length ? `
|
||||
<div style="margin-top:var(--space-3)">
|
||||
<div class="mt-3">
|
||||
<div style="font-size:var(--text-xs);color:var(--c-text-muted);
|
||||
margin-bottom:var(--space-2);font-weight:600">Zugang gewähren</div>
|
||||
<div style="display:grid;grid-template-columns:1fr auto;gap:var(--space-2);
|
||||
align-items:end">
|
||||
<div class="form-group" style="margin:0">
|
||||
<label class="form-label" style="font-size:var(--text-xs)">Freund</label>
|
||||
<label class="form-label text-xs">Freund</label>
|
||||
<select class="form-control form-control-sm" id="sa-friend-select">
|
||||
<option value="">Freund wählen…</option>
|
||||
${friendOptions}
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-group" style="margin:0">
|
||||
<label class="form-label" style="font-size:var(--text-xs)">Gültig bis</label>
|
||||
<label class="form-label text-xs">Gültig bis</label>
|
||||
<input class="form-control form-control-sm" type="date" id="sa-until-input"
|
||||
value="${defaultUntil}" min="${today}">
|
||||
</div>
|
||||
</div>
|
||||
<button class="btn btn-primary btn-sm w-full" id="sa-grant-btn"
|
||||
style="margin-top:var(--space-2)">
|
||||
class="mt-2">
|
||||
Zugang gewähren
|
||||
</button>
|
||||
</div>
|
||||
|
|
@ -621,7 +621,7 @@ window.Page_dog_profile = (() => {
|
|||
</div>`,
|
||||
footer: `
|
||||
<div class="w3-btn-stack">
|
||||
<button class="btn btn-primary" id="chip-edit-save-btn" style="width:100%">Speichern</button>
|
||||
<button class="btn btn-primary" id="chip-edit-save-btn" class="w-full">Speichern</button>
|
||||
<button class="btn btn-secondary" onclick="UI.modal.close()">Abbrechen</button>
|
||||
</div>`,
|
||||
});
|
||||
|
|
@ -666,20 +666,20 @@ window.Page_dog_profile = (() => {
|
|||
<div class="photo-editor-controls">
|
||||
<label class="form-label">Zoom</label>
|
||||
<input type="range" id="pe-zoom" min="1" max="3" step="0.05" value="${zoom}"
|
||||
style="width:100%">
|
||||
class="w-full">
|
||||
</div>
|
||||
` : ''}
|
||||
<label class="btn btn-secondary" style="cursor:pointer">
|
||||
${UI.icon('upload-simple')} Neues Foto wählen
|
||||
<input type="file" id="pe-file-input" accept="image/*" style="display:none">
|
||||
<input type="file" id="pe-file-input" accept="image/*" class="hidden">
|
||||
</label>
|
||||
</div>
|
||||
`;
|
||||
|
||||
const footer = `
|
||||
<div class="w3-btn-stack">
|
||||
${hasPhoto ? `<button class="btn btn-primary" id="pe-save-btn" style="width:100%">Speichern</button>` : ''}
|
||||
<div style="display:flex;gap:var(--space-2)">
|
||||
${hasPhoto ? `<button class="btn btn-primary" id="pe-save-btn" class="w-full">Speichern</button>` : ''}
|
||||
<div class="flex-gap-2">
|
||||
${hasPhoto ? `<button class="btn btn-danger" id="pe-delete-btn">${UI.icon('trash')} Löschen</button>` : ''}
|
||||
<button class="btn btn-secondary flex-1" onclick="UI.modal.close()">Abbrechen</button>
|
||||
</div>
|
||||
|
|
@ -860,7 +860,7 @@ window.Page_dog_profile = (() => {
|
|||
|
||||
<!-- Owner + QR -->
|
||||
<div style="display:flex;align-items:flex-end;justify-content:space-between;gap:12px">
|
||||
<div style="flex:1;min-width:0">
|
||||
<div class="flex-1-min">
|
||||
${ownerName ? `<div style="font-size:0.7rem;color:rgba(255,255,255,0.4);text-transform:uppercase;letter-spacing:.06em;margin-bottom:4px">Besitzer</div>
|
||||
<div style="font-size:0.9rem;font-weight:600;color:rgba(255,255,255,0.85)">${_esc(ownerName)}</div>` : ''}
|
||||
<div style="font-size:0.65rem;color:rgba(255,255,255,0.35);margin-top:8px">banyaro.app</div>
|
||||
|
|
@ -878,7 +878,7 @@ window.Page_dog_profile = (() => {
|
|||
UI.modal.open({
|
||||
title: 'Visitenkarte',
|
||||
body: `
|
||||
<div style="margin-bottom:var(--space-4)">${cardHtml}</div>
|
||||
<div class="mb-4">${cardHtml}</div>
|
||||
<p style="font-size:var(--text-xs);color:var(--c-text-secondary);text-align:center;margin-bottom:0">
|
||||
QR-Code auf NFC-Tag oder Anhänger kleben — jeder kann das Profil von ${_esc(dog.name)} sofort öffnen.
|
||||
</p>
|
||||
|
|
@ -952,7 +952,7 @@ window.Page_dog_profile = (() => {
|
|||
<label class="form-label">Einladungslink</label>
|
||||
<div style="display:flex;gap:var(--space-2);align-items:center">
|
||||
<input class="form-control" id="share-link-input" type="text" readonly
|
||||
style="font-size:var(--text-xs)">
|
||||
class="text-xs">
|
||||
<button class="btn btn-secondary btn-sm" id="share-link-copy">
|
||||
<svg class="ph-icon" aria-hidden="true"><use href="/icons/phosphor.svg#clipboard-text"></use></svg>
|
||||
</button>
|
||||
|
|
@ -961,7 +961,7 @@ window.Page_dog_profile = (() => {
|
|||
Dieser Link kann einmalig angenommen werden.
|
||||
</p>
|
||||
</div>
|
||||
<div id="share-list-wrap" style="margin-top:var(--space-4)"></div>`,
|
||||
<div id="share-list-wrap" class="mt-4"></div>`,
|
||||
footer: `
|
||||
<button class="btn btn-secondary" onclick="UI.modal.close()">Schließen</button>
|
||||
<button class="btn btn-primary" id="share-create-btn">Link erstellen</button>`,
|
||||
|
|
@ -1010,7 +1010,7 @@ window.Page_dog_profile = (() => {
|
|||
<div style="flex:1;font-size:var(--text-sm)">
|
||||
${s.shared_with_name
|
||||
? `<strong>${_esc(s.shared_with_name)}</strong> · ${s.role}`
|
||||
: `<em style="color:var(--c-text-muted)">Ausstehend</em> · ${s.role}`}
|
||||
: `<em class="text-muted">Ausstehend</em> · ${s.role}`}
|
||||
</div>
|
||||
<button class="btn btn-link btn-sm share-revoke-btn" data-share-id="${s.id}"
|
||||
style="color:var(--c-danger);padding:0">
|
||||
|
|
@ -1056,7 +1056,7 @@ window.Page_dog_profile = (() => {
|
|||
body: _formHTML(null, true),
|
||||
footer: `
|
||||
<div class="w3-btn-stack">
|
||||
<button type="submit" form="dp-form" class="btn btn-primary" style="width:100%">${UI.icon('dog')} Hund anlegen</button>
|
||||
<button type="submit" form="dp-form" class="btn btn-primary w-full">${UI.icon('dog')} Hund anlegen</button>
|
||||
<button type="button" class="btn btn-secondary" id="dp-form-cancel">Abbrechen</button>
|
||||
</div>
|
||||
`,
|
||||
|
|
@ -1073,8 +1073,8 @@ window.Page_dog_profile = (() => {
|
|||
body: _formHTML(dog, true),
|
||||
footer: `
|
||||
<div class="w3-btn-stack">
|
||||
<button type="submit" form="dp-form" class="btn btn-primary" style="width:100%">Speichern</button>
|
||||
<div style="display:flex;gap:var(--space-2)">
|
||||
<button type="submit" form="dp-form" class="btn btn-primary w-full">Speichern</button>
|
||||
<div class="flex-gap-2">
|
||||
<button type="button" class="btn btn-danger" id="dp-delete-btn">Löschen</button>
|
||||
<button type="button" id="dp-gedenken-btn"
|
||||
style="flex:1;padding:var(--space-2) var(--space-3);border-radius:var(--radius-md);
|
||||
|
|
@ -1108,7 +1108,7 @@ window.Page_dog_profile = (() => {
|
|||
<div class="form-group">
|
||||
<label class="form-label">
|
||||
Rasse
|
||||
<span style="color:var(--c-text-secondary)">(optional)</span>
|
||||
<span class="text-secondary">(optional)</span>
|
||||
${UI.help('Verknüpfe deine Rasse mit unserem Wiki für personalisierte Pflegetipps.')}
|
||||
</label>
|
||||
<input class="form-control" type="text" name="rasse"
|
||||
|
|
@ -1126,7 +1126,7 @@ window.Page_dog_profile = (() => {
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<div style="display:grid;grid-template-columns:1fr 1fr;gap:var(--space-3)">
|
||||
<div class="grid-2">
|
||||
<div class="form-group">
|
||||
<label class="form-label">Geburtstag</label>
|
||||
<input class="form-control" type="date" name="geburtstag"
|
||||
|
|
@ -1142,7 +1142,7 @@ window.Page_dog_profile = (() => {
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<div style="display:grid;grid-template-columns:1fr 1fr;gap:var(--space-3)">
|
||||
<div class="grid-2">
|
||||
<div class="form-group">
|
||||
<label class="form-label">Gewicht (kg)</label>
|
||||
<input class="form-control" type="number" name="gewicht_kg"
|
||||
|
|
@ -1160,7 +1160,7 @@ window.Page_dog_profile = (() => {
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<div style="display:grid;grid-template-columns:1fr 1fr;gap:var(--space-3)">
|
||||
<div class="grid-2">
|
||||
<div class="form-group">
|
||||
<label class="form-label">
|
||||
Chip-Nummer
|
||||
|
|
@ -1175,7 +1175,7 @@ window.Page_dog_profile = (() => {
|
|||
<div class="form-group">
|
||||
<label class="form-label">
|
||||
Felltyp
|
||||
<span style="color:var(--c-text-secondary)">(optional)</span>
|
||||
<span class="text-secondary">(optional)</span>
|
||||
${UI.help('Der Felltyp wird für personalisierte Wetter-Hinweise genutzt.')}
|
||||
</label>
|
||||
<select class="form-control" name="fell_typ">
|
||||
|
|
@ -1192,7 +1192,7 @@ window.Page_dog_profile = (() => {
|
|||
<div class="form-group">
|
||||
<label class="form-label">
|
||||
Bio / Steckbrief
|
||||
<span style="color:var(--c-text-secondary)">(optional)</span>
|
||||
<span class="text-secondary">(optional)</span>
|
||||
</label>
|
||||
<textarea class="form-control" name="bio" rows="2"
|
||||
placeholder="Kurze Beschreibung…">${_esc(dog?.bio || '')}</textarea>
|
||||
|
|
@ -1216,7 +1216,7 @@ window.Page_dog_profile = (() => {
|
|||
display:${dog?.foto_url ? 'block' : 'none'}">
|
||||
<label class="btn btn-secondary btn-sm" style="cursor:pointer;margin:0">
|
||||
<svg class="ph-icon" aria-hidden="true"><use href="/icons/phosphor.svg#camera"></use></svg> Foto auswählen
|
||||
<input type="file" name="foto" accept="image/*" style="display:none"
|
||||
<input type="file" name="foto" accept="image/*" class="hidden"
|
||||
id="dp-form-foto">
|
||||
</label>
|
||||
<button type="button" class="btn btn-secondary btn-sm" id="dp-rasse-erkennen-btn"
|
||||
|
|
@ -1225,7 +1225,7 @@ window.Page_dog_profile = (() => {
|
|||
Rasse erkennen
|
||||
</button>
|
||||
<input type="file" accept="image/jpeg,image/png,image/webp"
|
||||
id="dp-rasse-foto-input" style="display:none">
|
||||
id="dp-rasse-foto-input" class="hidden">
|
||||
</div>
|
||||
<div style="font-size:var(--text-xs);color:var(--c-text-muted);margin-top:4px">
|
||||
Foto hochladen um die Rasse per KI zu erkennen
|
||||
|
|
@ -1473,7 +1473,7 @@ window.Page_dog_profile = (() => {
|
|||
title: 'Kein Hund erkannt',
|
||||
body: `<div style="text-align:center;padding:var(--space-6) var(--space-2)">
|
||||
<div style="font-size:3rem;margin-bottom:var(--space-3)">🐾</div>
|
||||
<p style="color:var(--c-text-secondary)">
|
||||
<p class="text-secondary">
|
||||
Auf diesem Foto konnte kein Hund erkannt werden.<br>
|
||||
Bitte lade ein deutlicheres Foto hoch.
|
||||
</p>
|
||||
|
|
@ -1500,10 +1500,10 @@ window.Page_dog_profile = (() => {
|
|||
${r.beschreibung ? `<div class="rasse-result-desc">${_esc(r.beschreibung)}</div>` : ''}
|
||||
<div style="display:flex;gap:var(--space-2);margin-top:var(--space-3);flex-wrap:wrap">
|
||||
${isTop ? `<button class="btn btn-primary btn-sm" data-action="uebernehmen"
|
||||
data-rasse="${_esc(r.name)}" style="flex:1">
|
||||
data-rasse="${_esc(r.name)}" class="flex-1">
|
||||
Rasse übernehmen
|
||||
</button>` : `<button class="btn btn-secondary btn-sm" data-action="uebernehmen"
|
||||
data-rasse="${_esc(r.name)}" style="flex:1">
|
||||
data-rasse="${_esc(r.name)}" class="flex-1">
|
||||
Diese wählen
|
||||
</button>`}
|
||||
${r.wiki_slug ? `<button class="btn btn-ghost btn-sm" data-action="wiki"
|
||||
|
|
@ -1636,7 +1636,7 @@ window.Page_dog_profile = (() => {
|
|||
try {
|
||||
data = await API.get(`/passport/${dog.id}`);
|
||||
} catch (e) {
|
||||
wrap.innerHTML = `<p style="color:var(--c-danger)">Fehler beim Laden: ${_esc(e.message)}</p>`;
|
||||
wrap.innerHTML = `<p class="text-danger">Fehler beim Laden: ${_esc(e.message)}</p>`;
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -1666,24 +1666,24 @@ window.Page_dog_profile = (() => {
|
|||
Bearbeiten
|
||||
</button>
|
||||
</div>
|
||||
<div style="display:grid;grid-template-columns:1fr 1fr;gap:var(--space-3)">
|
||||
<div class="grid-2">
|
||||
<div>
|
||||
<div style="font-size:var(--text-xs);color:var(--c-text-secondary)">Blutgruppe</div>
|
||||
<div class="text-xs-secondary">Blutgruppe</div>
|
||||
<div id="pp-meta-blutgruppe" style="font-size:var(--text-sm);font-weight:500">
|
||||
${_esc(meta.blutgruppe) || '<span style="color:var(--c-text-muted)">nicht eingetragen</span>'}
|
||||
${_esc(meta.blutgruppe) || '<span class="text-muted">nicht eingetragen</span>'}
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<div style="font-size:var(--text-xs);color:var(--c-text-secondary)">Allergien</div>
|
||||
<div id="pp-meta-allergien" style="font-size:var(--text-sm)">
|
||||
${_esc(meta.allergien) || '<span style="color:var(--c-text-muted)">keine</span>'}
|
||||
<div class="text-xs-secondary">Allergien</div>
|
||||
<div id="pp-meta-allergien" class="text-sm">
|
||||
${_esc(meta.allergien) || '<span class="text-muted">keine</span>'}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
${meta.besonderheiten ? `
|
||||
<div style="margin-top:var(--space-3)">
|
||||
<div style="font-size:var(--text-xs);color:var(--c-text-secondary)">Besonderheiten</div>
|
||||
<div id="pp-meta-besonderheiten" style="font-size:var(--text-sm)">
|
||||
<div class="mt-3">
|
||||
<div class="text-xs-secondary">Besonderheiten</div>
|
||||
<div id="pp-meta-besonderheiten" class="text-sm">
|
||||
${_esc(meta.besonderheiten)}
|
||||
</div>
|
||||
</div>` : ''}
|
||||
|
|
@ -1708,7 +1708,7 @@ window.Page_dog_profile = (() => {
|
|||
: vaccs.map(v => `
|
||||
<div class="pp-vacc-row" data-id="${v.id}"
|
||||
class="pp-data-row">
|
||||
<div style="flex:1">
|
||||
<div class="flex-1">
|
||||
<div style="font-weight:600;font-size:var(--text-sm)">${_esc(v.krankheit)}</div>
|
||||
<div style="font-size:var(--text-xs);color:var(--c-text-secondary);margin-top:2px">
|
||||
Gegeben: ${_fmt(v.datum)}
|
||||
|
|
@ -1727,7 +1727,7 @@ window.Page_dog_profile = (() => {
|
|||
</div>
|
||||
|
||||
<!-- Medikamente -->
|
||||
<div class="card" style="padding:var(--space-4)">
|
||||
<div class="card p-4">
|
||||
<div style="display:flex;align-items:center;justify-content:space-between;
|
||||
margin-bottom:var(--space-3)">
|
||||
<span style="font-weight:700;font-size:var(--text-sm)">
|
||||
|
|
@ -1745,7 +1745,7 @@ window.Page_dog_profile = (() => {
|
|||
: meds.map(m => `
|
||||
<div class="pp-med-row" data-id="${m.id}"
|
||||
class="pp-data-row">
|
||||
<div style="flex:1">
|
||||
<div class="flex-1">
|
||||
<div style="font-weight:600;font-size:var(--text-sm)">${_esc(m.name)}</div>
|
||||
<div style="font-size:var(--text-xs);color:var(--c-text-secondary);margin-top:2px">
|
||||
${m.dosierung ? `${_esc(m.dosierung)} · ` : ''}
|
||||
|
|
@ -1871,7 +1871,7 @@ window.Page_dog_profile = (() => {
|
|||
<option value="DHPP (Kombi)">
|
||||
</datalist>
|
||||
</div>
|
||||
<div style="display:grid;grid-template-columns:1fr 1fr;gap:var(--space-3)">
|
||||
<div class="grid-2">
|
||||
<div class="form-group">
|
||||
<label class="form-label">Datum *</label>
|
||||
<input id="pp-vacc-datum" class="form-control" type="date" value="${today}">
|
||||
|
|
@ -1938,13 +1938,13 @@ window.Page_dog_profile = (() => {
|
|||
<input id="pp-med-dosierung" class="form-control" type="text"
|
||||
placeholder="z. B. 1× täglich, 5 mg">
|
||||
</div>
|
||||
<div style="display:grid;grid-template-columns:1fr 1fr;gap:var(--space-3)">
|
||||
<div class="grid-2">
|
||||
<div class="form-group">
|
||||
<label class="form-label">Von</label>
|
||||
<input id="pp-med-von" class="form-control" type="date" value="${today}">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="form-label">Bis <span style="color:var(--c-text-muted)">(leer = dauerhaft)</span></label>
|
||||
<label class="form-label">Bis <span class="text-muted">(leer = dauerhaft)</span></label>
|
||||
<input id="pp-med-bis" class="form-control" type="date">
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -2001,7 +2001,7 @@ window.Page_dog_profile = (() => {
|
|||
</p>
|
||||
<div style="display:flex;gap:var(--space-2);align-items:center">
|
||||
<input id="pp-sharelink-input" class="form-control" type="text" readonly
|
||||
value="${_esc(url)}" style="font-size:var(--text-xs)">
|
||||
value="${_esc(url)}" class="text-xs">
|
||||
<button class="btn btn-secondary btn-sm" id="pp-sharelink-copy" style="flex-shrink:0">
|
||||
<svg class="ph-icon" aria-hidden="true"><use href="/icons/phosphor.svg#clipboard-text"></use></svg>
|
||||
</button>
|
||||
|
|
@ -2314,7 +2314,7 @@ window.Page_dog_profile = (() => {
|
|||
data = await API.get(`/dogs/${dog.id}/timeline`);
|
||||
} catch (e) {
|
||||
const b = document.getElementById('dp-timeline-body');
|
||||
if (b) b.innerHTML = `<p style="color:var(--c-danger)">Fehler: ${_esc(e.message)}</p>`;
|
||||
if (b) b.innerHTML = `<p class="text-danger">Fehler: ${_esc(e.message)}</p>`;
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -2498,7 +2498,7 @@ window.Page_dog_profile = (() => {
|
|||
</form>`,
|
||||
footer: `
|
||||
<div class="w3-btn-stack">
|
||||
<button type="submit" form="gedenken-form" id="gedenken-save-btn" class="btn btn-primary" style="width:100%">
|
||||
<button type="submit" form="gedenken-form" id="gedenken-save-btn" class="btn btn-primary w-full">
|
||||
<svg class="ph-icon" aria-hidden="true"><use href="/icons/phosphor.svg#heart"></use></svg>
|
||||
Gedenkseite erstellen
|
||||
</button>
|
||||
|
|
@ -2550,22 +2550,22 @@ window.Page_dog_profile = (() => {
|
|||
${d.km_total ? `<div class="card" style="padding:var(--space-3);text-align:center">
|
||||
<svg class="ph-icon" style="width:20px;height:20px;color:var(--c-primary)" aria-hidden="true"><use href="/icons/phosphor.svg#path"></use></svg>
|
||||
<div style="font-size:var(--text-xl);font-weight:800;color:var(--c-primary)">${d.km_total}</div>
|
||||
<div style="font-size:var(--text-xs);color:var(--c-text-secondary)">km zusammen</div>
|
||||
<div class="text-xs-secondary">km zusammen</div>
|
||||
</div>` : ''}
|
||||
${d.diary_count ? `<div class="card" style="padding:var(--space-3);text-align:center">
|
||||
<svg class="ph-icon" style="width:20px;height:20px;color:var(--c-primary)" aria-hidden="true"><use href="/icons/phosphor.svg#book-open"></use></svg>
|
||||
<div style="font-size:var(--text-xl);font-weight:800;color:var(--c-primary)">${d.diary_count}</div>
|
||||
<div style="font-size:var(--text-xs);color:var(--c-text-secondary)">Tagebucheinträge</div>
|
||||
<div class="text-xs-secondary">Tagebucheinträge</div>
|
||||
</div>` : ''}
|
||||
${d.media_count ? `<div class="card" style="padding:var(--space-3);text-align:center">
|
||||
<svg class="ph-icon" style="width:20px;height:20px;color:var(--c-primary)" aria-hidden="true"><use href="/icons/phosphor.svg#images"></use></svg>
|
||||
<div style="font-size:var(--text-xl);font-weight:800;color:var(--c-primary)">${d.media_count}</div>
|
||||
<div style="font-size:var(--text-xs);color:var(--c-text-secondary)">Fotos</div>
|
||||
<div class="text-xs-secondary">Fotos</div>
|
||||
</div>` : ''}
|
||||
${d.gemeinsam_tage ? `<div class="card" style="padding:var(--space-3);text-align:center">
|
||||
<svg class="ph-icon" style="width:20px;height:20px;color:var(--c-primary)" aria-hidden="true"><use href="/icons/phosphor.svg#calendar-heart"></use></svg>
|
||||
<div style="font-size:var(--text-xl);font-weight:800;color:var(--c-primary)">${d.gemeinsam_tage}</div>
|
||||
<div style="font-size:var(--text-xs);color:var(--c-text-secondary)">gemeinsame Tage</div>
|
||||
<div class="text-xs-secondary">gemeinsame Tage</div>
|
||||
</div>` : ''}
|
||||
</div>`;
|
||||
|
||||
|
|
@ -2596,8 +2596,8 @@ window.Page_dog_profile = (() => {
|
|||
Professionelle Hilfe bei Tiertrauer: <strong>Tiertrauer-Hotline 0800 111 0 111</strong> (kostenlos)
|
||||
</div>
|
||||
</div>
|
||||
<div id="gedenk-ki-wrap" style="margin-top:var(--space-4)">
|
||||
<button id="gedenk-ki-btn" class="btn btn-secondary" style="width:100%">
|
||||
<div id="gedenk-ki-wrap" class="mt-4">
|
||||
<button id="gedenk-ki-btn" class="btn btn-secondary w-full">
|
||||
<svg class="ph-icon" aria-hidden="true"><use href="/icons/phosphor.svg#sparkle"></use></svg>
|
||||
Persönlichen Abschiedstext erstellen
|
||||
</button>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue