@legendarymediatv/bootstrap
Version:
additional Bootstrap-based React components for extending functionality to react-bootstrap and gatsby
560 lines (471 loc) • 15.1 kB
JavaScript
// dependencies
import React from "react";
// components
import Button from "react-bootstrap/Button";
import Col from "react-bootstrap/Col";
import Form from "react-bootstrap/Form";
import Layout from "../components/Layout";
import Nav from "react-bootstrap/Nav";
import Row from "react-bootstrap/Row";
// LegendaryMediaTV functions
import { formData } from "../../functions";
// LegendaryMediaTV components
import Alert from "../../Alert";
import BackgroundImage from "../../BackgroundImage";
import Blockquote from "../../Blockquote";
import Breakpoint from "../../Breakpoint";
import DatePicker from "../../DatePicker";
import Display from "../../Display";
import Feature from "../../Feature";
import Flipper from "../../Flipper";
import FormGroup from "../../FormGroup";
import InfoIcon from "../../InfoIcon";
import Icon from "../../Icon";
import Link from "../../Link";
import ListGroup from "../../ListGroup";
import Pagination from "../../Pagination";
import ScrollToTop from "../../ScrollToTop";
import { scrollToTopHandler } from "../../ScrollToTop";
import Spinner from "../../Spinner";
export default class HomePage extends React.Component {
state = { flipped: false, date: null };
flipHandler = (event) => {
event.preventDefault();
this.setState({ flipped: !this.state.flipped });
};
dateHandler = (selected) => {
this.setState({ date: selected });
};
render = () => {
const linkArray = ["/demo", "/full-page"];
const linkObjects = [
{ title: "Test Link", url: "/" },
{
title: "Sample Link",
subtitle: "additional information in a subtitle",
url: "/demo",
},
];
const objectArray = [
{ id: 1, title: "Test Non-Link" },
{ id: 2, title: "Sample Non-Link" },
];
const submitHandler = (event) => {
// don't traditionally submit the form
event.preventDefault();
// extract the data from the form
const data = formData(event.target);
// display the form data object
alert(JSON.stringify(data, null, 4));
};
const sampleHandler = (itemSelected) => {
alert(JSON.stringify(itemSelected, null, 4));
};
return (
<Layout title="Bootstrap Components">
<Nav as="ul" variant="pills" className="mb-2">
<Nav.Item as="li">
<Nav.Link as={Link} to="/" active>
Home
</Nav.Link>
</Nav.Item>
<Nav.Item as="li">
<Nav.Link as={Link} to="/demo">
Demo
</Nav.Link>
</Nav.Item>
<Nav.Item as="li">
<Nav.Link as={Link} to="/full-page">
Full Page
</Nav.Link>
</Nav.Item>
</Nav>
<BackgroundImage
src="https://m.media-amazon.com/images/M/MV5BN2I5NGEyMTYtYTNjMC00YTBhLWE1NjYtYWNhM2I2ODMyZTEzXkEyXkFqcGdeQXVyNzgxMzc3OTc@._V1_SY1000_CR0,0,1671,1000_AL_.jpg"
imageStyle={{ opacity: 0.25 }}
/>
<Display.Heading2>
<code><Alert></code>
</Display.Heading2>
<Alert
title="Alert Title"
subtitle="Alert subtitle"
variant="info"
onClose={() => {
alert("Insert dismiss logic here");
}}
dismissible
>
Some text with a <Alert.Link to="/full-page">link</Alert.Link>
</Alert>
<Alert
title="Intermittent Error"
error={
<>
Something went <em>wrong</em>
</>
}
onRetry={() => {
alert("Insert retry logic here");
}}
variant="warning"
/>
<Alert
error={{
error: "Request failed with status code 401",
url: "/",
method: "GET",
}}
/>
<Alert error={["Field 1 is required", "Field 2 is required"]} />
<Display.Heading2>
<code><Blockquote></code>
</Display.Heading2>
<Blockquote>
<p className="mb-0">
A well-known quote, contained in a blockquote element.
</p>
</Blockquote>
<Blockquote>
<p>
Success, meaningful success, begins when we take ownership and
actively take responsibility for our part in the shortcomings of our
life.
</p>
<Blockquote.Footer>
Dr Eric Thomas,{" "}
<cite>Greatness Is Upon You: Laying the Foundation</cite>
</Blockquote.Footer>
</Blockquote>
<Display.Heading2>
<code><Breakpoint></code>
</Display.Heading2>
<Breakpoint />
<Display.Heading2>
<code><DatePicker></code>
</Display.Heading2>
<DatePicker
title="My Date"
value={this.state.date}
onChange={this.dateHandler}
/>
<Display.Heading2>
<code><Display></code>
</Display.Heading2>
<Display.Heading1>Display Heading 1</Display.Heading1>
<Display.Heading2>Display Heading 2</Display.Heading2>
<Display.Heading3>Display Heading 3</Display.Heading3>
<Display.Heading4>Display Heading 4</Display.Heading4>
<Display.Heading5>Display Heading 5</Display.Heading5>
<Display.Heading6>Display Heading 6</Display.Heading6>
<Display.Heading2>
<code><Feature></code>
</Display.Heading2>
<Feature
title="Featured Content"
subtitle="content to be featured"
to="#"
variant="info"
textShadow
className="text-white py-5"
/>
<Row className="text-white mt-3">
<Col sm className="p-0">
<Feature title="Tile 1" to="#" variant="dark" className="py-3" />
</Col>
<Col sm className="p-0">
<Feature title="Tile 2" to="#" variant="success" className="py-3" />
</Col>
<Col sm className="p-0">
<Feature
title="Tile 3"
onClick={() => {
alert("danger!");
}}
variant="danger"
className="py-3"
/>
</Col>
</Row>
<Display.Heading2>
<code><Flipper></code>
</Display.Heading2>
<Flipper
front={<h3>auto-flipper front content</h3>}
frontClassName="bg-primary text-light p-2"
back={<h3>auto-flipper back content</h3>}
backClassName="bg-secondary text-light p-2"
/>
<Flipper
front={
<Button onClick={this.flipHandler.bind(this)} className="w-100">
click to flip to the back
</Button>
}
frontClassName="d-flex align-items-stretch"
back={
<Button
onClick={this.flipHandler.bind(this)}
variant="secondary"
className="w-100"
>
click to flip to the front
</Button>
}
backClassName="d-flex align-items-stretch"
className="mt-3 text-center"
height="10rem"
flipped={this.state.flipped}
horizontal
/>
<Display.Heading2>
<code><FormGroup></code>
</Display.Heading2>
<Form onSubmit={submitHandler}>
<FormGroup title="Simple textbox">
<Form.Control name="sample" />
</FormGroup>
<FormGroup
title="Kitchen sink"
info={
<p>
Things, <i>stuff</i>, <b>content</b>!
</p>
}
>
<Form.Control
name="sample"
maxLength="80"
defaultValue="eleventeen"
/>
</FormGroup>
<div>
<label>
<input name="agree" type="checkbox" /> agree?
</label>
</div>
<div>
<label>
{" "}
<input name="option" type="radio" value="a" /> A
</label>
,{" "}
<label>
{" "}
<input name="option" type="radio" value="b" /> B
</label>
,{" "}
<label>
{" "}
<input name="option" type="radio" value="c" /> C
</label>
</div>
<Button type="submit">Submit</Button>
</Form>
<Display.Heading2>
<code><Icon></code>
</Display.Heading2>
<Icon name="fa-solid fa-camera" />
<Icon name="bi bi-info-circle-fill" className="ms-2" />
<Icon
name="fa-solid fa-camera"
alt="DSLR"
variant="success"
className="ms-2"
style={{ fontSize: "2rem" }}
/>
<Display.Heading2>
<code><InfoIcon></code>
</Display.Heading2>
<InfoIcon title="Info Title">Info Content</InfoIcon>
<InfoIcon title="Title Only"></InfoIcon>
<InfoIcon>Content Only</InfoIcon>
<InfoIcon
title={
<>
JSX <i>Title</i>
</>
}
name="bi bi-info-circle-fill"
alt="help me!"
variant="danger"
iconStyle={{ fontSize: "2rem" }}
>
Things, <i>stuff</i>, <b>content</b>!
</InfoIcon>
<Display.Heading2 id="link">
<code><Link></code>
</Display.Heading2>
<ul>
<li>
Internal: <Link href="/">Gatsby</Link>
</li>
<li>
Anchor: <Link href="#link">HTML</Link>
</li>
<li>
Mail: <Link href="mailto:webmaster@legendarymediatv.com">HTML</Link>
</li>
<li>
De-External:{" "}
<Link href="http://localhost:8000" external="false">
HTML
</Link>
</li>
<li>
Auto External:{" "}
<Link href="https://www.legendarymediatv.com">HTML</Link>
</li>
<li>
Explicit External:{" "}
<Link
href="/external-somehow"
externalIcon="bi bi-box-arrow-up-right"
externalVariant="danger"
>
HTML
</Link>
</li>
<li>
Internal with newTab:{" "}
<Link href="/" newTab>
Gatsby
</Link>
</li>
<li>
External New Tab:{" "}
<Link href="https://www.legendarymediatv.com" externalNewTab>
HTML
</Link>
</li>
</ul>
<Display.Heading2>
<code><ListGroup></code>
</Display.Heading2>
<ListGroup title="Array of Links" items={linkArray} />
<ListGroup
title="Array of Objects with Links"
items={linkObjects}
className="mt-3"
/>
<ListGroup
title="Array of Objects with Click Handler"
titleVariant="success"
items={objectArray}
click={sampleHandler}
className="mt-3"
/>
<ListGroup title="Custom Items" titleVariant="info" className="mt-3">
<ListGroup.Item subitem="sample sub-item">
ListGroup.Item with a sub-item below
</ListGroup.Item>
<ListGroup.Item to="/demo">
ListGroup.Item auto-converted to a link/action
</ListGroup.Item>
<ListGroup.Item
onClick={() => {
alert("clicked");
}}
>
ListGroup.Item auto-converted to a button
</ListGroup.Item>
<ListGroup.Item
to="#list-group"
subactions={[
{
to: "/demo",
variant: "info",
children: <Icon name="fa-solid fa-camera" />,
},
{
onClick: () => {
alert("deleted!");
},
variant: "danger",
children: <Icon name="fa-solid fa-trash-can" />,
},
]}
>
ListGroup.Item with a URL and sub-actions
</ListGroup.Item>
</ListGroup>
<Display.Heading2>
<code><Pagination></code>
</Display.Heading2>
{["sm", "", "lg"].map((size) => (
<Pagination
className={size !== "sm" ? "d-none d-lg-flex" : ""}
size={size}
key={size}
>
<Pagination.First
onClick={() => {
alert("first");
}}
/>
<Pagination.Prev to="#" />
<Pagination.Item to="#">{1}</Pagination.Item>
<Pagination.Ellipsis />
<Pagination.Item to="#">{10}</Pagination.Item>
<Pagination.Item to="#">{11}</Pagination.Item>
<Pagination.Item to="#" active>
{12}
</Pagination.Item>
<Pagination.Item to="#">{13}</Pagination.Item>
<Pagination.Item to="#" disabled>
{14}
</Pagination.Item>
<Pagination.Ellipsis to="#" />
<Pagination.Item to="#">{20}</Pagination.Item>
<Pagination.Next to="#" />
<Pagination.Last
onClick={() => {
alert("last");
}}
/>
</Pagination>
))}
<Pagination size="sm">
<Pagination.First>
<Icon name="fa-solid fa-angles-left" alt="first" />
</Pagination.First>
<Pagination.Prev>
<Icon name="fa-solid fa-angle-left" alt="previous" />
</Pagination.Prev>
<Pagination.Ellipsis>
<Icon name="fa-solid fa-ellipsis" alt="more" />
</Pagination.Ellipsis>
<Pagination.Next>
<Icon name="fa-solid fa-angle-right" alt="next" />
</Pagination.Next>
<Pagination.Last>
<Icon name="fa-solid fa-angles-right" alt="last" />
</Pagination.Last>
</Pagination>
<Display.Heading2>
<code><Spinner></code>
</Display.Heading2>
<div>
<Spinner />
<Spinner animation="grow" variant="success" className="small" />
</div>
<Spinner alert className="my-3" />
<Spinner
title="Reticulating splines …"
variant="secondary"
className="my-3"
/>
<Display.Heading2>
<code>scrollToTopHandler()</code>
</Display.Heading2>
<Button onClick={scrollToTopHandler}>Scroll to Top</Button>
<div className="mt-1">
<Link to="#" onClick={scrollToTopHandler}>
scroll to top
</Link>
</div>
<ScrollToTop name="fa-solid fa-square-caret-up" variant="success" />
</Layout>
);
};
}