Live Lighthouse audit of /konto found the same class of bug as the prior checkout/cart commit, one shade lighter: text-ink/50 measures 3.08:1 against the cream background, under the 4.5:1 WCAG AA minimum for normal-size text. Grepped for every other use of the same token (login divider, language switcher, sold-out label, admin image-upload status text, admin hint text) and bumped them all to text-ink/70 (5.61:1, same value used in the earlier checkout fix) for one consistent, compliant muted-text shade. Verified: tsc clean, 151/151 tests pass, /konto Lighthouse accessibility 96 -> 100. Co-Authored-By: Claude Sonnet 5 <[email protected]>
105 lines
4.4 KiB
TypeScript
105 lines
4.4 KiB
TypeScript
import { notFound } from "next/navigation";
|
|
import { prisma } from "@/lib/prisma";
|
|
import { asStringArray } from "@/lib/json-array";
|
|
import { BackLink } from "@/components/back-link";
|
|
import { AdminImageListField } from "@/components/admin-image-list-field";
|
|
import { updateHarvestAction, toggleHarvestPublishedAction } from "../../actions";
|
|
import { getLocale } from "@/i18n/locale";
|
|
import { getDictionary } from "@/i18n/get-dictionary";
|
|
|
|
export default async function AdminHarvestEditPage(props: PageProps<"/admin/ernten/[id]">) {
|
|
const t = getDictionary(await getLocale());
|
|
const { id } = await props.params;
|
|
const rawHarvest = await prisma.harvest.findUnique({ where: { id } });
|
|
if (!rawHarvest) notFound();
|
|
const harvest = { ...rawHarvest, images: asStringArray(rawHarvest.images) };
|
|
|
|
const harvestDateValue = harvest.harvestDate.toISOString().slice(0, 10);
|
|
|
|
return (
|
|
<div className="max-w-xl">
|
|
<BackLink href="/admin/ernten" label={t.adminHarvestEditPage.backToHarvests} />
|
|
<h1 className="text-2xl text-forest mb-8">{t.adminHarvestEditPage.title}</h1>
|
|
|
|
{harvest.isPublished ? null : (
|
|
<div className="mb-6 bg-honey/10 border border-honey/30 px-4 py-3 flex flex-col sm:flex-row sm:items-center gap-3 justify-between">
|
|
<p className="text-sm text-honey-dark">{t.adminHarvestEditPage.draftNotice}</p>
|
|
<form action={toggleHarvestPublishedAction}>
|
|
<input type="hidden" name="id" value={harvest.id} />
|
|
<input type="hidden" name="isPublished" value="on" />
|
|
<button type="submit" className="bg-forest text-cream px-4 py-2 text-sm whitespace-nowrap">
|
|
{t.adminHarvestEditPage.publishNow}
|
|
</button>
|
|
</form>
|
|
</div>
|
|
)}
|
|
|
|
<form action={updateHarvestAction} className="space-y-4 bg-background border border-ink/10 p-6">
|
|
<input type="hidden" name="id" value={harvest.id} />
|
|
<div className="grid grid-cols-2 gap-4">
|
|
<label className="block text-sm">
|
|
<span className="text-ink/70">{t.adminHarvestEditPage.typeLabel}</span>
|
|
<input
|
|
name="type"
|
|
defaultValue={harvest.type}
|
|
required
|
|
className="mt-1 w-full border border-ink/20 bg-background px-3 py-2"
|
|
/>
|
|
</label>
|
|
<label className="block text-sm">
|
|
<span className="text-ink/70">{t.adminHarvestEditPage.yearLabel}</span>
|
|
<input
|
|
name="year"
|
|
type="number"
|
|
defaultValue={harvest.year}
|
|
required
|
|
className="mt-1 w-full border border-ink/20 bg-background px-3 py-2"
|
|
/>
|
|
</label>
|
|
</div>
|
|
<label className="block text-sm">
|
|
<span className="text-ink/70">{t.adminHarvestEditPage.harvestDateLabel}</span>
|
|
<input
|
|
name="harvestDate"
|
|
type="date"
|
|
defaultValue={harvestDateValue}
|
|
required
|
|
className="mt-1 w-full border border-ink/20 bg-background px-3 py-2"
|
|
/>
|
|
</label>
|
|
<label className="block text-sm">
|
|
<span className="text-ink/70">{t.adminHarvestEditPage.locationLabel}</span>
|
|
<input
|
|
name="location"
|
|
defaultValue={harvest.location}
|
|
className="mt-1 w-full border border-ink/20 bg-background px-3 py-2"
|
|
/>
|
|
</label>
|
|
<label className="block text-sm">
|
|
<span className="text-ink/70">{t.adminHarvestEditPage.descriptionLabel}</span>
|
|
<textarea
|
|
name="description"
|
|
defaultValue={harvest.description}
|
|
required
|
|
rows={4}
|
|
className="mt-1 w-full border border-ink/20 bg-background px-3 py-2"
|
|
/>
|
|
</label>
|
|
<AdminImageListField
|
|
name="images"
|
|
label={t.adminHarvestEditPage.imagesLabel}
|
|
initialValues={harvest.images}
|
|
/>
|
|
<label className="flex items-center gap-2 text-sm text-ink/70">
|
|
<input type="checkbox" name="isPublished" defaultChecked={harvest.isPublished} />
|
|
{t.adminHarvestEditPage.isPublishedLabel}
|
|
</label>
|
|
<p className="text-xs text-ink/70">{t.adminHarvestEditPage.isPublishedHint}</p>
|
|
<button type="submit" className="bg-forest text-cream px-6 py-2 text-sm">
|
|
{t.adminHarvestEditPage.save}
|
|
</button>
|
|
</form>
|
|
</div>
|
|
);
|
|
}
|