commit bcca176137293e13659ae51efb52961fff8fed98 Author: Basiclean <> Date: Sat May 2 10:41:00 2026 +0200 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5ef6a52 --- /dev/null +++ b/.gitignore @@ -0,0 +1,41 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/versions + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# env files (can opt-in for committing if needed) +.env* + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..8bd0e39 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,5 @@ + +# This is NOT the Next.js you know + +This version has breaking changes — APIs, conventions, and file structure may all differ from your training data. Read the relevant guide in `node_modules/next/dist/docs/` before writing any code. Heed deprecation notices. + diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..43c994c --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1 @@ +@AGENTS.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..e215bc4 --- /dev/null +++ b/README.md @@ -0,0 +1,36 @@ +This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app). + +## Getting Started + +First, run the development server: + +```bash +npm run dev +# or +yarn dev +# or +pnpm dev +# or +bun dev +``` + +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. + +You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. + +This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel. + +## Learn More + +To learn more about Next.js, take a look at the following resources: + +- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. +- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. + +You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome! + +## Deploy on Vercel + +The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. + +Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details. diff --git a/app/apple-icon.png b/app/apple-icon.png new file mode 100644 index 0000000..f43af62 Binary files /dev/null and b/app/apple-icon.png differ diff --git a/app/datenschutz/page.tsx b/app/datenschutz/page.tsx new file mode 100644 index 0000000..60db257 --- /dev/null +++ b/app/datenschutz/page.tsx @@ -0,0 +1,8 @@ + +export default function Datenschutz() { + return ( +
+

Datenschutz

+
+ ); +} diff --git a/app/error.module.css b/app/error.module.css new file mode 100644 index 0000000..c2b8c7a --- /dev/null +++ b/app/error.module.css @@ -0,0 +1,74 @@ +.wrapper { + position: relative; + display: flex; + align-items: center; + justify-content: center; + min-height: 80dvh; + padding: 0 var(--space-4); + overflow: hidden; + background-color: var(--color-background); + width: 100%; +} + +.ghost { + position: absolute; + inset: 0; + display: flex; + align-items: center; + justify-content: center; + font-size: clamp(12rem, 40vw, 28rem); + font-weight: 900; + line-height: 1; + letter-spacing: -0.05em; + user-select: none; + pointer-events: none; + color: transparent; + -webkit-text-stroke: 1px rgba(23, 23, 23, 0.06); +} + +.content { + position: relative; + z-index: 1; + text-align: center; + width: 100%; +} + +.label { + font-size: var(--font-size-small); + font-weight: var(--font-weight-semibold); + letter-spacing: var(--letter-spacing-wide); + text-transform: uppercase; + color: var(--color-text-soft); + margin-bottom: var(--space-4); +} + +.heading { + margin-bottom: var(--space-4); +} + +.description { + color: var(--color-text-muted); + margin-bottom: var(--space-7); + max-width: 38ch; + margin-inline: auto; +} + +.cta { + gap: var(--btn-gap); +} + +.actions { + display: flex; + flex-wrap: wrap; + justify-content: center; + gap: var(--space-4); +} + +@media (min-width: 768px) { +} + +@media (min-width: 1024px) { + .wrapper { + padding: 0 var(--space-6); + } +} diff --git a/app/error.tsx b/app/error.tsx new file mode 100644 index 0000000..8fa29f6 --- /dev/null +++ b/app/error.tsx @@ -0,0 +1,53 @@ +"use client"; + +import { useEffect } from "react"; +import Link from "next/link"; +import styles from "./error.module.css"; +import { + ArrowCounterClockwiseIcon, + ArrowLeftIcon, +} from "@phosphor-icons/react/dist/ssr"; + +interface ErrorProps { + error: Error & { digest?: string }; + reset: () => void; +} + +export default function Error({ error, reset }: ErrorProps) { + useEffect(() => { + console.error(error); + }, [error]); + + return ( +
+ + +
+

Serverfehler

+

Etwas ist schiefgelaufen

+

+ Ein unerwarteter Fehler ist aufgetreten. Bitte versuche es erneut oder + komm später zurück. +

+ +
+ + + + + Zurück zur Startseite + +
+
+
+ ); +} diff --git a/app/favicon.ico b/app/favicon.ico new file mode 100644 index 0000000..9dc61f5 Binary files /dev/null and b/app/favicon.ico differ diff --git a/app/globals.css b/app/globals.css new file mode 100644 index 0000000..785b825 --- /dev/null +++ b/app/globals.css @@ -0,0 +1,58 @@ +@import "../styles/tokens.css"; +@import "../styles/buttons.css"; +@import "../styles/forms.css"; +@import "../styles/typography.css"; + +*, +*::before, +*::after { + box-sizing: border-box; + margin: 0; + padding: 0; +} + +html { + height: 100%; + font-size: 112.5%; /* 16px × 1.125 = 18px */ +} +html.has-menu-open { + scrollbar-gutter: stable; +} + +html, +body { + max-width: 100vw; +} + +body { + min-height: 100%; + display: flex; + flex-direction: column; + color: var(--font-body-color); + background: var(--color-background); + font-family: var(--font-body); + font-size: 1rem; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + line-height: var(--line-height-body); + -webkit-tap-highlight-color: transparent; +} + +main { + width: 100%; + max-width: 1280px; + margin-inline: auto; + padding: 0 var(--space-4); +} + +@media (min-width: 768px) { + main { + padding: 0 var(--space-4); + } +} + +@media (min-width: 1024px) { + main { + padding: 0 var(--space-6); + } +} diff --git a/app/icon0.svg b/app/icon0.svg new file mode 100644 index 0000000..3341939 --- /dev/null +++ b/app/icon0.svg @@ -0,0 +1 @@ +RealFaviconGeneratorhttps://realfavicongenerator.net \ No newline at end of file diff --git a/app/icon1.png b/app/icon1.png new file mode 100644 index 0000000..ce24111 Binary files /dev/null and b/app/icon1.png differ diff --git a/app/impressum/page.tsx b/app/impressum/page.tsx new file mode 100644 index 0000000..c192837 --- /dev/null +++ b/app/impressum/page.tsx @@ -0,0 +1,8 @@ + +export default function Impressum() { + return ( +
+

impressum

+
+ ); +} diff --git a/app/layout.tsx b/app/layout.tsx new file mode 100644 index 0000000..a9e4c5f --- /dev/null +++ b/app/layout.tsx @@ -0,0 +1,104 @@ +import CookieConsentBanner from "@/components/CookieConsent"; +import type { Metadata, Viewport } from "next"; +import { Manrope, Nunito_Sans } from "next/font/google"; +import "./globals.css"; + +import Footer from "@/components/Footer"; +import Header from "@/components/Header"; + +const nunitoSans = Nunito_Sans({ + subsets: ["latin"], + weight: ["400", "600", "700"], + variable: "--font-body", + display: "swap", +}); + +const manrope = Manrope({ + subsets: ["latin"], + weight: ["400", "500", "600", "700"], + variable: "--font-heading", + display: "swap", +}); + +export const viewport: Viewport = { + width: "device-width", + initialScale: 1, +}; + +const siteName = "ENVU"; +const title = "ENVU - Code Connect"; +const description = "Wir bieten Ihnen maßgeschneiderte Lösungen."; +const siteUrl = "https://envu.de"; + +const ogImage = { + url: "/images/envu.png", + alt: "Envu Wallpaper", + width: 1200, + height: 628, +}; + +export const metadata: Metadata = { + metadataBase: new URL(siteUrl), + title: { + default: title, + template: `%s | ${siteName}`, + }, + description, + keywords: "Envu, Hannover", + authors: [{ name: siteName }], + robots: "index, follow", + alternates: { + canonical: siteUrl, + }, + appleWebApp: { + title: siteName, + }, + openGraph: { + type: "website", + siteName, + locale: "de_DE", + title, + description, + images: [ogImage], + url: siteUrl, + }, + twitter: { + card: "summary_large_image", + site: "@envu", + title, + description, + images: [{ url: ogImage.url, alt: ogImage.alt }], + }, +}; + +const jsonLd = { + "@context": "https://schema.org", + "@type": "LocalBusiness", + name: siteName, + url: siteUrl, + description, + address: { + "@type": "PostalAddress", + addressLocality: "Hannover", + addressCountry: "DE", + }, +}; + +export default function RootLayout({ + children, +}: Readonly<{ children: React.ReactNode }>) { + return ( + + +