From ed11a84dca08ec3b0b114142e66811545e9c2257 Mon Sep 17 00:00:00 2001
From: ElnuDev <elnu@elnu.com>
Date: Sat, 15 Jul 2023 20:00:52 -0700
Subject: [PATCH] Create button demo

---
 click.templ       | 15 +++++++++
 click_templ.go    | 80 +++++++++++++++++++++++++++++++++++++++++++++++
 go.mod            |  2 ++
 go.sum            |  2 ++
 main.go           | 24 ++++++++++++--
 static/index.html | 12 +++++++
 6 files changed, 133 insertions(+), 2 deletions(-)
 create mode 100644 click.templ
 create mode 100644 click_templ.go
 create mode 100644 go.sum
 create mode 100644 static/index.html

diff --git a/click.templ b/click.templ
new file mode 100644
index 0000000..2c5e845
--- /dev/null
+++ b/click.templ
@@ -0,0 +1,15 @@
+package main
+
+import "fmt"
+
+func plural(singular, plural string, count uint) string {
+    if count == 1 {
+        return singular
+    } else {
+        return plural
+    }
+}
+
+templ Click(clicks uint) {
+  <div>The button has been clicked { fmt.Sprintf("%d", clicks) }{ " " }{ plural("time", "times", clicks) }.</div>
+}
diff --git a/click_templ.go b/click_templ.go
new file mode 100644
index 0000000..8a11cc0
--- /dev/null
+++ b/click_templ.go
@@ -0,0 +1,80 @@
+// Code generated by templ@v0.2.304 DO NOT EDIT.
+
+package main
+
+//lint:file-ignore SA4006 This context is only used if a nested component is present.
+
+import "github.com/a-h/templ"
+import "context"
+import "io"
+import "bytes"
+
+// GoExpression
+import "fmt"
+
+func plural(singular, plural string, count uint) string {
+	if count == 1 {
+		return singular
+	} else {
+		return plural
+	}
+}
+
+func Click(clicks uint) templ.Component {
+	return templ.ComponentFunc(func(ctx context.Context, w io.Writer) (err error) {
+		templBuffer, templIsBuffer := w.(*bytes.Buffer)
+		if !templIsBuffer {
+			templBuffer = templ.GetBuffer()
+			defer templ.ReleaseBuffer(templBuffer)
+		}
+		ctx = templ.InitializeContext(ctx)
+		var_1 := templ.GetChildren(ctx)
+		if var_1 == nil {
+			var_1 = templ.NopComponent
+		}
+		ctx = templ.ClearChildren(ctx)
+		// Element (standard)
+		_, err = templBuffer.WriteString("<div>")
+		if err != nil {
+			return err
+		}
+		// Text
+		var_2 := `The button has been clicked `
+		_, err = templBuffer.WriteString(var_2)
+		if err != nil {
+			return err
+		}
+		// StringExpression
+		var var_3 string = fmt.Sprintf("%d", clicks)
+		_, err = templBuffer.WriteString(templ.EscapeString(var_3))
+		if err != nil {
+			return err
+		}
+		// StringExpression
+		var var_4 string = " "
+		_, err = templBuffer.WriteString(templ.EscapeString(var_4))
+		if err != nil {
+			return err
+		}
+		// StringExpression
+		var var_5 string = plural("time", "times", clicks)
+		_, err = templBuffer.WriteString(templ.EscapeString(var_5))
+		if err != nil {
+			return err
+		}
+		// Text
+		var_6 := `.`
+		_, err = templBuffer.WriteString(var_6)
+		if err != nil {
+			return err
+		}
+		_, err = templBuffer.WriteString("</div>")
+		if err != nil {
+			return err
+		}
+		if !templIsBuffer {
+			_, err = io.Copy(w, templBuffer)
+		}
+		return err
+	})
+}
diff --git a/go.mod b/go.mod
index 0eb2ffd..24acc91 100644
--- a/go.mod
+++ b/go.mod
@@ -1,3 +1,5 @@
 module ElnuDev/shiritori-go
 
 go 1.20
+
+require github.com/a-h/templ v0.2.304 // indirect
diff --git a/go.sum b/go.sum
new file mode 100644
index 0000000..5599da4
--- /dev/null
+++ b/go.sum
@@ -0,0 +1,2 @@
+github.com/a-h/templ v0.2.304 h1:vIgCNazkW6NiYifFIGYNRfBkoBzOMZMO1NibIayzihE=
+github.com/a-h/templ v0.2.304/go.mod h1:3oc37WS5rpDvFGi6yeknvTKt50xCu67ywQsM43Wr4PU=
diff --git a/main.go b/main.go
index a3dd973..b75d912 100644
--- a/main.go
+++ b/main.go
@@ -1,7 +1,27 @@
 package main
 
-import "fmt"
+import (
+	"context"
+	"net/http"
+
+	"github.com/a-h/templ"
+)
+
+var clicks uint = 0
+
+func generateHandler(template func() templ.Component, handler func()) func(http.ResponseWriter, *http.Request) {
+	return func(w http.ResponseWriter, r *http.Request) {
+		w.Header().Set("Content-Type", "text/html; charset=utf-8")
+		template().Render(context.Background(), w)
+		handler()
+	}
+}
 
 func main() {
-	fmt.Println("Hello, World!")
+	http.Handle("/", http.FileServer(http.Dir("static")))
+	http.HandleFunc("/api/click", generateHandler(
+		func() templ.Component { return Click(clicks) },
+		func() { clicks++ },
+	))
+	http.ListenAndServe(":3333", nil)
 }
diff --git a/static/index.html b/static/index.html
new file mode 100644
index 0000000..a59f0cc
--- /dev/null
+++ b/static/index.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>Shiritori</title>
+    <script src="https://unpkg.com/htmx.org@1.9.3"></script>
+</head>
+<body>
+    <button hx-get="/api/click" hx-swap="innerHTML">Click me!</button>
+</body>
+</html>
\ No newline at end of file