diff --git a/components/CodeAnimation/AsyncAPIcontent.tsx b/components/CodeAnimation/AsyncAPIcontent.tsx new file mode 100644 index 000000000000..1706b10f35b9 --- /dev/null +++ b/components/CodeAnimation/AsyncAPIcontent.tsx @@ -0,0 +1,7 @@ +/** + * @description Renders the content related to AsyncAPI in a styled div container. + * This is used as the default content for the "AsyncAPI Document" tab in the DemoAnimation component. + */ +export default function renderAsyncAPIContent() { + return
content here
; +} diff --git a/components/CodeAnimation/CodeGeneration.tsx b/components/CodeAnimation/CodeGeneration.tsx new file mode 100644 index 000000000000..3c4cb94a17c2 --- /dev/null +++ b/components/CodeAnimation/CodeGeneration.tsx @@ -0,0 +1,11 @@ +/** + * @description Renders the content related to code generation in a styled div container. + * This is used as the content for the "Code Generation" tab in the DemoAnimation component. + */ +export default function renderCodeGeneration() { + return ( +
+

content here

+
+ ); +} diff --git a/components/CodeAnimation/DemoAnimation.tsx b/components/CodeAnimation/DemoAnimation.tsx new file mode 100644 index 000000000000..5dce0da6fd1f --- /dev/null +++ b/components/CodeAnimation/DemoAnimation.tsx @@ -0,0 +1,70 @@ +import React, { useState } from 'react'; + +import Container from '../layout/Container'; +import renderAsyncAPIContent from './AsyncAPIcontent'; +import renderCodeGeneration from './CodeGeneration'; +import renderDocumentation from './Documentation'; + +/** + * @description A React component that displays a demo animation interface with three tabs: + * "AsyncAPI Document," "Code Generation," and "Documentation." The content of each tab + * dynamically updates based on the active tab selected by the user. + * + */ +export default function DemoAnimation() { + const [activeTab, setActiveTab] = useState('AsyncAPI Document'); + const tabs = ['AsyncAPI Document', 'Code Generation', 'Documentation']; + + /** + * @description Determines and renders the content for the currently active tab. + */ + const renderContent = () => { + switch (activeTab) { + case 'Code Generation': + return renderCodeGeneration() ||

No content available

; + case 'Documentation': + return renderDocumentation() ||

No content available

; + default: + return renderAsyncAPIContent() ||

No content available

; + } + }; + + return ( +
+ +

Sneak Peek Into The Real Process

+

+ One of our main goals is to improve the current state of Event +
+ Driven Architecture (EDA!) +

+ +
+ {tabs.map((tab) => ( + + ))} +
+ +
+
+
{renderContent()}
+
+
+
+
+ ); +} diff --git a/components/CodeAnimation/Documentation.tsx b/components/CodeAnimation/Documentation.tsx new file mode 100644 index 000000000000..1bdb59b21590 --- /dev/null +++ b/components/CodeAnimation/Documentation.tsx @@ -0,0 +1,11 @@ +/** + * @description Renders the documentation content in a styled container. + * This is used as the content for the "Documentation" tab in the DemoAnimation component. + */ +export default function renderDocumentation() { + return ( +
+

Documentation

+
+ ); +} diff --git a/components/DemoAnimation.tsx b/components/DemoAnimation.tsx deleted file mode 100644 index 1748d0c6ca2b..000000000000 --- a/components/DemoAnimation.tsx +++ /dev/null @@ -1,383 +0,0 @@ -import React, { useEffect, useState } from 'react'; -import Typing from 'react-typist-component'; - -import { HeadingLevel, HeadingTypeStyle } from '@/types/typography/Heading'; - -import OpenInStudioButton from './buttons/OpenInStudioButton'; -import ArrowRight from './icons/ArrowRight'; -import MacWindow from './MacWindow'; -import Heading from './typography/Heading'; - -interface IDemoAnimationProps { - className?: string; -} - -interface ICursorProps { - className?: string; -} - -/** - * @description A component that displays a cursor for the typing animation - * @param {string} props.className - The class name for the component - */ -function Cursor({ className = '' }: ICursorProps) { - return ( - - ); -} - -/** - * @description A component that displays a demo animation of an AsyncAPI document - * @param {string} props.className - The class name for the component - */ -export default function DemoAnimation({ className = '' }: IDemoAnimationProps) { - const [started] = useState(true); - const [showInfo, setShowInfo] = useState(false); - const [showChannelsAndOperation, setShowChannelsAndOperation] = useState(false); - const [showUntilMessagePayload, setShowUntilMessagePayload] = useState(false); - const [showDisplayName, setShowDisplayName] = useState(false); - const [showEmail, setShowEmail] = useState(false); - const [showDisplayNameDescription, setShowDisplayNameDescription] = useState(false); - const [showEmailDescription, setShowEmailDescription] = useState(false); - const [finished, setFinished] = useState(false); - const [showControls, setShowControls] = useState(false); - const typingDelay = 60; - - useEffect(() => { - if (finished) { - setTimeout(() => { - setShowControls(true); - }, 2000); - } - }, [finished]); - - /** - * @description classes that displays a cursor for the typing animation - * @param {boolean} condition - The condition to determine which class to apply - */ - function transitionClassNames(condition: boolean) { - return `transition-all duration-500 ease-in-out overflow-hidden ${condition ? 'opacity-100 max-h-auto' : 'max-h-0 opacity-0'}`; - } - - /** - * @description A component that displays a cursor for the typing animation - */ - function renderTyping(children: React.ReactNode, callback: () => void) { - return ( - } onTypingDone={callback}> - {children} - - ); - } - - /** - * @description A component that displays info block - */ - function renderInfoBlock(callback: () => void) { - const descriptionCallback = () => setFinished(true); - - const common = ( - <> -
- asyncapi: 3.0.0 -
-
- info: -
-
-   title: Account Service -
-
-   version: 1.0.0 -
- - - ); - - if (showEmailDescription) { - return ( - <> - {common} - } onTypingDone={descriptionCallback}> -
-   description: This service is in charge of processing - user signups :rocket: -
-
- - ); - } - - return renderTyping(common, callback); - } - - /** - * @description A component that displays channels and operation block - */ - function renderChannelsOperationBlock(callback: () => void) { - return renderTyping( - <> -
- channels: -
-
-   userSignedup: -
-
-     address: - 'user/signedup' -
-
-     messages: -
-
-       userSignedupMessage: -
-
-         $ref: - '#/components/messages/UserSignedUp' -
-
- operations: -
-
-   processUserSignups: -
-
-     action: - 'receive' -
-
-     channel: -
-
-       $ref: - '#/channels/userSignedup' -
- - , - callback - ); - } - - /** - * @description A component that displays until message payload block - */ - function renderUntilMessagePayload(callback: () => void) { - return renderTyping( - <> -
- components: -
-
-   messages: -
-
-     UserSignedUp: -
-
-       payload: -
-
-         type: - object -
- , - callback - ); - } - - /** - * @description A component that displays display name block - */ - function renderDisplayName(callback: () => void) { - const descriptionCallback = () => setShowDisplayNameDescription(true); - - const common = ( - <> -
-         properties: -
-
- -           displayName: - -
-
- -             type: - - string -
- - ); - - if (showEmail) { - return ( - <> - {common} - } onTypingDone={descriptionCallback}> -
- -             description: - - Name of the user -
-
- - ); - } - - return renderTyping(<>{common}, callback); - } - - /** - * @description A component that displays email block - */ - function renderEmail(callback: () => void) { - const descriptionCallback = () => setShowEmailDescription(true); - - const common = ( - <> -
-           email: -
-
- -             type: - - string -
-
- -             format: - - email -
- - ); - - if (showDisplayNameDescription) { - return ( - <> - {common} - } onTypingDone={descriptionCallback}> -
- -             description: - - Email of the user -
-
- - ); - } - - return renderTyping(common, callback); - } - - return ( -
-
-
- - {(showEmailDescription || started) && renderInfoBlock(() => setShowInfo(true))} - {showInfo && renderChannelsOperationBlock(() => setShowChannelsAndOperation(true))} - {showChannelsAndOperation && renderUntilMessagePayload(() => setShowUntilMessagePayload(true))} - {(showUntilMessagePayload || showEmail) && renderDisplayName(() => setShowDisplayName(true))} - {(showDisplayName || showDisplayNameDescription) && renderEmail(() => setShowEmail(true))} - -
-
-
- - Play with it! - -

- Open this example on AsyncAPI Studio to get a better taste of the specification. No signup is required! -

- -
- -
-

Account Service 1.0.0

-

This service is in charge of processing user signups 🚀

-
- -
- RECEIVES{' '} - user/signedup -
- -
-
Accepts the following message:
-
- Payload{' '} - {' '} - Object -
-
-
-
displayName
-
-
String
-
- Name of the user -
-
-
-
-
email
-
-
- String - email -
-
Email of the user
-
-
- -
Additional properties are allowed.
-
- -
- {/* eslint-disable-next-line react/jsx-no-comment-textnodes */} -
// Example
-
 
-
{'{'}
-
-   "displayName":{' '} - "Eve & Chan", -
-
-   "email":{' '} - "info@asyncapi.io" -
-
{'}'}
-
-
-
-
-
-
-
-
- ); -} diff --git a/components/Hero.tsx b/components/Hero.tsx index c0609e837569..69544d5071fc 100644 --- a/components/Hero.tsx +++ b/components/Hero.tsx @@ -1,18 +1,15 @@ import React from 'react'; import { HeadingLevel, HeadingTypeStyle } from '@/types/typography/Heading'; -import { ParagraphTypeStyle } from '@/types/typography/Paragraph'; import { useTranslation } from '../utils/i18n'; -import AlgoliaSearch, { SearchButton } from './AlgoliaSearch'; // Import AlgoliaSearch component import Button from './buttons/Button'; import AnnouncementHero from './campaigns/AnnouncementHero'; -import DemoAnimation from './DemoAnimation'; +import DemoAnimation from './CodeAnimation/DemoAnimation'; import Features from './features'; -import ArrowRight from './icons/ArrowRight'; -import IconLoupe from './icons/Loupe'; +import Container from './layout/Container'; +import DiamondSponsors from './sponsors/DiamondSponsors'; import Heading from './typography/Heading'; -import Paragraph from './typography/Paragraph'; interface HeroProps { className?: string; @@ -33,56 +30,50 @@ export default function Hero({ className = '' }: HeroProps) {
- {t('main.header')} {t('main.subHeader')} + {t('main.header')} + + + {t('main.subHeader')} - {t('main.body_pretext')} {t('main.body_boldtext')} - {t('main.body_posttext')} + {t('main.body_pretext')} {t('main.body_boldtext')} {t('main.body_posttext')}
- - {t('main.slogan_text')}{' '} - - {t('main.slogan_link')} - -
+
+ + + {t('sponsors.diamondTitle')} + + + +
+
-
); diff --git a/components/SupportUs/SupportUs.tsx b/components/SupportUs/SupportUs.tsx index 399fb0ca5dc8..1a99cdd45c53 100644 --- a/components/SupportUs/SupportUs.tsx +++ b/components/SupportUs/SupportUs.tsx @@ -1,5 +1,8 @@ import React from 'react'; +import Heading from '../typography/Heading'; +import Paragraph from '../typography/Paragraph'; +import TextLink from '../typography/TextLink'; import { items } from './SupportItemsList'; interface SupportUsProps { @@ -16,6 +19,14 @@ interface SupportUsProps { export default function SupportUs({ className = '' }: SupportUsProps): React.ReactNode { return (
+ Supporters + + The following companies support us by letting us use their products for free. Interested in supporting us too? + + Email us + {' '} + for more info +
} href={href} iconPosition={iconPosition} target={target} diff --git a/components/buttons/ICSFileButton.tsx b/components/buttons/ICSFileButton.tsx index 1f529cee3c10..69fe3475f62f 100644 --- a/components/buttons/ICSFileButton.tsx +++ b/components/buttons/ICSFileButton.tsx @@ -4,7 +4,6 @@ import { ButtonIconPosition } from '@/types/components/buttons/ButtonPropsType'; import type { IButtonDefaultProps } from '../../types/components/buttons/types'; import { useTranslation } from '../../utils/i18n'; -import IconCalendar from '../icons/Calendar'; import Button from './Button'; interface IICSFButtonProps extends IButtonDefaultProps {} @@ -29,7 +28,6 @@ export default function ICSFButton({ return (
- + +
+
+ + {t('community.title')} + + {t('community.subtitle')} +
+
+
-
-
- -
-
-
- - {t('community.meetingTitle')} - - - {t('community.meetingDesc')} - - {t('community.meetingLink')} - -
    -
  • - -
  • -
  • - -
  • -
  • - -
  • -
-
-
-
- - - - +
+ +
+ + + + {t('community.meetingTitle')} + + {t('community.meetingDesc')} +
+ +

OR

+ +
+
@@ -165,67 +97,8 @@ export default function HomePage() { - - - - {t('sponsors.sponsorCTATitle')} - - - {t('sponsors.sponsorCTADesc')} - - {t('sponsors.sponsorCTALink')} - - - +
- - - {t('sponsors.supportedByTitle')} - - - {t('sponsors.supportedByPretext')} - - {t('sponsors.supportedByLink')} - {' '} - {t('sponsors.supportedByPosttext')} - - - - - - {t('testimonials.title')} - -
    - - - - -
-
); diff --git a/public/locales/de/landing-page.json b/public/locales/de/landing-page.json index ab75bdab207f..7e48a59f860a 100644 --- a/public/locales/de/landing-page.json +++ b/public/locales/de/landing-page.json @@ -5,41 +5,38 @@ "body_pretext": "Open-Source-Tools zur einfachen Erstellung und Wartung Ihrer ereignisgesteuerten Architektur. Alle basieren auf der AsyncAPI-Spezifikation, der ", "body_boldtext": "Industriestandard", "body_posttext": " zur Definition asynchroner APIs.", - "docs_btn": "Lesen Sie die Dokumente", - "search_btn": "Schnellsuche...", - "slogan_text": "Wir sind stolz darauf, Teil der", - "slogan_link": "Linux Foundation" + "join_btn": "Join our Community", + "subscribe_btn": "Subscribe to our Newsletter", + "linuxFoundation_txt": "Part of the Linux Foundation" }, "features": { - "title": "Warum AsyncAPI?", - "description": "Verbesserung des aktuellen Stands der ereignisgesteuerten Architekturen (EDA)", - - "specification.name": "Spezifikation", - "specification.description": "Ermöglicht es Ihnen, die Schnittstellen von asynchronen APIs zu definieren und ist protokollunabhängig.", - "specification.links.whyasyncapi-spec-documentation-link": "Dokumentation", - - "document-apis.name": "APIs dokumentieren", - "document-apis.description": "Verwenden Sie unsere Tools, um Dokumentation auf Build-Ebene, auf einem Server und auf einem Client zu generieren.", - "document-apis.links.whyasyncapi-apis-htmltemplate-link": "HTML-Vorlage", - "document-apis.links.whyasyncapi-apis-reactcomponents-link": "React-Komponente", - - "code-generation.name": "Code-Generierung", - "code-generation.description": "Generieren Sie Dokumentation, Code (TypeScript, Java, C# usw.) und mehr aus Ihren AsyncAPI-Dateien.", - "code-generation.links.whyasyncapi-generation-generator-link": "Generator", - "code-generation.links.whyasyncapi-generation-modelina-link": "Modelina", - - "community.name": "Gemeinschaft", - "community.description": "Wir sind eine Gemeinschaft von großartigen Menschen, die leidenschaftlich an AsyncAPI und ereignisgesteuerten Architekturen interessiert sind.", - "community.links.whyasyncapi-community-slack-link": "Treten Sie unserem Slack bei", - - "open-governance.links.whyasyncapi-governance-more-link": "Erfahren Sie mehr über Offene Governance", - "open-governance.links.whyasyncapi-governance-tsc-link": "TSC-Mitglieder", - "open-governance.name": "Offene Governance", - "open-governance.description": "Unser Open-Source-Projekt ist Teil der Linux Foundation und arbeitet unter einem Modell der offenen Governance.", - - "much-more.name": "Und noch viel mehr...", - "much-more.description": "Wir haben viele verschiedene Tools und laden Sie ein, unsere Ideen zu erkunden und neue Ideen für AsyncAPI vorzuschlagen.", - "much-more.links.whyasyncapi-muchmore-github-link": "GitHub-Diskussionen anzeigen" + "title": "What You Can Use AsyncAPI For", + "description": "One of our main goals is to improve the current state of Event Driven Architecture (EDA)", + "costs-control": { + "name": "Costs Control", + "description": "Open-Source tools to easily build and maintain your event-driven architecture. All powered by the AsyncAPI specification, the industry standard for defining asynchronous APIs." + }, + "publishing-api": { + "name": "Self-service for Publishing API", + "description": "Open-Source tools to easily build and maintain your event-driven architecture. All powered by the AsyncAPI specification, the industry standard for defining asynchronous APIs." + }, + "code-generation": { + "name": "Code Generation", + "description": "Open-Source tools to easily build and maintain your event-driven architecture. All powered by the AsyncAPI specification, the industry standard for defining asynchronous APIs." + }, + "infra-as-code": { + "name": "Infrastructure as Code", + "description": "Open-Source tools to easily build and maintain your event-driven architecture. All powered by the AsyncAPI specification, the industry standard for defining asynchronous APIs." + }, + "governance-consistency": { + "name": "Governance & Consistency", + "description": "Open-Source tools to easily build and maintain your event-driven architecture. All powered by the AsyncAPI specification, the industry standard for defining asynchronous APIs." + }, + "developer-portal": { + "name": "Developer Portal", + "description": "Open-Source tools to easily build and maintain your event-driven architecture. All powered by the AsyncAPI specification, the industry standard for defining asynchronous APIs." + }, + "read-more": "Read More" }, "adopters": { "title": "Von den weltweit führenden Marken übernommen", @@ -57,6 +54,7 @@ "meetingLink": "Erfahren Sie mehr über unsere Meetings." }, "sponsors": { + "diamondTitle": "Diamond Sponsors", "platinumTitle": "Platin-Sponsoren", "goldTitle": "Gold-Sponsoren", "silverTitle": "Silber-Sponsoren", diff --git a/public/locales/en/landing-page.json b/public/locales/en/landing-page.json index ae14df4c0145..439b12acde20 100644 --- a/public/locales/en/landing-page.json +++ b/public/locales/en/landing-page.json @@ -5,41 +5,38 @@ "body_pretext": "Open-Source tools to easily build and maintain your event-driven architecture. All powered by the AsyncAPI specification, the ", "body_boldtext": "industry standard", "body_posttext": " for defining asynchronous APIs.", - "docs_btn": "Read the docs", - "search_btn": "Quick search...", - "slogan_text": "Proud to be part of the", - "slogan_link": "Linux Foundation" + "join_btn": "Join our Community", + "subscribe_btn": "Subscribe to our Newsletter", + "linuxFoundation_txt": "Part of the Linux Foundation" }, "features": { - "title": "Why AsyncAPI?", - "description": "Improving the current state of Event-Driven Architectures (EDA)", - - "specification.name": "Specification", - "specification.description": "Allows you to define the interfaces of asynchronous APIs and is protocol agnostic.", - "specification.links.whyasyncapi-spec-documentation-link": "Documentation", - - "document-apis.name": "Document APIs", - "document-apis.description": "Use our tools to generate documentation at the build level, on a server, and on a client.", - "document-apis.links.whyasyncapi-apis-htmltemplate-link": "HTML Template", - "document-apis.links.whyasyncapi-apis-reactcomponents-link": "React Component", - - "code-generation.name": "Code Generation", - "code-generation.description": "Generate documentation, Code (TypeScript, Java, C#, etc), and more out of your AsyncAPI files.", - "code-generation.links.whyasyncapi-generation-generator-link": "Generator", - "code-generation.links.whyasyncapi-generation-modelina-link": "Modelina", - - "community.name": "Community", - "community.description": "We're a community of great people who are passionate about AsyncAPI and event-driven architectures.", - "community.links.whyasyncapi-community-slack-link": "Join our Slack", - - "open-governance.name": "Open Governance", - "open-governance.description": "Our Open-Source project is part of Linux Foundation and works under an Open Governance model.", - "open-governance.links.whyasyncapi-governance-more-link": "Read more about Open Governance", - "open-governance.links.whyasyncapi-governance-tsc-link": "TSC Members", - - "much-more.name": "And much more...", - "much-more.description": "We have many different tools and welcome you to explore our ideas and propose new ideas to AsyncAPI.", - "much-more.links.whyasyncapi-muchmore-github-link": "View GitHub Discussions" + "title": "What You Can Use AsyncAPI For", + "description": "One of our main goals is to improve the current state of Event Driven Architecture (EDA)", + "costs-control": { + "name": "Costs Control", + "description": "Open-Source tools to easily build and maintain your event-driven architecture. All powered by the AsyncAPI specification, the industry standard for defining asynchronous APIs." + }, + "publishing-api": { + "name": "Self-service for Publishing API", + "description": "Open-Source tools to easily build and maintain your event-driven architecture. All powered by the AsyncAPI specification, the industry standard for defining asynchronous APIs." + }, + "code-generation": { + "name": "Code Generation", + "description": "Open-Source tools to easily build and maintain your event-driven architecture. All powered by the AsyncAPI specification, the industry standard for defining asynchronous APIs." + }, + "infra-as-code": { + "name": "Infrastructure as Code", + "description": "Open-Source tools to easily build and maintain your event-driven architecture. All powered by the AsyncAPI specification, the industry standard for defining asynchronous APIs." + }, + "governance-consistency": { + "name": "Governance & Consistency", + "description": "Open-Source tools to easily build and maintain your event-driven architecture. All powered by the AsyncAPI specification, the industry standard for defining asynchronous APIs." + }, + "developer-portal": { + "name": "Developer Portal", + "description": "Open-Source tools to easily build and maintain your event-driven architecture. All powered by the AsyncAPI specification, the industry standard for defining asynchronous APIs." + }, + "read-more": "Read More" }, "adopters": { "title": "Adopted by the world leading brands", @@ -51,12 +48,13 @@ "subtitle": "We're a community of great people who are passionate about AsyncAPI and event-driven architectures.", "slackCTATitle": "Join our Slack workspace", "slackCTADesc": "We welcome everyone to join our Slack workspace. If you have a question on how to use AsyncAPI, want to contribute, or simply want to say hello 👋, you're welcome to join us. We're nice people 🙂", - "slackCTABtn": "Join us!", + "slackCTABtn": "Join us on slack", "meetingTitle": "Join our public meetings", "meetingDesc": "AsyncAPI hosts different meetings every week. They are focused on different topics, sometimes purely technical and sometimes about community building. Pick one and join us!", "meetingLink": "Learn more about our meetings." }, "sponsors": { + "diamondTitle": "Diamond Sponsors", "platinumTitle": "Platinum Sponsors", "goldTitle": "Gold Sponsors", "silverTitle": "Silver Sponsors",