@purpurds/breadcrumbs 6.12.5 → 7.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"breadcrumbs.es.js","sources":["../../icon/dist/icon-CbdbqC3C.mjs","../../icon/dist/components/home.es.js","../../../common/temp/node_modules/.pnpm/classnames@2.5.1/node_modules/classnames/index.js","../src/meta.ts","../src/breadcrumbs.tsx"],"sourcesContent":["import { jsx as l } from \"react/jsx-runtime\";\nfunction f(r) {\n return r && r.__esModule && Object.prototype.hasOwnProperty.call(r, \"default\") ? r.default : r;\n}\nvar c = { exports: {} };\n/*!\n\tCopyright (c) 2018 Jed Watson.\n\tLicensed under the MIT License (MIT), see\n\thttp://jedwatson.github.io/classnames\n*/\nvar p;\nfunction m() {\n return p || (p = 1, function(r) {\n (function() {\n var e = {}.hasOwnProperty;\n function o() {\n for (var t = \"\", n = 0; n < arguments.length; n++) {\n var s = arguments[n];\n s && (t = i(t, u.call(this, s)));\n }\n return t;\n }\n function u(t) {\n if (typeof t == \"string\" || typeof t == \"number\")\n return this && this[t] || t;\n if (typeof t != \"object\")\n return \"\";\n if (Array.isArray(t))\n return o.apply(this, t);\n if (t.toString !== Object.prototype.toString && !t.toString.toString().includes(\"[native code]\"))\n return t.toString();\n var n = \"\";\n for (var s in t)\n e.call(t, s) && t[s] && (n = i(n, this && this[s] || s));\n return n;\n }\n function i(t, n) {\n return n ? t ? t + \" \" + n : t + n : t;\n }\n r.exports ? (o.default = o, r.exports = o) : window.classNames = o;\n })();\n }(c)), c.exports;\n}\nvar _ = m();\nconst d = /* @__PURE__ */ f(_), v = {\n \"purpur-icon\": \"_purpur-icon_8u1lq_1\",\n \"purpur-icon--xxs\": \"_purpur-icon--xxs_8u1lq_4\",\n \"purpur-icon--xs\": \"_purpur-icon--xs_8u1lq_8\",\n \"purpur-icon--sm\": \"_purpur-icon--sm_8u1lq_12\",\n \"purpur-icon--md\": \"_purpur-icon--md_8u1lq_16\",\n \"purpur-icon--lg\": \"_purpur-icon--lg_8u1lq_20\",\n \"purpur-icon--xl\": \"_purpur-icon--xl_8u1lq_24\"\n}, g = d.bind(v), a = \"purpur-icon\", x = \"md\", h = (r) => r.filter((e) => Object.keys(e).length >= 1).map((e) => `${e.name}=\"${e.value}\"`).join(\" \"), b = ({ content: r = \"\", title: e } = {}) => {\n const o = [\n { name: \"xmlns\", value: \"http://www.w3.org/2000/svg\" },\n { name: \"fill\", value: \"currentColor\" },\n { name: \"viewBox\", value: \"0 0 24 24\" },\n e ? { name: \"role\", value: \"img\" } : { name: \"aria-hidden\", value: \"true\" }\n ], u = e ? `<title>${e}</title>` : \"\";\n return `<svg ${h(o)}>${u}${r}</svg>`;\n}, S = (r) => r.replace(/<(\\/?)svg([^>]*)>/g, \"\").trim(), y = ({\n [\"data-testid\"]: r,\n svg: e,\n allyTitle: o,\n className: u,\n size: i = x,\n ...t\n}) => {\n const n = b({\n content: S(e.svg),\n title: o\n }), s = g(u, a, `${a}--${i}`);\n return /* @__PURE__ */ l(\n \"span\",\n {\n \"aria-label\": o,\n className: s,\n \"data-testid\": r,\n dangerouslySetInnerHTML: { __html: n },\n ...t\n }\n );\n};\ny.displayName = \"Icon\";\nexport {\n y as I\n};\n//# sourceMappingURL=icon-CbdbqC3C.mjs.map\n","import { jsx as e } from \"react/jsx-runtime\";\nimport { I as a } from \"../icon-CbdbqC3C.mjs\";\nconst v = {\n name: \"home\",\n svg: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path fill-rule=\"evenodd\" d=\"M11.38 1.848a.9.9 0 0 1 1.24 0l8.69 8.276c1.242 1.183.405 3.276-1.31 3.276h-.6v8.1a.9.9 0 0 1-.9.9h-13a.9.9 0 0 1-.9-.9v-8.1H4c-1.715 0-2.552-2.093-1.31-3.276l8.69-8.276ZM12 3.743l-8.069 7.685c-.026.024-.03.04-.032.049a.11.11 0 0 0 .008.06.11.11 0 0 0 .036.049c.007.005.021.014.057.014h1.5a.9.9 0 0 1 .9.9v8.1h11.2v-8.1a.9.9 0 0 1 .9-.9H20c.036 0 .05-.009.057-.014a.111.111 0 0 0 .036-.049.111.111 0 0 0 .008-.06c-.002-.008-.006-.025-.032-.05L12 3.744ZM10.6 14a.9.9 0 0 1 .9-.9H15a.9.9 0 0 1 .9.9v4a.9.9 0 0 1-.9.9h-3.5a.9.9 0 0 1-.9-.9v-4Zm1.8.9v2.2h1.7v-2.2h-1.7Z\" clip-rule=\"evenodd\"/></svg>',\n keywords: [\"home\"],\n category: \"buildings\"\n}, c = (o) => /* @__PURE__ */ e(a, { ...o, svg: v });\nc.displayName = \"IconHome\";\nexport {\n c as IconHome\n};\n//# sourceMappingURL=home.es.js.map\n","/*!\n\tCopyright (c) 2018 Jed Watson.\n\tLicensed under the MIT License (MIT), see\n\thttp://jedwatson.github.io/classnames\n*/\n/* global define */\n\n(function () {\n\t'use strict';\n\n\tvar hasOwn = {}.hasOwnProperty;\n\n\tfunction classNames () {\n\t\tvar classes = '';\n\n\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\tvar arg = arguments[i];\n\t\t\tif (arg) {\n\t\t\t\tclasses = appendClass(classes, parseValue(arg));\n\t\t\t}\n\t\t}\n\n\t\treturn classes;\n\t}\n\n\tfunction parseValue (arg) {\n\t\tif (typeof arg === 'string' || typeof arg === 'number') {\n\t\t\treturn arg;\n\t\t}\n\n\t\tif (typeof arg !== 'object') {\n\t\t\treturn '';\n\t\t}\n\n\t\tif (Array.isArray(arg)) {\n\t\t\treturn classNames.apply(null, arg);\n\t\t}\n\n\t\tif (arg.toString !== Object.prototype.toString && !arg.toString.toString().includes('[native code]')) {\n\t\t\treturn arg.toString();\n\t\t}\n\n\t\tvar classes = '';\n\n\t\tfor (var key in arg) {\n\t\t\tif (hasOwn.call(arg, key) && arg[key]) {\n\t\t\t\tclasses = appendClass(classes, key);\n\t\t\t}\n\t\t}\n\n\t\treturn classes;\n\t}\n\n\tfunction appendClass (value, newClass) {\n\t\tif (!newClass) {\n\t\t\treturn value;\n\t\t}\n\t\n\t\tif (value) {\n\t\t\treturn value + ' ' + newClass;\n\t\t}\n\t\n\t\treturn value + newClass;\n\t}\n\n\tif (typeof module !== 'undefined' && module.exports) {\n\t\tclassNames.default = classNames;\n\t\tmodule.exports = classNames;\n\t} else if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {\n\t\t// register as 'classnames', consistent with npm package name\n\t\tdefine('classnames', [], function () {\n\t\t\treturn classNames;\n\t\t});\n\t} else {\n\t\twindow.classNames = classNames;\n\t}\n}());\n","export type MetaListItem = {\n \"@type\": string;\n position: number;\n name: string;\n item: string;\n};\n\ntype MakeMetaListItem = (name: string, item: string, position: number) => MetaListItem;\n\nexport const metaListItem: MakeMetaListItem = (name, item, position) => ({\n \"@type\": \"ListItem\",\n position,\n name,\n item,\n});\n\nexport const metaSchema = (itemListElement: MetaListItem[]) =>\n JSON.stringify({\n \"@context\": \"https://schema.org\",\n \"@type\": \"BreadcrumbList\",\n itemListElement,\n });\n","import React, { Children, cloneElement, createElement, ReactElement } from \"react\";\nimport { IconHome } from \"@purpurds/icon/home\";\nimport c from \"classnames\";\n\nimport styles from \"./breadcrumbs.module.scss\";\nimport { MetaListItem, metaListItem, metaSchema } from \"./meta\";\nimport { DataAttributes } from \"./types.ts\";\n\nexport type BreadcrumbsProps = React.HTMLAttributes<HTMLElement> &\n DataAttributes & {\n ariaLabel?: string;\n children: ReactElement<BreadcrumbsItemProps> | Array<ReactElement<BreadcrumbsItemProps>>;\n /** Set to generate breadcrumbs metadata for crawlers. Defaults to true. */\n meta?: boolean;\n /** Set to render the breadcrumbs with light font color. Ideally used when rendered on dark backgrounds. */\n negative?: boolean;\n /** Set to render the last breadcrumb item in bold font to indicate that this is the current page. Setting this to false will render the last item as a normal breadcrumb link. Defaults to true. */\n highlightLast?: boolean;\n /** Set to not render the home icon in front of the first breadcrumb item. */\n hideHomeIcon?: boolean;\n };\n\ntype CommonItemProps = Omit<React.HTMLAttributes<HTMLLIElement>, \"onClick\"> &\n DataAttributes & {\n current?: boolean;\n negative?: boolean;\n ariaLabel?: string;\n meta?: boolean;\n onClick?: () => void;\n };\n\nexport type BreadcrumbsItemProps = CommonItemProps & Conditional;\n\ntype Conditional =\n | {\n href?: string;\n children: string;\n }\n | {\n href?: never;\n children: ReactElement<HTMLAnchorElement>;\n };\n\nconst rootClassName = \"purpur-breadcrumbs\";\nconst itemClassName = \"purpur-breadcrumb-item\";\n\nconst Breadcrumbs = ({\n ariaLabel,\n children,\n className,\n meta = true,\n negative = false,\n highlightLast = true,\n hideHomeIcon,\n ...props\n}: BreadcrumbsProps) => {\n const classes = c([\n className,\n styles[rootClassName],\n styles[`${rootClassName}--${negative ? \"negative\" : \"default\"}`],\n ]);\n\n const maxIndex = Children.count(children);\n\n const metaListItems: MetaListItem[] = [];\n\n const items = Children.map(children, (item, index) => {\n const position = index + 1;\n const last = maxIndex === position;\n const current = highlightLast && last;\n\n const grandChildren = item.props.children;\n const grandGrandChildren = typeof grandChildren === \"string\" ? null : grandChildren.props;\n\n let name = null,\n href = null;\n\n if (typeof grandChildren === \"string\") {\n name = grandChildren;\n href = item.props.href;\n } else if (grandGrandChildren?.children && typeof grandGrandChildren?.children === \"string\") {\n name = grandGrandChildren.children;\n href = grandGrandChildren.href;\n }\n\n if (name && href) {\n metaListItems.push(metaListItem(name, href, position));\n }\n\n const child = cloneElement(item, {\n current,\n negative,\n ...(position === 1 && {\n children: (\n <>\n {!hideHomeIcon ? (\n <span className={styles[`${rootClassName}__home`]} aria-hidden=\"true\">\n <IconHome size=\"xs\" />\n </span>\n ) : null}\n {item.props.children}\n </>\n ),\n }),\n });\n\n return child;\n });\n\n const schema = metaListItems.length === maxIndex ? metaSchema(metaListItems) : null;\n\n return (\n <nav aria-label={ariaLabel || \"Breadcrumb\"} className={classes} {...props}>\n <ol className={styles[`${rootClassName}__list`]}>{items}</ol>\n {meta && schema ? (\n <script\n type=\"application/ld+json\"\n data-testid=\"breadcrumbs-meta\"\n dangerouslySetInnerHTML={{ __html: schema }}\n />\n ) : null}\n </nav>\n );\n};\n\nconst Item = ({\n href,\n [\"data-testid\"]: dataTestId,\n children,\n current = false,\n negative = false,\n onClick,\n ...rest\n}: BreadcrumbsItemProps) => {\n const classes = c(\n [styles[itemClassName], styles[`${itemClassName}--${negative ? \"negative\" : \"default\"}`]],\n {\n [styles[`${itemClassName}--current`]]: current,\n }\n );\n\n const link = () => {\n const commonProps = {\n href,\n [\"data-testid\"]: dataTestId,\n \"aria-current\": current ? \"page\" : undefined,\n onClick,\n };\n\n const component =\n href || typeof children === \"string\"\n ? createElement(\"a\", commonProps, children)\n : cloneElement(children, {\n ...commonProps,\n ...children.props,\n });\n\n return component;\n };\n\n return (\n <li {...rest} className={classes}>\n {link()}\n </li>\n );\n};\n\nBreadcrumbs.Item = Item;\n\nexport { Breadcrumbs, Item as BreadcrumbsItem };\n"],"names":["f","r","c","p","m","e","o","t","n","s","i","u","_","d","v","g","a","x","h","b","S","y","l","hasOwn","classNames","classes","arg","appendClass","parseValue","key","value","newClass","module","metaListItem","name","item","position","metaSchema","itemListElement","rootClassName","itemClassName","Breadcrumbs","ariaLabel","children","className","meta","negative","highlightLast","hideHomeIcon","props","styles","maxIndex","Children","metaListItems","items","index","current","grandChildren","grandGrandChildren","href","cloneElement","jsxs","Fragment","jsx","IconHome","schema","Item","dataTestId","onClick","rest","commonProps","createElement"],"mappings":"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","x_google_ignoreList":[2]}
1
+ {"version":3,"file":"breadcrumbs.es.js","sources":["../../icon/dist/icon-BqK8slmm.mjs","../../icon/dist/components/home.es.js","../../../common/temp/node_modules/.pnpm/classnames@2.5.1/node_modules/classnames/bind.js","../src/meta.ts","../src/breadcrumbs.tsx"],"sourcesContent":["import { jsx as a } from \"react/jsx-runtime\";\nfunction f(r) {\n return r && r.__esModule && Object.prototype.hasOwnProperty.call(r, \"default\") ? r.default : r;\n}\nvar c = { exports: {} };\n/*!\n\tCopyright (c) 2018 Jed Watson.\n\tLicensed under the MIT License (MIT), see\n\thttp://jedwatson.github.io/classnames\n*/\nvar p;\nfunction m() {\n return p || (p = 1, function(r) {\n (function() {\n var e = {}.hasOwnProperty;\n function o() {\n for (var t = \"\", n = 0; n < arguments.length; n++) {\n var s = arguments[n];\n s && (t = i(t, u.call(this, s)));\n }\n return t;\n }\n function u(t) {\n if (typeof t == \"string\" || typeof t == \"number\")\n return this && this[t] || t;\n if (typeof t != \"object\")\n return \"\";\n if (Array.isArray(t))\n return o.apply(this, t);\n if (t.toString !== Object.prototype.toString && !t.toString.toString().includes(\"[native code]\"))\n return t.toString();\n var n = \"\";\n for (var s in t)\n e.call(t, s) && t[s] && (n = i(n, this && this[s] || s));\n return n;\n }\n function i(t, n) {\n return n ? t ? t + \" \" + n : t + n : t;\n }\n r.exports ? (o.default = o, r.exports = o) : window.classNames = o;\n })();\n }(c)), c.exports;\n}\nvar _ = m();\nconst d = /* @__PURE__ */ f(_), v = {\n \"purpur-icon\": \"_purpur-icon_8u1lq_1\",\n \"purpur-icon--xxs\": \"_purpur-icon--xxs_8u1lq_4\",\n \"purpur-icon--xs\": \"_purpur-icon--xs_8u1lq_8\",\n \"purpur-icon--sm\": \"_purpur-icon--sm_8u1lq_12\",\n \"purpur-icon--md\": \"_purpur-icon--md_8u1lq_16\",\n \"purpur-icon--lg\": \"_purpur-icon--lg_8u1lq_20\",\n \"purpur-icon--xl\": \"_purpur-icon--xl_8u1lq_24\"\n}, g = d.bind(v), l = \"purpur-icon\", x = \"md\", h = (r) => r.filter((e) => Object.keys(e).length >= 1).map((e) => `${e.name}=\"${e.value}\"`).join(\" \"), y = ({ content: r = \"\", title: e } = {}) => {\n const o = [\n { name: \"xmlns\", value: \"http://www.w3.org/2000/svg\" },\n { name: \"fill\", value: \"currentColor\" },\n { name: \"viewBox\", value: \"0 0 24 24\" },\n e ? { name: \"role\", value: \"img\" } : { name: \"aria-hidden\", value: \"true\" }\n ], u = e ? `<title>${e}</title>` : \"\";\n return `<svg ${h(o)}>${u}${r}</svg>`;\n}, S = (r) => r.replace(/<(\\/?)svg([^>]*)>/g, \"\").trim(), b = ({\n [\"data-testid\"]: r,\n svg: e,\n allyTitle: o,\n className: u,\n size: i = x,\n ...t\n}) => {\n const n = y({\n content: S(e.svg),\n title: o\n }), s = g(u, l, `${l}--${i}`);\n return /* @__PURE__ */ a(\n \"span\",\n {\n className: s,\n \"data-testid\": r,\n dangerouslySetInnerHTML: { __html: n },\n ...t\n }\n );\n};\nb.displayName = \"Icon\";\nexport {\n b as I\n};\n//# sourceMappingURL=icon-BqK8slmm.mjs.map\n","import { jsx as e } from \"react/jsx-runtime\";\nimport { I as a } from \"../icon-BqK8slmm.mjs\";\nconst v = {\n name: \"home\",\n svg: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path fill-rule=\"evenodd\" d=\"M11.38 1.848a.9.9 0 0 1 1.24 0l8.69 8.276c1.242 1.183.405 3.276-1.31 3.276h-.6v8.1a.9.9 0 0 1-.9.9h-13a.9.9 0 0 1-.9-.9v-8.1H4c-1.715 0-2.552-2.093-1.31-3.276l8.69-8.276ZM12 3.743l-8.069 7.685c-.026.024-.03.04-.032.049a.11.11 0 0 0 .008.06.11.11 0 0 0 .036.049c.007.005.021.014.057.014h1.5a.9.9 0 0 1 .9.9v8.1h11.2v-8.1a.9.9 0 0 1 .9-.9H20c.036 0 .05-.009.057-.014a.111.111 0 0 0 .036-.049.111.111 0 0 0 .008-.06c-.002-.008-.006-.025-.032-.05L12 3.744ZM10.6 14a.9.9 0 0 1 .9-.9H15a.9.9 0 0 1 .9.9v4a.9.9 0 0 1-.9.9h-3.5a.9.9 0 0 1-.9-.9v-4Zm1.8.9v2.2h1.7v-2.2h-1.7Z\" clip-rule=\"evenodd\"/></svg>',\n keywords: [\"home\"],\n category: \"buildings\"\n}, c = (o) => /* @__PURE__ */ e(a, { ...o, svg: v });\nc.displayName = \"IconHome\";\nexport {\n c as IconHome\n};\n//# sourceMappingURL=home.es.js.map\n","/*!\n\tCopyright (c) 2018 Jed Watson.\n\tLicensed under the MIT License (MIT), see\n\thttp://jedwatson.github.io/classnames\n*/\n/* global define */\n\n(function () {\n\t'use strict';\n\n\tvar hasOwn = {}.hasOwnProperty;\n\n\tfunction classNames () {\n\t\tvar classes = '';\n\n\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\tvar arg = arguments[i];\n\t\t\tif (arg) {\n\t\t\t\tclasses = appendClass(classes, parseValue.call(this, arg));\n\t\t\t}\n\t\t}\n\n\t\treturn classes;\n\t}\n\n\tfunction parseValue (arg) {\n\t\tif (typeof arg === 'string' || typeof arg === 'number') {\n\t\t\treturn this && this[arg] || arg;\n\t\t}\n\n\t\tif (typeof arg !== 'object') {\n\t\t\treturn '';\n\t\t}\n\n\t\tif (Array.isArray(arg)) {\n\t\t\treturn classNames.apply(this, arg);\n\t\t}\n\n\t\tif (arg.toString !== Object.prototype.toString && !arg.toString.toString().includes('[native code]')) {\n\t\t\treturn arg.toString();\n\t\t}\n\n\t\tvar classes = '';\n\n\t\tfor (var key in arg) {\n\t\t\tif (hasOwn.call(arg, key) && arg[key]) {\n\t\t\t\tclasses = appendClass(classes, this && this[key] || key);\n\t\t\t}\n\t\t}\n\n\t\treturn classes;\n\t}\n\n\tfunction appendClass (value, newClass) {\n\t\tif (!newClass) {\n\t\t\treturn value;\n\t\t}\n\t\n\t\tif (value) {\n\t\t\treturn value + ' ' + newClass;\n\t\t}\n\t\n\t\treturn value + newClass;\n\t}\n\n\tif (typeof module !== 'undefined' && module.exports) {\n\t\tclassNames.default = classNames;\n\t\tmodule.exports = classNames;\n\t} else if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {\n\t\t// register as 'classnames', consistent with npm package name\n\t\tdefine('classnames', [], function () {\n\t\t\treturn classNames;\n\t\t});\n\t} else {\n\t\twindow.classNames = classNames;\n\t}\n}());\n","export type MetaListItem = {\n \"@type\": string;\n position: number;\n name: string;\n item?: string;\n};\n\ntype MakeMetaListItem = (name: string, position: number, item?: string) => MetaListItem;\n\nexport const metaListItem: MakeMetaListItem = (name, position, item) => {\n const schema: MetaListItem = {\n \"@type\": \"ListItem\",\n position,\n name,\n };\n\n if (item) {\n schema.item = item;\n }\n\n return schema;\n};\n\nexport const metaSchema = (itemListElement: MetaListItem[]) =>\n JSON.stringify({\n \"@context\": \"https://schema.org\",\n \"@type\": \"BreadcrumbList\",\n itemListElement,\n });\n","import React, {\n type AnchorHTMLAttributes,\n Children,\n cloneElement,\n type ForwardRefExoticComponent,\n type ReactElement,\n} from \"react\";\nimport { IconHome } from \"@purpurds/icon/home\";\nimport c from \"classnames/bind\";\n\nimport styles from \"./breadcrumbs.module.scss\";\nimport { MetaListItem, metaListItem, metaSchema } from \"./meta\";\nimport { DataAttributes } from \"./types.ts\";\n\nconst cx = c.bind(styles);\n\ntype WithMeta = {\n meta?: true;\n baseUrl: string;\n};\n\ntype WithoutMeta = {\n meta: false;\n baseUrl?: never;\n};\n\nexport type BreadcrumbsProps = Omit<React.HTMLAttributes<HTMLElement>, \"aria-label\"> &\n DataAttributes & {\n /** Describes the breadcrumb navigation for screen readers, e.g. \"Breadcrumbs\" or \"Breadcrumb navigation\". */\n [\"aria-label\"]: string;\n children: ReactElement<BreadcrumbsItemProps> | Array<ReactElement<BreadcrumbsItemProps>>;\n /** Set to render the breadcrumbs with light font color. Ideally used when rendered on dark backgrounds. */\n negative?: boolean;\n /** Set to render the last breadcrumb item in bold font to indicate that this is the current page. Setting this to false will render the last item as a normal breadcrumb link. Defaults to true. */\n highlightLast?: boolean;\n /** Set to not render the home icon in front of the first breadcrumb item. */\n hideHomeIcon?: boolean;\n linkElement?: ForwardRefExoticComponent<AnchorHTMLAttributes<HTMLAnchorElement>> | \"a\";\n } & (WithMeta | WithoutMeta);\n\nexport type BreadcrumbsItemProps = Omit<\n React.HTMLAttributes<HTMLLIElement>,\n \"onClick\" | \"children\"\n> &\n DataAttributes & {\n children: string;\n href?: string;\n onClick?: () => void;\n /** @ignore */\n current?: boolean;\n /** @ignore */\n first?: boolean;\n /** @ignore */\n last?: boolean;\n /** @ignore */\n linkElement?: BreadcrumbsProps[\"linkElement\"];\n /** @ignore */\n meta?: boolean;\n /** @ignore */\n negative?: boolean;\n };\n\nconst rootClassName = \"purpur-breadcrumbs\";\nconst itemClassName = \"purpur-breadcrumb-item\";\n\nconst Breadcrumbs = ({\n [\"aria-label\"]: ariaLabel,\n baseUrl,\n children,\n className,\n linkElement = \"a\",\n meta = true,\n negative = false,\n highlightLast = true,\n hideHomeIcon,\n ...props\n}: BreadcrumbsProps) => {\n const classes = cx([\n className,\n rootClassName,\n `${rootClassName}--${negative ? \"negative\" : \"default\"}`,\n ]);\n const maxIndex = Children.count(children);\n\n const metaListItems: MetaListItem[] = [];\n\n const items = Children.map(children, (item, index) => {\n const position = index + 1;\n const last = maxIndex === position;\n const current = highlightLast && last;\n\n const { children, href } = item.props;\n\n metaListItems.push(metaListItem(children, position, href && `${baseUrl}${href}`));\n\n const child = cloneElement(item, {\n current,\n negative,\n first: !hideHomeIcon && position === 1,\n last,\n linkElement,\n });\n\n return child;\n });\n\n const schema = metaListItems.length === maxIndex ? metaSchema(metaListItems) : null;\n\n return (\n <nav aria-label={ariaLabel} className={classes} {...props}>\n <ol className={styles[`${rootClassName}__list`]}>{items}</ol>\n {meta && schema ? (\n <script\n type=\"application/ld+json\"\n data-testid=\"breadcrumbs-meta\"\n dangerouslySetInnerHTML={{ __html: schema }}\n />\n ) : null}\n </nav>\n );\n};\n\nconst Item = ({\n href,\n [\"data-testid\"]: dataTestId,\n children,\n current = false,\n linkElement = \"a\",\n negative = false,\n onClick,\n first = false,\n last = false,\n ...props\n}: BreadcrumbsItemProps) => {\n const LinkElement = linkElement;\n const classes = cx(\n [itemClassName],\n styles[`${itemClassName}--${negative ? \"negative\" : \"default\"}`],\n {\n [`${itemClassName}--current`]: current,\n }\n );\n\n return (\n <li {...props} className={classes}>\n {!last ? (\n <LinkElement\n href={href}\n data-testid={dataTestId}\n onClick={onClick}\n className={cx(`${itemClassName}__element`, `${itemClassName}__link`)}\n >\n {first && (\n <span className={styles[`${itemClassName}__home`]} aria-hidden=\"true\">\n <IconHome size=\"xs\" />\n </span>\n )}\n {children}\n </LinkElement>\n ) : (\n <span\n aria-current=\"page\"\n data-testid={dataTestId}\n className={cx(`${itemClassName}__element`)}\n >\n {children}\n </span>\n )}\n </li>\n );\n};\n\nBreadcrumbs.Item = Item;\n\nexport { Breadcrumbs, Item as BreadcrumbsItem };\n"],"names":["f","r","c","p","m","e","o","t","n","u","_","d","v","g","l","x","h","y","S","b","a","hasOwn","classNames","classes","i","arg","appendClass","parseValue","key","value","newClass","module","metaListItem","name","position","item","schema","metaSchema","itemListElement","cx","styles","rootClassName","itemClassName","Breadcrumbs","ariaLabel","baseUrl","children","className","linkElement","meta","negative","highlightLast","hideHomeIcon","props","maxIndex","Children","metaListItems","items","index","last","current","href","cloneElement","jsx","Item","dataTestId","onClick","first","LinkElement","jsxs","IconHome"],"mappings":"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","x_google_ignoreList":[2]}
package/dist/meta.d.ts CHANGED
@@ -2,9 +2,9 @@ export type MetaListItem = {
2
2
  "@type": string;
3
3
  position: number;
4
4
  name: string;
5
- item: string;
5
+ item?: string;
6
6
  };
7
- type MakeMetaListItem = (name: string, item: string, position: number) => MetaListItem;
7
+ type MakeMetaListItem = (name: string, position: number, item?: string) => MetaListItem;
8
8
  export declare const metaListItem: MakeMetaListItem;
9
9
  export declare const metaSchema: (itemListElement: MetaListItem[]) => string;
10
10
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"meta.d.ts","sourceRoot":"","sources":["../src/meta.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,KAAK,gBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,YAAY,CAAC;AAEvF,eAAO,MAAM,YAAY,EAAE,gBAKzB,CAAC;AAEH,eAAO,MAAM,UAAU,oBAAqB,YAAY,EAAE,WAKtD,CAAC"}
1
+ {"version":3,"file":"meta.d.ts","sourceRoot":"","sources":["../src/meta.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,KAAK,gBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,KAAK,YAAY,CAAC;AAExF,eAAO,MAAM,YAAY,EAAE,gBAY1B,CAAC;AAEF,eAAO,MAAM,UAAU,oBAAqB,YAAY,EAAE,WAKtD,CAAC"}
package/dist/styles.css CHANGED
@@ -1 +1 @@
1
- ._purpur-breadcrumbs_1xh80_1{font-family:var(--purpur-typography-family-default)}._purpur-breadcrumbs_1xh80_1 a,._purpur-breadcrumbs_1xh80_1 li:only-child:not(:has(a)){display:inline-flex;gap:var(--purpur-spacing-50);font-size:var(--purpur-typography-scale-75);text-underline-offset:3px;text-decoration-skip-ink:none;padding:14px 2px;letter-spacing:.3px}._purpur-breadcrumbs_1xh80_1 a:hover,._purpur-breadcrumbs_1xh80_1 a:active,._purpur-breadcrumbs_1xh80_1 li:only-child:not(:has(a)):hover,._purpur-breadcrumbs_1xh80_1 li:only-child:not(:has(a)):active{text-decoration-thickness:2px;text-underline-offset:2px}._purpur-breadcrumbs--default_1xh80_20,._purpur-breadcrumbs--default_1xh80_20 a{color:var(--purpur-color-text-interactive-primary)}._purpur-breadcrumbs--default_1xh80_20 a:hover{color:var(--purpur-color-text-interactive-primary-hover);background:var(--purpur-color-background-interactive-transparent-hover)}._purpur-breadcrumbs--default_1xh80_20 a:active{color:var(--purpur-color-text-interactive-primary-active);background:var(--purpur-color-background-interactive-transparent-active)}._purpur-breadcrumbs--negative_1xh80_34,._purpur-breadcrumbs--negative_1xh80_34 a{color:var(--purpur-color-text-interactive-primary-negative)}._purpur-breadcrumbs--negative_1xh80_34 a:hover{color:var(--purpur-color-text-interactive-primary-negative-hover);background:var(--purpur-color-background-interactive-transparent-negative-hover)}._purpur-breadcrumbs--negative_1xh80_34 a:active{color:var(--purpur-color-text-interactive-primary-negative-active);background:var(--purpur-color-background-interactive-transparent-negative-active)}._purpur-breadcrumbs__list_1xh80_48{display:flex;flex-direction:row;align-items:center;gap:var(--purpur-spacing-50);margin:0;padding:0;list-style:none}._purpur-breadcrumbs__home_1xh80_57{display:none}@media screen and (min-width: 600px){._purpur-breadcrumbs__home_1xh80_57{display:inline-flex;align-items:center}}._purpur-breadcrumb-item_1xh80_67{white-space:nowrap;display:flex;align-items:center}._purpur-breadcrumb-item--current_1xh80_72{overflow:hidden}._purpur-breadcrumb-item--current_1xh80_72 a{display:block;text-overflow:ellipsis;overflow:hidden;color:var(--purpur-color-text-default);text-decoration:none;font-weight:var(--purpur-typography-weight-medium)}._purpur-breadcrumb-item--current_1xh80_72 a:hover{background:none}._purpur-breadcrumb-item_1xh80_67:not(:nth-last-child(2)):not(:last-child){display:none}@media screen and (min-width: 600px){._purpur-breadcrumb-item_1xh80_67:not(:nth-last-child(2)):not(:last-child){display:flex}}._purpur-breadcrumb-item--negative_1xh80_94._purpur-breadcrumb-item--current_1xh80_72 a{color:var(--purpur-color-text-default-negative)}._purpur-breadcrumb-item_1xh80_67:not(:last-child):after{font-size:var(--purpur-typography-scale-75);margin-left:var(--purpur-spacing-50);content:"/"/""}
1
+ ._purpur-breadcrumbs_13trz_1{font-family:var(--purpur-typography-family-default)}._purpur-breadcrumbs__list_13trz_4{display:flex;flex-direction:row;align-items:center;gap:var(--purpur-spacing-50);margin:0;padding:0;list-style:none}._purpur-breadcrumb-item_13trz_14{white-space:nowrap;display:flex;align-items:center}._purpur-breadcrumb-item__element_13trz_19{display:inline-flex;gap:var(--purpur-spacing-50);font-size:var(--purpur-typography-scale-75);text-underline-offset:3px;text-decoration-skip-ink:none;padding:14px 2px;letter-spacing:.3px}._purpur-breadcrumb-item__link_13trz_28:hover,._purpur-breadcrumb-item__link_13trz_28:active{text-decoration-thickness:2px;text-underline-offset:2px}._purpur-breadcrumb-item--default_13trz_32,._purpur-breadcrumb-item--default_13trz_32 ._purpur-breadcrumb-item__element_13trz_19{color:var(--purpur-color-text-interactive-primary)}._purpur-breadcrumb-item--default_13trz_32 ._purpur-breadcrumb-item__link_13trz_28:hover{color:var(--purpur-color-text-interactive-primary-hover);background:var(--purpur-color-background-interactive-transparent-hover)}._purpur-breadcrumb-item--default_13trz_32 ._purpur-breadcrumb-item__link_13trz_28:active{color:var(--purpur-color-text-interactive-primary-active);background:var(--purpur-color-background-interactive-transparent-active)}._purpur-breadcrumb-item--negative_13trz_46,._purpur-breadcrumb-item--negative_13trz_46 ._purpur-breadcrumb-item__element_13trz_19{color:var(--purpur-color-text-interactive-primary-negative)}._purpur-breadcrumb-item--negative_13trz_46 ._purpur-breadcrumb-item__link_13trz_28:hover{color:var(--purpur-color-text-interactive-primary-negative-hover);background:var(--purpur-color-background-interactive-transparent-negative-hover)}._purpur-breadcrumb-item--negative_13trz_46 ._purpur-breadcrumb-item__link_13trz_28:active{color:var(--purpur-color-text-interactive-primary-negative-active);background:var(--purpur-color-background-interactive-transparent-negative-active)}._purpur-breadcrumb-item--current_13trz_60{overflow:hidden}._purpur-breadcrumb-item--current_13trz_60 ._purpur-breadcrumb-item__element_13trz_19{display:block;text-overflow:ellipsis;overflow:hidden;color:var(--purpur-color-text-default);text-decoration:none;font-weight:var(--purpur-typography-weight-medium)}._purpur-breadcrumb-item--current_13trz_60 ._purpur-breadcrumb-item__link_13trz_28:hover{background:none}._purpur-breadcrumb-item_13trz_14:not(:nth-last-child(2)):not(:last-child){display:none}@media screen and (min-width: 600px){._purpur-breadcrumb-item_13trz_14:not(:nth-last-child(2)):not(:last-child){display:flex}}._purpur-breadcrumb-item--negative_13trz_46._purpur-breadcrumb-item--current_13trz_60,._purpur-breadcrumb-item--negative_13trz_46._purpur-breadcrumb-item--current_13trz_60 ._purpur-breadcrumb-item__element_13trz_19{color:var(--purpur-color-text-default-negative)}._purpur-breadcrumb-item_13trz_14:not(:last-child):after{font-size:var(--purpur-typography-scale-75);margin-left:var(--purpur-spacing-50);content:"/"/""}._purpur-breadcrumb-item__home_13trz_93{display:none}@media screen and (min-width: 600px){._purpur-breadcrumb-item__home_13trz_93{display:inline-flex;align-items:center}}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@purpurds/breadcrumbs",
3
- "version": "6.12.5",
3
+ "version": "7.0.0",
4
4
  "license": "AGPL-3.0-only",
5
5
  "main": "./dist/breadcrumbs.cjs.js",
6
6
  "types": "./dist/breadcrumbs.d.ts",
@@ -16,8 +16,8 @@
16
16
  "source": "src/breadcrumbs.tsx",
17
17
  "dependencies": {
18
18
  "classnames": "~2.5.0",
19
- "@purpurds/icon": "6.12.5",
20
- "@purpurds/tokens": "6.12.5"
19
+ "@purpurds/tokens": "7.0.0",
20
+ "@purpurds/icon": "7.0.0"
21
21
  },
22
22
  "devDependencies": {
23
23
  "eslint": "9.24.0",
@@ -37,8 +37,8 @@
37
37
  "typescript": "^5.6.3",
38
38
  "vite": "^6.2.1",
39
39
  "vitest": "^3.1.2",
40
- "@purpurds/component-rig": "1.0.0",
41
- "@purpurds/paragraph": "6.12.5"
40
+ "@purpurds/paragraph": "7.0.0",
41
+ "@purpurds/component-rig": "1.0.0"
42
42
  },
43
43
  "peerDependencies": {
44
44
  "@types/react": "^18 || ^19",
@@ -3,10 +3,26 @@
3
3
  .purpur-breadcrumbs {
4
4
  font-family: var(--purpur-typography-family-default);
5
5
 
6
-
6
+ &__list {
7
+ display: flex;
8
+ flex-direction: row;
9
+ align-items: center;
10
+ gap: var(--purpur-spacing-50);
11
+ margin: 0;
12
+ padding: 0;
13
+ list-style: none;
14
+ }
15
+ }
16
+
17
+ .purpur-breadcrumb-item {
18
+ $root: &;
19
+
20
+ white-space: nowrap;
21
+ // Display flex fixes misaligned separators
22
+ display: flex;
23
+ align-items: center;
7
24
 
8
- a,
9
- li:only-child:not(:has(a)) {
25
+ &__element {
10
26
  display: inline-flex;
11
27
  gap: var(--purpur-spacing-50);
12
28
  font-size: var(--purpur-typography-scale-75);
@@ -14,7 +30,9 @@
14
30
  text-decoration-skip-ink: none;
15
31
  padding: 14px 2px;
16
32
  letter-spacing: 0.3px;
33
+ }
17
34
 
35
+ &__link {
18
36
  &:hover,
19
37
  &:active {
20
38
  text-decoration-thickness: 2px;
@@ -25,9 +43,11 @@
25
43
  &--default {
26
44
  color: var(--purpur-color-text-interactive-primary);
27
45
 
28
- a {
46
+ #{$root}__element {
29
47
  color: var(--purpur-color-text-interactive-primary);
48
+ }
30
49
 
50
+ #{$root}__link {
31
51
  &:hover {
32
52
  color: var(--purpur-color-text-interactive-primary-hover);
33
53
  background: var(--purpur-color-background-interactive-transparent-hover);
@@ -43,9 +63,11 @@
43
63
  &--negative {
44
64
  color: var(--purpur-color-text-interactive-primary-negative);
45
65
 
46
- a {
66
+ #{$root}__element {
47
67
  color: var(--purpur-color-text-interactive-primary-negative);
68
+ }
48
69
 
70
+ #{$root}__link {
49
71
  &:hover {
50
72
  color: var(--purpur-color-text-interactive-primary-negative-hover);
51
73
  background: var(--purpur-color-background-interactive-transparent-negative-hover);
@@ -58,49 +80,20 @@
58
80
  }
59
81
  }
60
82
 
61
- &__list {
62
- display: flex;
63
- flex-direction: row;
64
- align-items: center;
65
- gap: var(--purpur-spacing-50);
66
- margin: 0;
67
- padding: 0;
68
-
69
- list-style: none;
70
- }
71
-
72
- &__home {
73
- display: none;
74
- }
75
-
76
- @media screen and (min-width: #{$purpur-breakpoint-md}) {
77
- &__home {
78
- display: inline-flex;
79
- align-items: center;
80
- }
81
- }
82
- }
83
-
84
- .purpur-breadcrumb-item {
85
- white-space: nowrap;
86
- // Display flex fixes misaligned separators
87
- display: flex;
88
- align-items: center;
89
-
90
83
  &--current {
91
84
  overflow: hidden;
92
85
 
93
- a {
86
+ #{$root}__element {
94
87
  display: block;
95
88
  text-overflow: ellipsis;
96
89
  overflow: hidden;
97
90
  color: var(--purpur-color-text-default);
98
91
  text-decoration: none;
99
92
  font-weight: var(--purpur-typography-weight-medium);
93
+ }
100
94
 
101
- &:hover {
102
- background: none;
103
- }
95
+ #{$root}__link:hover {
96
+ background: none;
104
97
  }
105
98
  }
106
99
 
@@ -115,7 +108,9 @@
115
108
  }
116
109
 
117
110
  &--negative.purpur-breadcrumb-item--current {
118
- a {
111
+ color: var(--purpur-color-text-default-negative);
112
+
113
+ #{$root}__element {
119
114
  color: var(--purpur-color-text-default-negative);
120
115
  }
121
116
  }
@@ -128,4 +123,15 @@
128
123
  content: "/" / "";
129
124
  }
130
125
  }
126
+
127
+ &__home {
128
+ display: none;
129
+ }
130
+
131
+ @media screen and (min-width: #{$purpur-breakpoint-md}) {
132
+ &__home {
133
+ display: inline-flex;
134
+ align-items: center;
135
+ }
136
+ }
131
137
  }
@@ -1,4 +1,4 @@
1
- import React, { ReactNode, useEffect, useState } from "react";
1
+ import React, { ForwardedRef, forwardRef, useEffect, useState } from "react";
2
2
  import { Paragraph } from "@purpurds/paragraph";
3
3
  import type { Meta, StoryObj } from "@storybook/react";
4
4
 
@@ -6,6 +6,19 @@ import "@purpurds/paragraph/styles";
6
6
  import "@purpurds/icon/styles";
7
7
  import { Breadcrumbs, BreadcrumbsItem, BreadcrumbsProps } from "./breadcrumbs";
8
8
 
9
+ type CustomTestLinkProps = {
10
+ children?: React.ReactNode;
11
+ href?: string;
12
+ };
13
+
14
+ const CustomTestLink = forwardRef(
15
+ ({ children, href, ...props }: CustomTestLinkProps, ref: ForwardedRef<HTMLAnchorElement>) => (
16
+ <a ref={ref} href={href} {...props}>
17
+ {children}
18
+ </a>
19
+ )
20
+ );
21
+
9
22
  const meta = {
10
23
  title: "Components/Breadcrumbs",
11
24
  component: Breadcrumbs,
@@ -46,19 +59,30 @@ If you need a custom link, perhaps to use a router, like the next/link component
46
59
  },
47
60
  },
48
61
  },
62
+ baseUrl: {
63
+ table: {
64
+ type: {
65
+ summary: "string",
66
+ detail: "Base URL for the website for breadcrumbs metadata.",
67
+ },
68
+ },
69
+ },
70
+ meta: {
71
+ table: {
72
+ type: {
73
+ summary: "boolean",
74
+ detail: "Set to generate breadcrumbs metadata for crawlers.",
75
+ },
76
+ },
77
+ },
49
78
  },
50
- args: { negative: false },
79
+ args: { negative: false, ["aria-label"]: "Breadcrumbs", baseUrl: "https://www.telia.se" },
51
80
  } satisfies Meta<typeof Breadcrumbs>;
52
81
 
53
82
  export default meta;
54
83
 
55
84
  type Story = StoryObj<typeof Breadcrumbs>;
56
85
 
57
- type LinkProps = {
58
- href?: string;
59
- children: ReactNode;
60
- };
61
-
62
86
  const MetaData = () => {
63
87
  const [code, setCode] = useState("");
64
88
 
@@ -101,10 +125,8 @@ const MetaData = () => {
101
125
  );
102
126
  };
103
127
 
104
- const Link = ({ href, children }: LinkProps) => <a href={href}>{children}</a>;
105
-
106
128
  const Renderer =
107
- (showMeta = false) =>
129
+ (showMeta = false, customLink = false) =>
108
130
  ({ children, negative, ...args }: BreadcrumbsProps) =>
109
131
  (
110
132
  <>
@@ -115,7 +137,11 @@ const Renderer =
115
137
  : undefined,
116
138
  }}
117
139
  >
118
- <Breadcrumbs negative={negative} {...args}>
140
+ <Breadcrumbs
141
+ negative={negative}
142
+ linkElement={customLink ? CustomTestLink : undefined}
143
+ {...args}
144
+ >
119
145
  {children}
120
146
  </Breadcrumbs>
121
147
  </div>
@@ -130,34 +156,30 @@ export const Showcase: Story = {
130
156
  <Breadcrumbs.Item href="/products" key={1}>
131
157
  Products
132
158
  </Breadcrumbs.Item>,
133
- <Breadcrumbs.Item key={2}>
134
- <a href="/products/steel">Steel</a>
135
- </Breadcrumbs.Item>,
136
- <Breadcrumbs.Item key={3}>
137
- <Link href="/products/steel/beskar">Beskar</Link>
159
+ <Breadcrumbs.Item href="/products/steel" key={2}>
160
+ Steel
138
161
  </Breadcrumbs.Item>,
162
+ <Breadcrumbs.Item key={3}>Beskar</Breadcrumbs.Item>,
139
163
  ],
140
164
  },
141
165
  render: Renderer(false),
142
166
  tags: ["visual:check"],
143
167
  };
144
168
 
145
- export const CustomItem: Story = {
169
+ export const CustomLink: Story = {
146
170
  name: "Custom Breadcrumb Items",
147
171
  args: {
148
172
  children: [
149
173
  <Breadcrumbs.Item key={0} href="/products">
150
174
  Products
151
175
  </Breadcrumbs.Item>,
152
- <Breadcrumbs.Item key={1}>
153
- <Link href="/products/laser-swords">Laser Swords</Link>
154
- </Breadcrumbs.Item>,
155
- <Breadcrumbs.Item key={2}>
156
- <a href="/products/laser-swords/darksaber">Darksaber</a>
176
+ <Breadcrumbs.Item href="/products/laser-swords" key={1}>
177
+ Laser Swords
157
178
  </Breadcrumbs.Item>,
179
+ <Breadcrumbs.Item key={2}>Darksaber</Breadcrumbs.Item>,
158
180
  ],
159
181
  },
160
- render: Renderer(false),
182
+ render: Renderer(false, true),
161
183
  tags: ["visual:check"],
162
184
  };
163
185
 
@@ -171,9 +193,7 @@ export const BreadcrumbMetaData: Story = {
171
193
  <Breadcrumbs.Item key={1} href="/ships/twin-seaters/">
172
194
  Twin Seaters
173
195
  </Breadcrumbs.Item>,
174
- <Breadcrumbs.Item key={2}>
175
- <Link href="/ships/twin-seaters/naboo-n1">N1 Starfighter</Link>
176
- </Breadcrumbs.Item>,
196
+ <Breadcrumbs.Item key={2}>N1 Starfighter</Breadcrumbs.Item>,
177
197
  ],
178
198
  },
179
199
  render: Renderer(true),
@@ -1,4 +1,4 @@
1
- import React from "react";
1
+ import React, { ForwardedRef, forwardRef, type ReactNode } from "react";
2
2
  import * as matchers from "@testing-library/jest-dom/matchers";
3
3
  import { cleanup, render, screen } from "@testing-library/react";
4
4
  import { afterEach, describe, expect, it } from "vitest";
@@ -8,13 +8,31 @@ import { Breadcrumbs } from "./breadcrumbs";
8
8
  expect.extend(matchers);
9
9
  afterEach(cleanup);
10
10
 
11
+ type CustomTestLinkProps = {
12
+ children?: ReactNode;
13
+ href?: string;
14
+ ["data-testid"]?: string;
15
+ };
16
+
17
+ const CustomTestLink = forwardRef(
18
+ (
19
+ { children, href, ["data-testid"]: dataTestid }: CustomTestLinkProps,
20
+ ref: ForwardedRef<HTMLAnchorElement>
21
+ ) => (
22
+ <a ref={ref} href={href} data-testid={dataTestid}>
23
+ {children}
24
+ </a>
25
+ )
26
+ );
27
+
11
28
  describe("Breadcrumbs", () => {
12
29
  it("renders a breadcrumb item", () => {
13
30
  render(
14
- <Breadcrumbs>
31
+ <Breadcrumbs aria-label="Breadcrumbs" meta={false}>
15
32
  <Breadcrumbs.Item href="/link" data-testid="item">
16
33
  Products
17
34
  </Breadcrumbs.Item>
35
+ <Breadcrumbs.Item>Current</Breadcrumbs.Item>
18
36
  </Breadcrumbs>
19
37
  );
20
38
  expect(screen.getByTestId("item")).toBeInstanceOf(HTMLAnchorElement);
@@ -22,38 +40,36 @@ describe("Breadcrumbs", () => {
22
40
 
23
41
  it("renders custom link", () => {
24
42
  render(
25
- <Breadcrumbs>
43
+ <Breadcrumbs aria-label="Breadcrumbs" meta={false} linkElement={CustomTestLink}>
26
44
  <Breadcrumbs.Item href="/link">Products</Breadcrumbs.Item>
27
- <Breadcrumbs.Item data-testid="custom">
28
- <a href="/">Custom link</a>
45
+ <Breadcrumbs.Item href="/custom" data-testid="custom">
46
+ Custom link
29
47
  </Breadcrumbs.Item>
30
48
  </Breadcrumbs>
31
49
  );
32
50
  expect(screen.getByTestId("custom")).toBeInTheDocument();
33
51
  });
34
52
 
35
- it("marks the last breadcrumb item as aria-current=page", () => {
53
+ it("marks the last breadcrumb item as aria-current=page and makes it a span element", () => {
36
54
  render(
37
- <Breadcrumbs>
55
+ <Breadcrumbs aria-label="Breadcrumbs" meta={false}>
38
56
  <Breadcrumbs.Item href="/link">Products</Breadcrumbs.Item>
39
- <Breadcrumbs.Item href="/link/sub" data-testid="last">
40
- Sub
41
- </Breadcrumbs.Item>
57
+ <Breadcrumbs.Item data-testid="last">Sub</Breadcrumbs.Item>
42
58
  </Breadcrumbs>
43
59
  );
44
- expect(screen.getByText("Sub").getAttribute("aria-current")).toEqual("page");
60
+ expect(screen.getByTestId("last").getAttribute("aria-current")).toEqual("page");
61
+ expect(screen.getByTestId("last")).toBeInstanceOf(HTMLSpanElement);
45
62
  });
46
63
 
47
64
  it("renders schema+ld json for meta data", () => {
48
65
  render(
49
- <Breadcrumbs>
66
+ <Breadcrumbs aria-label="Breadcrumbs" baseUrl="https://telia.se">
50
67
  <Breadcrumbs.Item href="/link">Products</Breadcrumbs.Item>
51
- <Breadcrumbs.Item href="/link/sub" data-testid="last">
52
- Sub
53
- </Breadcrumbs.Item>
68
+ <Breadcrumbs.Item href="/link/sub">Sub</Breadcrumbs.Item>
69
+ <Breadcrumbs.Item>Current</Breadcrumbs.Item>
54
70
  </Breadcrumbs>
55
71
  );
56
72
  const parsedMeta = JSON.parse(screen.getByTestId("breadcrumbs-meta").innerHTML);
57
- expect(parsedMeta["itemListElement"].length).toEqual(2);
73
+ expect(parsedMeta["itemListElement"].length).toEqual(3);
58
74
  });
59
75
  });