blob: 4194940178259e2d3d6eff15119716773939bdec [file]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import React from "react";
import Link from "@docusaurus/Link";
import CodeBlock from "@theme/CodeBlock";
import IconExternalLink from "@theme/Icon/ExternalLink";
import CodeWindow, {
CodeWindowBody,
CodeWindowTitleLink,
} from "../ui/CodeWindow";
import IconAction from "../ui/IconAction";
import styles from "./explorer.module.css";
function ChoiceItem({
item,
selected,
previewId,
variant,
onSelect,
getTitle,
getDescription,
getDoc,
}) {
const title = getTitle(item);
const description = getDescription(item);
const doc = getDoc(item);
const isTile = variant === "tiles";
return (
<li className={styles.choiceShell}>
<button
type="button"
className={[
isTile ? styles.tileButton : styles.choiceButton,
selected
? isTile
? styles.tileButtonActive
: styles.choiceButtonActive
: "",
]
.filter(Boolean)
.join(" ")}
aria-pressed={selected}
aria-controls={previewId}
onClick={() => onSelect(item)}
>
{isTile ? (
<>
<span className={styles.tileName}>{title}</span>
<span className={styles.tileDesc}>{description}</span>
</>
) : (
<span className={styles.choiceText}>
<span className={styles.choiceTitle}>{title}</span>
<span className={styles.choiceBlurb}>{description}</span>
</span>
)}
</button>
<IconAction
as={Link}
size="md"
className={styles.docAction}
to={doc}
target="_blank"
rel="noreferrer"
aria-label={`${title} documentation`}
>
<IconExternalLink />
</IconAction>
</li>
);
}
export default function ExplorerSection({
id,
items,
activeItem,
onSelect,
getKey,
getTitle,
getDescription,
getDoc,
getCode,
variant = "list",
}) {
const title = getTitle(activeItem);
const doc = getDoc(activeItem);
const isTiles = variant === "tiles";
return (
<div
className={[
styles.explorer,
isTiles ? styles.explorerEven : styles.explorerWidePreview,
]
.filter(Boolean)
.join(" ")}
>
<ul className={isTiles ? styles.tileGrid : styles.choiceNav}>
{items.map((item) => {
const key = getKey(item);
return (
<ChoiceItem
key={key}
item={item}
selected={key === getKey(activeItem)}
previewId={id}
variant={variant}
onSelect={onSelect}
getTitle={getTitle}
getDescription={getDescription}
getDoc={getDoc}
/>
);
})}
</ul>
<div className={styles.previewPane} id={id}>
<CodeWindow
title={
<CodeWindowTitleLink
to={doc}
target="_blank"
rel="noreferrer"
aria-label={`${title} documentation`}
>
{title}
</CodeWindowTitleLink>
}
>
<CodeWindowBody
className={[
styles.previewCodeBody,
isTiles ? styles.tilePreviewCodeBody : styles.listPreviewCodeBody,
]
.filter(Boolean)
.join(" ")}
>
<div className={styles.previewCodeFade} key={getKey(activeItem)}>
<CodeBlock language="rust">{getCode(activeItem)}</CodeBlock>
</div>
</CodeWindowBody>
</CodeWindow>
</div>
</div>
);
}