An OIDC-protected index page for your homeserver.
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}