diff --git a/app/(app)/(legal)/imprint/page.tsx b/app/(app)/(legal)/imprint/page.tsx new file mode 100644 index 0000000..29fd55d --- /dev/null +++ b/app/(app)/(legal)/imprint/page.tsx @@ -0,0 +1,110 @@ +/** + * @file app/(legal)/imprint/page.tsx + * @description Server component rendering the imprint/legal notice page tailored to the app layout design. + */ + +import AppFooter from "@/components/layout/AppFooter"; +import { AppHeader } from "@/components/layout/AppHeader"; + +export default async function ImprintPage() { + return ( +
+ +
+ {/* Information pursuant to § 5 DDG */} +
+

+ // Information Pursuant to § 5 + DDG +

+
+

André Kempf

+

Full-Stack Web Developer

+

Großschneidersweg 2a

+

76149 Karlsruhe, Germany

+
+

+ Also responsible for content pursuant to § 18 Abs. 2 MStV. +

+
+ + {/* Contact */} +
+

+ // Contact +

+
+

+ Email:{" "} + + dev@andre-kempf.com + +

+
+
+ + {/* Disclaimer */} +
+

+ // Disclaimer & Legal Notes +

+
+

+ Liability for Content +

+

+ As a service provider, I am responsible for my own content on + these pages according to general laws pursuant to § 7 Abs. 1 DDG. + However, according to §§ 8 to 10 DDG, I am not obligated to + monitor transmitted or stored third-party information or to + investigate circumstances that indicate illegal activity. +

+
+
+

+ Liability for Links +

+

+ My website contains links to external third-party websites over + whose content I have no control. Therefore, I cannot accept any + liability for these external contents. The respective provider or + operator of the pages is always responsible for the content of the + linked pages. +

+
+
+

Copyright

+

+ The content and works created on these pages are subject to German + copyright law. Duplication, processing, distribution, or any form + of commercialization beyond the scope of copyright law require the + prior written consent of the author or creator. +

+
+
+ + {/* Dispute Resolution */} +
+

+ // Dispute Resolution +

+

+ The European Commission provides a platform for online dispute + resolution (OS):{" "} + + https://ec.europa.eu/consumers/odr/ + + .
I am neither willing nor obligated to participate in dispute + resolution proceedings before a consumer arbitration board. +

+
+
+ +
+ ); +} diff --git a/app/(app)/(legal)/privacy/page.tsx b/app/(app)/(legal)/privacy/page.tsx new file mode 100644 index 0000000..d01ff8f --- /dev/null +++ b/app/(app)/(legal)/privacy/page.tsx @@ -0,0 +1,135 @@ +/** + * @file app/(legal)/privacy/page.tsx + * @description Server component rendering the privacy policy page tailored to the app layout design. + */ + +import AppFooter from "@/components/layout/AppFooter"; +import { AppHeader } from "@/components/layout/AppHeader"; + +export default async function PrivacyPage() { + return ( +
+ +
+ {/* Overview */} +
+

+ // Data Protection at a Glance +

+
+

+ General Information +

+

+ The following notes provide a simple overview of what happens to + your personal data when you visit this website. Personal data is + any data that can be used to personally identify you. +

+
+
+

+ Data Collection on This Website +

+

+ Data processing on this website is carried out by the website + operator. Your data is collected when you provide it to us, or + automatically by our IT systems when you visit the site. +

+
+
+ + {/* Responsible Party */} +
+

+ // Responsible Party + (Controller) +

+

+ The controller responsible for data processing on this website is: +

+
+

André Kempf

+

Großschneidersweg 2a

+

76149 Karlsruhe, Germany

+

+ Email:{" "} + + dev@andre-kempf.com + +

+
+
+ + {/* Hosting & Server Log Files */} +
+

+ // Hosting & Server + Infrastructure +

+

+ This website is hosted externally on web servers operated by Netcup + GmbH. Personal data processed on this website is stored on the + host's secure servers. +

+

+ The hosting provider automatically processes technical access data + in server environment variables necessary to establish a stable + connection and deliver page assets securely. +

+
+ + {/* Server Analytics */} +
+

+ // Server Analytics & + Privacy-First Tracking +

+

+ To evaluate website reach and optimize user experience, this website + processes minimal access metrics (e.g., total daily views, coarse + device category, and daily visitor counts). +

+
+

+ // Key privacy guarantees: +

+
    +
  • + No Cookies: We do not + store cookies or local storage identifiers on your device. +
  • +
  • + Anonymized IPs: IP + addresses are instantly hashed with a daily salt and never + stored in plain text. +
  • +
  • + Zero Third Parties:{" "} + Analytics data is processed locally on our own server and never + shared with external tracking services. +
  • +
+
+

+ The legal basis for this processing is our legitimate interest in + maintaining and optimizing our online portfolio (Art. 6(1)(f) GDPR). +

+
+ + {/* Your Rights */} +
+

+ // Your Rights +

+

+ You have the right at any time to receive information free of charge + about the origin, recipient, and purpose of your stored personal + data. You also have a right to request the correction or deletion of + this data. +

+
+
+ +
+ ); +} diff --git a/app/(legal)/imprint/page.tsx b/app/(legal)/imprint/page.tsx deleted file mode 100644 index 58c1fd2..0000000 --- a/app/(legal)/imprint/page.tsx +++ /dev/null @@ -1,112 +0,0 @@ -/** - * @file app/(legal)/imprint/page.tsx - * @description Server component rendering the imprint/legal notice page tailored to the app layout design. - */ - -export default async function ImprintPage() { - return ( -
-
-

- Legal Notice. -

- -
- {/* Information pursuant to § 5 DDG */} -
-

- // Information Pursuant to § - 5 DDG -

-
-

André Kempf

-

Full-Stack Web Developer

-

Großschneidersweg 2a

-

76149 Karlsruhe, Germany

-
-

- Also responsible for content pursuant to § 18 Abs. 2 MStV. -

-
- - {/* Contact */} -
-

- // Contact -

-
-

- Email:{" "} - - dev@andre-kempf.com - -

-
-
- - {/* Disclaimer */} -
-

- // Disclaimer & Legal Notes -

-
-

- Liability for Content -

-

- As a service provider, I am responsible for my own content on - these pages according to general laws pursuant to § 7 Abs. 1 - DDG. However, according to §§ 8 to 10 DDG, I am not obligated to - monitor transmitted or stored third-party information or to - investigate circumstances that indicate illegal activity. -

-
-
-

- Liability for Links -

-

- My website contains links to external third-party websites over - whose content I have no control. Therefore, I cannot accept any - liability for these external contents. The respective provider - or operator of the pages is always responsible for the content - of the linked pages. -

-
-
-

Copyright

-

- The content and works created on these pages are subject to - German copyright law. Duplication, processing, distribution, or - any form of commercialization beyond the scope of copyright law - require the prior written consent of the author or creator. -

-
-
- - {/* Dispute Resolution */} -
-

- // Dispute Resolution -

-

- The European Commission provides a platform for online dispute - resolution (OS):{" "} - - https://ec.europa.eu/consumers/odr/ - - .
I am neither willing nor obligated to participate in - dispute resolution proceedings before a consumer arbitration - board. -

-
-
-
-
- ); -} diff --git a/app/(legal)/privacy/page.tsx b/app/(legal)/privacy/page.tsx deleted file mode 100644 index d6326c7..0000000 --- a/app/(legal)/privacy/page.tsx +++ /dev/null @@ -1,138 +0,0 @@ -/** - * @file app/(legal)/privacy/page.tsx - * @description Server component rendering the privacy policy page tailored to the app layout design. - */ - -export default async function PrivacyPage() { - return ( -
-
-

- Privacy Policy. -

- -
- {/* Overview */} -
-

- // Data Protection at a - Glance -

-
-

- General Information -

-

- The following notes provide a simple overview of what happens to - your personal data when you visit this website. Personal data is - any data that can be used to personally identify you. -

-
-
-

- Data Collection on This Website -

-

- Data processing on this website is carried out by the website - operator. Your data is collected when you provide it to us, or - automatically by our IT systems when you visit the site. -

-
-
- - {/* Responsible Party */} -
-

- // Responsible Party - (Controller) -

-

- The controller responsible for data processing on this website is: -

-
-

André Kempf

-

Großschneidersweg 2a

-

76149 Karlsruhe, Germany

-

- Email:{" "} - - dev@andre-kempf.com - -

-
-
- - {/* Hosting & Server Log Files */} -
-

- // Hosting & Server - Infrastructure -

-

- This website is hosted externally on web servers operated by - Netcup GmbH. Personal data processed on this website is stored on - the host's secure servers. -

-

- The hosting provider automatically processes technical access data - in server environment variables necessary to establish a stable - connection and deliver page assets securely. -

-
- - {/* Server Analytics */} -
-

- // Server Analytics & - Privacy-First Tracking -

-

- To evaluate website reach and optimize user experience, this - website processes minimal access metrics (e.g., total daily views, - coarse device category, and daily visitor counts). -

-
-

- // Key privacy guarantees: -

-
    -
  • - No Cookies: We do not - store cookies or local storage identifiers on your device. -
  • -
  • - Anonymized IPs: IP - addresses are instantly hashed with a daily salt and never - stored in plain text. -
  • -
  • - Zero Third Parties:{" "} - Analytics data is processed locally on our own server and - never shared with external tracking services. -
  • -
-
-

- The legal basis for this processing is our legitimate interest in - maintaining and optimizing our online portfolio (Art. 6(1)(f) - GDPR). -

-
- - {/* Your Rights */} -
-

- // Your Rights -

-

- You have the right at any time to receive information free of - charge about the origin, recipient, and purpose of your stored - personal data. You also have a right to request the correction or - deletion of this data. -

-
-
-
-
- ); -} diff --git a/components/layout/AppFooter.tsx b/components/layout/AppFooter.tsx index 449599d..02bc42f 100644 --- a/components/layout/AppFooter.tsx +++ b/components/layout/AppFooter.tsx @@ -27,8 +27,6 @@ export default function AppFooter() {
diff --git a/components/layout/AppHeader.tsx b/components/layout/AppHeader.tsx index 79a911c..1b9705e 100644 --- a/components/layout/AppHeader.tsx +++ b/components/layout/AppHeader.tsx @@ -1,6 +1,6 @@ /** * @file components/layout/AppHeader.tsx - * @description Application top header component providing navigation controls, dynamic channel or friend tab titles, and optional server settings or member list toggles. + * @description Application top header component providing navigation controls, dynamic channel or friend tab titles, optional server settings, member list toggles, and legal views support. */ "use client"; @@ -12,24 +12,13 @@ import { Users, Hash, Settings, + FileText, + ShieldCheck, } from "lucide-react"; import { ServerSettingsMenu } from "./ServerSettingsMenu"; import { FriendsHeader, TabType } from "@/components/friends/FriendsHeader"; -/** - * Properties for the AppHeader component. - * - * @interface AppHeaderProps - * @property {string} [title] - The title of the current channel or view. - * @property {boolean} [showMembersButton=false] - Whether to show the button that toggles the members sidebar. - * @property {{ id: string; name: string }} [server] - Optional server configuration object containing its unique identifier and name. - * @property {boolean} [showFriendsTabs=false] - Whether to display the friends navigation tabs in the header. - * @property {TabType} [activeTab] - The currently active friends tab identifier. - * @property {(tab: TabType) => void} [setActiveTab] - Callback function to update the active friends tab. - * @property {number} [allCount=0] - The total number of friends. - * @property {number} [pendingCount=0] - The number of pending friend requests. - * @property {boolean} [isSettings=false] - Whether the header is rendered in the settings view. - */ +/** Properties for the AppHeader component. */ interface AppHeaderProps { title?: string; showMembersButton?: boolean; @@ -43,11 +32,11 @@ interface AppHeaderProps { allCount?: number; pendingCount?: number; isSettings?: boolean; + isLegalImprint?: boolean; + isLegalPrivacy?: boolean; } -/** - * Renders the application header with navigation controls, dynamic titles, tabs, and action buttons. - */ +/** Renders the application header with navigation controls, dynamic titles, tabs, and action buttons. */ export function AppHeader({ title, showMembersButton = false, @@ -58,16 +47,21 @@ export function AppHeader({ allCount = 0, pendingCount = 0, isSettings = false, + isLegalImprint = false, + isLegalPrivacy = false, }: AppHeaderProps) { const { isNavOpen, toggleNav, toggleMembers } = useSidebarStore(); + const isLegalView = isLegalImprint || isLegalPrivacy; + const hasContent = !isNavOpen || !!title || showMembersButton || !!server || showFriendsTabs || - isSettings; + isSettings || + isLegalView; return (
- {/* Toggle button for navigation (auch in Settings sichtbar, wenn eingeklappt) */} + {/* Toggle button for navigation */}