@sproutsocial/seeds-react-breadcrumb 1.1.9 → 1.1.11
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/.turbo/turbo-build.log +67 -11
- package/CHANGELOG.md +16 -0
- package/dist/breadcrumb.css +53 -0
- package/dist/esm/index.js +73 -10
- package/dist/esm/index.js.map +1 -1
- package/dist/index.d.mts +9 -4
- package/dist/index.d.ts +9 -4
- package/dist/index.js +74 -11
- package/dist/index.js.map +1 -1
- package/package.json +14 -6
- package/src/Breadcrumb.tsx +11 -55
- package/src/BreadcrumbHybrid.tsx +35 -0
- package/src/BreadcrumbList.tsx +63 -0
- package/src/BreadcrumbTailwind.tsx +52 -0
- package/src/__tests__/breadcrumb.test.tsx +38 -0
- package/src/breadcrumb.css +53 -0
package/.turbo/turbo-build.log
CHANGED
|
@@ -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
|
[34mCLI[39m Building entry: src/index.ts
|
|
4
22
|
[34mCLI[39m Using tsconfig: tsconfig.json
|
|
5
23
|
[34mCLI[39m tsup v8.5.0
|
|
@@ -8,14 +26,52 @@ $ tsup --dts
|
|
|
8
26
|
[34mCLI[39m Cleaning output folder
|
|
9
27
|
[34mCJS[39m Build start
|
|
10
28
|
[34mESM[39m Build start
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
[
|
|
15
|
-
[
|
|
16
|
-
|
|
29
|
+
[warn] [33m▲ [43;33m[[43;30mWARNING[43;33m][0m [1mThe condition "types" here will never be used as it comes after both "import" and "require"[0m [package.json]
|
|
30
|
+
|
|
31
|
+
package.json:14:6:
|
|
32
|
+
[37m 14 │ [32m"types"[37m: "./dist/index.d.ts"
|
|
33
|
+
╵ [32m~~~~~~~[0m
|
|
34
|
+
|
|
35
|
+
The "import" condition comes earlier and will be used for all "import" statements:
|
|
36
|
+
|
|
37
|
+
package.json:12:6:
|
|
38
|
+
[37m 12 │ [32m"import"[37m: "./dist/esm/index.js",
|
|
39
|
+
╵ [32m~~~~~~~~[0m
|
|
40
|
+
|
|
41
|
+
The "require" condition comes earlier and will be used for all "require" calls:
|
|
42
|
+
|
|
43
|
+
package.json:13:6:
|
|
44
|
+
[37m 13 │ [32m"require"[37m: "./dist/index.js",
|
|
45
|
+
╵ [32m~~~~~~~~~[0m
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
[warn] [33m▲ [43;33m[[43;30mWARNING[43;33m][0m [1mThe condition "types" here will never be used as it comes after both "import" and "require"[0m [package.json]
|
|
49
|
+
|
|
50
|
+
package.json:14:6:
|
|
51
|
+
[37m 14 │ [32m"types"[37m: "./dist/index.d.ts"
|
|
52
|
+
╵ [32m~~~~~~~[0m
|
|
53
|
+
|
|
54
|
+
The "import" condition comes earlier and will be used for all "import" statements:
|
|
55
|
+
|
|
56
|
+
package.json:12:6:
|
|
57
|
+
[37m 12 │ [32m"import"[37m: "./dist/esm/index.js",
|
|
58
|
+
╵ [32m~~~~~~~~[0m
|
|
59
|
+
|
|
60
|
+
The "require" condition comes earlier and will be used for all "require" calls:
|
|
61
|
+
|
|
62
|
+
package.json:13:6:
|
|
63
|
+
[37m 13 │ [32m"require"[37m: "./dist/index.js",
|
|
64
|
+
╵ [32m~~~~~~~~~[0m
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
[32mCJS[39m [1mdist/index.js [22m[32m6.09 KB[39m
|
|
68
|
+
[32mCJS[39m [1mdist/index.js.map [22m[32m9.22 KB[39m
|
|
69
|
+
[32mCJS[39m ⚡️ Build success in 20ms
|
|
70
|
+
[32mESM[39m [1mdist/esm/index.js [22m[32m3.97 KB[39m
|
|
71
|
+
[32mESM[39m [1mdist/esm/index.js.map [22m[32m9.12 KB[39m
|
|
72
|
+
[32mESM[39m ⚡️ Build success in 21ms
|
|
17
73
|
[34mDTS[39m Build start
|
|
18
|
-
[32mDTS[39m ⚡️ Build success in
|
|
19
|
-
[32mDTS[39m [1mdist/index.d.ts [22m[32m1.
|
|
20
|
-
[32mDTS[39m [1mdist/index.d.mts [22m[32m1.
|
|
21
|
-
Done in 2.
|
|
74
|
+
[32mDTS[39m ⚡️ Build success in 1719ms
|
|
75
|
+
[32mDTS[39m [1mdist/index.d.ts [22m[32m1.43 KB[39m
|
|
76
|
+
[32mDTS[39m [1mdist/index.d.mts [22m[32m1.43 KB[39m
|
|
77
|
+
Done in 2.48s.
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# @sproutsocial/seeds-react-breadcrumb
|
|
2
2
|
|
|
3
|
+
## 1.1.11
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [d21ae54]
|
|
8
|
+
- @sproutsocial/seeds-react-theme@4.2.1
|
|
9
|
+
- @sproutsocial/seeds-react-link@1.1.17
|
|
10
|
+
|
|
11
|
+
## 1.1.10
|
|
12
|
+
|
|
13
|
+
### Patch Changes
|
|
14
|
+
|
|
15
|
+
- Updated dependencies [6611f6a]
|
|
16
|
+
- @sproutsocial/seeds-react-system-props@3.1.2
|
|
17
|
+
- @sproutsocial/seeds-react-link@1.1.16
|
|
18
|
+
|
|
3
19
|
## 1.1.9
|
|
4
20
|
|
|
5
21
|
### 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
|
|
3
|
-
|
|
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/
|
|
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
|
-
|
|
59
|
-
|
|
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__ */
|
|
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
|
-
|
|
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
|
|
package/dist/esm/index.js.map
CHANGED
|
@@ -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
|
|
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
|
-
(
|
|
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
|
-
(
|
|
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
|
|
40
|
-
|
|
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/
|
|
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
|
-
|
|
96
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
|
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
|
|
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.
|
|
3
|
+
"version": "1.1.11",
|
|
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.
|
|
22
|
-
"@sproutsocial/seeds-react-system-props": "^3.1.
|
|
23
|
-
"@sproutsocial/seeds-react-link": "^1.1.
|
|
29
|
+
"@sproutsocial/seeds-react-theme": "^4.2.1",
|
|
30
|
+
"@sproutsocial/seeds-react-system-props": "^3.1.2",
|
|
31
|
+
"@sproutsocial/seeds-react-link": "^1.1.17"
|
|
24
32
|
},
|
|
25
33
|
"devDependencies": {
|
|
26
34
|
"@types/react": "^18.0.0",
|
package/src/Breadcrumb.tsx
CHANGED
|
@@ -1,61 +1,17 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
|
-
import
|
|
3
|
-
import
|
|
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
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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
|
+
}
|