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.
This commit is contained in:
Dessalines 2021-03-15 13:18:03 -04:00 committed by GitHub
parent dc5487b917
commit 0aad0392bc
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
68 changed files with 10871 additions and 2979 deletions

20
.babelrc Normal file
View 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
View file

@ -0,0 +1,2 @@
node_modules
dist

61
.drone.yml Normal file
View 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
View file

@ -0,0 +1,3 @@
generate_translations.js
webpack.config.js
src/api_tests

45
.eslintrc.json Normal file
View 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
View file

@ -1,4 +1,15 @@
public
static/docs
static/api
dist
.git
.build
.idea
.jshintrc
.sass-cache
.vscode
coverage
jsconfig.json
node_modules
.DS_Store
*.map
*.log
*.swp
*.orig

2
.gitmodules vendored
View file

@ -1,4 +1,4 @@
[submodule "lemmy-docs"]
path = lemmy-docs
url = https://github.com/LemmyNet/lemmy-docs
url = https://github.com/lemmynet/lemmy-docs
branch = main

1
.husky/.gitignore vendored Normal file
View file

@ -0,0 +1 @@
_

4
.husky/pre-commit Executable file
View file

@ -0,0 +1,4 @@
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
yarn lint-staged

4
.prettierrc.js Normal file
View file

@ -0,0 +1,4 @@
module.exports = Object.assign(require("eslint-plugin-prettier"), {
arrowParens: "avoid",
semi: true,
});

48
Dockerfile Normal file
View 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

View file

@ -1,15 +1,15 @@
# Join lemmy site
## Requirements
- [zola](https://www.getzola.org/)
- `yarn` to build the API docs
- `cargo` to build the mdbook docs
## Running
To test / make changes:
- run `./serve.sh`
- Goto http://127.0.0.1:1111
- Goto http://127.0.0.1:1111/docs/en/index.html for docs
- Goto http://127.0.0.1:1111/api/index.html for API
# JoinLemmy-site
## Requirements
- Docker
## Running
```
docker build -t joinlemmy-site
docker run -p 3000:1234 joinlemmy-site
```
and goto http://localhost:3000

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -1,3 +0,0 @@
+++
template = "apps.html"
+++

View file

@ -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-----
```

View file

@ -1,4 +0,0 @@
+++
template = "join.html"
+++

View file

@ -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>

View file

@ -1,7 +1,11 @@
#!/bin/bash
git submodule update --remote
git add lemmy-docs
git commit -m"Updating docs"
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

View file

@ -1,15 +1,77 @@
{
"name": "joinlemmy-site",
"version": "1.0.0",
"description": "Builds the API docs",
"main": "index.js",
"repository": "https://github.com/LemmyNet/joinlemmy-site.git",
"description": "A site for join-lemmy",
"author": "Dessalines <tyhou13@gmx.com>",
"license": "AGPL-3.0-or-later",
"license": "AGPL-3.0",
"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": {
"@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"
]
}
}

View file

@ -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
View 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;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

View file

Before

Width:  |  Height:  |  Size: 9.2 KiB

After

Width:  |  Height:  |  Size: 9.2 KiB

View file

Before

Width:  |  Height:  |  Size: 55 KiB

After

Width:  |  Height:  |  Size: 55 KiB

View file

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

View file

Before

Width:  |  Height:  |  Size: 64 KiB

After

Width:  |  Height:  |  Size: 64 KiB

118
src/assets/images/lemmy.svg Normal file
View 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

View file

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 31 KiB

View file

Before

Width:  |  Height:  |  Size: 97 KiB

After

Width:  |  Height:  |  Size: 97 KiB

View file

Before

Width:  |  Height:  |  Size: 50 KiB

After

Width:  |  Height:  |  Size: 50 KiB

View file

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 29 KiB

View file

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

View file

Before

Width:  |  Height:  |  Size: 95 KiB

After

Width:  |  Height:  |  Size: 95 KiB

View file

Before

Width:  |  Height:  |  Size: 124 KiB

After

Width:  |  Height:  |  Size: 124 KiB

11
src/client/index.tsx Normal file
View 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
View 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);
});

View 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>
</>
);
}
}

View 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>
</>
);
}
}

View 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>
);
}
}

View 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>
);
}
}

View 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>
</>
);
}
}

View 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>
);
}
}

View 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" />;
}
}

View 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>
);
}
}

View 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>
</>
);
}
}

View 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 &gt; 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>
);
}
}

View 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>
</>
);
}
}

View 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>
);
}
}

View 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>
);
}
}

View file

@ -0,0 +1,2 @@
@import "../../../node_modules/chota/dist/chota.min.css";
@import "../../assets/css/main.css";

View 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
View 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,
},
];

View file

@ -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>

File diff suppressed because one or more lines are too long

View file

@ -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

View file

@ -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 %}

View file

@ -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>

View file

@ -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 %}

View file

@ -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 %}

View file

@ -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
View 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
View 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'),
];

8443
yarn.lock

File diff suppressed because it is too large Load diff