diff --git a/ADDING_PAGES.md b/ADDING_PAGES.md index 69215f6f..04d41523 100644 --- a/ADDING_PAGES.md +++ b/ADDING_PAGES.md @@ -10,6 +10,7 @@ This guide explains how to add new pages to the Open Elements website, using the ## Overview The Open Elements website uses a hybrid architecture: + - **Next.js** for page rendering and routing (`src/app/[locale]/`) - **Markdown files** for content (`content/`) - **i18n support** for English (EN) and German (DE) versions @@ -31,11 +32,11 @@ content/ ```markdown --- -title: "Your Page Title" -description: "Brief description for SEO and meta tags" -layout: "article" -url: "/your-page-name" -keywords: ["keyword1", "keyword2", "keyword3"] +title: 'Your Page Title' +description: 'Brief description for SEO and meta tags' +layout: 'article' +url: '/your-page-name' +keywords: ['keyword1', 'keyword2', 'keyword3'] --- Your page content here in Markdown format... @@ -53,11 +54,11 @@ More content... ```markdown --- -title: "Ihr Seitentitel" -description: "Kurze Beschreibung für SEO und Meta-Tags" -layout: "article" -url: "/de/your-page-name" -keywords: ["Schlüsselwort1", "Schlüsselwort2"] +title: 'Ihr Seitentitel' +description: 'Kurze Beschreibung für SEO und Meta-Tags' +layout: 'article' +url: '/de/your-page-name' +keywords: ['Schlüsselwort1', 'Schlüsselwort2'] --- Ihr Seiteninhalt hier im Markdown-Format... @@ -69,15 +70,15 @@ Inhalt für diesen Abschnitt... ### 2. Frontmatter Fields Explained -| Field | Required | Description | Example Values | -|-------|----------|-------------|----------------| -| `title` | Yes | Page title (appears in browser tab and meta tags) | "DLT & Digital Trust Lecture" | -| `description` | Yes | Page description for SEO and social sharing | "Since 2023 Hendrik Ebbers has been offering..." | -| `layout` | Yes | Layout template to use | `"article"`, `"single"`, `"contact"`, `"about-us"` | -| `url` | Yes | URL path for the page (EN: `/page-name`, DE: `/de/page-name`) | `/dlt-lecture` or `/de/dlt-lecture` | -| `keywords` | No | SEO keywords | `["Java", "Open Source", "Support"]` | -| `aliases` | No | Alternative URLs that redirect to this page | `['/old-url', '/another-old-url']` | -| `newsletterPopup` | No | Whether to show newsletter popup | `true` or `false` | +| Field | Required | Description | Example Values | +| ----------------- | -------- | ------------------------------------------------------------- | -------------------------------------------------- | +| `title` | Yes | Page title (appears in browser tab and meta tags) | "DLT & Digital Trust Lecture" | +| `description` | Yes | Page description for SEO and social sharing | "Since 2023 Hendrik Ebbers has been offering..." | +| `layout` | Yes | Layout template to use | `"article"`, `"single"`, `"contact"`, `"about-us"` | +| `url` | Yes | URL path for the page (EN: `/page-name`, DE: `/de/page-name`) | `/dlt-lecture` or `/de/dlt-lecture` | +| `keywords` | No | SEO keywords | `["Java", "Open Source", "Support"]` | +| `aliases` | No | Alternative URLs that redirect to this page | `['/old-url', '/another-old-url']` | +| `newsletterPopup` | No | Whether to show newsletter popup | `true` or `false` | ### 3. Available Layout Types @@ -88,7 +89,7 @@ Choose the appropriate layout for your page: - Best for: Text-heavy content pages, documentation - **`single`** - Simple single-column layout - - Used by: support-care-landingpage, support-care-temurin + - Used by: support-care-maven, support-care-temurin - Best for: Landing pages, promotional content - **`contact`** - Contact form layout @@ -106,7 +107,7 @@ Choose the appropriate layout for your page: - Used by: newsletter page - **`index`** - Homepage layout - - Used by: _index.md (homepage only) + - Used by: \_index.md (homepage only) ### 4. Create Next.js Page Component @@ -121,25 +122,27 @@ src/app/[locale]/ #### Minimal Page Component Template ```tsx -import { notFound } from 'next/navigation' -import type { Metadata } from 'next' +import { notFound } from 'next/navigation'; +import type { Metadata } from 'next'; interface YourPageProps { params: Promise<{ - locale: string - }> + locale: string; + }>; } -export async function generateMetadata({ params }: YourPageProps): Promise { - const { locale } = await params +export async function generateMetadata({ + params, +}: YourPageProps): Promise { + const { locale } = await params; + + const title = + locale === 'de' + ? 'Ihr Seitentitel - Open Elements' + : 'Your Page Title - Open Elements'; - const title = locale === 'de' - ? 'Ihr Seitentitel - Open Elements' - : 'Your Page Title - Open Elements' - - const description = locale === 'de' - ? 'Beschreibung auf Deutsch' - : 'Description in English' + const description = + locale === 'de' ? 'Beschreibung auf Deutsch' : 'Description in English'; return { title, @@ -151,11 +154,11 @@ export async function generateMetadata({ params }: YourPageProps): Promise @@ -169,17 +172,16 @@ export default async function YourPage({ params }: YourPageProps) {

{locale === 'de' ? 'Ihr Seitentitel' : 'Your Page Title'}

- -
- {/* Page content */} -
+ +
{/* Page content */}
- ) + ); } ``` #### Notes on Page Components: + - Use the `locale` parameter to render different content for EN/DE - Use `notFound()` if a locale isn't supported: `if (locale !== 'de') { notFound() }` - Import and use shared components from `src/components/` @@ -226,7 +228,7 @@ public/ ##### Next.js Image Component (in page.tsx): ```tsx -import Image from 'next/image' +import Image from 'next/image'; +/>; -{/* For full-width background images */} +{ + /* For full-width background images */ +}
-
+; ``` #### Image Best Practices 1. **Naming**: Use lowercase, hyphenated names: `team-photo.jpg`, `process-diagram.svg` -2. **Formats**: +2. **Formats**: - Use `.svg` for logos and simple graphics - Use `.webp` or `.jpg` for photos - Use `.png` for images requiring transparency @@ -298,6 +302,7 @@ See existing content files for more shortcode examples. ### 8. Testing Your New Page 1. **Start the development server:** + ```bash pnpm run dev ``` @@ -332,23 +337,25 @@ See existing content files for more shortcode examples. ### Example 1: Simple Article Page **Content structure:** + ``` content/my-article/ index.md index.de.md - + public/my-article/ hero.jpg diagram.svg ``` **Markdown frontmatter:** + ```yaml --- -title: "My Article Title" -description: "Article description" -layout: "article" -url: "/my-article" +title: 'My Article Title' +description: 'Article description' +layout: 'article' +url: '/my-article' --- ``` @@ -358,10 +365,10 @@ url: "/my-article" content/support-program/ index.md # English version index.de.md # German version - + src/app/[locale]/support-program/ page.tsx # Handles both locales - + public/support-program/ logo.svg screenshot.png @@ -371,10 +378,10 @@ public/support-program/ ```markdown --- -title: "Complex Page" -description: "A page with multiple sections" -layout: "single" -url: "/complex-page" +title: 'Complex Page' +description: 'A page with multiple sections' +layout: 'single' +url: '/complex-page' --- ## Section 1 @@ -395,21 +402,25 @@ More detailed content... ## Troubleshooting ### Page not found (404) + - Check that the URL in frontmatter matches the folder structure - Verify the Next.js component is in the correct location - Ensure the locale routing is set up correctly ### Images not displaying + - Verify the image path is relative to `public/` without including "public" in the path - Check that the image file exists in the correct location - Verify file name capitalization matches exactly ### Content not updating + - Restart the development server: `pnpm run dev` - Clear Next.js cache: `rm -rf .next` then restart - Check for typos in frontmatter YAML ### Layout not working as expected + - Verify the layout value matches one of the available layouts - Check if the layout requires specific frontmatter fields - Look at similar pages for reference @@ -424,6 +435,7 @@ More detailed content... ## Need Help? If you encounter issues not covered in this guide: + 1. Check existing pages in `content/` and `src/app/[locale]/` for reference 2. Review the project [README.md](README.md) 3. Ask the development team for guidance diff --git a/content/support-care-landingpage/index.de.md b/content/support-care-landingpage/index.de.md deleted file mode 100644 index b5f5bc96..00000000 --- a/content/support-care-landingpage/index.de.md +++ /dev/null @@ -1,161 +0,0 @@ ---- -title: "Support & Care" -description: "Erhalten Sie umfassenden Open Source Support ✔ Updates ✔ Webinare ✔ direkter Support ✔ Wartungsservice für eine sichere und effiziente Infrastruktur." -layout: "single" -url: "/de/about-support-care" -aliases: ['/de/javaland-2024/support-care'] -newsletterPopup: true ---- - -Support & Care ist ein Programm zur nachhaltigen Weiterentwicklung, Stabilisierung und **Support von Open Source Software (OSS)**. -Hierbei arbeitet Open Elements sowohl mit der Industrie als auch mit der Open Source Community zusammen, um die Qualität, -Unabhängigkeit und Entwicklung von kritischen Open Source Projekten und Komponenten sicherzustellen. - -{{< centered-image src="/illustrations/support-care-logos/support-care-logo.svg" alt="Support & Care Logo" width="80%" >}} - -## Warum Open Source für unser heutiges Leben so wichtig ist - -Open Source gewährleistet die Qualität, Sicherheit und Fortschrittlichkeit von Software, fördert die Gemeinschaft und -bietet wirtschaftliche und soziale Vorteile. [Diese Vorzüge bietet Open Source](https://opensource.com/resources/what-open-source) -sowohl für Einzelpersonen, Unternehmen als auch für die gesamte Gesellschaft. -Es ist daher im Interesse aller, OSS-Projekte finanziell zu unterstützen. -Aufgrund der Fülle der Vorteile wollen wir uns hier auf 4 wichtige Teilaspekte konzentrieren: - - -- **Wissensteilung und Bildung:** Open Source Projekte sind oft nicht nur Softwarelösungen, sondern auch Bildungsressourcen. - Interessierte können den Code studieren, daraus lernen und sich weiterbilden. - Damit fördert Open Source den Wissensaustausch und ermöglicht es vielen, technische Fähigkeiten zu erwerben und zu vertiefen. -- **Vertrauen durch Transparenz:** Da der Quellcode von OSS öffentlich zugänglich ist, kann jede Person ihn überprüfen. - Dies schafft ein hohes Maß an Vertrauen, da eventuelle Mängel oder versteckte Funktionen sichtbar sind. -- **Unabhängigkeit von einzelnen Anbietern:** OSS verringert die Abhängigkeit von einzelnen Softwareanbietern und deren - Geschäftsmodellen. - Besonders in kritischen Infrastrukturen ist das wichtig, um sicherzustellen, dass Anwendungen und Systeme auch in - Zukunft betrieben werden können. -- **Soziale Gerechtigkeit:** Open Source Software ist oft für jeden zugänglich, unabhängig von finanziellen Mitteln. - OSS-Projekte ermöglichen es Menschen aus allen sozialen und wirtschaftlichen Hintergründen, - Zugang zu Technologie und Bildung zu haben. - -{{< centered-image src="os-benefits-de.png" showCaption="true" alt="Ergebnis zur Umfrage bzgl. Vorteilen von Open Source bei mittelständischen Unternehmen" width="80%" >}} - -### Bedeutung von Open Source Support - -Um die langfristige Nachhaltigkeit von Open Source Projekten zu gewährleisten, ist es entscheidend, diese finanziell -zu unterstützen. -Viele Entwickler und Maintainer arbeiten freiwillig an diesen Projekten, oft ohne finanzielle Kompensation. -Durch einen Open Source Support können diese Projekte kontinuierlich weiterentwickelt und verbessert werden. -Zudem ermöglicht Open Source Support es den Entwicklern, sich stärker auf die Qualität und Sicherheit der Software -zu konzentrieren und schneller auf Sicherheitslücken oder Fehler zu reagieren. -Die Unterstützung schafft auch Anreize für neue Entwickler, sich zu beteiligen und innovative Lösungen zu entwickeln. -Kurz gesagt, finanzielle Unterstützung trägt dazu bei, die Open Source Gemeinschaft lebendig und produktiv zu halten, -was letztlich allen zugutekommt. - -{{< centered-image src="tree.png" alt="Illustration bzgl. Zusammenarbeit" width="80%" >}} - -Die [aktive Beteiligung an Open-Source-Projekten](https://hbswk.hbs.edu/item/the-hidden-benefit-of-giving-back-to-open-source-software) -ermöglicht es den Unternehmen, wertvolle Einblicke und technologische Fortschritte zu gewinnen, was den langfristigen -Erfolg und die Wettbewerbsfähigkeit fördert, während gleichzeitig die Open-Source-Community gestärkt wird. - -## Wie Support & Care Open Source Software fördert - -Mit **Support & Care** hat Open Elements gezielt ein Programm zur **fairen und leichtgewichtigen Förderung** -von Open Source gestartet. -Support & Care hilft hierbei sowohl den Open Source Projekten als auch den Personen hinter diesen Projekten. -Wir konzentrieren uns in unserem Support auf Projekte in der Programmiersprache Java. -Diese Spezialisierung ist sinnvoll, weil sie es uns ermöglicht, unsere tiefgreifende Expertise in einer -bestimmten Programmiersprache anzuwenden. -Dadurch können wir effizientere und qualitativ hochwertigere Unterstützung für die spezifischen Anforderungen und -Herausforderungen bieten, die in kritischen Java-basierten Open-Source-Projekten auftreten. - -Mit kritischer OSS sind hierbei Projekte gemeint, die in einer Vielzahl von kritischen System und Anwendungen -in Branchen wie Banken, Gesundheit, Politik als Abhängigkeiten enthalten sind. -Ein Beispiel hierfür ist die Java Distribution Eclipse Temurin, welche mit über 500.000 Downloads die meistgenutzte -Java Laufzeitumgebung ist, oder Apache Maven, dessen Hauptkomponenten im letzten Jahr an die 2 Milliarden mal -heruntergeladen wurden. -Für beide Projekte bietet Open Elements mit Support & Care eine Lösung an, um im professionellen Umfeld die -Produkte bedenkenlos einsetzen zu können. - -Zur Förderung von OSS arbeitet Open Elements aktiv an den Projekten mit. -So ist Open Elements beispielsweise Mitglied der Arbeitsgruppe hinter Eclipse Temurin – unser Geschäftsführer -Hendrik Ebbers war sogar Gründungsmitglied – und hat den Leiter der Entwicklung von Maven -(Chair des Project Management Committee) unter Vertrag. - -{{< centered-image src="roundtable.png" alt="Illustration bzgl. Aufgabenteilung" width="80%" >}} - -Unsere [Open Source Strategie](https://www.linuxfoundation.org/resources/open-source-guides/setting-an-open-source-strategy) -zielt darauf ab, durch finanzielle Förderung und aktive Mitarbeit an den Projekten deren Ausrichtung zu verbessern und -eine Unterfinanzierung bzw. schlechte Wartung sowie Sicherheit dieser kritischen OSS zu unterbinden. -Durch die gezielte Anwendung dieser Strategie können wir die im Support & Care Programm aufgenommen Projekte wegweisend -verbessern und sicherstellen, dass Entwickler weiterhin in der Lage sind, ihre wichtige Arbeit ohne finanzielle -Rückschläge fortzuführen. -Denn auch wenn Open Source ein wachsender Markt ist: Ohne finanzielle Rücklagen könnten dessen Entwickler gezwungen sein, -ihre Arbeit an den Projekten zu reduzieren oder ganz einzustellen. - -## Warum Open Elements der richtige Partner zur Förderung von OSS ist - -Das Ziel von Support & Care ist die ganzheitliche Förderung und Unterstützung von OSS anstelle “nur” finanzieller -Spenden oder Mitarbeit zu liefern. -Unsere jahrelange Erfahrung in der Open-Source-Entwicklung hat uns die entscheidende Bedeutung dieses Supports -aufgezeigt. -Aus diesem Grund wurde Open Elements als ein Unternehmen gegründet, das OSS sowohl aus der technischen als auch aus -wirtschaftlichen und organisatorischen Perspektiven betrachtet und fördert. - -Durch die Mitarbeit von Open Elements in Gremien wie der Eclipse Adoptium Working Group haben wir Erfahrung mit -großen bzw. kritischen Open Source Projekten und kennen deren Probleme und Herausforderungen. -Diese Kenntnisse werden mit der Mitgliedschaft von unserem Geschäftsführer im Aufsichtsrat der Eclipse Foundation -unterstrichen. -Aufgrund unserer Firmenstruktur sind wir aber so dynamisch, dass wir auch mit kleinen Open Source Projekten einfach -zusammenarbeiten können und diese z. B. über Github Sponsorship unterstützen, Newcomern helfen oder aktiv Beiträge -zum Quelltext der Projekte liefern. - -Durch all diese Punkte ist Open Elements ein perfektes Bindeglied zwischen Open Source und Wirtschaft. - -## Wie Support & Care ihrem Unternehmen helfen kann - -Die Bereitstellung von Support Modellen für Open Source Software ist mittlerweile ein beliebtes Geschäftsmodell. -Anders als viele Firmen bietet Support & Care aber nicht einfach nur Support für eigene Open Source Produkte an. -Wir suchen explizit OSS, die verstärkt im Enterprise Bereich eingesetzt wird und dort oft als sicherheitskritisch -eingestuft ist. -Zusammen mit den Entwicklern hinter diesen Open Source Projekten schafft das Support & Care Programm ein Bindeglied, -um sowohl die Projekte zu unterstützen als auch explizit auf die Wünsche und Bedürfnisse von Support & Care Kunden -einzugehen. - -Dabei handelt es sich nicht nur um die transparente Bearbeitung von technischen Tickets durch die jeweiligen Experten -der Projekte, sondern auch um die Aufbereitung und Transformation von Wissen. -Support & Care Kunden erhalten Benachrichtigungen über wichtige Sicherheitsupdates, Fixes und Releases und werden zu -regelmäßig stattfindenden Workshops und Infoveranstaltungen eingeladen. So können die Nutzer der OSS ihre eigenen -Bedürfnisse und Interessen auf kurzem Weg in die Projekte einbringen. -Durch diese Maßnahmen fördert Open Elements aktiv das Prinzip der Gemeinschaftsbildung für die jeweiligen Projekte: -Gemeinschaften, bestehend aus Entwicklern, Nutzern und anderen Beteiligten, können gemeinsam die -Innovationen vorantreiben. - -{{< centered-image src="networking.png" alt="Illustration bzgl. Aufgabenteilung" width="80%" >}} - -### Welche Leistungen umfasst der Open Source Support? - -Der Open Source Support & Care-Service bietet umfassende Leistungen zur Sicherstellung der Performance und Sicherheit -Ihrer Anwendungen. -Unsere Services gehen über klassisches Troubleshooting hinaus und fördern die nachhaltige Verbesserung Ihrer -Infrastruktur. - -- **Updates zu Open Source Projekten:** Sie erhalten regelmäßige Berichte und detaillierte Informationen zu Major Releases, - Bugfix Releases und neuen Projekten, einschließlich Sicherheitsupdates und Critical Patch Updates (CPU). -- **Webinare & Meetings:** Quartalsweise Webinare und 1-on-1 Calls bieten Ihnen aufbereitete Informationen und die - Möglichkeit, Fragen zu stellen und Bedürfnisse direkt in die Projekte einzubringen. -- **Direkter Support:** Kunden haben jederzeit Zugang zu mehrsprachigem Support mit garantierten Reaktionszeiten und der - Möglichkeit für Video-Calls zur schnellen Problemlösung. -- **Support-Bereiche:** Unser Service deckt verschiedene Open Source Projekte ab, beispielsweise im Rahmen unseres - [Temurin Support & Care Angebots]({{< relref "support-care-temurin" >}}) und unseres - [Maven Support & Care Angebots]({{< relref "support-care-maven" >}}). - Wir übernehmen die Ticketerstellung, -pflege und -überwachung, um technische Probleme effizient zu lösen. -- **Wartungsservice:** Unser Service umfasst die Wartung kundenspezifischer Docker-Container, die alle notwendigen - Komponenten für Ihre Anwendung enthalten und regelmäßig aktualisiert werden. - Die Container werden in einer Docker-Registry bereitgestellt und automatisch getestet. - -Je nach Bedarf lässt sich der Supportvertrag individuell anpassen. - -[Kontaktieren Sie uns]({{< relref "contact" >}}) für eine individuelle Beratung und erfahren Sie mehr darüber, -wie unser Open Source Support & Care-Service Ihre IT-Infrastruktur verbessern kann. - -{{< centered-button link="/contact" >}}Beratungstermin vereinbaren{{}} - - diff --git a/content/support-care-landingpage/index.md b/content/support-care-landingpage/index.md deleted file mode 100644 index 3761fb45..00000000 --- a/content/support-care-landingpage/index.md +++ /dev/null @@ -1,151 +0,0 @@ ---- -title: "Support & Care" -description: "TODO" -layout: "single" -url: "/about-support-care" -aliases: ['/javaland-2024/support-care'] -newsletterPopup: true ---- - -Support & Care is a program for the sustainable further development, stabilization and **support of open source software (OSS)**. -Open Elements works with both the industry and the open source community to ensure the quality, -independence and development of critical open source projects and components. - -{{< centered-image src="/illustrations/support-care-logos/support-care-logo.svg" alt="Support & Care Logo" width="80%" >}} - -## Why open source is so important for our lives today - -Open source ensures the quality, security and progressiveness of software, fosters community and provides economic and social benefits. -[Open source offers these benefits](https://opensource.com/resources/what-open-source) to individuals, companies and society as a whole. -It is therefore in everyone's interest to support OSS projects financially. -Due to the wealth of benefits, we want to focus on 4 important aspects here: - - -- **Knowledge sharing and education:** open source projects are often not only software solutions, - but also educational resources. Interested parties can study the code, learn from it and further their education. - In this way, open source promotes knowledge sharing and enables many people to acquire and deepen their technical skills. -- **Trust through transparency:** As the source code of OSS is publicly accessible, anyone can check it. - This creates a high level of trust, as any defects or hidden functions are visible. -- **Independence from individual providers:** OSS reduces dependence on individual software providers and - their business models. - This is particularly important in critical infrastructures to ensure that applications and systems can continue to - be operated in the future. -- **Social justice:** Open source software is often accessible to everyone, regardless of financial means. - OSS projects enable people from all social and economic backgrounds to have access to technology and education. - -{{< centered-image src="os-benefits.png" showCaption="true" alt="Results of the survey on the benefits of open source for SMEs" width="80%" >}} - -### Importance of open source support - -In order to ensure the long-term sustainability of open source projects, it is crucial to support them financially. -Many developers and maintainers work on these projects voluntarily, often without financial compensation. -Through open source support, these projects can be continuously developed and improved. -In addition, open source support allows developers to focus more on the quality and security of the software and -respond more quickly to security vulnerabilities or bugs. -Support also incentivizes new developers to get involved and develop innovative solutions. -In short, financial support helps keep the open source community vibrant and productive, which ultimately benefits everyone. - -{{< centered-image src="tree.png" alt="Illustration regarding cooperation" width="80%" >}} - -[Active participation in open source projects](https://hbswk.hbs.edu/item/the-hidden-benefit-of-giving-back-to-open-source-software) -allows companies to gain valuable insights and technological advancements, which promotes long-term success and -competitiveness while strengthening the open source community. - -## How Support & Care promotes open source software - -With **Support & Care**, Open Elements has launched a program to promote open source in a -**fair and lightweight** way. -Support & Care helps both the open source projects and the people behind these projects. -We focus our support on projects in the Java programming language. -This specialization makes sense because it allows us to apply our in-depth expertise in a specific programming language. -This allows us to provide more efficient and higher quality support for the specific requirements -and challenges that arise in critical Java-based open source projects. - -Critical OSS refers to projects that are included as dependencies in a variety of critical systems and applications in -industries such as banking, healthcare and politics. -One example of this is the Java distribution Eclipse Temurin, which is the most widely used Java runtime -environment with over 500,000 downloads, or Apache Maven, whose main components were downloaded around -2 billion times last year. - -With Support & Care, Open Elements offers a solution for both projects so that the products can be -used without hesitation in a professional environment. -For example, Open Elements is a member of the working group behind Eclipse Temurin - our CEO Hendrik Ebbers -was even a founding member - and has the head of Maven development (Chair of the Project Management Committee) -under contract. - - -{{< centered-image src="roundtable.png" alt="Illustration regarding division of tasks" width="80%" >}} - -Our open source strategy aims to improve the direction of the projects through financial support and active -collaboration and to prevent underfunding, poor maintenance and security of this critical OSS. -By applying this strategy in a targeted manner, we can make groundbreaking improvements to the projects -included in the Support & Care program and ensure that developers are able to continue their important -work without financial setbacks. -Because even though open source is a growing market, without financial reserves its developers may be -forced to reduce or stop their work on the projects. - -## Why Open Elements is the right partner to support OSS - -The goal of Support & Care is to provide holistic promotion and support of OSS instead of “just” providing financial -donations or collaboration. -Our years of experience in open source development have shown us the crucial importance of this support. -For this reason, Open Elements was founded as a company that views and promotes OSS from technical as well -as business and organizational perspectives. - -Through Open Elements' involvement in committees such as the Eclipse Adoptium Working Group, -we have experience with large or critical open source projects and are familiar with their problems and -challenges. -This knowledge is underlined by the membership of our managing director on the supervisory board of the -Eclipse Foundation. -However, due to our company structure, we are so dynamic that we can also easily work with small open source -projects and support them e.g. via Github sponsorship, help newcomers or actively contribute to the source -code of the projects. - -All these points make Open Elements a perfect link between open source and business. - -## How Support & Care can help your company - -Theprovision of support models for open source software has become a popular business model. -Unlike many companies, however, Support & Care does not simply offer support for its own open source products. -We are explicitly looking for OSS that is increasingly used in the enterprise sector, where it is often classified as -security-critical. -Together with the developers behind these open source projects, the Support & Care program creates a link -to both support the projects and explicitly respond to the wishes and needs of Support & Care customers. - -This involves not only the transparent processing of technical tickets by the respective project experts, -but also the preparation and transformation of knowledge. -Support & Care customers receive notifications about important security updates, fixes and releases and -are invited to regular workshops and information events. -This allows OSS users to contribute their own needs and interests to the projects in the shortest possible time. -Through these measures, Open Elements actively promotes the principle of community building for the respective projects: -Communities consisting of developers, users and other stakeholders can work together to drive innovation forward. - -{{< centered-image src="networking.png" alt="Illustration regarding division of tasks" width="80%" >}} - -### What services does Open Source Support include? - -The Open Source Support & Care service offers comprehensive services to ensure the performance and security of your applications. -Our services go beyond classic troubleshooting and promote the sustainable improvement of your infrastructure. -The support contract can be customized according to your needs, socontact us for an individual consultation and find out -more about how our Open Source Support & Care service can improve your IT infrastructure. - -- **Updates on open source projects:** Receive regular reports and detailed information on major releases, - bug fix releases and new projects, including security updates and Critical Patch Updates (CPU). -- **Webinars & Meetings:** Quarterly webinars and 1-on-1 calls provide you with prepared information and the - opportunity to ask questions and contribute needs directly to the projects. -- **Direct support:** Customers have access to multilingual support at all times with guaranteed response times - and the option of video calls for quick problem resolution. -- **Support areas:** Our service covers various open source projects, for example as part of our - [Temurin Support & Care]({{< relref "support-care-temurin" >}}) offering and our - [Maven Support & Care]({{< relref "support-care-maven" >}}) offering. - We take care of ticket creation, maintenance and monitoring in order to solve technical problems efficiently. -- **Maintenance service:** Our service includes the maintenance of customer-specific Docker containers, - which contain all the necessary components for your application and are updated regularly. - The containers are deployed in a Docker registry and tested automatically. - -The support contract can be customized according to your needs. - -[Contact us]({{< relref "contact" >}}) for an individual consultation and find out more, -how our Open Source Support & Care service can improve your IT infrastructure. - -{{< centered-button link="/contact" >}}Schedule a consultation{{}} diff --git a/content/support-care-maven/index.de.md b/content/support-care-maven/index.de.md index 46f9461d..68ab612a 100644 --- a/content/support-care-maven/index.de.md +++ b/content/support-care-maven/index.de.md @@ -1,73 +1,8 @@ --- -title: "Support & Care for Apache Maven™" -showTitle: false -description: "Support & Care for Apache Maven™ stärkt die Zukunft des Java-Ökosystems durch nachhaltige Förderung und transparente Entwicklung. Als erstes Projekt der Support & Care-Initiative ermöglicht es die langfristige Unterstützung eines der wichtigsten Open-Source-Tools mit Fokus auf Sicherheit, LTS-Versionen und Community-Beteiligung." +title: "Support & Care — Professionelle Betreuung für geschäftskritische Java-Komponenten" +description: "Support & Care by Open Elements: Professionelle Wartung, Sicherheitsupdates und Long Term Support für Apache Maven, JUnit, Log4j, Apache Commons und Eclipse Temurin. CRA-konform. Direkt von den Maintainern." layout: "article" url: "/de/support-care-maven" newsletterPopup: true +showTitle: false --- - -{{< centered-image src="/illustrations/support-care-logos/support-care-maven-logo.svg" alt="Support and Care for Apache Maven logo" width="100%" >}} - -**Open Elements** hat mit seinem Programm **Support & Care for Apache Maven™** einen entscheidenden Beitrag zur Sicherung eines zentralen Werkzeugs im Java-Ökosystem initiiert. -Mit Unterstützung des [Sovereign Tech Agency](https://www.sovereign.tech/de) wird erstmals eine nachhaltige Förderung von [Apache Maven]({{< relref "articles/what-is-maven" >}}) ermöglicht, einem der meistgenutzten Open-Source-Projekte weltweit. - -Nun bieten wir Unternehmen und Organisationen die Möglichkeit, sich an diesem wichtigen Vorhaben zu beteiligen. -Durch den Abschluss eines **Support & Care Abonnements** tragen Sie dazu bei, die langfristige Stabilität und Weiterentwicklung von Apache Maven zu sichern. -Ihre Unterstützung hilft, kritische Aufgaben wie Sicherheitsupdates, Bugfixes und die Entwicklung neuer Features zu finanzieren. - -Zusätzlich zur Unterstützung der communitygetriebenen Weiterentwicklung bietet Ihnen ein **Support & Care Abonnement** die Möglichkeit, direkt auf unsere ExpertInnen und Maintainer -zugreifen zu können, um Bugfixes priorisiert zu lösen oder Sie bei anderen Themen rund um Apache Maven™ zu unterstützten. - -## Unser Subscription-Modell für Apache Maven™ - -Wir bieten 3 verschiedene Pakete an, die auf die Bedürfnisse unterschiedlicher Nutzergruppen zugeschnitten sind. -Gerne beraten wir Sie, welches Paket am besten zu Ihren Anforderungen passt. - -{{< support-care-subscription-packages >}} - -

Wir freuen uns darauf, gemeinsam mit Ihnen die Zukunft von Apache Maven zu gestalten!

- -## Unterstützung durch die Sovereign Tech Agency - -Die Sovereign Tech Agency (STA) ist ein Förderprogramm des deutschen Bundesministeriums für Wirtschaft und Klimaschutz, das sich der nachhaltigen Unterstützung von Open-Source-Software widmet. -Ziel des Programms ist es, kritische digitale Infrastrukturen langfristig zu sichern und die Resilienz des europäischen Technologieökosystems zu stärken. -Projekte, in die STA investiert, müssen eine wesentliche Bedeutung für Wirtschaft und Gesellschaft haben und gleichzeitig nachhaltige Entwicklungsmethoden verfolgen. - -Die STA investiert seit 2024 in das Projekt Support & Care for Apache Maven™, wodurch eine nachhaltige Kostenteilung zwischen öffentlichen Mitteln und kommerziellen Beiträgen entsteht. -Die Investitionen der Sovereign Tech Agency legen den Grundstein für eine nachhaltige Zukunft des Projekts und des gesamten Java-Ökosystems. -Für die langfristige Sicherung von Apache Maven ist allerdings eine breite Unterstützung durch die Community und Unternehmen entscheidend. - -{{< centered-image src="diagram-1.png" alt="How Support and Care for Apache Maven is paid " width="100%" >}} - -## Wer arbeitet an Support & Care for Apache Maven™? - -Sowohl Angestellte von Open Elements als auch externe EntwicklerInnen und Maintainer arbeiten gemeinsam an Support & Care for Apache Maven™. -Während das Projektmanagement und die Koordination von Open Elements übernommen wird, arbeiten neben unseren Entwickler:innen auch externe, langjährige Maintainer von Apache Maven an der technischen Umsetzung. -Diese enge Zusammenarbeit mit der Apache Software Foundation und der aktiven Community von Apache Maven stellt sicher, dass die Weiterentwicklung des Projekts im Einklang mit den Bedürfnissen der Nutzer steht. - -## Ein Modellprojekt für Open Source - -Mit Support & Care for Apache Maven™ setzt Open Elements ein starkes Zeichen für die nachhaltige Unterstützung von Open-Source-Projekten. -Dieses Programm dient als Pilotprojekt innerhalb der Support & Care Initiative von Open Elements, die darauf abzielt, in weitere kritische Open-Source-Komponenten zu investieren. - -Das Konzept vereint öffentliche Förderung, kommerziellen Support, transparente Mittelverwaltung und eine aktive Community-Beteiligung. -Es zeigt, wie essenzielle Open-Source-Projekte zukunftssicher gestaltet und gleichzeitig Innovationen gefördert werden können – ein Ansatz, der Modellcharakter für andere Open-Source-Projekte hat. - -{{< centered-image src="/illustrations/general/many-care-tree.svg" width="60%" alt="More people start to care">}} - - -## Anmerkungen - -Apache™ und Apache Maven™ sind Warenzeichen der Apache Software Foundation. - -1Nicht genutzte Support-Stunden verfallen zum Monatsende – Ihr Beitrag unterstützt in diesem Fall direkt die Weiterentwicklung der betreffenden Open-Source-Komponenten. - -2Werktage sind Montag bis Freitag, mit Ausnahme gesetzlicher Feiertage in NRW. - -3Als Helpdesk nutzen wir eine DSGVO-konforme, in der EU gehostete Lösung. Unsere Kund:innen erhalten individuelle Accounts, und die Kommunikation ist sowohl auf Deutsch als auch auf Englisch möglich. - -4Unsere Expertinnen sind Entwickler innen und technische Mitarbeitende, die direkt an den jeweiligen OSS-Projekten (z. B. als Committer oder Maintainer) mitwirken. - -5Für Webinare und individuelle Gespräche nutzen wir Zoom. - diff --git a/content/support-care-maven/index.md b/content/support-care-maven/index.md index c6c568de..c22f7d80 100644 --- a/content/support-care-maven/index.md +++ b/content/support-care-maven/index.md @@ -1,83 +1,8 @@ --- -title: "Support & Care for Apache Maven™" -showTitle: false -description: "Support & Care for Apache Maven™ strengthens the future of the Java ecosystem through sustainable funding and transparent development. As the first project of the Support & Care initiative, it enables long-term support for one of the most important open-source tools, with a focus on security, LTS releases, and community engagement." +title: "Support & Care — Professional Maintenance for Business-Critical Java Components" +description: "Support & Care by Open Elements: Professional maintenance, security updates and long term support for Apache Maven, JUnit, Log4j, Apache Commons and Eclipse Temurin. CRA-compliant. Directly from the maintainers." layout: "article" url: "/support-care-maven" newsletterPopup: true ---- - -{{< centered-image src="/illustrations/support-care-logos/support-care-maven-logo.svg" alt="Support and Care for Apache Maven logo" width="100%" >}} - -**Open Elements** has launched a major initiative with its program **Support & Care for Apache Maven™**, helping to secure -a central tool of the Java ecosystem. -With funding from the [Sovereign Tech Agency](https://www.sovereign.tech/de), sustainable support for -[Apache Maven]({{< relref "articles/what-is-maven" >}}) is enabled for the first time—one of the world’s most widely -used open-source projects. - -We now offer companies and organizations the opportunity to participate in this important undertaking. -By subscribing to a **Support & Care subscription**, you contribute to securing the long-term stability and continued -development of Apache Maven. -Your support helps finance critical tasks such as security updates, bug fixes, and the development of new features. - -In addition to supporting community-driven development, a **Support & Care subscription** allows you to directly access -our experts and maintainers to prioritize bug fixes or assist you with other topics related to Apache Maven™. - -## Our Subscription Model for Apache Maven™ - -We offer three different packages tailored to the needs of various user groups. -We are happy to help you determine which package best suits your requirements. - -{{< support-care-subscription-packages >}} - -

We look forward to shaping the future of Apache Maven together with you!

- -## Support from the Sovereign Tech Agency - -The Sovereign Tech Agency (STA) is a funding program of the German Federal Ministry for Economic Affairs and Climate Action -dedicated to the sustainable support of open-source software. -The program aims to secure critical digital infrastructures in the long term and strengthen the resilience of the European technology ecosystem. -Projects funded by the STA must be of significant importance to the economy and society while following sustainable development practices. - -Since 2024, the STA has been investing in the Support & Care for Apache Maven™ project, enabling sustainable cost-sharing -between public funding and commercial contributions. -The STA’s investment lays the foundation for a sustainable future of the project and the entire Java ecosystem. -However, broad support from the community and industry is essential to secure Apache Maven in the long term. - -{{< centered-image src="diagram-1.png" alt="How Support and Care for Apache Maven is paid" width="100%" >}} - -## Who Works on Support & Care for Apache Maven™? - -Employees of Open Elements as well as external developers and maintainers work together on Support & Care for Apache Maven™. -While project management and coordination are handled by Open Elements, development is carried out by both our engineers -and long-standing external maintainers of Apache Maven. -This close collaboration with the Apache Software Foundation and the active Apache Maven community ensures that the -project evolves in line with user needs. - -## A Model Project for Open Source - -With Support & Care for Apache Maven™, Open Elements is taking a strong step toward sustainable support for open-source projects. -This program serves as a pilot within the Support & Care initiative, which aims to invest in additional critical open-source components. - -The concept combines public funding, commercial support, transparent financial management, and active community involvement. -It demonstrates how essential open-source projects can be made future-proof while fostering innovation — a model that -can inspire similar initiatives across the open-source ecosystem. - -{{< centered-image src="/illustrations/general/many-care-tree.svg" width="60%" alt="More people start to care">}} - -## Footnotes & Service Information - -Apache™ and Apache Maven™ are trademarks of the Apache Software Foundation. - -1Unused support hours expire at the end of the month — in this case, your contribution -directly supports the continued development of the respective open-source components. - -2Business days are Monday through Friday, excluding public holidays in North Rhine-Westphalia, Germany. - -3Our helpdesk uses a GDPR-compliant, EU-hosted solution. Customers receive individual accounts, -and communication is available in both German and English. - -4Our experts are developers and technical staff who are directly involved in the respective -OSS projects (e.g., as committers or maintainers). - -5We use Zoom for webinars and individual meetings. \ No newline at end of file +showTitle: false +--- \ No newline at end of file diff --git a/eslint.config.js b/eslint.config.js index 7b7549aa..f6a2ab4a 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -1,17 +1,20 @@ import { defineConfig, globalIgnores } from 'eslint/config'; -import prettierConfig from 'eslint-config-prettier/flat'; -import nextVitals from 'eslint-config-next/core-web-vitals' +import nextVitals from 'eslint-config-next/core-web-vitals'; +import prettierPlugin from 'eslint-plugin-prettier/recommended'; export default defineConfig([ ...nextVitals, - prettierConfig, globalIgnores([ - ".next/**", - "node_modules/**", - "build/**", - "next-env.d.ts", - "content/**", - "public/**", - "react-src/**" - ]) + '.next/**', + 'node_modules/**', + 'build/**', + 'next-env.d.ts', + 'content/**', + 'public/**', + 'react-src/**', + ]), + { + ...prettierPlugin, + files: ['src/**'], + }, ]); diff --git a/locales/de.json b/locales/de.json index 4e2c22b7..79ab8f66 100644 --- a/locales/de.json +++ b/locales/de.json @@ -266,6 +266,146 @@ "bulletpoint7": "10% Trainingsrabatt", "bulletpoint8": "Individueller monatlicher Call mit Expert:innen4,5" } + }, + "landingpage": { + "logoAlt": "Support & Care Logo", + "heroParagraph": "Professionelle Wartung, Sicherheitsupdates und Long Term Support für die geschäftskritischsten Open-Source-Komponenten im Java-Ökosystem — direkt von den Maintainern.", + "heroBody": "Moderne Software besteht zu über 70 % aus Open-Source-Komponenten. Ab 2027 macht der Cyber Resilience Act (CRA) Hersteller für 100 % ihrer Software verantwortlich — einschließlich aller OSS-Abhängigkeiten. Support & Care sichert die Basis Ihrer Java-Anwendungen: von der Laufzeitumgebung über Build-Tools bis zur Teststrategie.", + "heroContact": "Kontakt aufnehmen", + "heroDiscover": "Leistungen entdecken", + "problemTitle": "Das Problem: Unsichtbare Abhängigkeiten", + "problemP1": "Ein einfaches Java-Projekt mit Spring Boot bringt über 70 transitive Abhängigkeiten mit — die meisten davon Open Source. Ihr individueller Code ist nur die Spitze des Eisbergs. Darunter liegen Laufzeitumgebungen, Build-Tools, Logging-Frameworks, Test-Bibliotheken und Utility-Libraries, die den eigentlichen Betrieb Ihrer Anwendung tragen.", + "problemHighlight": "70 % von Software basiert auf Open Source und liegt somit außerhalb Ihrer direkten Kontrolle.", + "problemP2": "Diese Basiskomponenten werden häufig von einzelnen Entwicklern in ihrer Freizeit gepflegt. Gleichzeitig tragen sie den Großteil der technischen Risiken: Sicherheitslücken, transitive Abhängigkeiten, fehlende Dokumentation und Compliance-Verantwortung.", + "problemBulletTitle": "Was das für Sie bedeutet:", + "problemBullet1": "Schwachstellen in Basiskomponenten bleiben oft unbemerkt, bis es zu spät ist", + "problemBullet2Link": "Log4Shell", + "problemBullet2": "Framework-Support allein schützt nicht vor Lücken in der Basis — das hat Log4Shell eindeutig gezeigt", + "problemBullet3": "Der CRA macht Sie ab 2027 für die gesamte Software-Lieferkette haftbar", + "componentsTitle": "Die betreuten Komponenten", + "componentsIntro": "Support & Care betreut gezielt fünf geschäftskritischste Open-Source-Basiskomponenten des Java-Ökosystems. Gemeinsam bilden sie die technische Vertrauenskette für fast jede Java-Anwendung.", + "temurin": { + "name": "Eclipse Temurin — Java-Runtime", + "desc": "Führende herstellerunabhängige OpenJDK-Distribution weltweit
Über 500.000 Downloads pro Tag
TCK-zertifiziert, AQAvit-verifiziert, Community-getragen" + }, + "maven": { + "name": "Apache Maven — Build & Dependency Management", + "desc": "Über 75 % aller Java-Projekte setzen auf Maven
Ca. 2 Milliarden Downloads jährlich" + }, + "junit": { + "name": "JUnit — Testframework", + "desc": "Über 1 Milliarde Downloads pro Monat
Ca. 85 % Marktanteil im Java-Ökosystem" + }, + "log4j": { + "name": "Apache Log4j — Logging", + "desc": "Ca. 76 % aller Java-Anwendungen nutzen Log4j
Geschäftskritisch für Protokollierung, Monitoring und Fehleranalyse" + }, + "commons": { + "name": "Apache Commons — Standard-Libraries", + "desc": "Ca. 49 % der Java-Entwickler setzen Apache Commons aktiv ein
Modulare Sammlung: Lang, IO, Collections und weitere" + }, + "componentsHighlight": "Kurz gesagt: Die essentielle Basis der technischen Vertrauenskette Ihrer Java-Anwendungen.", + "layersTitle": "Wo Support & Care ansetzt", + "layersIntro": "Java-Anwendungen lassen sich in drei Schichten gliedern:", + "pyramidAlt": "Die 3 Schichten einer Java-Anwendung", + "layer1": "Anwendungsspezifischer Code", + "layer1Desc": "Ihr individueller Geschäfts- und Fachlogik-Code. Diese Ebene ist höchst wertvoll, aber relativ klein im Umfang — sie baut auf Frameworks und Basistechnologien auf.", + "layer2": "Frameworks & Anwendungsplattformen", + "layer2Desc": "Spring Boot, Quarkus, Jakarta EE und andere. Für diese Ebene gibt es vielfach kommerziellen Support der jeweiligen Anbieter.", + "layer3": "Basiskomponenten — Hier setzt Support & Care an.", + "layer3Desc": "Laufzeitumgebung, Build- und Dependency-Management, Standardbibliotheken, Logging- und Test-Frameworks. Diese Komponenten kommen in praktisch jedem Java-Projekt vor — doch professionellen Support gibt es dafür bisher kaum.", + "layersHighlight": "Framework-Support allein reicht nicht. Die Log4Shell-Schwachstelle hat gezeigt: Eine kritische Sicherheitslücke in einer Basiskomponente kann Millionen von Anwendungen treffen — trotz aktueller Framework-Updates. Support & Care schließt genau diese Lücke.", + "servicesTitle": "Unsere Leistungen", + "servicesIntro": "Alle Leistungen werden direkt von den Maintainern und Committern der betreuten Projekte erbracht — nicht von einem nachgelagerten Support-Team.", + "lts": { + "name": "Long Term Support (LTS)", + "desc": "Weiterführung für die wichtigsten Versionen zur besseren Planung und Organisation Ihrer Updates. Sie müssen keine unsicheren oder nicht gewarteten Versionen einsetzen." + }, + "security": { + "name": "Sicherheitsupdates & Bugfixes", + "desc": "Frühzeitige Informationen und Benachrichtigungen zu Schwachstellen und Patches. Schnelle Reaktionszeiten durch direkten Zugang zu den Entwicklern." + }, + "documentation": { + "name": "Dokumentation & Transparenz", + "desc": "Unterstützung bei SBOM-Strategien und technischer Dokumentation — auf Deutsch oder Englisch. Transparente Nachvollziehbarkeit aller Änderungen." + }, + "workshops": { + "name": "Workshops & Beratung", + "desc": "Direkter Austausch mit den Maintainern und Committern der Projekte — auf Deutsch oder Englisch. Individuelle Beratung zu Migration, Best Practices und Architekturentscheidungen." + }, + "webinars": { + "name": "Regelmäßige Webinare & Statusupdates", + "desc": "Quartalsweise Webinare zu aktuellen Sicherheitsrisiken, wichtigen Versionsänderungen, Best-Practice-Empfehlungen und konkreten Auswirkungen auf Ihre OSS-Lieferkette." + }, + "customBuilds": { + "name": "Kundenspezifische Builds & Tooling", + "desc": "Maßgeschneiderte Umsetzungen direkt durch die Maintainer — von speziellen Build-Konfigurationen bis zu individualisierten Tooling-Lösungen." + }, + "craTitle": "Vorbereitet auf den Cyber Resilience Act", + "craP1": "Ab 2027 sind Hersteller im Rahmen des Cyber Resilience Act (CRA) für 100 % ihrer Software verantwortlich — einschließlich aller Open-Source-Abhängigkeiten. Das betrifft Patchzeiten, Schwachstellenmanagement, Dokumentation und langfristige Wartbarkeit. Open Elements agiert als Open-Source-Steward und gestaltet die regulatorischen Rahmenbedingungen aktiv mit. Als Gründungsmitglied der Open Regulatory Compliance Working Group (ORC WG) der Eclipse Foundation arbeiten wir gemeinsam mit führenden Open-Source-Foundations, großen Technologieunternehmen und Vertretern der EU an konkreten Spezifikationen und Praxisleitfäden zur CRA-Umsetzung.", + "craBulletTitle": "Support & Care hilft Ihnen konkret bei:", + "craBullet1": "Deutliche Reduzierung von Patchzeiten", + "craBullet2": "Systematische Schwachstellenüberwachung", + "craBullet3": "Planbare Verfügbarkeit von Updates", + "craBullet4": "Sicherstellung von Dokumentation und Transparenz (inkl. SBOM)", + "craBullet5": "Langfristige Wartbarkeitsgarantie", + "craBullet6": "Perspektivisch: CRA-konforme Attestierungen für betreute Projekte", + "craHighlight": "Open Elements ist Gründungsmitglied der ORC WG und arbeitet direkt an den Best Practices, die definieren, wie CRA-Compliance für Open-Source-Software umgesetzt wird. Diese Expertise fließt unmittelbar in Support & Care ein.", + "containersTitle": "Gehärtete Container für Staat und Verwaltung", + "containersP1": "Auch das ist Support & Care: Gehärtete Container für die deutsche Verwaltung.", + "containersP2": "Open Elements gehört zu einer exklusiven Gruppe von Organisationen, die gehärtete Container-Images für container.gov.de bereitstellen dürfen — neben dem Zentrum für Digitale Souveränität (ZenDiS) und dem Auswärtigen Amt. Für Support & Care Kunden bedeutet das: Die gehärteten Eclipse-Temurin-Images für alle aktuellen Java-LTS-Versionen (Java 11, 17, 21, 25+) sind Teil des Leistungsumfangs. Verifiziert, signiert und kontinuierlich gegen aktuelle Schwachstellendatenbanken abgeglichen.", + "containersBulletTitle": "Was gehärtete Container auszeichnet:", + "containersBullet1": "Verifizierte Herkunft und Qualitätssicherung", + "containersBullet2": "Aktuelle Abhängigkeiten ohne bekannte Schwachstellen", + "containersBullet3": "Software Bill of Materials (SBOM) für volle Transparenz", + "containersBullet4": "Kryptographische Signierung gegen Manipulation", + "containersBullet5": "Minimierte Angriffsfläche durch systematisches Hardening", + "containersImgAlt": "Open Elements liefert in Zukunft offizielle gehärtete Container-Images für die deutsche öffentliche Verwaltung", + "modelTitle": "Mehr als nur Support: Unser Modell", + "modelP1": "Support & Care funktioniert anders als klassischer Vendor-Support. Sie tragen gemeinsam mit uns die laufenden Pflege- und Verbesserungsaufwände für die betreuten Open-Source-Komponenten — offen, nachvollziehbar und messbar.", + "modelSubtitle": "Hier folgt Support & Care drei wichtigen Prinzipien:", + "modelPrinciple1": "Gelder fließen direkt an die Maintainer: Statt oberflächliche Support-Schichten darüber zu legen, investieren wir in die Vitalität des jeweiligen Projekt-Kerns. Die Menschen, die den Code tatsächlich pflegen, Sicherheitsupdates bereitstellen und neue Features entwickeln, werden direkt bezahlt.", + "modelPrinciple2": "Ihre Prioritäten in den Roadmaps: Kundenanforderungen werden aktiv in die Entwicklungs-Roadmaps der betreuten Projekte integriert. So spiegeln Weiterentwicklungen direkt reale Unternehmensbedürfnisse wider.", + "modelPrinciple3": "Proaktive Kommunikation: Sie werden nicht nur bei Problemen informiert, sondern kontinuierlich über relevante Entwicklungen auf dem Laufenden gehalten:", + "modelBullet1": "Sicherheitswarnungen und neue Patches", + "modelBullet2": "Geplante API- oder Major-Version-Änderungen", + "modelBullet3": "Empfehlungen zu Versionsupdates und Abhängigkeitsbereinigungen", + "modelBullet4": "Trends und Risiken im OSS-Ökosystem", + "modelHighlight": "Nicht genutzte Support-Stunden verfallen nicht — sie fließen direkt in die Weiterentwicklung der Open-Source-Komponenten. Jede Subscription stärkt die Projekte, auf die Sie sich verlassen.", + "modelP2": "Hierbei liefern wir flexible Leistungsmodelle für nachhaltige Sicherheit. Wählen Sie das Modell, das zu Ihren Anforderungen in Verfügbarkeit, Compliance und SLA passt.", + "whyTitle": "Warum Open Elements", + "whyP1": "Wir sind die Maintainer — nicht nur Berater: Unsere Mitarbeiter sind keine externen Consultants, die Projekte erst kennenlernen müssen. Sie sind die Menschen, die diese Projekte pflegen, weiterentwickeln und in den Foundations mitgestalten.", + "hendrikRole": "Founder & Eclipse Board Member", + "sandraRole": "Java Champion & OSS Maintainer", + "sebastianRole": "OSS Engineer & Maintainer Log4j", + "whyP2": "Open Elements ist ein bekanntes und aktives Mitglied der Open Source Community und arbeitet nicht nur auf technischer Basis sondern auch auf leitender Ebene in vielen Open Source Foundation mit:", + "eclipseDesc": "Wir sind im Board der Eclipse Foundation vertreten und aktives Mitglied in Arbeitsgruppen wie Eclipse Adoptium, Eclipse JakartaEE oder ORC WG.", + "lfDesc": "TODO", + "asfDesc": "TODO", + "whyHighlight": "Open Source — aber richtig. Unsere Einnahmen aus Support & Care fließen direkt in die betreuten Open-Source-Projekte.", + "faqTitle": "Häufig gestellte Fragen", + "faq1Q": "Ist Support & Care nur für Apache Maven?", + "faq1A": "Nein. Support & Care deckt fünf geschäftskritische Java-Basiskomponenten ab: Eclipse Temurin, Apache Maven, JUnit, Apache Log4j und Apache Commons. Das Programm startete 2024 mit Maven und wurde seitdem kontinuierlich erweitert.", + "faq2Q": "Wer leistet den Support?", + "faq2A": "Committer und Maintainer der jeweiligen Open-Source-Projekte — die Personen, die den Code tatsächlich schreiben und pflegen. Kein nachgelagertes Support-Team, sondern direkter Zugang zu den Experten.", + "faq3Q": "Was passiert mit meiner Subscription-Gebühr?", + "faq3A": "Die Einnahmen fließen transparent und nachvollziehbar in die betreuten Open-Source-Projekte: Bezahlung der Maintainer, Sicherheitsupdates, Bugfixes, Dokumentation und Infrastruktur.", + "faq4Q": "Muss ich alle fünf Komponenten abonnieren?", + "faq4A": "Sprechen Sie uns an — wir schneiden das Angebot auf Ihre konkreten Anforderungen zu.", + "faq5Q": "Hilft Support & Care bei der CRA-Compliance?", + "faq5A": "Ja. Support & Care adressiert zentrale CRA-Anforderungen: Schwachstellenüberwachung, Patchzeiten, Dokumentation, SBOM und langfristige Wartbarkeit. Perspektivisch unterstützen wir auch bei CRA-konformen Attestierungen.", + "faq6Q": "In welchen Sprachen wird Support geleistet?", + "faq6A": "Deutsch und Englisch — sowohl für Helpdesk-Anfragen als auch für Workshops, Beratung und Dokumentation.", + "faq7Q": "Was ist der Unterschied zu Framework-Support (z.B. bei Spring Boot)?", + "faq7A": "Framework-Support deckt die mittlere Schicht Ihres Software-Stacks ab. Support & Care betreut die Basisschicht darunter: Laufzeit, Build-Tools, Logging, Testing und Utility-Libraries. Beides ergänzt sich — Log4Shell hat gezeigt, dass Framework-Support allein nicht ausreicht.", + "ctaTitle": "Sichern Sie die Basis Ihrer Java-Anwendungen", + "ctaP1": "Lassen Sie uns gemeinsam besprechen, wie Support & Care Ihre Software-Lieferkette absichert. Ob Privatwirtschaft oder öffentliche Verwaltung — wir finden das passende Modell für Sie.", + "ctaContact": "Kontakt aufnehmen", + "footnote1": "Nicht genutzte Support-Stunden verfallen monatlich und fließen in die Weiterentwicklung der betreuten Projekte.", + "footnote2": "Werktage ohne Feiertage in NRW.", + "footnote3": "Helpdesk DSGVO-konform und EU-gehostet.", + "footnote4": "Expert:innen sind Committer und Maintainer der betreuten OSS-Projekte.", + "footnote5": "Webinare und Calls per Videokonferenz." } }, "blog": { diff --git a/locales/en.json b/locales/en.json index a6e77b42..488c9ea0 100644 --- a/locales/en.json +++ b/locales/en.json @@ -235,6 +235,146 @@ }, "subscription": { "contactUs": "Contact us" + }, + "landingpage": { + "logoAlt": "Support & Care Logo", + "heroParagraph": "Professional maintenance, security updates and long term support for the most business-critical open source components in the Java ecosystem — directly from the maintainers.", + "heroBody": "Modern software consists of over 70% open source components. From 2027, the Cyber Resilience Act (CRA) will hold manufacturers responsible for 100% of their software — including all OSS dependencies. Support & Care secures the foundation of your Java applications: from the runtime environment to build tools and testing strategy.", + "heroContact": "Get in touch", + "heroDiscover": "Discover our services", + "problemTitle": "The Problem: Invisible Dependencies", + "problemP1": "A simple Java project with Spring Boot brings over 70 transitive dependencies — most of them open source. Your individual code is just the tip of the iceberg. Underneath lie runtime environments, build tools, logging frameworks, test libraries and utility libraries that actually carry the operation of your application.", + "problemHighlight": "70% of software is based on open source and is therefore outside your direct control.", + "problemP2": "These foundational components are often maintained by individual developers in their spare time. At the same time, they carry the majority of technical risks: security vulnerabilities, transitive dependencies, missing documentation and compliance responsibility.", + "problemBulletTitle": "What this means for you:", + "problemBullet1": "Vulnerabilities in foundational components often go unnoticed until it is too late", + "problemBullet2Link": "Log4Shell", + "problemBullet2": "Framework support alone does not protect against gaps in the foundation — Log4Shell clearly demonstrated this", + "problemBullet3": "The CRA will hold you liable for the entire software supply chain from 2027", + "componentsTitle": "Supported Components", + "componentsIntro": "Support & Care specifically covers the five most business-critical open source foundational components of the Java ecosystem. Together, they form the technical chain of trust for virtually every Java application.", + "temurin": { + "name": "Eclipse Temurin — Java Runtime", + "desc": "Leading vendor-independent OpenJDK distribution worldwide
Over 500,000 downloads per day
TCK-certified, AQAvit-verified, community-driven" + }, + "maven": { + "name": "Apache Maven — Build & Dependency Management", + "desc": "Over 75% of all Java projects use Maven
Approx. 2 billion downloads annually" + }, + "junit": { + "name": "JUnit — Test Framework", + "desc": "Over 1 billion downloads per month
Approx. 85% market share in the Java ecosystem" + }, + "log4j": { + "name": "Apache Log4j — Logging", + "desc": "Approx. 76% of all Java applications use Log4j
Business-critical for logging, monitoring and error analysis" + }, + "commons": { + "name": "Apache Commons — Standard Libraries", + "desc": "Approx. 49% of Java developers actively use Apache Commons
Modular collection: Lang, IO, Collections and more" + }, + "componentsHighlight": "In short: The essential foundation of the technical chain of trust for your Java applications.", + "layersTitle": "Where Support & Care Steps In", + "layersIntro": "Java applications can be divided into three layers:", + "pyramidAlt": "The 3 layers of a Java application", + "layer1": "Application-Specific Code", + "layer1Desc": "Your individual business and domain logic code. This layer is highly valuable but relatively small in scope — it builds on frameworks and foundational technologies.", + "layer2": "Frameworks & Application Platforms", + "layer2Desc": "Spring Boot, Quarkus, Jakarta EE and others. Commercial support from the respective vendors is widely available for this layer.", + "layer3": "Foundational Components — This is where Support & Care steps in.", + "layer3Desc": "Runtime environment, build and dependency management, standard libraries, logging and test frameworks. These components are used in virtually every Java project — yet professional support has been largely unavailable until now.", + "layersHighlight": "Framework support alone is not enough. The Log4Shell vulnerability demonstrated: A critical security flaw in a foundational component can affect millions of applications — despite up-to-date framework updates. Support & Care closes exactly this gap.", + "servicesTitle": "Our Services", + "servicesIntro": "All services are delivered directly by the maintainers and committers of the supported projects — not by a downstream support team.", + "lts": { + "name": "Long Term Support (LTS)", + "desc": "Continued support for the most important versions to help you better plan and organize your updates. You never have to rely on insecure or unmaintained versions." + }, + "security": { + "name": "Security Updates & Bugfixes", + "desc": "Early information and notifications about vulnerabilities and patches. Fast response times through direct access to the developers." + }, + "documentation": { + "name": "Documentation & Transparency", + "desc": "Support with SBOM strategies and technical documentation — in German or English. Transparent traceability of all changes." + }, + "workshops": { + "name": "Workshops & Consulting", + "desc": "Direct exchange with the maintainers and committers of the projects — in German or English. Individual consulting on migration, best practices and architectural decisions." + }, + "webinars": { + "name": "Regular Webinars & Status Updates", + "desc": "Quarterly webinars on current security risks, important version changes, best practice recommendations and concrete impacts on your OSS supply chain." + }, + "customBuilds": { + "name": "Custom Builds & Tooling", + "desc": "Tailored implementations directly by the maintainers — from special build configurations to individualized tooling solutions." + }, + "craTitle": "Prepared for the Cyber Resilience Act", + "craP1": "From 2027, manufacturers will be responsible for 100% of their software under the Cyber Resilience Act (CRA) — including all open source dependencies. This covers patch times, vulnerability management, documentation and long-term maintainability. Open Elements acts as an open source steward and actively shapes the regulatory framework. As a founding member of the Open Regulatory Compliance Working Group (ORC WG) of the Eclipse Foundation, we work together with leading open source foundations, major technology companies and EU representatives on concrete specifications and practical guidelines for CRA implementation.", + "craBulletTitle": "Support & Care specifically helps you with:", + "craBullet1": "Significant reduction of patch times", + "craBullet2": "Systematic vulnerability monitoring", + "craBullet3": "Predictable availability of updates", + "craBullet4": "Ensuring documentation and transparency (incl. SBOM)", + "craBullet5": "Long-term maintainability guarantee", + "craBullet6": "Prospectively: CRA-compliant attestations for supported projects", + "craHighlight": "Open Elements is a founding member of the ORC WG and works directly on the best practices that define how CRA compliance for open source software is implemented. This expertise flows directly into Support & Care.", + "containersTitle": "Hardened Containers for Government and Public Administration", + "containersP1": "This is also Support & Care: Hardened containers for the German public administration.", + "containersP2": "Open Elements belongs to an exclusive group of organizations authorized to provide hardened container images for container.gov.de — alongside the Center for Digital Sovereignty (ZenDiS) and the German Federal Foreign Office. For Support & Care customers, this means: The hardened Eclipse Temurin images for all current Java LTS versions (Java 11, 17, 21, 25+) are included in the service scope. Verified, signed and continuously checked against current vulnerability databases.", + "containersBulletTitle": "What distinguishes hardened containers:", + "containersBullet1": "Verified origin and quality assurance", + "containersBullet2": "Up-to-date dependencies without known vulnerabilities", + "containersBullet3": "Software Bill of Materials (SBOM) for full transparency", + "containersBullet4": "Cryptographic signing against tampering", + "containersBullet5": "Minimized attack surface through systematic hardening", + "containersImgAlt": "Open Elements delivers official hardened container images for the German public administration", + "modelTitle": "More Than Just Support: Our Model", + "modelP1": "Support & Care works differently from traditional vendor support. Together with us, you share the ongoing maintenance and improvement efforts for the supported open source components — openly, transparently and measurably.", + "modelSubtitle": "Support & Care follows three important principles:", + "modelPrinciple1": "Funds flow directly to the maintainers: Instead of layering superficial support on top, we invest in the vitality of each project's core. The people who actually maintain the code, provide security updates and develop new features are paid directly.", + "modelPrinciple2": "Your priorities in the roadmaps: Customer requirements are actively integrated into the development roadmaps of the supported projects. This way, enhancements directly reflect real business needs.", + "modelPrinciple3": "Proactive communication: You are not only informed when problems arise, but continuously kept up to date on relevant developments:", + "modelBullet1": "Security warnings and new patches", + "modelBullet2": "Planned API or major version changes", + "modelBullet3": "Recommendations for version updates and dependency cleanup", + "modelBullet4": "Trends and risks in the OSS ecosystem", + "modelHighlight": "Unused support hours do not expire — they flow directly into the further development of the open source components. Every subscription strengthens the projects you rely on.", + "modelP2": "We deliver flexible service models for sustainable security. Choose the model that fits your requirements in availability, compliance and SLA.", + "whyTitle": "Why Open Elements", + "whyP1": "We are the maintainers — not just consultants: Our team members are not external consultants who first need to get to know the projects. They are the people who maintain, develop and co-shape these projects within the foundations.", + "hendrikRole": "Founder & Eclipse Board Member", + "sandraRole": "Java Champion & OSS Maintainer", + "sebastianRole": "OSS Engineer & Maintainer Log4j", + "whyP2": "Open Elements is a well-known and active member of the open source community, contributing not only on a technical level but also in leadership roles across many open source foundations:", + "eclipseDesc": "We hold a seat on the Eclipse Foundation Board and are active members of working groups such as Eclipse Adoptium, Eclipse JakartaEE and the ORC WG.", + "lfDesc": "TODO", + "asfDesc": "TODO", + "whyHighlight": "Open source — done right. Our revenue from Support & Care flows directly into the supported open source projects.", + "faqTitle": "Frequently Asked Questions", + "faq1Q": "Is Support & Care only for Apache Maven?", + "faq1A": "No. Support & Care covers five business-critical Java foundational components: Eclipse Temurin, Apache Maven, JUnit, Apache Log4j and Apache Commons. The program started in 2024 with Maven and has been continuously expanded since then.", + "faq2Q": "Who provides the support?", + "faq2A": "Committers and maintainers of the respective open source projects — the people who actually write and maintain the code. No downstream support team, but direct access to the experts.", + "faq3Q": "What happens with my subscription fee?", + "faq3A": "The revenue flows transparently and traceably into the supported open source projects: payment of maintainers, security updates, bugfixes, documentation and infrastructure.", + "faq4Q": "Do I have to subscribe to all five components?", + "faq4A": "Get in touch — we tailor the offering to your specific requirements.", + "faq5Q": "Does Support & Care help with CRA compliance?", + "faq5A": "Yes. Support & Care addresses key CRA requirements: vulnerability monitoring, patch times, documentation, SBOM and long-term maintainability. Prospectively, we also support CRA-compliant attestations.", + "faq6Q": "In which languages is support provided?", + "faq6A": "German and English — for helpdesk requests as well as workshops, consulting and documentation.", + "faq7Q": "What is the difference to framework support (e.g. Spring Boot)?", + "faq7A": "Framework support covers the middle layer of your software stack. Support & Care covers the foundational layer underneath: runtime, build tools, logging, testing and utility libraries. Both complement each other — Log4Shell showed that framework support alone is not enough.", + "ctaTitle": "Secure the Foundation of Your Java Applications", + "ctaP1": "Let us discuss together how Support & Care can protect your software supply chain. Whether private sector or public administration — we will find the right model for you.", + "ctaContact": "Get in touch", + "footnote1": "Unused support hours expire monthly and flow into the further development of the supported projects.", + "footnote2": "Business days excluding public holidays in NRW.", + "footnote3": "Helpdesk GDPR-compliant and EU-hosted.", + "footnote4": "Experts are committers and maintainers of the supported OSS projects.", + "footnote5": "Webinars and calls via video conference." } }, "updates": { diff --git a/package.json b/package.json index e3b7b982..0f276536 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,8 @@ "build": "next build", "start": "next start", "lint": "eslint .", + "format:check": "prettier --check 'src/**'", + "format": "prettier --write 'src/**'", "test:e2e": "playwright test" }, "devDependencies": { @@ -25,6 +27,7 @@ "eslint": "^9.39.2", "eslint-config-next": "^16.1.0", "eslint-config-prettier": "^10.1.8", + "eslint-plugin-prettier": "^5.5.5", "npm-run-all": "^4.1.5", "postcss": "^8.5.6", "prettier": "^3.8.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a1f98651..4c10429f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -90,6 +90,9 @@ importers: eslint-config-prettier: specifier: ^10.1.8 version: 10.1.8(eslint@9.39.2(jiti@2.6.1)) + eslint-plugin-prettier: + specifier: ^5.5.5 + version: 5.5.5(eslint-config-prettier@10.1.8(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1))(prettier@3.8.0) npm-run-all: specifier: ^4.1.5 version: 4.1.5 @@ -449,105 +452,89 @@ packages: resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} cpu: [arm64] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-arm@1.2.4': resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} cpu: [arm] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-ppc64@1.2.4': resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} cpu: [ppc64] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-riscv64@1.2.4': resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} cpu: [riscv64] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-s390x@1.2.4': resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} cpu: [s390x] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-x64@1.2.4': resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} cpu: [x64] os: [linux] - libc: [glibc] '@img/sharp-libvips-linuxmusl-arm64@1.2.4': resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} cpu: [arm64] os: [linux] - libc: [musl] '@img/sharp-libvips-linuxmusl-x64@1.2.4': resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} cpu: [x64] os: [linux] - libc: [musl] '@img/sharp-linux-arm64@0.34.5': resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - libc: [glibc] '@img/sharp-linux-arm@0.34.5': resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] - libc: [glibc] '@img/sharp-linux-ppc64@0.34.5': resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ppc64] os: [linux] - libc: [glibc] '@img/sharp-linux-riscv64@0.34.5': resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [riscv64] os: [linux] - libc: [glibc] '@img/sharp-linux-s390x@0.34.5': resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] - libc: [glibc] '@img/sharp-linux-x64@0.34.5': resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - libc: [glibc] '@img/sharp-linuxmusl-arm64@0.34.5': resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - libc: [musl] '@img/sharp-linuxmusl-x64@0.34.5': resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - libc: [musl] '@img/sharp-wasm32@0.34.5': resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} @@ -618,28 +605,24 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [glibc] '@next/swc-linux-arm64-musl@16.1.0': resolution: {integrity: sha512-TojQnDRoX7wJWXEEwdfuJtakMDW64Q7NrxQPviUnfYJvAx5/5wcGE+1vZzQ9F17m+SdpFeeXuOr6v3jbyusYMQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [musl] '@next/swc-linux-x64-gnu@16.1.0': resolution: {integrity: sha512-quhNFVySW4QwXiZkZ34SbfzNBm27vLrxZ2HwTfFFO1BBP0OY1+pI0nbyewKeq1FriqU+LZrob/cm26lwsiAi8Q==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [glibc] '@next/swc-linux-x64-musl@16.1.0': resolution: {integrity: sha512-6JW0z2FZUK5iOVhUIWqE4RblAhUj1EwhZ/MwteGb//SpFTOHydnhbp3868gxalwea+mbOLWO6xgxj9wA9wNvNw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [musl] '@next/swc-win32-arm64-msvc@16.1.0': resolution: {integrity: sha512-+DK/akkAvvXn5RdYN84IOmLkSy87SCmpofJPdB8vbLmf01BzntPBSYXnMvnEEv/Vcf3HYJwt24QZ/s6sWAwOMQ==} @@ -698,42 +681,36 @@ packages: engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] - libc: [glibc] '@parcel/watcher-linux-arm-musl@2.5.4': resolution: {integrity: sha512-kGO8RPvVrcAotV4QcWh8kZuHr9bXi9a3bSZw7kFarYR0+fGliU7hd/zevhjw8fnvIKG3J9EO5G6sXNGCSNMYPQ==} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] - libc: [musl] '@parcel/watcher-linux-arm64-glibc@2.5.4': resolution: {integrity: sha512-KU75aooXhqGFY2W5/p8DYYHt4hrjHZod8AhcGAmhzPn/etTa+lYCDB2b1sJy3sWJ8ahFVTdy+EbqSBvMx3iFlw==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] - libc: [glibc] '@parcel/watcher-linux-arm64-musl@2.5.4': resolution: {integrity: sha512-Qx8uNiIekVutnzbVdrgSanM+cbpDD3boB1f8vMtnuG5Zau4/bdDbXyKwIn0ToqFhIuob73bcxV9NwRm04/hzHQ==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] - libc: [musl] '@parcel/watcher-linux-x64-glibc@2.5.4': resolution: {integrity: sha512-UYBQvhYmgAv61LNUn24qGQdjtycFBKSK3EXr72DbJqX9aaLbtCOO8+1SkKhD/GNiJ97ExgcHBrukcYhVjrnogA==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] - libc: [glibc] '@parcel/watcher-linux-x64-musl@2.5.4': resolution: {integrity: sha512-YoRWCVgxv8akZrMhdyVi6/TyoeeMkQ0PGGOf2E4omODrvd1wxniXP+DBynKoHryStks7l+fDAMUBRzqNHrVOpg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] - libc: [musl] '@parcel/watcher-win32-arm64@2.5.4': resolution: {integrity: sha512-iby+D/YNXWkiQNYcIhg8P5hSjzXEHaQrk2SLrWOUD7VeC4Ohu0WQvmV+HDJokZVJ2UjJ4AGXW3bx7Lls9Ln4TQ==} @@ -757,6 +734,10 @@ packages: resolution: {integrity: sha512-WYa2tUVV5HiArWPB3ydlOc4R2ivq0IDrlqhMi3l7mVsFEXNcTfxYFPIHXHXIh/ca/y/V5N4E1zecyxdIBjYnkQ==} engines: {node: '>= 10.0.0'} + '@pkgr/core@0.2.9': + resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + '@playwright/test@1.58.1': resolution: {integrity: sha512-6LdVIUERWxQMmUSSQi0I53GgCBYgM2RpGngCPY7hSeju+VrKjq3lvs7HpJoPbDiY5QM5EYRtRX5fvrinnMAz3w==} engines: {node: '>=18'} @@ -791,28 +772,24 @@ packages: engines: {node: '>=10'} cpu: [arm64] os: [linux] - libc: [glibc] '@swc/core-linux-arm64-musl@1.15.10': resolution: {integrity: sha512-4uAHO3nbfbrTcmO/9YcVweTQdx5fN3l7ewwl5AEK4yoC4wXmoBTEPHAVdKNe4r9+xrTgd4BgyPsy0409OjjlMw==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - libc: [musl] '@swc/core-linux-x64-gnu@1.15.10': resolution: {integrity: sha512-W0h9ONNw1pVIA0cN7wtboOSTl4Jk3tHq+w2cMPQudu9/+3xoCxpFb9ZdehwCAk29IsvdWzGzY6P7dDVTyFwoqg==} engines: {node: '>=10'} cpu: [x64] os: [linux] - libc: [glibc] '@swc/core-linux-x64-musl@1.15.10': resolution: {integrity: sha512-XQNZlLZB62S8nAbw7pqoqwy91Ldy2RpaMRqdRN3T+tAg6Xg6FywXRKCsLh6IQOadr4p1+lGnqM/Wn35z5a/0Vw==} engines: {node: '>=10'} cpu: [x64] os: [linux] - libc: [musl] '@swc/core-win32-arm64-msvc@1.15.10': resolution: {integrity: sha512-qnAGrRv5Nj/DATxAmCnJQRXXQqnJwR0trxLndhoHoxGci9MuguNIjWahS0gw8YZFjgTinbTxOwzatkoySihnmw==} @@ -893,28 +870,24 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [glibc] '@tailwindcss/oxide-linux-arm64-musl@4.1.18': resolution: {integrity: sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [musl] '@tailwindcss/oxide-linux-x64-gnu@4.1.18': resolution: {integrity: sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [glibc] '@tailwindcss/oxide-linux-x64-musl@4.1.18': resolution: {integrity: sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [musl] '@tailwindcss/oxide-wasm32-wasi@4.1.18': resolution: {integrity: sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==} @@ -1094,49 +1067,41 @@ packages: resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==} cpu: [arm64] os: [linux] - libc: [glibc] '@unrs/resolver-binding-linux-arm64-musl@1.11.1': resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==} cpu: [arm64] os: [linux] - libc: [musl] '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==} cpu: [ppc64] os: [linux] - libc: [glibc] '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==} cpu: [riscv64] os: [linux] - libc: [glibc] '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==} cpu: [riscv64] os: [linux] - libc: [musl] '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==} cpu: [s390x] os: [linux] - libc: [glibc] '@unrs/resolver-binding-linux-x64-gnu@1.11.1': resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==} cpu: [x64] os: [linux] - libc: [glibc] '@unrs/resolver-binding-linux-x64-musl@1.11.1': resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==} cpu: [x64] os: [linux] - libc: [musl] '@unrs/resolver-binding-wasm32-wasi@1.11.1': resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==} @@ -1558,6 +1523,20 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 + eslint-plugin-prettier@5.5.5: + resolution: {integrity: sha512-hscXkbqUZ2sPithAuLm5MXL+Wph+U7wHngPBv9OMWwlP8iaflyxpjTYZkmdgB4/vPIhemRlBEoLrH7UC1n7aUw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '>= 7.0.0 <10.0.0 || >=10.1.0' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + eslint-plugin-react-hooks@7.0.1: resolution: {integrity: sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==} engines: {node: '>=18'} @@ -1627,6 +1606,9 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + fast-glob@3.3.1: resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} engines: {node: '>=8.6.0'} @@ -2044,28 +2026,24 @@ packages: engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] - libc: [glibc] lightningcss-linux-arm64-musl@1.30.2: resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] - libc: [musl] lightningcss-linux-x64-gnu@1.30.2: resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] - libc: [glibc] lightningcss-linux-x64-musl@1.30.2: resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] - libc: [musl] lightningcss-win32-arm64-msvc@1.30.2: resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==} @@ -2458,6 +2436,10 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} + prettier-linter-helpers@1.0.1: + resolution: {integrity: sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==} + engines: {node: '>=6.0.0'} + prettier@3.8.0: resolution: {integrity: sha512-yEPsovQfpxYfgWNhCfECjG5AQaO+K3dp6XERmOepyPDVqcJm+bjyCVO3pmU+nAPe0N5dDvekfGezt/EIiRe1TA==} engines: {node: '>=14'} @@ -2727,6 +2709,10 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + synckit@0.11.12: + resolution: {integrity: sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==} + engines: {node: ^14.18.0 || >=16.0.0} + tailwind-scrollbar@4.0.2: resolution: {integrity: sha512-wAQiIxAPqk0MNTPptVe/xoyWi27y+NRGnTwvn4PQnbvB9kp8QUBiGl/wsfoVBHnQxTmhXJSNt9NHTmcz9EivFA==} engines: {node: '>=12.13.0'} @@ -3414,6 +3400,8 @@ snapshots: '@parcel/watcher-win32-ia32': 2.5.4 '@parcel/watcher-win32-x64': 2.5.4 + '@pkgr/core@0.2.9': {} + '@playwright/test@1.58.1': dependencies: playwright: 1.58.1 @@ -4296,6 +4284,15 @@ snapshots: safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 + eslint-plugin-prettier@5.5.5(eslint-config-prettier@10.1.8(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1))(prettier@3.8.0): + dependencies: + eslint: 9.39.2(jiti@2.6.1) + prettier: 3.8.0 + prettier-linter-helpers: 1.0.1 + synckit: 0.11.12 + optionalDependencies: + eslint-config-prettier: 10.1.8(eslint@9.39.2(jiti@2.6.1)) + eslint-plugin-react-hooks@7.0.1(eslint@9.39.2(jiti@2.6.1)): dependencies: '@babel/core': 7.28.5 @@ -4407,6 +4404,8 @@ snapshots: fast-deep-equal@3.1.3: {} + fast-diff@1.3.0: {} + fast-glob@3.3.1: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -5408,6 +5407,10 @@ snapshots: prelude-ls@1.2.1: {} + prettier-linter-helpers@1.0.1: + dependencies: + fast-diff: 1.3.0 + prettier@3.8.0: {} prism-react-renderer@2.4.1(react@19.2.3): @@ -5770,6 +5773,10 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} + synckit@0.11.12: + dependencies: + '@pkgr/core': 0.2.9 + tailwind-scrollbar@4.0.2(react@19.2.3)(tailwindcss@4.1.18): dependencies: prism-react-renderer: 2.4.1(react@19.2.3) diff --git a/public/support-care-maven/component-logos/apache-commons.svg b/public/support-care-maven/component-logos/apache-commons.svg new file mode 100644 index 00000000..3594bd62 --- /dev/null +++ b/public/support-care-maven/component-logos/apache-commons.svg @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/support-care-maven/component-logos/apache-log4j.png b/public/support-care-maven/component-logos/apache-log4j.png new file mode 100644 index 00000000..b6d34cec Binary files /dev/null and b/public/support-care-maven/component-logos/apache-log4j.png differ diff --git a/public/support-care-maven/component-logos/apache-maven.svg b/public/support-care-maven/component-logos/apache-maven.svg new file mode 100644 index 00000000..24f2345a --- /dev/null +++ b/public/support-care-maven/component-logos/apache-maven.svg @@ -0,0 +1,998 @@ + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/support-care-maven/component-logos/eclipse-temurin.svg b/public/support-care-maven/component-logos/eclipse-temurin.svg new file mode 100644 index 00000000..26cf42bc --- /dev/null +++ b/public/support-care-maven/component-logos/eclipse-temurin.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/support-care-maven/component-logos/junit.svg b/public/support-care-maven/component-logos/junit.svg new file mode 100644 index 00000000..c72cdbe8 --- /dev/null +++ b/public/support-care-maven/component-logos/junit.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/support-care-maven/diagram-1.png b/public/support-care-maven/diagram-1.png deleted file mode 100644 index 643882f2..00000000 Binary files a/public/support-care-maven/diagram-1.png and /dev/null differ diff --git a/public/support-care-maven/diagram.png b/public/support-care-maven/diagram.png deleted file mode 100644 index 88a07d67..00000000 Binary files a/public/support-care-maven/diagram.png and /dev/null differ diff --git a/public/support-care-maven/foundation-logos/afs.svg b/public/support-care-maven/foundation-logos/afs.svg new file mode 100644 index 00000000..f1084dfb --- /dev/null +++ b/public/support-care-maven/foundation-logos/afs.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/support-care-maven/foundation-logos/eclipse.png b/public/support-care-maven/foundation-logos/eclipse.png new file mode 100644 index 00000000..37e6996d Binary files /dev/null and b/public/support-care-maven/foundation-logos/eclipse.png differ diff --git a/public/support-care-maven/foundation-logos/lf.svg b/public/support-care-maven/foundation-logos/lf.svg new file mode 100644 index 00000000..e8df47f8 --- /dev/null +++ b/public/support-care-maven/foundation-logos/lf.svg @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/support-care-landingpage/networking.png b/public/support-care-maven/networking.png similarity index 100% rename from public/support-care-landingpage/networking.png rename to public/support-care-maven/networking.png diff --git a/public/support-care-maven/oe-delivers-container.png b/public/support-care-maven/oe-delivers-container.png new file mode 100644 index 00000000..2872524c Binary files /dev/null and b/public/support-care-maven/oe-delivers-container.png differ diff --git a/public/support-care-landingpage/os-benefits-de.png b/public/support-care-maven/os-benefits-de.png similarity index 100% rename from public/support-care-landingpage/os-benefits-de.png rename to public/support-care-maven/os-benefits-de.png diff --git a/public/support-care-landingpage/os-benefits.png b/public/support-care-maven/os-benefits.png similarity index 100% rename from public/support-care-landingpage/os-benefits.png rename to public/support-care-maven/os-benefits.png diff --git a/public/support-care-maven/pyramid.png b/public/support-care-maven/pyramid.png new file mode 100644 index 00000000..c3aa3c77 Binary files /dev/null and b/public/support-care-maven/pyramid.png differ diff --git a/public/support-care-maven/roadmap.png b/public/support-care-maven/roadmap.png deleted file mode 100644 index 03bd6351..00000000 Binary files a/public/support-care-maven/roadmap.png and /dev/null differ diff --git a/public/support-care-landingpage/roundtable.png b/public/support-care-maven/roundtable.png similarity index 100% rename from public/support-care-landingpage/roundtable.png rename to public/support-care-maven/roundtable.png diff --git a/public/support-care-maven/services-pictograms/custom-containers.svg b/public/support-care-maven/services-pictograms/custom-containers.svg new file mode 100644 index 00000000..954177ac --- /dev/null +++ b/public/support-care-maven/services-pictograms/custom-containers.svg @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/support-care-maven/services-pictograms/documentation.svg b/public/support-care-maven/services-pictograms/documentation.svg new file mode 100644 index 00000000..1443bca5 --- /dev/null +++ b/public/support-care-maven/services-pictograms/documentation.svg @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/support-care-maven/services-pictograms/long-term-support.svg b/public/support-care-maven/services-pictograms/long-term-support.svg new file mode 100755 index 00000000..f1e89fb9 --- /dev/null +++ b/public/support-care-maven/services-pictograms/long-term-support.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/support-care-maven/services-pictograms/security.svg b/public/support-care-maven/services-pictograms/security.svg new file mode 100755 index 00000000..3d0eb765 --- /dev/null +++ b/public/support-care-maven/services-pictograms/security.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/support-care-maven/services-pictograms/workshops.svg b/public/support-care-maven/services-pictograms/workshops.svg new file mode 100644 index 00000000..1d48cc04 --- /dev/null +++ b/public/support-care-maven/services-pictograms/workshops.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/support-care-maven/support-and-care-logo.svg b/public/support-care-maven/support-and-care-logo.svg new file mode 100644 index 00000000..831ad3cc --- /dev/null +++ b/public/support-care-maven/support-and-care-logo.svg @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/support-care-landingpage/support-care-logo.svg b/public/support-care-maven/support-care-logo.svg similarity index 100% rename from public/support-care-landingpage/support-care-logo.svg rename to public/support-care-maven/support-care-logo.svg diff --git a/public/support-care-landingpage/tree.png b/public/support-care-maven/tree.png similarity index 100% rename from public/support-care-landingpage/tree.png rename to public/support-care-maven/tree.png diff --git a/src/app/[locale]/[...rest]/page.tsx b/src/app/[locale]/[...rest]/page.tsx index 322919b9..385e7e6a 100644 --- a/src/app/[locale]/[...rest]/page.tsx +++ b/src/app/[locale]/[...rest]/page.tsx @@ -27,7 +27,10 @@ function localePrefix(locale: string): string { return locale === 'de' ? '/de' : ''; } -function maybeRedirectLegacyPath(locale: string, requestPath: string): string | null { +function maybeRedirectLegacyPath( + locale: string, + requestPath: string, +): string | null { const normalizedPath = requestPath.replace(/^\/+|\/+$/g, ''); const prefix = localePrefix(locale); @@ -39,7 +42,11 @@ function maybeRedirectLegacyPath(locale: string, requestPath: string): string | return `${prefix}/about`; } - if (REDIRECTS_TO_POSTS.has(normalizedPath) || normalizedPath.startsWith('categories/') || normalizedPath.startsWith('tags/')) { + if ( + REDIRECTS_TO_POSTS.has(normalizedPath) || + normalizedPath.startsWith('categories/') || + normalizedPath.startsWith('tags/') + ) { return `${prefix}/posts`; } @@ -62,7 +69,14 @@ function findMarkdownFile(locale: string, requestPath: string): string | null { return null; } -async function loadPageData(locale: string, requestPath: string): Promise<{ title: string; description?: string; contentHtml: string } | null> { +async function loadPageData( + locale: string, + requestPath: string, +): Promise<{ + title: string; + description?: string; + contentHtml: string; +} | null> { const markdownFile = findMarkdownFile(locale, requestPath); if (!markdownFile) { @@ -72,16 +86,22 @@ async function loadPageData(locale: string, requestPath: string): Promise<{ titl const fileContents = fs.readFileSync(markdownFile, 'utf8'); const { data, content } = matter(fileContents); const transformedContent = transformHugoShortcodes(content); - const processedContent = await remark().use(remarkGfm).use(html, { sanitize: false }).process(transformedContent); + const processedContent = await remark() + .use(remarkGfm) + .use(html, { sanitize: false }) + .process(transformedContent); return { title: typeof data.title === 'string' ? data.title : 'Open Elements', - description: typeof data.description === 'string' ? data.description : undefined, + description: + typeof data.description === 'string' ? data.description : undefined, contentHtml: processedContent.toString(), }; } -export async function generateMetadata({ params }: CatchAllPageProps): Promise { +export async function generateMetadata({ + params, +}: CatchAllPageProps): Promise { const { locale, rest } = await params; const requestPath = rest.join('/'); @@ -105,7 +125,9 @@ export async function generateMetadata({ params }: CatchAllPageProps): Promise + params: Promise<{ locale: string }>; }) { - const { locale } = await params - redirect(`/${locale}/employees/hendrik`) + const { locale } = await params; + redirect(`/${locale}/employees/hendrik`); } diff --git a/src/app/[locale]/about/layout.tsx b/src/app/[locale]/about/layout.tsx index b7619868..215993e7 100644 --- a/src/app/[locale]/about/layout.tsx +++ b/src/app/[locale]/about/layout.tsx @@ -1,14 +1,22 @@ -import type { Metadata } from 'next' +import type { Metadata } from 'next'; export const metadata: Metadata = { title: 'About us - Open Elements', - description: 'An overview of the engagement of Open Elements and its partners and customers.', - keywords: ['Open Source', 'Java', 'OSS', 'Open Source Support', 'Java Support'], + description: + 'An overview of the engagement of Open Elements and its partners and customers.', + keywords: [ + 'Open Source', + 'Java', + 'OSS', + 'Open Source Support', + 'Java Support', + ], openGraph: { type: 'website', url: 'https://open-elements.com/about', title: 'About us - Open Elements', - description: 'An overview of the engagement of Open Elements and its partners and customers.', + description: + 'An overview of the engagement of Open Elements and its partners and customers.', siteName: 'Open Elements', images: [ { @@ -20,12 +28,12 @@ export const metadata: Metadata = { ], locale: 'en_US', }, -} +}; export default function AboutLayout({ children, }: { - children: React.ReactNode + children: React.ReactNode; }) { - return <>{children} + return <>{children}; } diff --git a/src/app/[locale]/about/page.tsx b/src/app/[locale]/about/page.tsx index 8d34f406..87d3b519 100644 --- a/src/app/[locale]/about/page.tsx +++ b/src/app/[locale]/about/page.tsx @@ -1,37 +1,37 @@ -'use client' +'use client'; -import { useState, useEffect } from 'react' -import Image from 'next/image' -import AboutSidebar from '@/components/about/AboutSidebar' -import TeamSection from '@/components/about/TeamSection' -import EngagementsSection from '@/components/about/EngagementsSection' -import PartnersSection from '@/components/about/PartnersSection' +import { useState, useEffect } from 'react'; +import Image from 'next/image'; +import AboutSidebar from '@/components/about/AboutSidebar'; +import TeamSection from '@/components/about/TeamSection'; +import EngagementsSection from '@/components/about/EngagementsSection'; +import PartnersSection from '@/components/about/PartnersSection'; export default function AboutPage() { - const [activeSection, setActiveSection] = useState('') + const [activeSection, setActiveSection] = useState(''); useEffect(() => { const options = { root: null, rootMargin: '0px', threshold: 0.2, - } + }; - const observer = new IntersectionObserver((entries) => { - entries.forEach((entry) => { + const observer = new IntersectionObserver(entries => { + entries.forEach(entry => { if (entry.isIntersecting) { - setActiveSection(entry.target.id) + setActiveSection(entry.target.id); } - }) - }, options) + }); + }, options); - const sections = document.querySelectorAll('.scroll-section') - sections.forEach((section) => observer.observe(section)) + const sections = document.querySelectorAll('.scroll-section'); + sections.forEach(section => observer.observe(section)); return () => { - sections.forEach((section) => observer.unobserve(section)) - } - }, []) + sections.forEach(section => observer.unobserve(section)); + }; + }, []); return ( <> @@ -90,11 +90,11 @@ export default function AboutPage() { />
- - +
@@ -103,6 +103,5 @@ export default function AboutPage() {
- - ) + ); } diff --git a/src/app/[locale]/contact/layout.tsx b/src/app/[locale]/contact/layout.tsx index ba8d9d74..5dad72c3 100644 --- a/src/app/[locale]/contact/layout.tsx +++ b/src/app/[locale]/contact/layout.tsx @@ -1,14 +1,16 @@ -import type { Metadata } from 'next' +import type { Metadata } from 'next'; export const metadata: Metadata = { title: 'Contact us - Open Elements', - description: 'Get in touch with Open Elements. Schedule a meeting, send us an email, or give us a call.', + description: + 'Get in touch with Open Elements. Schedule a meeting, send us an email, or give us a call.', keywords: ['Contact', 'Open Elements', 'Get in touch', 'Schedule meeting'], openGraph: { type: 'website', url: 'https://open-elements.com/contact', title: 'Contact us - Open Elements', - description: 'Get in touch with Open Elements. Schedule a meeting, send us an email, or give us a call.', + description: + 'Get in touch with Open Elements. Schedule a meeting, send us an email, or give us a call.', siteName: 'Open Elements', images: [ { @@ -20,12 +22,12 @@ export const metadata: Metadata = { ], locale: 'en_US', }, -} +}; export default function ContactLayout({ children, }: { - children: React.ReactNode + children: React.ReactNode; }) { - return <>{children} + return <>{children}; } diff --git a/src/app/[locale]/contact/page.tsx b/src/app/[locale]/contact/page.tsx index 8550f7ea..1f856c73 100644 --- a/src/app/[locale]/contact/page.tsx +++ b/src/app/[locale]/contact/page.tsx @@ -1,13 +1,13 @@ -'use client' +'use client'; -import { useTranslations } from 'next-intl' -import Image from 'next/image' -import CalendlyButton from '@/components/contact/CalendlyButton' -import ContactInfo from '@/components/contact/ContactInfo' +import { useTranslations } from 'next-intl'; +import Image from 'next/image'; +import CalendlyButton from '@/components/contact/CalendlyButton'; +import ContactInfo from '@/components/contact/ContactInfo'; export default function ContactPage() { - const t = useTranslations('contact') - + const t = useTranslations('contact'); + return (
@@ -43,7 +43,7 @@ export default function ContactPage() {
- +
- + - +
- ) + ); } diff --git a/src/app/[locale]/dlt-lecture/page.tsx b/src/app/[locale]/dlt-lecture/page.tsx index 706614e0..fd7c0cd7 100644 --- a/src/app/[locale]/dlt-lecture/page.tsx +++ b/src/app/[locale]/dlt-lecture/page.tsx @@ -1,32 +1,34 @@ -import Image from 'next/image' -import type { Metadata } from 'next' -import { getTranslations } from 'next-intl/server' -import { Link } from '@/i18n/routing' -import deQuotes from '@/data/de/quotes.json' -import enQuotes from '@/data/en/quotes.json' +import Image from 'next/image'; +import type { Metadata } from 'next'; +import { getTranslations } from 'next-intl/server'; +import { Link } from '@/i18n/routing'; +import deQuotes from '@/data/de/quotes.json'; +import enQuotes from '@/data/en/quotes.json'; interface DltLecturePageProps { params: Promise<{ - locale: string - }> + locale: string; + }>; } interface Quote { - id: string - name: string - title: string - image?: string - text: string + id: string; + name: string; + title: string; + image?: string; + text: string; } function getDltQuote(locale: string) { - const quotes = (locale === 'de' ? deQuotes : enQuotes) as Quote[] - return quotes.find((quote) => quote.id === 'fabian-dlt') + const quotes = (locale === 'de' ? deQuotes : enQuotes) as Quote[]; + return quotes.find(quote => quote.id === 'fabian-dlt'); } -export async function generateMetadata({ params }: DltLecturePageProps): Promise { - const { locale } = await params - const t = await getTranslations({ locale, namespace: 'dltLecture' }) +export async function generateMetadata({ + params, +}: DltLecturePageProps): Promise { + const { locale } = await params; + const t = await getTranslations({ locale, namespace: 'dltLecture' }); return { title: t('metaTitle'), @@ -38,17 +40,17 @@ export async function generateMetadata({ params }: DltLecturePageProps): Promise siteName: 'Open Elements', locale: locale === 'de' ? 'de_DE' : 'en_US', }, - } + }; } export default async function DltLecturePage({ params }: DltLecturePageProps) { - const { locale } = await params - const t = await getTranslations({ locale, namespace: 'dltLecture' }) - const quote = getDltQuote(locale) - const bulletPoints = t.raw('bulletPoints') as string[] - const quoteName = quote?.name ?? t('quoteNameFallback') - const quoteTitle = quote?.title ?? t('quoteTitleFallback') - const quoteText = quote?.text ?? t('quoteTextFallback') + const { locale } = await params; + const t = await getTranslations({ locale, namespace: 'dltLecture' }); + const quote = getDltQuote(locale); + const bulletPoints = t.raw('bulletPoints') as string[]; + const quoteName = quote?.name ?? t('quoteNameFallback'); + const quoteTitle = quote?.title ?? t('quoteTitleFallback'); + const quoteText = quote?.text ?? t('quoteTextFallback'); return (
@@ -82,9 +84,12 @@ export default async function DltLecturePage({ params }: DltLecturePageProps) {

{t.rich('intro', { - hendrik: (chunks) => {chunks}, - oth: (chunks) => ( - + hendrik: chunks => {chunks}, + oth: chunks => ( + {chunks} ), @@ -98,7 +103,7 @@ export default async function DltLecturePage({ params }: DltLecturePageProps) {

{t('excerptIntro')}

    - {bulletPoints.map((bulletPoint) => ( + {bulletPoints.map(bulletPoint => (
  • {bulletPoint}
  • ))}
@@ -113,8 +118,7 @@ export default async function DltLecturePage({ params }: DltLecturePageProps) { viewBox="0 0 64 56" fill="none" xmlns="http://www.w3.org/2000/svg" - aria-hidden="true" - > + aria-hidden="true">
{quoteName}
-

{quoteText}

+

+ {quoteText} +

- ) + ); } diff --git a/src/app/[locale]/employees/[slug]/page.tsx b/src/app/[locale]/employees/[slug]/page.tsx index 5ce00f78..c58d39a8 100644 --- a/src/app/[locale]/employees/[slug]/page.tsx +++ b/src/app/[locale]/employees/[slug]/page.tsx @@ -1,47 +1,49 @@ -import Image from 'next/image' -import { notFound } from 'next/navigation' -import type { Metadata } from 'next' -import teamDataEn from '@/data/en/team.json' -import teamDataDe from '@/data/de/team.json' +import Image from 'next/image'; +import { notFound } from 'next/navigation'; +import type { Metadata } from 'next'; +import teamDataEn from '@/data/en/team.json'; +import teamDataDe from '@/data/de/team.json'; interface TeamMember { - id: string - firstName: string - lastName: string - bio: string - picture: string - role: string - socials?: Array<{ name: string; link: string; icon: string }> + id: string; + firstName: string; + lastName: string; + bio: string; + picture: string; + role: string; + socials?: Array<{ name: string; link: string; icon: string }>; } function getMember(locale: string, slug: string): TeamMember | undefined { - const teamData = locale === 'de' ? teamDataDe : teamDataEn - return teamData.find((member) => member.id === slug) + const teamData = locale === 'de' ? teamDataDe : teamDataEn; + return teamData.find(member => member.id === slug); } export async function generateStaticParams() { - const slugs = Array.from(new Set([...teamDataEn, ...teamDataDe].map((member) => member.id))) + const slugs = Array.from( + new Set([...teamDataEn, ...teamDataDe].map(member => member.id)), + ); - return ['en', 'de'].flatMap((locale) => - slugs.map((slug) => ({ + return ['en', 'de'].flatMap(locale => + slugs.map(slug => ({ locale, slug, - })) - ) + })), + ); } export async function generateMetadata({ params, }: { - params: Promise<{ locale: string; slug: string }> + params: Promise<{ locale: string; slug: string }>; }): Promise { - const { locale, slug } = await params - const member = getMember(locale, slug) ?? getMember('en', slug) + const { locale, slug } = await params; + const member = getMember(locale, slug) ?? getMember('en', slug); if (!member) { return { title: 'Employee Not Found - Open Elements', - } + }; } return { @@ -59,19 +61,19 @@ export async function generateMetadata({ }, ], }, - } + }; } export default async function EmployeePage({ params, }: { - params: Promise<{ locale: string; slug: string }> + params: Promise<{ locale: string; slug: string }>; }) { - const { locale, slug } = await params - const member = getMember(locale, slug) ?? getMember('en', slug) + const { locale, slug } = await params; + const member = getMember(locale, slug) ?? getMember('en', slug); if (!member) { - notFound() + notFound(); } return ( @@ -127,16 +129,17 @@ export default async function EmployeePage({
{member.bio}
{member.socials && member.socials.length > 0 ? ( @@ -145,5 +148,5 @@ export default async function EmployeePage({ - ) + ); } diff --git a/src/app/[locale]/impressum/page.tsx b/src/app/[locale]/impressum/page.tsx index 0ecb7653..7a3499fc 100644 --- a/src/app/[locale]/impressum/page.tsx +++ b/src/app/[locale]/impressum/page.tsx @@ -1,17 +1,20 @@ -import Image from 'next/image' -import type { Metadata } from 'next' +import Image from 'next/image'; +import type { Metadata } from 'next'; interface ImpressumPageProps { params: Promise<{ - locale: string - }> + locale: string; + }>; } -export async function generateMetadata({ params }: ImpressumPageProps): Promise { - const { locale } = await params +export async function generateMetadata({ + params, +}: ImpressumPageProps): Promise { + const { locale } = await params; - const title = locale === 'de' ? 'Impressum - Open Elements' : 'Impressum - Open Elements' - const description = locale === 'de' ? 'Impressum' : 'Impressum' + const title = + locale === 'de' ? 'Impressum - Open Elements' : 'Impressum - Open Elements'; + const description = locale === 'de' ? 'Impressum' : 'Impressum'; return { title, @@ -23,11 +26,11 @@ export async function generateMetadata({ params }: ImpressumPageProps): Promise< siteName: 'Open Elements', locale: locale === 'de' ? 'de_DE' : 'en_US', }, - } + }; } export default async function ImpressumPage({ params }: ImpressumPageProps) { - const { locale } = await params + const { locale } = await params; const contentHtml = locale === 'de' @@ -59,7 +62,7 @@ export default async function ImpressumPage({ params }: ImpressumPageProps) { Sales tax identification number: DE 355815175

Responsible for the content according to § 55 paragraph 2 RStV: Hendrik Ebbers, Gerhart-Hauptmann-Str. 49B, 51379 Leverkusen

-` +`; return (
@@ -88,5 +91,5 @@ export default async function ImpressumPage({ params }: ImpressumPageProps) {
- ) -} \ No newline at end of file + ); +} diff --git a/src/app/[locale]/layout.tsx b/src/app/[locale]/layout.tsx index 9feab9ab..c252fdd5 100644 --- a/src/app/[locale]/layout.tsx +++ b/src/app/[locale]/layout.tsx @@ -2,31 +2,35 @@ import { NextIntlClientProvider } from 'next-intl'; import { getMessages } from 'next-intl/server'; import { notFound } from 'next/navigation'; import { routing } from '@/i18n/routing'; -import type { Metadata } from 'next' -import { Montserrat } from 'next/font/google' -import Navbar from '@/components/Navbar' -import Footer from '@/components/Footer' +import type { Metadata } from 'next'; +import { Montserrat } from 'next/font/google'; +import Navbar from '@/components/Navbar'; +import Footer from '@/components/Footer'; import Script from 'next/script'; -const montserrat = Montserrat({ +const montserrat = Montserrat({ subsets: ['latin'], weight: ['300', '400', '500', '600', '700', '800', '900'], variable: '--font-montserrat', display: 'swap', -}) +}); export function generateStaticParams() { - return routing.locales.map((locale) => ({ locale })); + return routing.locales.map(locale => ({ locale })); } -export async function generateMetadata({ params }: { params: Promise<{ locale: string }> }): Promise { +export async function generateMetadata({ + params, +}: { + params: Promise<{ locale: string }>; +}): Promise { const { locale } = await params; - + const titles = { en: 'Open Elements - Open Source made right', de: 'Open Elements - Open Source, aber richtig', }; - + const descriptions = { en: 'Open Source made right - Open Elements is a modern company with a clear focus on Open Source and Java', de: 'Open Source, aber richtig - Open Elements ist ein modernes Unternehmen mit einem Fokus auf Open Source und Java', @@ -34,13 +38,24 @@ export async function generateMetadata({ params }: { params: Promise<{ locale: s return { title: titles[locale as keyof typeof titles] || titles.en, - description: descriptions[locale as keyof typeof descriptions] || descriptions.en, - keywords: ['open source', 'Java', 'OSS', 'open source Support', 'Java Support'], + description: + descriptions[locale as keyof typeof descriptions] || descriptions.en, + keywords: [ + 'open source', + 'Java', + 'OSS', + 'open source Support', + 'Java Support', + ], openGraph: { type: 'website', - url: locale === 'de' ? 'https://open-elements.com/de' : 'https://open-elements.com/', + url: + locale === 'de' + ? 'https://open-elements.com/de' + : 'https://open-elements.com/', title: titles[locale as keyof typeof titles] || titles.en, - description: descriptions[locale as keyof typeof descriptions] || descriptions.en, + description: + descriptions[locale as keyof typeof descriptions] || descriptions.en, siteName: 'Open Elements', images: [ { @@ -71,19 +86,27 @@ export default async function LocaleLayout({ const messages = await getMessages(); return ( - + - +
{children}
- - ) + ); } diff --git a/src/components/support-care/CareCard.tsx b/src/components/support-care/CareCard.tsx index 7fd997e9..4c628a2c 100644 --- a/src/components/support-care/CareCard.tsx +++ b/src/components/support-care/CareCard.tsx @@ -1,15 +1,15 @@ -import Image from 'next/image' -import Link from 'next/link' +import Image from 'next/image'; +import Link from 'next/link'; interface CareCard { - title: string - text: string - logo: string - link?: string + title: string; + text: string; + logo: string; + link?: string; } interface CareCardProps { - card: CareCard + card: CareCard; } export default function CareCard({ card }: CareCardProps) { @@ -19,18 +19,18 @@ export default function CareCard({ card }: CareCardProps) {
{card.link ? ( - {`${card.title} ) : ( - {`${card.title}
-

{card.title}

-
+ {card.title} + +
- ) + ); } diff --git a/src/data-temp/landingpage.json b/src/data-temp/landingpage.json index b35621a4..8c289137 100644 --- a/src/data-temp/landingpage.json +++ b/src/data-temp/landingpage.json @@ -1,10 +1,10 @@ { - "category_navbar_visible": true, - "open_knowledge_visible": true, - "open_events_visible": true, - "open_source_visible": true, - "open_doors_visible": true, - "open_data_visible": false, - "open_office_visible": true, - "open_diversity_visible": false -} \ No newline at end of file + "category_navbar_visible": true, + "open_knowledge_visible": true, + "open_events_visible": true, + "open_source_visible": true, + "open_doors_visible": true, + "open_data_visible": false, + "open_office_visible": true, + "open_diversity_visible": false +} diff --git a/src/data-temp/mainMenu.json b/src/data-temp/mainMenu.json index 50b36bb7..0f52ca10 100644 --- a/src/data-temp/mainMenu.json +++ b/src/data-temp/mainMenu.json @@ -89,4 +89,4 @@ "visibleInNavigation": true, "visibleInFooter": true } -] \ No newline at end of file +] diff --git a/src/data-temp/social.json b/src/data-temp/social.json index eb7ee565..7f23fd99 100644 --- a/src/data-temp/social.json +++ b/src/data-temp/social.json @@ -9,4 +9,4 @@ "icon": "mdi:linkedin", "link": "https://www.linkedin.com/company/open-elements" } -] \ No newline at end of file +] diff --git a/src/data/de/engagements.json b/src/data/de/engagements.json index cdf6c623..f9604434 100644 --- a/src/data/de/engagements.json +++ b/src/data/de/engagements.json @@ -111,4 +111,4 @@ "link": "https://www.ijug.eu/de/home/", "visible": true } -] \ No newline at end of file +] diff --git a/src/data/de/partners.json b/src/data/de/partners.json index 1b905e4f..6c2de38b 100644 --- a/src/data/de/partners.json +++ b/src/data/de/partners.json @@ -62,4 +62,4 @@ "link": "https://duh-it.de", "visible": true } -] \ No newline at end of file +] diff --git a/src/data/de/quotes.json b/src/data/de/quotes.json index 2387eb2e..92956a85 100644 --- a/src/data/de/quotes.json +++ b/src/data/de/quotes.json @@ -6,4 +6,4 @@ "image": "fabian.jpeg", "text": "Das Fach Blockchain, welches als fachspezifisches Wahlpflichtmodul an der Fakultät Informatik/Mathematik gewählt werden kann, schafft einen Einblick in das Thema digitaler Währungen. Dabei wird auch kurz auf die Historie, aber vor allem zügig auf die technische Seite eingegangen. Die Gliederung in Blockveranstaltungen ermöglicht die Erarbeitung eines tieferen Verständnisses, teilweise auch im Team mit mehreren Kommilitonen. Der Programmieraspekt des Fachs schafft ein hochinteressantes Seminar, bei welchem sowohl Kryptointeressierte als auch herkömmliche Softwareentwickler auf ihre Kosten kommen. Hendrik Ebbers schafft mit seiner offenen und direkten Art eine entspannte, aber produktive Arbeitsatmosphäre, bei der man gerne aktiv am Seminar teilnimmt und mitwirkt. Mir persönlich hat das Fach trotz initial weniger fachlicher Berührungspunkte ausgesprochen gut gefallen. Ich würde die gleiche Wahl nochmal treffen." } -] \ No newline at end of file +] diff --git a/src/data/en/engagements.json b/src/data/en/engagements.json index 53050906..0919c982 100644 --- a/src/data/en/engagements.json +++ b/src/data/en/engagements.json @@ -111,4 +111,4 @@ "link": "https://www.ijug.eu/de/home/", "visible": true } -] \ No newline at end of file +] diff --git a/src/data/en/partners.json b/src/data/en/partners.json index 4b26c48b..0e1fa3c2 100644 --- a/src/data/en/partners.json +++ b/src/data/en/partners.json @@ -62,4 +62,4 @@ "link": "https://duh-it.de", "visible": true } -] \ No newline at end of file +] diff --git a/src/data/en/quotes.json b/src/data/en/quotes.json index 1099e3cb..258181b7 100644 --- a/src/data/en/quotes.json +++ b/src/data/en/quotes.json @@ -6,4 +6,4 @@ "image": "fabian.jpeg", "text": "The subject of blockchain, which can be chosen as a subject-specific compulsory elective module at the Faculty of Computer Science/Mathematics, provides an insight into the topic of digital currencies. The history is also briefly discussed, but above all the technical side is dealt with quickly. The division into block courses enables students to develop a deeper understanding, sometimes in teams with several fellow students. The programming aspect of the subject creates a highly interesting seminar in which both crypto enthusiasts and conventional software developers get their money's worth. With his open and direct manner, Hendrik Ebbers creates a relaxed but productive working atmosphere in which students enjoy actively participating and contributing to the seminar. Personally, I really enjoyed the subject despite initially having fewer technical points of contact. I would make the same choice again." } -] \ No newline at end of file +] diff --git a/src/data/landingpage.json b/src/data/landingpage.json index b35621a4..8c289137 100644 --- a/src/data/landingpage.json +++ b/src/data/landingpage.json @@ -1,10 +1,10 @@ { - "category_navbar_visible": true, - "open_knowledge_visible": true, - "open_events_visible": true, - "open_source_visible": true, - "open_doors_visible": true, - "open_data_visible": false, - "open_office_visible": true, - "open_diversity_visible": false -} \ No newline at end of file + "category_navbar_visible": true, + "open_knowledge_visible": true, + "open_events_visible": true, + "open_source_visible": true, + "open_doors_visible": true, + "open_data_visible": false, + "open_office_visible": true, + "open_diversity_visible": false +} diff --git a/src/data/mainMenu.json b/src/data/mainMenu.json index 30c70a09..91f4f791 100644 --- a/src/data/mainMenu.json +++ b/src/data/mainMenu.json @@ -89,4 +89,4 @@ "visibleInNavigation": true, "visibleInFooter": true } -] \ No newline at end of file +] diff --git a/src/data/social.json b/src/data/social.json index eb7ee565..7f23fd99 100644 --- a/src/data/social.json +++ b/src/data/social.json @@ -9,4 +9,4 @@ "icon": "mdi:linkedin", "link": "https://www.linkedin.com/company/open-elements" } -] \ No newline at end of file +] diff --git a/src/data/updates.ts b/src/data/updates.ts index 084d4ef6..0ec88877 100644 --- a/src/data/updates.ts +++ b/src/data/updates.ts @@ -20,13 +20,17 @@ export const updatesData: Update[] = [ title: 'Refactored Documentation:', collapsible: true, items: [ - { text: 'docs: added changelog conflict resolution examples to docs/common_issues.md' }, + { + text: 'docs: added changelog conflict resolution examples to docs/common_issues.md', + }, { text: 'docs: added "One Issue Per Pull Request" section to examples/sdk_developers/common_issues.md.', }, { text: 'docs: update pyproject.toml maintainers list.' }, { text: 'docs: added to README a social follow section' }, - { text: 'docs: added changelog conflict resolution examples to docs/common_issues.md' }, + { + text: 'docs: added changelog conflict resolution examples to docs/common_issues.md', + }, { text: 'docs: added "One Issue Per Pull Request" section to examples/sdk_developers/common_issues.md.', }, @@ -72,16 +76,24 @@ export const updatesData: Update[] = [ { text: 'Quis quam pellentesque at sed in sed orci. Purus varius non arcu cursus malesuada convallis nisl sem pulvinar.', }, - { text: 'Nisl commodo quis blandit nibh. Odio mauris id eget quis tempor.' }, - { text: 'Sed gravida morbi elit a sit. Nec non amet tortor purus neque amet libero.' }, + { + text: 'Nisl commodo quis blandit nibh. Odio mauris id eget quis tempor.', + }, + { + text: 'Sed gravida morbi elit a sit. Nec non amet tortor purus neque amet libero.', + }, { text: 'Consequat consectetur cras neque mattis. In quam aliquam mattis ut risus risus dis proin lorem.', }, { text: 'Quis quam pellentesque at sed in sed orci. Purus varius non arcu cursus malesuada convallis nisl sem pulvinar.', }, - { text: 'Nisl commodo quis blandit nibh. Odio mauris id eget quis tempor.' }, - { text: 'Sed gravida morbi elit a sit. Nec non amet tortor purus neque amet libero.' }, + { + text: 'Nisl commodo quis blandit nibh. Odio mauris id eget quis tempor.', + }, + { + text: 'Sed gravida morbi elit a sit. Nec non amet tortor purus neque amet libero.', + }, { text: 'Consequat consectetur cras neque mattis. In quam aliquam mattis ut risus risus dis proin lorem.', }, @@ -107,7 +119,8 @@ export const updatesData: Update[] = [ tags: ['Tortor', 'Tellus', 'Mattis', 'Luctus', 'Tellus'], contributors: Array(23).fill({ name: 'Contributor', - avatar: 'https://cdn.pixabay.com/photo/2025/04/02/18/48/background-9509852_1280.jpg', + avatar: + 'https://cdn.pixabay.com/photo/2025/04/02/18/48/background-9509852_1280.jpg', url: '#', }), contributorNote: @@ -137,7 +150,8 @@ export const updatesData: Update[] = [ assets: 2, contributors: Array(5).fill({ name: 'Contributor', - avatar: 'https://cdn.pixabay.com/photo/2025/04/02/18/48/background-9509852_1280.jpg', + avatar: + 'https://cdn.pixabay.com/photo/2025/04/02/18/48/background-9509852_1280.jpg', url: '#', }), contributorNote: diff --git a/src/i18n/request.ts b/src/i18n/request.ts index 0bdf2b63..5d5f234f 100644 --- a/src/i18n/request.ts +++ b/src/i18n/request.ts @@ -12,6 +12,6 @@ export default getRequestConfig(async ({ requestLocale }) => { return { locale, - messages: (await import(`../../locales/${locale}.json`)).default + messages: (await import(`../../locales/${locale}.json`)).default, }; }); diff --git a/src/i18n/routing.ts b/src/i18n/routing.ts index 072e1f7a..c2129434 100644 --- a/src/i18n/routing.ts +++ b/src/i18n/routing.ts @@ -17,4 +17,5 @@ export const routing = defineRouting({ // Lightweight wrappers around Next.js' navigation APIs // that will consider the routing configuration -export const { Link, redirect, usePathname, useRouter } = createNavigation(routing); +export const { Link, redirect, usePathname, useRouter } = + createNavigation(routing); diff --git a/src/lib/markdown.ts b/src/lib/markdown.ts index b8cf413a..b65ef499 100644 --- a/src/lib/markdown.ts +++ b/src/lib/markdown.ts @@ -43,7 +43,8 @@ const EXTERNAL_LINK_ICON_HTML = ''; const HEADING_ANCHOR_ICON_HTML = ''; -const CODE_BLOCK_PATTERN = /
([\s\S]*?)<\/code><\/pre>/gi;
+const CODE_BLOCK_PATTERN =
+  /
([\s\S]*?)<\/code><\/pre>/gi;
 const PRISM_TOKEN_COLORS = new Map([
   ['comment', '#75715e'],
   ['prolog', '#75715e'],
@@ -93,9 +94,9 @@ loadLanguages([
   'xml',
 ]);
 
-Prism.hooks.add('wrap', (environment) => {
+Prism.hooks.add('wrap', environment => {
   const tokenClass = environment.classes.find(
-    (className) => className !== 'token' && PRISM_TOKEN_COLORS.has(className),
+    className => className !== 'token' && PRISM_TOKEN_COLORS.has(className),
   );
 
   if (!tokenClass) {
@@ -158,7 +159,10 @@ function normalizeLegacySlugSegment(slug: string): string {
     .replace(/^-+|-+$/g, '');
 }
 
-function isDateBasedSlugMatch(candidatePath: string, requestedPath: string): boolean {
+function isDateBasedSlugMatch(
+  candidatePath: string,
+  requestedPath: string,
+): boolean {
   if (candidatePath === requestedPath) {
     return true;
   }
@@ -177,13 +181,16 @@ function isDateBasedSlugMatch(candidatePath: string, requestedPath: string): boo
     return false;
   }
 
-  return normalizeLegacySlugSegment(candidateSegments[3]) === normalizeLegacySlugSegment(requestedSegments[3]);
+  return (
+    normalizeLegacySlugSegment(candidateSegments[3]) ===
+    normalizeLegacySlugSegment(requestedSegments[3])
+  );
 }
 
 function decodePathSegments(pathValue: string): string {
   return pathValue
     .split('/')
-    .map((segment) => {
+    .map(segment => {
       try {
         return decodeURIComponent(segment);
       } catch {
@@ -232,7 +239,12 @@ function getPostFilename(slugPath: string, locale: string): string | null {
     const fileContents = fs.readFileSync(fullPath, 'utf8');
     const { data } = matter(fileContents);
 
-    if (isDateBasedSlugMatch(generatePostPath(data as PostFrontmatter), decodedSlugPath)) {
+    if (
+      isDateBasedSlugMatch(
+        generatePostPath(data as PostFrontmatter),
+        decodedSlugPath,
+      )
+    ) {
       return filename;
     }
   }
@@ -272,7 +284,10 @@ export function getPostLocaleAlternates(
   if (files.includes(enFile)) {
     const fullPath = path.join(postsDirectory, enFile);
     const { data } = matter(fs.readFileSync(fullPath, 'utf8'));
-    alternates.push({ locale: 'en', slugPath: generatePostPath(data as PostFrontmatter) });
+    alternates.push({
+      locale: 'en',
+      slugPath: generatePostPath(data as PostFrontmatter),
+    });
   }
 
   // Check German version
@@ -280,7 +295,10 @@ export function getPostLocaleAlternates(
   if (files.includes(deFile)) {
     const fullPath = path.join(postsDirectory, deFile);
     const { data } = matter(fs.readFileSync(fullPath, 'utf8'));
-    alternates.push({ locale: 'de', slugPath: generatePostPath(data as PostFrontmatter) });
+    alternates.push({
+      locale: 'de',
+      slugPath: generatePostPath(data as PostFrontmatter),
+    });
   }
 
   return alternates;
@@ -327,12 +345,15 @@ function ensureSafeRel(attributes: string): string {
   const relPattern = /\brel\s*=\s*(["'])(.*?)\1/i;
 
   if (relPattern.test(attributes)) {
-    return attributes.replace(relPattern, (_match, quote: string, relValue: string) => {
-      const tokens = new Set(relValue.split(/\s+/).filter(Boolean));
-      tokens.add('noopener');
-      tokens.add('noreferrer');
-      return `rel=${quote}${Array.from(tokens).join(' ')}${quote}`;
-    });
+    return attributes.replace(
+      relPattern,
+      (_match, quote: string, relValue: string) => {
+        const tokens = new Set(relValue.split(/\s+/).filter(Boolean));
+        tokens.add('noopener');
+        tokens.add('noreferrer');
+        return `rel=${quote}${Array.from(tokens).join(' ')}${quote}`;
+      },
+    );
   }
 
   return `${attributes} rel="noopener noreferrer"`;
@@ -439,18 +460,23 @@ function extractHeadingText(headingHtml: string): string {
 
 function appendHtmlAttribute(attributes: string, attribute: string): string {
   const normalizedAttributes = attributes.trimEnd();
-  return normalizedAttributes ? `${normalizedAttributes} ${attribute}` : ` ${attribute}`;
+  return normalizedAttributes
+    ? `${normalizedAttributes} ${attribute}`
+    : ` ${attribute}`;
 }
 
 function ensureHtmlClass(attributes: string, className: string): string {
   const classPattern = /\bclass\s*=\s*(["'])(.*?)\1/i;
 
   if (classPattern.test(attributes)) {
-    return attributes.replace(classPattern, (_match, quote: string, classValue: string) => {
-      const classes = new Set(classValue.split(/\s+/).filter(Boolean));
-      classes.add(className);
-      return `class=${quote}${Array.from(classes).join(' ')}${quote}`;
-    });
+    return attributes.replace(
+      classPattern,
+      (_match, quote: string, classValue: string) => {
+        const classes = new Set(classValue.split(/\s+/).filter(Boolean));
+        classes.add(className);
+        return `class=${quote}${Array.from(classes).join(' ')}${quote}`;
+      },
+    );
   }
 
   return appendHtmlAttribute(attributes, `class="${className}"`);
@@ -480,7 +506,10 @@ function decorateHeadlinesWithAnchors(contentHtml: string): string {
 
       let nextAttributes = attributes;
       if (!existingIdMatch) {
-        nextAttributes = appendHtmlAttribute(nextAttributes, `id="${headingId}"`);
+        nextAttributes = appendHtmlAttribute(
+          nextAttributes,
+          `id="${headingId}"`,
+        );
       }
       nextAttributes = ensureHtmlClass(nextAttributes, 'scroll-mt-10');
 
@@ -518,7 +547,10 @@ function normalizeCodeLanguage(language: string): string | null {
   ];
 
   for (const [prefix, mappedLanguage] of aliases) {
-    if (normalizedLanguage === prefix || normalizedLanguage.startsWith(prefix)) {
+    if (
+      normalizedLanguage === prefix ||
+      normalizedLanguage.startsWith(prefix)
+    ) {
       return mappedLanguage;
     }
   }
@@ -565,7 +597,10 @@ function highlightCodeBlocks(contentHtml: string): string {
  * By default, posts with showInBlog === false are excluded (for the blog listing UI).
  * Pass includeHidden = true to include all posts (e.g. for sitemap generation).
  */
-export function getAllPosts(locale: string, { includeHidden = false }: { includeHidden?: boolean } = {}): PostData[] {
+export function getAllPosts(
+  locale: string,
+  { includeHidden = false }: { includeHidden?: boolean } = {},
+): PostData[] {
   const files = fs.readdirSync(postsDirectory);
 
   const posts: PostData[] = [];
@@ -680,7 +715,9 @@ export async function getPostBySlug(
       .process(transformedContent);
     const contentHtml = highlightCodeBlocks(
       decorateHeadlinesWithAnchors(
-        decorateExternalLinks(centerStandaloneHtmlImages(processedContent.toString())),
+        decorateExternalLinks(
+          centerStandaloneHtmlImages(processedContent.toString()),
+        ),
       ),
     );
 
@@ -691,7 +728,10 @@ export async function getPostBySlug(
       contentHtml,
     };
   } catch (error) {
-    console.error(`Error fetching post ${slugPath} for locale ${locale}:`, error);
+    console.error(
+      `Error fetching post ${slugPath} for locale ${locale}:`,
+      error,
+    );
     return null;
   }
 }
diff --git a/src/lib/remark-hugo-shortcodes.ts b/src/lib/remark-hugo-shortcodes.ts
index 97984869..145e5c59 100644
--- a/src/lib/remark-hugo-shortcodes.ts
+++ b/src/lib/remark-hugo-shortcodes.ts
@@ -55,31 +55,34 @@ class ShortcodeRegistry {
    */
   private registerDefaultHandlers(): void {
     // Centered image shortcode
-    this.register('centered-image', (attrs) => {
+    this.register('centered-image', attrs => {
       const src = attrs.src || '';
       const alt = this.escapeHtml(attrs.alt || '');
       const width = attrs.width || '100%';
       const showCaption = attrs.showCaption === 'true';
-      
+
       const imageHtml = `${alt}`;
-      const captionHtml = showCaption && alt ? `

${alt}

` : ''; - + const captionHtml = + showCaption && alt + ? `

${alt}

` + : ''; + return `
${imageHtml}${captionHtml}
`; }); // Relative reference shortcode - this.register('relref', (attrs) => { + this.register('relref', attrs => { // Extract path from first attribute or 'path' key const path = attrs._content || attrs.path || ''; return `/${path.replace(/^\/+/, '')}`; }); - this.register('ref', (attrs) => { + this.register('ref', attrs => { const path = attrs._content || attrs.path || ''; return `/${path.replace(/^\/+/, '')}`; }); - this.register('youtube', (attrs) => { + this.register('youtube', attrs => { const videoId = this.escapeHtml(attrs._content || attrs.id || ''); if (!videoId) { @@ -107,7 +110,7 @@ class ShortcodeRegistry { '"': '"', "'": ''', }; - return text.replace(/[&<>"']/g, (char) => escapeMap[char] || char); + return text.replace(/[&<>"']/g, char => escapeMap[char] || char); } } @@ -127,7 +130,10 @@ function replaceShortcodes(text: string, registry: ShortcodeRegistry): string { if (handler) { const replacement = handler(shortcode.attributes); - result = result.slice(0, shortcode.startIndex) + replacement + result.slice(shortcode.endIndex); + result = + result.slice(0, shortcode.startIndex) + + replacement + + result.slice(shortcode.endIndex); } } @@ -142,8 +148,10 @@ export function transformHugoShortcodes(text: string): string { * Parser for Hugo shortcodes */ class ShortcodeParser { - private static readonly SHORTCODE_PATTERN = /\{\{<\s*([a-z-]+)\s+([^>]*?)\s*>\}\}/g; - private static readonly ATTRIBUTE_PATTERN = /(\w+)=(?:"([^"]*)"|([^\s"]+))|"([^"]*)"|([^\s"]+)/g; + private static readonly SHORTCODE_PATTERN = + /\{\{<\s*([a-z-]+)\s+([^>]*?)\s*>\}\}/g; + private static readonly ATTRIBUTE_PATTERN = + /(\w+)=(?:"([^"]*)"|([^\s"]+))|"([^"]*)"|([^\s"]+)/g; /** * Parse all shortcodes in a text string @@ -213,21 +221,25 @@ export const remarkHugoShortcodes: Plugin<[], Root> = () => { const registry = new ShortcodeRegistry(); return (tree: Root) => { - visit(tree, 'text', (node: Text, index: number | undefined, parent: Parent | undefined) => { - if (!node.value || typeof index !== 'number' || !parent) { - return; - } + visit( + tree, + 'text', + (node: Text, index: number | undefined, parent: Parent | undefined) => { + if (!node.value || typeof index !== 'number' || !parent) { + return; + } - const result = replaceShortcodes(node.value, registry); + const result = replaceShortcodes(node.value, registry); - // Replace text node with HTML node if changes were made - if (result !== node.value) { - const htmlNode: Html = { - type: 'html', - value: result, - }; - parent.children[index] = htmlNode; - } - }); + // Replace text node with HTML node if changes were made + if (result !== node.value) { + const htmlNode: Html = { + type: 'html', + value: result, + }; + parent.children[index] = htmlNode; + } + }, + ); }; }; diff --git a/src/lib/updates.ts b/src/lib/updates.ts index 9ebb64b7..8719bebd 100644 --- a/src/lib/updates.ts +++ b/src/lib/updates.ts @@ -39,7 +39,9 @@ function parseMarkdownSections(content: string): { } const title = line.substring(3).trim(); - isOverview = title.toLowerCase() === 'overview' || title.toLowerCase() === 'überblick'; + isOverview = + title.toLowerCase() === 'overview' || + title.toLowerCase() === 'überblick'; if (!isOverview) { // Start new section @@ -57,8 +59,8 @@ function parseMarkdownSections(content: string): { const comment = line.trim().slice(4, -3).trim(); if (currentSection) { // Parse metadata from comment - const parts = comment.split(',').map((p) => p.trim()); - parts.forEach((part) => { + const parts = comment.split(',').map(p => p.trim()); + parts.forEach(part => { if (!currentSection) return; if (part === 'collapsible') { currentSection.metadata.collapsible = true; @@ -87,12 +89,12 @@ function parseMarkdownSections(content: string): { } // Convert raw sections to UpdateSection format - const sections: UpdateSection[] = rawSections.map((rawSection) => { + const sections: UpdateSection[] = rawSections.map(rawSection => { // Parse list items from content const items = rawSection.content .split('\n') - .filter((line) => line.trim().startsWith('-')) - .map((line) => ({ + .filter(line => line.trim().startsWith('-')) + .map(line => ({ text: line.trim().substring(1).trim(), })); @@ -128,7 +130,7 @@ export function getUpdateFiles(locale: string): string[] { const files = fs.readdirSync(updatesDirectory); return files - .filter((file) => file.endsWith(`.${locale}.md`)) + .filter(file => file.endsWith(`.${locale}.md`)) .sort() .reverse(); // Most recent first } @@ -136,7 +138,10 @@ export function getUpdateFiles(locale: string): string[] { /** * Parse a single update file */ -export function parseUpdateFile(filename: string, locale: string): Update | null { +export function parseUpdateFile( + filename: string, + locale: string, +): Update | null { const fullPath = path.join(updatesDirectory, filename); if (!fs.existsSync(fullPath)) { @@ -199,7 +204,10 @@ export function getAllUpdates(locale: string): Update[] { /** * Get a single update by version */ -export function getUpdateByVersion(version: string, locale: string): Update | null { +export function getUpdateByVersion( + version: string, + locale: string, +): Update | null { const filename = `${version}.${locale}.md`; return parseUpdateFile(filename, locale); } diff --git a/src/middleware.ts b/src/middleware.ts index 289a7469..dd8e49c7 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -2,12 +2,16 @@ import createMiddleware from 'next-intl/middleware'; import { routing } from './i18n/routing'; const intlMiddleware = createMiddleware(routing); -const STATIC_FILE_EXTENSION_PATTERN = /\.(?:avif|bmp|css|gif|ico|jpeg|jpg|js|json|map|mp4|png|svg|txt|webm|webp|woff|woff2|xml)$/i; +const STATIC_FILE_EXTENSION_PATTERN = + /\.(?:avif|bmp|css|gif|ico|jpeg|jpg|js|json|map|mp4|png|svg|txt|webm|webp|woff|woff2|xml)$/i; export default function middleware(req: any) { const { pathname } = req.nextUrl; - if (pathname.endsWith('sitemap.xml') || STATIC_FILE_EXTENSION_PATTERN.test(pathname)) { + if ( + pathname.endsWith('sitemap.xml') || + STATIC_FILE_EXTENSION_PATTERN.test(pathname) + ) { return; } return intlMiddleware(req); @@ -17,5 +21,10 @@ export const config = { // Match all pathnames except for // - ... if they start with `/api`, `/_next` or `/_vercel` // - ... if they contain a dot (e.g. `favicon.ico`) - matcher: ['/', '/posts/:path*', '/(de|en)/:path*', '/((?!api|_next|_vercel|.*\\..*).*)'], + matcher: [ + '/', + '/posts/:path*', + '/(de|en)/:path*', + '/((?!api|_next|_vercel|.*\\..*).*)', + ], }; diff --git a/src/next-env.d.ts b/src/next-env.d.ts deleted file mode 100644 index 1b3be084..00000000 --- a/src/next-env.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -/// -/// - -// NOTE: This file should not be edited -// see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/src/types/css.d.ts b/src/types/css.d.ts index 3255cfe2..35306c6f 100644 --- a/src/types/css.d.ts +++ b/src/types/css.d.ts @@ -1 +1 @@ -declare module '*.css'; \ No newline at end of file +declare module '*.css';