cerrado @ ce911df583e384d86018e42f9548cdf33d1c1549

  1diff --git a/Makefile b/Makefile
  2index 38db3a9c283ce4cd2538f1fc454111ed9ff12035..61df8351f7c79059ecf9ef2db0351c527b37e023 100644
  3--- a/Makefile
  4+++ b/Makefile
  5@@ -1,5 +1,3 @@
  6-.ONESHELL:
  7-
  8 build: sass tmpl
  9 	go build -o bin/cerrado
 10 
 11@@ -10,10 +8,12 @@ test:
 12 	go test -v --tags=unit ./...
 13 
 14 sass:
 15-	@make -p static
 16+	@mkdir -p static
 17 	sassc \
 18 		-I scss scss/main.scss static/main.css
 19 
 20 tmpl:
 21-	cd ./templates
 22+	cd ./templates && \
 23 	qtc *
 24+
 25+.PHONY: sass
 26diff --git a/main.go b/main.go
 27index 3d6411d1c2cac54353b520600f1ffe6fa21054b3..d2452e8a5766b22174b55f2ffbdcd2bc2149a954 100644
 28--- a/main.go
 29+++ b/main.go
 30@@ -5,6 +5,7 @@ 	"bytes"
 31 	"context"
 32 	"encoding/json"
 33 	"flag"
 34+	"io/fs"
 35 	"log/slog"
 36 	"net/http"
 37 	"os"
 38@@ -17,6 +18,7 @@ 	"github.com/alecthomas/chroma/v2/styles"
 39 
 40 	"git.gabrielgio.me/cerrado/pkg/config"
 41 	"git.gabrielgio.me/cerrado/pkg/worker"
 42+	"git.gabrielgio.me/cerrado/static"
 43 	"git.gabrielgio.me/cerrado/templates"
 44 )
 45 
 46@@ -25,6 +27,7 @@
 47 	ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, os.Kill)
 48 	defer stop()
 49 	if err := run(ctx); err != nil {
 50+		slog.Error("Error", "error", err)
 51 		os.Exit(1)
 52 	}
 53 }
 54@@ -37,6 +40,13 @@
 55 	flag.Parse()
 56 
 57 	mux := http.NewServeMux()
 58+
 59+	staticFs, err := fs.Sub(static.Static, ".")
 60+	if err != nil {
 61+		return err
 62+	}
 63+
 64+	mux.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.FS(staticFs))))
 65 	mux.HandleFunc("/", func(w http.ResponseWriter, _ *http.Request) {
 66 		slog.Info("Handling index")
 67 
 68diff --git a/scss/main.scss b/scss/main.scss
 69index ae493855c99c453d9ac962645ce58497402ac5b2..7273c9f36be42a2a85fa8774639400a13bb7668a 100644
 70--- a/scss/main.scss
 71+++ b/scss/main.scss
 72@@ -1,3 +1,4 @@
 73+
 74 @import "bootstrap/scss/_functions.scss";
 75 @import "bootstrap/scss/_variables.scss";
 76 @import "bootstrap/scss/_variables-dark.scss";
 77@@ -7,3 +8,12 @@ @import "bootstrap/scss/_utilities.scss";
 78 
 79 
 80 @import "bootstrap/scss/_root.scss";
 81+@import "bootstrap/scss/_containers.scss";
 82+@import "bootstrap/scss/_nav.scss";
 83+@import "bootstrap/scss/_navbar.scss";
 84+
 85+
 86+body {
 87+    font-family: $font-family-monospace;
 88+
 89+}
 90diff --git a/templates/base.qtpl b/templates/base.qtpl
 91index 1683981b506d0ed3e46c9331cc1841189422929a..6bef9863b93963da9f9b9cc854c830a3757b6c66 100644
 92--- a/templates/base.qtpl
 93+++ b/templates/base.qtpl
 94@@ -25,12 +25,22 @@ {% func PageTemplate(p Page) %}
 95 <html lang="en">
 96     <head>
 97         <meta charset="utf-8">
 98-        <title>img | {%= p.Title() %}</title> 
 99+        <title>cerrado | {%= p.Title() %}</title> 
100         <link rel="stylesheet" href="/static/main.css">
101         <meta name="viewport" content="width=device-width, initial-scale=1" />
102     </head>
103     <body>
104-        <div>
105+        <nav class="navbar navbar-expand bg-body-tertiary">
106+          <div class="container-fluid">
107+            <div class="collapse navbar-collapse">
108+              <div class="navbar-nav">
109+                <a class="nav-link" href="/git">git</a>
110+                <a class="nav-link" href="/list">list</a>
111+              </div>
112+            </div>
113+          </div>
114+        </nav>
115+        <div class="container">
116             {%= p.Content() %}
117         </div>
118     </body>
119diff --git a/templates/base.qtpl.go b/templates/base.qtpl.go
120index 8d93fa82b1607475b09d4077628d6598b628af6e..ffee940f7a00b30ecf95ca6d7fa2bce970300ead 100644
121--- a/templates/base.qtpl.go
122+++ b/templates/base.qtpl.go
123@@ -63,7 +63,7 @@ 	qw422016.N().S(`
124 <html lang="en">
125     <head>
126         <meta charset="utf-8">
127-        <title>img | `)
128+        <title>cerrado | `)
129 //line base.qtpl:28
130 	p.StreamTitle(qw422016)
131 //line base.qtpl:28
132@@ -72,146 +72,156 @@         <link rel="stylesheet" href="/static/main.css">
133         <meta name="viewport" content="width=device-width, initial-scale=1" />
134     </head>
135     <body>
136-        <div>
137+        <nav class="navbar navbar-expand bg-body-tertiary">
138+          <div class="container-fluid">
139+            <div class="collapse navbar-collapse">
140+              <div class="navbar-nav">
141+                <a class="nav-link" href="/git">git</a>
142+                <a class="nav-link" href="/list">list</a>
143+              </div>
144+            </div>
145+          </div>
146+        </nav>
147+        <div class="container">
148             `)
149-//line base.qtpl:34
150+//line base.qtpl:44
151 	p.StreamContent(qw422016)
152-//line base.qtpl:34
153+//line base.qtpl:44
154 	qw422016.N().S(`
155         </div>
156     </body>
157     `)
158-//line base.qtpl:37
159+//line base.qtpl:47
160 	p.StreamScript(qw422016)
161-//line base.qtpl:37
162+//line base.qtpl:47
163 	qw422016.N().S(`
164 </html>
165 `)
166-//line base.qtpl:39
167+//line base.qtpl:49
168 }
169 
170-//line base.qtpl:39
171+//line base.qtpl:49
172 func WritePageTemplate(qq422016 qtio422016.Writer, p Page) {
173-//line base.qtpl:39
174+//line base.qtpl:49
175 	qw422016 := qt422016.AcquireWriter(qq422016)
176-//line base.qtpl:39
177+//line base.qtpl:49
178 	StreamPageTemplate(qw422016, p)
179-//line base.qtpl:39
180+//line base.qtpl:49
181 	qt422016.ReleaseWriter(qw422016)
182-//line base.qtpl:39
183+//line base.qtpl:49
184 }
185 
186-//line base.qtpl:39
187+//line base.qtpl:49
188 func PageTemplate(p Page) string {
189-//line base.qtpl:39
190+//line base.qtpl:49
191 	qb422016 := qt422016.AcquireByteBuffer()
192-//line base.qtpl:39
193+//line base.qtpl:49
194 	WritePageTemplate(qb422016, p)
195-//line base.qtpl:39
196+//line base.qtpl:49
197 	qs422016 := string(qb422016.B)
198-//line base.qtpl:39
199+//line base.qtpl:49
200 	qt422016.ReleaseByteBuffer(qb422016)
201-//line base.qtpl:39
202+//line base.qtpl:49
203 	return qs422016
204-//line base.qtpl:39
205+//line base.qtpl:49
206 }
207 
208-//line base.qtpl:41
209+//line base.qtpl:51
210 type BasePage struct{}
211 
212-//line base.qtpl:42
213+//line base.qtpl:52
214 func (p *BasePage) StreamTitle(qw422016 *qt422016.Writer) {
215-//line base.qtpl:42
216+//line base.qtpl:52
217 	qw422016.N().S(`Empty`)
218-//line base.qtpl:42
219+//line base.qtpl:52
220 }
221 
222-//line base.qtpl:42
223+//line base.qtpl:52
224 func (p *BasePage) WriteTitle(qq422016 qtio422016.Writer) {
225-//line base.qtpl:42
226+//line base.qtpl:52
227 	qw422016 := qt422016.AcquireWriter(qq422016)
228-//line base.qtpl:42
229+//line base.qtpl:52
230 	p.StreamTitle(qw422016)
231-//line base.qtpl:42
232+//line base.qtpl:52
233 	qt422016.ReleaseWriter(qw422016)
234-//line base.qtpl:42
235+//line base.qtpl:52
236 }
237 
238-//line base.qtpl:42
239+//line base.qtpl:52
240 func (p *BasePage) Title() string {
241-//line base.qtpl:42
242+//line base.qtpl:52
243 	qb422016 := qt422016.AcquireByteBuffer()
244-//line base.qtpl:42
245+//line base.qtpl:52
246 	p.WriteTitle(qb422016)
247-//line base.qtpl:42
248+//line base.qtpl:52
249 	qs422016 := string(qb422016.B)
250-//line base.qtpl:42
251+//line base.qtpl:52
252 	qt422016.ReleaseByteBuffer(qb422016)
253-//line base.qtpl:42
254+//line base.qtpl:52
255 	return qs422016
256-//line base.qtpl:42
257+//line base.qtpl:52
258 }
259 
260-//line base.qtpl:43
261+//line base.qtpl:53
262 func (p *BasePage) StreamBody(qw422016 *qt422016.Writer) {
263-//line base.qtpl:43
264+//line base.qtpl:53
265 	qw422016.N().S(`HelloWorld`)
266-//line base.qtpl:43
267+//line base.qtpl:53
268 }
269 
270-//line base.qtpl:43
271+//line base.qtpl:53
272 func (p *BasePage) WriteBody(qq422016 qtio422016.Writer) {
273-//line base.qtpl:43
274+//line base.qtpl:53
275 	qw422016 := qt422016.AcquireWriter(qq422016)
276-//line base.qtpl:43
277+//line base.qtpl:53
278 	p.StreamBody(qw422016)
279-//line base.qtpl:43
280+//line base.qtpl:53
281 	qt422016.ReleaseWriter(qw422016)
282-//line base.qtpl:43
283+//line base.qtpl:53
284 }
285 
286-//line base.qtpl:43
287+//line base.qtpl:53
288 func (p *BasePage) Body() string {
289-//line base.qtpl:43
290+//line base.qtpl:53
291 	qb422016 := qt422016.AcquireByteBuffer()
292-//line base.qtpl:43
293+//line base.qtpl:53
294 	p.WriteBody(qb422016)
295-//line base.qtpl:43
296+//line base.qtpl:53
297 	qs422016 := string(qb422016.B)
298-//line base.qtpl:43
299+//line base.qtpl:53
300 	qt422016.ReleaseByteBuffer(qb422016)
301-//line base.qtpl:43
302+//line base.qtpl:53
303 	return qs422016
304-//line base.qtpl:43
305+//line base.qtpl:53
306 }
307 
308-//line base.qtpl:44
309+//line base.qtpl:54
310 func (p *BasePage) StreamScript(qw422016 *qt422016.Writer) {
311-//line base.qtpl:44
312+//line base.qtpl:54
313 }
314 
315-//line base.qtpl:44
316+//line base.qtpl:54
317 func (p *BasePage) WriteScript(qq422016 qtio422016.Writer) {
318-//line base.qtpl:44
319+//line base.qtpl:54
320 	qw422016 := qt422016.AcquireWriter(qq422016)
321-//line base.qtpl:44
322+//line base.qtpl:54
323 	p.StreamScript(qw422016)
324-//line base.qtpl:44
325+//line base.qtpl:54
326 	qt422016.ReleaseWriter(qw422016)
327-//line base.qtpl:44
328+//line base.qtpl:54
329 }
330 
331-//line base.qtpl:44
332+//line base.qtpl:54
333 func (p *BasePage) Script() string {
334-//line base.qtpl:44
335+//line base.qtpl:54
336 	qb422016 := qt422016.AcquireByteBuffer()
337-//line base.qtpl:44
338+//line base.qtpl:54
339 	p.WriteScript(qb422016)
340-//line base.qtpl:44
341+//line base.qtpl:54
342 	qs422016 := string(qb422016.B)
343-//line base.qtpl:44
344+//line base.qtpl:54
345 	qt422016.ReleaseByteBuffer(qb422016)
346-//line base.qtpl:44
347+//line base.qtpl:54
348 	return qs422016
349-//line base.qtpl:44
350+//line base.qtpl:54
351 }