@hackoregon/component-library
Version:
Official repo for Hack Oregon React component library
165 lines (156 loc) • 5.13 kB
JavaScript
/** @jsx jsx */
import { jsx, css } from "@emotion/core";
import { Fragment } from "react";
import PropTypes from "prop-types";
import _ from "lodash";
import { generate } from "shortid";
import PullQuote from "../PullQuote/PullQuote";
import Placeholder from "../Placeholder/Placeholder";
import cardMetaTypes from "./cardMetaTypes";
import {
Chip,
Resource,
MetadataQuestion,
CollapsableSection
} from "./LayoutComponents";
const sectionMarginSmall = css`
display: block;
margin: 12px auto;
`;
const sectionMaxWidthSmall = css`
max-width: 700px;
`;
const sectionMarginMedium = css`
display: block;
margin: 64px auto;
`;
const sectionMaxWidthMedium = css`
max-width: 900px;
`;
const authorPhoto = css`
width: 50%;
filter: grayscale(100%);
cursor: pointer;
`;
function CivicCardLayoutFull({ isLoading, data, cardMeta }) {
return (
<Fragment>
<article>
<div css={[sectionMarginSmall, sectionMaxWidthSmall]}>
<header>
<h1 id="title">{cardMeta.title}</h1>
</header>
<hr />
<section id="tags">
{cardMeta.tags.map((tag, index) => (
<Chip tag={tag} index={index} key={generate()} />
))}
</section>
<hr />
</div>
<section>
<div css={[sectionMarginSmall, sectionMaxWidthSmall]}>
<div id="introText">{cardMeta.introText}</div>
</div>
<div
id="visualization"
css={[sectionMarginMedium, sectionMaxWidthMedium]}
>
{cardMeta.selector}
<cardMeta.visualization isLoading={isLoading} data={data} />
</div>
<div css={[sectionMarginSmall, sectionMaxWidthSmall]}>
<div id="shareText">
<PullQuote quoteText={cardMeta.shareText} />
</div>
<div id="additionalText">{cardMeta.additionalText}</div>
</div>
</section>
<hr css={[sectionMarginSmall, sectionMaxWidthSmall]} />
<section css={[sectionMarginSmall, sectionMaxWidthSmall]}>
<div id="analysis">
<h2>About this analysis</h2>
{cardMeta.analysis}
</div>
</section>
<hr css={[sectionMarginSmall, sectionMaxWidthSmall]} />
<section css={[sectionMarginSmall, sectionMaxWidthSmall]} id="metadata">
<h2>About this data</h2>
{cardMeta.metadata}
{_.has(cardMeta, "metadataQA") && (
<CollapsableSection
items={cardMeta.metadataQA.map(item => (
<MetadataQuestion item={item} key={generate()} />
))}
collapseAfter={5}
/>
)}
</section>
<hr css={[sectionMarginSmall, sectionMaxWidthSmall]} />
<section
css={[sectionMarginSmall, sectionMaxWidthSmall]}
id="resources"
>
<h2>Links and resources</h2>
<p>
Interested in learning more? The following links and resources are
useful in gaining a greater understanding of the context of this
data visualization.
</p>
<CollapsableSection
items={cardMeta.resources.map(item => (
<Resource item={item} key={generate()} />
))}
collapseAfter={7}
/>
</section>
<hr css={[sectionMarginSmall, sectionMaxWidthSmall]} />
<section css={[sectionMarginSmall, sectionMaxWidthSmall]} id="authors">
<h2>Who made this?</h2>
{cardMeta.authors.map(photo => (
<img
css={authorPhoto}
src={photo}
alt="Pictures of people who worked on this"
key={generate()}
/>
))}
</section>
<hr css={[sectionMarginSmall, sectionMaxWidthSmall]} />
<section css={[sectionMarginSmall, sectionMaxWidthSmall]} id="improve">
<h2>Help make this better</h2>
<p>
CIVIC is an open platform, so you can help make this better! Whether
you noticed a typo, want to suggest an improvement for our data
visualization, or have context to add about the dataset, we want you
to contribute.
</p>
<ul>
<li>
<a href="https://civicsoftwarefoundation.org/#volunteers">
Get Started!
</a>
</li>
</ul>
</section>
</article>
<hr css={[sectionMarginSmall, sectionMaxWidthSmall]} />
<section css={[sectionMarginSmall, sectionMaxWidthSmall]} id="explore">
<h2>Explore related data</h2>
<Placeholder>
<h3>
<a href="https://civicsoftwarefoundation.org/#cities">
See your data here!
</a>
</h3>
</Placeholder>
</section>
</Fragment>
);
}
CivicCardLayoutFull.propTypes = {
isLoading: PropTypes.bool,
data: PropTypes.oneOfType([PropTypes.shape({}), PropTypes.array]),
cardMeta: cardMetaTypes
};
export default CivicCardLayoutFull;