diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000000000000000000000000000000000000..a21b737af27b1f5fc38d1c40efd91e5871df796d --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "legal"] + path = legal + url = https://gitlab.insrt.uk/revolt/legal diff --git a/components/Footer.module.scss b/components/Footer.module.scss index 37e5110c8fc280ade447da77520843111b3b4de6..d283874b2d810eb9733131507894e42f449bce02 100644 --- a/components/Footer.module.scss +++ b/components/Footer.module.scss @@ -24,12 +24,11 @@ a { color: white; transition: color ease-in-out .07s; + &:hover { color: var(--accent); - } - svg { - > &:hover { + svg { color: var(--accent); } } diff --git a/components/Footer.tsx b/components/Footer.tsx index 1fa649c02164f58b91046fca88d643c61215e90d..09fb5dd583169c08b8c9427a59ae1ff0775995e9 100644 --- a/components/Footer.tsx +++ b/components/Footer.tsx @@ -1,4 +1,5 @@ import { Gitlab, Reddit, Twitter } from '@styled-icons/simple-icons'; +import Link from 'next/link'; import { URLs } from '../urls'; import styles from './Footer.module.scss'; @@ -36,12 +37,21 @@ export function Footer() { </div> <div className={styles.column}> <b>Company</b> - <a href={URLs.AboutUs}>About Us</a> + <Link href="/about"> + <a>About Us</a> + </Link> </div> <div className={styles.column}> <b>Legal</b> - <a href={URLs.TermsOfService}>Terms of Service</a> - <a href={URLs.PrivacyPolicy}>Privacy Policy</a> + <Link href="/terms"> + <a>Terms of Service</a> + </Link> + <Link href="/privacy"> + <a>Privacy Policy</a> + </Link> + <Link href="/aup"> + <a>Acceptable Usage</a> + </Link> </div> </div> </div> diff --git a/components/Markdown.module.scss b/components/Markdown.module.scss new file mode 100644 index 0000000000000000000000000000000000000000..ce0b25c2079b44a56b243c1ad2e91bddbf8868c4 --- /dev/null +++ b/components/Markdown.module.scss @@ -0,0 +1,25 @@ +.markdown { + * { + user-select: text; + } + + font-weight: 500; + + h1 { + color: var(--accent); + margin: 0; + } + + h2, h3 { + margin-top: 2rem; + } + + li { + padding: 2px 0; + } + + blockquote { + opacity: 0.5; + margin-left: 24px; + } +} diff --git a/components/Markdown.tsx b/components/Markdown.tsx new file mode 100644 index 0000000000000000000000000000000000000000..f4956f02455bc3b01f7d9fb43f2651f7bd3dafb2 --- /dev/null +++ b/components/Markdown.tsx @@ -0,0 +1,22 @@ +import MarkdownIt from "markdown-it"; +import styles from './Markdown.module.scss'; + +export const md: MarkdownIt = MarkdownIt({ breaks: true, linkify: true }); + +interface Props { + content?: string; +} + +export function Markdown({ content }: Props) { + if (typeof content === "undefined") return null; + if (content.length === 0) return null; + + return ( + <span + className={styles.markdown} + dangerouslySetInnerHTML={{ + __html: md.render(content) + }} + /> + ); +} diff --git a/components/Navbar.tsx b/components/Navbar.tsx index 3971358a17735bd10fc60788907ed41ee9fa8cb4..eef22784342e9d98e99a3febd928d57c057a2fcd 100644 --- a/components/Navbar.tsx +++ b/components/Navbar.tsx @@ -1,3 +1,4 @@ +import Link from 'next/link'; import { URLs } from '../urls'; import styles from './Navbar.module.scss'; import { Globe } from '@styled-icons/feather'; @@ -5,7 +6,11 @@ import { Globe } from '@styled-icons/feather'; export function Navbar() { return ( <div className={styles.navbar}> - <img src="/logo.svg" draggable={false} /> + <Link href="/"> + <a> + <img src="/logo.svg" draggable={false} /> + </a> + </Link> <div className={styles.actions}> <a href={URLs.Roadmap} target="_blank">Roadmap</a> {/* <a>Developers</a> */} diff --git a/globals.d.ts b/globals.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..5c1c18f6c1f0fa21c49c26ab2ae01625aad5118a --- /dev/null +++ b/globals.d.ts @@ -0,0 +1 @@ +declare module '*.md'; diff --git a/legal b/legal new file mode 160000 index 0000000000000000000000000000000000000000..2ca645c902b4594af0383bab608d1606c86d1bf1 --- /dev/null +++ b/legal @@ -0,0 +1 @@ +Subproject commit 2ca645c902b4594af0383bab608d1606c86d1bf1 diff --git a/package.json b/package.json index e0aa112493d858bf531c77d2d4a63c2dd3cd9a7a..4df5d04a424be65df9952f9a3e85aa7db5798784 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "@types/node": "^14.14.41", "@types/react": "^17.0.3", "classnames": "^2.3.1", + "markdown-it": "^12.0.6", "sass": "^1.32.10", "styled-components": "^5.2.3", "typescript": "^4.2.4" diff --git a/pages/about.tsx b/pages/about.tsx new file mode 100644 index 0000000000000000000000000000000000000000..9df778e2bdcf20694da6c89d27c2a1aecc07dbe1 --- /dev/null +++ b/pages/about.tsx @@ -0,0 +1,35 @@ +import Head from 'next/head'; +import { Footer } from '../components/Footer'; +import { Navbar } from '../components/Navbar'; +import styles from '../styles/Legal.module.scss'; +import { Markdown } from '../components/Markdown'; + +export default function Home({ content }: { content: string }) { + return ( + <div> + <Head> + <title>About Revolt</title> + <link rel="icon" href="/favicon.ico" /> + <meta name="viewport" content="width=device-width, initial-scale=0.9, user-scalable=0" /> + + <link rel="preconnect" href="https://fonts.gstatic.com" /> + <link href="https://fonts.googleapis.com/css2?family=Inter:wght@500;600&display=swap" rel="stylesheet" /> + </Head> + <main> + <Navbar /> + <div className={styles.content}> + <Markdown content={content} /> + </div> + <Footer /> + </main> + </div> + ); +} + +export async function getStaticProps() { + const { readFile } = require('fs/promises'); + const file = await readFile('./legal/About.md'); + const content = file.toString(); + + return { props: { content } } +} diff --git a/pages/aup.tsx b/pages/aup.tsx new file mode 100644 index 0000000000000000000000000000000000000000..3650c551e2d5755f1f18ea208b805596c0096528 --- /dev/null +++ b/pages/aup.tsx @@ -0,0 +1,35 @@ +import Head from 'next/head'; +import { Footer } from '../components/Footer'; +import { Navbar } from '../components/Navbar'; +import styles from '../styles/Legal.module.scss'; +import { Markdown } from '../components/Markdown'; + +export default function Home({ content }: { content: string }) { + return ( + <div> + <Head> + <title>Acceptable Usage Policy - Revolt</title> + <link rel="icon" href="/favicon.ico" /> + <meta name="viewport" content="width=device-width, initial-scale=0.9, user-scalable=0" /> + + <link rel="preconnect" href="https://fonts.gstatic.com" /> + <link href="https://fonts.googleapis.com/css2?family=Inter:wght@500;600&display=swap" rel="stylesheet" /> + </Head> + <main> + <Navbar /> + <div className={styles.content}> + <Markdown content={content} /> + </div> + <Footer /> + </main> + </div> + ); +} + +export async function getStaticProps() { + const { readFile } = require('fs/promises'); + const file = await readFile('./legal/Acceptable Usage Policy.md'); + const content = file.toString(); + + return { props: { content } } +} diff --git a/pages/index.tsx b/pages/index.tsx index 85e620876a045ba708275ca6cdd8d30cdb370e1a..a5ed5a404131fbefac9ca460b0d9fde2cc2d9fd7 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -5,6 +5,7 @@ import { ArrowRight, HelpCircle } from '@styled-icons/feather'; import { JoinPrompt } from '../components/JoinPrompt'; import { Navbar } from '../components/Navbar'; import styles from '../styles/Home.module.scss'; +import { URLs } from '../urls'; export default function Home() { return ( @@ -42,7 +43,7 @@ export default function Home() { <style dangerouslySetInnerHTML={{ __html: `html { scroll-snap-type: y mandatory; }` }} /> } </Head> <main> - <a className={styles.feedback} href=""> + <a className={styles.feedback} href={URLs.Feedback} target="_blank"> <HelpCircle size={24} strokeWidth={2}/>Feedback </a> <section className={styles.hero}> diff --git a/pages/privacy.tsx b/pages/privacy.tsx new file mode 100644 index 0000000000000000000000000000000000000000..0209397b1d8a3ee1d3ea73fda15f8670e24f3d2e --- /dev/null +++ b/pages/privacy.tsx @@ -0,0 +1,35 @@ +import Head from 'next/head'; +import { Footer } from '../components/Footer'; +import { Navbar } from '../components/Navbar'; +import styles from '../styles/Legal.module.scss'; +import { Markdown } from '../components/Markdown'; + +export default function Home({ content }: { content: string }) { + return ( + <div> + <Head> + <title>Privacy Policy - Revolt</title> + <link rel="icon" href="/favicon.ico" /> + <meta name="viewport" content="width=device-width, initial-scale=0.9, user-scalable=0" /> + + <link rel="preconnect" href="https://fonts.gstatic.com" /> + <link href="https://fonts.googleapis.com/css2?family=Inter:wght@500;600&display=swap" rel="stylesheet" /> + </Head> + <main> + <Navbar /> + <div className={styles.content}> + <Markdown content={content} /> + </div> + <Footer /> + </main> + </div> + ); +} + +export async function getStaticProps() { + const { readFile } = require('fs/promises'); + const file = await readFile('./legal/Privacy Policy.md'); + const content = file.toString(); + + return { props: { content } } +} diff --git a/pages/terms.tsx b/pages/terms.tsx new file mode 100644 index 0000000000000000000000000000000000000000..f8d2de71712c967ce5b6b7d1ca36536d2a8ff780 --- /dev/null +++ b/pages/terms.tsx @@ -0,0 +1,35 @@ +import Head from 'next/head'; +import { Footer } from '../components/Footer'; +import { Navbar } from '../components/Navbar'; +import styles from '../styles/Legal.module.scss'; +import { Markdown } from '../components/Markdown'; + +export default function Home({ content }: { content: string }) { + return ( + <div> + <Head> + <title>Terms of Service - Revolt</title> + <link rel="icon" href="/favicon.ico" /> + <meta name="viewport" content="width=device-width, initial-scale=0.9, user-scalable=0" /> + + <link rel="preconnect" href="https://fonts.gstatic.com" /> + <link href="https://fonts.googleapis.com/css2?family=Inter:wght@500;600&display=swap" rel="stylesheet" /> + </Head> + <main> + <Navbar /> + <div className={styles.content}> + <Markdown content={content} /> + </div> + <Footer /> + </main> + </div> + ); +} + +export async function getStaticProps() { + const { readFile } = require('fs/promises'); + const file = await readFile('./legal/Terms of Service.md'); + const content = file.toString(); + + return { props: { content } } +} diff --git a/styles/Legal.module.scss b/styles/Legal.module.scss new file mode 100644 index 0000000000000000000000000000000000000000..39b166fe7654935e88cf32ba4fa907eb40dd66a7 --- /dev/null +++ b/styles/Legal.module.scss @@ -0,0 +1,5 @@ +.content { + margin: auto; + padding: 20px; + max-width: 720px; +} diff --git a/urls.ts b/urls.ts index 5a665163c04df689c179251301272f729b823d74..e3af57874fcddda2eea095f7e006853b63185e59 100644 --- a/urls.ts +++ b/urls.ts @@ -4,13 +4,12 @@ export const URLs = { Roadmap: 'https://www.notion.so/Roadmap-d285602ba73543438bf1cdb0a4754514', Developers: 'https://developers.revolt.chat', + Feedback: 'https://form.insrt.uk/form/607f276fed17160022857908', SourceCode: 'https://gitlab.insrt.uk/revolt', Reddit: 'https://reddit.com/r/revoltchat', Twitter: 'https://twitter.com/revoltchat', Translate: 'https://weblate.insrt.uk/engage/revolt/?utm_source=widget', - AboutUs: 'https://www.notion.so/About-f12f76fcbb124e27824639bac5dbbf11', - TermsOfService: 'https://www.notion.so/Terms-of-Service-25dfc6bd25114a67b6eb6696f8463134', - PrivacyPolicy: 'https://www.notion.so/Privacy-Policy-fcbc659894284f4bbb23e8ab3a1a476c', + AboutUs: 'https://www.notion.so/About-f12f76fcbb124e27824639bac5dbbf11' }; diff --git a/yarn.lock b/yarn.lock index c62e36b90eaada0c896e1b33738ad724ddac56f9..abecc00b28f7269bf26030ed912e20ee3b81261f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -302,6 +302,11 @@ anymatch@~3.1.1: normalize-path "^3.0.0" picomatch "^2.0.4" +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + array-filter@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-1.0.0.tgz#baf79e62e6ef4c2a4c0b831232daffec251f9d83" @@ -803,6 +808,11 @@ encoding@0.1.13: dependencies: iconv-lite "^0.6.2" +entities@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5" + integrity sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w== + es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2: version "1.18.0" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0.tgz#ab80b359eecb7ede4c298000390bc5ac3ec7b5a4" @@ -1217,6 +1227,13 @@ line-column@^1.0.2: isarray "^1.0.0" isobject "^2.0.0" +linkify-it@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-3.0.2.tgz#f55eeb8bc1d3ae754049e124ab3bb56d97797fb8" + integrity sha512-gDBO4aHNZS6coiZCKVhSNh43F9ioIL4JwRjLZPkoLIY4yZFwg264Y5lu2x6rb1Js42Gh6Yqm2f6L2AJcnkzinQ== + dependencies: + uc.micro "^1.0.1" + loader-utils@1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" @@ -1257,6 +1274,17 @@ make-dir@^3.0.2: dependencies: semver "^6.0.0" +markdown-it@^12.0.6: + version "12.0.6" + resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-12.0.6.tgz#adcc8e5fe020af292ccbdf161fe84f1961516138" + integrity sha512-qv3sVLl4lMT96LLtR7xeRJX11OUFjsaD5oVat2/SNBIb21bJXwal2+SklcRbTwGwqWpWH/HRtYavOoJE+seL8w== + dependencies: + argparse "^2.0.1" + entities "~2.1.0" + linkify-it "^3.0.1" + mdurl "^1.0.1" + uc.micro "^1.0.5" + md5.js@^1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" @@ -1266,6 +1294,11 @@ md5.js@^1.3.4: inherits "^2.0.1" safe-buffer "^5.1.2" +mdurl@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" + integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4= + merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" @@ -2044,6 +2077,11 @@ typescript@^4.2.4: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.2.4.tgz#8610b59747de028fda898a8aef0e103f156d0961" integrity sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg== +uc.micro@^1.0.1, uc.micro@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" + integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== + unbox-primitive@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471"