repo: remove confirmed cross-project DockDeck Stitch scratch
GeoIntel release gates / Compile, test, contracts and builds (push) Canceled after 0s
GeoIntel release gates / Python and npm vulnerability policy (push) Canceled after 0s
GeoIntel release gates / GIS image, SBOM and container scan (push) Canceled after 0s
GeoIntel release gates / AI image, SBOM and container scan (push) Canceled after 0s

This commit is contained in:
2026-08-27 00:08:33 +02:00
parent e32e2457d9
commit 313d207be0
@@ -1,418 +0,0 @@
<!DOCTYPE html>
<html class="dark" lang="nl"><head>
<meta charset="utf-8"/>
<meta content="width=device-width, initial-scale=1.0" name="viewport"/>
<title>DockDeck - Apps Beheren</title>
<script src="https://cdn.tailwindcss.com?plugins=forms,container-queries"></script>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&amp;family=Geist:wght@400;500;600;700;800&amp;display=swap" rel="stylesheet"/>
<link href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:wght,FILL@100..700,0..1&amp;display=swap" rel="stylesheet"/>
<link href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:wght,FILL@100..700,0..1&amp;display=swap" rel="stylesheet"/>
<script id="tailwind-config">
tailwind.config = {
darkMode: "class",
theme: {
extend: {
"colors": {
"on-surface-variant": "#c7c4d7",
"on-surface": "#dbe2fd",
"tertiary-container": "#d97721",
"surface-dim": "#0b1326",
"on-secondary-fixed": "#002114",
"on-error": "#690005",
"background": "#0b1326",
"primary-container": "#8a8cc6",
"on-primary-container": "#222457",
"inverse-primary": "#585990",
"surface-container-lowest": "#060d20",
"secondary-fixed-dim": "#4edea3",
"tertiary": "#ffb783",
"primary-fixed-dim": "#c0c1ff",
"surface-container-highest": "#2d3449",
"secondary-container": "#00b47d",
"on-primary-fixed-variant": "#404176",
"surface-container-low": "#131b2e",
"on-tertiary-container": "#452000",
"on-tertiary-fixed": "#301400",
"on-secondary-fixed-variant": "#005236",
"error": "#ffb4ab",
"primary": "#c0c1ff",
"secondary": "#4edea3",
"outline-variant": "rgba(30, 41, 59, 0.5)",
"tertiary-fixed-dim": "#ffb783",
"surface-tint": "#c0c1ff",
"tertiary-fixed": "#ffdcc5",
"error-container": "#93000a",
"surface-container-high": "#222a3e",
"primary-fixed": "#e1e0ff",
"on-secondary-container": "#003e28",
"outline": "#908fa0",
"on-primary-fixed": "#131449",
"status-offline": "#ffb4ab",
"inverse-surface": "#dbe2fd",
"secondary-fixed": "#6ffbbe",
"on-tertiary-fixed-variant": "#703700",
"status-degraded": "#ffb783",
"on-background": "#dbe2fd",
"surface-glass": "rgba(15, 23, 42, 0.6)",
"on-tertiary": "#4f2500",
"status-online": "#4edea3",
"surface": "#0b1326",
"surface-container": "#171f33",
"surface-bright": "#31394e",
"on-secondary": "#003824",
"on-error-container": "#ffdad6",
"surface-variant": "#2d3449",
"inverse-on-surface": "#283044",
"on-primary": "#292b5e"
},
"borderRadius": {
"DEFAULT": "0.25rem",
"lg": "0.5rem",
"xl": "0.75rem",
"full": "9999px"
},
"spacing": {
"gutter": "24px",
"margin-desktop": "40px",
"stack-lg": "48px",
"base": "8px",
"margin-mobile": "16px",
"stack-md": "24px",
"container-max": "1440px",
"stack-sm": "12px"
},
"fontFamily": {
"headline-lg-mobile": ["Geist"],
"label-md": ["Geist"],
"code-sm": ["Geist"],
"headline-md": ["Geist"],
"display-lg": ["Geist"],
"body-lg": ["Inter"],
"headline-lg": ["Geist"],
"body-md": ["Inter"]
},
"fontSize": {
"headline-lg-mobile": ["24px", {"lineHeight": "32px", "fontWeight": "600"}],
"label-md": ["14px", {"lineHeight": "20px", "letterSpacing": "0.02em", "fontWeight": "500"}],
"code-sm": ["13px", {"lineHeight": "18px", "fontWeight": "400"}],
"headline-md": ["24px", {"lineHeight": "32px", "fontWeight": "500"}],
"display-lg": ["48px", {"lineHeight": "56px", "letterSpacing": "-0.02em", "fontWeight": "600"}],
"body-lg": ["18px", {"lineHeight": "28px", "fontWeight": "400"}],
"headline-lg": ["32px", {"lineHeight": "40px", "letterSpacing": "-0.01em", "fontWeight": "600"}],
"body-md": ["16px", {"lineHeight": "24px", "fontWeight": "400"}]
}
}
}
}
</script>
<style>
body {
background-color: #0b1326;
color: #dbe2fd;
overflow-x: hidden;
}
.glass-panel {
background: rgba(15, 23, 42, 0.6);
backdrop-filter: blur(12px);
border: 1px solid rgba(30, 41, 59, 0.5);
}
.active-dot {
width: 8px;
height: 8px;
border-radius: 50%;
display: inline-block;
box-shadow: 0 0 8px currentColor;
animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
}
@keyframes pulse {
0%, 100% { opacity: 1; }
50% { opacity: .5; }
}
.material-symbols-outlined {
font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 24;
}
/* Custom scrollbar */
::-webkit-scrollbar { width: 6px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb { background: rgba(30, 41, 59, 0.8); border-radius: 10px; }
</style>
</head>
<body class="font-body-md text-body-md">
<!-- Top Navigation Bar -->
<header class="bg-surface-glass backdrop-blur-md text-primary font-headline-md text-headline-md full-width top-0 sticky border-b border-outline-variant shadow-sm z-50">
<div class="flex justify-between items-center w-full px-gutter h-16 max-w-container-max mx-auto">
<div class="flex items-center gap-stack-md">
<span class="font-headline-md text-headline-md font-bold text-primary">DockDeck</span>
<nav class="hidden md:flex gap-stack-md ml-8">
<a class="text-on-surface-variant hover:text-on-surface transition-colors font-label-md text-label-md" href="#">Dashboard</a>
<a class="text-primary font-bold border-b-2 border-primary font-label-md text-label-md py-4" href="#">Instellingen</a>
</nav>
</div>
<div class="flex items-center gap-stack-sm">
<div class="relative group">
<input class="bg-surface-container-low border-none rounded-full px-10 py-1.5 text-label-md focus:ring-1 focus:ring-primary-container w-64 transition-all outline-none" placeholder="Apps zoeken..." type="text"/>
<span class="material-symbols-outlined absolute left-3 top-1/2 -translate-y-1/2 text-on-surface-variant text-base">search</span>
</div>
<button class="p-2 hover:bg-surface-variant/50 rounded-full transition-all flex items-center justify-center">
<span class="material-symbols-outlined" data-icon="settings">settings</span>
</button>
</div>
</div>
</header>
<div class="flex max-w-container-max mx-auto">
<!-- Sidebar Navigation -->
<aside class="h-screen w-64 docked left-0 bg-surface-container-low border-r border-outline-variant flex flex-col gap-base p-margin-mobile fixed hidden xl:flex">
<div class="mb-stack-md px-2">
<h2 class="font-headline-md text-headline-md font-bold text-primary">Instellingen</h2>
<p class="font-label-md text-label-md text-on-surface-variant">Beheer uw dashboard</p>
</div>
<nav class="flex flex-col gap-1">
<a class="flex items-center gap-3 px-4 py-3 text-on-surface-variant hover:bg-surface-variant/30 rounded-lg transition-colors group" href="#">
<span class="material-symbols-outlined group-hover:translate-x-1 transition-transform" data-icon="settings">settings</span>
<span class="font-label-md text-label-md">Algemeen</span>
</a>
<a class="flex items-center gap-3 px-4 py-3 bg-secondary-container text-on-secondary-container rounded-lg font-medium shadow-sm translate-x-1" href="#">
<span class="material-symbols-outlined" data-icon="apps">apps</span>
<span class="font-label-md text-label-md">Apps</span>
</a>
<a class="flex items-center gap-3 px-4 py-3 text-on-surface-variant hover:bg-surface-variant/30 rounded-lg transition-colors group" href="#">
<span class="material-symbols-outlined group-hover:translate-x-1 transition-transform" data-icon="star">star</span>
<span class="font-label-md text-label-md">Favorieten</span>
</a>
<a class="flex items-center gap-3 px-4 py-3 text-on-surface-variant hover:bg-surface-variant/30 rounded-lg transition-colors group" href="#">
<span class="material-symbols-outlined group-hover:translate-x-1 transition-transform" data-icon="category">category</span>
<span class="font-label-md text-label-md">Categorieën</span>
</a>
<a class="flex items-center gap-3 px-4 py-3 text-on-surface-variant hover:bg-surface-variant/30 rounded-lg transition-colors group" href="#">
<span class="material-symbols-outlined group-hover:translate-x-1 transition-transform" data-icon="palette">palette</span>
<span class="font-label-md text-label-md">Weergave</span>
</a>
<a class="flex items-center gap-3 px-4 py-3 text-on-surface-variant hover:bg-surface-variant/30 rounded-lg transition-colors group" href="#">
<span class="material-symbols-outlined group-hover:translate-x-1 transition-transform" data-icon="extension">extension</span>
<span class="font-label-md text-label-md">Integraties</span>
</a>
<a class="flex items-center gap-3 px-4 py-3 text-on-surface-variant hover:bg-surface-variant/30 rounded-lg transition-colors group" href="#">
<span class="material-symbols-outlined group-hover:translate-x-1 transition-transform" data-icon="backup">backup</span>
<span class="font-label-md text-label-md">Back-up</span>
</a>
</nav>
</aside>
<!-- Main Content Area -->
<main class="flex-1 xl:ml-64 p-margin-mobile md:p-margin-desktop min-h-screen">
<div class="max-w-5xl mx-auto space-y-stack-md">
<!-- Header & Filters Section -->
<section class="space-y-stack-sm">
<div class="flex flex-col md:flex-row md:items-end justify-between gap-stack-sm">
<div>
<h1 class="font-headline-lg text-headline-lg text-on-surface">Apps beheren</h1>
<p class="font-body-md text-body-md text-on-surface-variant">Beheer de zichtbaarheid en configuratie van ontdekte services.</p>
</div>
</div>
<!-- Filters -->
<div class="flex flex-wrap gap-2 pt-4">
<button class="px-4 py-1.5 rounded-full bg-primary text-on-primary font-label-md text-label-md hover:brightness-110 transition-all">Alles</button>
<button class="px-4 py-1.5 rounded-full bg-surface-container-high text-on-surface-variant font-label-md text-label-md hover:bg-surface-variant transition-all">Zichtbaar</button>
<button class="px-4 py-1.5 rounded-full bg-surface-container-high text-on-surface-variant font-label-md text-label-md hover:bg-surface-variant transition-all">Verborgen</button>
<button class="px-4 py-1.5 rounded-full bg-surface-container-high text-on-surface-variant font-label-md text-label-md hover:bg-surface-variant transition-all">Nieuw ontdekt</button>
</div>
</section>
<!-- Management Table -->
<section class="glass-panel rounded-xl overflow-hidden">
<div class="overflow-x-auto">
<table class="w-full text-left border-collapse">
<thead>
<tr class="bg-surface-container-highest/30 border-b border-outline-variant">
<th class="px-6 py-4 font-label-md text-label-md text-on-surface-variant uppercase tracking-wider">App</th>
<th class="px-6 py-4 font-label-md text-label-md text-on-surface-variant uppercase tracking-wider">Status</th>
<th class="px-6 py-4 font-label-md text-label-md text-on-surface-variant uppercase tracking-wider">Categorie</th>
<th class="px-6 py-4 font-label-md text-label-md text-on-surface-variant uppercase tracking-wider">Zichtbaarheid</th>
<th class="px-6 py-4 font-label-md text-label-md text-on-surface-variant uppercase tracking-wider text-right">Acties</th>
</tr>
</thead>
<tbody class="divide-y divide-outline-variant">
<!-- Example 1: Plex (Zichtbaar) -->
<tr class="hover:bg-surface-variant/20 transition-all group">
<td class="px-6 py-4">
<div class="flex items-center gap-4">
<div class="w-12 h-12 rounded-xl bg-surface-container-high flex items-center justify-center border border-outline-variant group-hover:-translate-y-0.5 transition-transform">
<img class="w-8 h-8 object-contain" data-alt="A sleek minimalist logo icon for a media server app named Plex. The logo features futuristic geometric shapes with a deep indigo and neon violet color scheme, glowing slightly against a dark navy technical background. Corporate high-tech utility aesthetic." src="https://lh3.googleusercontent.com/aida-public/AB6AXuBN18k4Jmwg995SpRSa4L2EU5lbQmxelWEoPsuPW4fzIe0tRvJg0Hm3WZXysXiVE-xuav8njuw-9pvPnhPjiP7wR9UQPD6PwBrCrsxRcfXznG-KF_Qprh0V2_dre-msxVVFaxxmMJgEJChor5fd64YCfpt7TZm_ESekCHMQypncKnNwmAUFCOD1FAbvl66QKzO0BQXGKpZ3Plp6rD42CZ7XHP1-zgb7owH-QEj5IvIkhc4iBnIzdxthhA7wyQ0f8ih_KkgOG9doyPac"/>
</div>
<div>
<div class="font-label-md text-label-md text-on-surface">Plex</div>
<div class="text-[12px] text-on-surface-variant">plex.local:32400</div>
</div>
</div>
</td>
<td class="px-6 py-4">
<div class="inline-flex items-center gap-2 px-2 py-0.5 rounded-full border border-status-online/20 bg-status-online/5">
<span class="active-dot text-status-online bg-status-online"></span>
<span class="text-[12px] font-medium text-status-online">Online</span>
</div>
</td>
<td class="px-6 py-4">
<select class="bg-surface-container-low border border-outline-variant rounded-lg text-label-md py-1 px-2 focus:ring-1 focus:ring-primary outline-none">
<option selected="">Media</option>
<option>Home Lab</option>
<option>Downloaden</option>
</select>
</td>
<td class="px-6 py-4">
<label class="relative inline-flex items-center cursor-pointer">
<input checked="" class="sr-only peer" type="checkbox"/>
<div class="w-10 h-5 bg-surface-container-highest peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-4 after:w-4 after:transition-all peer-checked:bg-secondary"></div>
<span class="ml-3 text-label-md font-medium text-on-surface">Zichtbaar</span>
</label>
</td>
<td class="px-6 py-4 text-right">
<button class="p-2 hover:bg-surface-variant/50 rounded-full transition-all text-on-surface-variant hover:text-primary">
<span class="material-symbols-outlined" data-icon="edit">edit</span>
</button>
</td>
</tr>
<!-- Example 2: Immich (Verborgen) -->
<tr class="hover:bg-surface-variant/20 transition-all group">
<td class="px-6 py-4">
<div class="flex items-center gap-4">
<div class="w-12 h-12 rounded-xl bg-surface-container-high flex items-center justify-center border border-outline-variant group-hover:-translate-y-0.5 transition-transform">
<img class="w-8 h-8 object-contain" data-alt="A clean and modern application icon for Immich photo management service. The icon uses a palette of soft teal and slate blue, featuring a stylized camera or lens shutter element. Professional, technical glassmorphism style for a developer dashboard." src="https://lh3.googleusercontent.com/aida-public/AB6AXuCDyJEj9E70rkswyo3F3AMgP3Zy_Nik12n5HW7oheajUEV6qb9G_tXbq0WkTY_4W0Y8wufyApZspip4mLL7nxEZVwtzZTf6xTAA_qiUZY1Kt27xwiz44JcNWE1FCliRGfpUeewS5BcUd9kKrQovEqwrENU7mRvFGw-xUXr9UuZfOyyq8KkDDOZjS4lBOmLV4KIGsVoDo24r2rWIDE7ifAjK0rjWWtIwk1zUBw3ZJpiQOAswOSEmwiLcFi248QrvsTYHYLh9rmsSTHGW"/>
</div>
<div>
<div class="font-label-md text-label-md text-on-surface">Immich</div>
<div class="text-[12px] text-on-surface-variant">immich.home.arpa</div>
</div>
</div>
</td>
<td class="px-6 py-4">
<div class="inline-flex items-center gap-2 px-2 py-0.5 rounded-full border border-status-online/20 bg-status-online/5">
<span class="active-dot text-status-online bg-status-online"></span>
<span class="text-[12px] font-medium text-status-online">Online</span>
</div>
</td>
<td class="px-6 py-4">
<select class="bg-surface-container-low border border-outline-variant rounded-lg text-label-md py-1 px-2 focus:ring-1 focus:ring-primary outline-none">
<option>Media</option>
<option selected="">Home Lab</option>
<option>Downloaden</option>
</select>
</td>
<td class="px-6 py-4">
<label class="relative inline-flex items-center cursor-pointer">
<input class="sr-only peer" type="checkbox"/>
<div class="w-10 h-5 bg-surface-container-highest peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-4 after:w-4 after:transition-all peer-checked:bg-secondary"></div>
<span class="ml-3 text-label-md font-medium text-on-surface-variant">Verborgen</span>
</label>
</td>
<td class="px-6 py-4 text-right">
<button class="p-2 hover:bg-surface-variant/50 rounded-full transition-all text-on-surface-variant hover:text-primary">
<span class="material-symbols-outlined" data-icon="edit">edit</span>
</button>
</td>
</tr>
<!-- Example 3: Sonarr (Nieuw ontdekt) -->
<tr class="hover:bg-surface-variant/20 transition-all group">
<td class="px-6 py-4">
<div class="flex items-center gap-4">
<div class="w-12 h-12 rounded-xl bg-surface-container-high flex items-center justify-center border border-outline-variant group-hover:-translate-y-0.5 transition-transform relative">
<div class="absolute -top-1 -right-1 w-3 h-3 bg-primary rounded-full border-2 border-surface shadow-[0_0_8px_#c0c1ff]"></div>
<img class="w-8 h-8 object-contain" data-alt="A professional flat design icon for the Sonarr application, which manages television series. The style uses shades of blue and cyan with a minimalist radar-like motif. Rendered with clean edges for a technical developer dashboard interface." src="https://lh3.googleusercontent.com/aida-public/AB6AXuBCAFxjaqE75xY1aKJh8qxj2YKyUsIHEg8CD8Ca0PMd95qxLY8vokOOuO6NpSjJidt-teeQeZ-L800NRdNqDPq955i_eNt6QPhznL6IcUFoVNID7RVKNr6Ishsz5b7kYAtjAcNscPKqB3mMRYY3R0kjz3ykBX1Xvsad5L4fNt9hBjh9WWT85Yf8QXC_EYQ5MKTwDGXDJaIB8Xv00beGusHxcks_pMgCb1E0Uj1SBa1JU0hybqvDAYtPJwy4n6RCT1lnv0mrGYPEq5xm"/>
</div>
<div>
<div class="font-label-md text-label-md text-on-surface">Sonarr</div>
<div class="text-[12px] text-on-surface-variant italic">Nieuw ontdekt...</div>
</div>
</div>
</td>
<td class="px-6 py-4">
<div class="inline-flex items-center gap-2 px-2 py-0.5 rounded-full border border-status-degraded/20 bg-status-degraded/5">
<span class="active-dot text-status-degraded bg-status-degraded"></span>
<span class="text-[12px] font-medium text-status-degraded">Pending</span>
</div>
</td>
<td class="px-6 py-4">
<select class="bg-surface-container-low border border-outline-variant rounded-lg text-label-md py-1 px-2 focus:ring-1 focus:ring-primary outline-none italic">
<option disabled="" selected="">Kies...</option>
<option>Media</option>
<option>Home Lab</option>
<option>Downloaden</option>
</select>
</td>
<td class="px-6 py-4">
<label class="relative inline-flex items-center cursor-pointer">
<input class="sr-only peer" type="checkbox"/>
<div class="w-10 h-5 bg-surface-container-highest peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-4 after:w-4 after:transition-all peer-checked:bg-secondary"></div>
<span class="ml-3 text-label-md font-medium text-on-surface-variant">Uitgeschakeld</span>
</label>
</td>
<td class="px-6 py-4 text-right">
<button class="p-2 hover:bg-surface-variant/50 rounded-full transition-all text-on-surface-variant hover:text-primary">
<span class="material-symbols-outlined" data-icon="edit">edit</span>
</button>
</td>
</tr>
</tbody>
</table>
</div>
</section>
<!-- Information Card -->
<section class="grid grid-cols-1 md:grid-cols-2 gap-stack-md pt-4">
<div class="glass-panel p-6 rounded-xl space-y-3">
<div class="flex items-center gap-2 text-primary">
<span class="material-symbols-outlined" data-icon="info">info</span>
<h3 class="font-label-md text-label-md font-bold uppercase tracking-wide">Automatische Detectie</h3>
</div>
<p class="text-on-surface-variant text-sm leading-relaxed">
DockDeck scant continu uw netwerk en Docker sockets op zoek naar nieuwe services. Nieuw ontdekte apps verschijnen hier als "Nieuw ontdekt" en zijn standaard verborgen op uw dashboard tot u een categorie toewijst en ze zichtbaar maakt.
</p>
</div>
<div class="glass-panel p-6 rounded-xl space-y-3">
<div class="flex items-center gap-2 text-secondary">
<span class="material-symbols-outlined" data-icon="security">security</span>
<h3 class="font-label-md text-label-md font-bold uppercase tracking-wide">Status Monitoring</h3>
</div>
<p class="text-on-surface-variant text-sm leading-relaxed">
De statusindicator geeft real-time informatie over de bereikbaarheid van de container of service. Klik op 'Bewerken' om specifieke healthcheck-instellingen of API-sleutels voor statusmonitoring aan te passen.
</p>
</div>
</section>
</div>
</main>
</div>
<!-- Mobile Bottom Navigation (Visible only on small screens) -->
<nav class="md:hidden fixed bottom-0 left-0 right-0 bg-surface-glass backdrop-blur-lg border-t border-outline-variant flex justify-around items-center h-16 z-50">
<a class="flex flex-col items-center gap-1 text-on-surface-variant" href="#">
<span class="material-symbols-outlined" data-icon="dashboard">dashboard</span>
<span class="text-[10px]">Overzicht</span>
</a>
<a class="flex flex-col items-center gap-1 text-primary" href="#">
<span class="material-symbols-outlined" data-icon="settings" style="font-variation-settings: 'FILL' 1;">settings</span>
<span class="text-[10px]">Instellingen</span>
</a>
<a class="flex flex-col items-center gap-1 text-on-surface-variant" href="#">
<span class="material-symbols-outlined" data-icon="search">search</span>
<span class="text-[10px]">Zoeken</span>
</a>
</nav>
<script>
// Micro-interaction for hover effects and button active states
document.querySelectorAll('button, a').forEach(el => {
el.addEventListener('mousedown', () => {
el.classList.add('scale-95');
setTimeout(() => el.classList.remove('scale-95'), 150);
});
});
// Simple filter active state toggle simulation
const filterButtons = document.querySelectorAll('.flex.flex-wrap button');
filterButtons.forEach(btn => {
btn.addEventListener('click', () => {
filterButtons.forEach(b => {
b.classList.remove('bg-primary', 'text-on-primary');
b.classList.add('bg-surface-container-high', 'text-on-surface-variant');
});
btn.classList.add('bg-primary', 'text-on-primary');
btn.classList.remove('bg-surface-container-high', 'text-on-surface-variant');
});
});
</script>
</body></html>