@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.
- package/dist/LICENSE.txt +1 -1
- package/dist/breadcrumbs.cjs.js +3 -3
- package/dist/breadcrumbs.cjs.js.map +1 -1
- package/dist/breadcrumbs.d.ts +31 -21
- package/dist/breadcrumbs.d.ts.map +1 -1
- package/dist/breadcrumbs.es.js +120 -107
- package/dist/breadcrumbs.es.js.map +1 -1
- package/dist/meta.d.ts +2 -2
- package/dist/meta.d.ts.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +5 -5
- package/src/breadcrumbs.module.scss +45 -39
- package/src/breadcrumbs.stories.tsx +46 -26
- package/src/breadcrumbs.test.tsx +32 -16
- package/src/breadcrumbs.tsx +87 -82
- package/src/meta.ts +15 -8
|
@@ -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
|
|
5
|
+
item?: string;
|
|
6
6
|
};
|
|
7
|
-
type MakeMetaListItem = (name: string,
|
|
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 {};
|
package/dist/meta.d.ts.map
CHANGED
|
@@ -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;
|
|
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-
|
|
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": "
|
|
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/
|
|
20
|
-
"@purpurds/
|
|
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/
|
|
41
|
-
"@purpurds/
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
102
|
-
|
|
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
|
-
|
|
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, {
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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),
|
package/src/breadcrumbs.test.tsx
CHANGED
|
@@ -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
|
-
|
|
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
|
|
40
|
-
Sub
|
|
41
|
-
</Breadcrumbs.Item>
|
|
57
|
+
<Breadcrumbs.Item data-testid="last">Sub</Breadcrumbs.Item>
|
|
42
58
|
</Breadcrumbs>
|
|
43
59
|
);
|
|
44
|
-
expect(screen.
|
|
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"
|
|
52
|
-
|
|
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(
|
|
73
|
+
expect(parsedMeta["itemListElement"].length).toEqual(3);
|
|
58
74
|
});
|
|
59
75
|
});
|