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", hasDarkMode: true, }, { 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", hasDarkMode: false, }, { image: "/public/images/immich.png", name: "Immich", description: "platform for managing and browsing your photos.", about: "https://immich.app", url: "https://photos.wah.su", hasDarkMode: false, }, { image: "/public/images/element.svg", name: "Matrix", description: "An open network for secure, decentralised communication.", about: "https://matrix.org", url: "https://chat.wah.su", hasDarkMode: false, }, { image: "/public/images/zipline.png", name: "Zipline", description: "image uploading with ShareX compatibility.", about: "https://zipline.diced.sh/", url: "https://x.wah.su", hasDarkMode: false, }, ]; const services = document.getElementById("services"); function renderCards() { const theme = localStorage.getItem("theme"); 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 image_url = `${image_name}${ cards[index].hasDarkMode ? `-${theme}` : "" }.${image_ext}`; const template = ` <img class="rounded-t-lg object-cover h-[192px] w-full" src="${image_url}" 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"> <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-[324px] sm:max-w-[275px] 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();