diff --git a/web/dashboard.templ b/web/dashboard.templ
new file mode 100644
index 0000000..f3d0da4
--- /dev/null
+++ b/web/dashboard.templ
@@ -0,0 +1,12 @@
+package web
+
+templ dashboard() {
+
Home
+ Hello World!
+
+
+
+
+
+
+}
diff --git a/web/hello.templ b/web/hello.templ
index bebfdc0..7e9b435 100644
--- a/web/hello.templ
+++ b/web/hello.templ
@@ -1,6 +1,7 @@
package web
templ hello(name string) {
+ Hello
Hello { name }
SUPRISE!!!
}
diff --git a/web/router.go b/web/router.go
index 3680345..d6b0141 100644
--- a/web/router.go
+++ b/web/router.go
@@ -1,22 +1,25 @@
package web
import (
+ "html/template"
"net/http"
- "html/template"
- "context"
+ "bytes"
+ "context"
+ "github.com/a-h/templ"
"github.com/go-chi/chi/v5"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
)
-const TemplateDir = "./web/templates/"
-
-type IndexData struct {
- Title string
+type TemplateState struct {
+ InnerHtml template.HTML
+ ActivePage string
}
+const TemplateDir = "./web/templates/"
+
func SetLogLevel(level zerolog.Level) {
zerolog.SetGlobalLevel(level)
}
@@ -29,19 +32,64 @@ func WebRouter() http.Handler {
return r
}
-func getIndex(w http.ResponseWriter, req *http.Request) {
+//for name, values := range req.Header {
+ // Loop over all values for the name.
+// for _, value := range values {
+// log.Debug().Msg(name + " " + value);
+// }
+// }
+
+func renderFullPage(w http.ResponseWriter, c templ.Component, pageName string) {
+ var buf bytes.Buffer
+
+ // Render the provided templ component
+ err := c.Render(context.Background(), &buf)
+ if err != nil {
+ log.Fatal().Err(err).Msg("Fatal error reading hello template");
+ }
+
+ // get the index template
index, err := template.ParseFiles(TemplateDir + "index.html")
if err != nil {
log.Fatal().
Err(err).
Msg("Fatal error reading index template")
}
+
+ // Inject the templ component html into the index template
+ err = index.Execute(w,
+ TemplateState{
+ InnerHtml: template.HTML(buf.String()),
+ ActivePage: pageName,
+ });
+ if err != nil {
+ log.Fatal().Err(err).Msg("Fatal error reading hello template");
+ }
+}
- err = index.Execute(w, IndexData{Title: "thetitle"})
+func getIndex(w http.ResponseWriter, req *http.Request) {
+ component := dashboard();
+
+ _, ok := req.Header["Hx-Request"]
+ if ok {
+ err := component.Render(context.Background(), w);
+ if err != nil {
+ log.Fatal().Err(err).Msg("Couldn't render dashboard templ template");
+ }
+ } else {
+ renderFullPage(w, component, "index");
+ }
}
func getHello(w http.ResponseWriter, req *http.Request) {
- log.Debug().Msg("Got index")
component := hello("Nick")
- component.Render(context.Background(), w)
+ _, ok := req.Header["Hx-Request"]
+ if ok {
+ err := component.Render(context.Background(), w);
+ if err != nil {
+ log.Fatal().Err(err).Msg("Couldn't render dashboard templ template");
+ }
+ }else {
+ renderFullPage(w, component, "hello");
+ }
}
diff --git a/web/sass/nav.scss b/web/sass/nav.scss
index 41ae196..f35dcba 100644
--- a/web/sass/nav.scss
+++ b/web/sass/nav.scss
@@ -1,30 +1,42 @@
+header {
+ background-color: $nav-bg;
+ height: 30px;
+ width: 100%;
+ margin-top: 10px;
+ margin-bottom: 10px;
+}
nav {
background-color: $nav-bg;
display: flex;
+ flex-direction: column;
ul {
margin: 0;
padding: 0;
list-style: none;
+ padding-left: 0;
}
- li { display: inline-block; }
-
- button.title {
- color: $green;
+ li {
+ margin-top: 10px;
+ margin-bottom: 10px;
}
- button.active {
+ a.active {
+ pointer-events: none;
background-color: $nav-active-bg;
color: $nav-active-color;
}
- button {
+ a {
+ transition: background-color $hl-trn-spd ease-in, color $hl-trn-spd ease-in;
+ border-radius: 5px;
+ text-align: center;
+ padding: 12px 0px;
+ display: inline-block;
+ cursor: pointer;
color: $nav-color;
- display: block;
- padding: 12px 24px;
+ width: 100%;
text-decoration: none;
- @include button_link;
}
- button:hover {
+ a:hover {
background-color: $nav-hover;
}
-
}
diff --git a/web/sass/site.scss b/web/sass/site.scss
index 559f068..bed97e1 100644
--- a/web/sass/site.scss
+++ b/web/sass/site.scss
@@ -1,5 +1,8 @@
@import 'catpuccin';
+// highlight transition speed
+$hl-trn-spd: 0.2s;
+
$bg: $latte-base;
$nav-bg: $latte-crust;
$nav-color: $latte-text;
@@ -21,3 +24,31 @@ body.dark-mode {
$nav-bg: $macchiato-crust;
$green: $macchiato-green;
}
+
+div#below-header {
+ display:flex;
+}
+
+div#left-col {
+ width: 15vw;
+ padding: 10px;
+}
+
+div#main-body-content {
+ width: 70vw;
+ padding: 10px;
+ opacity: 1;
+ transition: opacity 0.2s ease-out;
+}
+div#main-body-content.htmx-swapping {
+ opacity: 0;
+ transition: opacity 0.2s ease-out;
+}
+div#main-body-content.htmx-added {
+ opacity: 0;
+}
+
+div#right-col {
+ width: 15vw;
+ padding: 10px;
+}
diff --git a/web/static/index.js b/web/static/index.js
index 8f0f646..0998160 100644
--- a/web/static/index.js
+++ b/web/static/index.js
@@ -3,4 +3,20 @@ function say_hello() {
console.log("Hello World");
}
-export {say_hello};
+function register_nav_links() {
+ var navAnchors = document.querySelectorAll("nav a");
+
+ navAnchors.forEach(function (a_el) {
+ a_el.addEventListener("click", nav_a_click);
+ });
+}
+
+function nav_a_click(event) {
+ var active_anchor = document.querySelector("nav a.active");
+ active_anchor.classList.remove("active");
+
+ var clicked = event.target;
+ clicked.classList.add("active");
+}
+
+export {say_hello, register_nav_links};
diff --git a/web/templates/index.html b/web/templates/index.html
index cf6dc8f..54769f3 100644
--- a/web/templates/index.html
+++ b/web/templates/index.html
@@ -5,30 +5,58 @@
- {{.Title}}
-
-
Hello World!
-
+