mirror of
https://github.com/wah-su/wah-su.github.io.git
synced 2025-04-06 16:24:42 +00:00
73 lines
3.4 KiB
JavaScript
73 lines
3.4 KiB
JavaScript
const cards = [
|
|
{
|
|
image: "/public/images/vaultwarden.png",
|
|
name: "Vaultwarden",
|
|
description: "Unofficial Bitwarden compatible server.",
|
|
about: "https://github.com/dani-garcia/vaultwarden",
|
|
url: "https://vault.wah.su",
|
|
},
|
|
{
|
|
image: "/public/images/nextcloud.png",
|
|
name: "Nextcloud",
|
|
description:
|
|
"productivity suite, offering file sharing and collaboration tools.",
|
|
about: "https://nextcloud.com/",
|
|
url: "https://cloud.wah.su",
|
|
},
|
|
{
|
|
image: "/public/images/immich.png",
|
|
name: "Immich",
|
|
description: "platform for managing and browsing your photos.",
|
|
about: "https://immich.app",
|
|
url: "https://photos.wah.su",
|
|
},
|
|
{
|
|
image: "/public/images/zipline.png",
|
|
name: "Zipline",
|
|
description: "image uploading with ShareX compatibility.",
|
|
about: "https://zipline.diced.sh/",
|
|
url: "https://x.wah.su",
|
|
},
|
|
];
|
|
const services = document.getElementById("services");
|
|
|
|
function renderCards() {
|
|
const theme = document.getElementById("body").classList[0];
|
|
services.innerHTML = "";
|
|
for (let index = 0; index < cards.length; index++) {
|
|
const image_name = cards[index].image.split(".")[0];
|
|
const image_ext = cards[index].image.split(".")[1];
|
|
const template = `
|
|
<img class="rounded-t-lg object-cover h-[192px] w-full" src="${image_name}-${theme}.${image_ext}" alt="" />
|
|
<div class="p-5">
|
|
<h5 class="mb-2 text-2xl font-bold tracking-tight text-gray-800 dark:text-white">${cards[index].name}
|
|
</h5>
|
|
<p class="mb-3 font-normal text-gray-700 dark:text-gray-400">${cards[index].description}
|
|
</p>
|
|
<div class="flex gap-1 items-center justify-center flex-wrap lg:flex-nowrap lg:justify-start">
|
|
<a href="${cards[index].about}" target="_blank"
|
|
class="w-full inline-flex justify-center items-center py-2.5 px-5 me-2 mb-2 text-sm font-medium text-gray-900 focus:outline-none bg-white rounded-lg border border-gray-200 hover:bg-gray-100 hover:text-blue-700 focus:z-10 focus:ring-4 focus:ring-gray-100 dark:focus:ring-gray-700 dark:bg-gray-800 dark:text-gray-400 dark:border-gray-600 dark:hover:text-white dark:hover:bg-gray-700">
|
|
Read more
|
|
</a>
|
|
<a href="${cards[index].url}"
|
|
class="w-full inline-flex justify-center items-center text-white bg-blue-700 hover:bg-blue-800 focus:ring-4 focus:ring-blue-300 font-medium rounded-lg text-sm px-5 py-2.5 me-2 mb-2 dark:bg-blue-600 dark:hover:bg-blue-700 focus:outline-none dark:focus:ring-blue-800">
|
|
open
|
|
<svg class="rtl:rotate-180 w-3.5 h-3.5 ms-2" aria-hidden="true"
|
|
xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 14 10">
|
|
<path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"
|
|
stroke-width="2" d="M1 5h12m0 0L9 1m4 4L9 9" />
|
|
</svg>
|
|
</a>
|
|
</div>
|
|
</div>
|
|
`;
|
|
|
|
const element = document.createElement("div");
|
|
element.className =
|
|
"max-w-[298px] bg-white border border-gray-200 rounded-lg shadow dark:bg-gray-800 dark:border-gray-700";
|
|
element.innerHTML = template;
|
|
|
|
services.appendChild(element);
|
|
}
|
|
}
|
|
window.onload = renderCards();
|