From b7390b4cfa25893dc6460d2a6a8239aa8187e158 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Iv=C3=A1n=20G=C3=B3mez=20Pinta?=
<44321109+GomezIvann@users.noreply.github.com>
Date: Fri, 9 Feb 2024 14:30:21 +0100
Subject: [PATCH 01/18] Breadcrumbs initial version
---
lib/src/breadcrumbs/Breadcrumbs.stories.tsx | 118 +++++++++++
lib/src/breadcrumbs/Breadcrumbs.tsx | 208 ++++++++++++++++++++
lib/src/breadcrumbs/types.ts | 16 ++
lib/src/common/variables.ts | 12 ++
4 files changed, 354 insertions(+)
create mode 100644 lib/src/breadcrumbs/Breadcrumbs.stories.tsx
create mode 100644 lib/src/breadcrumbs/Breadcrumbs.tsx
create mode 100644 lib/src/breadcrumbs/types.ts
diff --git a/lib/src/breadcrumbs/Breadcrumbs.stories.tsx b/lib/src/breadcrumbs/Breadcrumbs.stories.tsx
new file mode 100644
index 000000000..23f3a4df3
--- /dev/null
+++ b/lib/src/breadcrumbs/Breadcrumbs.stories.tsx
@@ -0,0 +1,118 @@
+import React from "react";
+import Title from "../../.storybook/components/Title";
+import ExampleContainer from "../../.storybook/components/ExampleContainer";
+import DxcBreadcrumbs from "./Breadcrumbs";
+
+export default {
+ title: "Breadcrumbs",
+ component: DxcBreadcrumbs,
+};
+
+const collapsedIcon = (
+
+);
+
+const items = [
+ {
+ label: "Home",
+ href: "/",
+ },
+ {
+ label: "User Menu",
+ href: "",
+ },
+ {
+ label: "Preferences",
+ href: "",
+ },
+ {
+ label: "Customization",
+ href: "",
+ },
+ {
+ label: "Dark Mode",
+ href: "",
+ },
+];
+
+export const Chromatic = () => (
+ <>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+);
diff --git a/lib/src/breadcrumbs/Breadcrumbs.tsx b/lib/src/breadcrumbs/Breadcrumbs.tsx
new file mode 100644
index 000000000..c57120ed4
--- /dev/null
+++ b/lib/src/breadcrumbs/Breadcrumbs.tsx
@@ -0,0 +1,208 @@
+import React, { useState } from "react";
+import styled, { ThemeProvider } from "styled-components";
+import useTheme from "../useTheme";
+import BreadcrumbsProps, { Item } from "./types";
+import { css } from "styled-components";
+import DxcActionIcon from "../action-icon/ActionIcon";
+import * as Popover from "@radix-ui/react-popover";
+import DxcContainer from "../container/Container";
+
+const defaultCollapsedIcon = (
+
+);
+
+const DropdownMenu = ({
+ collapsedIcon,
+ items,
+}: {
+ collapsedIcon: BreadcrumbsProps["collapsedIcon"];
+ items: BreadcrumbsProps["items"];
+}) => {
+ const [collapsed, setCollapsed] = useState(false);
+
+ return (
+
+
+ {
+ setCollapsed(!collapsed);
+ }}
+ title="Expand/collapse breadcrumbs menu"
+ />
+
+
+
+
+ {items.map((item, index) => (
+
+
+
+
+
+ ))}
+
+
+
+
+ );
+};
+
+const mapItems = (item: Item, index: number, { length }) => {
+ const isLast = index === length - 1;
+
+ return (
+
+ {isLast ? (
+ {item.label}
+ ) : (
+
+ {item.label}
+
+ )}
+
+ );
+};
+
+const mapMultipleItems = (
+ collapsedIcon: BreadcrumbsProps["collapsedIcon"],
+ items: BreadcrumbsProps["items"],
+ showRoot: BreadcrumbsProps["showRoot"]
+) => {
+ const first = items[0];
+ const last = items[items.length - 1];
+
+ return (
+ <>
+ {showRoot && (
+
+
+ {first.label}
+
+
+ )}
+
+
+
+
+ {last.label}
+
+ >
+ );
+};
+
+const DxcBreadcrumbs = ({
+ ariaLabel = "Breadcrumbs",
+ collapsedIcon,
+ items,
+ itemsBeforeCollapse = 4,
+ showRoot = true,
+}: BreadcrumbsProps) => {
+ const colorsTheme = useTheme();
+
+ return (
+
+
+
+ );
+};
+
+const OrderedList = styled.ol`
+ padding-left: 0;
+ display: flex;
+ align-items: center;
+ list-style-type: none;
+ margin: 0;
+
+ > li:not(:first-child) {
+ margin-left: 0.75rem;
+
+ > a,
+ > span,
+ > button {
+ margin-left: 0.75rem;
+ }
+ &::before {
+ display: inline-flex;
+ transform: rotate(15deg);
+ border-right: 2px solid #999;
+ height: 1rem;
+ content: "";
+ }
+ }
+`;
+
+const sharedStyles = css`
+ display: inline-flex;
+ justify-content: center;
+ align-items: center;
+ height: 24px;
+ font-family: "Open Sans", sans-serif;
+ font-size: 0.875rem;
+`;
+
+const ListItem = styled.li`
+ display: flex;
+ align-items: center;
+`;
+
+const Label = styled.span`
+ ${sharedStyles}
+ color: #000;
+`;
+
+const CurrentLabel = styled.span`
+ ${sharedStyles}
+ color: #999;
+`;
+
+const Link = styled.a`
+ border-radius: 2px;
+ padding: 0 2px;
+ color: #000000;
+ text-decoration: none;
+ cursor: pointer;
+
+ &:focus {
+ box-shadow: 0 0 0 2px #0095ff;
+ outline: none;
+ }
+`;
+
+const Text = styled.span`
+ box-sizing: border-box;
+ ${sharedStyles}
+ border: 1px solid transparent;
+
+ &:hover {
+ border-bottom: 1px solid #000000;
+ }
+`;
+
+export default DxcBreadcrumbs;
diff --git a/lib/src/breadcrumbs/types.ts b/lib/src/breadcrumbs/types.ts
new file mode 100644
index 000000000..91f69dfc1
--- /dev/null
+++ b/lib/src/breadcrumbs/types.ts
@@ -0,0 +1,16 @@
+type SVG = React.ReactNode & React.SVGProps;
+
+export type Item = {
+ label: string;
+ href?: string;
+};
+
+type Props = {
+ ariaLabel?: string;
+ collapsedIcon?: SVG;
+ items: Array- ;
+ itemsBeforeCollapse?: number;
+ showRoot?: boolean;
+};
+
+export default Props;
diff --git a/lib/src/common/variables.ts b/lib/src/common/variables.ts
index a669f2f8a..d24ea1a33 100644
--- a/lib/src/common/variables.ts
+++ b/lib/src/common/variables.ts
@@ -87,6 +87,18 @@ export const componentTokens = {
focusActionBorderColor: CoreTokens.color_blue_600,
overlayColor: CoreTokens.color_grey_800_a,
},
+ breadcrumbs: {
+ actionBackgroundColor: CoreTokens.color_transparent,
+ hoverActionBackgroundColor: CoreTokens.color_grey_100,
+ activeActionBackgroundColor: CoreTokens.color_grey_300,
+ disabledActionBackgroundColor: CoreTokens.color_transparent,
+ focusActionBorderColor: CoreTokens.color_blue_600,
+ actionIconColor: CoreTokens.color_black,
+ disabledActionIconColor: CoreTokens.color_grey_500,
+ hoverActionIconColor: CoreTokens.color_black,
+ focusActionIconColor: CoreTokens.color_black,
+ activeActionIconColor: CoreTokens.color_black,
+ },
box: {
backgroundColor: CoreTokens.color_white,
borderRadius: CoreTokens.border_radius_medium,
From 37ccdc1f14f3f855ead446c7401ef232be0b89a3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Iv=C3=A1n=20G=C3=B3mez=20Pinta?=
<44321109+GomezIvann@users.noreply.github.com>
Date: Tue, 13 Feb 2024 17:03:18 +0100
Subject: [PATCH 02/18] The Breadcrumbs now uses our Dropdown
---
lib/src/breadcrumbs/Breadcrumbs.stories.tsx | 31 +++-
lib/src/breadcrumbs/Breadcrumbs.tsx | 151 ++++++--------------
lib/src/breadcrumbs/dropdownTheme.ts | 52 +++++++
lib/src/breadcrumbs/types.ts | 7 +-
lib/src/common/variables.ts | 35 ++---
lib/src/dropdown/Dropdown.tsx | 16 +--
6 files changed, 146 insertions(+), 146 deletions(-)
create mode 100644 lib/src/breadcrumbs/dropdownTheme.ts
diff --git a/lib/src/breadcrumbs/Breadcrumbs.stories.tsx b/lib/src/breadcrumbs/Breadcrumbs.stories.tsx
index 23f3a4df3..ec8b13664 100644
--- a/lib/src/breadcrumbs/Breadcrumbs.stories.tsx
+++ b/lib/src/breadcrumbs/Breadcrumbs.stories.tsx
@@ -2,6 +2,7 @@ import React from "react";
import Title from "../../.storybook/components/Title";
import ExampleContainer from "../../.storybook/components/ExampleContainer";
import DxcBreadcrumbs from "./Breadcrumbs";
+import DxcContainer from "../container/Container";
export default {
title: "Breadcrumbs",
@@ -87,7 +88,7 @@ export const Chromatic = () => (
-
+
@@ -110,9 +111,35 @@ export const Chromatic = () => (
href: "",
},
]}
- collapsedIcon={collapsedIcon}
itemsBeforeCollapse={3}
/>
+
+
+
+
+
+
>
);
diff --git a/lib/src/breadcrumbs/Breadcrumbs.tsx b/lib/src/breadcrumbs/Breadcrumbs.tsx
index c57120ed4..fac860711 100644
--- a/lib/src/breadcrumbs/Breadcrumbs.tsx
+++ b/lib/src/breadcrumbs/Breadcrumbs.tsx
@@ -1,11 +1,10 @@
-import React, { useState } from "react";
+import React from "react";
import styled, { ThemeProvider } from "styled-components";
import useTheme from "../useTheme";
-import BreadcrumbsProps, { Item } from "./types";
-import { css } from "styled-components";
-import DxcActionIcon from "../action-icon/ActionIcon";
-import * as Popover from "@radix-ui/react-popover";
-import DxcContainer from "../container/Container";
+import BreadcrumbsProps, { ItemType } from "./types";
+import DxcDropdown from "../dropdown/Dropdown";
+import { HalstackProvider } from "../HalstackContext";
+import dropdownTheme from "./dropdownTheme";
const defaultCollapsedIcon = (
);
-const DropdownMenu = ({
- collapsedIcon,
- items,
-}: {
- collapsedIcon: BreadcrumbsProps["collapsedIcon"];
- items: BreadcrumbsProps["items"];
-}) => {
- const [collapsed, setCollapsed] = useState(false);
-
- return (
-
-
- {
- setCollapsed(!collapsed);
- }}
- title="Expand/collapse breadcrumbs menu"
- />
-
-
-
-
- {items.map((item, index) => (
-
-
-
-
-
- ))}
-
-
-
-
- );
-};
-
-const mapItems = (item: Item, index: number, { length }) => {
+const mapItems = (item: ItemType, index: number, { length }) => {
const isLast = index === length - 1;
return (
{isLast ? (
- {item.label}
+ {item.label}
) : (
-
+
-
{item.label}
-
+
)}
);
};
-const mapMultipleItems = (
- collapsedIcon: BreadcrumbsProps["collapsedIcon"],
- items: BreadcrumbsProps["items"],
- showRoot: BreadcrumbsProps["showRoot"]
-) => {
+const mapMultipleItems = (items: BreadcrumbsProps["items"], showRoot: BreadcrumbsProps["showRoot"]) => {
const first = items[0];
const last = items[items.length - 1];
@@ -96,16 +36,26 @@ const mapMultipleItems = (
<>
{showRoot && (
-
+ -
{first.label}
-
+
)}
-
+
+ ({ label, value: href }))}
+ onSelectOption={(value) => {
+ window.location.href = value;
+ }}
+ caretHidden
+ margin={showRoot && { left: "small" }}
+ />
+
-
- {last.label}
+
+ {last.label}
>
);
@@ -113,7 +63,6 @@ const mapMultipleItems = (
const DxcBreadcrumbs = ({
ariaLabel = "Breadcrumbs",
- collapsedIcon,
items,
itemsBeforeCollapse = 4,
showRoot = true,
@@ -125,7 +74,7 @@ const DxcBreadcrumbs = ({
@@ -134,22 +83,20 @@ const DxcBreadcrumbs = ({
};
const OrderedList = styled.ol`
+ margin: 0;
padding-left: 0;
display: flex;
+ gap: 0.75rem;
align-items: center;
list-style-type: none;
- margin: 0;
> li:not(:first-child) {
- margin-left: 0.75rem;
-
> a,
- > span,
- > button {
+ > span {
margin-left: 0.75rem;
}
&::before {
- display: inline-flex;
+ margin: 0 0.125rem;
transform: rotate(15deg);
border-right: 2px solid #999;
height: 1rem;
@@ -158,50 +105,40 @@ const OrderedList = styled.ol`
}
`;
-const sharedStyles = css`
- display: inline-flex;
- justify-content: center;
- align-items: center;
- height: 24px;
- font-family: "Open Sans", sans-serif;
- font-size: 0.875rem;
-`;
-
const ListItem = styled.li`
display: flex;
align-items: center;
-`;
-
-const Label = styled.span`
- ${sharedStyles}
+ font-family: "Open Sans", sans-serif;
+ font-size: 0.875rem;
color: #000;
`;
-const CurrentLabel = styled.span`
- ${sharedStyles}
- color: #999;
+const CurrentItem = styled.span`
+ font-weight: 600;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
`;
-const Link = styled.a`
+const Item = styled.a`
border-radius: 2px;
padding: 0 2px;
- color: #000000;
+ display: inline-flex;
+ align-items: center;
+ height: 24px;
+ color: #000;
text-decoration: none;
cursor: pointer;
&:focus {
- box-shadow: 0 0 0 2px #0095ff;
- outline: none;
+ outline: 2px solid #0095ff;
}
`;
const Text = styled.span`
- box-sizing: border-box;
- ${sharedStyles}
border: 1px solid transparent;
-
&:hover {
- border-bottom: 1px solid #000000;
+ border-bottom: 1px solid #000;
}
`;
diff --git a/lib/src/breadcrumbs/dropdownTheme.ts b/lib/src/breadcrumbs/dropdownTheme.ts
new file mode 100644
index 000000000..bca9ec62f
--- /dev/null
+++ b/lib/src/breadcrumbs/dropdownTheme.ts
@@ -0,0 +1,52 @@
+export default {
+ dropdown: {
+ // Breadcrumbs tokens
+ buttonIconSize: "16px",
+ buttonPaddingTop: "4px",
+ buttonPaddingBottom: "4px",
+ buttonPaddingLeft: "4px",
+ buttonPaddingRight: "4px",
+ buttonHeight: "24px",
+ buttonBorderRadius: "2px",
+ buttonBorderColor: "transparent",
+ optionFontSize: "14px",
+ optionPaddingTop: "0px",
+ optionPaddingBottom: "0px",
+ optionPaddingLeft: "16px",
+ optionPaddingRight: "16px",
+
+ // Dropdown tokens
+ buttonBackgroundColor: "#ffffff",
+ hoverButtonBackgroundColor: "#f2f2f2",
+ activeButtonBackgroundColor: "#cccccc",
+ buttonFontFamily: "Open Sans, sans-serif",
+ buttonFontSize: "1rem",
+ buttonFontStyle: "normal",
+ buttonFontWeight: "400",
+ buttonFontColor: "#000000",
+ buttonIconSpacing: "10px",
+ buttonIconColor: "#000000",
+ disabledColor: "#999999",
+ disabledButtonBackgroundColor: "transparent",
+ disabledBorderColor: "transparent",
+ optionBackgroundColor: "#ffffff",
+ hoverOptionBackgroundColor: "#f2f2f2",
+ activeOptionBackgroundColor: "#cccccc",
+ optionFontFamily: "Open Sans, sans-serif",
+ optionFontStyle: "normal",
+ optionFontWeight: "400",
+ optionFontColor: "#000000",
+ optionIconSize: "20px",
+ optionIconSpacing: "10px",
+ optionIconColor: "#000000",
+ caretIconSize: "24px",
+ caretIconColor: "#000000",
+ caretIconSpacing: "12px",
+ borderRadius: "4px",
+ borderStyle: "none",
+ borderThickness: "0px",
+ borderColor: "transparent",
+ scrollBarThumbColor: "#666666",
+ scrollBarTrackColor: "#cccccc",
+ },
+};
diff --git a/lib/src/breadcrumbs/types.ts b/lib/src/breadcrumbs/types.ts
index 91f69dfc1..9c3ceff72 100644
--- a/lib/src/breadcrumbs/types.ts
+++ b/lib/src/breadcrumbs/types.ts
@@ -1,14 +1,11 @@
-type SVG = React.ReactNode & React.SVGProps;
-
-export type Item = {
+export type ItemType = {
label: string;
href?: string;
};
type Props = {
ariaLabel?: string;
- collapsedIcon?: SVG;
- items: Array- ;
+ items: Array;
itemsBeforeCollapse?: number;
showRoot?: boolean;
};
diff --git a/lib/src/common/variables.ts b/lib/src/common/variables.ts
index d24ea1a33..6834a3f38 100644
--- a/lib/src/common/variables.ts
+++ b/lib/src/common/variables.ts
@@ -88,16 +88,6 @@ export const componentTokens = {
overlayColor: CoreTokens.color_grey_800_a,
},
breadcrumbs: {
- actionBackgroundColor: CoreTokens.color_transparent,
- hoverActionBackgroundColor: CoreTokens.color_grey_100,
- activeActionBackgroundColor: CoreTokens.color_grey_300,
- disabledActionBackgroundColor: CoreTokens.color_transparent,
- focusActionBorderColor: CoreTokens.color_blue_600,
- actionIconColor: CoreTokens.color_black,
- disabledActionIconColor: CoreTokens.color_grey_500,
- hoverActionIconColor: CoreTokens.color_black,
- focusActionIconColor: CoreTokens.color_black,
- activeActionIconColor: CoreTokens.color_black,
},
box: {
backgroundColor: CoreTokens.color_white,
@@ -296,9 +286,14 @@ export const componentTokens = {
buttonPaddingBottom: "0px",
buttonPaddingLeft: "16px",
buttonPaddingRight: "16px",
+ buttonHeight: "40px",
+ buttonBorderRadius: "4px",
+ buttonBorderStyle: CoreTokens.border_none,
+ buttonBorderThickness: CoreTokens.border_width_0,
+ buttonBorderColor: CoreTokens.color_transparent,
disabledColor: CoreTokens.color_grey_500,
disabledButtonBackgroundColor: CoreTokens.color_transparent,
- disabledBorderColor: CoreTokens.color_transparent,
+ disabledButtonBorderColor: CoreTokens.color_transparent,
optionBackgroundColor: CoreTokens.color_white,
hoverOptionBackgroundColor: CoreTokens.color_grey_100,
activeOptionBackgroundColor: CoreTokens.color_grey_300,
@@ -317,10 +312,6 @@ export const componentTokens = {
caretIconSize: "24px",
caretIconColor: CoreTokens.color_black,
caretIconSpacing: "12px",
- borderRadius: "4px",
- borderStyle: CoreTokens.border_none,
- borderThickness: CoreTokens.border_width_0,
- borderColor: CoreTokens.color_transparent,
scrollBarThumbColor: CoreTokens.color_grey_700,
scrollBarTrackColor: CoreTokens.color_grey_300,
focusColor: CoreTokens.color_blue_600,
@@ -1296,13 +1287,13 @@ export type OpinionatedTheme = {
};
export const spaces = {
- xxsmall: "6px",
- xsmall: "16px",
- small: "24px",
- medium: "36px",
- large: "48px",
- xlarge: "64px",
- xxlarge: "100px",
+ xxsmall: "4px",
+ xsmall: "8px",
+ small: "12px",
+ medium: "16px",
+ large: "24px",
+ xlarge: "32px",
+ xxlarge: "48px",
};
export const responsiveSizes = {
diff --git a/lib/src/dropdown/Dropdown.tsx b/lib/src/dropdown/Dropdown.tsx
index a3b75e053..339d3480e 100644
--- a/lib/src/dropdown/Dropdown.tsx
+++ b/lib/src/dropdown/Dropdown.tsx
@@ -242,10 +242,7 @@ const calculateWidth = (margin, size) =>
: sizes[size];
const DropdownContainer = styled.div<{ margin: DropdownPropsType["margin"]; size: DropdownPropsType["size"] }>`
- display: inline-block;
width: ${(props) => calculateWidth(props.margin, props.size)};
- text-overflow: ellipsis;
- overflow: hidden;
margin: ${(props) => (props.margin && typeof props.margin !== "object" ? spaces[props.margin] : "0px")};
margin-top: ${(props) =>
props.margin && typeof props.margin === "object" && props.margin.top ? spaces[props.margin.top] : ""};
@@ -267,12 +264,12 @@ const DropdownTrigger = styled.button<{
align-items: center;
gap: ${(props) => props.theme.caretIconSpacing};
width: 100%;
- min-height: 40px;
+ height: ${(props) => props.theme.buttonHeight};
min-width: ${(props) => (props.label === "" ? "0px" : calculateWidth(props.margin, props.size))};
- border-radius: ${(props) => props.theme.borderRadius};
- border-width: ${(props) => props.theme.borderThickness};
- border-style: ${(props) => props.theme.borderStyle};
- border-color: ${(props) => (props.disabled ? props.theme.disabledBorderColor : props.theme.borderColor)};
+ border-radius: ${(props) => props.theme.buttonBorderRadius};
+ border-width: ${(props) => props.theme.buttonBorderThickness};
+ border-style: ${(props) => props.theme.buttonBorderStyle};
+ border-color: ${(props) => (props.disabled ? props.theme.disabledButtonBorderColor : props.theme.buttonBorderColor)};
padding-top: ${(props) => props.theme.buttonPaddingTop};
padding-bottom: ${(props) => props.theme.buttonPaddingBottom};
padding-left: ${(props) => props.theme.buttonPaddingLeft};
@@ -286,8 +283,7 @@ const DropdownTrigger = styled.button<{
!props.disabled &&
`
&:focus {
- outline: ${props.theme.focusColor} solid 2px;
- outline-offset: -2px;
+ outline: 2px solid ${props.theme.focusColor};
}
&:hover {
background-color: ${props.theme.hoverButtonBackgroundColor};
From d219534f6bfebdb8fe48cf68bf10ddc89dbeda2d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Iv=C3=A1n=20G=C3=B3mez=20Pinta?=
<44321109+GomezIvann@users.noreply.github.com>
Date: Thu, 15 Feb 2024 11:09:19 +0100
Subject: [PATCH 03/18] Adding tooltip to the Breadcrumbs
---
lib/src/breadcrumbs/Breadcrumbs.tsx | 77 +++++++++++++++--------------
1 file changed, 40 insertions(+), 37 deletions(-)
diff --git a/lib/src/breadcrumbs/Breadcrumbs.tsx b/lib/src/breadcrumbs/Breadcrumbs.tsx
index fac860711..0dd2b568d 100644
--- a/lib/src/breadcrumbs/Breadcrumbs.tsx
+++ b/lib/src/breadcrumbs/Breadcrumbs.tsx
@@ -1,4 +1,4 @@
-import React from "react";
+import React, { useEffect, useRef } from "react";
import styled, { ThemeProvider } from "styled-components";
import useTheme from "../useTheme";
import BreadcrumbsProps, { ItemType } from "./types";
@@ -28,54 +28,56 @@ const mapItems = (item: ItemType, index: number, { length }) => {
);
};
-const mapMultipleItems = (items: BreadcrumbsProps["items"], showRoot: BreadcrumbsProps["showRoot"]) => {
- const first = items[0];
- const last = items[items.length - 1];
-
- return (
- <>
- {showRoot && (
-
-
-
- {first.label}
-
-
- )}
-
-
- ({ label, value: href }))}
- onSelectOption={(value) => {
- window.location.href = value;
- }}
- caretHidden
- margin={showRoot && { left: "small" }}
- />
-
-
-
- {last.label}
-
- >
- );
-};
-
const DxcBreadcrumbs = ({
ariaLabel = "Breadcrumbs",
items,
itemsBeforeCollapse = 4,
showRoot = true,
}: BreadcrumbsProps) => {
+ const currentItemRef = useRef(null);
const colorsTheme = useTheme();
+ useEffect(() => {
+ if (currentItemRef?.current != null) {
+ if (currentItemRef?.current.scrollWidth > currentItemRef?.current.clientWidth)
+ currentItemRef.current.title = items[items.length - 1].label;
+ else currentItemRef.current.title = "";
+ }
+ }, [items]);
+
return (
@@ -118,6 +120,7 @@ const CurrentItem = styled.span`
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
+ cursor: default;
`;
const Item = styled.a`
From 61c0262302d812b8849fa5f427578ec4243297ed Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Iv=C3=A1n=20G=C3=B3mez=20Pinta?=
<44321109+GomezIvann@users.noreply.github.com>
Date: Thu, 15 Feb 2024 13:05:04 +0100
Subject: [PATCH 04/18] Adding core tokens, stories & more
---
.../components/ExampleContainer.tsx | 12 +-
lib/src/breadcrumbs/Breadcrumbs.stories.tsx | 139 +++++++++++-------
lib/src/breadcrumbs/Breadcrumbs.tsx | 35 ++---
3 files changed, 117 insertions(+), 69 deletions(-)
diff --git a/lib/.storybook/components/ExampleContainer.tsx b/lib/.storybook/components/ExampleContainer.tsx
index 06327682a..ed873a6df 100644
--- a/lib/.storybook/components/ExampleContainer.tsx
+++ b/lib/.storybook/components/ExampleContainer.tsx
@@ -1,9 +1,19 @@
import React from "react";
import styled from "styled-components";
+type PseudoStates =
+ | "pseudo-active"
+ | "pseudo-focus"
+ | "pseudo-focus-visible"
+ | "pseudo-focus-within"
+ | "pseudo-hover"
+ | "pseudo-link"
+ | "pseudo-target"
+ | "pseudo-visited";
+
type Props = {
children?: React.ReactNode;
- pseudoState?: string;
+ pseudoState?: PseudoStates;
expanded?: boolean;
};
diff --git a/lib/src/breadcrumbs/Breadcrumbs.stories.tsx b/lib/src/breadcrumbs/Breadcrumbs.stories.tsx
index ec8b13664..450b197c4 100644
--- a/lib/src/breadcrumbs/Breadcrumbs.stories.tsx
+++ b/lib/src/breadcrumbs/Breadcrumbs.stories.tsx
@@ -3,18 +3,14 @@ import Title from "../../.storybook/components/Title";
import ExampleContainer from "../../.storybook/components/ExampleContainer";
import DxcBreadcrumbs from "./Breadcrumbs";
import DxcContainer from "../container/Container";
+import { HalstackProvider } from "../HalstackContext";
+import { userEvent, within } from "@storybook/testing-library";
export default {
title: "Breadcrumbs",
component: DxcBreadcrumbs,
};
-const collapsedIcon = (
-
-);
-
const items = [
{
label: "Home",
@@ -38,9 +34,9 @@ const items = [
},
];
-export const Chromatic = () => (
+const Breadcrumbs = () => (
<>
-
+
(
]}
/>
-
-
-
-
-
+
-
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
-
+
-
+
+
+
-
+
(
/>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
>
);
+
+export const Chromatic = Breadcrumbs.bind({});
+Chromatic.play = async ({ canvasElement }) => {
+ const canvas = within(canvasElement);
+ const dropdowns = canvas.getAllByRole("button");
+ await userEvent.click(dropdowns[dropdowns.length - 1]);
+};
diff --git a/lib/src/breadcrumbs/Breadcrumbs.tsx b/lib/src/breadcrumbs/Breadcrumbs.tsx
index 0dd2b568d..deaff57a8 100644
--- a/lib/src/breadcrumbs/Breadcrumbs.tsx
+++ b/lib/src/breadcrumbs/Breadcrumbs.tsx
@@ -5,6 +5,7 @@ import BreadcrumbsProps, { ItemType } from "./types";
import DxcDropdown from "../dropdown/Dropdown";
import { HalstackProvider } from "../HalstackContext";
import dropdownTheme from "./dropdownTheme";
+import CoreTokens from "../common/coreTokens";
const defaultCollapsedIcon = (
-
-
-
-
+
+
>
);
diff --git a/lib/src/breadcrumbs/Breadcrumbs.test.tsx b/lib/src/breadcrumbs/Breadcrumbs.test.tsx
index 6474c931a..199a62069 100644
--- a/lib/src/breadcrumbs/Breadcrumbs.test.tsx
+++ b/lib/src/breadcrumbs/Breadcrumbs.test.tsx
@@ -69,13 +69,13 @@ describe("Breadcrumbs component tests", () => {
);
userEvent.click(getByText("Home"));
- expect(onItemClick).toHaveBeenCalled();
+ expect(onItemClick).toHaveBeenCalledWith("/home");
});
test("The onClick prop from an item is properly called (collapsed)", async () => {
const onItemClick = jest.fn();
@@ -92,6 +92,6 @@ describe("Breadcrumbs component tests", () => {
);
await userEvent.click(getByRole("button"));
await userEvent.click(getByText("Preferences"));
- expect(onItemClick).toHaveBeenCalled();
+ expect(onItemClick).toHaveBeenCalledWith("/");
});
});
From ec7841e1efba8304ec9b911b00cd9ff230c79600 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Iv=C3=A1n=20G=C3=B3mez=20Pinta?=
<44321109+GomezIvann@users.noreply.github.com>
Date: Fri, 22 Mar 2024 09:41:34 +0100
Subject: [PATCH 17/18] Breadcrumbs stories updated
---
lib/src/breadcrumbs/Breadcrumbs.stories.tsx | 25 +++++++++++----------
1 file changed, 13 insertions(+), 12 deletions(-)
diff --git a/lib/src/breadcrumbs/Breadcrumbs.stories.tsx b/lib/src/breadcrumbs/Breadcrumbs.stories.tsx
index b4d467361..c518631bb 100644
--- a/lib/src/breadcrumbs/Breadcrumbs.stories.tsx
+++ b/lib/src/breadcrumbs/Breadcrumbs.stories.tsx
@@ -48,8 +48,9 @@ const items = [
const Breadcrumbs = () => (
<>
-
+
+
(
]}
/>
-
+
-
+
-
+
-
+
-
+
-
+
(
/>
-
+
(
/>
-
-
+
+
(
-
+
(
-
+
>
From 1849ef6b47d399f1ec91c43d7b0987dc772d8e29 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Iv=C3=A1n=20G=C3=B3mez=20Pinta?=
<44321109+GomezIvann@users.noreply.github.com>
Date: Fri, 22 Mar 2024 09:55:16 +0100
Subject: [PATCH 18/18] More breadcrumbs stories
---
lib/src/breadcrumbs/Breadcrumbs.stories.tsx | 35 +++++++++++----------
1 file changed, 18 insertions(+), 17 deletions(-)
diff --git a/lib/src/breadcrumbs/Breadcrumbs.stories.tsx b/lib/src/breadcrumbs/Breadcrumbs.stories.tsx
index c518631bb..31187d644 100644
--- a/lib/src/breadcrumbs/Breadcrumbs.stories.tsx
+++ b/lib/src/breadcrumbs/Breadcrumbs.stories.tsx
@@ -48,9 +48,8 @@ const items = [
const Breadcrumbs = () => (
<>
-
+
-
(
]}
/>
+
-
+
-
+
+
+
+
+
+
+
-
+
-
+
-
+
-
(
/>
+
-
(
/>
+
-
+
-
(
+
-
(
-
-
-
-
>
);
@@ -189,5 +190,5 @@ export const Chromatic = Breadcrumbs.bind({});
Chromatic.play = async ({ canvasElement }) => {
const canvas = within(canvasElement);
const dropdowns = canvas.getAllByRole("button");
- await userEvent.click(dropdowns[dropdowns.length - 1]);
+ await userEvent.click(dropdowns[2]);
};