-
-
-
{t('stats.activeProducts')}
+
+
+
{t('stats.activeProducts')}
-
+
-
-
-
{t('stats.expiryRate')}
+
+
+ {t('stats.expiryRate')}
-
+
{t('stats.ofArchived')}
@@ -126,18 +126,18 @@ export function Statistics() {
{[
- { label: t('stats.expired'), count: expiryDist.expired, color: 'bg-red-500' },
- { label: t('stats.critical'), count: expiryDist.critical, color: 'bg-red-400' },
- { label: t('stats.warning'), count: expiryDist.warning, color: 'bg-orange-400' },
- { label: t('stats.soon'), count: expiryDist.soon, color: 'bg-yellow-400' },
- { label: t('stats.ok'), count: expiryDist.good, color: 'bg-green-500' },
+ { label: t('stats.expired'), count: expiryDist.expired, color: 'bg-[color:var(--pt-crit)]' },
+ { label: t('stats.critical'), count: expiryDist.critical, color: 'bg-[color:var(--pt-crit)]' },
+ { label: t('stats.warning'), count: expiryDist.warning, color: 'bg-[color:var(--pt-warn)]' },
+ { label: t('stats.soon'), count: expiryDist.soon, color: 'bg-[color:var(--pt-warn)]' },
+ { label: t('stats.ok'), count: expiryDist.good, color: 'bg-[color:var(--pt-ok)]' },
].map(({ label, count, color }) => {
const pct = Math.round((count / totalForDist) * 100);
return (
{label}
- {count} · {pct}%
+ {count} · {pct}%
{label}
- {count}
+ {count}
))}
@@ -180,10 +180,10 @@ export function Statistics() {
{name}
- {count}
+ {count}
))}
@@ -210,7 +210,7 @@ export function Statistics() {
{count}x
diff --git a/src/generated/release-notes.json b/src/generated/release-notes.json
index 491b27d..f970fa8 100644
--- a/src/generated/release-notes.json
+++ b/src/generated/release-notes.json
@@ -1,11 +1,15 @@
{
"version": "2.0.17",
- "generatedAt": "2026-06-15T22:01:50.824Z",
- "sinceTag": null,
+ "generatedAt": "2026-08-24T12:17:10.656Z",
+ "sinceTag": "v2.0.17",
"items": [
{
- "message": "All bugs fixed",
- "sha": "413aeb4"
+ "message": "wip(ui): Gestaltungsgrundlage Lagerlogbuch (Web, geparkt)",
+ "sha": "31030d3"
+ },
+ {
+ "message": "fix(ui): Touch-Ziele auf 44px und Ausrichtung bei 412px",
+ "sha": "ed1358d"
}
]
}
diff --git a/src/i18n/locales/ar/translation.json b/src/i18n/locales/ar/translation.json
index 9021a03..6557279 100644
--- a/src/i18n/locales/ar/translation.json
+++ b/src/i18n/locales/ar/translation.json
@@ -52,7 +52,7 @@
"confirmDelete": "هل تريد الحذف فعلاً؟ لا يمكن التراجع.",
"deleteBtn": "حذف",
"cancel": "إلغاء",
- "noFilterResults": "لا توجد نتائج لهذه الفلاتر.",
+ "noFilterResults": "لا توجد نتائج — عدّل البحث أو عوامل التصفية.",
"archiveEmpty": "الأرشيف فارغ.",
"noProducts": "لم يتم تسجيل أي منتجات بعد.",
"lowStockWarning": "مخزون منخفض (الحد الأدنى: {{min}})",
diff --git a/src/i18n/locales/de/translation.json b/src/i18n/locales/de/translation.json
index a5d4133..d3863a7 100644
--- a/src/i18n/locales/de/translation.json
+++ b/src/i18n/locales/de/translation.json
@@ -52,7 +52,7 @@
"confirmDelete": "Wirklich löschen? Nicht rückgängig machbar.",
"deleteBtn": "Löschen",
"cancel": "Abbrechen",
- "noFilterResults": "Kein Treffer für diese Filter.",
+ "noFilterResults": "Nichts gefunden — Suche oder Filter anpassen.",
"archiveEmpty": "Archiv ist leer.",
"noProducts": "Noch keine Produkte erfasst.",
"lowStockWarning": "Unterbestand (Min: {{min}})",
diff --git a/src/i18n/locales/en/translation.json b/src/i18n/locales/en/translation.json
index ed3f0d7..b20ec51 100644
--- a/src/i18n/locales/en/translation.json
+++ b/src/i18n/locales/en/translation.json
@@ -52,7 +52,7 @@
"confirmDelete": "Really delete? This cannot be undone.",
"deleteBtn": "Delete",
"cancel": "Cancel",
- "noFilterResults": "No results for these filters.",
+ "noFilterResults": "Nothing found — adjust your search or filters.",
"archiveEmpty": "Archive is empty.",
"noProducts": "No products added yet.",
"lowStockWarning": "Low stock (Min: {{min}})",
diff --git a/src/i18n/locales/fr/translation.json b/src/i18n/locales/fr/translation.json
index dbb7016..6ff5d23 100644
--- a/src/i18n/locales/fr/translation.json
+++ b/src/i18n/locales/fr/translation.json
@@ -52,7 +52,7 @@
"confirmDelete": "Vraiment supprimer ? Cette action est irréversible.",
"deleteBtn": "Supprimer",
"cancel": "Annuler",
- "noFilterResults": "Aucun résultat pour ces filtres.",
+ "noFilterResults": "Aucun résultat — ajustez la recherche ou les filtres.",
"archiveEmpty": "Les archives sont vides.",
"noProducts": "Aucun produit ajouté encore.",
"lowStockWarning": "Stock faible (Min : {{min}})",
diff --git a/src/i18n/locales/it/translation.json b/src/i18n/locales/it/translation.json
index cb55f89..fbf42d3 100644
--- a/src/i18n/locales/it/translation.json
+++ b/src/i18n/locales/it/translation.json
@@ -52,7 +52,7 @@
"confirmDelete": "Eliminare davvero? Non si può annullare.",
"deleteBtn": "Elimina",
"cancel": "Annulla",
- "noFilterResults": "Nessun risultato per questi filtri.",
+ "noFilterResults": "Nessun risultato — modifica la ricerca o i filtri.",
"archiveEmpty": "L'archivio è vuoto.",
"noProducts": "Nessun prodotto aggiunto ancora.",
"lowStockWarning": "Scorte basse (Min: {{min}})",
diff --git a/src/i18n/locales/pt/translation.json b/src/i18n/locales/pt/translation.json
index 2b3b24f..e30895e 100644
--- a/src/i18n/locales/pt/translation.json
+++ b/src/i18n/locales/pt/translation.json
@@ -52,7 +52,7 @@
"confirmDelete": "Realmente excluir? Não pode ser desfeito.",
"deleteBtn": "Excluir",
"cancel": "Cancelar",
- "noFilterResults": "Nenhum resultado para estes filtros.",
+ "noFilterResults": "Nada encontrado — ajusta a pesquisa ou os filtros.",
"archiveEmpty": "Arquivo vazio.",
"noProducts": "Nenhum produto cadastrado.",
"lowStockWarning": "Estoque baixo (Mín: {{min}})",
diff --git a/src/index.css b/src/index.css
index 37cc1dd..56d6404 100644
--- a/src/index.css
+++ b/src/index.css
@@ -58,6 +58,50 @@
}
}
+/* ===== Gestaltungs-Grundlagen "Lagerlogbuch" =====
+ Akzent = Messing/Khaki (Konservendeckel) fuer Beschriftungen und Struktur,
+ Rot/Orange/Gruen bleiben ausschliesslich Statusfarben.
+ Zahlen und Datumsangaben laufen in JetBrains Mono wie auf einem Inventarblatt. */
+:root {
+ --pt-accent: #d1bf84;
+ --pt-accent-soft: rgba(209, 191, 132, 0.14);
+ --pt-crit: #f26d5b;
+ --pt-warn: #e8763a;
+ --pt-ok: #4ade80;
+}
+
+html:not(.dark) {
+ --pt-accent: #6e6330;
+ --pt-accent-soft: rgba(110, 99, 48, 0.1);
+}
+
+@layer components {
+ /* Kleine Versalien-Beschriftung ueber Abschnitten und Kennzahlen */
+ .eyebrow {
+ font-family: 'Bebas Neue', sans-serif;
+ text-transform: uppercase;
+ letter-spacing: 0.16em;
+ font-size: 0.8125rem;
+ line-height: 1;
+ color: var(--pt-accent);
+ }
+
+ /* Seitentitel und Kachel-Ueberschriften */
+ .title-display {
+ font-family: 'Bebas Neue', sans-serif;
+ text-transform: uppercase;
+ letter-spacing: 0.05em;
+ line-height: 1.1; /* Umlaut-Punkte (Ä/Ö/Ü) brauchen Luft nach oben */
+ }
+
+ /* Alle Zahlen, Mengen, Datumsangaben */
+ .num {
+ font-family: 'JetBrains Mono', monospace;
+ font-variant-numeric: tabular-nums;
+ letter-spacing: -0.02em;
+ }
+}
+
@layer utilities {
.no-scrollbar::-webkit-scrollbar {
display: none;
diff --git a/tailwind.config.ts b/tailwind.config.ts
index 5b03650..c123ca4 100644
--- a/tailwind.config.ts
+++ b/tailwind.config.ts
@@ -13,10 +13,10 @@ export default {
300: '#6ca688',
400: '#4d936f',
500: '#2e8056',
- 600: '#27744c',
- 700: '#1e6540',
- 800: '#1a3a2a',
- 900: '#0f1f17',
+ 600: '#33493b',
+ 700: '#26382d',
+ 800: '#141f19',
+ 900: '#0b110e',
},
olive: {
100: '#e8e4d0',