diff --git a/apps/website/screens/components/avatar/overview/images/avatar_colors.png b/apps/website/screens/components/avatar/overview/images/avatar_colors.png
index d6d00bc81..308df2373 100644
Binary files a/apps/website/screens/components/avatar/overview/images/avatar_colors.png and b/apps/website/screens/components/avatar/overview/images/avatar_colors.png differ
diff --git a/apps/website/screens/components/footer/code/FooterCodePage.tsx b/apps/website/screens/components/footer/code/FooterCodePage.tsx
index 0de8bdbb3..8b09ac243 100644
--- a/apps/website/screens/components/footer/code/FooterCodePage.tsx
+++ b/apps/website/screens/components/footer/code/FooterCodePage.tsx
@@ -1,11 +1,10 @@
-import { DxcFlex, DxcTable, DxcLink } from "@dxc-technology/halstack-react";
+import { DxcFlex, DxcTable, DxcLink, DxcParagraph } from "@dxc-technology/halstack-react";
import QuickNavContainer from "@/common/QuickNavContainer";
import DocFooter from "@/common/DocFooter";
import StatusBadge from "@/common/StatusBadge";
import Code, { ExtendedTableCode, TableCode } from "@/common/Code";
const logoTypeString = `{
- href?: string;
src: string;
title?: string;
}`;
@@ -75,7 +74,7 @@ const sections = [
{logoTypeString}
-
Logo to be displayed inside the header. |
+ Logo to be displayed inside the footer. |
- |
@@ -158,6 +157,23 @@ const sections = [
),
},
+ {
+ title: "DxcFooter.LeftContent",
+ content: (
+
+ This compound will be used to display the content on the Left Container under the Logo.
+
+ ),
+ },
+ {
+ title: "DxcFooter.RigthContent",
+ content: (
+
+ This compound will be used to display the content on the Right Container of the footer, if socialLinks are
+ provided they will always display at the end of the container.
+
+ ),
+ },
{
title: "Examples",
subSections: [
diff --git a/packages/lib/src/footer/Footer.stories.tsx b/packages/lib/src/footer/Footer.stories.tsx
index ea1e2bfb3..462412ae9 100644
--- a/packages/lib/src/footer/Footer.stories.tsx
+++ b/packages/lib/src/footer/Footer.stories.tsx
@@ -131,7 +131,10 @@ const Footer = () => (
<>
-
+
+ Holaaa
+ Hellooo
+
diff --git a/packages/lib/src/footer/Footer.tsx b/packages/lib/src/footer/Footer.tsx
index 42019cc08..3c0932b16 100644
--- a/packages/lib/src/footer/Footer.tsx
+++ b/packages/lib/src/footer/Footer.tsx
@@ -1,4 +1,4 @@
-import { useContext } from "react";
+import { ElementType, ReactNode, useContext, Children, isValidElement } from "react";
import styled from "@emotion/styled";
import { responsiveSizes, spaces } from "../common/variables";
import DxcFlex from "../flex/Flex";
@@ -12,51 +12,88 @@ const FooterContainer = styled.footer<{
margin: FooterPropsType["margin"];
mode?: FooterPropsType["mode"];
}>`
- background-color: var(--color-bg-neutral-strongest);
box-sizing: border-box;
display: flex;
flex-direction: ${(props) => (props?.mode === "default" ? "column" : "row")};
justify-content: space-between;
margin-top: ${(props) => (props.margin ? spaces[props.margin] : "var(--spacing-padding-none)")};
- min-height: ${(props) => (props?.mode === "default" ? "124px" : "40px")};
width: 100%;
- gap: var(--spacing-gap-m);
- padding: ${(props) =>
- props?.mode === "default"
- ? "var(--spacing-padding-m) var(--spacing-padding-xl)"
- : "var(--spacing-padding-s) var(--spacing-padding-xl)"};
- @media (max-width: ${responsiveSizes.medium}rem) {
- padding: var(--spacing-padding-l) var(--spacing-padding-ml);
+
+ @media (max-width: ${responsiveSizes.small}rem) {
+ flex-direction: column;
+ }
+`;
+
+const MainContainer = styled.div`
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ flex-wrap: wrap;
+
+ @media (min-width: ${responsiveSizes.small}rem) {
+ min-height: 80px;
}
+
@media (max-width: ${responsiveSizes.small}rem) {
flex-direction: column;
+ align-items: flex-start;
+ gap: var(--spacing-gap-ml);
+ padding: var(--spacing-padding-l) var(--spacing-padding-m);
}
`;
const BottomContainer = styled.div`
+ width: 100%;
display: flex;
justify-content: space-between;
- align-items: flex-end;
+ align-items: center;
+ background-color: var(--color-bg-primary-strong);
+ padding: var(--spacing-padding-none) var(--spacing-padding-xl);
+ box-sizing: border-box;
@media (min-width: ${responsiveSizes.small}rem) {
+ height: var(--height-xl);
flex-direction: row;
}
+
@media (max-width: ${responsiveSizes.small}rem) {
flex-direction: column;
- align-items: center;
+ align-items: flex-start;
+ gap: var(--spacing-gap-ml);
+ padding: var(--spacing-padding-m);
}
+`;
+
+const LeftContainer = styled.div`
+ display: flex;
+ gap: var(--spacing-gap-ml);
+ height: 100%;
+ color: var(--color-fg-neutral-dark);
- border-top: var(--border-width-s) var(--border-style-default) var(--border-color-primary-medium);
- margin-top: var(--spacing-gap-m);
+ @media (min-width: ${responsiveSizes.small}rem) {
+ max-width: 33.3%;
+ padding: var(--spacing-padding-l) var(--spacing-padding-xl);
+ }
+
+ @media (max-width: ${responsiveSizes.small}rem) {
+ flex-direction: column;
+ align-items: flex-start;
+ }
`;
-const ChildComponents = styled.div`
- min-height: var(--height-xxs);
- color: var(--color-fg-neutral-bright);
+const RightContainer = styled.div`
+ display: flex;
+ justify-content: flex-end;
+ gap: var(--spacing-gap-xl);
+ height: 100%;
+
+ @media (min-width: ${responsiveSizes.small}rem) {
+ max-width: 66.66%;
+ padding: var(--spacing-padding-l) var(--spacing-padding-xl);
+ }
`;
const Copyright = styled.div`
- margin-top: var(--spacing-padding-xs);
font-family: var(--typography-font-family);
font-size: var(--typography-label-s);
font-weight: var(--typography-label-regular);
@@ -96,21 +133,21 @@ const SocialAnchor = styled.a<{ index: number }>`
const SocialIconContainer = styled.div`
display: flex;
align-items: center;
- color: var(--color-fg-neutral-bright);
+ color: var(--color-fg-primary-strong);
overflow: hidden;
font-size: var(--height-s);
svg {
- height: var(--height-s);
- width: 24px;
+ height: var(--height-xs);
+ width: var(--height-xs);
+ fill: var(--color-fg-primary-strong);
}
`;
-const BottomLinks = styled.div`
+const BottomLinks = styled.div<{ hasContent: boolean }>`
display: inline-flex;
flex-wrap: wrap;
align-self: center;
- margin-top: var(--spacing-padding-xs);
color: var(--color-fg-neutral-bright);
@media (min-width: ${responsiveSizes.small}rem) {
@@ -119,6 +156,7 @@ const BottomLinks = styled.div`
@media (max-width: ${responsiveSizes.small}rem) {
max-width: 100%;
width: 100%;
+ display: ${(props) => (props.hasContent ? "inline-flex" : "none")};
}
& > span:not(:first-child):before {
@@ -133,7 +171,7 @@ const BottomLink = styled.a`
font-family: var(--typography-font-family);
font-size: var(--typography-label-m);
font-weight: var(--typography-label-regular);
- color: var(--color-fg-neutral-bright);
+ color: inherit;
&:focus {
outline: var(--border-width-m) var(--border-style-default) var(--border-color-secondary-medium);
@@ -148,10 +186,13 @@ const getLogoElement = (mode: FooterPropsType["mode"], logo?: FooterPropsType["l
}
};
+const findChildType = (children: FooterPropsType["children"], childType: ElementType) =>
+ Children.toArray(children).find((child) => isValidElement(child) && child.type === childType);
+
const DxcFooter = ({
bottomLinks,
- children,
copyright,
+ children,
logo,
margin,
mode = "default",
@@ -159,37 +200,47 @@ const DxcFooter = ({
tabIndex = 0,
}: FooterPropsType): JSX.Element => {
const translatedLabels = useContext(HalstackLanguageContext);
-
const footerLogo = getLogoElement(mode, logo);
+ const leftContentChild = findChildType(children, LeftContent);
+ const rightContentChild = findChildType(children, RightContent);
return (
-
- {footerLogo}
- {mode === "default" && (
-
- {socialLinks?.map((link, index) => (
-
-
-
- {typeof link.logo === "string" ? : link.logo}
-
-
-
- ))}
-
- )}
-
- {children}
{mode === "default" && (
-
-
+
+
+ {footerLogo}
+ {leftContentChild}
+
+ {(socialLinks || rightContentChild) && (
+
+ {rightContentChild}
+ {socialLinks && (
+
+ {socialLinks?.map((link, index) => (
+
+
+
+ {typeof link.logo === "string" ? : link.logo}
+
+
+
+ ))}
+
+ )}
+
+ )}
+
+ )}
+
+ {mode === "default" ? (
+
{bottomLinks?.map((link, index) => (
@@ -198,11 +249,18 @@ const DxcFooter = ({
))}
- {copyright ?? translatedLabels.footer.copyrightText(new Date().getFullYear())}
-
- )}
+ ) : (
+ {footerLogo}
+ )}
+ {copyright ?? translatedLabels.footer.copyrightText(new Date().getFullYear())}
+
);
};
+const LeftContent = ({ children }: { children: ReactNode }) => <>{children}>;
+const RightContent = ({ children }: { children: ReactNode }) => <>{children}>;
+
+DxcFooter.LeftContent = LeftContent;
+DxcFooter.RightContent = RightContent;
export default DxcFooter;
diff --git a/packages/lib/src/footer/Icons.tsx b/packages/lib/src/footer/Icons.tsx
index 6eb3b1bf4..a9c5714d4 100644
--- a/packages/lib/src/footer/Icons.tsx
+++ b/packages/lib/src/footer/Icons.tsx
@@ -5,57 +5,57 @@ export const dxcLogo = (
diff --git a/packages/lib/src/footer/types.ts b/packages/lib/src/footer/types.ts
index 881324c5d..cac55d7f7 100644
--- a/packages/lib/src/footer/types.ts
+++ b/packages/lib/src/footer/types.ts
@@ -28,10 +28,6 @@ type BottomLink = {
};
type Logo = {
- /**
- * URL to navigate when the logo is clicked.
- */
- href?: string;
/**
* Source of the logo image.
*/