diff --git a/apps/website/pages/components/footer/code.tsx b/apps/website/pages/components/footer/code.tsx
new file mode 100644
index 0000000000..9dadb77cfe
--- /dev/null
+++ b/apps/website/pages/components/footer/code.tsx
@@ -0,0 +1,17 @@
+import Head from "next/head";
+import type { ReactElement } from "react";
+import FooterPageLayout from "screens/components/footer/FooterPageLayout";
+import FooterCodePage from "screens/components/footer/code/FooterCodePage";
+
+const Code = () => (
+ <>
+
+ Footer code — Halstack Design System
+
+
+ >
+);
+
+Code.getLayout = (page: ReactElement) => {page};
+
+export default Code;
diff --git a/apps/website/pages/components/footer/index.tsx b/apps/website/pages/components/footer/index.tsx
index 68d3cc6c88..0a2734e535 100644
--- a/apps/website/pages/components/footer/index.tsx
+++ b/apps/website/pages/components/footer/index.tsx
@@ -1,21 +1,17 @@
import Head from "next/head";
import type { ReactElement } from "react";
import FooterPageLayout from "screens/components/footer/FooterPageLayout";
-import FooterCodePage from "screens/components/footer/code/FooterCodePage";
+import FooterOverviewPage from "screens/components/footer/overview/FooterOverviewPage";
-const Index = () => {
- return (
- <>
-
- Footer — Halstack Design System
-
-
- >
- );
-};
+const Index = () => (
+ <>
+
+ Footer — Halstack Design System
+
+
+ >
+);
-Index.getLayout = function getLayout(page: ReactElement) {
- return {page};
-};
+Index.getLayout = (page: ReactElement) => {page};
export default Index;
diff --git a/apps/website/pages/components/footer/specifications.tsx b/apps/website/pages/components/footer/specifications.tsx
deleted file mode 100644
index 8cd96b72b2..0000000000
--- a/apps/website/pages/components/footer/specifications.tsx
+++ /dev/null
@@ -1,21 +0,0 @@
-import Head from "next/head";
-import type { ReactElement } from "react";
-import FooterPageLayout from "screens/components/footer/FooterPageLayout";
-import FooterSpecsPage from "screens/components/footer/specs/FooterSpecsPage";
-
-const Specifications = () => {
- return (
- <>
-
- Footer Specs — Halstack Design System
-
-
- >
- );
-};
-
-Specifications.getLayout = function getLayout(page: ReactElement) {
- return {page};
-};
-
-export default Specifications;
diff --git a/apps/website/pages/components/footer/usage.tsx b/apps/website/pages/components/footer/usage.tsx
deleted file mode 100644
index d0f5bddf50..0000000000
--- a/apps/website/pages/components/footer/usage.tsx
+++ /dev/null
@@ -1,21 +0,0 @@
-import Head from "next/head";
-import type { ReactElement } from "react";
-import FooterPageLayout from "screens/components/footer/FooterPageLayout";
-import FooterUsagePage from "screens/components/footer/usage/FooterUsagePage";
-
-const Usage = () => {
- return (
- <>
-
- Footer Usage — Halstack Design System
-
-
- >
- );
-};
-
-Usage.getLayout = function getLayout(page: ReactElement) {
- return {page};
-};
-
-export default Usage;
diff --git a/apps/website/screens/components/footer/FooterPageLayout.tsx b/apps/website/screens/components/footer/FooterPageLayout.tsx
index 42886525eb..412bde097f 100644
--- a/apps/website/screens/components/footer/FooterPageLayout.tsx
+++ b/apps/website/screens/components/footer/FooterPageLayout.tsx
@@ -7,9 +7,8 @@ import { ReactNode } from "react";
const FooterPageHeading = ({ children }: { children: ReactNode }) => {
const tabs = [
- { label: "Code", path: "/components/footer" },
- { label: "Usage", path: "/components/footer/usage" },
- { label: "Specifications", path: "/components/footer/specifications" },
+ { label: "Overview", path: "/components/footer" },
+ { label: "Code", path: "/components/footer/code" },
];
return (
@@ -18,11 +17,8 @@ const FooterPageHeading = ({ children }: { children: ReactNode }) => {
- Footers are a secondary element in a web page because they usually appear at the bottom and it is the last
- thing that the user interacts with. But the presence of the footer must be designed in every application and
- be part of it (consumer or back-office) as it is a key layout element to the overall experience. It is a
- choice of the designer to either leave the footer visible by default or push it down, depending on the use
- case.
+ The footer is a UI component placed at the bottom of the page, providing informational context, secondary
+ navigation, and legal or support links.
The footer is part of the application layout, so it can only be used inside of it. Please check the{" "}
@@ -31,7 +27,7 @@ const FooterPageHeading = ({ children }: { children: ReactNode }) => {
{" "}
documentation.
-
+
{children}
diff --git a/apps/website/screens/components/footer/code/FooterCodePage.tsx b/apps/website/screens/components/footer/code/FooterCodePage.tsx
index 155e0b8937..329423f79f 100644
--- a/apps/website/screens/components/footer/code/FooterCodePage.tsx
+++ b/apps/website/screens/components/footer/code/FooterCodePage.tsx
@@ -3,7 +3,13 @@ import QuickNavContainer from "@/common/QuickNavContainer";
import QuickNavContainerLayout from "@/common/QuickNavContainerLayout";
import DocFooter from "@/common/DocFooter";
import StatusBadge from "@/common/StatusBadge";
-import Code, { TableCode } from "@/common/Code";
+import Code, { ExtendedTableCode, TableCode } from "@/common/Code";
+
+const logoTypeString = `{
+ href?: string;
+ src: string;
+ title?: string;
+}`;
const sections = [
{
@@ -19,6 +25,68 @@ const sections = [
+
+
bottomLinks
+
+ {"{ href: string; text: string; }[]"}
+
+
+ An array of objects representing the links that will be rendered at the bottom part of the footer. Each
+ object has the following properties:
+
+
+ text: Text for the link.
+
+
+ href: URL of the page the link goes to.
+
+
+
+
-
+
+
+
children
+
+ React.ReactNode
+
+
The center section of the footer. Can be used to render custom content in this area.
+
-
+
+
+
copyright
+
+ string
+
+
The text that will be displayed as copyright disclaimer.
+
-
+
+
+
+
+
+ logo
+
+
+
+
+ {"Logo"}
+
+ being Logo an object with the following properties:
+
Size of the top margin to be applied to the footer.
-
-
-
tabIndex
diff --git a/apps/website/screens/components/footer/overview/FooterOverviewPage.tsx b/apps/website/screens/components/footer/overview/FooterOverviewPage.tsx
new file mode 100644
index 0000000000..1087c7d0a4
--- /dev/null
+++ b/apps/website/screens/components/footer/overview/FooterOverviewPage.tsx
@@ -0,0 +1,131 @@
+import { DxcBulletedList, DxcFlex, DxcParagraph } from "@dxc-technology/halstack-react";
+import DocFooter from "@/common/DocFooter";
+import QuickNavContainer from "@/common/QuickNavContainer";
+import QuickNavContainerLayout from "@/common/QuickNavContainerLayout";
+import anatomy from "./images/footer_anatomy.png";
+import variants from "./images/footer_variants.png";
+import Image from "@/common/Image";
+import Figure from "@/common/Figure";
+
+const sections = [
+ {
+ title: "Introduction",
+ content: (
+
+ The footer is used as the final section of a page to display utility elements such as legal disclaimers,
+ secondary links, copyright information, or the brand logo. Its purpose is to reinforce brand identity and
+ provide consistent access across digital experiences without disrupting the main user flow.
+
+ ),
+ },
+ {
+ title: "Anatomy",
+ content: (
+ <>
+
+
+
+ Container: The outer wrapper that defines the overall layout, padding, and alignment of all
+ footer content. Ensures consistency across screen sizes.
+
+
+ Logo: Represents the brand identity visually. Positioned on the left side, it helps
+ reinforce company recognition across all pages.
+
+
+ Social icons: A set of clickable icons linking to the company’s social media platforms
+ (e.g., LinkedIn, Facebook). Placed on the right side for easy visibility and access.
+
+
+ Copyright: Text displaying legal ownership of the content. Ensures users know the site is
+ officially owned.
+
+
+ Company links: A horizontal list of navigational hyperlinks such as Privacy Policy, Terms &
+ Conditions, etc. Offers users access to important legal or informational resources.
+
+
+ >
+ ),
+ },
+ {
+ title: "Variants",
+ content: (
+ <>
+
+ To maintain consistency in layout flexibility and brand presentation, the footer offers three primary
+ variants: Default, With Navigation, and Small.
+
+
+
+ Default: provides a balanced layout with branding and essential legal links. It offers a
+ clean, uncluttered appearance suitable for most standard applications.
+
+
+ With Navigation: includes additional navigational sections, enabling users to quickly
+ access key areas of the site. This layout is ideal for content-heavy pages or enterprise-level applications
+ requiring enhanced footer functionality.
+
+
+ Small: offers a compact version of the footer, typically limited to branding and minimal
+ legal text. It's best suited for lightweight experiences, login pages, or environments with constrained
+ vertical space.
+
+
+
+
+
+
+ Choosing between these variants helps tailor the footer to a wide range of contexts, whether prioritizing
+ simplicity, providing extended navigation, or optimizing for space efficiency.
+
+ >
+ ),
+ },
+ {
+ title: "Best practices",
+ content: (
+ <>
+
+
+ Dock the footer to the bottom of the page: the footer should remain fixed at the bottom
+ edge of the viewport and not scroll with the page content to maintain visibility and separation from dynamic
+ areas.
+
+
+ Ensure full-width alignment: the footer container should always span the full width of the
+ screen to create a clean, structured boundary and support responsive behavior across breakpoints.
+
+
+ Display copyright information on the right: consistently place legal disclaimers or
+ copyright text aligned to the right edge of the footer to support predictable user expectations.
+
+
+ Use a simplified or alternate logo: consider using a smaller or alternative version of the
+ brand logo (isotype, imagotype, or monochrome variant) rather than duplicating the main header image to
+ reduce visual redundancy.
+
+
+ Limit the number of links: include only the most essential company links (e.g., Terms,
+ Privacy, Accessibility) to avoid overwhelming users with excessive options.
+
+
+ Select the most appropriate variant for context: choose the footer variant that best fits
+ the content density and user goals of the page.
+
+
+ >
+ ),
+ },
+];
+
+const FooterOverviewPage = () => (
+
+
+
+
+
+
+);
+
+export default FooterOverviewPage;
diff --git a/apps/website/screens/components/footer/overview/images/footer_anatomy.png b/apps/website/screens/components/footer/overview/images/footer_anatomy.png
new file mode 100644
index 0000000000..ff389c8552
Binary files /dev/null and b/apps/website/screens/components/footer/overview/images/footer_anatomy.png differ
diff --git a/apps/website/screens/components/footer/overview/images/footer_variants.png b/apps/website/screens/components/footer/overview/images/footer_variants.png
new file mode 100644
index 0000000000..91dcef94b9
Binary files /dev/null and b/apps/website/screens/components/footer/overview/images/footer_variants.png differ
diff --git a/apps/website/screens/components/footer/specs/FooterSpecsPage.tsx b/apps/website/screens/components/footer/specs/FooterSpecsPage.tsx
deleted file mode 100644
index d3c8889a38..0000000000
--- a/apps/website/screens/components/footer/specs/FooterSpecsPage.tsx
+++ /dev/null
@@ -1,458 +0,0 @@
-import { DxcBulletedList, DxcFlex, DxcTable, DxcParagraph } from "@dxc-technology/halstack-react";
-import Code from "@/common/Code";
-import DocFooter from "@/common/DocFooter";
-import Figure from "@/common/Figure";
-import QuickNavContainer from "@/common/QuickNavContainer";
-import QuickNavContainerLayout from "@/common/QuickNavContainerLayout";
-import Image from "@/common/Image";
-import footerAnatomy from "./images/footer_anatomy.png";
-import footerSpecs from "./images/footer_specs.png";
-
-const sections = [
- {
- title: "Specifications",
- content: (
-
-
-
- ),
- },
- {
- title: "Anatomy",
- content: (
- <>
-
-
- Container
- Logo
- Social icons
- Copyright
- Company links
-
- >
- ),
- },
- {
- title: "Design tokens",
- subSections: [
- {
- title: "Color",
- content: (
-
-
-
-
-
-
- The content of the footer should be adapt to the space available depending on the screen device.
-
- >
- ),
- },
- ],
- },
- {
- title: "Responsive version for mobile and tablet",
- content: (
- <>
-
- The same content in the footer will be displayed for the responsive versions and the only modification will be
- the width of it. With less space available to display the content, some of the items will be relocated to fit
- well in the screen.
-
-
- Regarding his behavior, the footer must be pushed down always so it is not visible by default after page load,
- even when the content is smaller than the device screen size. This includes the splash screen, which must push
- the footer down. Of course, if the content is larger than the device screen size, the footer will be pushed
- down anyway.
-
-
- On the mobile version, first we have the logo. Below it the links to privacy and terms to let a space for
- custom component and at the bottom the copyright terms, centered. At this stage, the custom content and the
- disposition is responsability of the user, the same way as it is in the desktop and tablet version.
-
- >
- ),
- },
-];
-
-const FooterSpecsPage = () => {
- return (
-
-
-
-
-
-
- );
-};
-
-export default FooterSpecsPage;
diff --git a/apps/website/screens/components/footer/specs/images/footer_anatomy.png b/apps/website/screens/components/footer/specs/images/footer_anatomy.png
deleted file mode 100644
index 4f51b6b4eb..0000000000
Binary files a/apps/website/screens/components/footer/specs/images/footer_anatomy.png and /dev/null differ
diff --git a/apps/website/screens/components/footer/specs/images/footer_specs.png b/apps/website/screens/components/footer/specs/images/footer_specs.png
deleted file mode 100644
index 58896e27ca..0000000000
Binary files a/apps/website/screens/components/footer/specs/images/footer_specs.png and /dev/null differ
diff --git a/apps/website/screens/components/footer/usage/FooterUsagePage.tsx b/apps/website/screens/components/footer/usage/FooterUsagePage.tsx
deleted file mode 100644
index 7489d0b0aa..0000000000
--- a/apps/website/screens/components/footer/usage/FooterUsagePage.tsx
+++ /dev/null
@@ -1,87 +0,0 @@
-import { DxcBulletedList, DxcFlex, DxcParagraph } from "@dxc-technology/halstack-react";
-import DocFooter from "@/common/DocFooter";
-import QuickNavContainer from "@/common/QuickNavContainer";
-import QuickNavContainerLayout from "@/common/QuickNavContainerLayout";
-
-const sections = [
- {
- title: "Usage",
- content: (
- <>
- {/* */}
-
-
- The footer frame should be docked at the bottom of the page and should not scroll with any of the data
- within working section of the screen.
-
- The footer frame should span the entire screen width.
-
- The footer frame should display the copyright information at the right margin.
-
-
- We recommend uploading either an alternate version or a smaller brand image than the used in the header. If
- the company has an alternate version of the logo, isotype, imagotype or isologo available, we encourage to
- use it. In the opposite case a smaller version of the main brand image can be used.
-
-
- >
- ),
- },
- {
- title: "Content",
- content: (
- <>
- {/* */}
-
- The footer component has a custom area where many kinds of content can be placed, some of them are
- contemplated in the following list:
-
-
-
- Plain text or content
-
- Informational purpose text
-
-
-
- Menu links
-
- Global navigation
- Sitemap
- Useful links or resources
-
-
-
- Forms
-
- Select language
- Login / Sing up
- Provide email adress / Subscribe
-
-
-
- Actions
-
- Ask for help / Support
- Business related actions / Call to action
- Search
-
-
-
- >
- ),
- },
-];
-
-const FooterUsagePage = () => {
- return (
-
-
-
-
-
-
- );
-};
-
-export default FooterUsagePage;
diff --git a/apps/website/screens/components/header/code/HeaderCodePage.tsx b/apps/website/screens/components/header/code/HeaderCodePage.tsx
index d4debc4f24..a7d21a5a99 100644
--- a/apps/website/screens/components/header/code/HeaderCodePage.tsx
+++ b/apps/website/screens/components/header/code/HeaderCodePage.tsx
@@ -4,6 +4,7 @@ import QuickNavContainer from "@/common/QuickNavContainer";
import QuickNavContainerLayout from "@/common/QuickNavContainerLayout";
import Link from "next/link";
import Code, { ExtendedTableCode, TableCode } from "@/common/Code";
+import StatusBadge from "@/common/StatusBadge";
const logoTypeString = `{
href?: string;
@@ -38,7 +39,12 @@ const sections = [
-
-
logo
+
+
+
+ logo
+
+
{"Logo"}
diff --git a/packages/lib/src/footer/Footer.stories.tsx b/packages/lib/src/footer/Footer.stories.tsx
index f7d86038d6..49f995c952 100644
--- a/packages/lib/src/footer/Footer.stories.tsx
+++ b/packages/lib/src/footer/Footer.stories.tsx
@@ -8,6 +8,7 @@ import DxcFlex from "../flex/Flex";
import DxcTypography from "../typography/Typography";
import DxcFooter from "./Footer";
import { Meta, StoryObj } from "@storybook/react";
+import DxcLink from "../link/Link";
const social = [
{
@@ -145,25 +146,25 @@ const Footer = () => (
-