Impressum

This commit is contained in:
Timo Knuth 2025-11-11 16:22:22 +01:00
parent f31992b952
commit d6ee03f4d8
6 changed files with 267 additions and 3 deletions

View File

@ -111,7 +111,7 @@ export default function DashboardPage() {
title: 'QR Code Tracking: Complete Guide 2025',
excerpt: 'Learn how to track QR code scans with real-time analytics. Compare free vs paid tracking tools, setup Google Analytics, and measure ROI.',
readTime: '12 Min',
slug: 'qr-code-tracking-guide',
slug: 'qr-code-tracking-guide-2025',
},
{
title: 'Dynamic vs Static QR Codes: Which Should You Use?',
@ -129,7 +129,7 @@ export default function DashboardPage() {
title: 'QR Code Analytics: Track, Measure & Optimize Campaigns',
excerpt: 'Learn how to leverage scan analytics, campaign tracking, and dashboard insights to maximize QR code ROI.',
readTime: '15 Min',
slug: 'qr-code-analytics-guide',
slug: 'qr-code-analytics',
},
];

View File

@ -125,7 +125,13 @@ export default function SignupPage() {
/>
<div className="flex items-start">
<input type="checkbox" className="mr-2 mt-1" required />
<input
type="checkbox"
className="mr-2 mt-1"
required
onInvalid={(e) => (e.target as HTMLInputElement).setCustomValidity('Please check this box if you want to proceed')}
onInput={(e) => (e.target as HTMLInputElement).setCustomValidity('')}
/>
<label className="text-sm text-gray-600">
I agree to the{' '}
<Link href="/terms" className="text-primary-600 hover:text-primary-700">

View File

@ -0,0 +1,189 @@
import React from 'react';
import Link from 'next/link';
export const metadata = {
title: 'Legal Notice | QR Master',
description: 'Legal notice and company information for QR Master',
};
export default function ImpressumPage() {
return (
<div className="min-h-screen bg-white py-12">
<div className="container mx-auto px-4 sm:px-6 lg:px-8 max-w-4xl">
<div className="mb-8">
<Link href="/" className="text-primary-600 hover:text-primary-700 font-medium">
Back to Home
</Link>
</div>
<h1 className="text-4xl font-bold text-gray-900 mb-4">Legal Notice</h1>
<p className="text-gray-600 mb-8">Information according to § 5 TMG (German Telemedia Act)</p>
<div className="prose prose-lg max-w-none">
<section className="mb-8">
<h2 className="text-2xl font-bold text-gray-900 mb-4">Service Provider</h2>
<div className="bg-gray-50 p-6 rounded-lg mb-4">
<p className="text-gray-700 mb-2"><strong>Company Name:</strong> [Your Company / Your Name]</p>
<p className="text-gray-700 mb-2"><strong>Legal Form:</strong> [e.g., Sole Proprietorship, LLC, Corporation]</p>
<p className="text-gray-700 mb-2"><strong>Address:</strong></p>
<p className="text-gray-700 ml-4 mb-2">
[Street and Number]<br />
[Postal Code City]<br />
[Country]
</p>
</div>
</section>
<section className="mb-8">
<h2 className="text-2xl font-bold text-gray-900 mb-4">Contact</h2>
<div className="bg-gray-50 p-6 rounded-lg">
<p className="text-gray-700 mb-2">
<strong>Email:</strong>{' '}
<a href="mailto:info@qrmaster.com" className="text-primary-600 hover:text-primary-700">
info@qrmaster.com
</a>
</p>
<p className="text-gray-700 mb-2"><strong>Phone:</strong> [Your Phone Number]</p>
<p className="text-gray-700 mb-2"><strong>Website:</strong> <a href="/" className="text-primary-600 hover:text-primary-700">www.qrmaster.com</a></p>
</div>
</section>
<section className="mb-8">
<h2 className="text-2xl font-bold text-gray-900 mb-4">Authorized Representative</h2>
<div className="bg-gray-50 p-6 rounded-lg">
<p className="text-gray-700 mb-2"><strong>Managing Director / Owner:</strong> [Name]</p>
</div>
</section>
<section className="mb-8">
<h2 className="text-2xl font-bold text-gray-900 mb-4">Commercial Register</h2>
<div className="bg-gray-50 p-6 rounded-lg">
<p className="text-gray-700 mb-2"><strong>Register Court:</strong> [e.g., Munich District Court]</p>
<p className="text-gray-700 mb-2"><strong>Registration Number:</strong> [e.g., HRB 123456]</p>
<p className="text-gray-400 text-sm mt-2">(If applicable)</p>
</div>
</section>
<section className="mb-8">
<h2 className="text-2xl font-bold text-gray-900 mb-4">VAT Identification Number</h2>
<div className="bg-gray-50 p-6 rounded-lg">
<p className="text-gray-700 mb-2">
<strong>VAT ID according to § 27a UStG:</strong> [Your VAT ID]
</p>
<p className="text-gray-400 text-sm mt-2">(If applicable)</p>
</div>
</section>
<section className="mb-8">
<h2 className="text-2xl font-bold text-gray-900 mb-4">Responsible for Content</h2>
<p className="text-gray-700 mb-4">
Responsible for content according to § 55 para. 2 RStV:
</p>
<div className="bg-gray-50 p-6 rounded-lg">
<p className="text-gray-700 mb-2"><strong>Name:</strong> [Name]</p>
<p className="text-gray-700 mb-2"><strong>Address:</strong> [Same as above]</p>
</div>
</section>
<section className="mb-8">
<h2 className="text-2xl font-bold text-gray-900 mb-4">EU Dispute Resolution</h2>
<p className="text-gray-700 mb-4">
The European Commission provides a platform for online dispute resolution (ODR):
{' '}<a
href="https://ec.europa.eu/consumers/odr/"
target="_blank"
rel="noopener noreferrer"
className="text-primary-600 hover:text-primary-700"
>
https://ec.europa.eu/consumers/odr/
</a>
</p>
<p className="text-gray-700 mb-4">
You can find our email address in the contact section above.
</p>
</section>
<section className="mb-8">
<h2 className="text-2xl font-bold text-gray-900 mb-4">
Consumer Dispute Resolution / Universal Arbitration Board
</h2>
<p className="text-gray-700 mb-4">
We are not willing or obliged to participate in dispute resolution proceedings before a
consumer arbitration board.
</p>
</section>
<section className="mb-8">
<h2 className="text-2xl font-bold text-gray-900 mb-4">Liability for Content</h2>
<p className="text-gray-700 mb-4">
As a service provider, we are responsible for our own content on these pages in accordance with § 7 para. 1 TMG
under general law. However, according to §§ 8 to 10 TMG, as a service provider we are not obligated to
monitor transmitted or stored third-party information or to investigate circumstances that indicate illegal activity.
</p>
<p className="text-gray-700 mb-4">
Obligations to remove or block the use of information according to general laws remain unaffected. However,
liability in this regard is only possible from the time of knowledge of a specific legal violation. Upon
becoming aware of corresponding legal violations, we will remove this content immediately.
</p>
</section>
<section className="mb-8">
<h2 className="text-2xl font-bold text-gray-900 mb-4">Liability for Links</h2>
<p className="text-gray-700 mb-4">
Our website contains links to external third-party websites over whose content we have no influence.
Therefore, we cannot assume any liability for this external content. The respective provider or operator
of the pages is always responsible for the content of the linked pages. The linked pages were checked for
possible legal violations at the time of linking. Illegal content was not recognizable at the time of linking.
</p>
<p className="text-gray-700 mb-4">
However, permanent monitoring of the content of linked pages is not reasonable without concrete evidence
of a legal violation. Upon becoming aware of legal violations, we will remove such links immediately.
</p>
</section>
<section className="mb-8">
<h2 className="text-2xl font-bold text-gray-900 mb-4">Copyright</h2>
<p className="text-gray-700 mb-4">
The content and works created by the site operators on these pages are subject to German copyright law.
Duplication, processing, distribution, and any kind of exploitation outside the limits of copyright law
require the written consent of the respective author or creator. Downloads and copies of this site are
only permitted for private, non-commercial use.
</p>
<p className="text-gray-700 mb-4">
Insofar as the content on this site was not created by the operator, the copyrights of third parties
are respected. In particular, third-party content is identified as such. Should you nevertheless become
aware of a copyright infringement, please inform us accordingly. Upon becoming aware of legal violations,
we will remove such content immediately.
</p>
</section>
<section className="mb-8">
<h2 className="text-2xl font-bold text-gray-900 mb-4">Image Credits</h2>
<p className="text-gray-700 mb-4">
Images and graphics used on this website are from:
</p>
<ul className="list-disc pl-6 mb-4 text-gray-700 space-y-2">
<li>Our own creation</li>
<li>License-free image sources (e.g., Unsplash, Pexels)</li>
<li>Licensed stock photo services</li>
</ul>
</section>
</div>
<div className="mt-12 pt-8 border-t border-gray-200">
<p className="text-gray-600 text-center">
<Link href="/privacy" className="text-primary-600 hover:text-primary-700 mr-4">
Privacy Policy
</Link>
<Link href="/terms" className="text-primary-600 hover:text-primary-700 mr-4">
Terms of Service
</Link>
<Link href="/" className="text-primary-600 hover:text-primary-700">
Back to Home
</Link>
</p>
</div>
</div>
</div>
);
}

View File

@ -137,6 +137,15 @@ export default function MarketingLayout({
<li><Link href="/signup" className="hover:text-white">Get Started</Link></li>
</ul>
</div>
<div>
<h3 className="font-semibold mb-4">Legal</h3>
<ul className="space-y-2 text-gray-400">
<li><Link href="/privacy" className="hover:text-white">Privacy Policy</Link></li>
<li><Link href="/terms" className="hover:text-white">Terms of Service</Link></li>
<li><Link href="/impressum" className="hover:text-white">Legal Notice</Link></li>
</ul>
</div>
</div>
<div className="border-t border-gray-800 mt-8 pt-8 text-center text-gray-400">

View File

@ -10,6 +10,7 @@ import { Features } from '@/components/marketing/Features';
import { Pricing } from '@/components/marketing/Pricing';
import { FAQ } from '@/components/marketing/FAQ';
import { Button } from '@/components/ui/Button';
import { ScrollToTop } from '@/components/ui/ScrollToTop';
import en from '@/i18n/en.json';
export default function HomePageClient() {
@ -37,6 +38,9 @@ export default function HomePageClient() {
{/* FAQ Section */}
<FAQ t={t} />
{/* Scroll to Top Button */}
<ScrollToTop />
</>
);
}

View File

@ -0,0 +1,56 @@
'use client';
import React, { useState, useEffect } from 'react';
export function ScrollToTop() {
const [isVisible, setIsVisible] = useState(false);
// Show button when page is scrolled down
useEffect(() => {
const toggleVisibility = () => {
if (window.pageYOffset > 300) {
setIsVisible(true);
} else {
setIsVisible(false);
}
};
window.addEventListener('scroll', toggleVisibility);
return () => window.removeEventListener('scroll', toggleVisibility);
}, []);
const scrollToTop = () => {
window.scrollTo({
top: 0,
behavior: 'smooth',
});
};
return (
<>
{isVisible && (
<button
onClick={scrollToTop}
className="fixed bottom-8 right-8 z-50 p-3 bg-primary-600 hover:bg-primary-700 text-white rounded-full shadow-lg transition-all duration-300 hover:scale-110 focus:outline-none focus:ring-2 focus:ring-primary-500 focus:ring-offset-2"
aria-label="Scroll to top"
>
<svg
className="w-6 h-6"
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
>
<path
strokeLinecap="round"
strokeLinejoin="round"
strokeWidth={2}
d="M5 10l7-7m0 0l7 7m-7-7v18"
/>
</svg>
</button>
)}
</>
);
}