@sproutsocial/seeds-react-breadcrumb 1.1.10 → 1.1.12

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,5 +1,23 @@
1
1
  yarn run v1.22.22
2
- $ tsup --dts
2
+ $ tsup --dts && cp src/breadcrumb.css dist/breadcrumb.css
3
+ ▲ [WARNING] The condition "types" here will never be used as it comes after both "import" and "require" [package.json]
4
+
5
+ package.json:14:6:
6
+ 14 │ "types": "./dist/index.d.ts"
7
+ ╵ ~~~~~~~
8
+
9
+ The "import" condition comes earlier and will be used for all "import" statements:
10
+
11
+ package.json:12:6:
12
+ 12 │ "import": "./dist/esm/index.js",
13
+ ╵ ~~~~~~~~
14
+
15
+ The "require" condition comes earlier and will be used for all "require" calls:
16
+
17
+ package.json:13:6:
18
+ 13 │ "require": "./dist/index.js",
19
+ ╵ ~~~~~~~~~
20
+
3
21
  CLI Building entry: src/index.ts
4
22
  CLI Using tsconfig: tsconfig.json
5
23
  CLI tsup v8.5.0
@@ -8,14 +26,52 @@ $ tsup --dts
8
26
  CLI Cleaning output folder
9
27
  CJS Build start
10
28
  ESM Build start
11
- ESM dist/esm/index.js 2.38 KB
12
- ESM dist/esm/index.js.map 4.89 KB
13
- ESM ⚡️ Build success in 25ms
14
- CJS dist/index.js 4.27 KB
15
- CJS dist/index.js.map 4.95 KB
16
- CJS ⚡️ Build success in 26ms
29
+ [warn] ▲ [WARNING] The condition "types" here will never be used as it comes after both "import" and "require" [package.json]
30
+
31
+ package.json:14:6:
32
+  14 │ "types": "./dist/index.d.ts"
33
+ ~~~~~~~
34
+
35
+ The "import" condition comes earlier and will be used for all "import" statements:
36
+
37
+ package.json:12:6:
38
+  12 │ "import": "./dist/esm/index.js",
39
+ ╵ ~~~~~~~~
40
+
41
+ The "require" condition comes earlier and will be used for all "require" calls:
42
+
43
+ package.json:13:6:
44
+  13 │ "require": "./dist/index.js",
45
+ ╵ ~~~~~~~~~
46
+
47
+
48
+ [warn] ▲ [WARNING] The condition "types" here will never be used as it comes after both "import" and "require" [package.json]
49
+
50
+ package.json:14:6:
51
+  14 │ "types": "./dist/index.d.ts"
52
+ ╵ ~~~~~~~
53
+
54
+ The "import" condition comes earlier and will be used for all "import" statements:
55
+
56
+ package.json:12:6:
57
+  12 │ "import": "./dist/esm/index.js",
58
+ ╵ ~~~~~~~~
59
+
60
+ The "require" condition comes earlier and will be used for all "require" calls:
61
+
62
+ package.json:13:6:
63
+  13 │ "require": "./dist/index.js",
64
+ ╵ ~~~~~~~~~
65
+
66
+
67
+ CJS dist/index.js 6.09 KB
68
+ CJS dist/index.js.map 9.22 KB
69
+ CJS ⚡️ Build success in 30ms
70
+ ESM dist/esm/index.js 3.97 KB
71
+ ESM dist/esm/index.js.map 9.12 KB
72
+ ESM ⚡️ Build success in 30ms
17
73
  DTS Build start
18
- DTS ⚡️ Build success in 2005ms
19
- DTS dist/index.d.ts 1.21 KB
20
- DTS dist/index.d.mts 1.21 KB
21
- Done in 2.82s.
74
+ DTS ⚡️ Build success in 1786ms
75
+ DTS dist/index.d.ts 1.43 KB
76
+ DTS dist/index.d.mts 1.43 KB
77
+ Done in 2.59s.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # @sproutsocial/seeds-react-breadcrumb
2
2
 
3
+ ## 1.1.12
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [b77aca0]
8
+ - Updated dependencies [2e72599]
9
+ - @sproutsocial/seeds-react-system-props@3.1.3
10
+ - @sproutsocial/seeds-react-theme@4.3.0
11
+ - @sproutsocial/seeds-react-link@1.1.18
12
+
13
+ ## 1.1.11
14
+
15
+ ### Patch Changes
16
+
17
+ - Updated dependencies [d21ae54]
18
+ - @sproutsocial/seeds-react-theme@4.2.1
19
+ - @sproutsocial/seeds-react-link@1.1.17
20
+
3
21
  ## 1.1.10
4
22
 
5
23
  ### Patch Changes
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Seeds Breadcrumb component classes
3
+ * Use these instead of writing out individual Tailwind utility classes.
4
+ *
5
+ * Requires @sproutsocial/seeds-react-theme/dist/theme-all.css imported for
6
+ * CSS variable definitions and dark mode support.
7
+ *
8
+ * All rules are wrapped in `@layer components` so that consumer Tailwind
9
+ * utilities (unlayered) win the cascade over these styles.
10
+ */
11
+
12
+ @layer components {
13
+ .seeds-breadcrumb ol {
14
+ font-size: var(--font-size-200);
15
+ line-height: var(--line-height-200);
16
+ margin: 0;
17
+ font-family: var(--font-family);
18
+ padding: 0;
19
+ display: flex;
20
+ }
21
+
22
+ .seeds-breadcrumb li {
23
+ margin-right: var(--space-200);
24
+ display: flex;
25
+ }
26
+
27
+ .seeds-breadcrumb a,
28
+ .seeds-breadcrumb button {
29
+ font-size: var(--font-size-200);
30
+ line-height: var(--line-height-200);
31
+ max-width: 200px;
32
+ overflow: hidden;
33
+ text-overflow: ellipsis;
34
+ white-space: nowrap;
35
+ }
36
+
37
+ .seeds-breadcrumb ol > div + li::before {
38
+ content: "/";
39
+ margin-right: var(--space-200);
40
+ }
41
+
42
+ .seeds-breadcrumb li:last-child a,
43
+ .seeds-breadcrumb li:last-child button {
44
+ color: var(--color-text-body);
45
+ font-weight: bold;
46
+ }
47
+
48
+ .seeds-breadcrumb li:not(:last-child)::after {
49
+ content: "/";
50
+ color: var(--color-text-body);
51
+ margin-left: var(--space-200);
52
+ }
53
+ }
package/dist/esm/index.js CHANGED
@@ -1,6 +1,8 @@
1
1
  // src/Breadcrumb.tsx
2
- import * as React from "react";
3
- import Link from "@sproutsocial/seeds-react-link";
2
+ import "react";
3
+
4
+ // src/BreadcrumbHybrid.tsx
5
+ import "react";
4
6
 
5
7
  // src/styles.ts
6
8
  import styled from "styled-components";
@@ -46,7 +48,12 @@ var Nav = styled.nav`
46
48
  `;
47
49
  var styles_default = Nav;
48
50
 
49
- // src/Breadcrumb.tsx
51
+ // src/BreadcrumbTailwind.tsx
52
+ import "react";
53
+
54
+ // src/BreadcrumbList.tsx
55
+ import * as React from "react";
56
+ import Link from "@sproutsocial/seeds-react-link";
50
57
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
51
58
  var BreadcrumbItem = ({
52
59
  children,
@@ -55,15 +62,14 @@ var BreadcrumbItem = ({
55
62
  }) => {
56
63
  return /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(Link, { href, ...rest, children }) });
57
64
  };
58
- var Breadcrumb = ({
59
- ariaLabel,
65
+ BreadcrumbItem.displayName = "Breadcrumb.Item";
66
+ var BreadcrumbList = ({
60
67
  overflow,
61
- children,
62
- ...rest
68
+ children
63
69
  }) => {
64
70
  const listItems = React.Children.toArray(children);
65
71
  const lastItem = listItems[listItems.length - 1];
66
- return /* @__PURE__ */ jsx(styles_default, { "aria-label": ariaLabel, "data-qa-breadcrumb": ariaLabel, ...rest, children: /* @__PURE__ */ jsxs("ol", { children: [
72
+ return /* @__PURE__ */ jsxs("ol", { children: [
67
73
  overflow && /* @__PURE__ */ jsxs(Fragment, { children: [
68
74
  overflow.rootItem,
69
75
  /* @__PURE__ */ jsx("li", { children: overflow.menu })
@@ -75,9 +81,66 @@ var Breadcrumb = ({
75
81
  "aria-current": listItems[i] === lastItem ? "page" : void 0
76
82
  });
77
83
  })
78
- ] }) });
84
+ ] });
79
85
  };
80
- BreadcrumbItem.displayName = "Breadcrumb.Item";
86
+
87
+ // src/BreadcrumbTailwind.tsx
88
+ import { jsx as jsx2 } from "react/jsx-runtime";
89
+ function cn(...inputs) {
90
+ const classes = [];
91
+ for (const input of inputs) {
92
+ if (!input) continue;
93
+ if (typeof input === "string") {
94
+ classes.push(input);
95
+ } else if (typeof input === "object") {
96
+ for (const [key, value] of Object.entries(input)) {
97
+ if (value) {
98
+ classes.push(key);
99
+ }
100
+ }
101
+ }
102
+ }
103
+ return classes.join(" ");
104
+ }
105
+ var BreadcrumbTailwind = ({
106
+ ariaLabel,
107
+ overflow,
108
+ children,
109
+ className,
110
+ ...rest
111
+ }) => {
112
+ return /* @__PURE__ */ jsx2(
113
+ "nav",
114
+ {
115
+ className: cn("seeds-breadcrumb", className),
116
+ "aria-label": ariaLabel,
117
+ "data-qa-breadcrumb": ariaLabel,
118
+ ...rest,
119
+ children: /* @__PURE__ */ jsx2(BreadcrumbList, { overflow, children })
120
+ }
121
+ );
122
+ };
123
+ BreadcrumbTailwind.displayName = "BreadcrumbTailwind";
124
+
125
+ // src/BreadcrumbHybrid.tsx
126
+ import { hasStyledProps } from "@sproutsocial/seeds-react-system-props";
127
+ import { jsx as jsx3 } from "react/jsx-runtime";
128
+ var BreadcrumbHybrid = ({
129
+ ariaLabel,
130
+ overflow,
131
+ children,
132
+ ...rest
133
+ }) => {
134
+ if (hasStyledProps(rest)) {
135
+ return /* @__PURE__ */ jsx3(styles_default, { "aria-label": ariaLabel, "data-qa-breadcrumb": ariaLabel, ...rest, children: /* @__PURE__ */ jsx3(BreadcrumbList, { overflow, children }) });
136
+ }
137
+ return /* @__PURE__ */ jsx3(BreadcrumbTailwind, { ariaLabel, overflow, ...rest, children });
138
+ };
139
+ var BreadcrumbHybrid_default = BreadcrumbHybrid;
140
+
141
+ // src/Breadcrumb.tsx
142
+ import { jsx as jsx4 } from "react/jsx-runtime";
143
+ var Breadcrumb = (props) => /* @__PURE__ */ jsx4(BreadcrumbHybrid_default, { ...props });
81
144
  Breadcrumb.Item = BreadcrumbItem;
82
145
  var Breadcrumb_default = Breadcrumb;
83
146
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/Breadcrumb.tsx","../../src/styles.ts","../../src/BreadcrumbTypes.ts","../../src/index.ts"],"sourcesContent":["import * as React from \"react\";\nimport Link from \"@sproutsocial/seeds-react-link\";\nimport Nav from \"./styles\";\nimport type {\n TypeBreadcrumbProps,\n TypeBreadcrumbItemProps,\n} from \"./BreadcrumbTypes\";\n\nconst BreadcrumbItem = ({\n children,\n href,\n ...rest\n}: TypeBreadcrumbItemProps) => {\n return (\n <li>\n <Link href={href} {...rest}>\n {children}\n </Link>\n </li>\n );\n};\n\nconst Breadcrumb = ({\n ariaLabel,\n overflow,\n children,\n ...rest\n}: TypeBreadcrumbProps) => {\n const listItems = React.Children.toArray(children);\n const lastItem = listItems[listItems.length - 1];\n return (\n <Nav aria-label={ariaLabel} data-qa-breadcrumb={ariaLabel} {...rest}>\n <ol>\n {overflow && (\n <>\n {overflow.rootItem}\n <li>{overflow.menu}</li>\n </>\n )}\n {listItems.map((item, i) => {\n // @ts-notes - item is a childNode which can be a string or number but `cloneElement` requires props\n const itemElem =\n typeof item === \"object\" && \"props\" in item ? (\n item\n ) : (\n <span>item</span>\n );\n return React.cloneElement(itemElem, {\n ...itemElem.props,\n \"aria-current\": listItems[i] === lastItem ? \"page\" : undefined,\n });\n })}\n </ol>\n </Nav>\n );\n};\n\nBreadcrumbItem.displayName = \"Breadcrumb.Item\";\nBreadcrumb.Item = BreadcrumbItem;\n\nexport default Breadcrumb;\n","import styled from \"styled-components\";\n\nconst Nav = styled.nav`\n ol {\n ${(props) => props.theme.typography[200]};\n margin: 0;\n font-family: ${(props) => props.theme.fontFamily};\n padding: 0;\n display: flex;\n }\n\n li {\n margin-right: ${(props) => props.theme.space[200]};\n display: flex;\n }\n\n a,\n button {\n ${(props) => props.theme.typography[200]};\n max-width: 200px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n ol > div + li::before {\n content: \"/\";\n margin-right: ${(props) => props.theme.space[200]};\n }\n\n li:last-child a,\n li:last-child button {\n color: ${(props) => props.theme.colors.text.body};\n font-weight: bold;\n }\n\n li:not(:last-child)::after {\n content: \"/\";\n color: ${(props) => props.theme.colors.text.body};\n margin-left: ${(props) => props.theme.space[200]};\n }\n`;\n\nexport default Nav;\n","import * as React from \"react\";\nimport type {\n TypeStyledComponentsCommonProps,\n TypeSystemCommonProps,\n} from \"@sproutsocial/seeds-react-system-props\";\nexport type { TypeLinkProps as TypeBreadcrumbItemProps } from \"@sproutsocial/seeds-react-link\";\n\nexport interface TypeBreadcrumbProps\n extends TypeStyledComponentsCommonProps,\n TypeSystemCommonProps,\n Omit<React.ComponentPropsWithoutRef<\"nav\">, \"color\"> {\n children: React.ReactNode;\n\n /** Description of the type of navigation being provided by the breadcrumb (i.e. \"Asset library breadcrumb\") */\n ariaLabel: string;\n\n /** optional */\n overflow?: {\n label: string;\n menu: React.ReactNode;\n /** Optional item rendered before the overflow menu (e.g. the root/home crumb) */\n rootItem?: React.ReactNode;\n };\n}\n","import Breadcrumb from \"./Breadcrumb\";\n\nexport default Breadcrumb;\nexport { Breadcrumb };\nexport * from \"./BreadcrumbTypes\";\n"],"mappings":";AAAA,YAAY,WAAW;AACvB,OAAO,UAAU;;;ACDjB,OAAO,YAAY;AAEnB,IAAM,MAAM,OAAO;AAAA;AAAA,MAEb,CAAC,UAAU,MAAM,MAAM,WAAW,GAAG,CAAC;AAAA;AAAA,mBAEzB,CAAC,UAAU,MAAM,MAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAMhC,CAAC,UAAU,MAAM,MAAM,MAAM,GAAG,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAM/C,CAAC,UAAU,MAAM,MAAM,WAAW,GAAG,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBASxB,CAAC,UAAU,MAAM,MAAM,MAAM,GAAG,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,aAKxC,CAAC,UAAU,MAAM,MAAM,OAAO,KAAK,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAMvC,CAAC,UAAU,MAAM,MAAM,OAAO,KAAK,IAAI;AAAA,mBACjC,CAAC,UAAU,MAAM,MAAM,MAAM,GAAG,CAAC;AAAA;AAAA;AAIpD,IAAO,iBAAQ;;;AD5BT,SAmBI,UAnBJ,KAmBI,YAnBJ;AAPN,IAAM,iBAAiB,CAAC;AAAA,EACtB;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAA+B;AAC7B,SACE,oBAAC,QACC,8BAAC,QAAK,MAAa,GAAG,MACnB,UACH,GACF;AAEJ;AAEA,IAAM,aAAa,CAAC;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAA2B;AACzB,QAAM,YAAkB,eAAS,QAAQ,QAAQ;AACjD,QAAM,WAAW,UAAU,UAAU,SAAS,CAAC;AAC/C,SACE,oBAAC,kBAAI,cAAY,WAAW,sBAAoB,WAAY,GAAG,MAC7D,+BAAC,QACE;AAAA,gBACC,iCACG;AAAA,eAAS;AAAA,MACV,oBAAC,QAAI,mBAAS,MAAK;AAAA,OACrB;AAAA,IAED,UAAU,IAAI,CAAC,MAAM,MAAM;AAE1B,YAAM,WACJ,OAAO,SAAS,YAAY,WAAW,OACrC,OAEA,oBAAC,UAAK,kBAAI;AAEd,aAAa,mBAAa,UAAU;AAAA,QAClC,GAAG,SAAS;AAAA,QACZ,gBAAgB,UAAU,CAAC,MAAM,WAAW,SAAS;AAAA,MACvD,CAAC;AAAA,IACH,CAAC;AAAA,KACH,GACF;AAEJ;AAEA,eAAe,cAAc;AAC7B,WAAW,OAAO;AAElB,IAAO,qBAAQ;;;AE5Df,OAAuB;;;ACEvB,IAAO,gBAAQ;","names":[]}
1
+ {"version":3,"sources":["../../src/Breadcrumb.tsx","../../src/BreadcrumbHybrid.tsx","../../src/styles.ts","../../src/BreadcrumbTailwind.tsx","../../src/BreadcrumbList.tsx","../../src/BreadcrumbTypes.ts","../../src/index.ts"],"sourcesContent":["import * as React from \"react\";\nimport BreadcrumbHybrid from \"./BreadcrumbHybrid\";\nimport { BreadcrumbItem } from \"./BreadcrumbList\";\nimport type { TypeBreadcrumbProps } from \"./BreadcrumbTypes\";\n\n/**\n * Breadcrumb component. Automatically routes between the Tailwind\n * implementation (preferred) and the styled-components implementation (for\n * consumers using system props or styled() extension).\n */\nconst Breadcrumb = (props: TypeBreadcrumbProps) => (\n <BreadcrumbHybrid {...props} />\n);\n\nBreadcrumb.Item = BreadcrumbItem;\n\nexport default Breadcrumb;\n","/**\n * Hybrid Breadcrumb Component\n * Automatically chooses between Tailwind and styled-components based on props\n */\n\nimport * as React from \"react\";\nimport Nav from \"./styles\"; // Styled-components version\nimport { BreadcrumbTailwind } from \"./BreadcrumbTailwind\"; // Tailwind version\nimport { BreadcrumbList } from \"./BreadcrumbList\";\nimport { hasStyledProps } from \"@sproutsocial/seeds-react-system-props\";\nimport type { TypeBreadcrumbProps } from \"./BreadcrumbTypes\";\n\nconst BreadcrumbHybrid = ({\n ariaLabel,\n overflow,\n children,\n ...rest\n}: TypeBreadcrumbProps) => {\n if (hasStyledProps(rest)) {\n return (\n <Nav aria-label={ariaLabel} data-qa-breadcrumb={ariaLabel} {...rest}>\n <BreadcrumbList overflow={overflow}>{children}</BreadcrumbList>\n </Nav>\n );\n }\n\n // Use Tailwind version (preferred - better performance)\n return (\n <BreadcrumbTailwind ariaLabel={ariaLabel} overflow={overflow} {...rest}>\n {children}\n </BreadcrumbTailwind>\n );\n};\n\nexport default BreadcrumbHybrid;\n","import styled from \"styled-components\";\n\nconst Nav = styled.nav`\n ol {\n ${(props) => props.theme.typography[200]};\n margin: 0;\n font-family: ${(props) => props.theme.fontFamily};\n padding: 0;\n display: flex;\n }\n\n li {\n margin-right: ${(props) => props.theme.space[200]};\n display: flex;\n }\n\n a,\n button {\n ${(props) => props.theme.typography[200]};\n max-width: 200px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n ol > div + li::before {\n content: \"/\";\n margin-right: ${(props) => props.theme.space[200]};\n }\n\n li:last-child a,\n li:last-child button {\n color: ${(props) => props.theme.colors.text.body};\n font-weight: bold;\n }\n\n li:not(:last-child)::after {\n content: \"/\";\n color: ${(props) => props.theme.colors.text.body};\n margin-left: ${(props) => props.theme.space[200]};\n }\n`;\n\nexport default Nav;\n","/**\n * Tailwind CSS implementation of Breadcrumb component\n * Uses Seeds breadcrumb CSS classes from breadcrumb.css\n */\n\nimport * as React from \"react\";\nimport { BreadcrumbList } from \"./BreadcrumbList\";\nimport type { TypeBreadcrumbProps } from \"./BreadcrumbTypes\";\n\n// Utility for merging class names properly\nfunction cn(\n ...inputs: (string | undefined | null | false | Record<string, boolean>)[]\n): string {\n const classes: string[] = [];\n\n for (const input of inputs) {\n if (!input) continue;\n\n if (typeof input === \"string\") {\n classes.push(input);\n } else if (typeof input === \"object\") {\n for (const [key, value] of Object.entries(input)) {\n if (value) {\n classes.push(key);\n }\n }\n }\n }\n\n return classes.join(\" \");\n}\n\nexport const BreadcrumbTailwind = ({\n ariaLabel,\n overflow,\n children,\n className,\n ...rest\n}: TypeBreadcrumbProps) => {\n return (\n <nav\n className={cn(\"seeds-breadcrumb\", className)}\n aria-label={ariaLabel}\n data-qa-breadcrumb={ariaLabel}\n {...(rest as React.ComponentPropsWithoutRef<\"nav\">)}\n >\n <BreadcrumbList overflow={overflow}>{children}</BreadcrumbList>\n </nav>\n );\n};\n\nBreadcrumbTailwind.displayName = \"BreadcrumbTailwind\";\n","/**\n * Shared building blocks for Breadcrumb.\n *\n * BreadcrumbItem is the static `Breadcrumb.Item` subcomponent, and\n * BreadcrumbList produces the processed <ol> subtree (overflow block +\n * aria-current on the last item). Both the styled-components and Tailwind\n * paths render this exact same list — only the root <nav> wrapper differs — so\n * the child-processing logic lives here once and is never forked.\n */\n\nimport * as React from \"react\";\nimport Link from \"@sproutsocial/seeds-react-link\";\nimport type {\n TypeBreadcrumbProps,\n TypeBreadcrumbItemProps,\n} from \"./BreadcrumbTypes\";\n\nexport const BreadcrumbItem = ({\n children,\n href,\n ...rest\n}: TypeBreadcrumbItemProps) => {\n return (\n <li>\n <Link href={href} {...rest}>\n {children}\n </Link>\n </li>\n );\n};\n\nBreadcrumbItem.displayName = \"Breadcrumb.Item\";\n\nexport const BreadcrumbList = ({\n overflow,\n children,\n}: Pick<TypeBreadcrumbProps, \"overflow\" | \"children\">) => {\n const listItems = React.Children.toArray(children);\n const lastItem = listItems[listItems.length - 1];\n return (\n <ol>\n {overflow && (\n <>\n {overflow.rootItem}\n <li>{overflow.menu}</li>\n </>\n )}\n {listItems.map((item, i) => {\n // @ts-notes - item is a childNode which can be a string or number but `cloneElement` requires props\n const itemElem =\n typeof item === \"object\" && \"props\" in item ? (\n item\n ) : (\n <span>item</span>\n );\n return React.cloneElement(itemElem, {\n ...itemElem.props,\n \"aria-current\": listItems[i] === lastItem ? \"page\" : undefined,\n });\n })}\n </ol>\n );\n};\n","import * as React from \"react\";\nimport type {\n TypeStyledComponentsCommonProps,\n TypeSystemCommonProps,\n} from \"@sproutsocial/seeds-react-system-props\";\nexport type { TypeLinkProps as TypeBreadcrumbItemProps } from \"@sproutsocial/seeds-react-link\";\n\nexport interface TypeBreadcrumbProps\n extends TypeStyledComponentsCommonProps,\n TypeSystemCommonProps,\n Omit<React.ComponentPropsWithoutRef<\"nav\">, \"color\"> {\n children: React.ReactNode;\n\n /** Description of the type of navigation being provided by the breadcrumb (i.e. \"Asset library breadcrumb\") */\n ariaLabel: string;\n\n /** optional */\n overflow?: {\n label: string;\n menu: React.ReactNode;\n /** Optional item rendered before the overflow menu (e.g. the root/home crumb) */\n rootItem?: React.ReactNode;\n };\n}\n","import Breadcrumb from \"./Breadcrumb\";\n\nexport default Breadcrumb;\nexport { Breadcrumb };\nexport * from \"./BreadcrumbTypes\";\n"],"mappings":"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","names":["jsx","jsx","jsx"]}
package/dist/index.d.mts CHANGED
@@ -1,8 +1,8 @@
1
+ import * as _sproutsocial_seeds_react_link from '@sproutsocial/seeds-react-link';
2
+ export { TypeLinkProps as TypeBreadcrumbItemProps } from '@sproutsocial/seeds-react-link';
1
3
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
4
  import * as React from 'react';
3
5
  import { TypeStyledComponentsCommonProps, TypeSystemCommonProps } from '@sproutsocial/seeds-react-system-props';
4
- import { TypeLinkProps } from '@sproutsocial/seeds-react-link';
5
- export { TypeLinkProps as TypeBreadcrumbItemProps } from '@sproutsocial/seeds-react-link';
6
6
 
7
7
  interface TypeBreadcrumbProps extends TypeStyledComponentsCommonProps, TypeSystemCommonProps, Omit<React.ComponentPropsWithoutRef<"nav">, "color"> {
8
8
  children: React.ReactNode;
@@ -17,10 +17,15 @@ interface TypeBreadcrumbProps extends TypeStyledComponentsCommonProps, TypeSyste
17
17
  };
18
18
  }
19
19
 
20
+ /**
21
+ * Breadcrumb component. Automatically routes between the Tailwind
22
+ * implementation (preferred) and the styled-components implementation (for
23
+ * consumers using system props or styled() extension).
24
+ */
20
25
  declare const Breadcrumb: {
21
- ({ ariaLabel, overflow, children, ...rest }: TypeBreadcrumbProps): react_jsx_runtime.JSX.Element;
26
+ (props: TypeBreadcrumbProps): react_jsx_runtime.JSX.Element;
22
27
  Item: {
23
- ({ children, href, ...rest }: TypeLinkProps): react_jsx_runtime.JSX.Element;
28
+ ({ children, href, ...rest }: _sproutsocial_seeds_react_link.TypeLinkProps): react_jsx_runtime.JSX.Element;
24
29
  displayName: string;
25
30
  };
26
31
  };
package/dist/index.d.ts CHANGED
@@ -1,8 +1,8 @@
1
+ import * as _sproutsocial_seeds_react_link from '@sproutsocial/seeds-react-link';
2
+ export { TypeLinkProps as TypeBreadcrumbItemProps } from '@sproutsocial/seeds-react-link';
1
3
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
4
  import * as React from 'react';
3
5
  import { TypeStyledComponentsCommonProps, TypeSystemCommonProps } from '@sproutsocial/seeds-react-system-props';
4
- import { TypeLinkProps } from '@sproutsocial/seeds-react-link';
5
- export { TypeLinkProps as TypeBreadcrumbItemProps } from '@sproutsocial/seeds-react-link';
6
6
 
7
7
  interface TypeBreadcrumbProps extends TypeStyledComponentsCommonProps, TypeSystemCommonProps, Omit<React.ComponentPropsWithoutRef<"nav">, "color"> {
8
8
  children: React.ReactNode;
@@ -17,10 +17,15 @@ interface TypeBreadcrumbProps extends TypeStyledComponentsCommonProps, TypeSyste
17
17
  };
18
18
  }
19
19
 
20
+ /**
21
+ * Breadcrumb component. Automatically routes between the Tailwind
22
+ * implementation (preferred) and the styled-components implementation (for
23
+ * consumers using system props or styled() extension).
24
+ */
20
25
  declare const Breadcrumb: {
21
- ({ ariaLabel, overflow, children, ...rest }: TypeBreadcrumbProps): react_jsx_runtime.JSX.Element;
26
+ (props: TypeBreadcrumbProps): react_jsx_runtime.JSX.Element;
22
27
  Item: {
23
- ({ children, href, ...rest }: TypeLinkProps): react_jsx_runtime.JSX.Element;
28
+ ({ children, href, ...rest }: _sproutsocial_seeds_react_link.TypeLinkProps): react_jsx_runtime.JSX.Element;
24
29
  displayName: string;
25
30
  };
26
31
  };
package/dist/index.js CHANGED
@@ -36,8 +36,10 @@ __export(index_exports, {
36
36
  module.exports = __toCommonJS(index_exports);
37
37
 
38
38
  // src/Breadcrumb.tsx
39
- var React = __toESM(require("react"));
40
- var import_seeds_react_link = __toESM(require("@sproutsocial/seeds-react-link"));
39
+ var React4 = require("react");
40
+
41
+ // src/BreadcrumbHybrid.tsx
42
+ var React3 = require("react");
41
43
 
42
44
  // src/styles.ts
43
45
  var import_styled_components = __toESM(require("styled-components"));
@@ -83,7 +85,12 @@ var Nav = import_styled_components.default.nav`
83
85
  `;
84
86
  var styles_default = Nav;
85
87
 
86
- // src/Breadcrumb.tsx
88
+ // src/BreadcrumbTailwind.tsx
89
+ var React2 = require("react");
90
+
91
+ // src/BreadcrumbList.tsx
92
+ var React = __toESM(require("react"));
93
+ var import_seeds_react_link = __toESM(require("@sproutsocial/seeds-react-link"));
87
94
  var import_jsx_runtime = require("react/jsx-runtime");
88
95
  var BreadcrumbItem = ({
89
96
  children,
@@ -92,15 +99,14 @@ var BreadcrumbItem = ({
92
99
  }) => {
93
100
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("li", { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_seeds_react_link.default, { href, ...rest, children }) });
94
101
  };
95
- var Breadcrumb = ({
96
- ariaLabel,
102
+ BreadcrumbItem.displayName = "Breadcrumb.Item";
103
+ var BreadcrumbList = ({
97
104
  overflow,
98
- children,
99
- ...rest
105
+ children
100
106
  }) => {
101
107
  const listItems = React.Children.toArray(children);
102
108
  const lastItem = listItems[listItems.length - 1];
103
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(styles_default, { "aria-label": ariaLabel, "data-qa-breadcrumb": ariaLabel, ...rest, children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("ol", { children: [
109
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("ol", { children: [
104
110
  overflow && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
105
111
  overflow.rootItem,
106
112
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("li", { children: overflow.menu })
@@ -112,14 +118,71 @@ var Breadcrumb = ({
112
118
  "aria-current": listItems[i] === lastItem ? "page" : void 0
113
119
  });
114
120
  })
115
- ] }) });
121
+ ] });
116
122
  };
117
- BreadcrumbItem.displayName = "Breadcrumb.Item";
123
+
124
+ // src/BreadcrumbTailwind.tsx
125
+ var import_jsx_runtime2 = require("react/jsx-runtime");
126
+ function cn(...inputs) {
127
+ const classes = [];
128
+ for (const input of inputs) {
129
+ if (!input) continue;
130
+ if (typeof input === "string") {
131
+ classes.push(input);
132
+ } else if (typeof input === "object") {
133
+ for (const [key, value] of Object.entries(input)) {
134
+ if (value) {
135
+ classes.push(key);
136
+ }
137
+ }
138
+ }
139
+ }
140
+ return classes.join(" ");
141
+ }
142
+ var BreadcrumbTailwind = ({
143
+ ariaLabel,
144
+ overflow,
145
+ children,
146
+ className,
147
+ ...rest
148
+ }) => {
149
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
150
+ "nav",
151
+ {
152
+ className: cn("seeds-breadcrumb", className),
153
+ "aria-label": ariaLabel,
154
+ "data-qa-breadcrumb": ariaLabel,
155
+ ...rest,
156
+ children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(BreadcrumbList, { overflow, children })
157
+ }
158
+ );
159
+ };
160
+ BreadcrumbTailwind.displayName = "BreadcrumbTailwind";
161
+
162
+ // src/BreadcrumbHybrid.tsx
163
+ var import_seeds_react_system_props = require("@sproutsocial/seeds-react-system-props");
164
+ var import_jsx_runtime3 = require("react/jsx-runtime");
165
+ var BreadcrumbHybrid = ({
166
+ ariaLabel,
167
+ overflow,
168
+ children,
169
+ ...rest
170
+ }) => {
171
+ if ((0, import_seeds_react_system_props.hasStyledProps)(rest)) {
172
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(styles_default, { "aria-label": ariaLabel, "data-qa-breadcrumb": ariaLabel, ...rest, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(BreadcrumbList, { overflow, children }) });
173
+ }
174
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(BreadcrumbTailwind, { ariaLabel, overflow, ...rest, children });
175
+ };
176
+ var BreadcrumbHybrid_default = BreadcrumbHybrid;
177
+
178
+ // src/Breadcrumb.tsx
179
+ var import_jsx_runtime4 = require("react/jsx-runtime");
180
+ var Breadcrumb = (props) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(BreadcrumbHybrid_default, { ...props });
118
181
  Breadcrumb.Item = BreadcrumbItem;
119
182
  var Breadcrumb_default = Breadcrumb;
120
183
 
121
184
  // src/BreadcrumbTypes.ts
122
- var React2 = require("react");
185
+ var React5 = require("react");
123
186
 
124
187
  // src/index.ts
125
188
  var index_default = Breadcrumb_default;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/Breadcrumb.tsx","../src/styles.ts","../src/BreadcrumbTypes.ts"],"sourcesContent":["import Breadcrumb from \"./Breadcrumb\";\n\nexport default Breadcrumb;\nexport { Breadcrumb };\nexport * from \"./BreadcrumbTypes\";\n","import * as React from \"react\";\nimport Link from \"@sproutsocial/seeds-react-link\";\nimport Nav from \"./styles\";\nimport type {\n TypeBreadcrumbProps,\n TypeBreadcrumbItemProps,\n} from \"./BreadcrumbTypes\";\n\nconst BreadcrumbItem = ({\n children,\n href,\n ...rest\n}: TypeBreadcrumbItemProps) => {\n return (\n <li>\n <Link href={href} {...rest}>\n {children}\n </Link>\n </li>\n );\n};\n\nconst Breadcrumb = ({\n ariaLabel,\n overflow,\n children,\n ...rest\n}: TypeBreadcrumbProps) => {\n const listItems = React.Children.toArray(children);\n const lastItem = listItems[listItems.length - 1];\n return (\n <Nav aria-label={ariaLabel} data-qa-breadcrumb={ariaLabel} {...rest}>\n <ol>\n {overflow && (\n <>\n {overflow.rootItem}\n <li>{overflow.menu}</li>\n </>\n )}\n {listItems.map((item, i) => {\n // @ts-notes - item is a childNode which can be a string or number but `cloneElement` requires props\n const itemElem =\n typeof item === \"object\" && \"props\" in item ? (\n item\n ) : (\n <span>item</span>\n );\n return React.cloneElement(itemElem, {\n ...itemElem.props,\n \"aria-current\": listItems[i] === lastItem ? \"page\" : undefined,\n });\n })}\n </ol>\n </Nav>\n );\n};\n\nBreadcrumbItem.displayName = \"Breadcrumb.Item\";\nBreadcrumb.Item = BreadcrumbItem;\n\nexport default Breadcrumb;\n","import styled from \"styled-components\";\n\nconst Nav = styled.nav`\n ol {\n ${(props) => props.theme.typography[200]};\n margin: 0;\n font-family: ${(props) => props.theme.fontFamily};\n padding: 0;\n display: flex;\n }\n\n li {\n margin-right: ${(props) => props.theme.space[200]};\n display: flex;\n }\n\n a,\n button {\n ${(props) => props.theme.typography[200]};\n max-width: 200px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n ol > div + li::before {\n content: \"/\";\n margin-right: ${(props) => props.theme.space[200]};\n }\n\n li:last-child a,\n li:last-child button {\n color: ${(props) => props.theme.colors.text.body};\n font-weight: bold;\n }\n\n li:not(:last-child)::after {\n content: \"/\";\n color: ${(props) => props.theme.colors.text.body};\n margin-left: ${(props) => props.theme.space[200]};\n }\n`;\n\nexport default Nav;\n","import * as React from \"react\";\nimport type {\n TypeStyledComponentsCommonProps,\n TypeSystemCommonProps,\n} from \"@sproutsocial/seeds-react-system-props\";\nexport type { TypeLinkProps as TypeBreadcrumbItemProps } from \"@sproutsocial/seeds-react-link\";\n\nexport interface TypeBreadcrumbProps\n extends TypeStyledComponentsCommonProps,\n TypeSystemCommonProps,\n Omit<React.ComponentPropsWithoutRef<\"nav\">, \"color\"> {\n children: React.ReactNode;\n\n /** Description of the type of navigation being provided by the breadcrumb (i.e. \"Asset library breadcrumb\") */\n ariaLabel: string;\n\n /** optional */\n overflow?: {\n label: string;\n menu: React.ReactNode;\n /** Optional item rendered before the overflow menu (e.g. the root/home crumb) */\n rootItem?: React.ReactNode;\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,YAAuB;AACvB,8BAAiB;;;ACDjB,+BAAmB;AAEnB,IAAM,MAAM,yBAAAA,QAAO;AAAA;AAAA,MAEb,CAAC,UAAU,MAAM,MAAM,WAAW,GAAG,CAAC;AAAA;AAAA,mBAEzB,CAAC,UAAU,MAAM,MAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAMhC,CAAC,UAAU,MAAM,MAAM,MAAM,GAAG,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAM/C,CAAC,UAAU,MAAM,MAAM,WAAW,GAAG,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBASxB,CAAC,UAAU,MAAM,MAAM,MAAM,GAAG,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,aAKxC,CAAC,UAAU,MAAM,MAAM,OAAO,KAAK,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAMvC,CAAC,UAAU,MAAM,MAAM,OAAO,KAAK,IAAI;AAAA,mBACjC,CAAC,UAAU,MAAM,MAAM,MAAM,GAAG,CAAC;AAAA;AAAA;AAIpD,IAAO,iBAAQ;;;AD5BT;AAPN,IAAM,iBAAiB,CAAC;AAAA,EACtB;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAA+B;AAC7B,SACE,4CAAC,QACC,sDAAC,wBAAAC,SAAA,EAAK,MAAa,GAAG,MACnB,UACH,GACF;AAEJ;AAEA,IAAM,aAAa,CAAC;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAA2B;AACzB,QAAM,YAAkB,eAAS,QAAQ,QAAQ;AACjD,QAAM,WAAW,UAAU,UAAU,SAAS,CAAC;AAC/C,SACE,4CAAC,kBAAI,cAAY,WAAW,sBAAoB,WAAY,GAAG,MAC7D,uDAAC,QACE;AAAA,gBACC,4EACG;AAAA,eAAS;AAAA,MACV,4CAAC,QAAI,mBAAS,MAAK;AAAA,OACrB;AAAA,IAED,UAAU,IAAI,CAAC,MAAM,MAAM;AAE1B,YAAM,WACJ,OAAO,SAAS,YAAY,WAAW,OACrC,OAEA,4CAAC,UAAK,kBAAI;AAEd,aAAa,mBAAa,UAAU;AAAA,QAClC,GAAG,SAAS;AAAA,QACZ,gBAAgB,UAAU,CAAC,MAAM,WAAW,SAAS;AAAA,MACvD,CAAC;AAAA,IACH,CAAC;AAAA,KACH,GACF;AAEJ;AAEA,eAAe,cAAc;AAC7B,WAAW,OAAO;AAElB,IAAO,qBAAQ;;;AE5Df,IAAAC,SAAuB;;;AHEvB,IAAO,gBAAQ;","names":["styled","Link","React"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/Breadcrumb.tsx","../src/BreadcrumbHybrid.tsx","../src/styles.ts","../src/BreadcrumbTailwind.tsx","../src/BreadcrumbList.tsx","../src/BreadcrumbTypes.ts"],"sourcesContent":["import Breadcrumb from \"./Breadcrumb\";\n\nexport default Breadcrumb;\nexport { Breadcrumb };\nexport * from \"./BreadcrumbTypes\";\n","import * as React from \"react\";\nimport BreadcrumbHybrid from \"./BreadcrumbHybrid\";\nimport { BreadcrumbItem } from \"./BreadcrumbList\";\nimport type { TypeBreadcrumbProps } from \"./BreadcrumbTypes\";\n\n/**\n * Breadcrumb component. Automatically routes between the Tailwind\n * implementation (preferred) and the styled-components implementation (for\n * consumers using system props or styled() extension).\n */\nconst Breadcrumb = (props: TypeBreadcrumbProps) => (\n <BreadcrumbHybrid {...props} />\n);\n\nBreadcrumb.Item = BreadcrumbItem;\n\nexport default Breadcrumb;\n","/**\n * Hybrid Breadcrumb Component\n * Automatically chooses between Tailwind and styled-components based on props\n */\n\nimport * as React from \"react\";\nimport Nav from \"./styles\"; // Styled-components version\nimport { BreadcrumbTailwind } from \"./BreadcrumbTailwind\"; // Tailwind version\nimport { BreadcrumbList } from \"./BreadcrumbList\";\nimport { hasStyledProps } from \"@sproutsocial/seeds-react-system-props\";\nimport type { TypeBreadcrumbProps } from \"./BreadcrumbTypes\";\n\nconst BreadcrumbHybrid = ({\n ariaLabel,\n overflow,\n children,\n ...rest\n}: TypeBreadcrumbProps) => {\n if (hasStyledProps(rest)) {\n return (\n <Nav aria-label={ariaLabel} data-qa-breadcrumb={ariaLabel} {...rest}>\n <BreadcrumbList overflow={overflow}>{children}</BreadcrumbList>\n </Nav>\n );\n }\n\n // Use Tailwind version (preferred - better performance)\n return (\n <BreadcrumbTailwind ariaLabel={ariaLabel} overflow={overflow} {...rest}>\n {children}\n </BreadcrumbTailwind>\n );\n};\n\nexport default BreadcrumbHybrid;\n","import styled from \"styled-components\";\n\nconst Nav = styled.nav`\n ol {\n ${(props) => props.theme.typography[200]};\n margin: 0;\n font-family: ${(props) => props.theme.fontFamily};\n padding: 0;\n display: flex;\n }\n\n li {\n margin-right: ${(props) => props.theme.space[200]};\n display: flex;\n }\n\n a,\n button {\n ${(props) => props.theme.typography[200]};\n max-width: 200px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n ol > div + li::before {\n content: \"/\";\n margin-right: ${(props) => props.theme.space[200]};\n }\n\n li:last-child a,\n li:last-child button {\n color: ${(props) => props.theme.colors.text.body};\n font-weight: bold;\n }\n\n li:not(:last-child)::after {\n content: \"/\";\n color: ${(props) => props.theme.colors.text.body};\n margin-left: ${(props) => props.theme.space[200]};\n }\n`;\n\nexport default Nav;\n","/**\n * Tailwind CSS implementation of Breadcrumb component\n * Uses Seeds breadcrumb CSS classes from breadcrumb.css\n */\n\nimport * as React from \"react\";\nimport { BreadcrumbList } from \"./BreadcrumbList\";\nimport type { TypeBreadcrumbProps } from \"./BreadcrumbTypes\";\n\n// Utility for merging class names properly\nfunction cn(\n ...inputs: (string | undefined | null | false | Record<string, boolean>)[]\n): string {\n const classes: string[] = [];\n\n for (const input of inputs) {\n if (!input) continue;\n\n if (typeof input === \"string\") {\n classes.push(input);\n } else if (typeof input === \"object\") {\n for (const [key, value] of Object.entries(input)) {\n if (value) {\n classes.push(key);\n }\n }\n }\n }\n\n return classes.join(\" \");\n}\n\nexport const BreadcrumbTailwind = ({\n ariaLabel,\n overflow,\n children,\n className,\n ...rest\n}: TypeBreadcrumbProps) => {\n return (\n <nav\n className={cn(\"seeds-breadcrumb\", className)}\n aria-label={ariaLabel}\n data-qa-breadcrumb={ariaLabel}\n {...(rest as React.ComponentPropsWithoutRef<\"nav\">)}\n >\n <BreadcrumbList overflow={overflow}>{children}</BreadcrumbList>\n </nav>\n );\n};\n\nBreadcrumbTailwind.displayName = \"BreadcrumbTailwind\";\n","/**\n * Shared building blocks for Breadcrumb.\n *\n * BreadcrumbItem is the static `Breadcrumb.Item` subcomponent, and\n * BreadcrumbList produces the processed <ol> subtree (overflow block +\n * aria-current on the last item). Both the styled-components and Tailwind\n * paths render this exact same list — only the root <nav> wrapper differs — so\n * the child-processing logic lives here once and is never forked.\n */\n\nimport * as React from \"react\";\nimport Link from \"@sproutsocial/seeds-react-link\";\nimport type {\n TypeBreadcrumbProps,\n TypeBreadcrumbItemProps,\n} from \"./BreadcrumbTypes\";\n\nexport const BreadcrumbItem = ({\n children,\n href,\n ...rest\n}: TypeBreadcrumbItemProps) => {\n return (\n <li>\n <Link href={href} {...rest}>\n {children}\n </Link>\n </li>\n );\n};\n\nBreadcrumbItem.displayName = \"Breadcrumb.Item\";\n\nexport const BreadcrumbList = ({\n overflow,\n children,\n}: Pick<TypeBreadcrumbProps, \"overflow\" | \"children\">) => {\n const listItems = React.Children.toArray(children);\n const lastItem = listItems[listItems.length - 1];\n return (\n <ol>\n {overflow && (\n <>\n {overflow.rootItem}\n <li>{overflow.menu}</li>\n </>\n )}\n {listItems.map((item, i) => {\n // @ts-notes - item is a childNode which can be a string or number but `cloneElement` requires props\n const itemElem =\n typeof item === \"object\" && \"props\" in item ? (\n item\n ) : (\n <span>item</span>\n );\n return React.cloneElement(itemElem, {\n ...itemElem.props,\n \"aria-current\": listItems[i] === lastItem ? \"page\" : undefined,\n });\n })}\n </ol>\n );\n};\n","import * as React from \"react\";\nimport type {\n TypeStyledComponentsCommonProps,\n TypeSystemCommonProps,\n} from \"@sproutsocial/seeds-react-system-props\";\nexport type { TypeLinkProps as TypeBreadcrumbItemProps } from \"@sproutsocial/seeds-react-link\";\n\nexport interface TypeBreadcrumbProps\n extends TypeStyledComponentsCommonProps,\n TypeSystemCommonProps,\n Omit<React.ComponentPropsWithoutRef<\"nav\">, \"color\"> {\n children: React.ReactNode;\n\n /** Description of the type of navigation being provided by the breadcrumb (i.e. \"Asset library breadcrumb\") */\n ariaLabel: string;\n\n /** optional */\n overflow?: {\n label: string;\n menu: React.ReactNode;\n /** Optional item rendered before the overflow menu (e.g. the root/home crumb) */\n rootItem?: React.ReactNode;\n };\n}\n"],"mappings":"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","names":["React","React","styled","React","Link","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","React"]}
package/package.json CHANGED
@@ -1,15 +1,23 @@
1
1
  {
2
2
  "name": "@sproutsocial/seeds-react-breadcrumb",
3
- "version": "1.1.10",
3
+ "version": "1.1.12",
4
4
  "description": "Seeds React Breadcrumb",
5
5
  "author": "Sprout Social, Inc.",
6
6
  "license": "MIT",
7
7
  "main": "dist/index.js",
8
8
  "module": "dist/esm/index.js",
9
9
  "types": "dist/index.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "import": "./dist/esm/index.js",
13
+ "require": "./dist/index.js",
14
+ "types": "./dist/index.d.ts"
15
+ },
16
+ "./dist/breadcrumb.css": "./dist/breadcrumb.css"
17
+ },
10
18
  "scripts": {
11
- "build": "tsup --dts",
12
- "build:debug": "tsup --dts --metafile",
19
+ "build": "tsup --dts && cp src/breadcrumb.css dist/breadcrumb.css",
20
+ "build:debug": "tsup --dts --metafile && cp src/breadcrumb.css dist/breadcrumb.css",
13
21
  "dev": "tsup --watch --dts",
14
22
  "clean": "rm -rf .turbo dist",
15
23
  "clean:modules": "rm -rf node_modules",
@@ -18,9 +26,9 @@
18
26
  "test:watch": "jest --watch --coverage=false"
19
27
  },
20
28
  "dependencies": {
21
- "@sproutsocial/seeds-react-theme": "^4.2.0",
22
- "@sproutsocial/seeds-react-system-props": "^3.1.2",
23
- "@sproutsocial/seeds-react-link": "^1.1.16"
29
+ "@sproutsocial/seeds-react-theme": "^4.3.0",
30
+ "@sproutsocial/seeds-react-system-props": "^3.1.3",
31
+ "@sproutsocial/seeds-react-link": "^1.1.18"
24
32
  },
25
33
  "devDependencies": {
26
34
  "@types/react": "^18.0.0",
@@ -1,61 +1,17 @@
1
1
  import * as React from "react";
2
- import Link from "@sproutsocial/seeds-react-link";
3
- import Nav from "./styles";
4
- import type {
5
- TypeBreadcrumbProps,
6
- TypeBreadcrumbItemProps,
7
- } from "./BreadcrumbTypes";
2
+ import BreadcrumbHybrid from "./BreadcrumbHybrid";
3
+ import { BreadcrumbItem } from "./BreadcrumbList";
4
+ import type { TypeBreadcrumbProps } from "./BreadcrumbTypes";
8
5
 
9
- const BreadcrumbItem = ({
10
- children,
11
- href,
12
- ...rest
13
- }: TypeBreadcrumbItemProps) => {
14
- return (
15
- <li>
16
- <Link href={href} {...rest}>
17
- {children}
18
- </Link>
19
- </li>
20
- );
21
- };
6
+ /**
7
+ * Breadcrumb component. Automatically routes between the Tailwind
8
+ * implementation (preferred) and the styled-components implementation (for
9
+ * consumers using system props or styled() extension).
10
+ */
11
+ const Breadcrumb = (props: TypeBreadcrumbProps) => (
12
+ <BreadcrumbHybrid {...props} />
13
+ );
22
14
 
23
- const Breadcrumb = ({
24
- ariaLabel,
25
- overflow,
26
- children,
27
- ...rest
28
- }: TypeBreadcrumbProps) => {
29
- const listItems = React.Children.toArray(children);
30
- const lastItem = listItems[listItems.length - 1];
31
- return (
32
- <Nav aria-label={ariaLabel} data-qa-breadcrumb={ariaLabel} {...rest}>
33
- <ol>
34
- {overflow && (
35
- <>
36
- {overflow.rootItem}
37
- <li>{overflow.menu}</li>
38
- </>
39
- )}
40
- {listItems.map((item, i) => {
41
- // @ts-notes - item is a childNode which can be a string or number but `cloneElement` requires props
42
- const itemElem =
43
- typeof item === "object" && "props" in item ? (
44
- item
45
- ) : (
46
- <span>item</span>
47
- );
48
- return React.cloneElement(itemElem, {
49
- ...itemElem.props,
50
- "aria-current": listItems[i] === lastItem ? "page" : undefined,
51
- });
52
- })}
53
- </ol>
54
- </Nav>
55
- );
56
- };
57
-
58
- BreadcrumbItem.displayName = "Breadcrumb.Item";
59
15
  Breadcrumb.Item = BreadcrumbItem;
60
16
 
61
17
  export default Breadcrumb;
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Hybrid Breadcrumb Component
3
+ * Automatically chooses between Tailwind and styled-components based on props
4
+ */
5
+
6
+ import * as React from "react";
7
+ import Nav from "./styles"; // Styled-components version
8
+ import { BreadcrumbTailwind } from "./BreadcrumbTailwind"; // Tailwind version
9
+ import { BreadcrumbList } from "./BreadcrumbList";
10
+ import { hasStyledProps } from "@sproutsocial/seeds-react-system-props";
11
+ import type { TypeBreadcrumbProps } from "./BreadcrumbTypes";
12
+
13
+ const BreadcrumbHybrid = ({
14
+ ariaLabel,
15
+ overflow,
16
+ children,
17
+ ...rest
18
+ }: TypeBreadcrumbProps) => {
19
+ if (hasStyledProps(rest)) {
20
+ return (
21
+ <Nav aria-label={ariaLabel} data-qa-breadcrumb={ariaLabel} {...rest}>
22
+ <BreadcrumbList overflow={overflow}>{children}</BreadcrumbList>
23
+ </Nav>
24
+ );
25
+ }
26
+
27
+ // Use Tailwind version (preferred - better performance)
28
+ return (
29
+ <BreadcrumbTailwind ariaLabel={ariaLabel} overflow={overflow} {...rest}>
30
+ {children}
31
+ </BreadcrumbTailwind>
32
+ );
33
+ };
34
+
35
+ export default BreadcrumbHybrid;
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Shared building blocks for Breadcrumb.
3
+ *
4
+ * BreadcrumbItem is the static `Breadcrumb.Item` subcomponent, and
5
+ * BreadcrumbList produces the processed <ol> subtree (overflow block +
6
+ * aria-current on the last item). Both the styled-components and Tailwind
7
+ * paths render this exact same list — only the root <nav> wrapper differs — so
8
+ * the child-processing logic lives here once and is never forked.
9
+ */
10
+
11
+ import * as React from "react";
12
+ import Link from "@sproutsocial/seeds-react-link";
13
+ import type {
14
+ TypeBreadcrumbProps,
15
+ TypeBreadcrumbItemProps,
16
+ } from "./BreadcrumbTypes";
17
+
18
+ export const BreadcrumbItem = ({
19
+ children,
20
+ href,
21
+ ...rest
22
+ }: TypeBreadcrumbItemProps) => {
23
+ return (
24
+ <li>
25
+ <Link href={href} {...rest}>
26
+ {children}
27
+ </Link>
28
+ </li>
29
+ );
30
+ };
31
+
32
+ BreadcrumbItem.displayName = "Breadcrumb.Item";
33
+
34
+ export const BreadcrumbList = ({
35
+ overflow,
36
+ children,
37
+ }: Pick<TypeBreadcrumbProps, "overflow" | "children">) => {
38
+ const listItems = React.Children.toArray(children);
39
+ const lastItem = listItems[listItems.length - 1];
40
+ return (
41
+ <ol>
42
+ {overflow && (
43
+ <>
44
+ {overflow.rootItem}
45
+ <li>{overflow.menu}</li>
46
+ </>
47
+ )}
48
+ {listItems.map((item, i) => {
49
+ // @ts-notes - item is a childNode which can be a string or number but `cloneElement` requires props
50
+ const itemElem =
51
+ typeof item === "object" && "props" in item ? (
52
+ item
53
+ ) : (
54
+ <span>item</span>
55
+ );
56
+ return React.cloneElement(itemElem, {
57
+ ...itemElem.props,
58
+ "aria-current": listItems[i] === lastItem ? "page" : undefined,
59
+ });
60
+ })}
61
+ </ol>
62
+ );
63
+ };
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Tailwind CSS implementation of Breadcrumb component
3
+ * Uses Seeds breadcrumb CSS classes from breadcrumb.css
4
+ */
5
+
6
+ import * as React from "react";
7
+ import { BreadcrumbList } from "./BreadcrumbList";
8
+ import type { TypeBreadcrumbProps } from "./BreadcrumbTypes";
9
+
10
+ // Utility for merging class names properly
11
+ function cn(
12
+ ...inputs: (string | undefined | null | false | Record<string, boolean>)[]
13
+ ): string {
14
+ const classes: string[] = [];
15
+
16
+ for (const input of inputs) {
17
+ if (!input) continue;
18
+
19
+ if (typeof input === "string") {
20
+ classes.push(input);
21
+ } else if (typeof input === "object") {
22
+ for (const [key, value] of Object.entries(input)) {
23
+ if (value) {
24
+ classes.push(key);
25
+ }
26
+ }
27
+ }
28
+ }
29
+
30
+ return classes.join(" ");
31
+ }
32
+
33
+ export const BreadcrumbTailwind = ({
34
+ ariaLabel,
35
+ overflow,
36
+ children,
37
+ className,
38
+ ...rest
39
+ }: TypeBreadcrumbProps) => {
40
+ return (
41
+ <nav
42
+ className={cn("seeds-breadcrumb", className)}
43
+ aria-label={ariaLabel}
44
+ data-qa-breadcrumb={ariaLabel}
45
+ {...(rest as React.ComponentPropsWithoutRef<"nav">)}
46
+ >
47
+ <BreadcrumbList overflow={overflow}>{children}</BreadcrumbList>
48
+ </nav>
49
+ );
50
+ };
51
+
52
+ BreadcrumbTailwind.displayName = "BreadcrumbTailwind";
@@ -69,6 +69,44 @@ describe("Breadcrumb", () => {
69
69
  );
70
70
  });
71
71
 
72
+ it("renders the Tailwind path with the seeds-breadcrumb class", () => {
73
+ render(
74
+ <Breadcrumb ariaLabel="breadcrumb">
75
+ <Breadcrumb.Item href="/">Home</Breadcrumb.Item>
76
+ <Breadcrumb.Item href="/level-two">Level Two</Breadcrumb.Item>
77
+ </Breadcrumb>
78
+ );
79
+ expect(
80
+ screen.getByDataQaLabel({ breadcrumb: "breadcrumb" })
81
+ ).toHaveClass("seeds-breadcrumb");
82
+ });
83
+
84
+ it("merges a consumer className on the Tailwind path (styled() contract)", () => {
85
+ render(
86
+ <Breadcrumb ariaLabel="breadcrumb" className="custom">
87
+ <Breadcrumb.Item href="/">Home</Breadcrumb.Item>
88
+ <Breadcrumb.Item href="/level-two">Level Two</Breadcrumb.Item>
89
+ </Breadcrumb>
90
+ );
91
+ const nav = screen.getByDataQaLabel({ breadcrumb: "breadcrumb" });
92
+ expect(nav).toHaveClass("seeds-breadcrumb");
93
+ expect(nav).toHaveClass("custom");
94
+ });
95
+
96
+ it("routes through the styled-components path when a system prop is present", () => {
97
+ // mt is a system prop, which routes Breadcrumb through the styled-components path
98
+ render(
99
+ <Breadcrumb ariaLabel="breadcrumb" mt={200}>
100
+ <Breadcrumb.Item href="/">Home</Breadcrumb.Item>
101
+ <Breadcrumb.Item href="/level-two">Level Two</Breadcrumb.Item>
102
+ </Breadcrumb>
103
+ );
104
+ expect(screen.getByText("Level Two")).toHaveAttribute(
105
+ "aria-current",
106
+ "page"
107
+ );
108
+ });
109
+
72
110
  describe("overflow", () => {
73
111
  const OverflowMenu = () => <button>overflow</button>;
74
112
 
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Seeds Breadcrumb component classes
3
+ * Use these instead of writing out individual Tailwind utility classes.
4
+ *
5
+ * Requires @sproutsocial/seeds-react-theme/dist/theme-all.css imported for
6
+ * CSS variable definitions and dark mode support.
7
+ *
8
+ * All rules are wrapped in `@layer components` so that consumer Tailwind
9
+ * utilities (unlayered) win the cascade over these styles.
10
+ */
11
+
12
+ @layer components {
13
+ .seeds-breadcrumb ol {
14
+ font-size: var(--font-size-200);
15
+ line-height: var(--line-height-200);
16
+ margin: 0;
17
+ font-family: var(--font-family);
18
+ padding: 0;
19
+ display: flex;
20
+ }
21
+
22
+ .seeds-breadcrumb li {
23
+ margin-right: var(--space-200);
24
+ display: flex;
25
+ }
26
+
27
+ .seeds-breadcrumb a,
28
+ .seeds-breadcrumb button {
29
+ font-size: var(--font-size-200);
30
+ line-height: var(--line-height-200);
31
+ max-width: 200px;
32
+ overflow: hidden;
33
+ text-overflow: ellipsis;
34
+ white-space: nowrap;
35
+ }
36
+
37
+ .seeds-breadcrumb ol > div + li::before {
38
+ content: "/";
39
+ margin-right: var(--space-200);
40
+ }
41
+
42
+ .seeds-breadcrumb li:last-child a,
43
+ .seeds-breadcrumb li:last-child button {
44
+ color: var(--color-text-body);
45
+ font-weight: bold;
46
+ }
47
+
48
+ .seeds-breadcrumb li:not(:last-child)::after {
49
+ content: "/";
50
+ color: var(--color-text-body);
51
+ margin-left: var(--space-200);
52
+ }
53
+ }