Inferno rewrite (#31)
* Initial inferno commit. * Fixing husky * Fixing submodule * Removing extra dockerfile lines * Some cleanup, refactoring into components * Testing out a drone build. * Removing lemmy-docs * Removing gitmodules * Trying to add again * Don't init. * check folder. * check folder 2. * Removing lemmy-docs again * Adding lemmy-docs again * Adding submodule init. * Removing ls. * Trying a first docker deploy. * Removing arm64 build. * Upgrading deps, fixing links.
20
.babelrc
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
{
|
||||||
|
"compact": false,
|
||||||
|
"presets": [
|
||||||
|
[
|
||||||
|
"@babel/preset-env",
|
||||||
|
{
|
||||||
|
"loose": true,
|
||||||
|
"targets": {
|
||||||
|
"browsers": ["ie >= 11", "safari > 10"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
["@babel/typescript", {"isTSX": true, "allExtensions": true}]
|
||||||
|
],
|
||||||
|
"plugins": [
|
||||||
|
"@babel/plugin-transform-runtime",
|
||||||
|
["babel-plugin-inferno", { "imports": true }],
|
||||||
|
["@babel/plugin-proposal-class-properties", { "loose": true }],
|
||||||
|
]
|
||||||
|
}
|
2
.dockerignore
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
node_modules
|
||||||
|
dist
|
61
.drone.yml
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
---
|
||||||
|
kind: pipeline
|
||||||
|
name: amd64
|
||||||
|
|
||||||
|
platform:
|
||||||
|
os: linux
|
||||||
|
arch: amd64
|
||||||
|
|
||||||
|
steps:
|
||||||
|
|
||||||
|
- name: fetch git submodules
|
||||||
|
image: alpine/git
|
||||||
|
commands:
|
||||||
|
- git submodule init
|
||||||
|
- git submodule update --recursive --remote
|
||||||
|
|
||||||
|
- name: yarn
|
||||||
|
image: node:14-alpine
|
||||||
|
commands:
|
||||||
|
- yarn
|
||||||
|
|
||||||
|
- name: yarn lint
|
||||||
|
image: node:14-alpine
|
||||||
|
commands:
|
||||||
|
- yarn lint
|
||||||
|
|
||||||
|
- name: yarn build:dev
|
||||||
|
image: node:14-alpine
|
||||||
|
commands:
|
||||||
|
- yarn build:dev
|
||||||
|
|
||||||
|
- name: make release build and push to docker hub
|
||||||
|
image: plugins/docker
|
||||||
|
settings:
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
repo: dessalines/joinlemmy-site
|
||||||
|
auto_tag: true
|
||||||
|
auto_tag_suffix: linux-amd64
|
||||||
|
username:
|
||||||
|
from_secret: docker_username
|
||||||
|
password:
|
||||||
|
from_secret: docker_password
|
||||||
|
when:
|
||||||
|
ref:
|
||||||
|
- refs/tags/*
|
||||||
|
|
||||||
|
- name: push to docker manifest
|
||||||
|
image: plugins/manifest
|
||||||
|
settings:
|
||||||
|
username:
|
||||||
|
from_secret: docker_username
|
||||||
|
password:
|
||||||
|
from_secret: docker_password
|
||||||
|
target: "dessalines/joinlemmy-site:${DRONE_TAG}"
|
||||||
|
template: "dessalines/joinlemmy-site:${DRONE_TAG}-OS-ARCH"
|
||||||
|
platforms:
|
||||||
|
- linux/amd64
|
||||||
|
ignore_missing: true
|
||||||
|
when:
|
||||||
|
ref:
|
||||||
|
- refs/tags/*
|
3
.eslintignore
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
generate_translations.js
|
||||||
|
webpack.config.js
|
||||||
|
src/api_tests
|
45
.eslintrc.json
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
{
|
||||||
|
"root": true,
|
||||||
|
"env": {
|
||||||
|
"browser": true
|
||||||
|
},
|
||||||
|
"plugins": [
|
||||||
|
"@typescript-eslint"
|
||||||
|
],
|
||||||
|
"extends": [
|
||||||
|
"eslint:recommended",
|
||||||
|
"plugin:@typescript-eslint/recommended"
|
||||||
|
],
|
||||||
|
"parser": "@typescript-eslint/parser",
|
||||||
|
"parserOptions": {
|
||||||
|
"project": "./tsconfig.json",
|
||||||
|
"warnOnUnsupportedTypeScriptVersion": false
|
||||||
|
},
|
||||||
|
"rules": {
|
||||||
|
"@typescript-eslint/no-explicit-any": 0,
|
||||||
|
"@typescript-eslint/explicit-module-boundary-types": 0,
|
||||||
|
"arrow-body-style": 0,
|
||||||
|
"curly": 0,
|
||||||
|
"eol-last": 0,
|
||||||
|
"eqeqeq": 0,
|
||||||
|
"func-style": 0,
|
||||||
|
"import/no-duplicates": 0,
|
||||||
|
"max-statements": 0,
|
||||||
|
"max-params": 0,
|
||||||
|
"new-cap": 0,
|
||||||
|
"no-console": 0,
|
||||||
|
"no-duplicate-imports": 0,
|
||||||
|
"no-extra-parens": 0,
|
||||||
|
"no-return-assign": 0,
|
||||||
|
"no-throw-literal": 0,
|
||||||
|
"no-trailing-spaces": 0,
|
||||||
|
"no-unused-expressions": 0,
|
||||||
|
"no-useless-constructor": 0,
|
||||||
|
"no-useless-escape": 0,
|
||||||
|
"no-var": 0,
|
||||||
|
"prefer-const": 0,
|
||||||
|
"prefer-rest-params": 0,
|
||||||
|
"quote-props": 0,
|
||||||
|
"unicorn/filename-case": 0
|
||||||
|
}
|
||||||
|
}
|
17
.gitignore
vendored
|
@ -1,4 +1,15 @@
|
||||||
public
|
dist
|
||||||
static/docs
|
.git
|
||||||
static/api
|
.build
|
||||||
|
.idea
|
||||||
|
.jshintrc
|
||||||
|
.sass-cache
|
||||||
|
.vscode
|
||||||
|
coverage
|
||||||
|
jsconfig.json
|
||||||
node_modules
|
node_modules
|
||||||
|
.DS_Store
|
||||||
|
*.map
|
||||||
|
*.log
|
||||||
|
*.swp
|
||||||
|
*.orig
|
||||||
|
|
2
.gitmodules
vendored
|
@ -1,4 +1,4 @@
|
||||||
[submodule "lemmy-docs"]
|
[submodule "lemmy-docs"]
|
||||||
path = lemmy-docs
|
path = lemmy-docs
|
||||||
url = https://github.com/LemmyNet/lemmy-docs
|
url = https://github.com/lemmynet/lemmy-docs
|
||||||
branch = main
|
branch = main
|
||||||
|
|
1
.husky/.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
_
|
4
.husky/pre-commit
Executable file
|
@ -0,0 +1,4 @@
|
||||||
|
#!/bin/sh
|
||||||
|
. "$(dirname "$0")/_/husky.sh"
|
||||||
|
|
||||||
|
yarn lint-staged
|
4
.prettierrc.js
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
module.exports = Object.assign(require("eslint-plugin-prettier"), {
|
||||||
|
arrowParens: "avoid",
|
||||||
|
semi: true,
|
||||||
|
});
|
48
Dockerfile
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
# Build the docs
|
||||||
|
FROM rust:slim as docs
|
||||||
|
WORKDIR /app
|
||||||
|
RUN cargo install mdbook \
|
||||||
|
--git https://github.com/Nutomic/mdBook.git \
|
||||||
|
--branch localization \
|
||||||
|
--rev 0982a82
|
||||||
|
COPY lemmy-docs ./lemmy-docs
|
||||||
|
RUN mdbook build lemmy-docs -d ../docs
|
||||||
|
|
||||||
|
# Build the asyncapi API docs
|
||||||
|
FROM asyncapi/generator:1.1.7 as api
|
||||||
|
WORKDIR /app
|
||||||
|
COPY src/assets/scripts/asyncapi.yaml ./
|
||||||
|
RUN ag -o ./api ./asyncapi.yaml @asyncapi/html-template --force-write
|
||||||
|
|
||||||
|
# Build the isomorphic app
|
||||||
|
FROM node:14-alpine as builder
|
||||||
|
RUN apk update && apk add yarn python3 build-base gcc wget git --no-cache
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Cache deps
|
||||||
|
COPY package.json yarn.lock ./
|
||||||
|
RUN yarn install --pure-lockfile
|
||||||
|
|
||||||
|
# Build
|
||||||
|
COPY tsconfig.json \
|
||||||
|
webpack.config.js \
|
||||||
|
.babelrc \
|
||||||
|
./
|
||||||
|
|
||||||
|
COPY src src
|
||||||
|
|
||||||
|
# Copy the docs and API
|
||||||
|
COPY --from=docs /app/docs ./src/assets/docs
|
||||||
|
COPY --from=api /app/api ./src/assets/api
|
||||||
|
|
||||||
|
RUN yarn
|
||||||
|
RUN yarn build:prod
|
||||||
|
|
||||||
|
FROM node:14-alpine as runner
|
||||||
|
COPY --from=builder /app/dist /app/dist
|
||||||
|
COPY --from=builder /app/node_modules /app/node_modules
|
||||||
|
|
||||||
|
EXPOSE 1234
|
||||||
|
WORKDIR /app
|
||||||
|
CMD node dist/js/server.js
|
30
README.md
|
@ -1,15 +1,15 @@
|
||||||
# Join lemmy site
|
# JoinLemmy-site
|
||||||
|
|
||||||
## Requirements
|
## Requirements
|
||||||
- [zola](https://www.getzola.org/)
|
|
||||||
- `yarn` to build the API docs
|
- Docker
|
||||||
- `cargo` to build the mdbook docs
|
|
||||||
|
## Running
|
||||||
## Running
|
|
||||||
|
```
|
||||||
To test / make changes:
|
docker build -t joinlemmy-site
|
||||||
|
docker run -p 3000:1234 joinlemmy-site
|
||||||
- run `./serve.sh`
|
```
|
||||||
- Goto http://127.0.0.1:1111
|
|
||||||
- Goto http://127.0.0.1:1111/docs/en/index.html for docs
|
and goto http://localhost:3000
|
||||||
- Goto http://127.0.0.1:1111/api/index.html for API
|
|
||||||
|
|
14
build.sh
|
@ -1,14 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# Build the mdbook docs
|
|
||||||
./build_docs.sh
|
|
||||||
|
|
||||||
# Build the API docs
|
|
||||||
yarn --ignore-engines && yarn build
|
|
||||||
|
|
||||||
zola build
|
|
||||||
|
|
||||||
sudo mkdir -p /var/www/joinlemmy
|
|
||||||
sudo rm -rf /var/www/joinlemmy/public
|
|
||||||
sudo mv public /var/www/joinlemmy/
|
|
||||||
sudo systemctl reload nginx
|
|
|
@ -1,5 +0,0 @@
|
||||||
cargo install mdbook \
|
|
||||||
--git https://github.com/Nutomic/mdBook.git \
|
|
||||||
--branch localization \
|
|
||||||
--rev 0982a82
|
|
||||||
mdbook build lemmy-docs -d ../static/docs
|
|
15
config.toml
|
@ -1,15 +0,0 @@
|
||||||
# The URL the site will be built for
|
|
||||||
base_url = "https://join.lemmy.ml"
|
|
||||||
|
|
||||||
# Whether to automatically compile all Sass files in the sass directory
|
|
||||||
compile_sass = true
|
|
||||||
|
|
||||||
# Whether to do syntax highlighting
|
|
||||||
# Theme can be customised by setting the `highlight_theme` variable to a theme supported by Zola
|
|
||||||
highlight_code = false
|
|
||||||
|
|
||||||
# Whether to build a search index to be used later on by a JavaScript library
|
|
||||||
build_search_index = false
|
|
||||||
|
|
||||||
[extra]
|
|
||||||
# Put all your custom variables here
|
|
|
@ -1,3 +0,0 @@
|
||||||
+++
|
|
||||||
template = "apps.html"
|
|
||||||
+++
|
|
|
@ -1,55 +0,0 @@
|
||||||
+++
|
|
||||||
template = "page.html"
|
|
||||||
+++
|
|
||||||
|
|
||||||
# Contact
|
|
||||||
|
|
||||||
- [Mastodon](https://mastodon.social/@LemmyDev)
|
|
||||||
- [Matrix](https://matrix.to/#/#lemmy:matrix.org)
|
|
||||||
- [GitHub](https://github.com/LemmyNet/lemmy)
|
|
||||||
- [security@lemmy.ml](mailto:security@lemmy.ml) *PGP key below*
|
|
||||||
|
|
||||||
```
|
|
||||||
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
|
||||||
|
|
||||||
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
|
|
||||||
RnELNHhlJZ4s
|
|
||||||
=VWLX
|
|
||||||
-----END PGP PUBLIC KEY BLOCK-----
|
|
||||||
|
|
||||||
```
|
|
|
@ -1,4 +0,0 @@
|
||||||
+++
|
|
||||||
template = "join.html"
|
|
||||||
+++
|
|
||||||
|
|
|
@ -1,88 +0,0 @@
|
||||||
+++
|
|
||||||
template = "page.html"
|
|
||||||
+++
|
|
||||||
|
|
||||||
<div class="text-center">
|
|
||||||
<h1>Donate to Lemmy</h1>
|
|
||||||
<p>Lemmy is free, open-source software, meaning no advertising, monetizing, or venture capital, ever. <a href="/sponsors">Your donations</a> directly support full-time development of the project.
|
|
||||||
</p>
|
|
||||||
<div class="row is-horizontal-align">
|
|
||||||
<div class="col-3">
|
|
||||||
<a class="button primary" href="https://liberapay.com/Lemmy">Support on Liberapay</a>
|
|
||||||
</div>
|
|
||||||
<div class="col-3">
|
|
||||||
<a class="button primary" href="https://www.patreon.com/dessalines">Support on Patreon</a>
|
|
||||||
</div>
|
|
||||||
<div class="col-3">
|
|
||||||
<a class="col button primary" href="https://opencollective.com/lemmy">Support on OpenCollective</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
<div class="text-center">
|
|
||||||
<h2>Sponsors</h2>
|
|
||||||
<p>Silver Sponsors are those that pledged $40 to Lemmy.</p>
|
|
||||||
<div class="row is-horizontal-align">
|
|
||||||
<div class="col">
|
|
||||||
<a class="button outline primary" href="https://iww.org/">💎 RedJoker</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<br />
|
|
||||||
<p>General Sponsors are those that pledged $10 to $39 to Lemmy.</p>
|
|
||||||
<div class="row is-horizontal-align">
|
|
||||||
<div class="col">
|
|
||||||
<div class="button outline primary">DQW</div>
|
|
||||||
</div>
|
|
||||||
<div class="col">
|
|
||||||
<div class="button outline primary">Alex Benishek</div>
|
|
||||||
</div>
|
|
||||||
<div class="col">
|
|
||||||
<div class="button outline">seahorse</div>
|
|
||||||
</div>
|
|
||||||
<div class="col">
|
|
||||||
<div class="button outline">Tommaso</div>
|
|
||||||
</div>
|
|
||||||
<div class="col">
|
|
||||||
<div class="button outline">Jamie Gray</div>
|
|
||||||
</div>
|
|
||||||
<div class="col">
|
|
||||||
<div class="button outline">Brendan</div>
|
|
||||||
</div>
|
|
||||||
<div class="col">
|
|
||||||
<div class="button outline">mexicanhalloween</div>
|
|
||||||
</div>
|
|
||||||
<div class="col">
|
|
||||||
<div class="button outline">William Moore</div>
|
|
||||||
</div>
|
|
||||||
<div class="col">
|
|
||||||
<div class="button outline">Rachel Schmitz</div>
|
|
||||||
</div>
|
|
||||||
<div class="col">
|
|
||||||
<div class="button outline">comradeda</div>
|
|
||||||
</div>
|
|
||||||
<div class="col">
|
|
||||||
<div class="button outline">Jonathan Cremin</div>
|
|
||||||
</div>
|
|
||||||
<div class="col">
|
|
||||||
<div class="button outline">Arthur Nieuwland</div>
|
|
||||||
</div>
|
|
||||||
<div class="col">
|
|
||||||
<div class="button outline">Forrest Weghorst</div>
|
|
||||||
</div>
|
|
||||||
<div class="col">
|
|
||||||
<div class="button outline">Andre Vallestero</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="text-center">
|
|
||||||
<h1>Crypto</h1>
|
|
||||||
<table>
|
|
||||||
<tr><td>bitcoin</td><td><code>1Hefs7miXS5ff5Ck5xvmjKjXf5242KzRtK</code></td></tr>
|
|
||||||
<tr><td>ethereum</td><td><code>0x400c96c96acbC6E7B3B43B1dc1BB446540a88A01</code></td></tr>
|
|
||||||
<tr><td>monero</td><td><code>41taVyY6e1xApqKyMVDRVxJ76sPkfZhALLTjRvVKpaAh2pBd4wv9RgYj1tSPrx8wc6iE1uWUfjtQdTmTy2FGMeChGVKPQuV</code></td></tr>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
|
@ -1,7 +1,11 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
git submodule update --remote
|
git submodule update --remote
|
||||||
git add lemmy-docs
|
git add lemmy-docs
|
||||||
git commit -m"Updating docs"
|
git commit -m"Updating docs"
|
||||||
git push
|
git push
|
||||||
rsync --rsync-path="sudo rsync" -chavzP /var/www/joinlemmy --stats tyler@lemmy.ml:/var/www/
|
|
||||||
ssh tyler@lemmy.ml 'sudo systemctl reload nginx'
|
new_tag="$1"
|
||||||
|
|
||||||
|
git tag $new_tag
|
||||||
|
git push origin $new_tag
|
||||||
|
|
76
package.json
|
@ -1,15 +1,77 @@
|
||||||
{
|
{
|
||||||
"name": "joinlemmy-site",
|
"name": "joinlemmy-site",
|
||||||
"version": "1.0.0",
|
"description": "A site for join-lemmy",
|
||||||
"description": "Builds the API docs",
|
|
||||||
"main": "index.js",
|
|
||||||
"repository": "https://github.com/LemmyNet/joinlemmy-site.git",
|
|
||||||
"author": "Dessalines <tyhou13@gmx.com>",
|
"author": "Dessalines <tyhou13@gmx.com>",
|
||||||
"license": "AGPL-3.0-or-later",
|
"license": "AGPL-3.0",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "ag -o static/api static/scripts/asyncapi.yaml @asyncapi/html-template --force-write"
|
"build:dev": "webpack --mode=development",
|
||||||
|
"build:prod": "webpack --mode=production",
|
||||||
|
"clean": "yarn run rimraf dist",
|
||||||
|
"lint": "tsc --noEmit && eslint --report-unused-disable-directives --ext .js,.ts,.tsx src",
|
||||||
|
"postinstall": "husky install",
|
||||||
|
"prebuild:dev": "yarn clean",
|
||||||
|
"prebuild:prod": "yarn clean",
|
||||||
|
"start": "yarn build:dev --watch"
|
||||||
},
|
},
|
||||||
|
"repository": "https://github.com/LemmyNet/joinlemmy-site",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@asyncapi/generator": "^1.1.7"
|
"@typescript-eslint/parser": "^4.15.1",
|
||||||
|
"chota": "^0.8.0",
|
||||||
|
"express": "~4.17.1",
|
||||||
|
"i18next": "^19.8.9",
|
||||||
|
"inferno": "^7.4.8",
|
||||||
|
"inferno-create-element": "^7.4.8",
|
||||||
|
"inferno-helmet": "^5.2.1",
|
||||||
|
"inferno-hydrate": "^7.4.8",
|
||||||
|
"inferno-router": "^7.4.8",
|
||||||
|
"inferno-server": "^7.4.8"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@babel/core": "^7.12.17",
|
||||||
|
"@babel/plugin-transform-runtime": "^7.12.17",
|
||||||
|
"@babel/plugin-transform-typescript": "^7.12.17",
|
||||||
|
"@babel/preset-env": "7.13.10",
|
||||||
|
"@babel/preset-typescript": "^7.12.17",
|
||||||
|
"@babel/runtime": "^7.12.18",
|
||||||
|
"@types/express": "^4.17.11",
|
||||||
|
"@types/node": "^14.14.31",
|
||||||
|
"@types/node-fetch": "^2.5.8",
|
||||||
|
"@typescript-eslint/eslint-plugin": "^4.15.1",
|
||||||
|
"babel-loader": "^8.2.2",
|
||||||
|
"babel-plugin-inferno": "^6",
|
||||||
|
"clean-webpack-plugin": "^3.0.0",
|
||||||
|
"copy-webpack-plugin": "^8.0.0",
|
||||||
|
"css-loader": "^5.0.2",
|
||||||
|
"eslint": "^7.20.0",
|
||||||
|
"eslint-plugin-prettier": "^3.3.1",
|
||||||
|
"husky": "^5.1.0",
|
||||||
|
"lint-staged": "^10.5.4",
|
||||||
|
"mini-css-extract-plugin": "^1.3.8",
|
||||||
|
"node-sass": "^5.0.0",
|
||||||
|
"prettier": "^2.2.1",
|
||||||
|
"rimraf": "^3.0.2",
|
||||||
|
"run-node-webpack-plugin": "^1.3.0",
|
||||||
|
"sass-loader": "^11.0.1",
|
||||||
|
"sortpack": "^2.2.0",
|
||||||
|
"style-loader": "^2.0.0",
|
||||||
|
"terser": "^5.6.0",
|
||||||
|
"typescript": "^4.1.5",
|
||||||
|
"webpack": "5.25.0",
|
||||||
|
"webpack-cli": "^4.5.0",
|
||||||
|
"webpack-dev-server": "3.11.2",
|
||||||
|
"webpack-node-externals": "^2.5.2"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=8.9.0"
|
||||||
|
},
|
||||||
|
"engineStrict": true,
|
||||||
|
"lint-staged": {
|
||||||
|
"*.{ts,tsx,js}": [
|
||||||
|
"prettier --write",
|
||||||
|
"eslint --fix"
|
||||||
|
],
|
||||||
|
"package.json": [
|
||||||
|
"sortpack"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
8
serve.sh
|
@ -1,8 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
./build_docs.sh
|
|
||||||
|
|
||||||
# Build the API docs
|
|
||||||
yarn --ignore-engines && yarn build
|
|
||||||
|
|
||||||
zola serve --interface 0.0.0.0
|
|
53
src/assets/css/main.css
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
:root {
|
||||||
|
--font-family-sans: Inter, Helvetica, Roboto, sans-serif;
|
||||||
|
--grid-maxWidth: 108rem;
|
||||||
|
--grid-gutter: 4rem;
|
||||||
|
--color-success: #fafafa;
|
||||||
|
--bg-color: #222222;
|
||||||
|
--bg-secondary-color: #131316;
|
||||||
|
--font-color: #f5f5f5;
|
||||||
|
--color-grey: #ccc;
|
||||||
|
--color-darkGrey: #777;
|
||||||
|
--color-success: #222222;
|
||||||
|
}
|
||||||
|
.card {
|
||||||
|
webkit-box-shadow: unset;
|
||||||
|
box-shadow: unset;
|
||||||
|
border: 1px solid var(--color-darkGrey) !important;
|
||||||
|
}
|
||||||
|
.stylized {
|
||||||
|
font-family: "CaviarDreams", Fallback, sans-serif;
|
||||||
|
font-size: 4em;
|
||||||
|
font-weight: bold;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
.icon {
|
||||||
|
display: inline-block;
|
||||||
|
max-width: 1.5rem;
|
||||||
|
max-height: 1.5rem;
|
||||||
|
stroke-width: 0;
|
||||||
|
stroke: currentColor;
|
||||||
|
fill: currentColor;
|
||||||
|
}
|
||||||
|
p {
|
||||||
|
font: 1.2em/1.62 sans-serif;
|
||||||
|
}
|
||||||
|
.join-banner {
|
||||||
|
width: 100%;
|
||||||
|
height: 100px;
|
||||||
|
object-fit: scale-down;
|
||||||
|
}
|
||||||
|
.app-banner {
|
||||||
|
width: 100%;
|
||||||
|
height: 300px;
|
||||||
|
object-fit: scale-down;
|
||||||
|
}
|
||||||
|
.app-icon {
|
||||||
|
display: inline-block;
|
||||||
|
height: 30px;
|
||||||
|
width: 30px;
|
||||||
|
margin-right: 10px;
|
||||||
|
}
|
||||||
|
img {
|
||||||
|
max-width: unset;
|
||||||
|
}
|
BIN
src/assets/icons/apple-touch-icon.png
Normal file
After Width: | Height: | Size: 2.1 KiB |
Before Width: | Height: | Size: 9.2 KiB After Width: | Height: | Size: 9.2 KiB |
Before Width: | Height: | Size: 55 KiB After Width: | Height: | Size: 55 KiB |
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 2.6 KiB |
Before Width: | Height: | Size: 64 KiB After Width: | Height: | Size: 64 KiB |
118
src/assets/images/lemmy.svg
Normal file
|
@ -0,0 +1,118 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
width="1024"
|
||||||
|
height="1024"
|
||||||
|
viewBox="0 0 1024 1024"
|
||||||
|
version="1.1"
|
||||||
|
id="svg8"
|
||||||
|
inkscape:version="0.92.4 (unknown)"
|
||||||
|
sodipodi:docname="lemmy-logo-border.svg"
|
||||||
|
inkscape:export-filename="/home/andres/Pictures/References/Logos/Lemmy/lemmy-logo-border.png"
|
||||||
|
inkscape:export-xdpi="300"
|
||||||
|
inkscape:export-ydpi="300"
|
||||||
|
enable-background="new">
|
||||||
|
<defs
|
||||||
|
id="defs2" />
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="base"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:zoom="0.49497475"
|
||||||
|
inkscape:cx="452.38625"
|
||||||
|
inkscape:cy="470.53357"
|
||||||
|
inkscape:document-units="px"
|
||||||
|
inkscape:current-layer="layer1"
|
||||||
|
showgrid="false"
|
||||||
|
units="px"
|
||||||
|
inkscape:showpageshadow="false"
|
||||||
|
inkscape:window-width="1366"
|
||||||
|
inkscape:window-height="740"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="0"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
showguides="true"
|
||||||
|
inkscape:guide-bbox="true"
|
||||||
|
inkscape:snap-global="true"
|
||||||
|
inkscape:snap-midpoints="false"
|
||||||
|
inkscape:snap-smooth-nodes="false"
|
||||||
|
inkscape:object-paths="false"
|
||||||
|
inkscape:pagecheckerboard="true" />
|
||||||
|
<metadata
|
||||||
|
id="metadata5">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title />
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<g
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1"
|
||||||
|
transform="translate(0,-26.066658)"
|
||||||
|
style="display:inline">
|
||||||
|
<path
|
||||||
|
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:28;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
d="m 167.03908,270.78735 c -0.94784,-0.002 -1.8939,0.004 -2.83789,0.0215 -4.31538,0.0778 -8.58934,0.3593 -12.8125,0.8457 -33.78522,3.89116 -64.215716,21.86394 -82.871086,53.27344 -18.27982,30.77718 -22.77749,64.66635 -13.46094,96.06837 9.31655,31.40203 31.88488,59.93174 65.296886,82.5332 0.20163,0.13618 0.40678,0.26709 0.61523,0.39258 28.65434,17.27768 57.18167,28.93179 87.74218,34.95508 -0.74566,12.61339 -0.72532,25.5717 0.082,38.84375 2.43989,40.10943 16.60718,77.03742 38.0957,109.67187 l -77.00781,31.4375 c -8.30605,3.25932 -12.34178,12.68234 -8.96967,20.94324 3.37211,8.2609 12.84919,12.16798 21.06342,8.68371 l 84.69727,-34.57617 c 15.70675,18.72702 33.75346,35.68305 53.12109,50.57032 0.74013,0.56891 1.4904,1.12236 2.23437,1.68554 l -49.61132,65.69141 c -5.45446,7.0474 -4.10058,17.19288 3.01098,22.5634 7.11156,5.37052 17.24028,3.89649 22.52612,-3.27824 l 50.38672,-66.71876 c 27.68572,17.53469 57.07524,31.20388 86.07227,40.25196 14.88153,27.28008 43.96965,44.64648 77.58789,44.64648 33.93762,0 63.04252,-18.68693 77.80082,-45.4375 28.7072,-9.21295 57.7527,-22.93196 85.1484,-40.40234 l 51.0977,67.66016 c 5.2858,7.17473 15.4145,8.64876 22.5261,3.27824 7.1115,-5.37052 8.4654,-15.516 3.011,-22.5634 l -50.3614,-66.68555 c 0.334,-0.25394 0.6727,-0.50077 1.0059,-0.75586 19.1376,-14.64919 37.0259,-31.28581 52.7031,-49.63476 l 82.5625,33.70507 c 8.2143,3.48427 17.6913,-0.42281 21.0634,-8.68371 3.3722,-8.2609 -0.6636,-17.68392 -8.9696,-20.94324 l -74.5391,-30.42773 c 22.1722,-32.82971 37.0383,-70.03397 40.1426,-110.46094 1.0253,-13.35251 1.2292,-26.42535 0.6387,-39.17578 30.3557,-6.05408 58.7164,-17.66833 87.2011,-34.84375 0.2085,-0.12549 0.4136,-0.2564 0.6153,-0.39258 33.412,-22.60147 55.9803,-51.13117 65.2968,-82.5332 9.3166,-31.40202 4.8189,-65.29118 -13.4609,-96.06837 -18.6553,-31.40951 -49.0859,-49.38228 -82.8711,-53.27344 -4.2231,-0.4864 -8.4971,-0.76791 -12.8125,-0.8457 -30.2077,-0.54448 -62.4407,8.82427 -93.4316,26.71484 -22.7976,13.16063 -43.3521,33.31423 -59.4375,55.30469 -44.9968,-25.75094 -103.5444,-40.25065 -175.4785,-41.43945 -6.4522,-0.10663 -13.0125,-0.10696 -19.67974,0.002 -80.18875,1.30929 -144.38284,16.5086 -192.87109,43.9922 -0.11914,-0.19111 -0.24287,-0.37932 -0.37109,-0.56446 -16.29,-22.764 -37.41085,-43.73706 -60.89649,-57.29493 -30.02247,-17.33149 -61.21051,-26.66489 -90.59375,-26.73633 z"
|
||||||
|
id="path817-3"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="cccssccccccscccccscccscccscccccsccscccssccscscccscc"
|
||||||
|
inkscape:label="white-border"
|
||||||
|
sodipodi:insensitive="true" />
|
||||||
|
<path
|
||||||
|
id="path1087"
|
||||||
|
style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:28;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
d="m 716.85595,362.96478 c 15.29075,-21.36763 35.36198,-41.10921 56.50979,-53.31749 66.66377,-38.48393 137.02617,-33.22172 170.08018,22.43043 33.09493,55.72093 14.98656,117.48866 -47.64399,159.85496 -31.95554,19.26819 -62.93318,30.92309 -97.22892,35.54473 M 307.14407,362.96478 C 291.85332,341.59715 271.78209,321.85557 250.63429,309.64729 183.97051,271.16336 113.60811,276.42557 80.554051,332.07772 47.459131,387.79865 65.56752,449.56638 128.19809,491.93268 c 31.95554,19.26819 62.93319,30.92309 97.22893,35.54473"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
inkscape:label="ears"
|
||||||
|
sodipodi:insensitive="true" />
|
||||||
|
<path
|
||||||
|
style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:28;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
d="M 801.23205,576.8699 C 812.73478,427.06971 720.58431,321.98291 511.99999,325.38859 303.41568,328.79426 213.71393,428.0311 222.76794,576.8699 c 8.64289,142.08048 176.80223,246.40388 288.12038,246.40388 111.31815,0 279.45076,-104.5447 290.34373,-246.40388 z"
|
||||||
|
id="path969"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="szszs"
|
||||||
|
inkscape:label="head"
|
||||||
|
sodipodi:insensitive="true" />
|
||||||
|
<path
|
||||||
|
id="path1084"
|
||||||
|
style="display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
d="m 610.4991,644.28932 c 0,23.11198 18.70595,41.84795 41.78091,41.84795 23.07495,0 41.7809,-18.73597 41.7809,-41.84795 0,-23.112 -18.70594,-41.84796 -41.7809,-41.84796 -23.07496,0 -41.78091,18.73596 -41.78091,41.84796 z m -280.56002,0 c 0,23.32492 18.87829,42.23352 42.16586,42.23352 23.28755,0 42.16585,-18.9086 42.16585,-42.23352 0,-23.32494 -18.87829,-42.23353 -42.16585,-42.23353 -23.28757,0 -42.16586,18.90859 -42.16586,42.23353 z"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
inkscape:label="eyes"
|
||||||
|
sodipodi:nodetypes="ssssssssss"
|
||||||
|
sodipodi:insensitive="true" />
|
||||||
|
<path
|
||||||
|
id="path1008"
|
||||||
|
style="display:inline;opacity:1;fill:none;stroke:#000000;stroke-width:32;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
d="m 339.72919,769.2467 -54.54422,72.22481 m 399.08582,-72.22481 54.54423,72.22481 M 263.68341,697.82002 175.92752,733.64353 m 579.85765,-35.82351 87.7559,35.82351"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
inkscape:label="whiskers"
|
||||||
|
sodipodi:nodetypes="cccccccc"
|
||||||
|
sodipodi:insensitive="true" />
|
||||||
|
<path
|
||||||
|
style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:28;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
d="m 512.00082,713.08977 c -45.86417,0 -75.13006,31.84485 -74.14159,71.10084 1.07048,42.51275 32.46865,71.10323 74.14159,71.10323 41.67296,0 74.05118,-32.99608 74.14161,-71.10323 0.0932,-39.26839 -28.27742,-71.10084 -74.14161,-71.10084 z"
|
||||||
|
id="path1115"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
inkscape:label="nose"
|
||||||
|
sodipodi:nodetypes="zszsz"
|
||||||
|
sodipodi:insensitive="true" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 9.2 KiB |
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 31 KiB |
Before Width: | Height: | Size: 97 KiB After Width: | Height: | Size: 97 KiB |
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 50 KiB |
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 29 KiB |
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 95 KiB After Width: | Height: | Size: 95 KiB |
Before Width: | Height: | Size: 124 KiB After Width: | Height: | Size: 124 KiB |
11
src/client/index.tsx
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
import { hydrate } from "inferno-hydrate";
|
||||||
|
import { BrowserRouter } from "inferno-router";
|
||||||
|
import { App } from "../shared/components/app";
|
||||||
|
|
||||||
|
const wrapper = (
|
||||||
|
<BrowserRouter>
|
||||||
|
<App />
|
||||||
|
</BrowserRouter>
|
||||||
|
);
|
||||||
|
|
||||||
|
hydrate(wrapper, document.getElementById("root"));
|
108
src/server/index.tsx
Normal file
|
@ -0,0 +1,108 @@
|
||||||
|
import express from "express";
|
||||||
|
import { StaticRouter } from "inferno-router";
|
||||||
|
import { renderToString } from "inferno-server";
|
||||||
|
// import { matchPath } from "inferno-router";
|
||||||
|
import path from "path";
|
||||||
|
import { App } from "../shared/components/app";
|
||||||
|
// import { routes } from "../shared/routes";
|
||||||
|
import process from "process";
|
||||||
|
import { Helmet } from "inferno-helmet";
|
||||||
|
|
||||||
|
const server = express();
|
||||||
|
const port = 1234;
|
||||||
|
|
||||||
|
server.use(express.json());
|
||||||
|
server.use(express.urlencoded({ extended: false }));
|
||||||
|
server.use("/static", express.static(path.resolve("./dist")));
|
||||||
|
server.use("/docs", express.static(path.resolve("./dist/assets/docs")));
|
||||||
|
server.use("/api", express.static(path.resolve("./dist/assets/api")));
|
||||||
|
|
||||||
|
server.get("/*", async (req, res) => {
|
||||||
|
// const activeRoute = routes.find(route => matchPath(req.path, route)) || {};
|
||||||
|
const context = {} as any;
|
||||||
|
|
||||||
|
const wrapper = (
|
||||||
|
<StaticRouter location={req.url} context={context}>
|
||||||
|
<App />
|
||||||
|
</StaticRouter>
|
||||||
|
);
|
||||||
|
if (context.url) {
|
||||||
|
return res.redirect(context.url);
|
||||||
|
}
|
||||||
|
|
||||||
|
const root = renderToString(wrapper);
|
||||||
|
const helmet = Helmet.renderStatic();
|
||||||
|
|
||||||
|
res.send(`
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html ${helmet.htmlAttributes.toString()} lang="en">
|
||||||
|
<head>
|
||||||
|
|
||||||
|
${helmet.title.toString()}
|
||||||
|
${helmet.meta.toString()}
|
||||||
|
|
||||||
|
<!-- Required meta tags -->
|
||||||
|
<meta name="Description" content="Lemmy">
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||||
|
|
||||||
|
<!-- Icons -->
|
||||||
|
<link rel="shortcut icon" type="image/svg+xml" href="/static/assets/icons/favicon.svg" />
|
||||||
|
<link rel="apple-touch-icon" href="/static/assets/icons/apple-touch-icon.png" />
|
||||||
|
|
||||||
|
<!-- Styles -->
|
||||||
|
<link rel="stylesheet" type="text/css" href="/static/styles/styles.css" />
|
||||||
|
<!-- These don't work with the css minifier -->
|
||||||
|
<style>
|
||||||
|
@font-face {
|
||||||
|
font-family: 'CaviarDreams';
|
||||||
|
font-style: normal;
|
||||||
|
src: url('/static/assets/fonts/CaviarDreams.ttf') format('truetype');
|
||||||
|
}
|
||||||
|
.bg-image {
|
||||||
|
position: fixed;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
z-index: -1;
|
||||||
|
display: block;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
background:
|
||||||
|
linear-gradient(
|
||||||
|
rgba(0, 0, 0, 0.0),
|
||||||
|
rgba(0, 0, 0, 0.0)
|
||||||
|
),
|
||||||
|
url('/static/assets/images/main_img.webp');
|
||||||
|
-webkit-filter: blur(7px);
|
||||||
|
-moz-filter: blur(7px);
|
||||||
|
-o-filter: blur(7px);
|
||||||
|
-ms-filter: blur(7px);
|
||||||
|
filter: blur(7px);
|
||||||
|
|
||||||
|
/* Center and scale the image nicely */
|
||||||
|
background-position: center;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-size: cover;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<!-- Current theme and more -->
|
||||||
|
${helmet.link.toString()}
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body ${helmet.bodyAttributes.toString()}>
|
||||||
|
<div id='root'>${root}</div>
|
||||||
|
<script defer src='/static/js/client.js'></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
`);
|
||||||
|
});
|
||||||
|
|
||||||
|
server.listen(port, () => {
|
||||||
|
console.log(`http://localhost:${port}`);
|
||||||
|
});
|
||||||
|
|
||||||
|
process.on("SIGINT", () => {
|
||||||
|
console.info("Interrupted");
|
||||||
|
process.exit(0);
|
||||||
|
});
|
50
src/shared/components/app-details.tsx
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
import { Component } from "inferno";
|
||||||
|
import { Icon } from "./icon";
|
||||||
|
|
||||||
|
interface AppDetailsProps {
|
||||||
|
name: string;
|
||||||
|
description: string;
|
||||||
|
link: string;
|
||||||
|
icon?: string;
|
||||||
|
banner?: string;
|
||||||
|
links: AppLink[];
|
||||||
|
}
|
||||||
|
|
||||||
|
interface AppLink {
|
||||||
|
link: string;
|
||||||
|
icon: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class AppDetails extends Component<AppDetailsProps, any> {
|
||||||
|
constructor(props: any, context: any) {
|
||||||
|
super(props, context);
|
||||||
|
}
|
||||||
|
render() {
|
||||||
|
let p = this.props;
|
||||||
|
let icon = p.icon || "/static/assets/images/lemmy.svg";
|
||||||
|
let banner = p.banner || "/static/assets/images/lemmy.svg";
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<header class="is-center">
|
||||||
|
<img class="app-icon" src={icon} />
|
||||||
|
<h4>
|
||||||
|
<a href={p.link}>{p.name}</a>
|
||||||
|
</h4>
|
||||||
|
</header>
|
||||||
|
<div class="is-center">
|
||||||
|
<img class="app-banner" src={banner} />
|
||||||
|
</div>
|
||||||
|
<br />
|
||||||
|
<p class="is-center">{p.description}</p>
|
||||||
|
<footer class="is-center">
|
||||||
|
{p.links.map(l => (
|
||||||
|
<a class="button primary" href={l.link}>
|
||||||
|
<Icon icon={l.icon} />
|
||||||
|
</a>
|
||||||
|
))}
|
||||||
|
</footer>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
36
src/shared/components/app.tsx
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
import { Component } from "inferno";
|
||||||
|
import { Route, Switch } from "inferno-router";
|
||||||
|
import { routes } from "../routes";
|
||||||
|
import { NoMatch } from "./no-match";
|
||||||
|
import { Symbols } from "./symbols";
|
||||||
|
import { Navbar } from "./navbar";
|
||||||
|
import { Footer } from "./footer";
|
||||||
|
import "./styles.scss";
|
||||||
|
|
||||||
|
export class App extends Component<any, any> {
|
||||||
|
constructor(props: any, context: any) {
|
||||||
|
super(props, context);
|
||||||
|
}
|
||||||
|
render() {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<div>
|
||||||
|
<Navbar />
|
||||||
|
<Switch>
|
||||||
|
{routes.map(({ path, exact, component: C, ...rest }) => (
|
||||||
|
<Route
|
||||||
|
key={path}
|
||||||
|
path={path}
|
||||||
|
exact={exact}
|
||||||
|
render={props => <C {...props} {...rest} />}
|
||||||
|
/>
|
||||||
|
))}
|
||||||
|
<Route render={props => <NoMatch {...props} />} />
|
||||||
|
</Switch>
|
||||||
|
<Footer />
|
||||||
|
<Symbols />
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
122
src/shared/components/apps.tsx
Normal file
|
@ -0,0 +1,122 @@
|
||||||
|
import { Component } from "inferno";
|
||||||
|
import { AppDetails } from "./app-details";
|
||||||
|
import { Helmet } from "inferno-helmet";
|
||||||
|
|
||||||
|
const title = "Lemmy - Apps and Libraries";
|
||||||
|
|
||||||
|
export class Apps extends Component<any, any> {
|
||||||
|
constructor(props: any, context: any) {
|
||||||
|
super(props, context);
|
||||||
|
}
|
||||||
|
render() {
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<Helmet title={title}>
|
||||||
|
<meta property={"title"} content={title} />
|
||||||
|
</Helmet>
|
||||||
|
<div class="container">
|
||||||
|
<h1>Lemmy Apps</h1>
|
||||||
|
<p>Choose from any of the apps below.</p>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="card col-6">
|
||||||
|
<AppDetails
|
||||||
|
name="lemmur"
|
||||||
|
description="A Lemmy client for Android, Linux, and Windows."
|
||||||
|
link="https://github.com/krawieck/lemmur"
|
||||||
|
icon="/static/assets/images/lemmur.svg"
|
||||||
|
banner="/static/assets/images/lemmur_screen.webp"
|
||||||
|
links={[
|
||||||
|
{
|
||||||
|
link: "https://f-droid.org/packages/com.krawieck.lemmur",
|
||||||
|
icon: "f-droid",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
link:
|
||||||
|
"https://play.google.com/store/apps/details?id=com.krawieck.lemmur",
|
||||||
|
icon: "googleplay",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
link: "https://github.com/krawieck/lemmur",
|
||||||
|
icon: "github",
|
||||||
|
},
|
||||||
|
]}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card col-6">
|
||||||
|
<AppDetails
|
||||||
|
name="remmel"
|
||||||
|
description="An iOS client for lemmy."
|
||||||
|
link="https://github.com/uuttff8/Lemmy-iOS"
|
||||||
|
icon="/static/assets/images/remmel.webp"
|
||||||
|
banner="/static/assets/images/remmel_screen.webp"
|
||||||
|
links={[
|
||||||
|
{
|
||||||
|
link:
|
||||||
|
"https://apps.apple.com/us/app/remmel-for-lemmy/id1547988171",
|
||||||
|
icon: "appleinc",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
link: "https://github.com/uuttff8/Lemmy-iOS",
|
||||||
|
icon: "github",
|
||||||
|
},
|
||||||
|
]}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h1>Web Apps</h1>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="card col-6">
|
||||||
|
<AppDetails
|
||||||
|
name="lemmy-ui"
|
||||||
|
description="The official web app for lemmy."
|
||||||
|
link="https://github.com/LemmyNet/lemmy-ui"
|
||||||
|
banner="/static/assets/images/mobile_pic.webp"
|
||||||
|
links={[
|
||||||
|
{
|
||||||
|
link: "https://github.com/LemmyNet/lemmy-ui",
|
||||||
|
icon: "github",
|
||||||
|
},
|
||||||
|
]}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card col-6">
|
||||||
|
<AppDetails
|
||||||
|
name="lemmy-lite"
|
||||||
|
description="A static, JSless, touch-friendly Lemmy frontend built for legacy web clients and maximum performance"
|
||||||
|
link="https://github.com/IronOxidizer/lemmy-lite"
|
||||||
|
banner="/static/assets/images/lemmy_lite_screen.webp"
|
||||||
|
links={[
|
||||||
|
{
|
||||||
|
link: "https://github.com/IronOxidizer/lemmy-lite",
|
||||||
|
icon: "github",
|
||||||
|
},
|
||||||
|
]}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h1>Lemmy API Libraries</h1>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<a href="https://github.com/LemmyNet/lemmy-js-client">
|
||||||
|
lemmy-js-client
|
||||||
|
</a>{" "}
|
||||||
|
- a javascript / typescript client.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="https://github.com/krawieck/lemmy_api_client">
|
||||||
|
lemmy-dart client
|
||||||
|
</a>{" "}
|
||||||
|
- a dart / flutter client.
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
80
src/shared/components/contact.tsx
Normal file
|
@ -0,0 +1,80 @@
|
||||||
|
import { Component } from "inferno";
|
||||||
|
import { Helmet } from "inferno-helmet";
|
||||||
|
|
||||||
|
const title = "Lemmy - Contact";
|
||||||
|
|
||||||
|
export class Contact extends Component<any, any> {
|
||||||
|
constructor(props: any, context: any) {
|
||||||
|
super(props, context);
|
||||||
|
}
|
||||||
|
render() {
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<Helmet title={title}>
|
||||||
|
<meta property={"title"} content={title} />
|
||||||
|
</Helmet>
|
||||||
|
<div class="container">
|
||||||
|
<h1>Contact</h1>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<a href="https://mastodon.social/@LemmyDev">Mastodon</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="https://matrix.to/#/#lemmy:matrix.org">Matrix</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="https://github.com/LemmyNet/lemmy">GitHub</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="mailto:security@lemmy.ml">security@lemmy.ml</a>{" "}
|
||||||
|
<em>PGP key below</em>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<pre>
|
||||||
|
<code>
|
||||||
|
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||||
|
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
|
||||||
|
RnELNHhlJZ4s =VWLX -----END PGP PUBLIC KEY BLOCK-----
|
||||||
|
</code>
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
39
src/shared/components/donate-lines.tsx
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
import { Component } from "inferno";
|
||||||
|
|
||||||
|
export class DonateLines extends Component<any, any> {
|
||||||
|
constructor(props: any, context: any) {
|
||||||
|
super(props, context);
|
||||||
|
}
|
||||||
|
render() {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<p>
|
||||||
|
Lemmy is free, open-source software, meaning no advertising,
|
||||||
|
monetizing, or venture capital, ever.{" "}
|
||||||
|
<a href="/sponsors">Your donations</a> directly support full-time
|
||||||
|
development of the project.
|
||||||
|
</p>
|
||||||
|
<div class="row is-horizontal-align">
|
||||||
|
<div class="col-3">
|
||||||
|
<a class="button primary" href="https://liberapay.com/Lemmy">
|
||||||
|
Support on Liberapay
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div class="col-3">
|
||||||
|
<a class="button primary" href="https://www.patreon.com/dessalines">
|
||||||
|
Support on Patreon
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div class="col-3">
|
||||||
|
<a
|
||||||
|
class="col button primary"
|
||||||
|
href="https://opencollective.com/lemmy"
|
||||||
|
>
|
||||||
|
Support on OpenCollective
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
36
src/shared/components/footer.tsx
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
import { Component } from "inferno";
|
||||||
|
import { LinkLine } from "./link-line";
|
||||||
|
|
||||||
|
export class Footer extends Component<any, any> {
|
||||||
|
constructor(props: any, context: any) {
|
||||||
|
super(props, context);
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
return (
|
||||||
|
<footer>
|
||||||
|
<br />
|
||||||
|
<nav class="nav">
|
||||||
|
<div class="nav-left">
|
||||||
|
<p style="padding-left: 2rem">
|
||||||
|
Made with
|
||||||
|
<a style="display: inline-block" href="https://infernojs.org">
|
||||||
|
Inferno
|
||||||
|
</a>
|
||||||
|
and
|
||||||
|
<a
|
||||||
|
style="display: inline-block"
|
||||||
|
href="https://jenil.github.io/chota"
|
||||||
|
>
|
||||||
|
Chota
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div class="nav-right hide-sm hide-md hide-lg">
|
||||||
|
<LinkLine />
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
</footer>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
31
src/shared/components/icon.tsx
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
import { Component } from "inferno";
|
||||||
|
|
||||||
|
interface IconProps {
|
||||||
|
icon: string;
|
||||||
|
classes?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class Icon extends Component<IconProps, any> {
|
||||||
|
constructor(props: any, context: any) {
|
||||||
|
super(props, context);
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
return (
|
||||||
|
<svg class={`icon ${this.props.classes}`}>
|
||||||
|
<title>{this.props.icon}</title>
|
||||||
|
<use xlinkHref={`#icon-${this.props.icon}`}></use>
|
||||||
|
</svg>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export class Spinner extends Component<any, any> {
|
||||||
|
constructor(props: any, context: any) {
|
||||||
|
super(props, context);
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
return <Icon icon="spinner" classes="icon-spinner spin" />;
|
||||||
|
}
|
||||||
|
}
|
338
src/shared/components/join.tsx
Normal file
|
@ -0,0 +1,338 @@
|
||||||
|
import { Component } from "inferno";
|
||||||
|
import { Helmet } from "inferno-helmet";
|
||||||
|
|
||||||
|
const title = "Lemmy - Join a Server";
|
||||||
|
|
||||||
|
// TODO wait until new lemmy-instances is written to refactor this
|
||||||
|
|
||||||
|
export class Join extends Component<any, any> {
|
||||||
|
constructor(props: any, context: any) {
|
||||||
|
super(props, context);
|
||||||
|
}
|
||||||
|
render() {
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<Helmet title={title}>
|
||||||
|
<meta property={"title"} content={title} />
|
||||||
|
</Helmet>
|
||||||
|
<div class="container">
|
||||||
|
<h1>Lemmy servers</h1>
|
||||||
|
<p>Choose and join a server from the approved servers below.</p>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="card col-6">
|
||||||
|
<header>
|
||||||
|
<div class="row">
|
||||||
|
<h4 class="col">lemmy.ml</h4>
|
||||||
|
<h4 class="col text-right">
|
||||||
|
<i>5.9k users</i>
|
||||||
|
</h4>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
<div class="is-center">
|
||||||
|
<img
|
||||||
|
class="join-banner"
|
||||||
|
src="/static/assets/images/lemmy.svg"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<br />
|
||||||
|
<p class="join-desc">The flagship instance of lemmy.</p>
|
||||||
|
<footer>
|
||||||
|
<a class="button primary" href="https://lemmy.ml">
|
||||||
|
Join
|
||||||
|
</a>
|
||||||
|
</footer>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card col-6">
|
||||||
|
<header>
|
||||||
|
<div class="row">
|
||||||
|
<h4 class="col">lemmygrad.ml</h4>
|
||||||
|
<h4 class="col text-right">
|
||||||
|
<i>2.3k users</i>
|
||||||
|
</h4>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
<div class="is-center">
|
||||||
|
<img
|
||||||
|
class="join-banner"
|
||||||
|
src="https://lemmygrad.ml/pictrs/image/YI2XNWaVUv.png?format=webp"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<br />
|
||||||
|
<p class="join-desc">
|
||||||
|
A collection of leftist communities, for memes, learning, news,
|
||||||
|
discussion, media, or anything you like.
|
||||||
|
</p>
|
||||||
|
<footer>
|
||||||
|
<a class="button primary" href="https://lemmygrad.ml">
|
||||||
|
Join
|
||||||
|
</a>
|
||||||
|
</footer>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card col-6">
|
||||||
|
<header>
|
||||||
|
<div class="row">
|
||||||
|
<h4 class="col">lemmy.161.social</h4>
|
||||||
|
<h4 class="col text-right">
|
||||||
|
<i>50 users</i>
|
||||||
|
</h4>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
<div class="is-center">
|
||||||
|
<img
|
||||||
|
class="join-banner"
|
||||||
|
src="https://lemmy.161.social/pictrs/image/n3Stw3I1g0.png?format=webp"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<br />
|
||||||
|
<p class="join-desc">
|
||||||
|
An anti-authoritarian and emancipatory space for german speaking
|
||||||
|
anti-fascists.
|
||||||
|
</p>
|
||||||
|
<footer>
|
||||||
|
<a class="button primary" href="https://lemmy.161.social">
|
||||||
|
Join
|
||||||
|
</a>
|
||||||
|
</footer>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card col-6">
|
||||||
|
<header>
|
||||||
|
<div class="row">
|
||||||
|
<h4 class="col">baraza.africa</h4>
|
||||||
|
<h4 class="col text-right">
|
||||||
|
<i>20 users</i>
|
||||||
|
</h4>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
<div class="is-center">
|
||||||
|
<img
|
||||||
|
class="join-banner"
|
||||||
|
src="/static/assets/images/lemmy.svg"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<br />
|
||||||
|
<p class="join-desc">
|
||||||
|
baraza is a digital public square as imagined in Bantu
|
||||||
|
philosophy, one premised on the assumption that deliberative
|
||||||
|
dialogue is a path to better societies.
|
||||||
|
</p>
|
||||||
|
<footer>
|
||||||
|
<a class="button primary" href="https://baraza.africa">
|
||||||
|
Join
|
||||||
|
</a>
|
||||||
|
</footer>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card col-6">
|
||||||
|
<header>
|
||||||
|
<div class="row">
|
||||||
|
<h4 class="col">lemmy.glasgow.social</h4>
|
||||||
|
<h4 class="col text-right">
|
||||||
|
<i>60 users</i>
|
||||||
|
</h4>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
<div class="is-center">
|
||||||
|
<img
|
||||||
|
class="join-banner"
|
||||||
|
src="https://glasgow.social/system/site_uploads/files/000/000/001/original/fuller_street1_sq.jpg?1579523706"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<br />
|
||||||
|
<p class="join-desc">
|
||||||
|
A place for communities in and around Glasgow, Scotland.
|
||||||
|
</p>
|
||||||
|
<footer>
|
||||||
|
<a class="button primary" href="https://lemmy.glasgow.social">
|
||||||
|
Join
|
||||||
|
</a>
|
||||||
|
</footer>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card col-6">
|
||||||
|
<header>
|
||||||
|
<div class="row">
|
||||||
|
<h4 class="col">lemmy.cat</h4>
|
||||||
|
<h4 class="col text-right">
|
||||||
|
<i>30 users</i>
|
||||||
|
</h4>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
<div class="is-center">
|
||||||
|
<img
|
||||||
|
class="join-banner"
|
||||||
|
src="https://lemmy.cat/pictrs/image/p63LCl9dD2.jpg?format=webp&thumbnail=3000"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<br />
|
||||||
|
<p class="join-desc">
|
||||||
|
A Lemmy instance for people of Catalan culture.
|
||||||
|
</p>
|
||||||
|
<footer>
|
||||||
|
<a class="button primary" href="https://lemmy.cat">
|
||||||
|
Join
|
||||||
|
</a>
|
||||||
|
</footer>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card col-6">
|
||||||
|
<header>
|
||||||
|
<div class="row">
|
||||||
|
<h4 class="col">lemmy.ca</h4>
|
||||||
|
<h4 class="col text-right">
|
||||||
|
<i>11 users</i>
|
||||||
|
</h4>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
<div class="is-center">
|
||||||
|
<img
|
||||||
|
class="join-banner"
|
||||||
|
src="https://lemmy.ca/pictrs/image/YMyO670EYs.png?format=webp&thumbnail=3000"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<br />
|
||||||
|
<p class="join-desc">
|
||||||
|
A Lemmy geared toward Canucks, hosted in Canuckistan, and run by
|
||||||
|
a Canuck.
|
||||||
|
</p>
|
||||||
|
<footer>
|
||||||
|
<a class="button primary" href="https://lemmy.ca">
|
||||||
|
Join
|
||||||
|
</a>
|
||||||
|
</footer>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card col-6">
|
||||||
|
<header>
|
||||||
|
<div class="row">
|
||||||
|
<h4 class="col">lemmy.eus</h4>
|
||||||
|
<h4 class="col text-right">
|
||||||
|
<i>100 users</i>
|
||||||
|
</h4>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
<div class="is-center">
|
||||||
|
<img
|
||||||
|
class="join-banner"
|
||||||
|
src="/static/assets/images/lemmy.svg"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<br />
|
||||||
|
<p class="join-desc">A Basque Lemmy instance.</p>
|
||||||
|
<footer>
|
||||||
|
<a class="button primary" href="https://lemmy.eus">
|
||||||
|
Join
|
||||||
|
</a>
|
||||||
|
</footer>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card col-6">
|
||||||
|
<header>
|
||||||
|
<div class="row">
|
||||||
|
<h4 class="col">sopuli.xyz</h4>
|
||||||
|
<h4 class="col text-right">
|
||||||
|
<i>10 users</i>
|
||||||
|
</h4>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
<div class="is-center">
|
||||||
|
<img
|
||||||
|
class="join-banner"
|
||||||
|
src="https://sopuli.xyz/pictrs/image/RmuyRzuchU.png?format=webp&thumbnail=3000"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<br />
|
||||||
|
<p class="join-desc">A general-purpose Finnish instance.</p>
|
||||||
|
<footer>
|
||||||
|
<a class="button primary" href="https://sopuli.xyz">
|
||||||
|
Join
|
||||||
|
</a>
|
||||||
|
</footer>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card col-6">
|
||||||
|
<header>
|
||||||
|
<div class="row">
|
||||||
|
<h4 class="col">stammtisch.hallertau.social</h4>
|
||||||
|
<h4 class="col text-right">
|
||||||
|
<i>~10 users</i>
|
||||||
|
</h4>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
<div class="is-center">
|
||||||
|
<img
|
||||||
|
class="join-banner"
|
||||||
|
src="https://stammtisch.hallertau.social/pictrs/image/TbUbi4vFwZ.jpg?format=webp&thumbnail=3000"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<br />
|
||||||
|
<p class="join-desc">Sitz de hera, samma mehra.</p>
|
||||||
|
<footer>
|
||||||
|
<a
|
||||||
|
class="button primary"
|
||||||
|
href="https://stammtisch.hallertau.social"
|
||||||
|
>
|
||||||
|
Join
|
||||||
|
</a>
|
||||||
|
</footer>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card col-6">
|
||||||
|
<header>
|
||||||
|
<div class="row">
|
||||||
|
<h4 class="col">szmer.info</h4>
|
||||||
|
<h4 class="col text-right">
|
||||||
|
<i>300 users</i>
|
||||||
|
</h4>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
<div class="is-center">
|
||||||
|
<img
|
||||||
|
class="join-banner"
|
||||||
|
src="/static/assets/images/lemmy.svg"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<br />
|
||||||
|
<p class="join-desc">A polish anti-fascist instance.</p>
|
||||||
|
<footer>
|
||||||
|
<a class="button primary" href="https://szmer.info">
|
||||||
|
Join
|
||||||
|
</a>
|
||||||
|
</footer>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card col-6">
|
||||||
|
<header>
|
||||||
|
<div class="row">
|
||||||
|
<h4 class="col">diversa.social</h4>
|
||||||
|
<h4 class="col text-right">
|
||||||
|
<i>~ 10 users</i>
|
||||||
|
</h4>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
<div class="is-center">
|
||||||
|
<img
|
||||||
|
class="join-banner"
|
||||||
|
src="https://diversa.social/pictrs/image/Slw1Nu62Gm.png?format=webp&thumbnail=3000"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<br />
|
||||||
|
<p class="join-desc">
|
||||||
|
Instancia multitemática en español con un enfoque constructivo y
|
||||||
|
solidario.
|
||||||
|
</p>
|
||||||
|
<footer>
|
||||||
|
<a class="button primary" href="https://diversa.social">
|
||||||
|
Join
|
||||||
|
</a>
|
||||||
|
</footer>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
22
src/shared/components/link-line.tsx
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
import { Component } from "inferno";
|
||||||
|
import { Link } from "inferno-router";
|
||||||
|
|
||||||
|
export class LinkLine extends Component<any, any> {
|
||||||
|
constructor(props: any, context: any) {
|
||||||
|
super(props, context);
|
||||||
|
}
|
||||||
|
render() {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<Link to="/join">Join</Link>
|
||||||
|
<Link to="/apps">Apps</Link>
|
||||||
|
<Link to="/sponsors">Sponsors</Link>
|
||||||
|
<a href="/docs/en/index.html">Docs</a>
|
||||||
|
<a href="/docs/en/code_of_conduct.html" title="Code of Conduct">
|
||||||
|
CoC
|
||||||
|
</a>
|
||||||
|
<Link to="/contact">Contact</Link>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
256
src/shared/components/main.tsx
Normal file
|
@ -0,0 +1,256 @@
|
||||||
|
import { Component } from "inferno";
|
||||||
|
import { Link } from "inferno-router";
|
||||||
|
import { Helmet } from "inferno-helmet";
|
||||||
|
import { DonateLines } from "./donate-lines";
|
||||||
|
|
||||||
|
const title = "Lemmy - A link aggregator for the fediverse";
|
||||||
|
|
||||||
|
export class Main extends Component<any, any> {
|
||||||
|
constructor(props: any, context: any) {
|
||||||
|
super(props, context);
|
||||||
|
}
|
||||||
|
|
||||||
|
joinServer() {
|
||||||
|
return (
|
||||||
|
<Link className="button primary" to="/join">
|
||||||
|
Join a Server
|
||||||
|
</Link>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
runServer() {
|
||||||
|
return (
|
||||||
|
<a
|
||||||
|
class="button primary"
|
||||||
|
href="/docs/en/administration/administration.html"
|
||||||
|
>
|
||||||
|
Run a Server
|
||||||
|
</a>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<Helmet title={title}>
|
||||||
|
<meta property={"title"} content={title} />
|
||||||
|
</Helmet>
|
||||||
|
<div class="bg-image"></div>
|
||||||
|
<div class="container">
|
||||||
|
<div class="text-center">
|
||||||
|
<h1 class="stylized">Lemmy</h1>
|
||||||
|
<h4>A link aggregator for the fediverse.</h4>
|
||||||
|
<div class="row is-horizontal-align">
|
||||||
|
<div class="col-2-lg">{this.joinServer()}</div>
|
||||||
|
<div class="col-2-lg">{this.runServer()}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<br />
|
||||||
|
|
||||||
|
<div class="container">
|
||||||
|
<div class="text-center">
|
||||||
|
<h2>Follow communities anywhere in the world</h2>
|
||||||
|
<p>
|
||||||
|
<a href="https://github.com/LemmyNet">Lemmy</a> is similar to
|
||||||
|
sites like <a href="https://reddit.com">Reddit</a>,{" "}
|
||||||
|
<a href="https://lobste.rs">Lobste.rs</a>, or{" "}
|
||||||
|
<a href="https://news.ycombinator.com/">Hacker News</a>: you
|
||||||
|
subscribe to communities you're interested in, post links and
|
||||||
|
discussions, then vote and comment on them. Lemmy isn't just a
|
||||||
|
reddit alternative; its a network of interconnected communities
|
||||||
|
ran by different people and organizations, all combining to create{" "}
|
||||||
|
<b>a single, personalized front page</b> of your favorite news,
|
||||||
|
articles, and memes.{" "}
|
||||||
|
</p>
|
||||||
|
<p>{this.joinServer()}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<br />
|
||||||
|
|
||||||
|
<div class="bg-success">
|
||||||
|
<br />
|
||||||
|
|
||||||
|
<div class="container">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-4">
|
||||||
|
<div>
|
||||||
|
<header class="is-center">
|
||||||
|
<img
|
||||||
|
height={180}
|
||||||
|
src="/static/assets/images/review_pic.webp"
|
||||||
|
/>
|
||||||
|
</header>
|
||||||
|
<br />
|
||||||
|
<h4 class="text-center">Open Source</h4>
|
||||||
|
<p>
|
||||||
|
Lemmy is and will always remain free,{" "}
|
||||||
|
<a href="https://github.com/LemmyNet">open source</a>{" "}
|
||||||
|
software, using the strong{" "}
|
||||||
|
<a href="https://en.wikipedia.org/wiki/Copyleft">
|
||||||
|
copyleft
|
||||||
|
</a>{" "}
|
||||||
|
<a href="https://github.com/LemmyNet/lemmy/blob/master/LICENSE">
|
||||||
|
AGPL License
|
||||||
|
</a>
|
||||||
|
.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-4">
|
||||||
|
<div>
|
||||||
|
<header class="is-center">
|
||||||
|
<img
|
||||||
|
height={180}
|
||||||
|
src="/static/assets/images/code_pic.webp"
|
||||||
|
/>
|
||||||
|
</header>
|
||||||
|
<br />
|
||||||
|
<h4 class="text-center">Blazing Fast</h4>
|
||||||
|
<p>
|
||||||
|
Made using some of the fastest frameworks and tools,
|
||||||
|
including <a href="https://www.rust-lang.org">Rust</a>,{" "}
|
||||||
|
<a href="https://actix.rs/">Actix</a>,{" "}
|
||||||
|
<a href="http://diesel.rs/">Diesel</a>,{" "}
|
||||||
|
<a href="https://infernojs.org">Inferno</a>, and{" "}
|
||||||
|
<a href="https://www.typescriptlang.org/">Typescript</a>.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-4">
|
||||||
|
<div>
|
||||||
|
<header class="is-center">
|
||||||
|
<img
|
||||||
|
height={180}
|
||||||
|
src="/static/assets/images/mod_pic.webp"
|
||||||
|
/>
|
||||||
|
</header>
|
||||||
|
<br />
|
||||||
|
<h4 class="text-center">Powerful Mod Tools</h4>
|
||||||
|
<p>
|
||||||
|
Each server can set its own moderation policy, to help
|
||||||
|
foster a healthy environment where all can feel comfortable
|
||||||
|
contributing.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
|
||||||
|
<div class="container">
|
||||||
|
<div class="text-center">
|
||||||
|
<h2>Create your own discussion platform</h2>
|
||||||
|
<p>
|
||||||
|
With Lemmy, you can{" "}
|
||||||
|
<a href="/docs/en/administration/administration.html">
|
||||||
|
easily host your own server
|
||||||
|
</a>
|
||||||
|
, and all these servers are <i>federated</i> (think email), and
|
||||||
|
connected to the same universe, called the{" "}
|
||||||
|
<a href="https://en.wikipedia.org/wiki/Fediverse">Fediverse</a>.
|
||||||
|
For a link aggregator, this means that someone registered on one
|
||||||
|
server can subscribe to communities elsewhere, and can have
|
||||||
|
discussions with people on a completely different server.
|
||||||
|
</p>
|
||||||
|
<p>{this.runServer()}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<br />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<br />
|
||||||
|
|
||||||
|
<div class="container">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-6">
|
||||||
|
<h4>Live Updates</h4>
|
||||||
|
<p>
|
||||||
|
New comments and posts stream in to your front page and inbox;
|
||||||
|
No more page refreshes required.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div class="col-6 is-center">
|
||||||
|
<video height={325} autoPlay loop>
|
||||||
|
<source src="/static/assets/images/reply_vid.webm" />
|
||||||
|
</video>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
|
||||||
|
<div class="container">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-6 is-center">
|
||||||
|
<img height={325} src="/static/assets/images/mobile_pic.webp" />
|
||||||
|
</div>
|
||||||
|
<div class="col-6">
|
||||||
|
<h4 class="is-marginless">More Features</h4>
|
||||||
|
<ul class="is-marginless">
|
||||||
|
<li>
|
||||||
|
Self hostable, easy to deploy, via{" "}
|
||||||
|
<a href="/docs/en/administration/install_docker.html">
|
||||||
|
Docker
|
||||||
|
</a>
|
||||||
|
, or{" "}
|
||||||
|
<a href="/docs/en/administration/install_ansible.html">
|
||||||
|
Ansible
|
||||||
|
</a>
|
||||||
|
.
|
||||||
|
</li>
|
||||||
|
<li>Clean, mobile-friendly interface.</li>
|
||||||
|
<li>User avatar support.</li>
|
||||||
|
<li>
|
||||||
|
Full vote scores <code>(+/-)</code> like old Reddit.
|
||||||
|
</li>
|
||||||
|
<li>Themes, including light, dark, and solarized.</li>
|
||||||
|
<li>
|
||||||
|
Emojis with autocomplete support. Start typing <code>:</code>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
User tagging using <code>@</code>, Community tagging using{" "}
|
||||||
|
<code>!</code>.
|
||||||
|
</li>
|
||||||
|
<li>Integrated image uploading in both posts and comments.</li>
|
||||||
|
<li>Notifications, including via email.</li>
|
||||||
|
<li>
|
||||||
|
<a href="https://weblate.yerbamate.ml/projects/lemmy/lemmy/">
|
||||||
|
i18n / internationalization support for > 30 languages.
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
RSS / Atom feeds for <code>All</code>, <code>Subscribed</code>
|
||||||
|
, <code>Inbox</code>, <code>User</code>, and{" "}
|
||||||
|
<code>Community</code>.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Can fully erase your data, replacing all posts and comments.
|
||||||
|
</li>
|
||||||
|
<li>NSFW post / community support.</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<br />
|
||||||
|
<div class="bg-success">
|
||||||
|
<br />
|
||||||
|
<div class="container">
|
||||||
|
<div class="text-center">
|
||||||
|
<h2>
|
||||||
|
<a href="/sponsors">Support / Donate</a>
|
||||||
|
</h2>
|
||||||
|
<DonateLines />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<br />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
47
src/shared/components/navbar.tsx
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
import { Component } from "inferno";
|
||||||
|
import { Link } from "inferno-router";
|
||||||
|
import { LinkLine } from "./link-line";
|
||||||
|
import { Icon } from "./icon";
|
||||||
|
|
||||||
|
export class Navbar extends Component<any, any> {
|
||||||
|
constructor(props: any, context: any) {
|
||||||
|
super(props, context);
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<nav class="nav hide-xs">
|
||||||
|
<div class="nav-left">
|
||||||
|
<Link className="brand" to="/">
|
||||||
|
<img
|
||||||
|
src="/static/assets/images/lemmy.svg"
|
||||||
|
height="32"
|
||||||
|
width="32"
|
||||||
|
/>
|
||||||
|
</Link>
|
||||||
|
<LinkLine />
|
||||||
|
</div>
|
||||||
|
<div class="nav-right">
|
||||||
|
<a href="https://github.com/LemmyNet">
|
||||||
|
<Icon icon="github" />
|
||||||
|
</a>
|
||||||
|
<a href="https://mastodon.social/@LemmyDev">
|
||||||
|
<Icon icon="mastodon" />
|
||||||
|
</a>
|
||||||
|
<a href="https://matrix.to/#/#lemmy:matrix.org">
|
||||||
|
<Icon icon="matrix" />
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
<nav class="nav hide-sm hide-md hide-lg">
|
||||||
|
<div class="nav-center">
|
||||||
|
<Link className="brand" to="/">
|
||||||
|
<img src="/static/assets/images/lemmy.svg" />
|
||||||
|
</Link>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
15
src/shared/components/no-match.tsx
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
import { Component } from "inferno";
|
||||||
|
|
||||||
|
export class NoMatch extends Component<any, any> {
|
||||||
|
constructor(props: any, context: any) {
|
||||||
|
super(props, context);
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
return (
|
||||||
|
<div class="container">
|
||||||
|
<h1>404</h1>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
106
src/shared/components/sponsors.tsx
Normal file
|
@ -0,0 +1,106 @@
|
||||||
|
import { Component } from "inferno";
|
||||||
|
import { Helmet } from "inferno-helmet";
|
||||||
|
import { DonateLines } from "./donate-lines";
|
||||||
|
|
||||||
|
const title = "Lemmy - Sponsors";
|
||||||
|
|
||||||
|
interface LinkedSponsor {
|
||||||
|
name: string;
|
||||||
|
link: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
let silverSponsors: LinkedSponsor[] = [
|
||||||
|
{ name: "RedJoker", link: "https://iww.org" },
|
||||||
|
];
|
||||||
|
let highlightedSponsors = ["DQW", "Alex Benishek"];
|
||||||
|
let sponsors = [
|
||||||
|
"seahorse",
|
||||||
|
"Tommaso",
|
||||||
|
"Jamie Gray",
|
||||||
|
"Brendan",
|
||||||
|
"mexicanhalloween",
|
||||||
|
"William Moore",
|
||||||
|
"Rachel Schmitz",
|
||||||
|
"comradeda",
|
||||||
|
"Jonathan Cremin",
|
||||||
|
"Arthur Nieuwland",
|
||||||
|
"Forrest Weghorst",
|
||||||
|
"Andre Vallestero",
|
||||||
|
];
|
||||||
|
|
||||||
|
export class Sponsors extends Component<any, any> {
|
||||||
|
constructor(props: any, context: any) {
|
||||||
|
super(props, context);
|
||||||
|
}
|
||||||
|
render() {
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<Helmet title={title}>
|
||||||
|
<meta property={"title"} content={title} />
|
||||||
|
</Helmet>
|
||||||
|
<div class="container">
|
||||||
|
<div class="text-center">
|
||||||
|
<h1>Donate to Lemmy</h1>
|
||||||
|
<DonateLines />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<hr />
|
||||||
|
|
||||||
|
<div class="text-center">
|
||||||
|
<h2>Sponsors</h2>
|
||||||
|
<p>Silver Sponsors are those that pledged $40 to Lemmy.</p>
|
||||||
|
<div class="row is-horizontal-align">
|
||||||
|
{silverSponsors.map(s => (
|
||||||
|
<div class="col">
|
||||||
|
<a class="button outline primary" href={s.link}>
|
||||||
|
💎 {s.name}
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
<br />
|
||||||
|
<p>General Sponsors are those that pledged $10 to $39 to Lemmy.</p>
|
||||||
|
<div class="row is-horizontal-align">
|
||||||
|
{highlightedSponsors.map(s => (
|
||||||
|
<div class="col">
|
||||||
|
<div class="button outline primary">{s}</div>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
{sponsors.map(s => (
|
||||||
|
<div class="col">
|
||||||
|
<div class="button outline">{s}</div>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="text-center">
|
||||||
|
<h1>Crypto</h1>
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td>bitcoin</td>
|
||||||
|
<td>
|
||||||
|
<code>1Hefs7miXS5ff5Ck5xvmjKjXf5242KzRtK</code>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>ethereum</td>
|
||||||
|
<td>
|
||||||
|
<code>0x400c96c96acbC6E7B3B43B1dc1BB446540a88A01</code>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>monero</td>
|
||||||
|
<td>
|
||||||
|
<code>
|
||||||
|
41taVyY6e1xApqKyMVDRVxJ76sPkfZhALLTjRvVKpaAh2pBd4wv9RgYj1tSPrx8wc6iE1uWUfjtQdTmTy2FGMeChGVKPQuV
|
||||||
|
</code>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
2
src/shared/components/styles.scss
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
@import "../../../node_modules/chota/dist/chota.min.css";
|
||||||
|
@import "../../assets/css/main.css";
|
45
src/shared/components/symbols.tsx
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
import { Component } from "inferno";
|
||||||
|
|
||||||
|
export class Symbols extends Component<any, any> {
|
||||||
|
constructor(props: any, context: any) {
|
||||||
|
super(props, context);
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
return (
|
||||||
|
<svg
|
||||||
|
aria-hidden="true"
|
||||||
|
style={{
|
||||||
|
position: "absolute",
|
||||||
|
width: 0,
|
||||||
|
height: 0,
|
||||||
|
overflow: "hidden",
|
||||||
|
}}
|
||||||
|
version="1.1"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlnsXlink="http://www.w3.org/1999/xlink"
|
||||||
|
>
|
||||||
|
<defs>
|
||||||
|
<symbol id="icon-f-droid" viewBox="0 0 32 32">
|
||||||
|
<path d="M27.296 13.441h-22.592c-1.169 0-2.119 0.948-2.119 2.119v14.12c0 1.169 0.948 2.119 2.119 2.119h22.592c1.169 0 2.119-0.948 2.119-2.119v-14.12c0-1.171-0.949-2.119-2.119-2.119zM16 30.033c-4.088 0-7.413-3.325-7.413-7.413s3.325-7.413 7.413-7.413 7.413 3.325 7.413 7.413-3.325 7.413-7.413 7.413zM16 16.548c-3.348 0-6.072 2.724-6.072 6.072s2.724 6.072 6.072 6.072 6.072-2.724 6.072-6.072-2.724-6.072-6.072-6.072zM16 27.032c-2.084 0-3.841-1.471-4.295-3.424h2.227c0.367 0.775 1.145 1.305 2.068 1.305 1.28 0 2.295-1.015 2.295-2.295s-1.015-2.295-2.295-2.295c-0.865 0-1.6 0.469-1.991 1.165h-2.269c0.504-1.883 2.225-3.283 4.26-3.283 2.424 0 4.412 1.988 4.412 4.412 0 2.425-1.988 4.413-4.412 4.413zM31.799 0.528c-0.001 0.001-0.003 0.003-0.003 0.004-0.003-0.003-0.005-0.004-0.008-0.007 0.001-0.001 0.003-0.004 0.005-0.005-0.155-0.183-0.372-0.308-0.692-0.317-0.269 0.007-0.521 0.129-0.683 0.345l-2.424 3.137c-0.219-0.077-0.452-0.127-0.697-0.127h-22.593c-0.245 0-0.477 0.051-0.697 0.127l-2.424-3.139c-0.161-0.216-0.413-0.337-0.683-0.345-0.32 0.008-0.537 0.133-0.692 0.317 0.001 0.001 0.003 0.004 0.005 0.005-0.004 0.003-0.007 0.005-0.009 0.008 0-0.001-0.001-0.003-0.003-0.004-0.088 0.104-0.396 0.568-0.016 1.099l2.545 3.295c-0.089 0.235-0.144 0.488-0.144 0.755v4.943c0 1.169 0.948 2.119 2.119 2.119h22.592c1.169 0 2.119-0.948 2.119-2.119v-4.943c0-0.267-0.055-0.52-0.145-0.755l2.545-3.295c0.379-0.531 0.071-0.995-0.017-1.099zM9.205 10.971c-1.316 0-2.383-1.067-2.383-2.383s1.067-2.383 2.383-2.383 2.383 1.067 2.383 2.383-1.067 2.383-2.383 2.383zM22.972 10.971c-1.316 0-2.383-1.067-2.383-2.383s1.067-2.383 2.383-2.383 2.383 1.067 2.383 2.383-1.067 2.383-2.383 2.383z"></path>
|
||||||
|
</symbol>
|
||||||
|
<symbol id="icon-googleplay" viewBox="0 0 32 32">
|
||||||
|
<path d="M1.627 0c-0.040 0.124-0.080 0.247-0.080 0.411v30.972c0 0.289 0.081 0.453 0.245 0.617l15.22-16.124zM18.039 16.944l3.935 4.060-5.617 3.2c0 0-7.14 4.059-11.077 6.319zM19.107 15.836l4.221 4.389c0.661-0.368 5.828-3.323 6.565-3.733 0.779-0.451 0.7-1.067 0.039-1.395-0.612-0.34-5.779-3.3-6.56-3.78l-4.271 4.523zM18.036 14.769l3.979-4.225-5.679-3.241c0 0-9.257-5.296-12.337-7.064l14.040 14.531z"></path>
|
||||||
|
</symbol>
|
||||||
|
<symbol id="icon-appleinc" viewBox="0 0 32 32">
|
||||||
|
<path d="M24.734 17.003c-0.040-4.053 3.305-5.996 3.454-6.093-1.88-2.751-4.808-3.127-5.851-3.171-2.492-0.252-4.862 1.467-6.127 1.467-1.261 0-3.213-1.43-5.28-1.392-2.716 0.040-5.221 1.579-6.619 4.012-2.822 4.897-0.723 12.151 2.028 16.123 1.344 1.944 2.947 4.127 5.051 4.049 2.026-0.081 2.793-1.311 5.242-1.311s3.138 1.311 5.283 1.271c2.18-0.041 3.562-1.981 4.897-3.931 1.543-2.255 2.179-4.439 2.216-4.551-0.048-0.022-4.252-1.632-4.294-6.473zM20.705 5.11c1.117-1.355 1.871-3.235 1.665-5.11-1.609 0.066-3.559 1.072-4.713 2.423-1.036 1.199-1.942 3.113-1.699 4.951 1.796 0.14 3.629-0.913 4.747-2.264z"></path>
|
||||||
|
</symbol>
|
||||||
|
<symbol id="icon-github" viewBox="0 0 32 32">
|
||||||
|
<path d="M16 0.395c-8.836 0-16 7.163-16 16 0 7.069 4.585 13.067 10.942 15.182 0.8 0.148 1.094-0.347 1.094-0.77 0-0.381-0.015-1.642-0.022-2.979-4.452 0.968-5.391-1.888-5.391-1.888-0.728-1.849-1.776-2.341-1.776-2.341-1.452-0.993 0.11-0.973 0.11-0.973 1.606 0.113 2.452 1.649 2.452 1.649 1.427 2.446 3.743 1.739 4.656 1.33 0.143-1.034 0.558-1.74 1.016-2.14-3.554-0.404-7.29-1.777-7.29-7.907 0-1.747 0.625-3.174 1.649-4.295-0.166-0.403-0.714-2.030 0.155-4.234 0 0 1.344-0.43 4.401 1.64 1.276-0.355 2.645-0.532 4.005-0.539 1.359 0.006 2.729 0.184 4.008 0.539 3.054-2.070 4.395-1.64 4.395-1.64 0.871 2.204 0.323 3.831 0.157 4.234 1.026 1.12 1.647 2.548 1.647 4.295 0 6.145-3.743 7.498-7.306 7.895 0.574 0.497 1.085 1.47 1.085 2.963 0 2.141-0.019 3.864-0.019 4.391 0 0.426 0.288 0.925 1.099 0.768 6.354-2.118 10.933-8.113 10.933-15.18 0-8.837-7.164-16-16-16z"></path>
|
||||||
|
</symbol>
|
||||||
|
<symbol id="icon-mastodon" viewBox="0 0 32 32">
|
||||||
|
<path d="M30.924 10.505c0-6.941-4.548-8.976-4.548-8.976-2.293-1.053-6.232-1.496-10.321-1.529h-0.101c-4.091 0.033-8.027 0.476-10.32 1.529 0 0-4.548 2.035-4.548 8.976 0 1.589-0.031 3.491 0.020 5.505 0.165 6.789 1.245 13.479 7.521 15.14 2.893 0.765 5.379 0.927 7.38 0.816 3.629-0.2 5.667-1.296 5.667-1.296l-0.12-2.633c0 0-2.593 0.817-5.505 0.719-2.887-0.099-5.932-0.311-6.399-3.855-0.041-0.29-0.064-0.626-0.064-0.967 0-0.009 0-0.018 0-0.028v0.001c0 0 2.833 0.693 6.423 0.857 2.195 0.1 4.253-0.129 6.344-0.377 4.009-0.479 7.5-2.949 7.939-5.207 0.689-3.553 0.633-8.676 0.633-8.676zM25.559 19.451h-3.329v-8.159c0-1.72-0.724-2.592-2.171-2.592-1.6 0-2.403 1.035-2.403 3.083v4.465h-3.311v-4.467c0-2.048-0.803-3.083-2.403-3.083-1.447 0-2.171 0.873-2.171 2.592v8.159h-3.329v-8.404c0-1.719 0.437-3.084 1.316-4.093 0.907-1.011 2.092-1.528 3.565-1.528 1.704 0 2.995 0.655 3.848 1.965l0.828 1.391 0.829-1.391c0.853-1.311 2.144-1.965 3.848-1.965 1.472 0 2.659 0.517 3.565 1.528 0.877 1.009 1.315 2.375 1.315 4.093z"></path>
|
||||||
|
</symbol>
|
||||||
|
<symbol id="icon-matrix" viewBox="0 0 32 32">
|
||||||
|
<path d="M0.843 0.733v30.533h2.197v0.733h-3.040v-32h3.040v0.733zM10.233 10.413v1.543h0.044c0.412-0.591 0.911-1.045 1.489-1.365 0.577-0.327 1.248-0.487 2-0.487 0.72 0 1.377 0.143 1.975 0.419 0.597 0.277 1.047 0.776 1.36 1.477 0.339-0.499 0.8-0.941 1.379-1.323 0.579-0.383 1.267-0.573 2.061-0.573 0.604 0 1.163 0.075 1.68 0.223 0.517 0.147 0.955 0.381 1.324 0.707 0.368 0.327 0.652 0.745 0.861 1.268 0.203 0.523 0.307 1.151 0.307 1.889v7.637h-3.132v-6.468c0-0.381-0.013-0.745-0.043-1.083-0.023-0.325-0.109-0.624-0.246-0.893l0.006 0.013c-0.136-0.253-0.335-0.456-0.577-0.594l-0.007-0.004c-0.259-0.147-0.609-0.221-1.047-0.221-0.443 0-0.8 0.085-1.071 0.252-0.267 0.166-0.483 0.39-0.635 0.656l-0.005 0.009c-0.153 0.268-0.261 0.581-0.306 0.915l-0.002 0.013c-0.049 0.313-0.078 0.676-0.080 1.044v6.36h-3.133v-6.4c0-0.339-0.005-0.671-0.024-1.003-0.012-0.333-0.081-0.647-0.197-0.936l0.007 0.019c-0.113-0.281-0.304-0.511-0.548-0.667l-0.006-0.003c-0.259-0.167-0.635-0.253-1.139-0.253-0.148 0-0.345 0.032-0.585 0.099-0.24 0.068-0.48 0.191-0.707 0.376-0.228 0.184-0.425 0.449-0.585 0.793-0.16 0.345-0.24 0.8-0.24 1.36v6.621h-3.132v-11.42zM31.157 31.267v-30.533h-2.197v-0.733h3.040v32h-3.040v-0.733z"></path>
|
||||||
|
</symbol>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
34
src/shared/routes.ts
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
import { IRouteProps } from "inferno-router/dist/Route";
|
||||||
|
import { Main } from "./components/main";
|
||||||
|
import { Apps } from "./components/apps";
|
||||||
|
import { Join } from "./components/join";
|
||||||
|
import { Contact } from "./components/contact";
|
||||||
|
import { Sponsors } from "./components/sponsors";
|
||||||
|
|
||||||
|
export const routes: IRouteProps[] = [
|
||||||
|
{
|
||||||
|
path: `/`,
|
||||||
|
exact: true,
|
||||||
|
component: Main,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: `/apps`,
|
||||||
|
exact: true,
|
||||||
|
component: Apps,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: `/join`,
|
||||||
|
exact: true,
|
||||||
|
component: Join,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: `/contact`,
|
||||||
|
exact: true,
|
||||||
|
component: Contact,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: `/sponsors`,
|
||||||
|
exact: true,
|
||||||
|
component: Sponsors,
|
||||||
|
},
|
||||||
|
];
|
|
@ -1,16 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<title>Lemmy WebSocket API</title>
|
|
||||||
<!-- needed for adaptive design -->
|
|
||||||
<meta charset="utf-8"/>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<script src="https://unpkg.com/@webcomponents/webcomponentsjs@2.5.0/webcomponents-bundle.js"></script>
|
|
||||||
<script src="https://unpkg.com/@asyncapi/web-component@0.19.0/lib/asyncapi-web-component.js" defer></script>
|
|
||||||
<asyncapi-component
|
|
||||||
schemaUrl="asyncapi.yaml"
|
|
||||||
cssImportPath="https://unpkg.com/@asyncapi/react-component@0.19.0/lib/styles/fiori.css">
|
|
||||||
</asyncapi-component>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
1
static/scripts/chota.min.css
vendored
|
@ -1,2 +0,0 @@
|
||||||
Logo font: [Caviar Dreams](https://www.font-generator.com/fonts/CaviarDreams/?size=70&color=000000&bg=none)
|
|
||||||
https://fontmeme.com/fonts/caviar-dreams-font/#previewtool
|
|
|
@ -1,107 +0,0 @@
|
||||||
{% extends "base.html" %}
|
|
||||||
{% block content %}
|
|
||||||
<div class="container">
|
|
||||||
<h1>Lemmy Apps</h1>
|
|
||||||
<p>Choose from any of the apps below.</p>
|
|
||||||
|
|
||||||
<div class="row">
|
|
||||||
|
|
||||||
<div class="card col-6">
|
|
||||||
<header class="is-center">
|
|
||||||
<img class="app-icon" src="/images/lemmur.svg" />
|
|
||||||
<h4>
|
|
||||||
<a href="https://github.com/krawieck/lemmur">lemmur</a>
|
|
||||||
</h4>
|
|
||||||
|
|
||||||
</header>
|
|
||||||
</header>
|
|
||||||
<div class="is-center">
|
|
||||||
<img class="app-banner" src="/images/lemmur_screen.webp" />
|
|
||||||
</div>
|
|
||||||
<br />
|
|
||||||
<p class="is-center">A Lemmy client for Android, Linux, and Windows.</p>
|
|
||||||
<footer class="is-center">
|
|
||||||
<a class="button primary" href="https://f-droid.org/packages/com.krawieck.lemmur"><svg class="icon icon-f-droid"><use xlink:href="#icon-f-droid"></use></svg></a>
|
|
||||||
<a class="button primary" href="https://play.google.com/store/apps/details?id=com.krawieck.lemmur"><svg class="icon icon-googleplay"><use xlink:href="#icon-googleplay"></use></svg></a>
|
|
||||||
<a class="button primary" href="https://github.com/krawieck/lemmur"><svg class="icon icon-github"><use xlink:href="#icon-github"></use></svg></a>
|
|
||||||
</footer>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="card col-6">
|
|
||||||
<header class="is-center">
|
|
||||||
<img class="app-icon" src="/images/remmel.webp" />
|
|
||||||
<h4>
|
|
||||||
<a href="https://github.com/uuttff8/Lemmy-iOS">remmel</a>
|
|
||||||
</h4>
|
|
||||||
|
|
||||||
</header>
|
|
||||||
</header>
|
|
||||||
<div class="is-center">
|
|
||||||
<img class="app-banner" src="/images/remmel_screen.webp" />
|
|
||||||
</div>
|
|
||||||
<br />
|
|
||||||
<p class="is-center">An iOS client for lemmy.</p>
|
|
||||||
<footer class="is-center">
|
|
||||||
<a class="button primary" href="https://apps.apple.com/us/app/remmel-for-lemmy/id1547988171"><svg class="icon icon-appleinc"><use xlink:href="#icon-appleinc"></use></svg></a>
|
|
||||||
<a class="button primary" href="https://github.com/uuttff8/Lemmy-iOS"><svg class="icon icon-github"><use xlink:href="#icon-github"></use></svg></a>
|
|
||||||
</footer>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<h1>Web Apps</h1>
|
|
||||||
|
|
||||||
<div class="row">
|
|
||||||
|
|
||||||
<div class="card col-6">
|
|
||||||
<header class="is-center">
|
|
||||||
<img class="app-icon" src="/images/lemmy.svg" />
|
|
||||||
<h4>
|
|
||||||
<a href="https://github.com/LemmyNet/lemmy-ui">lemmy-ui</a>
|
|
||||||
</h4>
|
|
||||||
|
|
||||||
</header>
|
|
||||||
</header>
|
|
||||||
<div class="is-center">
|
|
||||||
<img class="app-banner" src="/images/mobile_pic.webp" />
|
|
||||||
</div>
|
|
||||||
<br />
|
|
||||||
<p class="is-center">The official web app for lemmy.</p>
|
|
||||||
<footer class="is-center">
|
|
||||||
<a class="button primary" href="https://github.com/LemmyNet/lemmy-ui"><svg class="icon icon-github"><use xlink:href="#icon-github"></use></svg></a>
|
|
||||||
</footer>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="card col-6">
|
|
||||||
<header class="is-center">
|
|
||||||
<img class="app-icon" src="/images/lemmy.svg" />
|
|
||||||
<h4>
|
|
||||||
<a href="https://github.com/IronOxidizer/lemmy-lite">lemmy-lite</a>
|
|
||||||
</h4>
|
|
||||||
|
|
||||||
</header>
|
|
||||||
</header>
|
|
||||||
<div class="is-center">
|
|
||||||
<img class="app-banner" src="/images/lemmy_lite_screen.webp" />
|
|
||||||
</div>
|
|
||||||
<br />
|
|
||||||
<p class="is-center">A static, JSless, touch-friendly Lemmy frontend built for legacy web clients and maximum performance</p>
|
|
||||||
<footer class="is-center">
|
|
||||||
<a class="button primary" href="https://github.com/IronOxidizer/lemmy-lite"><svg class="icon icon-github"><use xlink:href="#icon-github"></use></svg></a>
|
|
||||||
</footer>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<h1>Lemmy API Libraries</h1>
|
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
<a href="https://github.com/LemmyNet/lemmy-js-client">lemmy-js-client</a> - a javascript / typescript client.
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="https://github.com/krawieck/lemmy_api_client">lemmy-dart client</a> - a dart / flutter client.
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
{% endblock content %}
|
|
|
@ -1,173 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
||||||
<title>Lemmy - A link aggregator for the fediverse</title>
|
|
||||||
<link rel="stylesheet" href="/scripts/chota.min.css">
|
|
||||||
<link rel="shortcut icon" type="image/svg+xml" href="/images/lemmy.svg" />
|
|
||||||
<style>
|
|
||||||
:root {
|
|
||||||
--font-family-sans: Inter, Helvetica, Roboto, sans-serif;
|
|
||||||
--grid-maxWidth: 108rem;
|
|
||||||
--grid-gutter: 4rem;
|
|
||||||
--color-success: #fafafa;
|
|
||||||
--bg-color: #222222;
|
|
||||||
--bg-secondary-color: #131316;
|
|
||||||
--font-color: #f5f5f5;
|
|
||||||
--color-grey: #ccc;
|
|
||||||
--color-darkGrey: #777;
|
|
||||||
--color-success: #222222;
|
|
||||||
}
|
|
||||||
.card {
|
|
||||||
webkit-box-shadow: unset;
|
|
||||||
box-shadow: unset;
|
|
||||||
border: 1px solid var(--color-darkGrey) !important;
|
|
||||||
}
|
|
||||||
@font-face {
|
|
||||||
font-family: 'CaviarDreams';
|
|
||||||
src: url('/fonts/CaviarDreams.ttf') format('truetype');
|
|
||||||
}
|
|
||||||
.stylized {
|
|
||||||
font-family: 'CaviarDreams', Fallback, sans-serif;
|
|
||||||
font-size: 4em;
|
|
||||||
font-weight: bold;
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
.icon {
|
|
||||||
display: inline-block;
|
|
||||||
max-width: 1.5rem;
|
|
||||||
max-height: 1.5rem;
|
|
||||||
stroke-width: 0;
|
|
||||||
stroke: currentColor;
|
|
||||||
fill: currentColor;
|
|
||||||
}
|
|
||||||
p {
|
|
||||||
font: 1.2em/1.62 sans-serif;
|
|
||||||
}
|
|
||||||
.join-banner {
|
|
||||||
width: 100%;
|
|
||||||
height: 100px;
|
|
||||||
object-fit: scale-down;
|
|
||||||
}
|
|
||||||
.app-banner {
|
|
||||||
width: 100%;
|
|
||||||
height: 300px;
|
|
||||||
object-fit: scale-down;
|
|
||||||
}
|
|
||||||
.app-icon {
|
|
||||||
display: inline-block;
|
|
||||||
height: 30px;
|
|
||||||
width: 30px;
|
|
||||||
margin-right: 10px;
|
|
||||||
}
|
|
||||||
.join-desc {
|
|
||||||
<!-- height: 20vh; -->
|
|
||||||
}
|
|
||||||
img {
|
|
||||||
max-width: unset;
|
|
||||||
}
|
|
||||||
.bg-image {
|
|
||||||
position: fixed;
|
|
||||||
left: 0;
|
|
||||||
right: 0;
|
|
||||||
z-index: -1;
|
|
||||||
display: block;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
background:
|
|
||||||
linear-gradient(
|
|
||||||
rgba(0, 0, 0, 0.0),
|
|
||||||
rgba(0, 0, 0, 0.0)
|
|
||||||
),
|
|
||||||
url('/images/main_img.webp');
|
|
||||||
-webkit-filter: blur(7px);
|
|
||||||
-moz-filter: blur(7px);
|
|
||||||
-o-filter: blur(7px);
|
|
||||||
-ms-filter: blur(7px);
|
|
||||||
filter: blur(7px);
|
|
||||||
|
|
||||||
/* Center and scale the image nicely */
|
|
||||||
background-position: center;
|
|
||||||
background-repeat: no-repeat;
|
|
||||||
background-size: cover;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body>
|
|
||||||
<nav class="nav hide-xs">
|
|
||||||
<div class="nav-left">
|
|
||||||
<a class="brand" href="/"><img src="/images/lemmy.svg" height=32 width=32></a>
|
|
||||||
<a href="/join">Join</a>
|
|
||||||
<a href="/apps">Apps</a>
|
|
||||||
<a href="/sponsors">Sponsors</a>
|
|
||||||
<a href="/docs/en/index.html">Docs</a>
|
|
||||||
<a href="/docs/en/code_of_conduct.html" title="Code of Conduct">CoC</a>
|
|
||||||
<a href="/contact">Contact</a>
|
|
||||||
</div>
|
|
||||||
<div class="nav-right">
|
|
||||||
<a href="https://github.com/LemmyNet"><svg class="icon icon-github"><use xlink:href="#icon-github"></use></svg></a>
|
|
||||||
<a href="https://mastodon.social/@LemmyDev"><svg class="icon icon-mastodon"><use xlink:href="#icon-mastodon"></use></svg></a>
|
|
||||||
<a href="https://matrix.to/#/#lemmy:matrix.org"><svg class="icon icon-matrix"><use xlink:href="#icon-matrix"></use></svg></a>
|
|
||||||
</div>
|
|
||||||
</nav>
|
|
||||||
|
|
||||||
<nav class="nav hide-sm hide-md hide-lg">
|
|
||||||
<div class="nav-center">
|
|
||||||
<a class="brand" href="/"><img src="/images/lemmy.svg"></a>
|
|
||||||
</div>
|
|
||||||
</nav>
|
|
||||||
{% block content %} {% endblock %}
|
|
||||||
|
|
||||||
<br />
|
|
||||||
<br />
|
|
||||||
<br />
|
|
||||||
|
|
||||||
<footer>
|
|
||||||
<nav class="nav">
|
|
||||||
<div class="nav-left">
|
|
||||||
<p style="padding-left:2rem">Made using <a style="display: inline-block" class="is-paddingless" href="https://www.getzola.org">Zola</a> and <a style="display: inline-block" class="is-paddingless" href="https://jenil.github.io/chota">Chota</a></p>
|
|
||||||
</div>
|
|
||||||
<div class="nav-right hide-sm hide-md hide-lg">
|
|
||||||
<a href="/join">Join</a>
|
|
||||||
<a href="/apps">Apps</a>
|
|
||||||
<a href="/sponsors">Sponsors</a>
|
|
||||||
<a href="/docs/en/index.html">Docs</a>
|
|
||||||
<a href="/docs/en/code_of_conduct.html" title="Code of Conduct">CoC</a>
|
|
||||||
<a href="/contact">Contact</a>
|
|
||||||
</div>
|
|
||||||
</nav>
|
|
||||||
</footer>
|
|
||||||
</body>
|
|
||||||
<svg
|
|
||||||
aria-hidden="true"
|
|
||||||
style="position: absolute; width: 0; height: 0; overflow: hidden;"
|
|
||||||
>
|
|
||||||
<defs>
|
|
||||||
<symbol id="icon-f-droid" viewBox="0 0 32 32">
|
|
||||||
<path d="M27.296 13.441h-22.592c-1.169 0-2.119 0.948-2.119 2.119v14.12c0 1.169 0.948 2.119 2.119 2.119h22.592c1.169 0 2.119-0.948 2.119-2.119v-14.12c0-1.171-0.949-2.119-2.119-2.119zM16 30.033c-4.088 0-7.413-3.325-7.413-7.413s3.325-7.413 7.413-7.413 7.413 3.325 7.413 7.413-3.325 7.413-7.413 7.413zM16 16.548c-3.348 0-6.072 2.724-6.072 6.072s2.724 6.072 6.072 6.072 6.072-2.724 6.072-6.072-2.724-6.072-6.072-6.072zM16 27.032c-2.084 0-3.841-1.471-4.295-3.424h2.227c0.367 0.775 1.145 1.305 2.068 1.305 1.28 0 2.295-1.015 2.295-2.295s-1.015-2.295-2.295-2.295c-0.865 0-1.6 0.469-1.991 1.165h-2.269c0.504-1.883 2.225-3.283 4.26-3.283 2.424 0 4.412 1.988 4.412 4.412 0 2.425-1.988 4.413-4.412 4.413zM31.799 0.528c-0.001 0.001-0.003 0.003-0.003 0.004-0.003-0.003-0.005-0.004-0.008-0.007 0.001-0.001 0.003-0.004 0.005-0.005-0.155-0.183-0.372-0.308-0.692-0.317-0.269 0.007-0.521 0.129-0.683 0.345l-2.424 3.137c-0.219-0.077-0.452-0.127-0.697-0.127h-22.593c-0.245 0-0.477 0.051-0.697 0.127l-2.424-3.139c-0.161-0.216-0.413-0.337-0.683-0.345-0.32 0.008-0.537 0.133-0.692 0.317 0.001 0.001 0.003 0.004 0.005 0.005-0.004 0.003-0.007 0.005-0.009 0.008 0-0.001-0.001-0.003-0.003-0.004-0.088 0.104-0.396 0.568-0.016 1.099l2.545 3.295c-0.089 0.235-0.144 0.488-0.144 0.755v4.943c0 1.169 0.948 2.119 2.119 2.119h22.592c1.169 0 2.119-0.948 2.119-2.119v-4.943c0-0.267-0.055-0.52-0.145-0.755l2.545-3.295c0.379-0.531 0.071-0.995-0.017-1.099zM9.205 10.971c-1.316 0-2.383-1.067-2.383-2.383s1.067-2.383 2.383-2.383 2.383 1.067 2.383 2.383-1.067 2.383-2.383 2.383zM22.972 10.971c-1.316 0-2.383-1.067-2.383-2.383s1.067-2.383 2.383-2.383 2.383 1.067 2.383 2.383-1.067 2.383-2.383 2.383z"></path>
|
|
||||||
</symbol>
|
|
||||||
<symbol id="icon-googleplay" viewBox="0 0 32 32">
|
|
||||||
<path d="M1.627 0c-0.040 0.124-0.080 0.247-0.080 0.411v30.972c0 0.289 0.081 0.453 0.245 0.617l15.22-16.124zM18.039 16.944l3.935 4.060-5.617 3.2c0 0-7.14 4.059-11.077 6.319zM19.107 15.836l4.221 4.389c0.661-0.368 5.828-3.323 6.565-3.733 0.779-0.451 0.7-1.067 0.039-1.395-0.612-0.34-5.779-3.3-6.56-3.78l-4.271 4.523zM18.036 14.769l3.979-4.225-5.679-3.241c0 0-9.257-5.296-12.337-7.064l14.040 14.531z"></path>
|
|
||||||
</symbol>
|
|
||||||
<symbol id="icon-appleinc" viewBox="0 0 32 32">
|
|
||||||
<path d="M24.734 17.003c-0.040-4.053 3.305-5.996 3.454-6.093-1.88-2.751-4.808-3.127-5.851-3.171-2.492-0.252-4.862 1.467-6.127 1.467-1.261 0-3.213-1.43-5.28-1.392-2.716 0.040-5.221 1.579-6.619 4.012-2.822 4.897-0.723 12.151 2.028 16.123 1.344 1.944 2.947 4.127 5.051 4.049 2.026-0.081 2.793-1.311 5.242-1.311s3.138 1.311 5.283 1.271c2.18-0.041 3.562-1.981 4.897-3.931 1.543-2.255 2.179-4.439 2.216-4.551-0.048-0.022-4.252-1.632-4.294-6.473zM20.705 5.11c1.117-1.355 1.871-3.235 1.665-5.11-1.609 0.066-3.559 1.072-4.713 2.423-1.036 1.199-1.942 3.113-1.699 4.951 1.796 0.14 3.629-0.913 4.747-2.264z"></path>
|
|
||||||
</symbol>
|
|
||||||
<symbol id="icon-github" viewBox="0 0 32 32">
|
|
||||||
<path d="M16 0.395c-8.836 0-16 7.163-16 16 0 7.069 4.585 13.067 10.942 15.182 0.8 0.148 1.094-0.347 1.094-0.77 0-0.381-0.015-1.642-0.022-2.979-4.452 0.968-5.391-1.888-5.391-1.888-0.728-1.849-1.776-2.341-1.776-2.341-1.452-0.993 0.11-0.973 0.11-0.973 1.606 0.113 2.452 1.649 2.452 1.649 1.427 2.446 3.743 1.739 4.656 1.33 0.143-1.034 0.558-1.74 1.016-2.14-3.554-0.404-7.29-1.777-7.29-7.907 0-1.747 0.625-3.174 1.649-4.295-0.166-0.403-0.714-2.030 0.155-4.234 0 0 1.344-0.43 4.401 1.64
|
|
||||||
1.276-0.355 2.645-0.532 4.005-0.539 1.359 0.006 2.729 0.184 4.008 0.539 3.054-2.070 4.395-1.64 4.395-1.64 0.871 2.204 0.323 3.831 0.157 4.234 1.026 1.12 1.647 2.548 1.647 4.295 0 6.145-3.743 7.498-7.306 7.895 0.574 0.497 1.085 1.47 1.085 2.963 0 2.141-0.019 3.864-0.019 4.391 0 0.426 0.288 0.925 1.099 0.768 6.354-2.118 10.933-8.113 10.933-15.18 0-8.837-7.164-16-16-16z"></path>
|
|
||||||
</symbol>
|
|
||||||
<symbol id="icon-mastodon" viewBox="0 0 32 32">
|
|
||||||
<path d="M30.924 10.505c0-6.941-4.548-8.976-4.548-8.976-2.293-1.053-6.232-1.496-10.321-1.529h-0.101c-4.091 0.033-8.027 0.476-10.32 1.529 0 0-4.548 2.035-4.548 8.976 0 1.589-0.031 3.491 0.020 5.505 0.165 6.789 1.245 13.479 7.521 15.14 2.893 0.765 5.379 0.927 7.38 0.816 3.629-0.2 5.667-1.296 5.667-1.296l-0.12-2.633c0 0-2.593 0.817-5.505 0.719-2.887-0.099-5.932-0.311-6.399-3.855-0.041-0.29-0.064-0.626-0.064-0.967 0-0.009 0-0.018 0-0.028v0.001c0 0 2.833 0.693 6.423 0.857 2.195 0.1
|
|
||||||
4.253-0.129 6.344-0.377 4.009-0.479 7.5-2.949 7.939-5.207 0.689-3.553 0.633-8.676 0.633-8.676zM25.559 19.451h-3.329v-8.159c0-1.72-0.724-2.592-2.171-2.592-1.6 0-2.403 1.035-2.403 3.083v4.465h-3.311v-4.467c0-2.048-0.803-3.083-2.403-3.083-1.447 0-2.171 0.873-2.171 2.592v8.159h-3.329v-8.404c0-1.719 0.437-3.084 1.316-4.093 0.907-1.011 2.092-1.528 3.565-1.528 1.704 0 2.995 0.655 3.848 1.965l0.828 1.391 0.829-1.391c0.853-1.311 2.144-1.965 3.848-1.965 1.472 0 2.659 0.517 3.565 1.528 0.877
|
|
||||||
1.009 1.315 2.375 1.315 4.093z"></path>
|
|
||||||
</symbol>
|
|
||||||
<symbol id="icon-matrix" viewBox="0 0 32 32">
|
|
||||||
<path d="M0.843 0.733v30.533h2.197v0.733h-3.040v-32h3.040v0.733zM10.233 10.413v1.543h0.044c0.412-0.591 0.911-1.045 1.489-1.365 0.577-0.327 1.248-0.487 2-0.487 0.72 0 1.377 0.143 1.975 0.419 0.597 0.277 1.047 0.776 1.36 1.477 0.339-0.499 0.8-0.941 1.379-1.323 0.579-0.383 1.267-0.573 2.061-0.573 0.604 0 1.163 0.075 1.68 0.223 0.517 0.147 0.955 0.381 1.324 0.707 0.368 0.327 0.652 0.745 0.861 1.268 0.203 0.523 0.307 1.151 0.307
|
|
||||||
1.889v7.637h-3.132v-6.468c0-0.381-0.013-0.745-0.043-1.083-0.023-0.325-0.109-0.624-0.246-0.893l0.006 0.013c-0.136-0.253-0.335-0.456-0.577-0.594l-0.007-0.004c-0.259-0.147-0.609-0.221-1.047-0.221-0.443 0-0.8 0.085-1.071 0.252-0.267 0.166-0.483 0.39-0.635 0.656l-0.005 0.009c-0.153 0.268-0.261 0.581-0.306 0.915l-0.002 0.013c-0.049 0.313-0.078 0.676-0.080 1.044v6.36h-3.133v-6.4c0-0.339-0.005-0.671-0.024-1.003-0.012-0.333-0.081-0.647-0.197-0.936l0.007
|
|
||||||
0.019c-0.113-0.281-0.304-0.511-0.548-0.667l-0.006-0.003c-0.259-0.167-0.635-0.253-1.139-0.253-0.148 0-0.345 0.032-0.585 0.099-0.24 0.068-0.48 0.191-0.707 0.376-0.228 0.184-0.425 0.449-0.585 0.793-0.16 0.345-0.24 0.8-0.24 1.36v6.621h-3.132v-11.42zM31.157 31.267v-30.533h-2.197v-0.733h3.040v32h-3.040v-0.733z"></path>
|
|
||||||
</symbol>
|
|
||||||
</defs>
|
|
||||||
</svg>
|
|
||||||
</html>
|
|
|
@ -1,154 +0,0 @@
|
||||||
{% extends "base.html" %}
|
|
||||||
{% block content %}
|
|
||||||
|
|
||||||
<div class="bg-image"></div>
|
|
||||||
<div class="container">
|
|
||||||
<div class="text-center">
|
|
||||||
<h1 class="stylized">Lemmy</h1>
|
|
||||||
<h4>A link aggregator for the fediverse.</h4>
|
|
||||||
<div class="row is-horizontal-align">
|
|
||||||
<div class="col-2-lg">
|
|
||||||
<a class="button primary" href="/join">Join a Server</a>
|
|
||||||
</div>
|
|
||||||
<div class="col-2-lg">
|
|
||||||
<a class="button primary" href="/docs/en/administration/administration.html">Run a Server</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<br />
|
|
||||||
|
|
||||||
<div class="container">
|
|
||||||
<div class="text-center">
|
|
||||||
<h2>Follow communities anywhere in the world</h2>
|
|
||||||
<p><a href="https://github.com/LemmyNet">Lemmy</a> is similar to sites like <a href="https://reddit.com">Reddit</a>, <a href="https://lobste.rs">Lobste.rs</a>, or <a href="https://news.ycombinator.com/">Hacker News</a>: you subscribe to communities you're interested in, post links and discussions, then vote and comment on them. Lemmy isn't just a reddit alternative; its a network of interconnected communities ran by different people and organizations, all combining to create <b>a single, personalized front page</b> of your favorite news, articles, and memes. </p>
|
|
||||||
<p><a class="button primary" href="/join">Join a Server</a></p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<br />
|
|
||||||
|
|
||||||
<div class="bg-success">
|
|
||||||
<br />
|
|
||||||
|
|
||||||
<div class="container">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-4">
|
|
||||||
<div>
|
|
||||||
<header class="is-center">
|
|
||||||
<img height=180 src="images/review_pic.webp">
|
|
||||||
</header>
|
|
||||||
<br />
|
|
||||||
<h4 class="text-center">Open Source</h4>
|
|
||||||
<p>Lemmy is and will always remain free, <a href="https://github.com/LemmyNet">open source</a> software, using the strong <a href="https://en.wikipedia.org/wiki/Copyleft">copyleft</a> <a href="https://github.com/LemmyNet/lemmy/blob/master/LICENSE">AGPL License</a>.</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-4">
|
|
||||||
<div>
|
|
||||||
<header class="is-center">
|
|
||||||
<img height=180 src="/images/code_pic.webp">
|
|
||||||
</header>
|
|
||||||
<br />
|
|
||||||
<h4 class="text-center">Blazing Fast</h4>
|
|
||||||
<p>Made using some of the fastest frameworks and tools, including <a href="https://www.rust-lang.org">Rust</a>, <a href="https://actix.rs/">Actix</a>, <a href="http://diesel.rs/">Diesel</a>, <a href="https://infernojs.org">Inferno</a>, and <a href="https://www.typescriptlang.org/">Typescript</a>.</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-4">
|
|
||||||
<div>
|
|
||||||
<header class="is-center">
|
|
||||||
<img height=180 src="/images/mod_pic.webp">
|
|
||||||
</header>
|
|
||||||
<br />
|
|
||||||
<h4 class="text-center">Powerful Mod Tools</h4>
|
|
||||||
<p>Each server can set its own moderation policy, to help foster a healthy environment where all can feel comfortable contributing.</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<br />
|
|
||||||
<br />
|
|
||||||
|
|
||||||
<div class="container">
|
|
||||||
<div class="text-center">
|
|
||||||
<h2>Create your own discussion platform</h2>
|
|
||||||
<p>With Lemmy, you can <a href="/docs/en/administration/administration.html">easily host your own server</a>, and all these servers are <i>federated</i> (think email), and connected to the same universe, called the <a href="https://en.wikipedia.org/wiki/Fediverse">Fediverse</a>. For a link aggregator, this means that someone registered on one server can subscribe to communities elsewhere, and can have discussions with people on a completely different server.</p>
|
|
||||||
<p>
|
|
||||||
<a class="button primary" href="/docs/en/administration/administration.html">Run a Server</a>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<br />
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<br />
|
|
||||||
|
|
||||||
<div class="container">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-6">
|
|
||||||
<h4>Live Updates</h4>
|
|
||||||
<p>New comments and posts stream in to your front page and inbox; No more page refreshes required.</p>
|
|
||||||
</div>
|
|
||||||
<div class="col-6 is-center">
|
|
||||||
<video height=325 autoplay loop>
|
|
||||||
<source src="images/reply_vid.webm">
|
|
||||||
</video>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<br />
|
|
||||||
<br />
|
|
||||||
|
|
||||||
<div class="container">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-6 is-center">
|
|
||||||
<img height=325 src="/images/mobile_pic.webp">
|
|
||||||
</div>
|
|
||||||
<div class="col-6">
|
|
||||||
<h4 class="is-marginless">More Features</h4>
|
|
||||||
<ul class="is-marginless">
|
|
||||||
<li>Self hostable, easy to deploy, via <a href="/docs/en/administration/install_docker.html">Docker</a>, or <a href="/docs/en/administration/install_ansible.html">Ansible</a>.
|
|
||||||
</li>
|
|
||||||
<li>Clean, mobile-friendly interface.</li>
|
|
||||||
<li>User avatar support.</li>
|
|
||||||
<li>Full vote scores <code>(+/-)</code> like old Reddit.</li>
|
|
||||||
<li>Themes, including light, dark, and solarized.</li>
|
|
||||||
<li>Emojis with autocomplete support. Start typing <code>:</code></li>
|
|
||||||
<li>User tagging using <code>@</code>, Community tagging using <code>!</code>.</li>
|
|
||||||
<li>Integrated image uploading in both posts and comments.</li>
|
|
||||||
<li>Notifications, including via email.</li>
|
|
||||||
<li><a href="https://weblate.yerbamate.ml/projects/lemmy/lemmy/">i18n / internationalization support for > 30 languages.</a></li>
|
|
||||||
<li>RSS / Atom feeds for <code>All</code>, <code>Subscribed</code>, <code>Inbox</code>, <code>User</code>, and <code>Community</code>.</li>
|
|
||||||
<li>Can fully erase your data, replacing all posts and comments.</li>
|
|
||||||
<li>NSFW post / community support.</li>
|
|
||||||
</ul>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<br />
|
|
||||||
<div class="bg-success">
|
|
||||||
<br />
|
|
||||||
<div class="container">
|
|
||||||
<div class="text-center">
|
|
||||||
<h2><a href="/sponsors">Support / Donate</a></h2>
|
|
||||||
<p>Lemmy is free, open-source software, meaning no advertising, monetizing, or venture capital, ever. <a href="/sponsors">Your donations</a> directly support full-time development of the project.
|
|
||||||
<div class="row is-horizontal-align">
|
|
||||||
<div class="col-3">
|
|
||||||
<a class="button primary" href="https://liberapay.com/Lemmy">Support on Liberapay</a>
|
|
||||||
</div>
|
|
||||||
<div class="col-3">
|
|
||||||
<a class="button primary" href="https://www.patreon.com/dessalines">Support on Patreon</a>
|
|
||||||
</div>
|
|
||||||
<div class="col-3">
|
|
||||||
<a class="col button primary" href="https://opencollective.com/lemmy">Support on OpenCollective</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<br />
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{% endblock content %}
|
|
|
@ -1,216 +0,0 @@
|
||||||
{% extends "base.html" %}
|
|
||||||
{% block content %}
|
|
||||||
<div class="container">
|
|
||||||
<h1>Lemmy servers</h1>
|
|
||||||
<p>Choose and join a server from the approved servers below.</p>
|
|
||||||
|
|
||||||
<div class="row">
|
|
||||||
|
|
||||||
<div class="card col-6">
|
|
||||||
<header>
|
|
||||||
<div class="row">
|
|
||||||
<h4 class="col">lemmy.ml</h4>
|
|
||||||
<h4 class="col text-right"><i>5.9k users</i></h4>
|
|
||||||
</div>
|
|
||||||
</header>
|
|
||||||
<div class="is-center">
|
|
||||||
<img class="join-banner" src="/images/lemmy.svg" />
|
|
||||||
</div>
|
|
||||||
<br />
|
|
||||||
<p class="join-desc">The flagship instance of lemmy.</p>
|
|
||||||
<footer>
|
|
||||||
<a class="button primary" href="https://lemmy.ml">Join</a>
|
|
||||||
</footer>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="card col-6">
|
|
||||||
<header>
|
|
||||||
<div class="row">
|
|
||||||
<h4 class="col">lemmygrad.ml</h4>
|
|
||||||
<h4 class="col text-right"><i>2.3k users</i></h4>
|
|
||||||
</div>
|
|
||||||
</header>
|
|
||||||
<div class="is-center">
|
|
||||||
<img class="join-banner" src="https://lemmygrad.ml/pictrs/image/YI2XNWaVUv.png?format=webp" />
|
|
||||||
</div>
|
|
||||||
<br />
|
|
||||||
<p class="join-desc">A collection of leftist communities, for memes, learning, news, discussion, media, or anything you like.</p>
|
|
||||||
<footer>
|
|
||||||
<a class="button primary" href="https://lemmygrad.ml">Join</a>
|
|
||||||
</footer>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="card col-6">
|
|
||||||
<header>
|
|
||||||
<div class="row">
|
|
||||||
<h4 class="col">lemmy.161.social</h4>
|
|
||||||
<h4 class="col text-right"><i>50 users</i></h4>
|
|
||||||
</div>
|
|
||||||
</header>
|
|
||||||
<div class="is-center">
|
|
||||||
<img class="join-banner" src="https://lemmy.161.social/pictrs/image/n3Stw3I1g0.png?format=webp" />
|
|
||||||
</div>
|
|
||||||
<br />
|
|
||||||
<p class="join-desc">An anti-authoritarian and emancipatory space for german speaking anti-fascists.</p>
|
|
||||||
<footer>
|
|
||||||
<a class="button primary" href="https://lemmy.161.social">Join</a>
|
|
||||||
</footer>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="card col-6">
|
|
||||||
<header>
|
|
||||||
<div class="row">
|
|
||||||
<h4 class="col">baraza.africa</h4>
|
|
||||||
<h4 class="col text-right"><i>20 users</i></h4>
|
|
||||||
</div>
|
|
||||||
</header>
|
|
||||||
<div class="is-center">
|
|
||||||
<img class="join-banner" src="/images/lemmy.svg" />
|
|
||||||
</div>
|
|
||||||
<br />
|
|
||||||
<p class="join-desc">baraza is a digital public square as imagined in Bantu philosophy, one premised on the assumption that deliberative dialogue is a path to better societies.</p>
|
|
||||||
<footer>
|
|
||||||
<a class="button primary" href="https://baraza.africa">Join</a>
|
|
||||||
</footer>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="card col-6">
|
|
||||||
<header>
|
|
||||||
<div class="row">
|
|
||||||
<h4 class="col">lemmy.glasgow.social</h4>
|
|
||||||
<h4 class="col text-right"><i>60 users</i></h4>
|
|
||||||
</div>
|
|
||||||
</header>
|
|
||||||
<div class="is-center">
|
|
||||||
<img class="join-banner" src="https://glasgow.social/system/site_uploads/files/000/000/001/original/fuller_street1_sq.jpg?1579523706" />
|
|
||||||
</div>
|
|
||||||
<br />
|
|
||||||
<p class="join-desc">A place for communities in and around Glasgow, Scotland.</p>
|
|
||||||
<footer>
|
|
||||||
<a class="button primary" href="https://lemmy.glasgow.social">Join</a>
|
|
||||||
</footer>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="card col-6">
|
|
||||||
<header>
|
|
||||||
<div class="row">
|
|
||||||
<h4 class="col">lemmy.cat</h4>
|
|
||||||
<h4 class="col text-right"><i>30 users</i></h4>
|
|
||||||
</div>
|
|
||||||
</header>
|
|
||||||
<div class="is-center">
|
|
||||||
<img class="join-banner" src="https://lemmy.cat/pictrs/image/p63LCl9dD2.jpg?format=webp&thumbnail=3000" />
|
|
||||||
</div>
|
|
||||||
<br />
|
|
||||||
<p class="join-desc">A Lemmy instance for people of Catalan culture.</p>
|
|
||||||
<footer>
|
|
||||||
<a class="button primary" href="https://lemmy.cat">Join</a>
|
|
||||||
</footer>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="card col-6">
|
|
||||||
<header>
|
|
||||||
<div class="row">
|
|
||||||
<h4 class="col">lemmy.ca</h4>
|
|
||||||
<h4 class="col text-right"><i>11 users</i></h4>
|
|
||||||
</div>
|
|
||||||
</header>
|
|
||||||
<div class="is-center">
|
|
||||||
<img class="join-banner" src="https://lemmy.ca/pictrs/image/YMyO670EYs.png?format=webp&thumbnail=3000" />
|
|
||||||
</div>
|
|
||||||
<br />
|
|
||||||
<p class="join-desc">A Lemmy geared toward Canucks, hosted in Canuckistan, and run by a Canuck.</p>
|
|
||||||
<footer>
|
|
||||||
<a class="button primary" href="https://lemmy.ca">Join</a>
|
|
||||||
</footer>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="card col-6">
|
|
||||||
<header>
|
|
||||||
<div class="row">
|
|
||||||
<h4 class="col">lemmy.eus</h4>
|
|
||||||
<h4 class="col text-right"><i>100 users</i></h4>
|
|
||||||
</div>
|
|
||||||
</header>
|
|
||||||
<div class="is-center">
|
|
||||||
<img class="join-banner" src="/images/lemmy.svg" />
|
|
||||||
</div>
|
|
||||||
<br />
|
|
||||||
<p class="join-desc">A Basque Lemmy instance.</p>
|
|
||||||
<footer>
|
|
||||||
<a class="button primary" href="https://lemmy.eus">Join</a>
|
|
||||||
</footer>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="card col-6">
|
|
||||||
<header>
|
|
||||||
<div class="row">
|
|
||||||
<h4 class="col">sopuli.xyz</h4>
|
|
||||||
<h4 class="col text-right"><i>10 users</i></h4>
|
|
||||||
</div>
|
|
||||||
</header>
|
|
||||||
<div class="is-center">
|
|
||||||
<img class="join-banner" src="https://sopuli.xyz/pictrs/image/RmuyRzuchU.png?format=webp&thumbnail=3000" />
|
|
||||||
</div>
|
|
||||||
<br />
|
|
||||||
<p class="join-desc">A general-purpose Finnish instance.</p>
|
|
||||||
<footer>
|
|
||||||
<a class="button primary" href="https://sopuli.xyz">Join</a>
|
|
||||||
</footer>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="card col-6">
|
|
||||||
<header>
|
|
||||||
<div class="row">
|
|
||||||
<h4 class="col">stammtisch.hallertau.social</h4>
|
|
||||||
<h4 class="col text-right"><i>~10 users</i></h4>
|
|
||||||
</div>
|
|
||||||
</header>
|
|
||||||
<div class="is-center">
|
|
||||||
<img class="join-banner" src="https://stammtisch.hallertau.social/pictrs/image/TbUbi4vFwZ.jpg?format=webp&thumbnail=3000" />
|
|
||||||
</div>
|
|
||||||
<br />
|
|
||||||
<p class="join-desc">Sitz de hera, samma mehra.</p>
|
|
||||||
<footer>
|
|
||||||
<a class="button primary" href="https://stammtisch.hallertau.social">Join</a>
|
|
||||||
</footer>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="card col-6">
|
|
||||||
<header>
|
|
||||||
<div class="row">
|
|
||||||
<h4 class="col">szmer.info</h4>
|
|
||||||
<h4 class="col text-right"><i>300 users</i></h4>
|
|
||||||
</div>
|
|
||||||
</header>
|
|
||||||
<div class="is-center">
|
|
||||||
<img class="join-banner" src="/images/lemmy.svg" />
|
|
||||||
</div>
|
|
||||||
<br />
|
|
||||||
<p class="join-desc">A polish anti-fascist instance.</p>
|
|
||||||
<footer>
|
|
||||||
<a class="button primary" href="https://szmer.info">Join</a>
|
|
||||||
</footer>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="card col-6">
|
|
||||||
<header>
|
|
||||||
<div class="row">
|
|
||||||
<h4 class="col">diversa.social</h4>
|
|
||||||
<h4 class="col text-right"><i>~ 10 users</i></h4>
|
|
||||||
</div>
|
|
||||||
</header>
|
|
||||||
<div class="is-center">
|
|
||||||
<img class="join-banner" src="https://diversa.social/pictrs/image/Slw1Nu62Gm.png?format=webp&thumbnail=3000" />
|
|
||||||
</div>
|
|
||||||
<br />
|
|
||||||
<p class="join-desc">Instancia multitemática en español con un enfoque constructivo y solidario.</p>
|
|
||||||
<footer>
|
|
||||||
<a class="button primary" href="https://diversa.social">Join</a>
|
|
||||||
</footer>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
{% endblock content %}
|
|
|
@ -1,6 +0,0 @@
|
||||||
{% extends "base.html" %}
|
|
||||||
{% block content %}
|
|
||||||
<div class="container">
|
|
||||||
<p>{{ page.content | safe }}</p>
|
|
||||||
</div>
|
|
||||||
{% endblock content %}
|
|
27
tsconfig.json
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"pretty": true,
|
||||||
|
"target": "esnext",
|
||||||
|
"module": "esnext",
|
||||||
|
"allowSyntheticDefaultImports": true,
|
||||||
|
"preserveConstEnums": true,
|
||||||
|
"sourceMap": true,
|
||||||
|
"moduleResolution": "node",
|
||||||
|
"lib": ["es2017", "dom"],
|
||||||
|
"types": [
|
||||||
|
"inferno"
|
||||||
|
],
|
||||||
|
"jsx": "preserve",
|
||||||
|
"noUnusedLocals": true,
|
||||||
|
"baseUrl": "./src",
|
||||||
|
"noEmit": true,
|
||||||
|
"skipLibCheck": true,
|
||||||
|
"noUnusedParameters": true,
|
||||||
|
"noImplicitReturns": true,
|
||||||
|
"noFallthroughCasesInSwitch": true
|
||||||
|
},
|
||||||
|
"include": [
|
||||||
|
"src/**/*",
|
||||||
|
"node_modules/inferno/dist/index.d.ts",
|
||||||
|
]
|
||||||
|
}
|
107
webpack.config.js
Normal file
|
@ -0,0 +1,107 @@
|
||||||
|
const webpack = require('webpack');
|
||||||
|
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
|
||||||
|
const nodeExternals = require('webpack-node-externals');
|
||||||
|
const CopyPlugin = require('copy-webpack-plugin');
|
||||||
|
const RunNodeWebpackPlugin = require('run-node-webpack-plugin');
|
||||||
|
const { merge } = require('lodash');
|
||||||
|
|
||||||
|
const banner = `
|
||||||
|
hash:[contentHash], chunkhash:[chunkhash], name:[name], filebase:[base], query:[query], file:[file]
|
||||||
|
Source code: https://github.com/LemmyNet/joinlemmy-site
|
||||||
|
Created by dessalines
|
||||||
|
@license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL v3.0
|
||||||
|
`;
|
||||||
|
|
||||||
|
const base = {
|
||||||
|
output: {
|
||||||
|
filename: 'js/server.js',
|
||||||
|
publicPath: '/',
|
||||||
|
},
|
||||||
|
resolve: {
|
||||||
|
extensions: ['.js', '.jsx', '.ts', '.tsx'],
|
||||||
|
},
|
||||||
|
performance: {
|
||||||
|
hints: false,
|
||||||
|
},
|
||||||
|
module: {
|
||||||
|
rules: [
|
||||||
|
{
|
||||||
|
test: /\.(scss|css)$/i,
|
||||||
|
use: [MiniCssExtractPlugin.loader, 'css-loader', 'sass-loader'],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: /\.(js|jsx|tsx|ts)$/, // All ts and tsx files will be process by
|
||||||
|
exclude: /node_modules/, // ignore node_modules
|
||||||
|
loader: 'babel-loader',
|
||||||
|
},
|
||||||
|
// Due to some weird babel issue: https://github.com/webpack/webpack/issues/11467
|
||||||
|
{
|
||||||
|
test: /\.m?js/,
|
||||||
|
resolve: {
|
||||||
|
fullySpecified: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
plugins: [
|
||||||
|
new MiniCssExtractPlugin({
|
||||||
|
filename: 'styles/styles.css',
|
||||||
|
}),
|
||||||
|
new CopyPlugin({
|
||||||
|
patterns: [{ from: './src/assets', to: './assets' }],
|
||||||
|
}),
|
||||||
|
new webpack.BannerPlugin({
|
||||||
|
banner,
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
const createServerConfig = (_env, mode) => {
|
||||||
|
const config = merge({}, base, {
|
||||||
|
mode,
|
||||||
|
entry: './src/server/index.tsx',
|
||||||
|
output: {
|
||||||
|
filename: 'js/server.js',
|
||||||
|
},
|
||||||
|
target: 'node',
|
||||||
|
externals: [nodeExternals(), 'inferno-helmet'],
|
||||||
|
});
|
||||||
|
|
||||||
|
if (mode === 'development') {
|
||||||
|
config.cache = {
|
||||||
|
type: 'filesystem',
|
||||||
|
name: 'server',
|
||||||
|
};
|
||||||
|
|
||||||
|
config.plugins.push(
|
||||||
|
new RunNodeWebpackPlugin({
|
||||||
|
runOnlyInWatchMode: true,
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return config;
|
||||||
|
};
|
||||||
|
const createClientConfig = (_env, mode) => {
|
||||||
|
const config = merge({}, base, {
|
||||||
|
mode,
|
||||||
|
entry: './src/client/index.tsx',
|
||||||
|
output: {
|
||||||
|
filename: 'js/client.js',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
if (mode === 'development') {
|
||||||
|
config.cache = {
|
||||||
|
type: 'filesystem',
|
||||||
|
name: 'client',
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return config;
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = (env, properties) => [
|
||||||
|
createServerConfig(env, properties.mode || 'development'),
|
||||||
|
createClientConfig(env, properties.mode || 'development'),
|
||||||
|
];
|