255 || $g < 0 || $g > 255 || $b < 0 || $b > 255) { throw new \InvalidArgumentException('RGB values must be between 0 and 255'); } $r /= 255; $g /= 255; $b /= 255; $max = max($r, $g, $b); $min = min($r, $g, $b); $delta = $max - $min; $l = ($max + $min) / 2; if ($delta == 0) { $h = 0; $s = 0; } else { $s = $delta / (1 - abs(2 * $l - 1)); if ($max === $r) { $h = 60 * (($g - $b) / $delta); if ($h < 0) { $h += 360; } } elseif ($max === $g) { $h = 60 * ((($b - $r) / $delta) + 2); } else { $h = 60 * ((($r - $g) / $delta) + 4); } } return [ 'h' => round($h, 2), 's' => round($s * 100, 2), 'l' => round($l * 100, 2), ]; } function hslToRgb(float $h, float $s, float $l): array { // Assert valid HSL ranges if ($h < 0 || $h > 360) { throw new \InvalidArgumentException('Hue must be between 0 and 360'); } if ($s < 0 || $s > 100 || $l < 0 || $l > 100) { throw new \InvalidArgumentException('Saturation and Lightness must be between 0 and 100'); } $s /= 100; $l /= 100; $c = (1 - abs(2 * $l - 1)) * $s; $m = $l - $c / 2; // Determine hue sector explicitly if ($h < 60) { $r1 = $c; $g1 = ($h / 60) * $c; $b1 = 0; } elseif ($h < 120) { $r1 = (2 - $h / 60) * $c; $g1 = $c; $b1 = 0; } elseif ($h < 180) { $r1 = 0; $g1 = $c; $b1 = (($h - 120) / 60) * $c; } elseif ($h < 240) { $r1 = 0; $g1 = (4 - $h / 60) * $c; $b1 = $c; } elseif ($h < 300) { $r1 = (($h - 240) / 60) * $c; $g1 = 0; $b1 = $c; } else { // h < 360 $r1 = $c; $g1 = 0; $b1 = (6 - $h / 60) * $c; } return [ 'r' => (int) round(($r1 + $m) * 255), 'g' => (int) round(($g1 + $m) * 255), 'b' => (int) round(($b1 + $m) * 255), ]; } function generateHighlightColor(string $hexColor): string { $r = hexdec(substr($hexColor, 1, 2)); $g = hexdec(substr($hexColor, 3, 2)); $b = hexdec(substr($hexColor, 5, 2)); $a = hexdec(substr($hexColor, 7, 2)); if (!$a) { $a = 255; } $hsl = rgbToHsl($r, $g, $b); // Increase lightness by 8%, cap at 100% $hsl['l'] = min(100, $hsl['l'] + 8); $rgb = hslToRgb($hsl['h'], $hsl['s'], $hsl['l']); return sprintf( "#%02x%02x%02x%02x", $rgb['r'], $rgb['g'], $rgb['b'], $a, ); } $services = [ "vcs" => [ "title" => "Versjonskontroll og utvikling", "services" => [ [ "name" => "Gitea", "description" => "Vår interne git-tjener, åpen for alle medlemmer. Kommer med CI/CD, nettside-artifakter, pakke-register og mye mer.", "link" => "https://git.pvv.ntnu.no", "link_text" => "Gå til git.pvv.ntnu.no", "image" => "img/gitea.svg", ], [ "name" => "GitHub", "description" => "Speiling av våre mest interessante prosjekter på GitHub", "link" => "https://github.com/Programvareverkstedet/", "link_text" => "Gå til GitHub", "image" => "img/github.svg", ], [ "name" => "Codeberg", "description" => "Speiling av våre mest interessante prosjekter på Codeberg", "link" => "https://codeberg.org/Programvareverkstedet/", "link_text" => "Gå til Codeberg", "image" => "img/codeberg.svg", ] ] ], "webmail" => [ "title" => "Epostklienter", "services" => [ [ "name" => "Roundcube", "description" => "En av våre webmail-klienter for epost.", "link" => "https://webmail.pvv.ntnu.no/", "link_text" => "Gå til Roundcube", "image" => "img/roundcube.svg", ], [ "name" => "Snappymail", "description" => "En annen av våre webmail-klienter for epost.", "link" => "https://snappymail.pvv.ntnu.no/", "link_text" => "Gå til Snappymail", "image" => "img/snappymail.svg", ], [ "name" => "Alps", "description" => "Jaggu enda en webmail-klient for epost.", "link" => "https://alps.pvv.ntnu.no/", "link_text" => "Gå til Alps", "image" => "img/alps.svg", ], ], ], "communication" => [ "title" => "Kommunikasjon", "services" => [ [ "name" => "Matrix via Element", "description" => implode( " ", [ "Åpen kommunikasjonsprotokoll som støtter ende-til-ende-kryptering og utallige kule funksjoner.", "Vårt space er bridget sammen med Discord, så du får alle de samme meldingene.", "#pvv:pvv.ntnu.no", ], ), "link" => "https://chat.pvv.ntnu.no", "link_text" => "Gå til chat.pvv.ntnu.no", "image" => "img/element.svg", ], [ "name" => "Discord", "description" => "Vår hovedkanal, her finner du alt fra ofisielle announcements til memes og driftsdiskusjoner.", "link" => "https://discord.gg/WpaHGV8K", "link_text" => "Gå til Discord", "image" => "img/discord.svg", ], [ "name" => "Epost", "description" => "Som PVV-medlem får du din egen @pvv.ntnu.no-adresse, som kan brukes med alle vanlige epostprotokoller.", "link" => "https://webmail.pvv.ntnu.no/", "link_text" => "Gå til Rouncubcube webmail", "image" => "img/email.png", ], [ "name" => "IRC", "description" => "Hvis Discord er for proprietært og Matrix er for hypermoderne er kanskje IRC for deg. Vi har en kanal på IRCNet, #pvv.", "link" => "irc://irc.pvv.ntnu.no/pvv", "link_text" => "Koble til med IRC", "image" => "img/irc.png", ], ], ], "hosting" => [ "title" => "Verting og nettsider", "services" => [ [ "name" => "Brukernettsider", "description" => "Alle brukere får automatisk en egen side for html og php. Denne er offentlig på pvv.ntnu.no/~brukernavn.", "link" => "https://wiki.pvv.ntnu.no/wiki/Tjenester/Hjemmesider", "link_text" => "Gå til dokumentasjon på wiki", "image" => "img/php.png", ], [ "name" => "Gopherhull", "description" => "PVV driver en egen gopher-tjener for nostalgikere og retroentusiaster.", "link" => "https://wiki.pvv.ntnu.no/wiki/Tjenester/Gopherhull", "link_text" => "Se dokumentasjon for gophertjening", "image" => "img/gopher.png", ], [ "name" => "Wiki", "description" => "PVVs wiki er åpen for alle medlemmer, og kan brukes til dokumentasjon, notater, prosjektsider og mye mer.", "link" => "https://wiki.pvv.ntnu.no", "link_text" => "Gå til wiki.pvv.ntnu.no", "image" => "img/mediawiki.svg", ], [ "name" => "PVV-siden", "description" => "Du befinner deg nå på PVV sin offisielle hjemmeside. Den er skrevet i PHP og kjører på en egen server.", "link" => "https://git.pvv.ntnu.no/Projects/nettsiden", "link_text" => "Se koden på gitea", "image" => "../pvv-logo.png", ], ], ], "recreational" => [ "title" => "Underholdning og fritid", "services" => [ [ "name" => "Minecraft", "description" => "Vi har en egen Minecraft-server for medlemmer, som du kan koble til med IP-adressen minecraft.pvv.ntnu.no. Spør om whitelist på matrix/discord.", "link" => "https://minecraft.pvv.ntnu.no", "link_text" => "Gå til verdenskartet vårt", "image" => "img/minecraft.png", ], // [ // "name" => "MiniFlux RSS reader", // "description" => "Trenger du en cross-platform RSS/Atom-leser for å følge med på omverdenen som det er 1990? ", // "link" => "https://feeds.pvv.ntnu.no", // "link_text" => "Gå til MiniFlux", // "image" => "img/rss.svg", // ], [ "name" => "Bildegalleri", "description" => "PVV har et felles bildegalleri, der alle kan legge relevante bilder, som automatisk blir inkludert på nettsiden.", "link" => "https://www.pvv.ntnu.no/galleri/", "link_text" => "Se galleriet", "image" => "img/gallery.png", ], ], ], "physical" => [ "title" => "Fysiske tjenester", "services" => [ [ "name" => "Dibbler", "description" => "PVV har en liten kiosk-datamaskin som lar deg kjøpe godis og pølser, drevet av PVVVV-samlespleisegruppa.", "link" => "https://wiki.pvv.ntnu.no/wiki/Tjenester/Dibbler", "link_text" => "Se dokumentasjon på wiki", "image" => "img/dibbler.png", ], // [ // "name" => "Worblehat", // "description" => "Bibliotekssystemet vårt, som lar deg finne og låne bøker i PVVs bibliotek.", // "link" => "https://wiki.pvv.ntnu.no/wiki/Tjenester/Worblehat", // "link_text" => "Se dokumentasjon på wiki", // "image" => "img/worblehat.png", // ], [ "name" => "Grzegorz", "description" => "Grzegorz er en musikkspiller, den spiller mye dank. Du kan styre den med vevgrensesnitt og diverse API-er.", "link" => "https://georg.pvv.ntnu.no", "link_text" => "Gå til Georg's vevgrensesnitt", "image" => "img/grzegorz.png", ], [ "name" => "Dørbjelle", "description" => "PVVs dørbjelle er koblet til internett, og lar deg ringe på hvis du spør botten pent på Discordh eller Matrix", "link" => "https://wiki.pvv.ntnu.no/wiki/Tjenester/D%C3%B8rbjelle", "link_text" => "Se dokumentasjon på wiki", "image" => "img/doorbell.png", ], [ "name" => "Terminaler", "description" => "PVV har flere terminaler plassert på terminalrommet; her kan du logge inn med PVV-brukeren din og gjøre øvinger eller lære om Linux.", "link" => "https://wiki.pvv.ntnu.no/wiki/Tjenester/Terminaler", "link_text" => "Se dokumentasjon på wiki", "image" => "img/terminal.png", ], ], ] ]; $servicesArrayKeys = array_keys($services); for ($i = 0; $i < count($services); $i++) { $servicesKey = $servicesArrayKeys[$i]; $services[$servicesKey]['bgcolor'] = $colorPalette[$i % count($colorPalette)]; } ?>