Compare commits

...
9 Commits
Author SHA1 Message Date
khairul169 6a2d3a46af feat: update yt2mp3 icon 2024-08-25 07:41:42 +07:00
khairul169 e00b636f36 feat: update yt2mp3 url 2024-08-25 07:40:19 +07:00
khairul169 4c94df12b9 feat: add garage, proxmox, & yt2mp3 2024-08-25 07:39:01 +07:00
khairul169 30aac12208 feat: add swfs 2024-08-13 16:57:30 +07:00
khairul169 7e504bf12c feat: add aria ng 2024-08-11 03:31:11 +07:00
khairul169 087992b232 feat: add cockpit 2024-08-11 03:27:47 +07:00
khairul169 677191e9c9 feat: add ytdl app 2024-08-11 03:20:10 +07:00
khairul169 9ab145d23d feat: hide appicon & appname, place on bottom 2024-08-11 03:16:31 +07:00
khairul169 dc48c53aa2 feat: open apps menu on scroll, set apps to grid view, etc 2024-08-11 03:08:59 +07:00
10 changed files with 738 additions and 283 deletions
+59 -57
View File
@@ -1,103 +1,105 @@
.main {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
.appicon {
width: 192px;
height: 192px;
object-fit: cover;
transition: transform .4s, opacity .4s;
width: 192px;
height: 192px;
object-fit: cover;
transition: transform 0.4s, opacity 0.4s;
}
.appicon.notloaded {
transform: scale(.8);
opacity: 0;
transform: scale(0.8);
opacity: 0;
}
#theme-switcher i {
position: relative;
overflow: hidden;
position: relative;
overflow: hidden;
}
#theme-switcher i::before, #theme-switcher i::after {
position: absolute;
top: 50%;
left: 50%;
--hidden: 1;
opacity: calc(1 - var(--hidden));
transform: translate(-50%, -50%) rotateZ(calc(var(--hidden) * 360deg)) scale(calc(1 - var(--hidden) / 2));
transition: transform .3s, opacity .3s;
#theme-switcher i::before,
#theme-switcher i::after {
position: absolute;
top: 50%;
left: 50%;
--hidden: 1;
opacity: calc(1 - var(--hidden));
transform: translate(-50%, -50%) rotateZ(calc(var(--hidden) * 360deg))
scale(calc(1 - var(--hidden) / 2));
transition: transform 0.3s, opacity 0.3s;
}
#theme-switcher i::before {
--hidden: 0;
--dark: 0;
content: "light_mode";
--hidden: 0;
--dark: 0;
content: "light_mode";
}
#theme-switcher i::after {
--dark: 1;
content: "dark_mode";
--dark: 1;
content: "dark_mode";
}
.home.page {
top: 50%;
left: 50%;
width: 100%;
height: auto;
overflow: hidden;
transform: translate(-50%, -50%);
top: 90%;
left: 50%;
width: 100%;
height: auto;
overflow: hidden;
transform: translate(-50%, -50%);
}
.home.page:not(.current) {
top: calc(50% - 64px);
top: calc(50% - 64px);
}
.home .wrapper {
box-shadow: none;
background: transparent;
backdrop-filter: none;
box-shadow: none;
background: transparent;
backdrop-filter: none;
}
.appname {
font-size: 48px;
font-size: 48px;
}
.appdesc {
opacity: .6;
margin: 2px 12px;
opacity: 0.6;
margin: 2px 12px;
}
.buttons {
box-shadow: 2px 2px 8px #0002;
display: flex;
margin: 16px auto 0;
backdrop-filter: var(--blur);
border-radius: 24px;
max-width: 480px;
background: var(--background);
padding: 2px;
justify-content: space-between;
transition: background .3s;
box-shadow: 2px 2px 8px #0002;
display: flex;
margin: 16px auto 0;
backdrop-filter: var(--blur);
border-radius: 24px;
max-width: 480px;
background: var(--background);
padding: 2px;
justify-content: space-between;
transition: background 0.3s;
}
.buttons > div {
padding: 16px;
margin: 2px;
cursor: pointer;
border-radius: 20px;
width: 100%;
transition: background .2s;
padding: 16px;
margin: 2px;
cursor: pointer;
border-radius: 20px;
width: 100%;
transition: background 0.2s;
}
.buttons > div:hover {
background: var(--hover);
background: var(--hover);
}
.buttons .text {
margin-top: -2px;
margin-top: -2px;
}
+41 -29
View File
@@ -1,52 +1,64 @@
.boxes {
display: flex;
flex: 1 1 0;
flex-wrap: wrap;
display: grid;
grid-template-columns: repeat(1, 1fr);
grid-gap: 8px;
padding: 16px;
}
.box {
min-width: 292px;
flex: 1;
margin: 2px;
border-radius: 20px;
padding: 8px;
display: flex;
align-items: center;
text-align: left;
text-decoration: none;
color: inherit;
transition: background .2s;
border-radius: 20px;
padding: 8px;
display: flex;
align-items: center;
text-align: left;
text-decoration: none;
color: inherit;
transition: background 0.2s;
}
.box:hover {
background: var(--hover);
background: var(--hover);
}
.box i {
font-size: 24px;
padding: 20px;
background: hsl(var(--color), 100%, 89%);
color: hsl(var(--color), 100%, 35%);
border-radius: 100px;
margin: 2px 12px 2px 2px;
font-size: 24px;
padding: 20px;
background: hsl(var(--color), 100%, 89%);
color: hsl(var(--color), 100%, 35%);
border-radius: 100px;
margin: 2px 12px 2px 2px;
}
a.box {
cursor: pointer;
padding: 14px;
cursor: pointer;
padding: 14px;
}
.box img {
width: 64px;
height: 64px;
object-fit: cover;
margin-right: 12px;
width: 64px;
height: 64px;
object-fit: cover;
margin-right: 12px;
}
.box .name {
font-size: 18px;
font-size: 16px;
}
.box .desc {
opacity: .6;
opacity: 0.6;
}
/* media query for medium screens */
@media only screen and (min-width: 512px) {
.boxes {
grid-template-columns: repeat(2, 1fr);
}
}
/* large screens */
@media only screen and (min-width: 768px) {
.boxes {
grid-template-columns: repeat(3, 1fr);
}
}
+82 -78
View File
@@ -1,84 +1,88 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<link rel="icon" id="favicon">
<link rel="stylesheet" type="text/css" href="css/main.css">
<script src="js/main.js" type="module"></script>
<link rel="manifest" href="config/manifest.json" />
</head>
<body>
<div id="background"></div>
<div class="main">
<head>
<meta charset="utf-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"
/>
<link rel="icon" id="favicon" />
<link rel="stylesheet" type="text/css" href="css/main.css" />
<script src="js/main.js" type="module"></script>
<link rel="manifest" href="config/manifest.json" />
</head>
<body>
<div id="background"></div>
<div class="main">
<!-- Home page -->
<div class="page home" p="home">
<div class="wrapper">
<!-- <div class="home">
<img class="appicon" />
<div class="appname"></div>
<div class="appdesc"></div>
</div> -->
<div class="buttons">
<div id="theme-switcher">
<i>&nbsp;</i>
<div class="text">Theme</div>
</div>
<div t="services">
<i>apps</i>
<div class="text">Services</div>
</div>
<div t="more">
<i>more</i>
<div class="text">More</div>
</div>
</div>
</div>
</div>
<!-- Home page -->
<div class="page home" p="home">
<div class="wrapper">
<div class="home">
<img class="appicon">
<div class="appname"></div>
<div class="appdesc"></div>
</div>
<div class="buttons">
<div id="theme-switcher">
<i>&nbsp;</i>
<div class="text">Theme</div>
</div>
<div t="services">
<i>apps</i>
<div class="text">Services</div>
</div>
<div t="more">
<i>more</i>
<div class="text">More</div>
</div>
</div>
</div>
</div>
<!-- App list -->
<div class="page" p="services">
<div class="back"><i></i></div>
<div class="wrapper">
<div class="header">
<i>apps</i>
<div class="text">Services</div>
</div>
<div class="boxes" id="app-list"></div>
</div>
</div>
<!-- App list -->
<div class="page" p="services">
<div class="back"><i></i></div>
<div class="wrapper">
<div class="header">
<i>apps</i>
<div class="text">Services</div>
</div>
<div class="boxes" id="app-list"></div>
</div>
</div>
<!-- More -->
<div class="page" p="more">
<div class="back"><i></i></div>
<div class="wrapper">
<div class="subswitch">
<div>Overview</div>
<div>Settings</div>
</div>
<div class="subpages">
<!-- Overview -->
<div>
<div class="overview">
<i>rocket_launch</i>
<div>
<div class="big"></div>
<div class="small"></div>
</div>
</div>
<div class="privacy-boxes"></div>
</div>
<!-- More -->
<div class="page" p="more">
<div class="back"><i></i></div>
<div class="wrapper">
<div class="subswitch">
<div>Overview</div>
<div>Settings</div>
</div>
<div class="subpages">
<!-- Overview -->
<div>
<div class="overview">
<i>rocket_launch</i>
<div>
<div class="big"></div>
<div class="small"></div>
</div>
</div>
<div class="privacy-boxes"></div>
</div>
<!-- Settings -->
<div>
<div id="no-cookies">WARNING: due to blocked cookies, all settings will be lost after page reload</div>
<div id="settings"></div>
</div>
</div>
</div>
</div>
</div>
</body>
<!-- Settings -->
<div>
<div id="no-cookies">
WARNING: due to blocked cookies, all settings will be lost after
page reload
</div>
<div id="settings"></div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
+44 -45
View File
@@ -1,53 +1,52 @@
import App from "../../App"
import { showPage } from "../../Utils/DOMUtils"
import App from "../../App";
import { showPage } from "../../Utils/DOMUtils";
export default class Home {
constructor() {
this.app = new App()
this.config = this.app.config
this.init()
}
constructor() {
this.app = new App();
this.config = this.app.config;
this.init();
}
init() {
this.initButtons()
this.initHomeUI()
this.initBackButtons()
}
init() {
this.initButtons();
// this.initHomeUI();
this.initBackButtons();
}
initButtons() {
let buttons = document.querySelector(".buttons").children
for (let button of buttons) {
let target = button.getAttribute("t")
if (target) {
button.addEventListener("click", () => {
showPage(target)
})
}
}
}
initButtons() {
let buttons = document.querySelector(".buttons").children;
for (let button of buttons) {
let target = button.getAttribute("t");
if (target) {
button.addEventListener("click", () => {
showPage(target);
});
}
}
}
initBackButtons() {
let backButtons = document.querySelectorAll(".back")
for (let button of backButtons) {
button.addEventListener("click", () => {
showPage("home")
})
}
}
initBackButtons() {
let backButtons = document.querySelectorAll(".back");
for (let button of backButtons) {
button.addEventListener("click", () => {
showPage("home");
});
}
}
initHomeUI() {
let logo = document.querySelector(".appicon")
logo.src = this.config.get("icon")
logo.classList.add("notloaded")
logo.addEventListener("load", () => {
logo.classList.remove("notloaded")
})
initHomeUI() {
let logo = document.querySelector(".appicon");
logo.src = this.config.get("icon");
logo.classList.add("notloaded");
logo.addEventListener("load", () => {
logo.classList.remove("notloaded");
});
let name = document.querySelector(".appname")
name.innerText = this.config.get("name")
let name = document.querySelector(".appname");
name.innerText = this.config.get("name");
let desc = document.querySelector(".appdesc")
desc.innerText = this.config.get("desc")
}
}
let desc = document.querySelector(".appdesc");
desc.innerText = this.config.get("desc");
}
}
+44 -25
View File
@@ -1,31 +1,50 @@
import App from "../../App"
import App from "../../App";
import { currentPage, showPage } from "../../Utils/DOMUtils";
export default class Main {
constructor() {
this.app = new App()
this.config = this.app.config
this.init()
}
constructor() {
this.app = new App();
this.config = this.app.config;
this.init();
}
init() {
document.title = this.config.get("name")
document.querySelector("#favicon").href = this.config.get("icon")
this.initBackgrounds()
}
init() {
document.title = this.config.get("name");
document.querySelector("#favicon").href = this.config.get("icon");
this.initBackgrounds();
this.initScrollEvent();
}
initBackgrounds() {
this.backgrounds = document.querySelector("#background")
for (let i = 0; i < 2; i++) {
let img = document.createElement("img")
img.classList.add("notloaded")
img.addEventListener("load", () => {
img.classList.remove("notloaded")
})
this.backgrounds.appendChild(img)
}
initBackgrounds() {
this.backgrounds = document.querySelector("#background");
for (let i = 0; i < 2; i++) {
let img = document.createElement("img");
img.classList.add("notloaded");
img.addEventListener("load", () => {
img.classList.remove("notloaded");
});
this.backgrounds.appendChild(img);
}
this.backgrounds = this.backgrounds.children
this.backgrounds[0].src = this.config.get("wallpaper")
this.backgrounds[1].src = this.config.get("wallpaper_dark")
}
this.backgrounds = this.backgrounds.children;
this.backgrounds[0].src = this.config.get("wallpaper");
this.backgrounds[1].src = this.config.get("wallpaper_dark");
}
initScrollEvent() {
const servicesPage = document.querySelector(".page[p=services]");
window.addEventListener("wheel", (e) => {
if (currentPage === "home" && e.deltaY > 0) {
showPage("services");
}
if (
currentPage === "services" &&
e.deltaY < 0 &&
servicesPage.scrollTop === 0
) {
showPage("home");
}
});
}
}
+12 -10
View File
@@ -1,13 +1,15 @@
export let currentPage;
export function showPage(target) {
let bg = document.querySelector("#background").classList
if (target == "home") bg.add("scaled")
else bg.remove("scaled")
let pages = document.querySelectorAll(".page")
for (let page of pages) {
let p = page.getAttribute("p")
if (p == target) page.classList.add("current")
else page.classList.remove("current")
}
let bg = document.querySelector("#background").classList;
if (target == "home") bg.add("scaled");
else bg.remove("scaled");
let pages = document.querySelectorAll(".page");
for (let page of pages) {
let p = page.getAttribute("p");
if (p == target) page.classList.add("current");
else page.classList.remove("current");
}
currentPage = target;
}
+2 -1
View File
@@ -6,7 +6,8 @@
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview --host"
"preview": "vite preview --host",
"deploy": "cp -r dist/* ../honey"
},
"devDependencies": {
"vite": "^4.5.0"
+326
View File
@@ -0,0 +1,326 @@
lockfileVersion: '9.0'
settings:
autoInstallPeers: true
excludeLinksFromLockfile: false
importers:
.:
devDependencies:
vite:
specifier: ^4.5.0
version: 4.5.3
packages:
'@esbuild/[email protected]':
resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==}
engines: {node: '>=12'}
cpu: [arm64]
os: [android]
'@esbuild/[email protected]':
resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==}
engines: {node: '>=12'}
cpu: [arm]
os: [android]
'@esbuild/[email protected]':
resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==}
engines: {node: '>=12'}
cpu: [x64]
os: [android]
'@esbuild/[email protected]':
resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==}
engines: {node: '>=12'}
cpu: [arm64]
os: [darwin]
'@esbuild/[email protected]':
resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==}
engines: {node: '>=12'}
cpu: [x64]
os: [darwin]
'@esbuild/[email protected]':
resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==}
engines: {node: '>=12'}
cpu: [arm64]
os: [freebsd]
'@esbuild/[email protected]':
resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==}
engines: {node: '>=12'}
cpu: [x64]
os: [freebsd]
'@esbuild/[email protected]':
resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==}
engines: {node: '>=12'}
cpu: [arm64]
os: [linux]
'@esbuild/[email protected]':
resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==}
engines: {node: '>=12'}
cpu: [arm]
os: [linux]
'@esbuild/[email protected]':
resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==}
engines: {node: '>=12'}
cpu: [ia32]
os: [linux]
'@esbuild/[email protected]':
resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==}
engines: {node: '>=12'}
cpu: [loong64]
os: [linux]
'@esbuild/[email protected]':
resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==}
engines: {node: '>=12'}
cpu: [mips64el]
os: [linux]
'@esbuild/[email protected]':
resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==}
engines: {node: '>=12'}
cpu: [ppc64]
os: [linux]
'@esbuild/[email protected]':
resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==}
engines: {node: '>=12'}
cpu: [riscv64]
os: [linux]
'@esbuild/[email protected]':
resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==}
engines: {node: '>=12'}
cpu: [s390x]
os: [linux]
'@esbuild/[email protected]':
resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==}
engines: {node: '>=12'}
cpu: [x64]
os: [linux]
'@esbuild/[email protected]':
resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==}
engines: {node: '>=12'}
cpu: [x64]
os: [netbsd]
'@esbuild/[email protected]':
resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==}
engines: {node: '>=12'}
cpu: [x64]
os: [openbsd]
'@esbuild/[email protected]':
resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==}
engines: {node: '>=12'}
cpu: [x64]
os: [sunos]
'@esbuild/[email protected]':
resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==}
engines: {node: '>=12'}
cpu: [arm64]
os: [win32]
'@esbuild/[email protected]':
resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==}
engines: {node: '>=12'}
cpu: [ia32]
os: [win32]
'@esbuild/[email protected]':
resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==}
engines: {node: '>=12'}
cpu: [x64]
os: [win32]
[email protected]:
resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==}
engines: {node: '>=12'}
hasBin: true
[email protected]:
resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
os: [darwin]
[email protected]:
resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
[email protected]:
resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==}
[email protected]:
resolution: {integrity: sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==}
engines: {node: ^10 || ^12 || >=14}
[email protected]:
resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==}
engines: {node: '>=14.18.0', npm: '>=8.0.0'}
hasBin: true
[email protected]:
resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==}
engines: {node: '>=0.10.0'}
[email protected]:
resolution: {integrity: sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg==}
engines: {node: ^14.18.0 || >=16.0.0}
hasBin: true
peerDependencies:
'@types/node': '>= 14'
less: '*'
lightningcss: ^1.21.0
sass: '*'
stylus: '*'
sugarss: '*'
terser: ^5.4.0
peerDependenciesMeta:
'@types/node':
optional: true
less:
optional: true
lightningcss:
optional: true
sass:
optional: true
stylus:
optional: true
sugarss:
optional: true
terser:
optional: true
snapshots:
'@esbuild/[email protected]':
optional: true
'@esbuild/[email protected]':
optional: true
'@esbuild/[email protected]':
optional: true
'@esbuild/[email protected]':
optional: true
'@esbuild/[email protected]':
optional: true
'@esbuild/[email protected]':
optional: true
'@esbuild/[email protected]':
optional: true
'@esbuild/[email protected]':
optional: true
'@esbuild/[email protected]':
optional: true
'@esbuild/[email protected]':
optional: true
'@esbuild/[email protected]':
optional: true
'@esbuild/[email protected]':
optional: true
'@esbuild/[email protected]':
optional: true
'@esbuild/[email protected]':
optional: true
'@esbuild/[email protected]':
optional: true
'@esbuild/[email protected]':
optional: true
'@esbuild/[email protected]':
optional: true
'@esbuild/[email protected]':
optional: true
'@esbuild/[email protected]':
optional: true
'@esbuild/[email protected]':
optional: true
'@esbuild/[email protected]':
optional: true
'@esbuild/[email protected]':
optional: true
[email protected]:
optionalDependencies:
'@esbuild/android-arm': 0.18.20
'@esbuild/android-arm64': 0.18.20
'@esbuild/android-x64': 0.18.20
'@esbuild/darwin-arm64': 0.18.20
'@esbuild/darwin-x64': 0.18.20
'@esbuild/freebsd-arm64': 0.18.20
'@esbuild/freebsd-x64': 0.18.20
'@esbuild/linux-arm': 0.18.20
'@esbuild/linux-arm64': 0.18.20
'@esbuild/linux-ia32': 0.18.20
'@esbuild/linux-loong64': 0.18.20
'@esbuild/linux-mips64el': 0.18.20
'@esbuild/linux-ppc64': 0.18.20
'@esbuild/linux-riscv64': 0.18.20
'@esbuild/linux-s390x': 0.18.20
'@esbuild/linux-x64': 0.18.20
'@esbuild/netbsd-x64': 0.18.20
'@esbuild/openbsd-x64': 0.18.20
'@esbuild/sunos-x64': 0.18.20
'@esbuild/win32-arm64': 0.18.20
'@esbuild/win32-ia32': 0.18.20
'@esbuild/win32-x64': 0.18.20
[email protected]:
optional: true
[email protected]: {}
[email protected]: {}
[email protected]:
dependencies:
nanoid: 3.3.7
picocolors: 1.0.1
source-map-js: 1.2.0
[email protected]:
optionalDependencies:
fsevents: 2.3.3
[email protected]: {}
[email protected]:
dependencies:
esbuild: 0.18.20
postcss: 8.4.41
rollup: 3.29.4
optionalDependencies:
fsevents: 2.3.3
+128 -38
View File
@@ -1,10 +1,10 @@
{
"ui": {
"name": "honey",
"name": "Eclair",
"desc": "Nice and sweet place for all your self-hosted services.",
"icon": "img/icon.png",
"wallpaper": "img/background.jpg",
"wallpaper_dark": "img/background-dark.jpg",
"wallpaper": "img/gdt_xv_ma_yaauhi9_hUoR1tSITv.jpeg",
"wallpaper_dark": "img/gdt_xv_ma_yaauhi9_hUoR1tSITv.jpeg",
"dark_mode": false,
"open_new_tab": false,
"blur": true,
@@ -12,52 +12,142 @@
},
"services": [
{
"name": "CalDav",
"desc": "Simple CalDav server for calendar sync between various devices.",
"href": "caldav",
"icon": "img/preview/caldav.png"
"name": "Jellyfin",
"desc": "",
"href": "https://jellyfin.rul.sh/",
"icon": "https://github.com/walkxcode/dashboard-icons/raw/be82e22c418f5980ee2a13064d50f1483df39c8c/svg/jellyfin.svg"
},
{
"name": "Files",
"desc": "Fancy file manager for the web.",
"href": "files",
"icon": "img/preview/files.png"
"name": "YoutubeDL",
"desc": "",
"href": "http://ytdl.home.ip",
"icon": "https://github.com/walkxcode/dashboard-icons/raw/be82e22c418f5980ee2a13064d50f1483df39c8c/svg/youtubedl.svg"
},
{
"name": "Gallery",
"desc": "Photo & video gallery syncable with multiple Android devices.",
"href": "gallery",
"icon": "img/preview/gallery.png"
"name": "Youtube2MP3",
"desc": "",
"href": "http://yt2mp3.home.ip",
"icon": "https://git.rul.sh/khairul169/Go-YT2MP3/raw/branch/main/ui/public/android-chrome-512x512.png"
},
{
"name": "Git",
"desc": "Self-hosted, painless, secure place for your repositories.",
"href": "git",
"icon": "img/preview/git.png"
},
{
"name": "E-Mail",
"desc": "Feature-rich, decentralized and secure E-Mail server.",
"href": "mail",
"icon": "img/preview/mail.png"
},
{
"name": "Music",
"desc": "Beautiful, moody music streaming app.",
"href": "music",
"icon": "img/preview/music.png"
"name": "Memos",
"desc": "",
"href": "https://memos.rul.sh",
"icon": "https://memos.rul.sh/apple-touch-icon.png"
},
{
"name": "Notes",
"desc": "Sweet & lightweight app for taking notes.",
"href": "notes",
"icon": "img/preview/notes.png"
"desc": "",
"href": "https://cloud.rul.sh/apps/notes/",
"icon": "https://github.com/walkxcode/dashboard-icons/raw/be82e22c418f5980ee2a13064d50f1483df39c8c/svg/nextcloud-notes.svg"
},
{
"name": "Google",
"desc": "DON'T CLICK: goes to google.com",
"href": "https://google.com",
"icon": "img/preview/google.png"
"name": "NextDeck",
"desc": "",
"href": "https://cloud.rul.sh/apps/deck/#/board/1",
"icon": "https://github.com/walkxcode/dashboard-icons/raw/be82e22c418f5980ee2a13064d50f1483df39c8c/svg/nextcloud-deck.svg"
},
{
"name": "Nextcloud",
"desc": "",
"href": "https://cloud.rul.sh/",
"icon": "https://github.com/walkxcode/dashboard-icons/raw/be82e22c418f5980ee2a13064d50f1483df39c8c/svg/nextcloud.svg"
},
{
"name": "Gitea",
"desc": "",
"href": "https://git.rul.sh",
"icon": "https://github.com/walkxcode/dashboard-icons/raw/be82e22c418f5980ee2a13064d50f1483df39c8c/svg/gitea.svg"
},
{
"name": "Gotify",
"desc": "",
"href": "https://gotify.rul.sh",
"icon": "https://github.com/walkxcode/dashboard-icons/raw/be82e22c418f5980ee2a13064d50f1483df39c8c/svg/gotify.svg"
},
{
"name": "AriaNg",
"desc": "",
"href": "http://ariang.home.ip/",
"icon": "https://raw.githubusercontent.com/mayswind/AriaNg/master/src/tileicon.png"
},
{
"name": "Vaultwarden",
"desc": "",
"href": "https://vw.rul.sh",
"icon": "https://github.com/walkxcode/dashboard-icons/raw/be82e22c418f5980ee2a13064d50f1483df39c8c/svg/vaultwarden.svg"
},
{
"name": "Garage WebUI",
"desc": "",
"href": "http://home:3909",
"icon": "https://garagehq.deuxfleurs.fr/icons/apple-touch-icon.png"
},
{
"name": "Pi-hole",
"desc": "",
"href": "http://pi.hole/admin",
"icon": "https://github.com/walkxcode/dashboard-icons/raw/be82e22c418f5980ee2a13064d50f1483df39c8c/svg/pi-hole.svg"
},
{
"name": "Headscale",
"desc": "",
"href": "https://headscale.rul.sh/web",
"icon": "https://github.com/walkxcode/dashboard-icons/raw/be82e22c418f5980ee2a13064d50f1483df39c8c/svg/tailscale.svg"
},
{
"name": "Nginx Proxy Manager",
"desc": "",
"href": "http://nginx-pm.home.ip/",
"icon": "https://github.com/walkxcode/dashboard-icons/raw/be82e22c418f5980ee2a13064d50f1483df39c8c/svg/nginx-proxy-manager.svg"
},
{
"name": "Nginx UI",
"desc": "",
"href": "https://nginx-ui.rul.sh/",
"icon": "https://nginxui.com/assets/icon.svg"
},
{
"name": "pgAdmin",
"desc": "",
"href": "http://pgadmin.home.ip/",
"icon": "https://github.com/walkxcode/dashboard-icons/raw/be82e22c418f5980ee2a13064d50f1483df39c8c/svg/pgadmin.svg"
},
{
"name": "phpMyAdmin",
"desc": "",
"href": "http://pma.home.ip/",
"icon": "https://github.com/walkxcode/dashboard-icons/raw/be82e22c418f5980ee2a13064d50f1483df39c8c/svg/phpmyadmin.svg"
},
{
"name": "Mongo Express",
"desc": "",
"href": "http://home:27018/",
"icon": "https://github.com/walkxcode/dashboard-icons/raw/be82e22c418f5980ee2a13064d50f1483df39c8c/svg/mongodb.svg"
},
{
"name": "Hoppscotch",
"desc": "",
"href": "https://hopp.rul.sh/",
"icon": "https://github.com/walkxcode/dashboard-icons/raw/be82e22c418f5980ee2a13064d50f1483df39c8c/svg/hoppscotch.svg"
},
{
"name": "Portainer",
"desc": "",
"href": "https://portainer.rul.sh/",
"icon": "https://github.com/walkxcode/dashboard-icons/raw/be82e22c418f5980ee2a13064d50f1483df39c8c/svg/portainer.svg"
},
{
"name": "Cockpit",
"desc": "",
"href": "https://cockpit.local.rul.sh/",
"icon": "https://cockpit-project.org/images/favicon.png"
},
{
"name": "ProxmoxVE",
"desc": "",
"href": "https://pve.rul.sh/",
"icon": "https://www.proxmox.com/apple-touch-icon.png"
}
]
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 592 KiB