Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
ec08a49
feat: implement horizontal footer layout with modern social media icons
Recxsmacx Jul 8, 2025
1c128a4
fix: add CSS support for tooltip visibility in Cypress tests
Recxsmacx Jul 8, 2025
edcde1c
feat: make footer responsive for mobile devices
Recxsmacx Jul 10, 2025
4909858
feat: make footer responsive for mobile devices
Recxsmacx Jul 10, 2025
c173a1d
Update footer.tsx with social components
Recxsmacx Jul 12, 2025
658699f
Merge latest master changes
Recxsmacx Aug 15, 2025
160b7c1
fix: Add JSX import to socials component and install react-dom types
Recxsmacx Aug 15, 2025
3ab5ad6
feat: Add AsyncAPI Conference 2025 PDF document
Recxsmacx Aug 15, 2025
ad84e00
Merge branch 'master' into Footer-socials
Recxsmacx Oct 11, 2025
2146a02
chore: sync package-lock.json with package.json
Recxsmacx Oct 11, 2025
c7da613
Merge branch 'master' into Footer-socials
Recxsmacx Oct 16, 2025
af65219
Merge branch 'master' into Footer-socials
AceTheCreator Oct 18, 2025
a37c9d6
Merge branch 'master' into Footer-socials
AceTheCreator Oct 18, 2025
24e1adf
Merge branch 'master' into Footer-socials
Recxsmacx Oct 28, 2025
f53e961
applied for each in cypress tests
Recxsmacx Oct 28, 2025
435354e
Merge branch 'Footer-socials' of https://github.com/Recxsmacx/confere…
Recxsmacx Oct 28, 2025
0338728
Delete cypress/Downloads/conf 2025.pdf
Recxsmacx Oct 28, 2025
e6edf25
imported pre available socials svgs
Recxsmacx Oct 28, 2025
b599645
Merge branch 'Footer-socials' of https://github.com/Recxsmacx/confere…
Recxsmacx Oct 28, 2025
338fff7
dependency issue resolved
Recxsmacx Oct 28, 2025
2b15c15
Merge branch 'master' into Footer-socials
Recxsmacx Oct 30, 2025
13d9c99
Merge branch 'master' into Footer-socials
Recxsmacx Nov 12, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 15 additions & 30 deletions components/Footer/footer.tsx
Original file line number Diff line number Diff line change
@@ -1,51 +1,36 @@
import React, { JSX } from 'react';
import ILink from '../illustration/link';
import socials, { SocialWithIcon } from '../../config/socials';
import Socials from "./socials";

function Footer(): JSX.Element {
return (
<div className="container" data-test="footer">
<div
className="w-full flex justify-between items-center p-4 sm:flex-col sm:gap-3"
className="w-full flex flex-row justify-between items-center p-2 md:p-4 gap-4 sm:flex-col sm:gap-3"
data-test="footer-asyncAPI-logo"
>
<div className="mt-2 text-[14px] text-gray-100 ">
{/* Code of Conduct Section */}
<div className="text-[16px] md:text-[18px] text-gray-100 flex items-center flex-shrink-0 sm:hidden">
<a
href="https://github.com/asyncapi/community/blob/master/CODE_OF_CONDUCT.md"
target="_blank"
rel="noreferrer"
className="hover:underline text-white duration-200 ease-in-out flex items-center"
data-test="code-of-conduct"
>
<span> Code of Conduct </span>
<span>
<ILink className="w-4 ml-2" fill="white" />
</span>
<span>Code of Conduct</span>
<ILink className="w-3 md:w-5 ml-1 md:ml-2" fill="white" />
</a>
</div>
<div></div>
<div className="flex items-center justify-between sm:flex-col sm:items-center">
<div className="text-white text-center">
Made with ❤️ by AsyncAPI contributors. By the community for the
community!
</div>
<div className="w-[0.9px] h-4 bg-white ml-4 sm:hidden" />
<div className="ml-4 flex justify-between items-center gap-2 sm:mt-4">
{socials.map((social: SocialWithIcon) => {
const IconComponent = social.icon;
return (
<a
key={social.name}
href={social.href}
target="_blank"
rel="noreferrer"
className="rounded-lg flex items-center justify-center hover:border-[#AD20E2] duration-150 ease-in-out"
data-test={`footer-${social.name}`}
>
<IconComponent className="w-[20px] h-[20px]" fill="white" />
</a>
);
})}

{/* "Made with ❤️" and Socials Section - Grouped together */}
<div className="flex flex-row items-center gap-4 text-center sm:flex-col sm:items-center">
<span className="text-white text-[16px] md:text-[18px] leading-tight">
Made with ❤️ by AsyncAPI contributors. By the community for the community!
</span>
<div className="w-[1px] h-6 bg-white sm:hidden" />
<div className="flex items-center gap-2 flex-shrink-0">
<Socials />
</div>
</div>
</div>
Expand Down
72 changes: 72 additions & 0 deletions components/Footer/socials.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
import React, { JSX } from 'react';
import LinkedIn from '../illustration/Socials/LinkedIn';
import Github from '../illustration/Socials/Github';
import X from '../illustration/Socials/X';
import Youtube from '../illustration/Socials/Youtube';

function Socials(): JSX.Element {
return (
<div className="social-wrapper" data-test="social-wrapper">
<ul className="inline-flex list-none justify-center font-['Poppins',sans-serif]">
<li className="icon linkedin relative bg-white rounded-full m-[5px] w-[35px] h-[35px] text-lg flex justify-center items-center flex-col shadow-md cursor-pointer transition-all duration-200 hover:bg-[#0077b5] hover:text-white">
<a
href="https://www.linkedin.com/company/asyncapi"
target="_blank"
rel="noreferrer"
className="w-full h-full flex justify-center items-center"
data-test="footer-Linkedin"
>
<span className="tooltip absolute top-0 text-sm bg-white text-white py-[5px] px-[8px] rounded-md shadow-md opacity-0 pointer-events-none transition-all duration-300">
LinkedIn
</span>
<LinkedIn className="h-[1em]" fill="currentColor" />
</a>
</li>
<li className="icon github relative bg-white rounded-full m-[5px] w-[35px] h-[35px] text-lg flex justify-center items-center flex-col shadow-md cursor-pointer transition-all duration-200 hover:bg-[#333] hover:text-white">
<a
href="https://github.com/asyncapi"
target="_blank"
rel="noreferrer"
className="w-full h-full flex justify-center items-center"
data-test="footer-Github"
>
<span className="tooltip absolute top-0 text-sm bg-white text-white py-[5px] px-[8px] rounded-md shadow-md opacity-0 pointer-events-none transition-all duration-300">
GitHub
</span>
<Github className="h-[1.4em]" fill="currentColor" />
</a>
</li>
<li className="icon twitter relative bg-white rounded-full m-[5px] w-[35px] h-[35px] text-lg flex justify-center items-center flex-col shadow-md cursor-pointer transition-all duration-200 hover:bg-[#333] hover:text-white">
<a
href="https://twitter.com/asyncapispec"
target="_blank"
rel="noreferrer"
className="w-full h-full flex justify-center items-center"
data-test="footer-Twitter(X)"
>
<span className="tooltip absolute top-0 text-sm bg-white text-white py-[5px] px-[8px] rounded-md shadow-md opacity-0 pointer-events-none transition-all duration-300">
Twitter
</span>
<X className="h-[1.4em]" fill="currentColor" />
</a>
</li>
<li className="icon youtube relative bg-white rounded-full m-[5px] w-[35px] h-[35px] text-lg flex justify-center items-center flex-col shadow-md cursor-pointer transition-all duration-200 hover:bg-[#ff0000] hover:text-white">
<a
href="https://www.youtube.com/asyncapi"
target="_blank"
rel="noreferrer"
className="w-full h-full flex justify-center items-center"
data-test="footer-youtube"
>
<span className="tooltip absolute top-0 text-sm bg-white text-white py-[5px] px-[8px] rounded-md shadow-md opacity-0 pointer-events-none transition-all duration-300">
YouTube
</span>
<Youtube className="h-[1.4em]" fill="currentColor" />
</a>
</li>
</ul>
</div>
);
}

export default Socials;
Binary file removed cypress/downloads/conf 2025.pdf
Binary file not shown.
44 changes: 39 additions & 5 deletions cypress/e2e/Footer.cy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,8 @@ describe('Footer links', () => {
cy.wait(350);
cy.getTestData('footer-Linkedin').invoke('removeAttr', 'target').click();

cy.origin('https://www.linkedin.com/company/asyncapi/', () => {
cy.url().should('eq', 'https://www.linkedin.com/company/asyncapi/');
cy.origin('https://www.linkedin.com', () => {
cy.url().should('include', 'linkedin.com/company/asyncapi');
});
});

Expand All @@ -52,12 +52,46 @@ describe('Footer links', () => {
cy.wait(350);
cy.getTestData('footer-Twitter(X)').invoke('removeAttr', 'target').click();

cy.origin('https://x.com/asyncapispec', () => {
cy.url().should('match', /.*asyncapispec.*/);
cy.origin('https://x.com', () => {
cy.url().should('include', 'asyncapispec');
});
});

it('Should Contain AsycAPI Conference Logo', () => {
it('Should Contain AsyncAPI Conference Logo', () => {
cy.getTestData('footer-asyncAPI-logo').should('be.visible');
});

describe('Social Media Icons', () => {
beforeEach(() => {
cy.visit('/');
});

it('Should display social media icons', () => {
cy.get('.social-wrapper').should('exist');
cy.get('.social-wrapper .icon').should('have.length.at.least', 4);
});

const socialPlatforms = [
{ class: 'linkedin', name: 'LinkedIn' },
{ class: 'github', name: 'GitHub' },
{ class: 'twitter', name: 'Twitter' },
{ class: 'youtube', name: 'YouTube' },
];

socialPlatforms.forEach((platform) => {
it(`Should display tooltip when hovering over ${platform.name} icon`, () => {
cy.get(`.social-wrapper .${platform.class} .tooltip`).invoke(
'addClass',
'show-for-test'
);
cy.get(`.social-wrapper .${platform.class} .tooltip`).should(
'be.visible'
);
cy.get(`.social-wrapper .${platform.class} .tooltip`).should(
'contain',
platform.name
);
});
});
});
});
Loading