Compare commits
1 Commits
9353631931
...
renovate/s
Author | SHA1 | Date | |
---|---|---|---|
b5bae3e3e8 |
@ -3,7 +3,6 @@ name: Build the docker image for the API
|
|||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: ["main"]
|
branches: ["main"]
|
||||||
paths: ["api/**"]
|
|
||||||
|
|
||||||
env:
|
env:
|
||||||
REGISTRY: git.ngn.tf
|
REGISTRY: git.ngn.tf
|
||||||
|
@ -3,7 +3,6 @@ name: Build the docker image for the frontend application
|
|||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: ["main"]
|
branches: ["main"]
|
||||||
paths: ["app/**"]
|
|
||||||
|
|
||||||
env:
|
env:
|
||||||
REGISTRY: git.ngn.tf
|
REGISTRY: git.ngn.tf
|
||||||
|
@ -3,7 +3,6 @@ name: Build the docker image for the doc server
|
|||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: ["main"]
|
branches: ["main"]
|
||||||
paths: ["doc/**"]
|
|
||||||
|
|
||||||
env:
|
env:
|
||||||
REGISTRY: git.ngn.tf
|
REGISTRY: git.ngn.tf
|
||||||
|
21
.github/dependabot.yml
vendored
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
version: 2
|
||||||
|
updates:
|
||||||
|
- package-ecosystem: "npm"
|
||||||
|
directory: "/app"
|
||||||
|
schedule:
|
||||||
|
interval: "daily"
|
||||||
|
|
||||||
|
- package-ecosystem: "gomod"
|
||||||
|
directory: "/api"
|
||||||
|
schedule:
|
||||||
|
interval: "daily"
|
||||||
|
|
||||||
|
- package-ecosystem: "docker"
|
||||||
|
directory: "/app"
|
||||||
|
schedule:
|
||||||
|
interval: "weekly"
|
||||||
|
|
||||||
|
- package-ecosystem: "docker"
|
||||||
|
directory: "/api"
|
||||||
|
schedule:
|
||||||
|
interval: "weekly"
|
14
README.md
@ -1,8 +1,7 @@
|
|||||||
# website | my personal website
|
# website | my personal website
|
||||||
|

|
||||||

|

|
||||||

|

|
||||||

|
|
||||||
|
|
||||||
This repo contains all the source code for my personal website, [ngn.tf](https://ngn.tf)
|
This repo contains all the source code for my personal website, [ngn.tf](https://ngn.tf)
|
||||||
All code is licensed under AGPL version 3 (see [LICENSE.txt](LICENSE.txt))
|
All code is licensed under AGPL version 3 (see [LICENSE.txt](LICENSE.txt))
|
||||||
@ -69,7 +68,6 @@ on my local git server until I deleted it when I was done with 6.0. This website
|
|||||||
|
|
||||||
- **v4.0 (2023 november - 2024 october)**: In this version the frontend was still similar to 3.0, the big changes are in
|
- **v4.0 (2023 november - 2024 october)**: In this version the frontend was still similar to 3.0, the big changes are in
|
||||||
the API. I rewrote the API with Fiber. This version was the first version hosted on `ngn.tf` which is my new domain name.
|
the API. I rewrote the API with Fiber. This version was the first version hosted on `ngn.tf` which is my new domain name.
|
||||||
Here is a [picture of the index](assets/4.0_index.png) and the [blog page](assets/4.0_blog.png).
|
|
||||||
|
|
||||||
- **v5.0 (2024 october - 2025 january)**: This version just had simple frontend UI changes compared to 4.0, at this
|
- **v5.0 (2024 october - 2025 january)**: This version just had simple frontend UI changes compared to 4.0, at this
|
||||||
point I was thinking about doing a massive rework (which I did with 6.0), however I was working on some other shit at
|
point I was thinking about doing a massive rework (which I did with 6.0), however I was working on some other shit at
|
||||||
@ -83,6 +81,6 @@ and Turkish, which was something I wanted to do for the longest time ever.
|
|||||||
|
|
||||||
Damn it has been 4 years since I wrote that shit HTML page huh? Time flies...
|
Damn it has been 4 years since I wrote that shit HTML page huh? Time flies...
|
||||||
|
|
||||||
## Screenshots (from v6.0)
|
## Screenshots (from v4.0)
|
||||||

|

|
||||||

|

|
||||||
|
@ -218,7 +218,6 @@ class AdminScript:
|
|||||||
"logs": self.get_logs,
|
"logs": self.get_logs,
|
||||||
}
|
}
|
||||||
self.api_url_env = "API_URL"
|
self.api_url_env = "API_URL"
|
||||||
self.password_env = "API_PASSWORD"
|
|
||||||
|
|
||||||
def __format_time(self, ts: int) -> str:
|
def __format_time(self, ts: int) -> str:
|
||||||
return datetime.fromtimestamp(ts, UTC).strftime("%H:%M:%S %d/%m/%Y")
|
return datetime.fromtimestamp(ts, UTC).strftime("%H:%M:%S %d/%m/%Y")
|
||||||
@ -265,10 +264,7 @@ class AdminScript:
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
try:
|
try:
|
||||||
password = getenv(self.password_env)
|
|
||||||
if password is None:
|
|
||||||
password = self.log.password("Please enter the admin password")
|
password = self.log.password("Please enter the admin password")
|
||||||
|
|
||||||
self.api = AdminAPI(url, password)
|
self.api = AdminAPI(url, password)
|
||||||
|
|
||||||
if len(argv) == 2:
|
if len(argv) == 2:
|
||||||
@ -405,4 +401,4 @@ class AdminScript:
|
|||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
script = AdminScript()
|
script = AdminScript()
|
||||||
exit(0 if script.run() else 1)
|
exit(script.run() if 1 else 0)
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
FROM golang:1.24.0
|
FROM golang:1.23.4
|
||||||
|
|
||||||
WORKDIR /api
|
WORKDIR /api
|
||||||
|
|
||||||
|
12
api/go.mod
@ -3,20 +3,20 @@ module github.com/ngn13/website/api
|
|||||||
go 1.21.3
|
go 1.21.3
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/gofiber/fiber/v2 v2.52.6
|
github.com/gofiber/fiber/v2 v2.52.5
|
||||||
github.com/mattn/go-sqlite3 v1.14.24
|
github.com/mattn/go-sqlite3 v1.14.24
|
||||||
)
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/andybalholm/brotli v1.1.0 // indirect
|
github.com/andybalholm/brotli v1.0.5 // indirect
|
||||||
github.com/google/uuid v1.6.0 // indirect
|
github.com/google/uuid v1.5.0 // indirect
|
||||||
github.com/klauspost/compress v1.17.9 // indirect
|
github.com/klauspost/compress v1.17.0 // indirect
|
||||||
github.com/mattn/go-colorable v0.1.13 // indirect
|
github.com/mattn/go-colorable v0.1.13 // indirect
|
||||||
github.com/mattn/go-isatty v0.0.20 // indirect
|
github.com/mattn/go-isatty v0.0.20 // indirect
|
||||||
github.com/mattn/go-runewidth v0.0.16 // indirect
|
github.com/mattn/go-runewidth v0.0.15 // indirect
|
||||||
github.com/rivo/uniseg v0.2.0 // indirect
|
github.com/rivo/uniseg v0.2.0 // indirect
|
||||||
github.com/valyala/bytebufferpool v1.0.0 // indirect
|
github.com/valyala/bytebufferpool v1.0.0 // indirect
|
||||||
github.com/valyala/fasthttp v1.51.0 // indirect
|
github.com/valyala/fasthttp v1.51.0 // indirect
|
||||||
github.com/valyala/tcplisten v1.0.0 // indirect
|
github.com/valyala/tcplisten v1.0.0 // indirect
|
||||||
golang.org/x/sys v0.28.0 // indirect
|
golang.org/x/sys v0.15.0 // indirect
|
||||||
)
|
)
|
||||||
|
12
api/go.sum
@ -1,19 +1,11 @@
|
|||||||
github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs=
|
github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs=
|
||||||
github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
|
github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
|
||||||
github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M=
|
|
||||||
github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY=
|
|
||||||
github.com/gofiber/fiber/v2 v2.52.5 h1:tWoP1MJQjGEe4GB5TUGOi7P2E0ZMMRx5ZTG4rT+yGMo=
|
github.com/gofiber/fiber/v2 v2.52.5 h1:tWoP1MJQjGEe4GB5TUGOi7P2E0ZMMRx5ZTG4rT+yGMo=
|
||||||
github.com/gofiber/fiber/v2 v2.52.5/go.mod h1:KEOE+cXMhXG0zHc9d8+E38hoX+ZN7bhOtgeF2oT6jrQ=
|
github.com/gofiber/fiber/v2 v2.52.5/go.mod h1:KEOE+cXMhXG0zHc9d8+E38hoX+ZN7bhOtgeF2oT6jrQ=
|
||||||
github.com/gofiber/fiber/v2 v2.52.6 h1:Rfp+ILPiYSvvVuIPvxrBns+HJp8qGLDnLJawAu27XVI=
|
|
||||||
github.com/gofiber/fiber/v2 v2.52.6/go.mod h1:YEcBbO/FB+5M1IZNBP9FO3J9281zgPAreiI1oqg8nDw=
|
|
||||||
github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU=
|
github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU=
|
||||||
github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
|
|
||||||
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
|
||||||
github.com/klauspost/compress v1.17.0 h1:Rnbp4K9EjcDuVuHtd0dgA4qNuv9yKDYKK1ulpJwgrqM=
|
github.com/klauspost/compress v1.17.0 h1:Rnbp4K9EjcDuVuHtd0dgA4qNuv9yKDYKK1ulpJwgrqM=
|
||||||
github.com/klauspost/compress v1.17.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
|
github.com/klauspost/compress v1.17.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
|
||||||
github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA=
|
|
||||||
github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
|
|
||||||
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
|
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
|
||||||
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
|
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
|
||||||
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
|
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
|
||||||
@ -21,8 +13,6 @@ github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWE
|
|||||||
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
|
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
|
||||||
github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U=
|
github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U=
|
||||||
github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
|
github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
|
||||||
github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc=
|
|
||||||
github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
|
|
||||||
github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM=
|
github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM=
|
||||||
github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
|
github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
|
||||||
github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=
|
github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=
|
||||||
@ -37,5 +27,3 @@ golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBc
|
|||||||
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc=
|
golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc=
|
||||||
golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
|
|
||||||
golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
# build the application with node
|
# build the application with node
|
||||||
FROM node:23.7.0 AS build
|
FROM node:23.5.0 AS build
|
||||||
|
|
||||||
ARG WEBSITE_REPORT_URL
|
ARG WEBSITE_REPORT_URL
|
||||||
ARG WEBSITE_SOURCE_URL
|
ARG WEBSITE_SOURCE_URL
|
||||||
|
113
app/package-lock.json
generated
@ -1,19 +1,20 @@
|
|||||||
{
|
{
|
||||||
"name": "website",
|
"name": "website",
|
||||||
"version": "6.1",
|
"version": "6.0",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "website",
|
"name": "website",
|
||||||
"version": "6.1",
|
"version": "6.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@types/dompurify": "^3.2.0",
|
||||||
"dompurify": "^3.2.3",
|
"dompurify": "^3.2.3",
|
||||||
"marked": "^15.0.6",
|
"marked": "^15.0.6",
|
||||||
"svelte-i18n": "^4.0.1"
|
"svelte-i18n": "^4.0.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@sveltejs/adapter-auto": "^4.0.0",
|
"@sveltejs/adapter-auto": "^3.3.1",
|
||||||
"@sveltejs/adapter-node": "^5.2.11",
|
"@sveltejs/adapter-node": "^5.2.11",
|
||||||
"@sveltejs/kit": "^2.15.1",
|
"@sveltejs/kit": "^2.15.1",
|
||||||
"@sveltejs/vite-plugin-svelte": "^4.0.3",
|
"@sveltejs/vite-plugin-svelte": "^4.0.3",
|
||||||
@ -832,11 +833,10 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@sveltejs/adapter-auto": {
|
"node_modules/@sveltejs/adapter-auto": {
|
||||||
"version": "4.0.0",
|
"version": "3.3.1",
|
||||||
"resolved": "https://registry.npmjs.org/@sveltejs/adapter-auto/-/adapter-auto-4.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/@sveltejs/adapter-auto/-/adapter-auto-3.3.1.tgz",
|
||||||
"integrity": "sha512-kmuYSQdD2AwThymQF0haQhM8rE5rhutQXG4LNbnbShwhMO4qQGnKaaTy+88DuNSuoQDi58+thpq8XpHc1+oEKQ==",
|
"integrity": "sha512-5Sc7WAxYdL6q9j/+D0jJKjGREGlfIevDyHSQ2eNETHcB1TKlQWHcAo8AS8H1QdjNvSXpvOwNjykDUHPEAyGgdQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"import-meta-resolve": "^4.1.0"
|
"import-meta-resolve": "^4.1.0"
|
||||||
},
|
},
|
||||||
@ -845,11 +845,10 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@sveltejs/adapter-node": {
|
"node_modules/@sveltejs/adapter-node": {
|
||||||
"version": "5.2.12",
|
"version": "5.2.11",
|
||||||
"resolved": "https://registry.npmjs.org/@sveltejs/adapter-node/-/adapter-node-5.2.12.tgz",
|
"resolved": "https://registry.npmjs.org/@sveltejs/adapter-node/-/adapter-node-5.2.11.tgz",
|
||||||
"integrity": "sha512-0bp4Yb3jKIEcZWVcJC/L1xXp9zzJS4hDwfb4VITAkfT4OVdkspSHsx7YhqJDbb2hgLl6R9Vs7VQR+fqIVOxPUQ==",
|
"integrity": "sha512-lR7/dfUaKFf3aI408KRDy/BVDYoqUws7zNOJz2Hl4JoshlTnMgdha3brXBRFXB+cWtYvJjjPhvmq3xqpbioi4w==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@rollup/plugin-commonjs": "^28.0.1",
|
"@rollup/plugin-commonjs": "^28.0.1",
|
||||||
"@rollup/plugin-json": "^6.1.0",
|
"@rollup/plugin-json": "^6.1.0",
|
||||||
@ -861,23 +860,24 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@sveltejs/kit": {
|
"node_modules/@sveltejs/kit": {
|
||||||
"version": "2.20.4",
|
"version": "2.15.1",
|
||||||
"resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.20.4.tgz",
|
"resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.15.1.tgz",
|
||||||
"integrity": "sha512-B3Y1mb1Qjt57zXLVch5tfqsK/ebHe6uYTcFSnGFNwRpId3+fplLgQK6Z2zhDVBezSsPuhDq6Pry+9PA88ocN6Q==",
|
"integrity": "sha512-8t7D3hQHbUDMiaQ2RVnjJJ/+Ur4Fn/tkeySJCsHtX346Q9cp3LAnav8xXdfuqYNJwpUGX0x3BqF1uvbmXQw93A==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"hasInstallScript": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@types/cookie": "^0.6.0",
|
"@types/cookie": "^0.6.0",
|
||||||
"cookie": "^0.6.0",
|
"cookie": "^0.6.0",
|
||||||
"devalue": "^5.1.0",
|
"devalue": "^5.1.0",
|
||||||
"esm-env": "^1.2.2",
|
"esm-env": "^1.2.1",
|
||||||
"import-meta-resolve": "^4.1.0",
|
"import-meta-resolve": "^4.1.0",
|
||||||
"kleur": "^4.1.5",
|
"kleur": "^4.1.5",
|
||||||
"magic-string": "^0.30.5",
|
"magic-string": "^0.30.5",
|
||||||
"mrmime": "^2.0.0",
|
"mrmime": "^2.0.0",
|
||||||
"sade": "^1.8.1",
|
"sade": "^1.8.1",
|
||||||
"set-cookie-parser": "^2.6.0",
|
"set-cookie-parser": "^2.6.0",
|
||||||
"sirv": "^3.0.0"
|
"sirv": "^3.0.0",
|
||||||
|
"tiny-glob": "^0.2.9"
|
||||||
},
|
},
|
||||||
"bin": {
|
"bin": {
|
||||||
"svelte-kit": "svelte-kit.js"
|
"svelte-kit": "svelte-kit.js"
|
||||||
@ -892,11 +892,10 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@sveltejs/vite-plugin-svelte": {
|
"node_modules/@sveltejs/vite-plugin-svelte": {
|
||||||
"version": "4.0.4",
|
"version": "4.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-4.0.4.tgz",
|
"resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-4.0.3.tgz",
|
||||||
"integrity": "sha512-0ba1RQ/PHen5FGpdSrW7Y3fAMQjrXantECALeOiOdBdzR5+5vPP6HVZRLmZaQL+W8m++o+haIAKq5qT+MiZ7VA==",
|
"integrity": "sha512-J7nC5gT5qpmvyD2pmzPUntLUgoinyEaNy9sTpGGE6N7pblggO0A1NyneJJvR2ELlzK6ti28aF2SLXG1yJdnJeA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@sveltejs/vite-plugin-svelte-inspector": "^3.0.0-next.0||^3.0.0",
|
"@sveltejs/vite-plugin-svelte-inspector": "^3.0.0-next.0||^3.0.0",
|
||||||
"debug": "^4.3.7",
|
"debug": "^4.3.7",
|
||||||
@ -913,12 +912,11 @@
|
|||||||
"vite": "^5.0.0"
|
"vite": "^5.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@sveltejs/vite-plugin-svelte-inspector": {
|
"node_modules/@sveltejs/vite-plugin-svelte/node_modules/@sveltejs/vite-plugin-svelte-inspector": {
|
||||||
"version": "3.0.1",
|
"version": "3.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-3.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-3.0.0.tgz",
|
||||||
"integrity": "sha512-2CKypmj1sM4GE7HjllT7UKmo4Q6L5xFRd7VMGEWhYnZ+wc6AUVU01IBd7yUi6WnFndEwWoMNOd6e8UjoN0nbvQ==",
|
"integrity": "sha512-hBxSYW/66989cq9dN248omD/ziskSdIV1NqfuueuAI1z6jGcg14k9Zd98pDIEnoA6wC9kWUGuQ6adzBbWwQyRg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"debug": "^4.3.7"
|
"debug": "^4.3.7"
|
||||||
},
|
},
|
||||||
@ -938,6 +936,15 @@
|
|||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
|
"node_modules/@types/dompurify": {
|
||||||
|
"version": "3.2.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/dompurify/-/dompurify-3.2.0.tgz",
|
||||||
|
"integrity": "sha512-Fgg31wv9QbLDA0SpTOXO3MaxySc4DKGLi8sna4/Utjo4r3ZRPdCt4UQee8BWr+Q5z21yifghREPJGYaEOEIACg==",
|
||||||
|
"deprecated": "This is a stub types definition. dompurify provides its own type definitions, so you do not need this installed.",
|
||||||
|
"dependencies": {
|
||||||
|
"dompurify": "*"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@types/estree": {
|
"node_modules/@types/estree": {
|
||||||
"version": "1.0.5",
|
"version": "1.0.5",
|
||||||
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
|
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
|
||||||
@ -1083,9 +1090,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/dompurify": {
|
"node_modules/dompurify": {
|
||||||
"version": "3.2.4",
|
"version": "3.2.3",
|
||||||
"resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.4.tgz",
|
"resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.3.tgz",
|
||||||
"integrity": "sha512-ysFSFEDVduQpyhzAob/kkuJjf5zWkZD8/A9ywSp1byueyuCfHamrCBa14/Oc2iiB0e51B+NpxSl5gmzn+Ms/mg==",
|
"integrity": "sha512-U1U5Hzc2MO0oW3DF+G9qYN0aT7atAou4AgI0XjWz061nyBPbdxkfdhfy5uMgGn6+oLFCfn44ZGbdDqCzVmlOWA==",
|
||||||
"license": "(MPL-2.0 OR Apache-2.0)",
|
"license": "(MPL-2.0 OR Apache-2.0)",
|
||||||
"optionalDependencies": {
|
"optionalDependencies": {
|
||||||
"@types/trusted-types": "^2.0.7"
|
"@types/trusted-types": "^2.0.7"
|
||||||
@ -1182,10 +1189,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/esm-env": {
|
"node_modules/esm-env": {
|
||||||
"version": "1.2.2",
|
"version": "1.2.1",
|
||||||
"resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz",
|
"resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.1.tgz",
|
||||||
"integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==",
|
"integrity": "sha512-U9JedYYjCnadUlXk7e1Kr+aENQhtUaoaV9+gZm1T8LC/YBAPJx3NSPIAurFOC0U5vrdSevnUJS2/wUVxGwPhng=="
|
||||||
"license": "MIT"
|
|
||||||
},
|
},
|
||||||
"node_modules/esniff": {
|
"node_modules/esniff": {
|
||||||
"version": "2.0.1",
|
"version": "2.0.1",
|
||||||
@ -1203,10 +1209,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/esrap": {
|
"node_modules/esrap": {
|
||||||
"version": "1.4.3",
|
"version": "1.3.2",
|
||||||
"resolved": "https://registry.npmjs.org/esrap/-/esrap-1.4.3.tgz",
|
"resolved": "https://registry.npmjs.org/esrap/-/esrap-1.3.2.tgz",
|
||||||
"integrity": "sha512-Xddc1RsoFJ4z9nR7W7BFaEPIp4UXoeQ0+077UdWLxbafMQFyU79sQJMk7kxNgRwQ9/aVgaKacCHC2pUACGwmYw==",
|
"integrity": "sha512-C4PXusxYhFT98GjLSmb20k9PREuUdporer50dhzGuJu9IJXktbMddVCMLAERl5dAHyAi73GWWCE4FVHGP1794g==",
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@jridgewell/sourcemap-codec": "^1.4.15"
|
"@jridgewell/sourcemap-codec": "^1.4.15"
|
||||||
}
|
}
|
||||||
@ -1395,9 +1400,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/marked": {
|
"node_modules/marked": {
|
||||||
"version": "15.0.7",
|
"version": "15.0.6",
|
||||||
"resolved": "https://registry.npmjs.org/marked/-/marked-15.0.7.tgz",
|
"resolved": "https://registry.npmjs.org/marked/-/marked-15.0.6.tgz",
|
||||||
"integrity": "sha512-dgLIeKGLx5FwziAnsk4ONoGwHwGPJzselimvlVskE9XLN4Orv9u2VA3GWw/lYUqjfA0rUT/6fqKwfZJapP9BEg==",
|
"integrity": "sha512-Y07CUOE+HQXbVDCGl3LXggqJDbXDP2pArc2C1N1RRMN0ONiShoSsIInMd5Gsxupe7fKLpgimTV+HOJ9r7bA+pg==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"bin": {
|
"bin": {
|
||||||
"marked": "bin/marked.js"
|
"marked": "bin/marked.js"
|
||||||
@ -1526,9 +1531,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/prettier": {
|
"node_modules/prettier": {
|
||||||
"version": "3.5.1",
|
"version": "3.4.2",
|
||||||
"resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.1.tgz",
|
"resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz",
|
||||||
"integrity": "sha512-hPpFQvHwL3Qv5AdRvBFMhnKo4tYxp0ReXiPn2bxkiohEX6mBeBwEpBSQTkD458RaaDKQMYSp4hX4UtfUTA5wDw==",
|
"integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"bin": {
|
"bin": {
|
||||||
@ -1542,9 +1547,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/prettier-plugin-svelte": {
|
"node_modules/prettier-plugin-svelte": {
|
||||||
"version": "3.3.3",
|
"version": "3.3.2",
|
||||||
"resolved": "https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-3.3.3.tgz",
|
"resolved": "https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-3.3.2.tgz",
|
||||||
"integrity": "sha512-yViK9zqQ+H2qZD1w/bH7W8i+bVfKrD8GIFjkFe4Thl6kCT9SlAsXVNmt3jCvQOCsnOhcvYgsoVlRV/Eu6x5nNw==",
|
"integrity": "sha512-kRPjH8wSj2iu+dO+XaUv4vD8qr5mdDmlak3IT/7AOgGIMRG86z/EHOLauFcClKEnOUf4A4nOA7sre5KrJD4Raw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
@ -1660,10 +1665,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/svelte": {
|
"node_modules/svelte": {
|
||||||
"version": "5.19.10",
|
"version": "5.16.0",
|
||||||
"resolved": "https://registry.npmjs.org/svelte/-/svelte-5.19.10.tgz",
|
"resolved": "https://registry.npmjs.org/svelte/-/svelte-5.16.0.tgz",
|
||||||
"integrity": "sha512-7lId+z36IZWzuo0N0oGOStEPi3/Wv1VQEnIzMmDaLDSlJSruKplhhVr+NaZ0Wh7ZILfOjbeU7PbTjqmQQYZF4A==",
|
"integrity": "sha512-Ygqsiac6UogVED2ruKclU+pOeMThxWtp9LG+li7BXeDKC2paVIsRTMkNmcON4Zejerd1s5sZHWx6ZtU85xklVg==",
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@ampproject/remapping": "^2.3.0",
|
"@ampproject/remapping": "^2.3.0",
|
||||||
"@jridgewell/sourcemap-codec": "^1.5.0",
|
"@jridgewell/sourcemap-codec": "^1.5.0",
|
||||||
@ -1674,7 +1678,7 @@
|
|||||||
"axobject-query": "^4.1.0",
|
"axobject-query": "^4.1.0",
|
||||||
"clsx": "^2.1.1",
|
"clsx": "^2.1.1",
|
||||||
"esm-env": "^1.2.1",
|
"esm-env": "^1.2.1",
|
||||||
"esrap": "^1.4.3",
|
"esrap": "^1.3.2",
|
||||||
"is-reference": "^3.0.3",
|
"is-reference": "^3.0.3",
|
||||||
"locate-character": "^3.0.0",
|
"locate-character": "^3.0.0",
|
||||||
"magic-string": "^0.30.11",
|
"magic-string": "^0.30.11",
|
||||||
@ -2159,11 +2163,10 @@
|
|||||||
"license": "ISC"
|
"license": "ISC"
|
||||||
},
|
},
|
||||||
"node_modules/vite": {
|
"node_modules/vite": {
|
||||||
"version": "5.4.15",
|
"version": "5.4.11",
|
||||||
"resolved": "https://registry.npmjs.org/vite/-/vite-5.4.15.tgz",
|
"resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz",
|
||||||
"integrity": "sha512-6ANcZRivqL/4WtwPGTKNaosuNJr5tWiftOC7liM7G9+rMb8+oeJeyzymDu4rTN93seySBmbjSfsS3Vzr19KNtA==",
|
"integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"esbuild": "^0.21.3",
|
"esbuild": "^0.21.3",
|
||||||
"postcss": "^8.4.43",
|
"postcss": "^8.4.43",
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "website",
|
"name": "website",
|
||||||
"version": "6.1",
|
"version": "6.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite dev",
|
"dev": "vite dev",
|
||||||
@ -10,10 +10,10 @@
|
|||||||
"format": "prettier --write ."
|
"format": "prettier --write ."
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@sveltejs/adapter-auto": "^4.0.0",
|
"@sveltejs/adapter-auto": "^3.3.1",
|
||||||
"@sveltejs/adapter-node": "^5.2.11",
|
"@sveltejs/adapter-node": "^5.2.11",
|
||||||
"@sveltejs/kit": "^2.15.1",
|
"@sveltejs/kit": "^2.15.1",
|
||||||
"@sveltejs/vite-plugin-svelte": "^4.0.3",
|
"@sveltejs/vite-plugin-svelte": "^5.0.0",
|
||||||
"prettier": "^3.4.2",
|
"prettier": "^3.4.2",
|
||||||
"prettier-plugin-svelte": "^3.3.2",
|
"prettier-plugin-svelte": "^3.3.2",
|
||||||
"svelte": "^5.16.0",
|
"svelte": "^5.16.0",
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<footer style="border-top: solid 2px var(--{color()});">
|
<footer style="border-top: solid 2px var(--{color()});">
|
||||||
|
<div class="info">
|
||||||
<div class="links">
|
<div class="links">
|
||||||
<span>
|
<span>
|
||||||
<Link link={import.meta.env.WEBSITE_SOURCE_URL} bold={true}>{$_("footer.source")}</Link>
|
<Link link={import.meta.env.WEBSITE_SOURCE_URL} bold={true}>{$_("footer.source")}</Link>
|
||||||
@ -31,7 +32,12 @@
|
|||||||
>
|
>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<span class="counter">
|
<span>
|
||||||
|
{$_("footer.powered")}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div class="useless">
|
||||||
|
<span>
|
||||||
{$_("footer.number", {
|
{$_("footer.number", {
|
||||||
values: {
|
values: {
|
||||||
total: data.total,
|
total: data.total,
|
||||||
@ -42,6 +48,10 @@
|
|||||||
<span style="color: var(--{color()})">({$_("footer.wow")})</span>
|
<span style="color: var(--{color()})">({$_("footer.wow")})</span>
|
||||||
{/if}
|
{/if}
|
||||||
</span>
|
</span>
|
||||||
|
<span>
|
||||||
|
{$_("footer.version", { values: { api_version: "v1", frontend_version: pkg.version } })}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
@ -51,29 +61,27 @@
|
|||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
background: var(--black-1);
|
background: var(--black-1);
|
||||||
|
|
||||||
box-sizing: border-box;
|
|
||||||
padding: 20px 50px 20px 50px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
div {
|
div {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
color: var(--white-2);
|
||||||
font-size: var(--size-2);
|
font-size: var(--size-2);
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
gap: 5px;
|
gap: 5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
span {
|
.useless {
|
||||||
color: var(--white-2);
|
margin: 25px 50px 25px 0;
|
||||||
font-size: 15px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.counter {
|
|
||||||
text-align: right;
|
text-align: right;
|
||||||
}
|
}
|
||||||
|
|
||||||
.links {
|
.info {
|
||||||
|
margin: 25px 0 25px 50px;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.info .links {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
gap: 5px;
|
gap: 5px;
|
||||||
|
@ -8,20 +8,15 @@
|
|||||||
<svelte:head>
|
<svelte:head>
|
||||||
<title>[ngn.tf] | {title}</title>
|
<title>[ngn.tf] | {title}</title>
|
||||||
|
|
||||||
<meta name="description" content={desc} />
|
<meta content="[ngn.tf] | {title}" property="og:title" />
|
||||||
<meta name="author" content="ngn" />
|
<meta content={desc} property="og:description" />
|
||||||
<meta name="keywords" content="ngn,ngn13,ngn1,ngn.tf" />
|
<meta content={app_url()} property="og:url" />
|
||||||
<meta name="color-scheme" content="only dark" />
|
<meta content="#000000" data-react-helmet="true" name="theme-color" />
|
||||||
<meta name="theme-color" content="#000000" />
|
|
||||||
|
|
||||||
<meta property="og:title" content="[ngn.tf] | {title}" />
|
|
||||||
<meta property="og:description" content={desc} />
|
|
||||||
<meta property="og:url" content={app_url()} />
|
|
||||||
|
|
||||||
<link
|
<link
|
||||||
rel="alternate"
|
rel="alternate"
|
||||||
type="application/atom+xml"
|
type="application/atom+xml"
|
||||||
href={api_urljoin("/news/en")}
|
href={api_urljoin("/news/en")}
|
||||||
title="Service news and updates"
|
title="Atom Feed"
|
||||||
/>
|
/>
|
||||||
</svelte:head>
|
</svelte:head>
|
||||||
|
@ -1,35 +1,14 @@
|
|||||||
<script>
|
<script>
|
||||||
import { browser } from "$app/environment";
|
|
||||||
import { color } from "$lib/util.js";
|
import { color } from "$lib/util.js";
|
||||||
import { _ } from "svelte-i18n";
|
import { _ } from "svelte-i18n";
|
||||||
|
|
||||||
export let picture = "";
|
export let picture = "";
|
||||||
export let title = "";
|
export let title = "";
|
||||||
|
|
||||||
let title_cur = "";
|
|
||||||
|
|
||||||
function animate(title) {
|
|
||||||
if (!browser) return;
|
|
||||||
|
|
||||||
let id = window.setTimeout(function () {}, 0);
|
|
||||||
|
|
||||||
while (id--) clearTimeout(id);
|
|
||||||
|
|
||||||
title_cur = "";
|
|
||||||
|
|
||||||
for (let i = 0; i < title.length; i++) {
|
|
||||||
setTimeout(() => {
|
|
||||||
title_cur += title[i];
|
|
||||||
}, i * 70);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$: animate(title);
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<header>
|
<header>
|
||||||
<div>
|
<div>
|
||||||
<h1 class="title" style="color: var(--{color()})">{title_cur}</h1>
|
<h1 class="title" style="color: var(--{color()})">{title.toLowerCase()}</h1>
|
||||||
<h1 class="cursor" style="color: var(--{color()})">_</h1>
|
<h1 class="cursor" style="color: var(--{color()})">_</h1>
|
||||||
</div>
|
</div>
|
||||||
<img src="/profile/{picture}.png" alt="" />
|
<img src="/profile/{picture}.png" alt="" />
|
||||||
@ -71,6 +50,9 @@
|
|||||||
header div .title {
|
header div .title {
|
||||||
text-shadow: var(--text-shadow);
|
text-shadow: var(--text-shadow);
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
|
width: 0;
|
||||||
|
animation: typing 1s steps(20, end) forwards;
|
||||||
|
animation-delay: 0.3s;
|
||||||
}
|
}
|
||||||
|
|
||||||
header div .cursor {
|
header div .cursor {
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
"donate": "donate"
|
"donate": "donate"
|
||||||
},
|
},
|
||||||
"home": {
|
"home": {
|
||||||
"title": "hello world!",
|
"title": "Hello world!",
|
||||||
"welcome": {
|
"welcome": {
|
||||||
"title": "about",
|
"title": "about",
|
||||||
"desc": "Welcome to my website, I'm ngn",
|
"desc": "Welcome to my website, I'm ngn",
|
||||||
@ -29,9 +29,9 @@
|
|||||||
},
|
},
|
||||||
"services": {
|
"services": {
|
||||||
"title": "services",
|
"title": "services",
|
||||||
"desc": "A part from working on stupid shit, I host free (as in freedom and price) services available for all",
|
"desc": "A part from working on stupid shit, I host free (as in freedom, and price) services available for all",
|
||||||
"speed": "All of these services are available over an 1 Gbit interface",
|
"speed": "All of these services are available over a 600 Mbit/s interface",
|
||||||
"security": "All use SSL encrypted connection and they respect your privacy and freedom",
|
"security": "All use SSL encrypted connection and they are all privacy-respecting",
|
||||||
"privacy": "Accessible from clearnet, TOR and I2P, no region or network blocks",
|
"privacy": "Accessible from clearnet, TOR and I2P, no region or network blocks",
|
||||||
"bullshit": "No CDNs, no cloudflare, no CAPTCHA, no analytics, no bullshit",
|
"bullshit": "No CDNs, no cloudflare, no CAPTCHA, no analytics, no bullshit",
|
||||||
"link": "See all the services!"
|
"link": "See all the services!"
|
||||||
@ -42,7 +42,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"services": {
|
"services": {
|
||||||
"title": "service status",
|
"title": "Service Status",
|
||||||
"none": "No services found",
|
"none": "No services found",
|
||||||
"search": "Search for a service",
|
"search": "Search for a service",
|
||||||
"feed": "News and updates",
|
"feed": "News and updates",
|
||||||
@ -54,7 +54,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"donate": {
|
"donate": {
|
||||||
"title": "donate!",
|
"title": "Donate Money!",
|
||||||
"info": "I spend a lot of time and money on different projects and maintaining different services.",
|
"info": "I spend a lot of time and money on different projects and maintaining different services.",
|
||||||
"price": "I mostly pay for hosting and electricity. Which when added up costs around 550₺ per month (~$15 at the time of writing).",
|
"price": "I mostly pay for hosting and electricity. Which when added up costs around 550₺ per month (~$15 at the time of writing).",
|
||||||
"details": "So even a small donation would be useful. And it would help me keep everything up and running.",
|
"details": "So even a small donation would be useful. And it would help me keep everything up and running.",
|
||||||
@ -64,15 +64,20 @@
|
|||||||
"address": "Adress/Link"
|
"address": "Adress/Link"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"doc": {
|
||||||
|
"title": "Documentation"
|
||||||
|
},
|
||||||
"error": {
|
"error": {
|
||||||
"title": "something went wrong!",
|
"title": "Something went wrong!",
|
||||||
"report": "Report this issue"
|
"report": "Report this issue"
|
||||||
},
|
},
|
||||||
"footer": {
|
"footer": {
|
||||||
"source": "Source",
|
"source": "Source",
|
||||||
"license": "License",
|
"license": "License",
|
||||||
"privacy": "Privacy",
|
"privacy": "Privacy",
|
||||||
|
"powered": "Powered by Svelte, Go, SQLite and donations",
|
||||||
"number": "Visited {total} times since {since}",
|
"number": "Visited {total} times since {since}",
|
||||||
"wow": "wow!!"
|
"wow": "wow!!",
|
||||||
|
"version": "Using API version {api_version}, frontend version {frontend_version}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
"donate": "bağış"
|
"donate": "bağış"
|
||||||
},
|
},
|
||||||
"home": {
|
"home": {
|
||||||
"title": "merhaba dünya!",
|
"title": "Merhaba Dünya!",
|
||||||
"welcome": {
|
"welcome": {
|
||||||
"title": "hakkımda",
|
"title": "hakkımda",
|
||||||
"desc": "Websiteme hoşgeldiniz, ben ngn",
|
"desc": "Websiteme hoşgeldiniz, ben ngn",
|
||||||
@ -30,10 +30,11 @@
|
|||||||
"services": {
|
"services": {
|
||||||
"title": "servisler",
|
"title": "servisler",
|
||||||
"desc": "Salak şeyler inşa etmenin yanı sıra, herkes için kullanıma açık özgür ve ücretsiz servisler host ediyorum",
|
"desc": "Salak şeyler inşa etmenin yanı sıra, herkes için kullanıma açık özgür ve ücretsiz servisler host ediyorum",
|
||||||
"speed": "Tüm servisler 1 Gbit ağ arayüzü üzerinden erişilebilir",
|
"speed": "Tüm servisler 600 Mbit/s ağ arayüzü üzerinden erişilebilir",
|
||||||
"security": "Hepsi SSL şifreli bağlantı kullanıyor ve hepsi gizliliğinize ve özgürlüğünüze saygı gösteriyor",
|
"security": "Hepsi SSL şifreli bağlantı kullanıyor ve hepsi gizliğinize önem veriyor",
|
||||||
|
"privacy": "Accessible from clearnet, TOR and I2P, no region or network blocks",
|
||||||
"privacy": "Açık ağdan, TOR ve I2P'den erişilebilirler, bölge ya da ağ blokları yok",
|
"privacy": "Açık ağdan, TOR ve I2P'den erişilebilirler, bölge ya da ağ blokları yok",
|
||||||
"bullshit": "CDN yok, cloudflare yok, CAPTCHA yok, analitikler ve diğer saçmalıklar yok",
|
"bullshit": "CDN yok, cloudflare yok, CAPTCHA yok, analitikler yok, boktan saçmalıklar yok",
|
||||||
"link": "Tüm servisleri incele!"
|
"link": "Tüm servisleri incele!"
|
||||||
},
|
},
|
||||||
"projects": {
|
"projects": {
|
||||||
@ -42,7 +43,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"services": {
|
"services": {
|
||||||
"title": "servis durumu",
|
"title": "Servis Durumu",
|
||||||
"none": "Servis bulunamadı",
|
"none": "Servis bulunamadı",
|
||||||
"search": "Bir servisi ara",
|
"search": "Bir servisi ara",
|
||||||
"feed": "Yenilikler ve güncellemeler",
|
"feed": "Yenilikler ve güncellemeler",
|
||||||
@ -54,7 +55,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"donate": {
|
"donate": {
|
||||||
"title": "bağış yap!",
|
"title": "Para Bağışla!",
|
||||||
"info": "Farklı projeler ve farklı servisleri yönetmek için oldukça zaman ve para harcıyorum.",
|
"info": "Farklı projeler ve farklı servisleri yönetmek için oldukça zaman ve para harcıyorum.",
|
||||||
"price": "Çoğunlukla hosting ve elektrik için ödeme yapıyorum. Bunlar eklendiği zaman aylık 550₺ civarı bir miktar oluyor (yazdığım sırada ~15$).",
|
"price": "Çoğunlukla hosting ve elektrik için ödeme yapıyorum. Bunlar eklendiği zaman aylık 550₺ civarı bir miktar oluyor (yazdığım sırada ~15$).",
|
||||||
"details": "Bu sebepten küçük bir bağış bile oldukça faydalı olacaktır. Ve herşeyi açık ve çalışmakta tutmama yardımcı olacaktır.",
|
"details": "Bu sebepten küçük bir bağış bile oldukça faydalı olacaktır. Ve herşeyi açık ve çalışmakta tutmama yardımcı olacaktır.",
|
||||||
@ -64,15 +65,20 @@
|
|||||||
"address": "Adres/Bağlantı"
|
"address": "Adres/Bağlantı"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"doc": {
|
||||||
|
"title": "Dökümantasyon"
|
||||||
|
},
|
||||||
"error": {
|
"error": {
|
||||||
"title": "birşeyler yanlış gitti!",
|
"title": "Birşeyler yanlış gitti!",
|
||||||
"report": "Bu sorunu raporlayın"
|
"report": "Bu sorunu raporlayın"
|
||||||
},
|
},
|
||||||
"footer": {
|
"footer": {
|
||||||
"source": "Kaynak",
|
"source": "Kaynak",
|
||||||
"license": "Lisans",
|
"license": "Lisans",
|
||||||
"privacy": "Gizlilik",
|
"privacy": "Gizlilik",
|
||||||
|
"powered": "Svelte, Go, SQLite ve bağışlar tarafından destekleniyor",
|
||||||
"number": "{since} tarihinden beri {total} kez ziyaret edildi",
|
"number": "{since} tarihinden beri {total} kez ziyaret edildi",
|
||||||
"wow": "vay be!!"
|
"wow": "vay be!!",
|
||||||
|
"version": "Kullan API versiyonu {api_version}, arayüz versiyonu {frontend_version}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,22 +1,14 @@
|
|||||||
<script>
|
<script>
|
||||||
import { api_version } from "$lib/api.js";
|
|
||||||
import Header from "$lib/header.svelte";
|
import Header from "$lib/header.svelte";
|
||||||
import Error from "$lib/error.svelte";
|
import Error from "$lib/error.svelte";
|
||||||
import Head from "$lib/head.svelte";
|
import Head from "$lib/head.svelte";
|
||||||
import Card from "$lib/card.svelte";
|
import Card from "$lib/card.svelte";
|
||||||
import Link from "$lib/link.svelte";
|
import Link from "$lib/link.svelte";
|
||||||
|
|
||||||
import { browser } from "$app/environment";
|
|
||||||
import { _, locale } from "svelte-i18n";
|
import { _, locale } from "svelte-i18n";
|
||||||
import { color } from "$lib/util.js";
|
import { color } from "$lib/util.js";
|
||||||
|
|
||||||
let { data } = $props();
|
let { data } = $props();
|
||||||
|
|
||||||
if (browser) {
|
|
||||||
window._version = {};
|
|
||||||
window._version.app = pkg.version;
|
|
||||||
window._version.api = api_version;
|
|
||||||
}
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<Head title="home" desc="home page of my personal website" />
|
<Head title="home" desc="home page of my personal website" />
|
||||||
|
@ -1,8 +1,9 @@
|
|||||||
import { doc_get } from "$lib/doc";
|
import { doc_get_list, doc_get } from "$lib/doc";
|
||||||
|
|
||||||
export async function load({ fetch, params }) {
|
export async function load({ fetch, params }) {
|
||||||
try {
|
try {
|
||||||
return {
|
return {
|
||||||
|
docs: await doc_get_list(fetch),
|
||||||
doc: await doc_get(fetch, params.name),
|
doc: await doc_get(fetch, params.name),
|
||||||
error: "",
|
error: "",
|
||||||
};
|
};
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<Head title="documentation" desc="website and API documentation" />
|
<Head title="documentation" desc="website and API documentation" />
|
||||||
<Header picture="reader" title={data.doc[$locale].title} />
|
<Header picture="reader" title={$_("doc.title")} />
|
||||||
|
|
||||||
{#if data.error.length !== 0}
|
{#if data.error.length !== 0}
|
||||||
{#if !data.error.includes("not found")}
|
{#if !data.error.includes("not found")}
|
||||||
@ -30,9 +30,26 @@
|
|||||||
{/if}
|
{/if}
|
||||||
{:else}
|
{:else}
|
||||||
<main>
|
<main>
|
||||||
|
{#if data.doc !== undefined}
|
||||||
<div class="markdown-body" style="--link-color: var(--{color()})">
|
<div class="markdown-body" style="--link-color: var(--{color()})">
|
||||||
{@html marked.parse(data.doc[$locale].content)}
|
{@html marked.parse(data.doc[$locale].content)}
|
||||||
</div>
|
</div>
|
||||||
|
<div class="docs">
|
||||||
|
{#each data.docs[$locale] as doc}
|
||||||
|
{#if doc.title == data.doc[$locale].title}
|
||||||
|
<a href="/doc/{doc.name}" style="border-color: var(--{color()})">
|
||||||
|
<h1>{doc.title}</h1>
|
||||||
|
<h3>{doc.desc}</h3>
|
||||||
|
</a>
|
||||||
|
{:else}
|
||||||
|
<a href="/doc/{doc.name}" style="border-color: var(--white-3)">
|
||||||
|
<h1>{doc.title}</h1>
|
||||||
|
<h3>{doc.desc}</h3>
|
||||||
|
</a>
|
||||||
|
{/if}
|
||||||
|
{/each}
|
||||||
|
</div>
|
||||||
|
{/if}
|
||||||
</main>
|
</main>
|
||||||
{/if}
|
{/if}
|
||||||
|
|
||||||
@ -41,10 +58,66 @@
|
|||||||
|
|
||||||
main {
|
main {
|
||||||
padding: 50px;
|
padding: 50px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: start;
|
||||||
gap: 30px;
|
gap: 30px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
main .docs {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: end;
|
||||||
|
gap: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
main .docs a {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
background: var(--black-3);
|
||||||
|
text-decoration: none;
|
||||||
|
box-sizing: border-box;
|
||||||
|
border-right-style: solid;
|
||||||
|
padding: 15px;
|
||||||
|
width: 100%;
|
||||||
|
gap: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
main .docs a:hover {
|
||||||
|
box-shadow: var(--box-shadow-2);
|
||||||
|
}
|
||||||
|
|
||||||
|
main .docs a h1 {
|
||||||
|
font-size: var(--size-3);
|
||||||
|
color: var(--white-1);
|
||||||
|
font-weight: 900;
|
||||||
|
}
|
||||||
|
|
||||||
|
main .docs a h3 {
|
||||||
|
font-size: var(--size-2);
|
||||||
|
color: var(--white-3);
|
||||||
|
font-weight: 100;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
main .markdown-body :global(a) {
|
main .markdown-body :global(a) {
|
||||||
color: var(--link-color);
|
color: var(--link-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@media only screen and (max-width: 900px) {
|
||||||
|
main {
|
||||||
|
flex-direction: column-reverse;
|
||||||
|
}
|
||||||
|
|
||||||
|
main .docs {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
main .docs a {
|
||||||
|
border-right-style: none;
|
||||||
|
border-left-style: solid;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
@ -9,3 +9,13 @@
|
|||||||
border-color: transparent;
|
border-color: transparent;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@keyframes typing {
|
||||||
|
from {
|
||||||
|
width: 0%;
|
||||||
|
}
|
||||||
|
|
||||||
|
to {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 21 KiB |
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 25 KiB |
@ -1,2 +0,0 @@
|
|||||||
User-Agent: *
|
|
||||||
Disallow: /doc/
|
|
Before Width: | Height: | Size: 156 KiB |
Before Width: | Height: | Size: 111 KiB |
@ -1,4 +1,4 @@
|
|||||||
{
|
{
|
||||||
"title": "API",
|
"title": "API documentation",
|
||||||
"desc": "Website's API documentation"
|
"desc": "Website's API documentation"
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
My website's API, [api.ngn.tf](https://api.ngn.tf), stores information about my
|
My website's API stores information about my self-hosted services, it also allows me to
|
||||||
self-hosted services, it also allows me to publish news and updates about these
|
publish news and updates about these services using an Atom feed and it keeps track of
|
||||||
services using an Atom feed and it keeps track of visitor metrics. The API itself is
|
visitor metrics. The API itself is written in Go and uses SQLite for storage.
|
||||||
written in Go and uses SQLite for storage.
|
|
||||||
|
|
||||||
This documentation contains information about all the available API endpoints.
|
This documentation contains information about all the available API endpoints.
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
{
|
{
|
||||||
"title": "API",
|
"title": "API dökümantasyonu",
|
||||||
"desc": "Websitesinin API dökümantasyonu"
|
"desc": "Websitesinin API dökümantasyonu"
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
Websitemin API, [api.ngn.tf](https://api.ngn.tf), self-host edilen servisler hakkında bilgileri
|
Websitemin API self-host edilen servisler hakkında bilgileri tutuyor, bu servisler hakkında
|
||||||
tutuyor, bu servisler hakkında haberleri ve güncellemeleri bir Atom feed'i aracılığı ile
|
haberleri ve güncellemeleri bir Atom feed'i aracılığı ile paylaşmama izin veriyor ve ziyartçi
|
||||||
paylaşmama izin veriyor ve ziyartçi metriklerini takip ediyor. API'ın kendisi Go ile yazıldı ve
|
metriklerini takip ediyor. API'ın kendisi Go ile yazıldı ve veritabanı olarak SQLite kullanıyor.
|
||||||
veritabanı olarak SQLite kullanıyor.
|
|
||||||
|
|
||||||
Bu dökümentasyon tüm erişeme açık API endpoint'leri hakkında bilgiler içeriyor.
|
Bu dökümentasyon tüm erişeme açık API endpoint'leri hakkında bilgiler içeriyor.
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
{
|
{
|
||||||
"title": "source license",
|
"title": "License",
|
||||||
"desc": "Source code license"
|
"desc": "Source code license"
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
{
|
{
|
||||||
"title": "kaynak lisansı",
|
"title": "Lisans",
|
||||||
"desc": "Kaynak kodu lisansı"
|
"desc": "Kaynak kodu lisansı"
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
{
|
{
|
||||||
"title": "privacy",
|
"title": "Privacy",
|
||||||
"desc": "Learn how I respect your privacy"
|
"desc": "Learn how I respect your privacy"
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
{
|
{
|
||||||
"title": "gizlilik",
|
"title": "Gizlilik",
|
||||||
"desc": "Gizliliğinize nasıl önem verdiğimi öğrenin"
|
"desc": "Gizliliğinize nasıl önem verdiğimi öğrenin"
|
||||||
}
|
}
|
||||||
|
@ -10,7 +10,6 @@
|
|||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
option_t options[] = {
|
option_t options[] = {
|
||||||
// name value requied
|
|
||||||
{"host", "0.0.0.0:7003", true }, // host the server should listen on
|
{"host", "0.0.0.0:7003", true }, // host the server should listen on
|
||||||
{"docs_dir", "./docs", true }, // documentation directory
|
{"docs_dir", "./docs", true }, // documentation directory
|
||||||
{"", NULL, false},
|
{"", NULL, false},
|
||||||
|
@ -13,11 +13,7 @@ int main() {
|
|||||||
|
|
||||||
if (!config_load(&conf))
|
if (!config_load(&conf))
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
|
host = config_get(&conf, "host");
|
||||||
if (NULL == (host = config_get(&conf, "host"))) {
|
|
||||||
ctorm_fail("failed to get the host configuration");
|
|
||||||
return EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
ctorm_config_new(&app_config);
|
ctorm_config_new(&app_config);
|
||||||
app_config.disable_logging = true;
|
app_config.disable_logging = true;
|
||||||
@ -26,6 +22,7 @@ int main() {
|
|||||||
// middlewares
|
// middlewares
|
||||||
MIDDLEWARE_ALL(app, "/*", route_cors);
|
MIDDLEWARE_ALL(app, "/*", route_cors);
|
||||||
MIDDLEWARE_ALL(app, "/*/*", route_cors);
|
MIDDLEWARE_ALL(app, "/*/*", route_cors);
|
||||||
|
MIDDLEWARE_ALL(app, "/*/*/*", route_cors);
|
||||||
|
|
||||||
// routes
|
// routes
|
||||||
GET(app, "/list", route_list);
|
GET(app, "/list", route_list);
|
||||||
|