aboutsummaryrefslogtreecommitdiff
path: root/docs/src
diff options
context:
space:
mode:
Diffstat (limited to 'docs/src')
-rw-r--r--docs/src/components/HomepageFeatures/index.tsx72
-rw-r--r--docs/src/components/HomepageFeatures/styles.module.css11
-rw-r--r--docs/src/css/custom.css69
-rw-r--r--docs/src/pages/index.module.css23
-rw-r--r--docs/src/pages/index.tsx43
5 files changed, 218 insertions, 0 deletions
diff --git a/docs/src/components/HomepageFeatures/index.tsx b/docs/src/components/HomepageFeatures/index.tsx
new file mode 100644
index 0000000..645f795
--- /dev/null
+++ b/docs/src/components/HomepageFeatures/index.tsx
@@ -0,0 +1,72 @@
+import type { ReactNode } from "react";
+import clsx from "clsx";
+import Heading from "@theme/Heading";
+import styles from "./styles.module.css";
+
+type FeatureItem = {
+ title: string;
+ Svg: React.ComponentType<React.ComponentProps<"svg">>;
+ description: ReactNode;
+};
+
+const FeatureList: FeatureItem[] = [
+ {
+ title: "Easy to Use",
+ Svg: require("@site/static/img/undraw_docusaurus_mountain.svg").default,
+ description: (
+ <>
+ Anubis is easy to set up, lightweight, and helps get rid of the lowest
+ hanging fruit so you can sleep at night.
+ </>
+ ),
+ },
+ {
+ title: "",
+ Svg: require("@site/static/img/undraw_docusaurus_tree.svg").default,
+ description: (
+ <>
+ Anubis is efficient and as lightweight as possible, blocking the worst
+ of the bots on the internet and makes it easy to protect what you host
+ online.
+ </>
+ ),
+ },
+ {
+ title: "Powered by React",
+ Svg: require("@site/static/img/undraw_docusaurus_react.svg").default,
+ description: (
+ <>
+ Anubis uses a multi-threaded proof of work check to ensure that users
+ browsers are up to date and support modern standards.
+ </>
+ ),
+ },
+];
+
+function Feature({ title, Svg, description }: FeatureItem) {
+ return (
+ <div className={clsx("col col--4")}>
+ <div className="text--center">
+ <Svg className={styles.featureSvg} role="img" />
+ </div>
+ <div className="text--center padding-horiz--md">
+ <Heading as="h3">{title}</Heading>
+ <p>{description}</p>
+ </div>
+ </div>
+ );
+}
+
+export default function HomepageFeatures(): ReactNode {
+ return (
+ <section className={styles.features}>
+ <div className="container">
+ <div className="row">
+ {FeatureList.map((props, idx) => (
+ <Feature key={idx} {...props} />
+ ))}
+ </div>
+ </div>
+ </section>
+ );
+}
diff --git a/docs/src/components/HomepageFeatures/styles.module.css b/docs/src/components/HomepageFeatures/styles.module.css
new file mode 100644
index 0000000..b248eb2
--- /dev/null
+++ b/docs/src/components/HomepageFeatures/styles.module.css
@@ -0,0 +1,11 @@
+.features {
+ display: flex;
+ align-items: center;
+ padding: 2rem 0;
+ width: 100%;
+}
+
+.featureSvg {
+ height: 200px;
+ width: 200px;
+}
diff --git a/docs/src/css/custom.css b/docs/src/css/custom.css
new file mode 100644
index 0000000..84b09b1
--- /dev/null
+++ b/docs/src/css/custom.css
@@ -0,0 +1,69 @@
+/**
+ * Any CSS included here will be global. The classic template
+ * bundles Infima by default. Infima is a CSS framework designed to
+ * work well for content-centric websites.
+ */
+
+/* You can override the default Infima variables here. */
+:root {
+ --ifm-color-primary: #2e8555;
+ --ifm-color-primary-dark: #29784c;
+ --ifm-color-primary-darker: #277148;
+ --ifm-color-primary-darkest: #205d3b;
+ --ifm-color-primary-light: #33925d;
+ --ifm-color-primary-lighter: #359962;
+ --ifm-color-primary-lightest: #3cad6e;
+ --ifm-code-font-size: 95%;
+ --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1);
+}
+
+/* For readability concerns, you should choose a lighter palette in dark mode. */
+[data-theme="dark"] {
+ --ifm-color-primary: #25c2a0;
+ --ifm-color-primary-dark: #21af90;
+ --ifm-color-primary-darker: #1fa588;
+ --ifm-color-primary-darkest: #1a8870;
+ --ifm-color-primary-light: #29d5b0;
+ --ifm-color-primary-lighter: #32d8b4;
+ --ifm-color-primary-lightest: #4fddbf;
+ --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3);
+}
+
+.code-block-diff-add-line {
+ background-color: #ccffd8;
+ display: block;
+ margin: 0 -40px;
+ padding: 0 40px;
+}
+
+.code-block-diff-add-line::before {
+ position: absolute;
+ left: 8px;
+ padding-right: 8px;
+ content: "+";
+}
+
+.code-block-diff-remove-line {
+ background-color: #ffebe9;
+ display: block;
+ margin: 0 -40px;
+ padding: 0 40px;
+}
+
+.code-block-diff-remove-line::before {
+ position: absolute;
+ left: 8px;
+ padding-right: 8px;
+ content: "-";
+}
+
+/**
+ * use magic comments to mark diff blocks
+ */
+pre code:has(.code-block-diff-add-line) {
+ padding-left: 40px !important;
+}
+
+pre code:has(.code-block-diff-remove-line) {
+ padding-left: 40px !important;
+}
diff --git a/docs/src/pages/index.module.css b/docs/src/pages/index.module.css
new file mode 100644
index 0000000..9f71a5d
--- /dev/null
+++ b/docs/src/pages/index.module.css
@@ -0,0 +1,23 @@
+/**
+ * CSS files with the .module.css suffix will be treated as CSS modules
+ * and scoped locally.
+ */
+
+.heroBanner {
+ padding: 4rem 0;
+ text-align: center;
+ position: relative;
+ overflow: hidden;
+}
+
+@media screen and (max-width: 996px) {
+ .heroBanner {
+ padding: 2rem;
+ }
+}
+
+.buttons {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
diff --git a/docs/src/pages/index.tsx b/docs/src/pages/index.tsx
new file mode 100644
index 0000000..c9bcfc1
--- /dev/null
+++ b/docs/src/pages/index.tsx
@@ -0,0 +1,43 @@
+import type { ReactNode } from "react";
+import clsx from "clsx";
+import Link from "@docusaurus/Link";
+import useDocusaurusContext from "@docusaurus/useDocusaurusContext";
+import Layout from "@theme/Layout";
+import HomepageFeatures from "@site/src/components/HomepageFeatures";
+import Heading from "@theme/Heading";
+
+import styles from "./index.module.css";
+
+function HomepageHeader() {
+ const { siteConfig } = useDocusaurusContext();
+ return (
+ <header className={clsx("hero hero--primary", styles.heroBanner)}>
+ <div className="container">
+ <Heading as="h1" className="hero__title">
+ {siteConfig.title}
+ </Heading>
+ <p className="hero__subtitle">{siteConfig.tagline}</p>
+ <div className={styles.buttons}>
+ <Link className="button button--secondary button--lg" to="/docs/">
+ Get started
+ </Link>
+ </div>
+ </div>
+ </header>
+ );
+}
+
+export default function Home(): ReactNode {
+ const { siteConfig } = useDocusaurusContext();
+ return (
+ <Layout
+ title={`Anubis: self hostable scraper defense software`}
+ description="Weigh the soul of incoming HTTP requests using proof-of-work to stop AI crawlers"
+ >
+ <HomepageHeader />
+ <main>
+ <HomepageFeatures />
+ </main>
+ </Layout>
+ );
+}