feat(all): tailwind v5 rewrite, astro components
|
@ -1,22 +0,0 @@
|
|||
name: build
|
||||
run-name: build
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: build
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: latest
|
||||
- run: npm ci
|
||||
- run: npm run build
|
||||
- uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: dist
|
||||
path: dist/
|
32
.gitea/workflows/build-dist.yaml
Normal file
|
@ -0,0 +1,32 @@
|
|||
name: build dist
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
build-dist:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Setup bun.sh
|
||||
uses: oven-sh/setup-bun@v2
|
||||
with:
|
||||
bun-version: latest
|
||||
|
||||
- name: Update dependencies
|
||||
run: |
|
||||
bun install
|
||||
bun run build
|
||||
|
||||
- name: Commit updates
|
||||
run: |
|
||||
git config user.name "gitea-actions[bot]"
|
||||
git config user.email "gitea-actions[bot]@git.z0x.ca"
|
||||
git add -f dist
|
||||
git commit -m "ci(dist): build dist"
|
||||
git push
|
37
.gitea/workflows/update-dependencies.yaml
Normal file
|
@ -0,0 +1,37 @@
|
|||
name: update dependencies
|
||||
on:
|
||||
schedule:
|
||||
- cron: '@daily'
|
||||
workflow_dispatch:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
jobs:
|
||||
update-deps:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Setup bun.sh
|
||||
uses: oven-sh/setup-bun@v2
|
||||
with:
|
||||
bun-version: latest
|
||||
|
||||
- name: Update dependencies
|
||||
run: |
|
||||
bun update
|
||||
bun install
|
||||
|
||||
- name: Commit updates
|
||||
run: |
|
||||
git config user.name "gitea-actions[bot]"
|
||||
git config user.email "gitea-actions[bot]@git.z0x.ca"
|
||||
git add .
|
||||
if git diff --staged --quiet; then
|
||||
echo "No updates avalable"
|
||||
else
|
||||
git commit -m "chore(deps): bump dependencies"
|
||||
git push
|
||||
fi
|
|
@ -1 +0,0 @@
|
|||
public/
|
|
@ -1,3 +0,0 @@
|
|||
{
|
||||
"plugins": ["prettier-plugin-tailwindcss", "prettier-plugin-astro"]
|
||||
}
|
4
.vscode/extensions.json
vendored
|
@ -1,4 +1,4 @@
|
|||
{
|
||||
"recommendations": ["astro-build.astro-vscode"],
|
||||
"unwantedRecommendations": []
|
||||
"recommendations": ["astro-build.astro-vscode"],
|
||||
"unwantedRecommendations": []
|
||||
}
|
||||
|
|
3
.vscode/settings.json
vendored
Normal file
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"conventionalCommits.scopes": ["workflow", "index", "package"]
|
||||
}
|
|
@ -1,8 +1,8 @@
|
|||
import { defineConfig } from 'astro/config';
|
||||
import { defineConfig } from "astro/config";
|
||||
import tailwindcss from "@tailwindcss/vite";
|
||||
|
||||
import tailwind from '@astrojs/tailwind';
|
||||
|
||||
// https://astro.build/config
|
||||
export default defineConfig({
|
||||
integrations: [tailwind()]
|
||||
});
|
||||
vite: {
|
||||
plugins: [tailwindcss()],
|
||||
},
|
||||
});
|
||||
|
|
BIN
bun.lockb
Executable file
7373
package-lock.json
generated
23
package.json
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"name": "homepage",
|
||||
"type": "module",
|
||||
"version": "0.0.1",
|
||||
"version": "1.0.0",
|
||||
"scripts": {
|
||||
"dev": "astro dev",
|
||||
"start": "astro dev",
|
||||
|
@ -10,15 +10,18 @@
|
|||
"astro": "astro"
|
||||
},
|
||||
"dependencies": {
|
||||
"@astrojs/check": "^0.9.4",
|
||||
"@astrojs/tailwind": "^5.1.2",
|
||||
"astro": "^4.16.13",
|
||||
"tailwindcss": "^3.4.14",
|
||||
"typescript": "^5.6.3"
|
||||
"astro": "^5.1.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"prettier": "^3.3.3",
|
||||
"prettier-plugin-astro": "^0.14.1",
|
||||
"prettier-plugin-tailwindcss": "^0.6.8"
|
||||
}
|
||||
"@astrojs/check": "^0.9.4",
|
||||
"@biomejs/biome": "1.9.4",
|
||||
"@tailwindcss/vite": "^4.0.0-beta.8",
|
||||
"tailwindcss": "^4.0.0-beta.8"
|
||||
},
|
||||
"trustedDependencies": [
|
||||
"@biomejs/biome",
|
||||
"@parcel/watcher",
|
||||
"esbuild",
|
||||
"sharp"
|
||||
]
|
||||
}
|
||||
|
|
24
src/components/ServiceCard.astro
Normal file
|
@ -0,0 +1,24 @@
|
|||
---
|
||||
export interface ServiceProps {
|
||||
serviceName: string;
|
||||
serviceUrl?: string;
|
||||
}
|
||||
|
||||
const { serviceName, serviceUrl } = Astro.props;
|
||||
|
||||
const formattedName = serviceName.toLowerCase().replace(/\s+/g, "-");
|
||||
|
||||
const svgFile = `/src/icons/${formattedName}.svg`;
|
||||
|
||||
const defaultDomain = "home.arpa";
|
||||
const href = serviceUrl ?? `https://${formattedName}.${defaultDomain}`;
|
||||
---
|
||||
|
||||
<a href={href} target="_blank" rel="noopener noreferrer" aria-label={`Open ${serviceName}`}>
|
||||
<div class="flex items-center space-x-2 p-4 bg-neutral-700 rounded-lg shadow-md hover:bg-neutral-600 transition">
|
||||
<div>
|
||||
<img src={svgFile} alt={`${serviceName} icon`} class="sm:w-12 w-10 aspect-square" />
|
||||
</div>
|
||||
<span>{serviceName}</span>
|
||||
</div>
|
||||
</a>
|
1
src/css/app.css
Normal file
|
@ -0,0 +1 @@
|
|||
@import "tailwindcss";
|
5
src/icons/dockge.svg
Normal file
|
@ -0,0 +1,5 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="#e5e7eb" stroke-linecap="round" stroke-linejoin="round" stroke-width="2">
|
||||
<path d="M12 7m-3 0a3 3 0 1 0 6 0a3 3 0 1 0 -6 0"></path>
|
||||
<path d="M17 16m-3 0a3 3 0 1 0 6 0a3 3 0 1 0 -6 0"></path>
|
||||
<path d="M7 16m-3 0a3 3 0 1 0 6 0a3 3 0 1 0 -6 0"></path>
|
||||
</svg>
|
After Width: | Height: | Size: 342 B |
11
src/icons/dozzle.svg
Normal file
|
@ -0,0 +1,11 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="#e5e7eb" stroke-linecap="round" stroke-linejoin="round" stroke-width="2">
|
||||
<path d="M4 12h.01"></path>
|
||||
<path d="M4 6h.01"></path>
|
||||
<path d="M4 18h.01"></path>
|
||||
<path d="M8 18h2"></path>
|
||||
<path d="M8 12h2"></path>
|
||||
<path d="M8 6h2"></path>
|
||||
<path d="M14 6h6"></path>
|
||||
<path d="M14 12h6"></path>
|
||||
<path d="M14 18h6"></path>
|
||||
</svg>
|
After Width: | Height: | Size: 419 B |
3
src/icons/element.svg
Normal file
|
@ -0,0 +1,3 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="#e5e7eb" stroke-linecap="round" stroke-linejoin="round" stroke-width="2">
|
||||
<path d="M3 20l1.3 -3.9c-2.324 -3.437 -1.426 -7.872 2.1 -10.374c3.526 -2.501 8.59 -2.296 11.845 .48c3.255 2.777 3.695 7.266 1.029 10.501c-2.666 3.235 -7.615 4.215 -11.574 2.293l-4.7 1"></path>
|
||||
</svg>
|
After Width: | Height: | Size: 356 B |
9
src/icons/gitea.svg
Normal file
|
@ -0,0 +1,9 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="#e5e7eb" stroke-linecap="round" stroke-linejoin="round" stroke-width="2">
|
||||
<path d="M16 12m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"></path>
|
||||
<path d="M12 8m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"></path>
|
||||
<path d="M12 16m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"></path>
|
||||
<path d="M12 15v-6"></path>
|
||||
<path d="M15 11l-2 -2"></path>
|
||||
<path d="M11 7l-1.9 -1.9"></path>
|
||||
<path d="M13.446 2.6l7.955 7.954a2.045 2.045 0 0 1 0 2.892l-7.955 7.955a2.045 2.045 0 0 1 -2.892 0l-7.955 -7.955a2.045 2.045 0 0 1 0 -2.892l7.955 -7.955a2.045 2.045 0 0 1 2.892 0z"></path>
|
||||
</svg>
|
After Width: | Height: | Size: 633 B |
6
src/icons/immich.svg
Normal file
|
@ -0,0 +1,6 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="#e5e7eb" stroke-linecap="round" stroke-linejoin="round" stroke-width="2">
|
||||
<path d="M7.5 7c2.485 0 4.5 1.974 4.5 4.409v.591h-8.397a.61 .61 0 0 1 -.426 -.173a.585 .585 0 0 1 -.177 -.418c0 -2.435 2.015 -4.409 4.5 -4.409z"></path>
|
||||
<path d="M16.5 17c-2.485 0 -4.5 -1.974 -4.5 -4.409v-.591h8.397c.333 0 .603 .265 .603 .591c0 2.435 -2.015 4.409 -4.5 4.409z"></path>
|
||||
<path d="M7 16.5c0 -2.485 1.972 -4.5 4.405 -4.5h.595v8.392a.61 .61 0 0 1 -.173 .431a.584 .584 0 0 1 -.422 .177c-2.433 0 -4.405 -2.015 -4.405 -4.5z"></path>
|
||||
<path d="M17 7.5c0 2.485 -1.972 4.5 -4.405 4.5h-.595v-8.397a.61 .61 0 0 1 .175 -.428a.584 .584 0 0 1 .42 -.175c2.433 0 4.405 2.015 4.405 4.5z"></path>
|
||||
</svg>
|
After Width: | Height: | Size: 760 B |
6
src/icons/navidrome.svg
Normal file
|
@ -0,0 +1,6 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="#e5e7eb" stroke-linecap="round" stroke-linejoin="round" stroke-width="2">
|
||||
<path d="M12 12m-9 0a9 9 0 1 0 18 0a9 9 0 1 0 -18 0"></path>
|
||||
<path d="M12 12m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"></path>
|
||||
<path d="M7 12a5 5 0 0 1 5 -5"></path>
|
||||
<path d="M12 17a5 5 0 0 0 5 -5"></path>
|
||||
</svg>
|
After Width: | Height: | Size: 368 B |
4
src/icons/radicale.svg
Normal file
|
@ -0,0 +1,4 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="#e5e7eb" stroke-linecap="round" stroke-linejoin="round" stroke-width="2">
|
||||
<path d="M20 11a8.1 8.1 0 0 0 -15.5 -2m-.5 -4v4h4"></path>
|
||||
<path d="M4 13a8.1 8.1 0 0 0 15.5 2m.5 4v-4h-4"></path>
|
||||
</svg>
|
After Width: | Height: | Size: 280 B |
8
src/icons/redlib.svg
Normal file
|
@ -0,0 +1,8 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="#e5e7eb" stroke-linecap="round" stroke-linejoin="round" stroke-width="2">
|
||||
<path d="M12 8c2.648 0 5.028 .826 6.675 2.14a2.5 2.5 0 0 1 2.326 4.36c0 3.59 -4.03 6.5 -9 6.5c-4.875 0 -8.845 -2.8 -9 -6.294l-1 -.206a2.5 2.5 0 0 1 2.326 -4.36c1.646 -1.313 4.026 -2.14 6.674 -2.14z"></path>
|
||||
<path d="M12 8l1 -5l6 1"></path>
|
||||
<path d="M19 4m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"></path>
|
||||
<circle cx="9" cy="13" r=".5" fill="currentColor"></circle>
|
||||
<circle cx="15" cy="13" r=".5" fill="currentColor"></circle>
|
||||
<path d="M10 17c.667 .333 1.333 .5 2 .5s1.333 -.167 2 -.5"></path>
|
||||
</svg>
|
After Width: | Height: | Size: 659 B |
8
src/icons/scrutiny.svg
Normal file
|
@ -0,0 +1,8 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="#e5e7eb" stroke-linecap="round" stroke-linejoin="round" stroke-width="2">
|
||||
<path d="M3 4m0 3a3 3 0 0 1 3 -3h12a3 3 0 0 1 3 3v2a3 3 0 0 1 -3 3h-12a3 3 0 0 1 -3 -3z"></path>
|
||||
<path d="M3 12m0 3a3 3 0 0 1 3 -3h12a3 3 0 0 1 3 3v2a3 3 0 0 1 -3 3h-12a3 3 0 0 1 -3 -3z"></path>
|
||||
<path d="M7 8l0 .01"></path>
|
||||
<path d="M7 16l0 .01"></path>
|
||||
<path d="M11 8h6"></path>
|
||||
<path d="M11 16h6"></path>
|
||||
</svg>
|
After Width: | Height: | Size: 480 B |
13
src/icons/synapse-admin.svg
Normal file
|
@ -0,0 +1,13 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="#e5e7eb" stroke-linecap="round" stroke-linejoin="round" stroke-width="2">
|
||||
<path d="M7 4h-4v16h4"></path>
|
||||
<path d="M17 4h4v16h-4"></path>
|
||||
<path d="M8 16h.0"></path>
|
||||
<path d="M12 16h.0"></path>
|
||||
<path d="M16 16h.0"></path>
|
||||
<path d="M8 8h.0"></path>
|
||||
<path d="M12 8h.0"></path>
|
||||
<path d="M16 8h.0"></path>
|
||||
<path d="M8 12h.0"></path>
|
||||
<path d="M12 12h.0"></path>
|
||||
<path d="M16 12h.0"></path>
|
||||
</svg>
|
After Width: | Height: | Size: 492 B |
11
src/icons/tailscale.svg
Normal file
|
@ -0,0 +1,11 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="#e5e7eb" stroke-linecap="round" stroke-linejoin="round" stroke-width="2">
|
||||
<path d="M5 5m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"></path>
|
||||
<path d="M12 5m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"></path>
|
||||
<path d="M19 5m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"></path>
|
||||
<path d="M5 12m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"></path>
|
||||
<path d="M12 12m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"></path>
|
||||
<path d="M19 12m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"></path>
|
||||
<path d="M5 19m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"></path>
|
||||
<path d="M12 19m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"></path>
|
||||
<path d="M19 19m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"></path>
|
||||
</svg>
|
After Width: | Height: | Size: 704 B |
7
src/icons/unifi.svg
Normal file
|
@ -0,0 +1,7 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="#e5e7eb" stroke-linecap="round" stroke-linejoin="round" stroke-width="2">
|
||||
<path d="M12 12l0 .01"></path>
|
||||
<path d="M14.828 9.172a4 4 0 0 1 0 5.656"></path>
|
||||
<path d="M17.657 6.343a8 8 0 0 1 0 11.314"></path>
|
||||
<path d="M9.168 14.828a4 4 0 0 1 0 -5.656"></path>
|
||||
<path d="M6.337 17.657a8 8 0 0 1 0 -11.314"></path>
|
||||
</svg>
|
After Width: | Height: | Size: 406 B |
7
src/icons/vaultwarden.svg
Normal file
|
@ -0,0 +1,7 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="#e5e7eb" stroke-linecap="round" stroke-linejoin="round" stroke-width="2">
|
||||
<path d="M5 13a2 2 0 0 1 2 -2h10a2 2 0 0 1 2 2v6a2 2 0 0 1 -2 2h-10a2 2 0 0 1 -2 -2z"></path>
|
||||
<path d="M8 11v-4a4 4 0 1 1 8 0v4"></path>
|
||||
<path d="M15 16h.01"></path>
|
||||
<path d="M12.01 16h.01"></path>
|
||||
<path d="M9.02 16h.01"></path>
|
||||
</svg>
|
After Width: | Height: | Size: 400 B |
48
src/icons/z0x.svg
Normal file
|
@ -0,0 +1,48 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
width="128"
|
||||
height="128"
|
||||
viewBox="0 0 128 128"
|
||||
version="1.1"
|
||||
xml:space="preserve"
|
||||
style="clip-rule:evenodd;fill-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2"
|
||||
id="svg3"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"><defs
|
||||
id="defs3"><linearGradient
|
||||
id="linearGradient26"><stop
|
||||
style="stop-color:#ffffff;stop-opacity:0.30000001;"
|
||||
offset="0"
|
||||
id="stop26" /><stop
|
||||
style="stop-color:#ffffff;stop-opacity:0;"
|
||||
offset="0.9638136"
|
||||
id="stop27" /></linearGradient><radialGradient
|
||||
xlink:href="#linearGradient26"
|
||||
id="radialGradient27"
|
||||
cx="250"
|
||||
cy="250"
|
||||
fx="250"
|
||||
fy="250"
|
||||
r="250"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.6,0,0,0.6,100.00001,100.00002)" /><filter
|
||||
style="color-interpolation-filters:sRGB"
|
||||
id="filter1"
|
||||
x="-0.243"
|
||||
y="-0.243"
|
||||
width="1.486"
|
||||
height="1.486"><feGaussianBlur
|
||||
stdDeviation="30.375"
|
||||
id="feGaussianBlur1" /></filter></defs>
|
||||
|
||||
<circle
|
||||
style="display:inline;fill:url(#radialGradient27);fill-opacity:1;stroke-width:0.300003;filter:url(#filter1)"
|
||||
id="backlight"
|
||||
cx="250"
|
||||
cy="250"
|
||||
r="150"
|
||||
transform="matrix(0.256,0,0,0.256,2.2888184e-6,2.2888184e-6)" /><path
|
||||
d="M 64.00001,6.4 68.608,38.656 c 0.79735,4.95473 3.36351,9.8663 6.912,13.41429 3.54847,3.5487 8.86942,6.52423 13.824,7.32171 L 121.6,64 89.344,68.608 C 84.38942,69.40548 79.06847,72.38102 75.52,75.92971 71.97151,79.4777 69.40535,84.38927 68.608,89.344 L 64.00001,121.6 59.392,89.344 C 58.59465,84.38927 56.02847,79.4777 52.48,75.92971 48.93151,72.38102 43.61058,69.40548 38.656,68.608 L 6.4,64 38.656,59.392 C 43.61058,58.59452 48.93151,55.61899 52.48,52.07029 56.02847,48.5223 58.59465,43.61073 59.392,38.656 Z"
|
||||
style="clip-rule:evenodd;display:inline;fill:#ffffff;fill-rule:evenodd;stroke-width:0.0707615;stroke-linejoin:round;stroke-miterlimit:2"
|
||||
id="star" /></svg>
|
After Width: | Height: | Size: 2 KiB |
8
src/icons/zyxel.svg
Normal file
|
@ -0,0 +1,8 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="#e5e7eb" stroke-linecap="round" stroke-linejoin="round" stroke-width="2">
|
||||
<path d="M3 13m0 2a2 2 0 0 1 2 -2h14a2 2 0 0 1 2 2v4a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2z"></path>
|
||||
<path d="M17 17l0 .01"></path>
|
||||
<path d="M13 17l0 .01"></path>
|
||||
<path d="M15 13l0 -2"></path>
|
||||
<path d="M11.75 8.75a4 4 0 0 1 6.5 0"></path>
|
||||
<path d="M8.5 6.5a8 8 0 0 1 13 0"></path>
|
||||
</svg>
|
After Width: | Height: | Size: 451 B |
|
@ -1,4 +1,9 @@
|
|||
<!doctype html>
|
||||
---
|
||||
import ServiceCard from "../components/ServiceCard.astro";
|
||||
|
||||
const services = [{ serviceName: "Dockge" }, { serviceName: "Dozzle" }, { serviceName: "Element" }, { serviceName: "Gitea", serviceUrl: "https://git.home.arpa" }, { serviceName: "Immich" }, { serviceName: "Navidrome" }, { serviceName: "Radicale" }, { serviceName: "Redlib" }, { serviceName: "Scrutiny" }, { serviceName: "Synapse Admin" }, { serviceName: "Tailscale", serviceUrl: "https://login.tailscale.com/admin" }, { serviceName: "Unifi" }, { serviceName: "Vaultwarden" }, { serviceName: "Zyxel", serviceUrl: "https://10.0.0.1" }, { serviceName: "z0x" }];
|
||||
---
|
||||
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
|
@ -7,203 +12,11 @@
|
|||
<link rel="icon" type="image/x-icon" sizes="192x192" href="/img/favicon.svg" />
|
||||
<link rel="icon" type="image/png" sizes="192x192" href="/img/favicon.svg" />
|
||||
<link rel="apple-touch-icon" type="image/png" sizes="180x180" href="/img/favicon.svg" />
|
||||
<link rel="stylesheet" href="/src/css/app.css" />
|
||||
</head>
|
||||
<body class="flex items-center justify-center min-h-screen p-4 bg-neutral-900 text-neutral-300">
|
||||
<div class="grid grid-cols-2 md:grid-cols-4 gap-4">
|
||||
<a href="https://immich.home.arpa" target="_blank">
|
||||
<div class="flex items-center space-x-2 p-4 bg-neutral-700 rounded-lg shadow-md">
|
||||
<svg class="sm:w-12 w-10 aspect-square" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2">
|
||||
<path d="M7.5 7c2.485 0 4.5 1.974 4.5 4.409v.591h-8.397a.61 .61 0 0 1 -.426 -.173a.585 .585 0 0 1 -.177 -.418c0 -2.435 2.015 -4.409 4.5 -4.409z"></path>
|
||||
<path d="M16.5 17c-2.485 0 -4.5 -1.974 -4.5 -4.409v-.591h8.397c.333 0 .603 .265 .603 .591c0 2.435 -2.015 4.409 -4.5 4.409z"></path>
|
||||
<path d="M7 16.5c0 -2.485 1.972 -4.5 4.405 -4.5h.595v8.392a.61 .61 0 0 1 -.173 .431a.584 .584 0 0 1 -.422 .177c-2.433 0 -4.405 -2.015 -4.405 -4.5z"></path>
|
||||
<path d="M17 7.5c0 2.485 -1.972 4.5 -4.405 4.5h-.595v-8.397a.61 .61 0 0 1 .175 -.428a.584 .584 0 0 1 .42 -.175c2.433 0 4.405 2.015 4.405 4.5z"></path>
|
||||
</svg>
|
||||
<span>Immich</span>
|
||||
</div>
|
||||
</a>
|
||||
<a href="https://vaultwarden.home.arpa" target="_blank">
|
||||
<div class="flex items-center space-x-2 p-4 bg-neutral-700 rounded-lg shadow-md">
|
||||
<svg class="sm:w-12 w-10 aspect-square" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2">
|
||||
<path d="M5 13a2 2 0 0 1 2 -2h10a2 2 0 0 1 2 2v6a2 2 0 0 1 -2 2h-10a2 2 0 0 1 -2 -2z"></path>
|
||||
<path d="M8 11v-4a4 4 0 1 1 8 0v4"></path>
|
||||
<path d="M15 16h.01"></path>
|
||||
<path d="M12.01 16h.01"></path>
|
||||
<path d="M9.02 16h.01"></path>
|
||||
</svg>
|
||||
<span>Vaultwarden</span>
|
||||
</div>
|
||||
</a>
|
||||
<a href="https://radicale.home.arpa" target="_blank">
|
||||
<div class="flex items-center space-x-2 p-4 bg-neutral-700 rounded-lg shadow-md">
|
||||
<svg class="sm:w-12 w-10 aspect-square" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2">
|
||||
<path d="M20 11a8.1 8.1 0 0 0 -15.5 -2m-.5 -4v4h4"></path>
|
||||
<path d="M4 13a8.1 8.1 0 0 0 15.5 2m.5 4v-4h-4"></path>
|
||||
</svg>
|
||||
<span>Radicale</span>
|
||||
</div>
|
||||
</a>
|
||||
<a href="https://dockge.home.arpa" target="_blank">
|
||||
<div class="flex items-center space-x-2 p-4 bg-neutral-700 rounded-lg shadow-md">
|
||||
<svg class="sm:w-12 w-10 aspect-square" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2">
|
||||
<path d="M12 7m-3 0a3 3 0 1 0 6 0a3 3 0 1 0 -6 0"></path>
|
||||
<path d="M17 16m-3 0a3 3 0 1 0 6 0a3 3 0 1 0 -6 0"></path>
|
||||
<path d="M7 16m-3 0a3 3 0 1 0 6 0a3 3 0 1 0 -6 0"></path>
|
||||
</svg>
|
||||
<span>Dockge</span>
|
||||
</div>
|
||||
</a>
|
||||
<a href="https://git.home.arpa" target="_blank">
|
||||
<div class="flex items-center space-x-2 p-4 bg-neutral-700 rounded-lg shadow-md">
|
||||
<svg class="sm:w-12 w-10 aspect-square" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2">
|
||||
<path d="M16 12m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"></path>
|
||||
<path d="M12 8m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"></path>
|
||||
<path d="M12 16m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"></path>
|
||||
<path d="M12 15v-6"></path>
|
||||
<path d="M15 11l-2 -2"></path>
|
||||
<path d="M11 7l-1.9 -1.9"></path>
|
||||
<path d="M13.446 2.6l7.955 7.954a2.045 2.045 0 0 1 0 2.892l-7.955 7.955a2.045 2.045 0 0 1 -2.892 0l-7.955 -7.955a2.045 2.045 0 0 1 0 -2.892l7.955 -7.955a2.045 2.045 0 0 1 2.892 0z"></path>
|
||||
</svg>
|
||||
<span>Gitea</span>
|
||||
</div>
|
||||
</a>
|
||||
<a href="https://element.home.arpa" target="_blank">
|
||||
<div class="flex items-center space-x-2 p-4 bg-neutral-700 rounded-lg shadow-md">
|
||||
<svg class="sm:w-12 w-10 aspect-square" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2">
|
||||
<path d="M3 20l1.3 -3.9c-2.324 -3.437 -1.426 -7.872 2.1 -10.374c3.526 -2.501 8.59 -2.296 11.845 .48c3.255 2.777 3.695 7.266 1.029 10.501c-2.666 3.235 -7.615 4.215 -11.574 2.293l-4.7 1"></path>
|
||||
</svg>
|
||||
<span>Element</span>
|
||||
</div>
|
||||
</a>
|
||||
<a href="https://synapse.home.arpa" target="_blank">
|
||||
<div class="flex items-center space-x-2 p-4 bg-neutral-700 rounded-lg shadow-md">
|
||||
<svg class="sm:w-12 w-10 aspect-square" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2">
|
||||
<path d="M7 4h-4v16h4"></path>
|
||||
<path d="M17 4h4v16h-4"></path>
|
||||
<path d="M8 16h.0"></path>
|
||||
<path d="M12 16h.0"></path>
|
||||
<path d="M16 16h.0"></path>
|
||||
<path d="M8 8h.0"></path>
|
||||
<path d="M12 8h.0"></path>
|
||||
<path d="M16 8h.0"></path>
|
||||
<path d="M8 12h.0"></path>
|
||||
<path d="M12 12h.0"></path>
|
||||
<path d="M16 12h.0"></path>
|
||||
</svg>
|
||||
<span>Synapse Admin</span>
|
||||
</div>
|
||||
</a>
|
||||
<a href="https://navidrome.home.arpa" target="_blank">
|
||||
<div class="flex items-center space-x-2 p-4 bg-neutral-700 rounded-lg shadow-md">
|
||||
<svg class="sm:w-12 w-10 aspect-square" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2">
|
||||
<path d="M12 12m-9 0a9 9 0 1 0 18 0a9 9 0 1 0 -18 0"></path>
|
||||
<path d="M12 12m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"></path>
|
||||
<path d="M7 12a5 5 0 0 1 5 -5"></path>
|
||||
<path d="M12 17a5 5 0 0 0 5 -5"></path>
|
||||
</svg>
|
||||
<span>Navidrome</span>
|
||||
</div>
|
||||
</a>
|
||||
<a href="https://scrutiny.home.arpa" target="_blank">
|
||||
<div class="flex items-center space-x-2 p-4 bg-neutral-700 rounded-lg shadow-md">
|
||||
<svg class="sm:w-12 w-10 aspect-square" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2">
|
||||
<path d="M3 4m0 3a3 3 0 0 1 3 -3h12a3 3 0 0 1 3 3v2a3 3 0 0 1 -3 3h-12a3 3 0 0 1 -3 -3z"></path>
|
||||
<path d="M3 12m0 3a3 3 0 0 1 3 -3h12a3 3 0 0 1 3 3v2a3 3 0 0 1 -3 3h-12a3 3 0 0 1 -3 -3z"></path>
|
||||
<path d="M7 8l0 .01"></path>
|
||||
<path d="M7 16l0 .01"></path>
|
||||
<path d="M11 8h6"></path>
|
||||
<path d="M11 16h6"></path>
|
||||
</svg>
|
||||
<span>Scrutiny</span>
|
||||
</div>
|
||||
</a>
|
||||
<a href="https://redlib.home.arpa" target="_blank">
|
||||
<div class="flex items-center space-x-2 p-4 bg-neutral-700 rounded-lg shadow-md">
|
||||
<svg class="sm:w-12 w-10 aspect-square" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2">
|
||||
<path d="M12 8c2.648 0 5.028 .826 6.675 2.14a2.5 2.5 0 0 1 2.326 4.36c0 3.59 -4.03 6.5 -9 6.5c-4.875 0 -8.845 -2.8 -9 -6.294l-1 -.206a2.5 2.5 0 0 1 2.326 -4.36c1.646 -1.313 4.026 -2.14 6.674 -2.14z"></path>
|
||||
<path d="M12 8l1 -5l6 1"></path>
|
||||
<path d="M19 4m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"></path>
|
||||
<circle cx="9" cy="13" r=".5" fill="currentColor"></circle>
|
||||
<circle cx="15" cy="13" r=".5" fill="currentColor"></circle>
|
||||
<path d="M10 17c.667 .333 1.333 .5 2 .5s1.333 -.167 2 -.5"></path>
|
||||
</svg>
|
||||
<span>Redlib</span>
|
||||
</div>
|
||||
</a>
|
||||
<a href="https://dozzle.home.arpa" target="_blank">
|
||||
<div class="flex items-center space-x-2 p-4 bg-neutral-700 rounded-lg shadow-md">
|
||||
<svg class="sm:w-12 w-10 aspect-square" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2">
|
||||
<path d="M4 12h.01"></path>
|
||||
<path d="M4 6h.01"></path>
|
||||
<path d="M4 18h.01"></path>
|
||||
<path d="M8 18h2"></path>
|
||||
<path d="M8 12h2"></path>
|
||||
<path d="M8 6h2"></path>
|
||||
<path d="M14 6h6"></path>
|
||||
<path d="M14 12h6"></path>
|
||||
<path d="M14 18h6"></path>
|
||||
</svg>
|
||||
<span>Dozzle</span>
|
||||
</div>
|
||||
</a>
|
||||
<a href="https://unifi.home.arpa" target="_blank">
|
||||
<div class="flex items-center space-x-2 p-4 bg-neutral-700 rounded-lg shadow-md">
|
||||
<svg class="sm:w-12 w-10 aspect-square" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2">
|
||||
<path d="M12 12l0 .01"></path>
|
||||
<path d="M14.828 9.172a4 4 0 0 1 0 5.656"></path>
|
||||
<path d="M17.657 6.343a8 8 0 0 1 0 11.314"></path>
|
||||
<path d="M9.168 14.828a4 4 0 0 1 0 -5.656"></path>
|
||||
<path d="M6.337 17.657a8 8 0 0 1 0 -11.314"></path>
|
||||
</svg>
|
||||
<span>Unifi</span>
|
||||
</div>
|
||||
</a>
|
||||
<a href="https://10.0.0.1" target="_blank">
|
||||
<div class="flex items-center space-x-2 p-4 bg-neutral-700 rounded-lg shadow-md">
|
||||
<svg class="sm:w-12 w-10 aspect-square" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2">
|
||||
<path d="M3 13m0 2a2 2 0 0 1 2 -2h14a2 2 0 0 1 2 2v4a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2z"></path>
|
||||
<path d="M17 17l0 .01"></path>
|
||||
<path d="M13 17l0 .01"></path>
|
||||
<path d="M15 13l0 -2"></path>
|
||||
<path d="M11.75 8.75a4 4 0 0 1 6.5 0"></path>
|
||||
<path d="M8.5 6.5a8 8 0 0 1 13 0"></path>
|
||||
</svg>
|
||||
<span>Zyxel</span>
|
||||
</div>
|
||||
</a>
|
||||
<a href="https://login.tailscale.com/admin" target="_blank">
|
||||
<div class="flex items-center space-x-2 p-4 bg-neutral-700 rounded-lg shadow-md">
|
||||
<svg class="sm:w-12 w-10 aspect-square" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2">
|
||||
<path d="M5 5m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"></path>
|
||||
<path d="M12 5m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"></path>
|
||||
<path d="M19 5m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"></path>
|
||||
<path d="M5 12m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"></path>
|
||||
<path d="M12 12m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"></path>
|
||||
<path d="M19 12m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"></path>
|
||||
<path d="M5 19m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"></path>
|
||||
<path d="M12 19m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"></path>
|
||||
<path d="M19 19m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"></path>
|
||||
</svg>
|
||||
<span>Tailscale</span>
|
||||
</div>
|
||||
</a>
|
||||
<a href="https://z0x.home.arpa" target="_blank">
|
||||
<div class="flex items-center space-x-2 p-4 bg-neutral-700 rounded-lg shadow-md">
|
||||
<svg class="sm:w-12 w-10 aspect-square" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 500 500">
|
||||
<defs>
|
||||
<radialGradient id="radialGradient27" cx="250" cy="250" fx="250" fy="250" r="250" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0" stop-color="#ffffff" stop-opacity="0.3"></stop>
|
||||
<stop offset="0.9638136" stop-color="#ffffff" stop-opacity="0"></stop>
|
||||
</radialGradient>
|
||||
<filter id="filter1" x="-0.243" y="-0.243" width="1.486" height="1.486">
|
||||
<feGaussianBlur stdDeviation="30.375"></feGaussianBlur>
|
||||
</filter>
|
||||
</defs>
|
||||
<circle cx="250" cy="250" r="150" fill="url(#radialGradient27)" filter="url(#filter1)"></circle>
|
||||
<path d="M 250.00005,25 268,151 c 3.11463,19.35442 13.1387,38.54023 27,52.39957 13.86121,13.8621 34.64617,25.48527 54,28.60043 L 475,250.00001 349,268 c -19.35383,3.11517 -40.13879,14.73834 -54,28.60043 C 281.1387,310.45977 271.11463,329.64558 268,349 L 250.00005,475 232,349 C 228.88537,329.64558 218.86121,310.45977 205,296.60043 191.1387,282.73834 170.35383,271.11517 151,268 L 25,250.00001 151,232 c 19.35383,-3.11516 40.1387,-14.73833 54,-28.60043 C 218.86121,189.54023 228.88537,170.35442 232,151 Z" fill="#ffffff"></path>
|
||||
</svg>
|
||||
<span>z0x</span>
|
||||
</div>
|
||||
</a>
|
||||
{services.map((service) => <ServiceCard serviceName={service.serviceName} svg={service.svg} serviceUrl={service.serviceUrl} />)}
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
@ -1,8 +0,0 @@
|
|||
/** @type {import('tailwindcss').Config} */
|
||||
export default {
|
||||
content: ['./src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}'],
|
||||
theme: {
|
||||
extend: {},
|
||||
},
|
||||
plugins: [],
|
||||
}
|
|
@ -1,3 +0,0 @@
|
|||
{
|
||||
"extends": "astro/tsconfigs/base"
|
||||
}
|