blob: 4edbfa5af63a4d0f71fdb80afa459a1b08d19c0e [file] [log] [blame]
const React = require("react");
import Link from "@docusaurus/Link";
import useDocusaurusContext from "@docusaurus/useDocusaurusContext";
import useBaseUrl from "@docusaurus/useBaseUrl";
import Layout from "@theme/Layout";
import GitHubLogo from "../assets/icons/github-logo.svg";
import { useState, useEffect } from "react";
import { CSSTransition } from "react-transition-group";
import ChevronRight from "../assets/icons/chevron-right.svg";
const HomeSplash = () => {
const [featureWordIndex, setFeatureWordIndex] = useState(0);
const featureWords = ["Dynamic", "Real-Time", "Performant"];
const [isShow, setIsShow] = useState(true);
const changeFeatureWordIndex = (index) => {
setIsShow(false);
setFeatureWordIndex(index);
setIsShow(true);
};
useEffect(() => {
const timer = setInterval(() => {
if (featureWordIndex >= featureWords.length - 1) {
changeFeatureWordIndex(0);
} else {
changeFeatureWordIndex(featureWordIndex + 1);
}
}, 3600);
return () => clearInterval(timer);
}, [featureWordIndex]);
return (
<div className="hero home-splash">
<div className="container">
<div className="inner">
<div className="padding-vert--md">
<h1 className="title slogan">
A&nbsp;
<span className="feature-word">
<CSSTransition
in={isShow}
timeout={2000}
classNames="feature-word-text"
appear={true}
>
<span>{featureWords[featureWordIndex]}</span>
</CSSTransition>
</span>
<span className="hide-on-mobile">&nbsp;</span>Cloud-Native API
Gateway
</h1>
<div className="subtitle">
Provides rich traffic management features such as load balancing,
dynamic upstream, canary release, circuit breaking,
authentication, observability, and more. Based on the Nginx
library and etcd.
</div>
</div>
<div className="pluginWrapper button-wrapper">
<Link
to="https://github.com/apache/apisix"
className="button button--outline button--primary github"
>
<GitHubLogo className="github-logo" />
View on GitHub
</Link>
<Link
to={useBaseUrl("downloads")}
className="button button--outline button--primary secondary"
>
Downloads
</Link>
</div>
</div>
</div>
</div>
);
};
const LearnHow = () => (
<div className="hero">
<div className="learn-how">
<div className="container">
<div className="row">
<div className="col col--7">
<p className="hero__title">
<small>Description</small>
</p>
<p className="hero__subtitle">
<small>
Cloud-native microservices API gateway, delivering the ultimate
performance, security, open source and scalable platform for all
your APIs and microservices. Apache APISIX is based on Nginx and
etcd. Compared with traditional API gateways, APISIX has dynamic
routing and plug-in hot loading, which is especially suitable
for API management under micro-service system.
</small>
</p>
</div>
<div className="col">
<img
className="image"
src="https://user-images.githubusercontent.com/40708551/114740649-a9bf2200-9d67-11eb-8e1d-1409fb5c18c2.png"
align="right"
alt="apisix-description"
/>
</div>
</div>
</div>
</div>
</div>
);
const Showcase = () => {
const { siteConfig } = useDocusaurusContext();
if (!(siteConfig.customFields.showcases || []).length) {
return null;
}
const showcases = siteConfig.customFields.showcases.map((user) => (
<a href={user.infoLink} key={user.infoLink} target="_blank">
<img className="user-logo" src={'https://cdn.jsdelivr.net/gh/apache/apisix-website@master/website/static/img/' + user.image} alt={user.caption} />
</a>
));
const middleIndex = (showcases.length / 2).toFixed(0);
return (
<div className="hero text--center showcase">
<div className="container">
<div className="product-showcase-section">
<h1>Who is Using This?</h1>
</div>
<p>
This project is used by all these folks
<br />
Are you using this project?&nbsp;
<a
href="https://github.com/apache/apisix/blob/master/powered-by.md"
target="_blank"
rel="noopener"
>
<u>Add your company</u>
</a>
</p>
<div className="user-logos">
<div className="logo-row">
<span className="user-logos-container">
<section>
<span>{showcases.slice(0, middleIndex)}</span>
<span>{showcases.slice(0, middleIndex)}</span>
</section>
</span>
</div>
<div className="logo-row">
<span className="user-logos-container">
<section>
<span>{showcases.slice(middleIndex, showcases.length)}</span>
<span>{showcases.slice(middleIndex, showcases.length)}</span>
</section>
</span>
</div>
</div>
</div>
</div>
);
};
const EventsSection = () => {
const { siteConfig } = useDocusaurusContext();
const events = (siteConfig.customFields.events || [])
.slice(0, 4)
.map((event) => {
const publishTime = event.fileName.slice(0, 10);
const splittedFileName = event.fileName.split("-");
const url = `/events/${splittedFileName
.slice(0, 3)
.join("/")}/${splittedFileName.slice(3).join("-")}`;
return (
<a className="event-item" key={event.title} href={url} target="_blank">
<div>
<div className="event-title">{event.title}</div>
<div className="event-publish-time">{publishTime}</div>
</div>
<div className="event-read-button">
Read <ChevronRight />
</div>
</a>
);
});
return (
<div className="hero text--center events-section">
<div className="container">
<div>
<h1 className="color-primary">Events</h1>
</div>
<div className="events-view-all-button">
<a href="/events" target="_blank">
<u>View All Events</u>
</a>
</div>
<div className="events-container">{events}</div>
</div>
</div>
);
};
const ContributionSection = () => {
return (
<div className="contribution">
<div className="center-elem contribution-text">
<h2>Make your first contribution to Apache APISIX®</h2>
</div>
<div className="center-elem">
<p>Find a good first issue to get you started !</p>
</div>
<div className="contribution-link">
<Link
to="/docs/general/contributor-guide#good-first-issues"
>
<GitHubLogo className="contribution-logo" />
Good First Issues
</Link>
</div>
</div>
);
};
const NewsletterSection = () => {
return (
<div className="newsletter">
<div className="center-elem news-logo">
<svg className="news-logo-svg" width="185" height="156" viewBox="0 0 185 156" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0 155.5L94 0L185 155.5H140L94 83L42.5 155.5H0Z" fill="#F8423F" />
<path d="M94 82.5L42.5 155H0L76.5 57L94 82.5Z" fill="url(#paint0_linear)" />
<path d="M140 155.5H185L94 0L140 155.5Z" fill="url(#paint1_linear)" />
<defs>
<linearGradient id="paint0_linear" x1="222.5" y1="50" x2="85" y2="223.5" gradientUnits="userSpaceOnUse">
<stop offset="0.536111" stopColor="#FC0A04" />
<stop offset="1" stopColor="#CF0500" stopOpacity="0.77" />
</linearGradient>
<linearGradient id="paint1_linear" x1="139.5" y1="1.50861e-06" x2="226" y2="136" gradientUnits="userSpaceOnUse">
<stop offset="0.473466" stopColor="#E2423E" />
<stop offset="1" stopColor="#E2423E" stopOpacity="0.77" />
</linearGradient>
</defs>
</svg>
</div>
<div className="center-elem news-text">
<h2>Stay up to date about all Apache APISIX® News</h2>
</div>
<div className="center-elem">
<a className="news-button" href="/docs/general/subscribe-guide">Subscribe</a>
</div>
</div>
);
};
const Contributor200Poster = () => {
const [display, setDisplay] = useState(false);
const [theme, setTheme] = useState('light');
useEffect(() => {
addEventListener('click', () => {
setTheme(localStorage.getItem('theme'));
});
if (localStorage.getItem("theme")) {
setTheme(localStorage.getItem('theme'));
};
if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
setTheme('dark');
}
if (!localStorage.getItem('SHOW_200_CONTRIBUTOR_EVENT_ENTRY')) {
setDisplay(true);
};
}, []);
const onClose = () => {
setDisplay(false);
if (typeof window !== 'undefined') {
localStorage.setItem('SHOW_200_CONTRIBUTOR_EVENT_ENTRY', 'true');
}
};
if (!display) {
return null;
}
return (
<div className="pic-wrapper">
<button className="pic-wrapper-close" onClick={onClose}>
<svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="times" className="svg-inline--fa fa-times fa-w-11" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 352 512">
<path fill="currentColor" d="M242.72 256l100.07-100.07c12.28-12.28 12.28-32.19 0-44.48l-22.24-22.24c-12.28-12.28-32.19-12.28-44.48 0L176 189.28 75.93 89.21c-12.28-12.28-32.19-12.28-44.48 0L9.21 111.45c-12.28 12.28-12.28 32.19 0 44.48L109.28 256 9.21 356.07c-12.28 12.28-12.28 32.19 0 44.48l22.24 22.24c12.28 12.28 32.2 12.28 44.48 0L176 322.72l100.07 100.07c12.28 12.28 32.2 12.28 44.48 0l22.24-22.24c12.28-12.28 12.28-32.19 0-44.48L242.72 256z"></path>
</svg>
</button>
<a href="/blog/2021/07/06/celebrate-200-contributors" onClick={onClose}>
{theme === "light" && <img src="/img/200_mark_light.jpg" alt="" />}
{theme === "dark" && <img src="/img/200_mark_dark.jpg" alt="" />}
</a>
</div>
)
}
const Index = (props) => {
return (
<Layout>
<HomeSplash />
<LearnHow />
<EventsSection />
<Showcase />
<ContributionSection />
<NewsletterSection />
<Contributor200Poster />
</Layout>
);
};
export default Index;