Skip to content

Commit 8a56d0c

Browse files
committed
feat(breadcrumbs): add breadcrumbs component
1 parent 1cc7289 commit 8a56d0c

11 files changed

+158
-41
lines changed

index.html

Lines changed: 1 addition & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -53,26 +53,13 @@
5353
<script type="module">
5454
import {
5555
footer,
56-
footerMenus,
5756
header,
5857
resourceCatalog,
59-
siteMenus,
6058
tableOfContents,
6159
universalMenuItems,
6260
universalMenus,
6361
} from "/src/index.jsx";
6462

65-
const siteItems = [
66-
{
67-
name: "Resources",
68-
href: "/access-ci-ui",
69-
},
70-
{
71-
name: "Resource Providers",
72-
href: "https://access-ci.org/about/resource-providers/",
73-
},
74-
];
75-
7663
universalMenus({
7764
loginUrl: "/login",
7865
logoutUrl: "/logout",
@@ -83,21 +70,11 @@
8370
target: document.getElementById("header"),
8471
});
8572

86-
siteMenus({
87-
items: siteItems,
88-
target: document.getElementById("site-menus"),
89-
siteName: "Resources",
90-
});
91-
9273
resourceCatalog({
74+
baseUri: "/access-ci-ui",
9375
target: document.getElementById("resource-catalog"),
9476
});
9577

96-
footerMenus({
97-
items: siteItems,
98-
target: document.getElementById("footer-menus"),
99-
});
100-
10178
footer({ target: document.getElementById("footer") });
10279
</script>
10380
</body>

src/base.css

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
--contrast-2: #3f3f3f;
55
--contrast-3: #707070;
66
--contrast-6: #999999;
7+
--contrast-7: #d9d9d9;
78
--contrast-8: #dfdfdf;
89
--contrast-9: #e5e5e5;
910
--green-400: #288654;

src/breadcrumbs.css

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
ul.breadcrumbs {
2+
--offset: calc((100vw - var(--width)) / 2);
3+
border-bottom: 1px solid var(--contrast-7);
4+
box-sizing: border-box;
5+
font-size: 14px;
6+
font-stretch: 70%;
7+
font-weight: 600;
8+
line-height: 20px;
9+
list-style-type: none;
10+
margin: 0;
11+
padding: 0;
12+
padding-left: 30px;
13+
padding-right: 30px;
14+
width: 100vw;
15+
}
16+
ul.breadcrumbs.top-border {
17+
border-top: 1px solid var(--contrast-7);
18+
}
19+
ul.breadcrumbs.expand {
20+
margin-left: -30px;
21+
margin-right: -30px;
22+
}
23+
ul.breadcrumbs li {
24+
display: inline-block;
25+
margin: 0;
26+
padding: 11px 0 6px;
27+
text-transform: uppercase;
28+
vertical-align: middle;
29+
}
30+
ul.breadcrumbs li.home {
31+
vertical-align: top;
32+
}
33+
ul.breadcrumbs li.home img {
34+
height: 14px;
35+
margin-top: 3px;
36+
}
37+
ul.breadcrumbs li:not(.home)::before {
38+
content: "/";
39+
margin: 0 12px;
40+
}
41+
ul.breadcrumbs li a {
42+
color: var(--teal-700);
43+
text-decoration: none;
44+
}
45+
ul.breadcrumbs li:not(.home) a:active,
46+
ul.breadcrumbs li:not(.home) a:focus,
47+
ul.breadcrumbs li:not(.home) a:hover {
48+
text-decoration: underline;
49+
}
50+
@media (min-width: 600px) {
51+
ul.breadcrumbs {
52+
padding-left: var(--offset);
53+
padding-right: var(--offset);
54+
}
55+
ul.breadcrumbs.expand {
56+
margin-left: calc(var(--offset) * -1);
57+
margin-right: calc(var(--offset) * -1);
58+
}
59+
}

src/breadcrumbs.jsx

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import homeIconUrl from "./icons/home.svg";
2+
3+
export default function Breadcrumbs({
4+
expandWidth = false,
5+
homeTitle = "ACCESS Home",
6+
homeUrl = "https://access-ci.org/",
7+
items = [],
8+
topBorder = false,
9+
}) {
10+
if (!items || !items.length) return;
11+
return (
12+
<ul
13+
class={`breadcrumbs ${expandWidth ? "expand" : ""} ${
14+
topBorder ? "top-border" : ""
15+
}`}
16+
>
17+
<li class="home">
18+
<a href={homeUrl} title={homeTitle}>
19+
<img src={homeIconUrl} alt={homeTitle} />
20+
</a>
21+
</li>
22+
{items.map((item) => (
23+
<li class={item.classes || ""}>
24+
{item.href ? <a href={item.href}>{item.name}</a> : item.name}
25+
</li>
26+
))}
27+
</ul>
28+
);
29+
}

src/header.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
}
66
@media (min-width: 900px) {
77
.container {
8-
height: 146px;
8+
height: 144px;
99
padding-top: 52px;
1010
}
1111
}

src/icons/home.svg

Lines changed: 1 addition & 0 deletions
Loading

src/index.jsx

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import Breadcrumbs from "./breadcrumbs";
2+
import breadcrumbsStyle from "./breadcrumbs.css?inline";
13
import { Footer } from "./footer";
24
import { Header } from "./header";
35
import { FooterMenus, Menus } from "./menu";
@@ -6,6 +8,16 @@ import { ResourceCatalog } from "./resource-catalog";
68
import { TableOfContents } from "./table-of-contents";
79
import { renderShadow } from "./utils";
810

11+
const breadcrumbs = (params = {}) => {
12+
renderShadow(
13+
<>
14+
<Breadcrumbs {...params} />
15+
<style>{breadcrumbsStyle}</style>
16+
</>,
17+
params.target
18+
);
19+
};
20+
921
const footer = (params = {}) => {
1022
renderShadow(<Footer {...params} />, params.target);
1123
};
@@ -81,6 +93,7 @@ const resourceCatalog = ({ baseUri, showTitle, target, title }) =>
8193
);
8294

8395
export {
96+
breadcrumbs,
8497
footer,
8598
header,
8699
footerMenus,

src/resource-catalog.css

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
@import url("./accordion.css");
99
@import url("./alert.css");
10+
@import url("./breadcrumbs.css");
1011
@import url("./carousel.css");
1112
@import url("./components.css");
1213
@import url("./donut-chart.css");

src/resource-catalog.jsx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ const ResourceHome = lazy(() => import("./resource-home.jsx"));
77
export function ResourceCatalog({
88
title = "Resources",
99
showTitle = true,
10-
baseUri = "/access-ci-ui",
10+
baseUri = "/resources",
1111
}) {
1212
return (
1313
<>
@@ -20,7 +20,10 @@ export function ResourceCatalog({
2020
title={title}
2121
showTitle={showTitle}
2222
/>
23-
<ResourceGroupDetail path={`${baseUri}/:infoGroupId`} />
23+
<ResourceGroupDetail
24+
path={`${baseUri}/:infoGroupId`}
25+
baseUri={baseUri}
26+
/>
2427
</Router>
2528
</ErrorBoundary>
2629
</LocationProvider>

src/resource-group-detail.jsx

Lines changed: 33 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import Breadcrumbs from "./breadcrumbs";
12
import ResourceGroupAffinityGroup from "./resource-group-affinity-group";
23
import ResourceGroupDescription from "./resource-group-description";
34
import ResourceGroupDiscussion from "./resource-group-discussion";
@@ -8,20 +9,39 @@ import ResourceGroupProjects from "./resource-group-projects";
89
import ResourceGroupQueueMetrics from "./resource-group-queue-metrics";
910
import ResourceGroupSoftware from "./resource-group-software";
1011
import SectionNavigation from "./section-navigation";
12+
import { useResourceGroup } from "./utils";
13+
14+
export default function ResourceGroupDetail({
15+
baseUri,
16+
infoGroupId,
17+
showBreadcrumbs = true,
18+
}) {
19+
const resourceGroup = useResourceGroup(infoGroupId);
20+
21+
const breadcrumbItems = [{ name: "Resources", href: baseUri }];
22+
if (resourceGroup) breadcrumbItems.push({ name: resourceGroup.name });
1123

12-
export default function ResourceGroupDetail({ infoGroupId }) {
1324
return (
14-
<div class="resource-group-detail">
15-
<ResourceGroupDescription infoGroupId={infoGroupId} />
16-
<SectionNavigation />
17-
<ResourceGroupHardware infoGroupId={infoGroupId} />
18-
<ResourceGroupDocumentation infoGroupId={infoGroupId} />
19-
<ResourceGroupEvents infoGroupId={infoGroupId} />
20-
<ResourceGroupAffinityGroup infoGroupId={infoGroupId} />
21-
<ResourceGroupSoftware infoGroupId={infoGroupId} />
22-
<ResourceGroupProjects infoGroupId={infoGroupId} />
23-
<ResourceGroupQueueMetrics infoGroupId={infoGroupId} />
24-
<ResourceGroupDiscussion infoGroupId={infoGroupId} />
25-
</div>
25+
<>
26+
{showBreadcrumbs && (
27+
<Breadcrumbs
28+
expandWidth={true}
29+
items={breadcrumbItems}
30+
topBorder={true}
31+
/>
32+
)}
33+
<div class="resource-group-detail">
34+
<ResourceGroupDescription infoGroupId={infoGroupId} />
35+
<SectionNavigation />
36+
<ResourceGroupHardware infoGroupId={infoGroupId} />
37+
<ResourceGroupDocumentation infoGroupId={infoGroupId} />
38+
<ResourceGroupEvents infoGroupId={infoGroupId} />
39+
<ResourceGroupAffinityGroup infoGroupId={infoGroupId} />
40+
<ResourceGroupSoftware infoGroupId={infoGroupId} />
41+
<ResourceGroupProjects infoGroupId={infoGroupId} />
42+
<ResourceGroupQueueMetrics infoGroupId={infoGroupId} />
43+
<ResourceGroupDiscussion infoGroupId={infoGroupId} />
44+
</div>
45+
</>
2646
);
2747
}

0 commit comments

Comments
 (0)