Skip to content

Commit e132ff3

Browse files
authored
Merge pull request #7 from BennyGK15/dev
Update tour overlay and reformat code for VerseOrderList
2 parents 2f3c2f8 + 96bb9f3 commit e132ff3

15 files changed

Lines changed: 295 additions & 107 deletions

File tree

app/datenschutz/page.tsx

Lines changed: 25 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,7 @@ import { legalConfig } from "@/lib/legal";
77

88
export const metadata: Metadata = {
99
title: "Datenschutzerklärung – SongBeamer Song-Editor",
10-
description:
11-
"Datenschutzerklärung des SongBeamer Song-Editors gemäß DSGVO und BDSG.",
10+
description: "Datenschutzerklärung des SongBeamer Song-Editors gemäß DSGVO und BDSG.",
1211
};
1312

1413
export default function DatenschutzPage() {
@@ -69,7 +68,8 @@ export default function DatenschutzPage() {
6968
className="text-foreground underline underline-offset-4 hover:no-underline"
7069
>
7170
Impressum
72-
</Link>.
71+
</Link>
72+
.
7373
</p>
7474
</CardContent>
7575
</Card>
@@ -106,8 +106,8 @@ export default function DatenschutzPage() {
106106
<p>
107107
Diese Website wird auf Servern eines externen Hosting-Anbieters
108108
betrieben. Beim Abrufen der Seiten werden durch den Hosting-Anbieter
109-
automatisch Zugriffsdaten in Server-Protokolldateien gespeichert.
110-
Dazu können gehören:
109+
automatisch Zugriffsdaten in Server-Protokolldateien gespeichert. Dazu
110+
können gehören:
111111
</p>
112112
<ul className="list-disc space-y-1 pl-5">
113113
<li>IP-Adresse des anfragenden Geräts</li>
@@ -119,10 +119,10 @@ export default function DatenschutzPage() {
119119
<p>
120120
Rechtsgrundlage für diese Verarbeitung ist Art. 6 Abs. 1 lit. f DSGVO
121121
(berechtigtes Interesse an dem sicheren und fehlerfreien Betrieb der
122-
Website). Die Protokolldaten werden nicht mit anderen
123-
personenbezogenen Daten zusammengeführt und nach spätestens
124-
{" "}{legalConfig.hostingRetentionDays} Tagen gelöscht, sofern keine gesetzliche Aufbewahrungspflicht
125-
besteht.
122+
Website). Die Protokolldaten werden nicht mit anderen personenbezogenen
123+
Daten zusammengeführt und nach spätestens{" "}
124+
{legalConfig.hostingRetentionDays} Tagen gelöscht, sofern keine
125+
gesetzliche Aufbewahrungspflicht besteht.
126126
</p>
127127
<p>Aktuell eingesetzter Hosting-Anbieter: {legalConfig.hostingProvider}.</p>
128128
</CardContent>
@@ -182,10 +182,10 @@ export default function DatenschutzPage() {
182182
>
183183
{legalConfig.websiteLabel}
184184
</a>
185-
. Für die Inhalte und Datenschutzpraktiken dieser externen Seiten
186-
ist der jeweilige Anbieter verantwortlich. Beim Anklicken eines
187-
externen Links kann Ihre IP-Adresse an den jeweiligen Anbieter
188-
übermittelt werden.
185+
. Für die Inhalte und Datenschutzpraktiken dieser externen Seiten ist
186+
der jeweilige Anbieter verantwortlich. Beim Anklicken eines externen
187+
Links kann Ihre IP-Adresse an den jeweiligen Anbieter übermittelt
188+
werden.
189189
</p>
190190
</CardContent>
191191
</Card>
@@ -202,8 +202,8 @@ export default function DatenschutzPage() {
202202
</p>
203203
<ul className="list-disc space-y-1 pl-5">
204204
<li>
205-
<strong className="text-foreground">Auskunftsrecht</strong> über
206-
die zu Ihrer Person gespeicherten Daten (Art. 15 DSGVO)
205+
<strong className="text-foreground">Auskunftsrecht</strong> über die
206+
zu Ihrer Person gespeicherten Daten (Art. 15 DSGVO)
207207
</li>
208208
<li>
209209
<strong className="text-foreground">Recht auf Berichtigung</strong>{" "}
@@ -226,8 +226,8 @@ export default function DatenschutzPage() {
226226
(Art. 20 DSGVO)
227227
</li>
228228
<li>
229-
<strong className="text-foreground">Widerspruchsrecht</strong>{" "}
230-
gegen die Verarbeitung (Art. 21 DSGVO)
229+
<strong className="text-foreground">Widerspruchsrecht</strong> gegen
230+
die Verarbeitung (Art. 21 DSGVO)
231231
</li>
232232
</ul>
233233
<p>
@@ -251,9 +251,9 @@ export default function DatenschutzPage() {
251251
<CardContent className="text-muted-foreground space-y-3 text-sm leading-relaxed">
252252
<p>
253253
Sie haben das Recht, sich bei einer Datenschutz-Aufsichtsbehörde über
254-
die Verarbeitung Ihrer personenbezogenen Daten zu beschweren
255-
(Art. 77 DSGVO). Die zuständige Aufsichtsbehörde richtet sich nach
256-
Ihrem gewöhnlichen Aufenthaltsort, Ihrem Arbeitsort oder dem Ort des
254+
die Verarbeitung Ihrer personenbezogenen Daten zu beschweren (Art. 77
255+
DSGVO). Die zuständige Aufsichtsbehörde richtet sich nach Ihrem
256+
gewöhnlichen Aufenthaltsort, Ihrem Arbeitsort oder dem Ort des
257257
mutmaßlichen Verstoßes.
258258
</p>
259259
</CardContent>
@@ -266,10 +266,11 @@ export default function DatenschutzPage() {
266266
</CardHeader>
267267
<CardContent className="text-muted-foreground space-y-3 text-sm leading-relaxed">
268268
<p>
269-
Diese Datenschutzerklärung hat den Stand {legalConfig.effectiveDateLabel}. Durch die
270-
Weiterentwicklung der Anwendung oder geänderte gesetzliche Vorgaben
271-
kann eine Anpassung erforderlich werden. Die jeweils aktuelle Fassung
272-
ist stets unter dieser URL abrufbar.
269+
Diese Datenschutzerklärung hat den Stand{" "}
270+
{legalConfig.effectiveDateLabel}. Durch die Weiterentwicklung der
271+
Anwendung oder geänderte gesetzliche Vorgaben kann eine Anpassung
272+
erforderlich werden. Die jeweils aktuelle Fassung ist stets unter dieser
273+
URL abrufbar.
273274
</p>
274275
</CardContent>
275276
</Card>

app/impressum/page.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ export default function ImpressumPage() {
5858
</p>
5959
{legalConfig.websiteUrl !== "https://example.com" && (
6060
<p>
61-
Website: {" "}
61+
Website:{" "}
6262
<a
6363
href={legalConfig.websiteUrl}
6464
target="_blank"
@@ -91,7 +91,8 @@ export default function ImpressumPage() {
9191
)}
9292
{legalConfig.churchSupervisoryAuthority && (
9393
<p>
94-
Zuständige kirchliche Aufsicht: {legalConfig.churchSupervisoryAuthority}
94+
Zuständige kirchliche Aufsicht:{" "}
95+
{legalConfig.churchSupervisoryAuthority}
9596
</p>
9697
)}
9798
</CardContent>
@@ -133,7 +134,8 @@ export default function ImpressumPage() {
133134
</CardHeader>
134135
<CardContent className="text-muted-foreground text-sm leading-relaxed">
135136
<p>
136-
Die grundlegende technische Anwendung wurde entwickelt von {legalConfig.appDeveloper}.
137+
Die grundlegende technische Anwendung wurde entwickelt von{" "}
138+
{legalConfig.appDeveloper}.
137139
</p>
138140
</CardContent>
139141
</Card>

app/layout.tsx

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4,34 +4,34 @@ import "./globals.css";
44
import { SiteFooter } from "@/components/site-footer";
55

66
const inter = Inter({
7-
variable: "--font-inter",
8-
subsets: ["latin"],
9-
display: "swap",
7+
variable: "--font-inter",
8+
subsets: ["latin"],
9+
display: "swap",
1010
});
1111

1212
export const metadata: Metadata = {
13-
title: "SongBeamer Song-Editor",
14-
description:
15-
"Erstelle SongBeamer .sng-Dateien einfach im Browser – inkl. Metadaten, mehrsprachigen Texten und Export.",
13+
title: "SongBeamer Song-Editor",
14+
description:
15+
"Erstelle SongBeamer .sng-Dateien einfach im Browser – inkl. Metadaten, mehrsprachigen Texten und Export.",
1616
};
1717

1818
export default function RootLayout({
19-
children,
19+
children,
2020
}: Readonly<{
21-
children: React.ReactNode;
21+
children: React.ReactNode;
2222
}>) {
23-
return (
24-
<html lang="de" className={inter.variable}>
25-
<body className="antialiased">
26-
<a
27-
href="#main-content"
28-
className="focus:bg-background sr-only focus:not-sr-only focus:fixed focus:top-4 focus:left-4 focus:z-100 focus:rounded-md focus:px-3 focus:py-2 focus:text-sm focus:shadow"
29-
>
30-
Zum Hauptinhalt springen
31-
</a>
32-
{children}
33-
<SiteFooter />
34-
</body>
35-
</html>
36-
);
23+
return (
24+
<html lang="de" className={inter.variable}>
25+
<body className="antialiased">
26+
<a
27+
href="#main-content"
28+
className="focus:bg-background sr-only focus:not-sr-only focus:fixed focus:top-4 focus:left-4 focus:z-100 focus:rounded-md focus:px-3 focus:py-2 focus:text-sm focus:shadow"
29+
>
30+
Zum Hauptinhalt springen
31+
</a>
32+
{children}
33+
<SiteFooter />
34+
</body>
35+
</html>
36+
);
3737
}

app/page.tsx

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -7,33 +7,33 @@ import { SongForm } from "@/components/song-form";
77
import { Button } from "@/components/ui/button";
88

99
export default function Home() {
10-
const [tourStartSignal, setTourStartSignal] = useState(0);
10+
const [tourStartSignal, setTourStartSignal] = useState(0);
1111

12-
return (
13-
<main id="main-content" className="bg-background flex min-h-screen flex-col pt-8 pb-28">
14-
<div className="mx-auto w-full max-w-4xl space-y-6 px-4">
15-
<div className="flex flex-wrap items-start justify-between gap-4">
16-
<div>
17-
<h1 className="text-2xl font-bold tracking-tight sm:text-3xl">
18-
SongBeamer Song-Editor
19-
</h1>
20-
<p className="text-muted-foreground mt-1">
21-
Erstelle .sng-Dateien für SongBeamer ohne Formatkenntnisse.
22-
</p>
23-
</div>
24-
<Button
25-
type="button"
26-
variant="outline"
27-
size="sm"
28-
onClick={() => setTourStartSignal((prev) => prev + 1)}
29-
className="shrink-0"
30-
>
31-
<Compass className="mr-2 h-4 w-4" />
32-
Produkttour starten
33-
</Button>
34-
</div>
35-
<SongForm tourStartSignal={tourStartSignal} />
36-
</div>
37-
</main>
38-
);
12+
return (
13+
<main id="main-content" className="bg-background flex min-h-screen flex-col pt-8 pb-28">
14+
<div className="mx-auto w-full max-w-4xl space-y-6 px-4">
15+
<div className="flex flex-wrap items-start justify-between gap-4">
16+
<div>
17+
<h1 className="text-2xl font-bold tracking-tight sm:text-3xl">
18+
SongBeamer Song-Editor
19+
</h1>
20+
<p className="text-muted-foreground mt-1">
21+
Erstelle .sng-Dateien für SongBeamer ohne Formatkenntnisse.
22+
</p>
23+
</div>
24+
<Button
25+
type="button"
26+
variant="outline"
27+
size="sm"
28+
onClick={() => setTourStartSignal((prev) => prev + 1)}
29+
className="shrink-0"
30+
>
31+
<Compass className="mr-2 h-4 w-4" />
32+
Produkttour starten
33+
</Button>
34+
</div>
35+
<SongForm tourStartSignal={tourStartSignal} />
36+
</div>
37+
</main>
38+
);
3939
}

components/export-dialog/ExportDialog.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ export function ExportDialog({
8080
<div className="min-h-0 flex-1 overflow-auto">
8181
<pre
8282
aria-label="Vorschau des generierten SNG-Inhalts"
83-
className="text-foreground/90 p-4 font-mono text-xs leading-relaxed whitespace-pre select-all overflow-x-auto"
83+
className="text-foreground/90 overflow-x-auto p-4 font-mono text-xs leading-relaxed whitespace-pre select-all"
8484
>
8585
{sngContent}
8686
</pre>

components/section-editor.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -188,8 +188,8 @@ export function SectionEditor({
188188
Number(langCount) === 3
189189
? "grid gap-3 sm:grid-cols-3"
190190
: Number(langCount) === 2
191-
? "grid gap-3 sm:grid-cols-2"
192-
: ""
191+
? "grid gap-3 sm:grid-cols-2"
192+
: ""
193193
}
194194
>
195195
{Array.from({ length: Math.max(Number(langCount), 1) }, (_, l) => (

components/site-footer.tsx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@ export function SiteFooter() {
66
<div className="mx-auto flex w-full max-w-4xl flex-col gap-2 px-4 py-3 sm:flex-row sm:items-center sm:justify-between sm:py-4">
77
<span>© Benjamin Esenwein · v{process.env.NEXT_PUBLIC_APP_VERSION}</span>
88
<nav aria-label="Rechtliches" className="flex flex-wrap gap-x-4 gap-y-2">
9-
<Link href="/ki-hinweis" className="hover:text-foreground underline-offset-4 hover:underline">
9+
<Link
10+
href="/ki-hinweis"
11+
className="hover:text-foreground underline-offset-4 hover:underline"
12+
>
1013
KI-Hinweis
1114
</Link>
1215
<Link
@@ -27,4 +30,4 @@ export function SiteFooter() {
2730
</div>
2831
</footer>
2932
);
30-
}
33+
}

components/slide-preview-dialog/SlidePreviewDialog.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,8 @@ export function SlidePreviewDialog({ open, onOpenChange, data }: SlidePreviewDia
7575

7676
<div className="flex flex-col gap-2 px-5 py-4 sm:flex-row sm:items-center sm:justify-between">
7777
<p className="text-muted-foreground text-xs">
78-
Grundlage: Abschnittsreihenfolge, Abspielreihenfolge und Sprach-Interleaving.
78+
Grundlage: Abschnittsreihenfolge, Abspielreihenfolge und
79+
Sprach-Interleaving.
7980
</p>
8081
<div className="flex items-center gap-2">
8182
<Button

components/song-form/SongForm.tsx

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,7 @@
22

33
import type { ChangeEvent } from "react";
44
import { useEffect, useRef, useState } from "react";
5-
import {
6-
FormProvider,
7-
useFieldArray,
8-
useForm,
9-
useWatch,
10-
type Resolver,
11-
} from "react-hook-form";
5+
import { FormProvider, useFieldArray, useForm, useWatch, type Resolver } from "react-hook-form";
126
import { zodResolver } from "@hookform/resolvers/zod";
137
import {
148
KeyboardSensor,
@@ -265,7 +259,10 @@ export function SongForm({ tourStartSignal = 0 }: { tourStartSignal?: number })
265259
const sections = getValues("sections");
266260
sections.forEach((section, index) => {
267261
const currentTexts = section.texts ?? [];
268-
const updated = Array.from({ length: count }, (_, textIndex) => currentTexts[textIndex] ?? "");
262+
const updated = Array.from(
263+
{ length: count },
264+
(_, textIndex) => currentTexts[textIndex] ?? ""
265+
);
269266
setValue(`sections.${index}.texts`, updated, { shouldDirty: true });
270267
});
271268
}
@@ -303,7 +300,9 @@ export function SongForm({ tourStartSignal = 0 }: { tourStartSignal?: number })
303300

304301
useEffect(() => {
305302
const sections = getValues("sections");
306-
const signature = sections.map((section) => `${section.id}|${section.type}|${section.number}`).join("||");
303+
const signature = sections
304+
.map((section) => `${section.id}|${section.type}|${section.number}`)
305+
.join("||");
307306

308307
if (prevStructureSignatureRef.current === null) {
309308
prevStructureSignatureRef.current = signature;

0 commit comments

Comments
 (0)