├── .babelrc ├── .eslintignore ├── .eslintrc ├── .gitignore ├── .husky └── pre-commit ├── .vscode ├── extensions.json ├── launch.json ├── settings.json └── tasks.json ├── LICENSE ├── README.md ├── components ├── CardSection.module.scss ├── CardSection.tsx ├── Footer.module.scss ├── Footer.tsx ├── JoinLinks.module.scss ├── JoinLinks.tsx ├── JoinPrompt.module.scss ├── JoinPrompt.tsx ├── Markdown.module.scss ├── Markdown.tsx ├── Navbar.module.scss └── Navbar.tsx ├── globals.d.ts ├── legal ├── About.md ├── Acceptable Usage Policy.md ├── Privacy Policy.md └── Terms of Service.md ├── lint-staged.config.js ├── netlify.toml ├── next-env.d.ts ├── next.config.js ├── package-lock.json ├── package.json ├── pages ├── _app.tsx ├── about.tsx ├── aup.tsx ├── beta.ts ├── index.tsx ├── onboarding.tsx ├── privacy.tsx ├── publicbeta.tsx ├── roadmap.tsx └── terms.tsx ├── postcss.config.js ├── public ├── android-chrome-192x192.png ├── android-chrome-512x512.png ├── apple-touch-icon.png ├── assets │ └── images │ │ ├── card1.svg │ │ ├── card2.svg │ │ ├── card3.svg │ │ ├── feature.svg │ │ ├── feature1.svg │ │ ├── feature2.svg │ │ ├── feature3.svg │ │ ├── image1.svg │ │ ├── image2.svg │ │ ├── image3.svg │ │ ├── logo.svg │ │ ├── logo2.svg │ │ ├── logo3.svg │ │ ├── robotory.svg │ │ └── simtropolis.svg ├── favicon copy.ico ├── favicon-16x16.png ├── favicon-32x32.png ├── illustration.svg ├── members.svg ├── netscape.gif ├── proposal.svg └── site.webmanifest ├── styles ├── Home.module.scss ├── Legal.module.scss ├── elements.scss └── global.scss ├── tailwind.config.js ├── tsconfig.json └── urls.js /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | [ 4 | "next/babel", 5 | { 6 | "styled-jsx": { 7 | "plugins": ["styled-jsx-plugin-postcss"] 8 | } 9 | } 10 | ] 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | out 3 | -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | // Configuration for JavaScript files 3 | "extends": ["airbnb-base", "plugin:prettier/recommended"], 4 | "rules": { 5 | "prettier/prettier": [ 6 | "error", 7 | { 8 | "singleQuote": true 9 | } 10 | ] 11 | }, 12 | "overrides": [ 13 | // Configuration for TypeScript files 14 | { 15 | "files": ["**/*.ts", "**/*.tsx"], 16 | "plugins": ["@typescript-eslint", "unused-imports"], 17 | "extends": [ 18 | "airbnb-typescript", 19 | "next/core-web-vitals", 20 | "plugin:prettier/recommended" 21 | ], 22 | "parserOptions": { 23 | "project": "./tsconfig.json" 24 | }, 25 | "rules": { 26 | "prettier/prettier": [ 27 | "error", 28 | { 29 | "singleQuote": true 30 | } 31 | ], 32 | "react/destructuring-assignment": "off", // Vscode doesn't support automatically destructuring, it's a pain to add a new variable 33 | "jsx-a11y/anchor-is-valid": "off", // Next.js use his own internal link system 34 | "react/require-default-props": "off", // Allow non-defined react props as undefined 35 | "react/jsx-props-no-spreading": "off", // _app.tsx uses spread operator and also, react-hook-form 36 | "@next/next/no-img-element": "off", // We currently not using next/image because it isn't supported with SSG mode 37 | "import/order": [ 38 | "error", 39 | { 40 | "groups": ["builtin", "external", "internal"], 41 | "pathGroups": [ 42 | { 43 | "pattern": "react", 44 | "group": "external", 45 | "position": "before" 46 | } 47 | ], 48 | "pathGroupsExcludedImportTypes": ["react"], 49 | "newlines-between": "always", 50 | "alphabetize": { 51 | "order": "asc", 52 | "caseInsensitive": true 53 | } 54 | } 55 | ], 56 | "import/prefer-default-export": "off", // Named export is easier to refactor automatically 57 | "class-methods-use-this": "off", // _document.tsx use render method without `this` keyword 58 | "@typescript-eslint/no-unused-vars": "off", 59 | "unused-imports/no-unused-imports": "error", 60 | "unused-imports/no-unused-vars": [ 61 | "error", 62 | { "argsIgnorePattern": "^_" } 63 | ] 64 | } 65 | } 66 | ] 67 | } 68 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # next.js 12 | /.next 13 | /out 14 | 15 | # production 16 | /build 17 | 18 | # misc 19 | .DS_Store 20 | *.pem 21 | Thumbs.db 22 | 23 | # debug 24 | npm-debug.log* 25 | yarn-debug.log* 26 | yarn-error.log* 27 | 28 | # dotenv local files 29 | .env*.local 30 | 31 | # local folder 32 | local 33 | 34 | # vercel 35 | .vercel 36 | -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | . "$(dirname "$0")/_/husky.sh" 3 | 4 | # Disable concurent to run build-types after ESLint in lint-staged 5 | npx lint-staged --concurrent false 6 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": [ 3 | "dbaeumer.vscode-eslint", 4 | "esbenp.prettier-vscode", 5 | "mikestead.dotenv", 6 | "csstools.postcss", 7 | "blanu.vscode-styled-jsx", 8 | "msjsdiag.debugger-for-chrome", 9 | "bradlc.vscode-tailwindcss" 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "type": "chrome", 9 | "request": "launch", 10 | "name": "Next: Chrome", 11 | "url": "http://localhost:3000", 12 | "webRoot": "${workspaceFolder}" 13 | }, 14 | { 15 | "type": "node", 16 | "request": "launch", 17 | "name": "Next: Node", 18 | "program": "${workspaceFolder}/node_modules/.bin/next", 19 | "args": ["dev"], 20 | "autoAttachChildProcesses": true, 21 | "skipFiles": ["/**"], 22 | "console": "integratedTerminal" 23 | } 24 | ], 25 | "compounds": [ 26 | { 27 | "name": "Next: Full", 28 | "configurations": ["Next: Node", "Next: Chrome"] 29 | } 30 | ] 31 | } 32 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.tabSize": 2, 3 | "editor.detectIndentation": false, 4 | "jest.autoRun": { 5 | "watch": false, 6 | "onSave": "test-file" 7 | }, 8 | "search.exclude": { 9 | "package-lock.json": true 10 | }, 11 | "editor.defaultFormatter": "dbaeumer.vscode-eslint", 12 | "editor.formatOnSave": false, 13 | "editor.codeActionsOnSave": [ 14 | "source.addMissingImports", 15 | "source.fixAll.eslint" 16 | ], 17 | // Overriding multiple language files isn't available on VScode yet 18 | "[json]": { 19 | "editor.formatOnSave": true, 20 | "editor.defaultFormatter": "esbenp.prettier-vscode" 21 | }, 22 | "[jsonc]": { 23 | "editor.formatOnSave": true, 24 | "editor.defaultFormatter": "esbenp.prettier-vscode" 25 | }, 26 | "[typescriptreact]": { 27 | "editor.defaultFormatter": "esbenp.prettier-vscode" 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | // See https://go.microsoft.com/fwlink/?LinkId=733558 3 | // for the documentation about the tasks.json format 4 | "version": "2.0.0", 5 | "tasks": [ 6 | { 7 | "label": "Project wide type checking with TypeScript", 8 | "type": "npm", 9 | "script": "build-types", 10 | "problemMatcher": ["$tsc"], 11 | "group": { 12 | "kind": "build", 13 | "isDefault": true 14 | }, 15 | "presentation": { 16 | "clear": true, 17 | "reveal": "never" 18 | } 19 | } 20 | ] 21 | } 22 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 SocialTech. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Built-in feature from Next.js: 2 | 3 | - ☕ Minify HTML & CSS 4 | - 💨 Live reload 5 | - ✅ Cache busting 6 | 7 | ### Included Components 8 | 9 | - Navbar 10 | - Hero 11 | - Features 12 | - CTA banner 13 | - Footer 14 | 15 | ### Philosophy 16 | 17 | - Minimal code 18 | - SEO-friendly 19 | - 🚀 Production-ready 20 | 21 | ### Requirements 22 | 23 | - Node.js and npm 24 | 25 | ### Getting started 26 | 27 | Run the following command on your local environment: 28 | 29 | ``` 30 | git clone --depth=1 https://github.com/devsocialtech/landing.git my-project-name 31 | cd my-project-name 32 | npm install 33 | ``` 34 | 35 | Then, you can run locally in development mode with live reload: 36 | 37 | ``` 38 | npm run dev 39 | ``` 40 | 41 | Open http://localhost:3000 with your favorite browser to see your project. For your information, Next JS need to take some time to compile the project for your first time. 42 | 43 | ``` 44 | . 45 | ├── README.md # README file 46 | ├── next.config.js # Next JS configuration 47 | ├── public # Public folder 48 | │ └── assets 49 | │ └── images # Image used by default template 50 | ├── src 51 | │ ├── background # Atomic background component 52 | │ ├── button # Atomic button component 53 | │ ├── cta # Atomic cta component 54 | │ ├── feature # Atomic feature component 55 | │ ├── footer # Atomic footer component 56 | │ ├── hero # Atomic hero component 57 | │ ├── layout # Atomic layout component 58 | │ ├── navigation # Atomic navigation component 59 | │ ├── pages # Next JS pages 60 | │ ├── styles # PostCSS style folder with Tailwind 61 | │ ├── templates # Default template 62 | │ └── utils # Utility folder 63 | ├── tailwind.config.js # Tailwind CSS configuration 64 | └── tsconfig.json # TypeScript configuration 65 | ``` 66 | 67 | ### Customization 68 | 69 | You can easily configure the theme. Please change the following file: 70 | 71 | - `public/apple-touch-icon.png`, `public/favicon.ico`, `public/favicon-16x16.png` and `public/favicon-32x32.png`: your favicon, you can generate from https://favicon.io/favicon-converter/ 72 | - `src/styles/main.css`: your CSS file using Tailwind CSS 73 | - `utils/AppConfig.ts`: configuration file 74 | - `src/pages/index.tsx`: the index page of the theme that uses the `Base` component 75 | - `src/template/Base.tsx`: the `Base` component using component blocks 76 | - `src/templates/*`: the list of component blocks 77 | - `src/*`: other folders in src are the atomic components used by components blocks 78 | 79 | Here is the layer: 80 | 81 | - the entry point: `index.tsx` in `src/pages` 82 | - the `Base` template: `Base.tsx` in `src/templates` 83 | - use component blocks from `src/templates/*` 84 | - use atomic components from `src/*` 85 | 86 | ### Deploy to production 87 | 88 | You can see the results locally in production mode with: 89 | 90 | ``` 91 | $ npm run build 92 | $ npm run start 93 | ``` 94 | 95 | The generated HTML and CSS files are minified (built-in feature from Next js). It will also removed unused CSS from [Tailwind CSS](https://tailwindcss.com). 96 | 97 | You can create an optimized production build with: 98 | 99 | ``` 100 | npm run build-prod 101 | ``` 102 | 103 | Now, your theme is ready to be deployed. All generated files are located at `out` folder, which you can deploy with any hosting service. 104 | 105 | ### Deploy to Netlify 106 | 107 | Clone this repository on own GitHub account and deploy to Netlify: 108 | 109 | [![Netlify Deploy button](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https://github.com/devsocialtech/landing) 110 | 111 | ### Deploy to Vercel 112 | 113 | Deploy this Next JS Boilerplate on Vercel in one click: 114 | 115 | [![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/git/external?repository-url=https://github.com/devsocialtech/landing) 116 | 117 | ### VSCode information (optional) 118 | 119 | If you are VSCode users, you can have a better integration with VSCode by installing the suggested extension in `.vscode/extension.json`. The starter code comes up with Settings for a seamless integration with VSCode. The Debug configuration is also provided for frontend and backend debugging experience. 120 | 121 | Pro tips: if you need a project wide type checking with TypeScript, you can run a build with Cmd + Shift + B on Mac. 122 | 123 | ### Contributions 124 | 125 | Everyone is welcome to contribute to this project. Feel free to open an issue if you have question or found a bug. 126 | -------------------------------------------------------------------------------- /components/CardSection.module.scss: -------------------------------------------------------------------------------- 1 | .container { 2 | background: transparent; 3 | } 4 | 5 | .prompt { 6 | margin: auto; 7 | display: flex; 8 | padding: 4rem; 9 | overflow: hidden; 10 | align-items: center; 11 | scroll-snap-align: center; 12 | max-width: var(--max-width); 13 | 14 | .info { 15 | flex-grow: 1; 16 | 17 | h1, p { 18 | margin: 0; 19 | text-align: center; 20 | } 21 | 22 | h1 { 23 | font-size: 40px; 24 | margin-bottom: 10px; 25 | font-weight: 400; 26 | font-family: bely-display, sans-serif; 27 | font-style: normal; 28 | } 29 | 30 | p { 31 | font-size: 18px; 32 | width: fit-content; 33 | } 34 | } 35 | 36 | .actions { 37 | display: flex; 38 | } 39 | } 40 | 41 | .card { 42 | margin: auto; 43 | display: flex; 44 | padding: 4rem; 45 | overflow: hidden; 46 | align-items: center; 47 | scroll-snap-align: center; 48 | max-width: var(--max-width); 49 | 50 | .info { 51 | flex-grow: 1; 52 | padding: 3rem; 53 | margin: 1rem; 54 | left: 0px; 55 | top: 0px; 56 | text-align: center; 57 | background: #FFFFFF; 58 | box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.1); 59 | border-radius: 8px; 60 | 61 | h1, p { 62 | margin: 0; 63 | } 64 | 65 | h1 { 66 | font-size: 25px; 67 | margin-bottom: 10px; 68 | font-weight: lighter; 69 | font-family: bely-display, sans-serif; 70 | font-style: normal; 71 | } 72 | 73 | p { 74 | font-size: 16px; 75 | max-width: 400px; 76 | } 77 | 78 | img { 79 | display: block; 80 | margin-bottom: 20px; 81 | margin-left: auto; 82 | margin-right: auto; 83 | } 84 | } 85 | 86 | .actions { 87 | display: flex; 88 | } 89 | 90 | } 91 | 92 | @media only screen and (max-width: 768px) { 93 | .prompt { 94 | flex-direction: column; 95 | padding: 4rem 20px; 96 | 97 | .actions { 98 | flex-direction: column; 99 | width: 100%; 100 | } 101 | } 102 | 103 | .info { 104 | margin-bottom: 40px; 105 | } 106 | } 107 | -------------------------------------------------------------------------------- /components/CardSection.tsx: -------------------------------------------------------------------------------- 1 | import styles from './CardSection.module.scss'; 2 | 3 | export function CardSection() { 4 | return ( 5 |
6 |
7 |
8 |

Reimagining what it means to work

9 |

10 | Teams and communities using Netscape fundamentally unlock a reality 11 | of work that reimagines how people engage in economic opportunity, 12 | meeting the demands and expectations of a modern organization. 13 |

14 |
15 |
16 |
17 |
18 | 19 |

Modern workforce

20 |

21 | Multistakeholder governance aligns members with the collective wider 22 | community. 23 |

24 |
25 |
26 | 27 |

Meritocratic by design

28 |

29 | Tokenized ownership aligns deeply committed individuals with the 30 | collective’s success. 31 |

32 |
33 |
34 | 35 |

Engineered for resilience

36 |

37 | Netscape supports best practices in sociocratic management. 38 | Omni-Channel environments for real-time communication. 39 |

40 |
41 |
42 |
43 | ); 44 | } 45 | -------------------------------------------------------------------------------- /components/Footer.module.scss: -------------------------------------------------------------------------------- 1 | .footer { 2 | margin: auto; 3 | display: flex; 4 | padding: 4rem; 5 | overflow: hidden; 6 | align-items: center; 7 | scroll-snap-align: end; 8 | max-width: var(--max-width); 9 | 10 | .branding { 11 | gap: 5rem; 12 | flex-grow: 1; 13 | display: flex; 14 | align-items: center; 15 | 16 | img, svg { 17 | height: 40px; 18 | } 19 | 20 | .socials { 21 | display: flex; 22 | gap: 2rem; 23 | 24 | a { 25 | color: #303031; 26 | transition: color ease-in-out .07s; 27 | 28 | &:hover { 29 | color: var(--accent); 30 | 31 | svg { 32 | color: var(--accent); 33 | } 34 | } 35 | } 36 | } 37 | } 38 | 39 | .links { 40 | gap: 3rem; 41 | display: flex; 42 | 43 | .column { 44 | gap: .5rem; 45 | display: flex; 46 | flex-direction: column; 47 | 48 | b { 49 | font-size: 18px; 50 | color: var(--accent); 51 | font-weight: 600; 52 | padding-bottom: 2px; 53 | } 54 | } 55 | } 56 | } 57 | 58 | @media only screen and (max-width: 480px) { 59 | .footer .branding { 60 | align-items: center; 61 | flex-direction: column; 62 | } 63 | } 64 | 65 | @media only screen and (max-width: 1000px) { 66 | .footer { 67 | gap: 4rem; 68 | flex-direction: column; 69 | 70 | .branding { 71 | gap: 2rem; 72 | } 73 | 74 | .links { 75 | flex-wrap: wrap; 76 | justify-content: center; 77 | 78 | .column { 79 | flex: 1; 80 | } 81 | } 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /components/Footer.tsx: -------------------------------------------------------------------------------- 1 | import styles from './Footer.module.scss'; 2 | 3 | export function Footer() { 4 | return ( 5 |
6 |
7 | 8 | {/*
9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 |
*/} 25 |
26 | {/*
27 |
28 | App 29 | Open App 30 | 31 | Project Tracker 32 | 33 | Download 34 | Features 35 | Branding 36 |
37 |
38 | Developers 39 | Contribute 40 | Documentation 41 | Help translate 42 |
43 |
44 | Team 45 | 46 | About Us 47 | 48 | Email 49 |
50 |
51 | Legal 52 | 53 | Terms of Service 54 | 55 | 56 | Privacy Policy 57 | 58 | 59 | Acceptable Usage 60 | 61 |
62 |
*/} 63 |
64 | ); 65 | } 66 | -------------------------------------------------------------------------------- /components/JoinLinks.module.scss: -------------------------------------------------------------------------------- 1 | .actions { 2 | gap: 1.2rem; 3 | display: flex; 4 | } 5 | 6 | @media only screen and (max-width: 768px) { 7 | .actions { 8 | flex-direction: column; 9 | width: 100%; 10 | } 11 | 12 | .button { 13 | justify-content: center; 14 | } 15 | } -------------------------------------------------------------------------------- /components/JoinLinks.tsx: -------------------------------------------------------------------------------- 1 | import { Edit } from '@styled-icons/feather'; 2 | import classNames from 'classnames'; 3 | 4 | import URLs from '../urls'; 5 | import styles from './JoinLinks.module.scss'; 6 | 7 | interface Props { 8 | contrast?: boolean; 9 | } 10 | 11 | export function JoinLinks(props: Props) { 12 | return ( 13 |
14 | 18 | Request Early Access 19 | 20 | {/* 21 | Open Web app 22 | */} 23 |
24 | ); 25 | } 26 | -------------------------------------------------------------------------------- /components/JoinPrompt.module.scss: -------------------------------------------------------------------------------- 1 | .container { 2 | background: var(--accent); 3 | } 4 | 5 | .prompt { 6 | margin: auto; 7 | display: flex; 8 | padding: 4rem; 9 | overflow: hidden; 10 | align-items: center; 11 | scroll-snap-align: center; 12 | max-width: var(--max-width); 13 | 14 | .info { 15 | flex-grow: 1; 16 | 17 | h1, p { 18 | margin: 0; 19 | } 20 | 21 | h1 { 22 | font-size: 40px; 23 | margin-bottom: 10px; 24 | font-weight: 400; 25 | font-family: bely-display, sans-serif; 26 | font-style: normal; 27 | } 28 | 29 | p { 30 | font-size: 18px; 31 | max-width: 400px; 32 | } 33 | } 34 | 35 | .actions { 36 | display: flex; 37 | } 38 | } 39 | 40 | @media only screen and (max-width: 768px) { 41 | .prompt { 42 | flex-direction: column; 43 | padding: 4rem 20px; 44 | 45 | .actions { 46 | flex-direction: column; 47 | width: 100%; 48 | } 49 | } 50 | 51 | .info { 52 | margin-bottom: 40px; 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /components/JoinPrompt.tsx: -------------------------------------------------------------------------------- 1 | import { JoinLinks } from './JoinLinks'; 2 | import styles from './JoinPrompt.module.scss'; 3 | 4 | export function JoinPrompt() { 5 | return ( 6 |
7 |
8 |
9 |

Start a Netscape?

10 |

11 | If you can’t wait to run a new or existing organization on Netscape 12 | and are willing to explore and navigate the beta, we’d love to get 13 | you started. 14 |

15 |
16 | 17 |
18 |
19 | ); 20 | } 21 | -------------------------------------------------------------------------------- /components/Markdown.module.scss: -------------------------------------------------------------------------------- 1 | .markdown { 2 | * { 3 | user-select: text; 4 | } 5 | 6 | font-weight: 500; 7 | 8 | h1 { 9 | color: var(--accent); 10 | margin: 0; 11 | } 12 | 13 | h2, h3 { 14 | margin-top: 2rem; 15 | } 16 | 17 | li { 18 | padding: 2px 0; 19 | } 20 | 21 | blockquote { 22 | opacity: 0.5; 23 | margin-left: 24px; 24 | } 25 | 26 | a { 27 | text-decoration: underline; 28 | 29 | &:hover { 30 | opacity: 0.8; 31 | } 32 | } 33 | 34 | input[type="checkbox"] { 35 | opacity: 0; 36 | margin-top: 12px; 37 | pointer-events: none; 38 | display: inline-block; 39 | } 40 | 41 | label { 42 | pointer-events: none; 43 | } 44 | 45 | input[type="checkbox"] + label:before { 46 | width: 32px; 47 | height: 32px; 48 | content: 'a'; 49 | line-height: 32px; 50 | position: relative; 51 | border-radius: 6px; 52 | background: white; 53 | display: inline-block; 54 | } 55 | 56 | input[type="checkbox"][checked="true"] + label:before { 57 | content: '✓'; 58 | align-items: center; 59 | display: inline-flex; 60 | justify-content: center; 61 | background: var(--accent); 62 | } 63 | 64 | input[type="checkbox"] + label { 65 | top: -6px; 66 | line-height: 20px; 67 | padding-left: 6px; 68 | position: relative; 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /components/Markdown.tsx: -------------------------------------------------------------------------------- 1 | import MarkdownIt from 'markdown-it'; 2 | import MarkdownItAnchor from 'markdown-it-anchor'; 3 | import MarkdownItCheckbox from 'markdown-it-checkbox'; 4 | 5 | import styles from './Markdown.module.scss'; 6 | 7 | export const md: MarkdownIt = MarkdownIt({ breaks: true, linkify: true }) 8 | .use(MarkdownItAnchor, { level: 3 }) 9 | .use(MarkdownItCheckbox); 10 | 11 | interface Props { 12 | content?: string; 13 | } 14 | 15 | export function Markdown({ content }: Props) { 16 | if (typeof content === 'undefined') return null; 17 | if (content.length === 0) return null; 18 | 19 | return ( 20 | 26 | ); 27 | } 28 | -------------------------------------------------------------------------------- /components/Navbar.module.scss: -------------------------------------------------------------------------------- 1 | .navbar { 2 | display: flex; 3 | padding: 60px 80px; 4 | align-items: center; 5 | scroll-snap-align: start; 6 | justify-content: space-between; 7 | 8 | img { 9 | height: 80px; 10 | } 11 | 12 | .actions { 13 | gap: 1.2rem; 14 | display: flex; 15 | font-size: 18px; 16 | align-items: center; 17 | } 18 | } 19 | 20 | @media only screen and (max-width: 768px) { 21 | .navbar { 22 | padding: 40px 20px; 23 | } 24 | } -------------------------------------------------------------------------------- /components/Navbar.tsx: -------------------------------------------------------------------------------- 1 | import Link from 'next/link'; 2 | 3 | import URLs from '../urls'; 4 | import styles from './Navbar.module.scss'; 5 | 6 | export function Navbar() { 7 | return ( 8 |
9 | 10 | 11 | 12 | 13 | 14 |
15 | GitHub 16 | {/* Why Netscape? 17 | Features 18 | Contribute 19 | Request Early Access */} 20 |
21 |
22 | ); 23 | } 24 | -------------------------------------------------------------------------------- /globals.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.md'; 2 | -------------------------------------------------------------------------------- /legal/About.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simtropolis/socialtech-frontend/79e64f4627aec58510e560dc392f2e25ec1eb008/legal/About.md -------------------------------------------------------------------------------- /legal/Acceptable Usage Policy.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simtropolis/socialtech-frontend/79e64f4627aec58510e560dc392f2e25ec1eb008/legal/Acceptable Usage Policy.md -------------------------------------------------------------------------------- /legal/Privacy Policy.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simtropolis/socialtech-frontend/79e64f4627aec58510e560dc392f2e25ec1eb008/legal/Privacy Policy.md -------------------------------------------------------------------------------- /legal/Terms of Service.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simtropolis/socialtech-frontend/79e64f4627aec58510e560dc392f2e25ec1eb008/legal/Terms of Service.md -------------------------------------------------------------------------------- /lint-staged.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | '*.{js,jsx,ts,tsx}': ['eslint --fix', 'eslint'], 3 | '**/*.ts?(x)': () => 'npm run build-types', 4 | '*.json': ['prettier --write'], 5 | }; 6 | -------------------------------------------------------------------------------- /netlify.toml: -------------------------------------------------------------------------------- 1 | [build] 2 | publish = "out" 3 | command = "npm run build" 4 | 5 | [[plugins]] 6 | package = "@netlify/plugin-nextjs" 7 | -------------------------------------------------------------------------------- /next-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | 4 | // NOTE: This file should not be edited 5 | // see https://nextjs.org/docs/basic-features/typescript for more information. 6 | -------------------------------------------------------------------------------- /next.config.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable import/no-extraneous-dependencies */ 2 | const withBundleAnalyzer = require('@next/bundle-analyzer')({ 3 | enabled: process.env.ANALYZE === 'true', 4 | }); 5 | 6 | module.exports = withBundleAnalyzer({ 7 | poweredByHeader: false, 8 | trailingSlash: true, 9 | basePath: '/', 10 | // The starter code load resources from `public` folder with `router.basePath` in React components. 11 | // So, the source code is "basePath-ready". 12 | // You can remove `basePath` if you don't need it. 13 | reactStrictMode: true, 14 | }); 15 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "next-js-boilerplate", 3 | "version": "1.0.0", 4 | "scripts": { 5 | "dev": "next dev", 6 | "build": "next build", 7 | "start": "next start", 8 | "build-stats": "cross-env ANALYZE=true npm run build", 9 | "export": "next export", 10 | "build-prod": "run-s clean build export", 11 | "clean": "rimraf .next out", 12 | "lint": "next lint", 13 | "build-types": "tsc --noEmit --pretty", 14 | "prepare": "husky install" 15 | }, 16 | "dependencies": { 17 | "@styled-icons/feather": "^10.18.0", 18 | "@styled-icons/simple-icons": "^10.33.0", 19 | "classnames": "^2.3.1", 20 | "fs": "^0.0.1-security", 21 | "markdown-it": "^12.0.6", 22 | "markdown-it-anchor": "^7.1.0", 23 | "markdown-it-checkbox": "^1.1.0", 24 | "next": "^12.0.2", 25 | "next-seo": "^4.28.1", 26 | "nextjs-redirect": "^5.0.2", 27 | "optionator": "^0.9.1", 28 | "react": "^17.0.2", 29 | "react-dom": "^17.0.2", 30 | "styled-jsx-plugin-postcss": "^4.0.1" 31 | }, 32 | "devDependencies": { 33 | "@babel/core": "^7.16.0", 34 | "@fontsource/inter": "^4.2.2", 35 | "@next/bundle-analyzer": "^12.0.2", 36 | "@types/node": "^16.11.6", 37 | "@types/react": "^17.0.33", 38 | "@typescript-eslint/eslint-plugin": "^4.33.0", 39 | "@typescript-eslint/parser": "^4.33.0", 40 | "autoprefixer": "^10.4.0", 41 | "cross-env": "^7.0.3", 42 | "eslint": "^7.32.0", 43 | "eslint-config-airbnb-base": "^14.2.1", 44 | "eslint-config-airbnb-typescript": "^14.0.1", 45 | "eslint-config-next": "^12.0.2", 46 | "eslint-config-prettier": "^8.3.0", 47 | "eslint-plugin-import": "^2.25.2", 48 | "eslint-plugin-jsx-a11y": "^6.4.1", 49 | "eslint-plugin-node": "^11.1.0", 50 | "eslint-plugin-prettier": "^4.0.0", 51 | "eslint-plugin-react": "^7.26.1", 52 | "eslint-plugin-react-hooks": "^4.2.0", 53 | "eslint-plugin-unused-imports": "^1.1.5", 54 | "husky": "^7.0.4", 55 | "lint-staged": "^11.2.6", 56 | "npm-run-all": "^4.1.5", 57 | "postcss": "^8.3.11", 58 | "prettier": "^2.4.1", 59 | "rimraf": "^3.0.2", 60 | "sass": "^1.32.10", 61 | "styled-components": "^5.2.3", 62 | "tailwindcss": "^2.2.19", 63 | "typescript": "^4.4.4", 64 | "webpack": "^5.65.0" 65 | }, 66 | "license": "ISC" 67 | } 68 | -------------------------------------------------------------------------------- /pages/_app.tsx: -------------------------------------------------------------------------------- 1 | import { AppProps } from 'next/app'; 2 | import '../styles/global.scss'; 3 | 4 | function App({ Component, pageProps }: AppProps) { 5 | return ; 6 | } 7 | 8 | export default App; 9 | -------------------------------------------------------------------------------- /pages/about.tsx: -------------------------------------------------------------------------------- 1 | import Head from 'next/head'; 2 | 3 | import { Footer } from '../components/Footer'; 4 | import { Markdown } from '../components/Markdown'; 5 | import { Navbar } from '../components/Navbar'; 6 | import styles from '../styles/Legal.module.scss'; 7 | 8 | export default function Home({ content }: { content: string }) { 9 | return ( 10 |
11 | 12 | About Netscape 13 | 14 | 18 | 19 |
20 | 21 |
22 | 23 |
24 |
25 |
26 |
27 | ); 28 | } 29 | 30 | const { readFile } = require('fs/promises'); 31 | 32 | export async function getStaticProps() { 33 | const file = await readFile('./legal/About.md'); 34 | const content = file.toString(); 35 | return { props: { content } }; 36 | } 37 | -------------------------------------------------------------------------------- /pages/aup.tsx: -------------------------------------------------------------------------------- 1 | import Head from 'next/head'; 2 | 3 | import { Footer } from '../components/Footer'; 4 | import { Markdown } from '../components/Markdown'; 5 | import { Navbar } from '../components/Navbar'; 6 | import styles from '../styles/Legal.module.scss'; 7 | 8 | export default function Home({ content }: { content: string }) { 9 | return ( 10 |
11 | 12 | Acceptable Usage Policy - Revolt 13 | 14 | 18 | 19 |
20 | 21 |
22 | 23 |
24 |
25 |
26 |
27 | ); 28 | } 29 | 30 | const { readFile } = require('fs/promises'); 31 | 32 | export async function getStaticProps() { 33 | const file = await readFile('./legal/Acceptable Usage Policy.md'); 34 | const content = file.toString(); 35 | 36 | return { props: { content } }; 37 | } 38 | -------------------------------------------------------------------------------- /pages/beta.ts: -------------------------------------------------------------------------------- 1 | import redirect from 'nextjs-redirect'; 2 | 3 | import URLs from '../urls'; 4 | 5 | export default redirect(URLs.ApplicationForm); 6 | -------------------------------------------------------------------------------- /pages/index.tsx: -------------------------------------------------------------------------------- 1 | import { ArrowRight } from '@styled-icons/feather'; 2 | import Head from 'next/head'; 3 | 4 | import { CardSection } from '../components/CardSection'; 5 | import { Footer } from '../components/Footer'; 6 | import { JoinLinks } from '../components/JoinLinks'; 7 | import { JoinPrompt } from '../components/JoinPrompt'; 8 | import { Navbar } from '../components/Navbar'; 9 | import styles from '../styles/Home.module.scss'; 10 | import URLs from '../urls'; 11 | 12 | export default function Home() { 13 | return ( 14 |
15 | 16 | Netscape 17 | 18 | 19 | 23 | 24 | 25 | 26 | 30 | 34 | 35 | 36 | 37 | 38 | 42 | 46 | 50 | 51 | 52 | 53 | 54 | 55 | { 56 | // Disabled scroll snapping. 57 | /* // Firefox only: Scroll snapping. 58 | // Doesn't work properly with Chromium. 59 | typeof window !== 'undefined' && 60 | typeof (window as any).InstallTrigger !== 'undefined' && 61 |