fix: iOS/iPad text color — text-gray-900 on all inputs, tables, headings
Alle Eingabefelder, Tabellenzellen und Überschriften ohne explizite Textfarbe wurden mit text-gray-900 versehen. iOS rendert sonst system-default-Farben, die auf weißem Hintergrund kaum lesbar sind. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
+3
-3
@@ -53,7 +53,7 @@ export default function MainClient({ kuerzel, beoId, beoName, role }: Props) {
|
|||||||
|
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div className="flex justify-between items-start sm:items-center mb-3 gap-2 print:hidden">
|
<div className="flex justify-between items-start sm:items-center mb-3 gap-2 print:hidden">
|
||||||
<h1 className="text-xl sm:text-2xl font-bold leading-tight">
|
<h1 className="text-xl sm:text-2xl font-bold leading-tight text-gray-900">
|
||||||
<span className="hidden sm:inline">Sternwarte-Welzheim </span>
|
<span className="hidden sm:inline">Sternwarte-Welzheim </span>
|
||||||
Führungsbuch für {activeKuppel}-Kuppel
|
Führungsbuch für {activeKuppel}-Kuppel
|
||||||
</h1>
|
</h1>
|
||||||
@@ -179,7 +179,7 @@ export default function MainClient({ kuerzel, beoId, beoName, role }: Props) {
|
|||||||
{activeTab === 'statistik' && (
|
{activeTab === 'statistik' && (
|
||||||
<div className="border-2 border-gray-400 rounded-xl bg-white p-3 print:border-0 print:rounded-none print:p-0">
|
<div className="border-2 border-gray-400 rounded-xl bg-white p-3 print:border-0 print:rounded-none print:p-0">
|
||||||
<div className="flex justify-between items-center mb-2 print:hidden gap-2">
|
<div className="flex justify-between items-center mb-2 print:hidden gap-2">
|
||||||
<span className="text-sm font-semibold text-gray-600">Statistik (alle Kuppeln)</span>
|
<span className="text-sm font-semibold text-gray-900">Statistik (alle Kuppeln)</span>
|
||||||
<div className="flex items-center gap-2">
|
<div className="flex items-center gap-2">
|
||||||
<button
|
<button
|
||||||
onClick={() => window.print()}
|
onClick={() => window.print()}
|
||||||
@@ -203,7 +203,7 @@ export default function MainClient({ kuerzel, beoId, beoName, role }: Props) {
|
|||||||
{activeTab === 'fahrkosten' && (role?.includes('admin') || role?.includes('master')) && (
|
{activeTab === 'fahrkosten' && (role?.includes('admin') || role?.includes('master')) && (
|
||||||
<div className="border-2 border-gray-400 rounded-xl bg-white p-3 print:border-0 print:rounded-none print:p-0">
|
<div className="border-2 border-gray-400 rounded-xl bg-white p-3 print:border-0 print:rounded-none print:p-0">
|
||||||
<div className="flex justify-between items-center mb-2 print:hidden">
|
<div className="flex justify-between items-center mb-2 print:hidden">
|
||||||
<span className="text-sm font-semibold text-gray-600">Fahrkostenabrechnung</span>
|
<span className="text-sm font-semibold text-gray-900">Fahrkostenabrechnung</span>
|
||||||
<button
|
<button
|
||||||
onClick={() => window.print()}
|
onClick={() => window.print()}
|
||||||
className="text-sm px-3 py-1.5 bg-gray-200 hover:bg-gray-300 text-gray-700 rounded-lg"
|
className="text-sm px-3 py-1.5 bg-gray-200 hover:bg-gray-300 text-gray-700 rounded-lg"
|
||||||
|
|||||||
@@ -35,11 +35,11 @@ export default function Fahrkosten() {
|
|||||||
|
|
||||||
const gesamt = rows ? rows.reduce((s, r) => s + r.Anzahl * SATZ, 0) : 0;
|
const gesamt = rows ? rows.reduce((s, r) => s + r.Anzahl * SATZ, 0) : 0;
|
||||||
|
|
||||||
const thCls = 'px-3 py-2 border border-gray-300 text-xs font-semibold bg-gray-100 text-left whitespace-nowrap';
|
const thCls = 'px-3 py-2 border border-gray-300 text-xs font-semibold bg-gray-100 text-left whitespace-nowrap text-gray-900';
|
||||||
const thNarrowCls = `${thCls} w-16`;
|
const thNarrowCls = `${thCls} w-16`;
|
||||||
const tdCls = 'px-3 py-2 border border-gray-200 text-sm';
|
const tdCls = 'px-3 py-2 border border-gray-200 text-sm text-gray-900';
|
||||||
const tdNarrowCls = `${tdCls} w-16`;
|
const tdNarrowCls = `${tdCls} w-16`;
|
||||||
const tdNumCls = 'px-3 py-2 border border-gray-200 text-sm text-right tabular-nums w-20';
|
const tdNumCls = 'px-3 py-2 border border-gray-200 text-sm text-right tabular-nums w-20 text-gray-900';
|
||||||
|
|
||||||
const abFormatted = new Date(ab + 'T00:00:00').toLocaleDateString('de-DE', {
|
const abFormatted = new Date(ab + 'T00:00:00').toLocaleDateString('de-DE', {
|
||||||
day: '2-digit', month: '2-digit', year: 'numeric',
|
day: '2-digit', month: '2-digit', year: 'numeric',
|
||||||
@@ -53,7 +53,7 @@ export default function Fahrkosten() {
|
|||||||
type="date"
|
type="date"
|
||||||
value={ab}
|
value={ab}
|
||||||
onChange={(e) => setAb(e.target.value)}
|
onChange={(e) => setAb(e.target.value)}
|
||||||
className="px-2 py-1 border-2 border-gray-400 rounded-lg bg-white text-sm focus:border-blue-500 focus:outline-none"
|
className="px-2 py-1 border-2 border-gray-400 rounded-lg bg-white text-gray-900 text-sm focus:border-blue-500 focus:outline-none"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -205,7 +205,7 @@ export default function LogbuchForm({ kuppel, currentUserBeo, editEntry, onSaved
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const inputCls = 'w-full px-2 py-1 border-2 border-gray-400 rounded-lg bg-white text-sm focus:border-blue-500 focus:outline-none';
|
const inputCls = 'w-full px-2 py-1 border-2 border-gray-400 rounded-lg bg-white text-gray-900 text-sm focus:border-blue-500 focus:outline-none';
|
||||||
const labelCls = 'block text-xs font-medium text-gray-700 mb-0.5';
|
const labelCls = 'block text-xs font-medium text-gray-700 mb-0.5';
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@@ -273,7 +273,7 @@ export default function LogbuchForm({ kuppel, currentUserBeo, editEntry, onSaved
|
|||||||
onChange={(e) => setBesucher(e.target.value === '' ? '' : parseInt(e.target.value) || 0)}
|
onChange={(e) => setBesucher(e.target.value === '' ? '' : parseInt(e.target.value) || 0)}
|
||||||
min={0}
|
min={0}
|
||||||
max={9999}
|
max={9999}
|
||||||
className="w-20 px-2 py-1 border-2 border-gray-400 rounded-lg bg-white text-sm focus:border-blue-500 focus:outline-none"
|
className="w-20 px-2 py-1 border-2 border-gray-400 rounded-lg bg-white text-gray-900 text-sm focus:border-blue-500 focus:outline-none"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
@@ -327,7 +327,7 @@ export default function LogbuchForm({ kuppel, currentUserBeo, editEntry, onSaved
|
|||||||
value={bemerkungen}
|
value={bemerkungen}
|
||||||
onChange={(e) => setBemerkungen(e.target.value.slice(0, 500))}
|
onChange={(e) => setBemerkungen(e.target.value.slice(0, 500))}
|
||||||
rows={2}
|
rows={2}
|
||||||
className="w-full px-2 py-1 border-2 border-gray-400 rounded-lg bg-white text-sm focus:border-blue-500 focus:outline-none resize-y"
|
className="w-full px-2 py-1 border-2 border-gray-400 rounded-lg bg-white text-gray-900 text-sm focus:border-blue-500 focus:outline-none resize-y"
|
||||||
placeholder="Freier Text (max. 500 Zeichen)"
|
placeholder="Freier Text (max. 500 Zeichen)"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -148,7 +148,7 @@ export default function LogbuchList({ kuppel, refreshKey, onEdit, currentUserKue
|
|||||||
value={month}
|
value={month}
|
||||||
max={currentMonth()}
|
max={currentMonth()}
|
||||||
onChange={(e) => setMonth(e.target.value > currentMonth() ? currentMonth() : e.target.value)}
|
onChange={(e) => setMonth(e.target.value > currentMonth() ? currentMonth() : e.target.value)}
|
||||||
className="border border-[#407BFF] rounded-lg px-2 py-1 text-sm focus:outline-none focus:ring-2 focus:ring-inset focus:ring-[#235CC8]"
|
className="border border-[#407BFF] rounded-lg px-2 py-1 text-sm text-gray-900 focus:outline-none focus:ring-2 focus:ring-inset focus:ring-[#235CC8]"
|
||||||
/>
|
/>
|
||||||
<button
|
<button
|
||||||
onClick={() => setMonth((m) => nextMonth(m))}
|
onClick={() => setMonth((m) => nextMonth(m))}
|
||||||
@@ -168,7 +168,7 @@ export default function LogbuchList({ kuppel, refreshKey, onEdit, currentUserKue
|
|||||||
value={search}
|
value={search}
|
||||||
onChange={(e) => setSearch(e.target.value)}
|
onChange={(e) => setSearch(e.target.value)}
|
||||||
placeholder="Suche in Bemerkungen, Objekte, BEOs…"
|
placeholder="Suche in Bemerkungen, Objekte, BEOs…"
|
||||||
className="w-full px-3 py-1.5 pr-8 border border-[#407BFF] rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-inset focus:ring-[#235CC8]"
|
className="w-full px-3 py-1.5 pr-8 border border-[#407BFF] rounded-lg text-sm text-gray-900 focus:outline-none focus:ring-2 focus:ring-inset focus:ring-[#235CC8]"
|
||||||
/>
|
/>
|
||||||
{search ? (
|
{search ? (
|
||||||
<button
|
<button
|
||||||
@@ -194,11 +194,11 @@ export default function LogbuchList({ kuppel, refreshKey, onEdit, currentUserKue
|
|||||||
);
|
);
|
||||||
|
|
||||||
const cell = compact
|
const cell = compact
|
||||||
? 'px-1.5 py-1 border border-gray-200 text-xs'
|
? 'px-1.5 py-1 border border-gray-200 text-xs text-gray-900'
|
||||||
: 'px-3 py-2 border border-gray-200';
|
: 'px-3 py-2 border border-gray-200 text-gray-900';
|
||||||
const head = compact
|
const head = compact
|
||||||
? 'px-1.5 py-1 border border-gray-300 text-xs font-semibold'
|
? 'px-1.5 py-1 border border-gray-300 text-xs font-semibold text-gray-900'
|
||||||
: 'px-3 py-2 border border-gray-300';
|
: 'px-3 py-2 border border-gray-300 text-gray-900';
|
||||||
|
|
||||||
const displayEntries = printEntries ?? entries;
|
const displayEntries = printEntries ?? entries;
|
||||||
|
|
||||||
@@ -306,13 +306,13 @@ export default function LogbuchList({ kuppel, refreshKey, onEdit, currentUserKue
|
|||||||
<button
|
<button
|
||||||
onClick={() => setPageState({ page: page - 1, key: filterKey })}
|
onClick={() => setPageState({ page: page - 1, key: filterKey })}
|
||||||
disabled={page === 0}
|
disabled={page === 0}
|
||||||
className="px-3 py-1.5 text-sm rounded-lg bg-gray-200 hover:bg-gray-300 disabled:opacity-40 disabled:cursor-not-allowed"
|
className="px-3 py-1.5 text-sm text-gray-900 rounded-lg bg-gray-200 hover:bg-gray-300 disabled:opacity-40 disabled:cursor-not-allowed"
|
||||||
>← Zurück</button>
|
>← Zurück</button>
|
||||||
<span className="text-sm text-gray-600">Seite {page + 1} von {Math.ceil(total / limit)}</span>
|
<span className="text-sm text-gray-600">Seite {page + 1} von {Math.ceil(total / limit)}</span>
|
||||||
<button
|
<button
|
||||||
onClick={() => setPageState({ page: page + 1, key: filterKey })}
|
onClick={() => setPageState({ page: page + 1, key: filterKey })}
|
||||||
disabled={(page + 1) * limit >= total}
|
disabled={(page + 1) * limit >= total}
|
||||||
className="px-3 py-1.5 text-sm rounded-lg bg-gray-200 hover:bg-gray-300 disabled:opacity-40 disabled:cursor-not-allowed"
|
className="px-3 py-1.5 text-sm text-gray-900 rounded-lg bg-gray-200 hover:bg-gray-300 disabled:opacity-40 disabled:cursor-not-allowed"
|
||||||
>Weiter →</button>
|
>Weiter →</button>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|||||||
+11
-11
@@ -61,14 +61,14 @@ export default function Statistik() {
|
|||||||
return rows.reduce((s, r) => s + (r[key] as number), 0);
|
return rows.reduce((s, r) => s + (r[key] as number), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
const thTop = 'px-3 py-2 border border-gray-300 text-xs font-semibold bg-gray-100 text-center';
|
const thTop = 'px-3 py-2 border border-gray-300 text-xs font-semibold bg-gray-100 text-center text-gray-900';
|
||||||
const thSub = 'px-3 py-2 border border-gray-300 text-xs font-semibold bg-gray-50 whitespace-nowrap';
|
const thSub = 'px-3 py-2 border border-gray-300 text-xs font-semibold bg-gray-50 whitespace-nowrap text-gray-900';
|
||||||
const thDiv = 'px-3 py-2 border border-gray-300 border-l-4 border-l-gray-400 text-xs font-semibold bg-gray-50 whitespace-nowrap';
|
const thDiv = 'px-3 py-2 border border-gray-300 border-l-4 border-l-gray-400 text-xs font-semibold bg-gray-50 whitespace-nowrap text-gray-900';
|
||||||
const td = 'px-3 py-2 border border-gray-200 text-sm text-right tabular-nums';
|
const td = 'px-3 py-2 border border-gray-200 text-sm text-right tabular-nums text-gray-900';
|
||||||
const tdDiv = 'px-3 py-2 border border-gray-200 border-l-4 border-l-gray-400 text-sm text-right tabular-nums';
|
const tdDiv = 'px-3 py-2 border border-gray-200 border-l-4 border-l-gray-400 text-sm text-right tabular-nums text-gray-900';
|
||||||
const tdL = 'px-3 py-2 border border-gray-200 text-sm text-left whitespace-nowrap';
|
const tdL = 'px-3 py-2 border border-gray-200 text-sm text-left whitespace-nowrap text-gray-900';
|
||||||
const tdSum = 'px-3 py-2 border border-gray-200 text-sm text-right tabular-nums font-semibold bg-gray-50';
|
const tdSum = 'px-3 py-2 border border-gray-200 text-sm text-right tabular-nums font-semibold bg-gray-50 text-gray-900';
|
||||||
const tdSumDiv = 'px-3 py-2 border border-gray-200 border-l-4 border-l-gray-400 text-sm text-right tabular-nums font-semibold bg-gray-50';
|
const tdSumDiv = 'px-3 py-2 border border-gray-200 border-l-4 border-l-gray-400 text-sm text-right tabular-nums font-semibold bg-gray-50 text-gray-900';
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="space-y-4">
|
<div className="space-y-4">
|
||||||
@@ -80,7 +80,7 @@ export default function Statistik() {
|
|||||||
onChange={(e) => setYear(parseInt(e.target.value, 10) || new Date().getFullYear())}
|
onChange={(e) => setYear(parseInt(e.target.value, 10) || new Date().getFullYear())}
|
||||||
min={2000}
|
min={2000}
|
||||||
max={2100}
|
max={2100}
|
||||||
className="w-24 px-2 py-1 border-2 border-gray-400 rounded-lg bg-white text-sm focus:border-blue-500 focus:outline-none"
|
className="w-24 px-2 py-1 border-2 border-gray-400 rounded-lg bg-white text-gray-900 text-sm focus:border-blue-500 focus:outline-none"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -156,11 +156,11 @@ export default function Statistik() {
|
|||||||
<div className="grid grid-cols-2 gap-4 w-full max-w-sm">
|
<div className="grid grid-cols-2 gap-4 w-full max-w-sm">
|
||||||
<div className="border-2 border-gray-300 rounded-xl p-4 bg-white">
|
<div className="border-2 border-gray-300 rounded-xl p-4 bg-white">
|
||||||
<div className="text-xs text-gray-500 mb-1">Besucher {year}</div>
|
<div className="text-xs text-gray-500 mb-1">Besucher {year}</div>
|
||||||
<div className="text-2xl font-bold">{data?.cumulative.toLocaleString('de-DE') ?? 0}</div>
|
<div className="text-2xl font-bold text-gray-900">{data?.cumulative.toLocaleString('de-DE') ?? 0}</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="border-2 border-gray-300 rounded-xl p-4 bg-white">
|
<div className="border-2 border-gray-300 rounded-xl p-4 bg-white">
|
||||||
<div className="text-xs text-gray-500 mb-1">Führungen {year}</div>
|
<div className="text-xs text-gray-500 mb-1">Führungen {year}</div>
|
||||||
<div className="text-2xl font-bold">{data?.tage ?? 0}</div>
|
<div className="text-2xl font-bold text-gray-900">{data?.tage ?? 0}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "logbuch",
|
"name": "logbuch",
|
||||||
"version": "1.8.0",
|
"version": "1.8.1",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "next dev",
|
"dev": "next dev",
|
||||||
|
|||||||
Reference in New Issue
Block a user