Skip to content

Commit 8411216

Browse files
authored
Merge pull request #28 from codegouvfr/fix-breadcrumb
fix(Breadcrumb): classes+i18n
2 parents a898c51 + ecb31cf commit 8411216

File tree

2 files changed

+39
-31
lines changed

2 files changed

+39
-31
lines changed

src/Breadcrumb.tsx

Lines changed: 39 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,73 +1,71 @@
1-
import React, { memo, forwardRef, useId } from "react";
1+
import React, { memo, forwardRef, useId, ReactNode } from "react";
22
import { symToStr } from "tsafe/symToStr";
3+
import { assert } from "tsafe/assert";
4+
import type { Equals } from "tsafe";
5+
36
import { RegisteredLinkProps, useLink } from "./lib/routing";
7+
import { createComponentI18nApi } from "./lib/i18n";
48
import { fr } from "./lib";
59
import { cx } from "./lib/tools/cx";
610

7-
// We make users import dsfr.css, so we don't need to import the scoped CSS
8-
// but in the future if we have a complete component coverage it
9-
// we could stop requiring users to import the hole CSS and only import on a
10-
// per component basis.
1111
import "./dsfr/component/breadcrumb/breadcrumb.css";
1212

1313
export type BreadcrumbProps = {
1414
className?: string;
1515
links: BreadcrumbProps.Link[];
16+
classes?: Partial<Record<"root" | "button" | "collapse" | "list" | "link" | "text", string>>;
1617
};
1718

1819
export namespace BreadcrumbProps {
1920
export type Link = {
20-
text: string;
21+
text: ReactNode;
2122
linkProps: RegisteredLinkProps;
2223
isActive?: boolean;
2324
};
2425
}
2526

26-
//Longueur et lisibilité : Afin qu’il reste lisible, évitez que le fil d’Ariane soit trop long et passe sur plusieurs lignes.
27-
// Si les titres de page de votre site sont longs, nous conseillons de n’afficher que les 4 premiers mots du nom de la page courante et d’indiquer que l’élément est tronqué par l’affichage de “…”
28-
const trimText = (label: string) => {
29-
if (label && label.split(" ").length > 4) {
30-
return label.split(" ").slice(0, 4).join(" ") + "...";
31-
}
32-
return label;
33-
};
34-
3527
/** @see <https://react-dsfr-components.etalab.studio/?path=/docs/components-breadcrumb> */
3628
export const Breadcrumb = memo(
3729
forwardRef<HTMLDivElement, BreadcrumbProps>((props, ref) => {
38-
const { links, className, ...rest } = props;
30+
const { links, className, classes = {}, ...rest } = props;
31+
32+
assert<Equals<keyof typeof rest, never>>();
33+
34+
const { t } = useTranslation();
3935

4036
const { Link } = useLink();
4137
const breadcrumbId = useId();
38+
4239
return (
4340
<nav
4441
ref={ref}
4542
role="navigation"
46-
className={cx(fr.cx("fr-breadcrumb"), className)}
47-
aria-label="vous êtes ici :"
43+
className={cx(fr.cx("fr-breadcrumb"), classes.root, className)}
44+
aria-label={`${t("navigation label")} :`}
4845
{...rest}
4946
>
5047
<button
51-
className="fr-breadcrumb__button"
48+
className={cx(fr.cx("fr-breadcrumb__button"), classes.button)}
5249
aria-expanded="false"
5350
aria-controls={breadcrumbId}
5451
>
55-
Voir le fil d’Ariane
52+
{t("show breadcrumb")}
5653
</button>
57-
<div className="fr-collapse" id={breadcrumbId}>
58-
<ol className="fr-breadcrumb__list">
54+
<div className={cx(fr.cx("fr-collapse"), classes.collapse)} id={breadcrumbId}>
55+
<ol className={cx(fr.cx("fr-breadcrumb__list"), classes.list)}>
5956
<>
6057
{links.map(link => (
6158
<li key={link.linkProps.href}>
6259
<Link
6360
{...link.linkProps}
6461
className={cx(
6562
fr.cx("fr-breadcrumb__link"),
63+
classes.link,
6664
link.linkProps.className
6765
)}
6866
aria-current={link.isActive ? "page" : undefined}
6967
>
70-
{trimText(link.text)}
68+
{link.text}
7169
</Link>
7270
</li>
7371
))}
@@ -81,4 +79,22 @@ export const Breadcrumb = memo(
8179

8280
Breadcrumb.displayName = symToStr({ Breadcrumb });
8381

82+
const { useTranslation, addBreadcrumbTranslations } = createComponentI18nApi({
83+
"componentName": symToStr({ Breadcrumb }),
84+
"frMessages": {
85+
"show breadcrumb": "Voir le fil d’Ariane",
86+
"navigation label": "vous êtes ici"
87+
}
88+
});
89+
90+
addBreadcrumbTranslations({
91+
"lang": "en",
92+
"messages": {
93+
"show breadcrumb": "Show navigation",
94+
"navigation label": "you are here"
95+
}
96+
});
97+
98+
export { addBreadcrumbTranslations };
99+
84100
export default Breadcrumb;

stories/Breadcrumb.stories.tsx

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,3 @@ export const LongBreadcrumb = getStory({
3939
{ text: "Page de démo 7", linkProps: { href: "/page7" }, isActive: true }
4040
]
4141
});
42-
43-
export const LongLabelBreadcrumb = getStory({
44-
links: [
45-
{ text: "Accueil", linkProps: { href: "/" } },
46-
{ text: "Page 1", linkProps: { href: "/page1" } },
47-
{ text: "Un article très très long", linkProps: { href: "/article1" }, isActive: true }
48-
]
49-
});

0 commit comments

Comments
 (0)