feat: full site build — Project/Melody schema (Option A), admin CRUD, public sections, uploads, email+SMTP, internal analytics, legal pages, docs

This commit is contained in:
2026-08-05 20:53:40 +02:00
parent d87f3033c6
commit c26f41511f
122 changed files with 15068 additions and 41 deletions
+36
View File
@@ -0,0 +1,36 @@
"use client";
import type { ReactNode } from "react";
import type { FieldValues, SubmitHandler, UseFormReturn } from "react-hook-form";
import { Button } from "@/components/ui/button";
import { Form } from "@/components/ui/form";
import { cn } from "@/lib/utils";
type AdminFormProps<TFieldValues extends FieldValues> = {
form: UseFormReturn<TFieldValues>;
onSubmit: SubmitHandler<TFieldValues>;
children: ReactNode;
submitLabel: string;
submittingLabel?: string;
className?: string;
};
export default function AdminForm<TFieldValues extends FieldValues>({
form,
onSubmit,
children,
submitLabel,
submittingLabel = "Saving…",
className,
}: AdminFormProps<TFieldValues>) {
return (
<Form {...form}>
<form onSubmit={form.handleSubmit(onSubmit)} className={cn("space-y-5", className)} noValidate>
{children}
<Button type="submit" disabled={form.formState.isSubmitting}>
{form.formState.isSubmitting ? submittingLabel : submitLabel}
</Button>
</form>
</Form>
);
}