An OIDC-protected index page for your homeserver.
at main 3.5 kB view raw
1package views 2 3import ( 4 "fmt" 5 6 "github.com/sblinch/kdl-go/document" 7) 8 9func StringToVibrantHSL(s string) string { 10 var sum int 11 for _, char := range s { 12 sum += int(char) 13 } 14 hue := sum % 360 15 return fmt.Sprintf("hsl(%d, 80%%, 50%%)", hue) 16} 17 18templ renderLink(name string, url string) { 19 <li class="col-span-1 grid grid-cols-subgrid"> 20 <a 21 class="aspect-square bg-surface p-4 rounded-lg text-sm flex flex-col justify-between leading-none border border-muted/20" 22 href={ templ.URL(url) } 23 target="_blank" 24 rele="noopener noreferrer" 25 > 26 <div class="flex items-center justify-between"> 27 <div class="w-4 h-4 rounded-full" style={fmt.Sprintf("background: %s", StringToVibrantHSL(name))}></div> 28 <svg class="text-highlight-med" width="16" height="16" viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M3 2C2.44772 2 2 2.44772 2 3V12C2 12.5523 2.44772 13 3 13H12C12.5523 13 13 12.5523 13 12V8.5C13 8.22386 12.7761 8 12.5 8C12.2239 8 12 8.22386 12 8.5V12H3V3L6.5 3C6.77614 3 7 2.77614 7 2.5C7 2.22386 6.77614 2 6.5 2H3ZM12.8536 2.14645C12.9015 2.19439 12.9377 2.24964 12.9621 2.30861C12.9861 2.36669 12.9996 2.4303 13 2.497L13 2.5V2.50049V5.5C13 5.77614 12.7761 6 12.5 6C12.2239 6 12 5.77614 12 5.5V3.70711L6.85355 8.85355C6.65829 9.04882 6.34171 9.04882 6.14645 8.85355C5.95118 8.65829 5.95118 8.34171 6.14645 8.14645L11.2929 3H9.5C9.22386 3 9 2.77614 9 2.5C9 2.22386 9.22386 2 9.5 2H12.4999H12.5C12.5678 2 12.6324 2.01349 12.6914 2.03794C12.7504 2.06234 12.8056 2.09851 12.8536 2.14645Z" fill="currentColor" fill-rule="evenodd" clip-rule="evenodd"></path></svg> 29 </div> 30 <span class="block">{ name }</span> 31 </a> 32 </li> 33} 34 35templ renderGroup(name string, nodes []*document.Node) { 36 <li class="col-span-full grid grid-cols-subgrid gap-4"> 37 <h2 class="text-lg font-bold col-span-full pt-4">{ name }</h2> 38 <ul class="col-span-full grid grid-cols-subgrid gap-4"> 39 for _, node := range nodes { 40 if node.Name.ValueString() == "group" { 41 @renderGroup(node.Arguments[0].ValueString(), node.Children) 42 } else if node.Name.String() == "link" { 43 {{ url, _ := node.Properties.Get("url") }} 44 @renderLink(node.Arguments[0].ValueString(), url.ValueString()) 45 } 46 } 47 </ul> 48 </li> 49} 50 51templ Authenticate() { 52 @Document("Log In") { 53 <div class="w-screen h-screen flex items-center justify-center"> 54 <main class="w-full max-w-xs bg-surface rounded-lg p-4 border border-muted/20"> 55 <p class="mb-3 font-serif">Can I see some ID, please?</p> 56 <a href="/login" class="block text-center text-sm rounded py-2 px-2 bg-foam/20 text-foam">Log In with OIDC</a> 57 </main> 58 </div> 59 } 60} 61 62templ Links(username string, doc *document.Document) { 63 @Document("Links") { 64 <div class="flex items-center justify-between px-3 py-2 text-subtle text-xs mb-4"> 65 <div>Howdy, <span class="font-mono text-gold">{ username }</span></div> 66 <a href="/logout" class="underline text-iris">Log Out</a> 67 </div> 68 <ul class="grid grid-cols-3 sm:grid-cols-4 md:grid-cols-6 lg:grid-cols-8 px-3 gap-x-4 gap-y-8 max-w-screen-xs sm:max-w-screen-sm md:max-w-screen-md lg:max-w-screen-lg mx-auto"> 69 for _, node := range doc.Nodes { 70 if node.Name.ValueString() == "group" { 71 @renderGroup(node.Arguments[0].ValueString(), node.Children) 72 } else if node.Name.ValueString() == "link" { 73 {{ url, _ := node.Properties.Get("url") }} 74 @renderLink(node.Arguments[0].ValueString(), url.ValueString()) 75 } 76 } 77 </ul> 78 } 79}