cerrado @ 6a3a7a85ef2f63e88a8c96aa3ab525ce843024f9

feat: Add login link to the header
diff --git a/scss/main.scss b/scss/main.scss
index 0766f82a7ceae091b15f47a009b1f82b8bb19204..b76423f843be94eb52197bf2e42b219eada6c556 100644
--- a/scss/main.scss
+++ b/scss/main.scss
@@ -74,6 +74,13 @@     property: margin-right,
     class: me,
     values: map-merge($spacers, (auto: auto))
   ),
+  "margin-start": (
+    responsive: true,
+    property: margin-left,
+    class: ms,
+    values: map-merge($spacers, (auto: auto))
+  ),
+
 );
 
 @import "bootstrap/scss/utilities/_api.scss";
diff --git a/templates/base.qtpl b/templates/base.qtpl
index 7063829b49a5aadc65c985dab3910c976e294224..566308f9c13c670c3106c8ba2c51230e533e00d8 100644
--- a/templates/base.qtpl
+++ b/templates/base.qtpl
@@ -43,7 +43,7 @@   <head>
     <meta charset="utf-8">
     <link rel="icon" href="data:,">
     <title>{%= p.Title() %}</title> 
-    <link rel="stylesheet" href="/static/main{%s Slug%}.css">
+    <link rel="stylesheet" href="/static/main{%s Slug %}.css">
     <meta content="text/html;charset=utf-8" http-equiv="Content-Type">
     <meta name="viewport" content="width=device-width, initial-scale=1" />
   </head>
diff --git a/templates/navbar.qtpl b/templates/navbar.qtpl
index 86141811781819433a83922bfa797b03958b9656..8f5f9e135c7cc960e0b529f044e972f792ad95fb 100644
--- a/templates/navbar.qtpl
+++ b/templates/navbar.qtpl
@@ -16,6 +16,7 @@     Log
     Summary
     Refs
     Tree
+    Login
 )
 %}
 
@@ -25,6 +26,9 @@ {% func Navbar (s Selection) %}
         <nav class="container navbar navbar-expand">
           <div class="navbar-nav">
             <a class="nav-link{%= insertIfEqual(s, Git) %}" href="/">git</a>
+          </div>
+          <div class="navbar-nav ms-auto">
+            <a class="nav-link{%= insertIfEqual(s, Login) %}" href="/login">login</a>
 {% comment %}
 Add this back once needed
             <a class="nav-link{%= insertIfEqual(s, List) %}" href="/list/">list</a>
diff --git a/templates/navbar.qtpl.go b/templates/navbar.qtpl.go
index ca3a320443d531ae805bf6273796370bcabe604b..e6ca0aa2783df2afe1e88a57186f46649b0986a9 100644
--- a/templates/navbar.qtpl.go
+++ b/templates/navbar.qtpl.go
@@ -36,208 +36,216 @@ 	Log
 	Summary
 	Refs
 	Tree
+	Login
 )
 
-//line templates/navbar.qtpl:22
+//line templates/navbar.qtpl:23
 func streaminsertIfEqual(qw422016 *qt422016.Writer, s, d any) {
-//line templates/navbar.qtpl:22
+//line templates/navbar.qtpl:23
 	if s == d {
-//line templates/navbar.qtpl:22
+//line templates/navbar.qtpl:23
 		qw422016.N().S(` selected`)
-//line templates/navbar.qtpl:22
+//line templates/navbar.qtpl:23
 	}
-//line templates/navbar.qtpl:22
+//line templates/navbar.qtpl:23
 }
 
-//line templates/navbar.qtpl:22
+//line templates/navbar.qtpl:23
 func writeinsertIfEqual(qq422016 qtio422016.Writer, s, d any) {
-//line templates/navbar.qtpl:22
+//line templates/navbar.qtpl:23
 	qw422016 := qt422016.AcquireWriter(qq422016)
-//line templates/navbar.qtpl:22
+//line templates/navbar.qtpl:23
 	streaminsertIfEqual(qw422016, s, d)
-//line templates/navbar.qtpl:22
+//line templates/navbar.qtpl:23
 	qt422016.ReleaseWriter(qw422016)
-//line templates/navbar.qtpl:22
+//line templates/navbar.qtpl:23
 }
 
-//line templates/navbar.qtpl:22
+//line templates/navbar.qtpl:23
 func insertIfEqual(s, d any) string {
-//line templates/navbar.qtpl:22
+//line templates/navbar.qtpl:23
 	qb422016 := qt422016.AcquireByteBuffer()
-//line templates/navbar.qtpl:22
+//line templates/navbar.qtpl:23
 	writeinsertIfEqual(qb422016, s, d)
-//line templates/navbar.qtpl:22
+//line templates/navbar.qtpl:23
 	qs422016 := string(qb422016.B)
-//line templates/navbar.qtpl:22
+//line templates/navbar.qtpl:23
 	qt422016.ReleaseByteBuffer(qb422016)
-//line templates/navbar.qtpl:22
+//line templates/navbar.qtpl:23
 	return qs422016
-//line templates/navbar.qtpl:22
+//line templates/navbar.qtpl:23
 }
 
-//line templates/navbar.qtpl:24
+//line templates/navbar.qtpl:25
 func StreamNavbar(qw422016 *qt422016.Writer, s Selection) {
-//line templates/navbar.qtpl:24
+//line templates/navbar.qtpl:25
 	qw422016.N().S(`
         <nav class="container navbar navbar-expand">
           <div class="navbar-nav">
             <a class="nav-link`)
-//line templates/navbar.qtpl:27
+//line templates/navbar.qtpl:28
 	streaminsertIfEqual(qw422016, s, Git)
-//line templates/navbar.qtpl:27
+//line templates/navbar.qtpl:28
 	qw422016.N().S(`" href="/">git</a>
+          </div>
+          <div class="navbar-nav ms-auto">
+            <a class="nav-link`)
+//line templates/navbar.qtpl:31
+	streaminsertIfEqual(qw422016, s, Login)
+//line templates/navbar.qtpl:31
+	qw422016.N().S(`" href="/">login</a>
 `)
-//line templates/navbar.qtpl:31
+//line templates/navbar.qtpl:35
 	qw422016.N().S(`
 `)
-//line templates/navbar.qtpl:35
+//line templates/navbar.qtpl:39
 	qw422016.N().S(`
           </div>
         </nav>
 `)
-//line templates/navbar.qtpl:38
+//line templates/navbar.qtpl:42
 }
 
-//line templates/navbar.qtpl:38
+//line templates/navbar.qtpl:42
 func WriteNavbar(qq422016 qtio422016.Writer, s Selection) {
-//line templates/navbar.qtpl:38
+//line templates/navbar.qtpl:42
 	qw422016 := qt422016.AcquireWriter(qq422016)
-//line templates/navbar.qtpl:38
+//line templates/navbar.qtpl:42
 	StreamNavbar(qw422016, s)
-//line templates/navbar.qtpl:38
+//line templates/navbar.qtpl:42
 	qt422016.ReleaseWriter(qw422016)
-//line templates/navbar.qtpl:38
+//line templates/navbar.qtpl:42
 }
 
-//line templates/navbar.qtpl:38
+//line templates/navbar.qtpl:42
 func Navbar(s Selection) string {
-//line templates/navbar.qtpl:38
+//line templates/navbar.qtpl:42
 	qb422016 := qt422016.AcquireByteBuffer()
-//line templates/navbar.qtpl:38
+//line templates/navbar.qtpl:42
 	WriteNavbar(qb422016, s)
-//line templates/navbar.qtpl:38
+//line templates/navbar.qtpl:42
 	qs422016 := string(qb422016.B)
-//line templates/navbar.qtpl:38
+//line templates/navbar.qtpl:42
 	qt422016.ReleaseByteBuffer(qb422016)
-//line templates/navbar.qtpl:38
+//line templates/navbar.qtpl:42
 	return qs422016
-//line templates/navbar.qtpl:38
+//line templates/navbar.qtpl:42
 }
 
-//line templates/navbar.qtpl:40
+//line templates/navbar.qtpl:44
 func StreamGitItemNav(qw422016 *qt422016.Writer, name, ref string, s GitSelection) {
-//line templates/navbar.qtpl:40
+//line templates/navbar.qtpl:44
 	qw422016.N().S(`
 <div class="row">
     <h3 id="name">`)
-//line templates/navbar.qtpl:42
+//line templates/navbar.qtpl:46
 	qw422016.E().S(name)
-//line templates/navbar.qtpl:42
+//line templates/navbar.qtpl:46
 	qw422016.N().S(` `)
-//line templates/navbar.qtpl:42
+//line templates/navbar.qtpl:46
 	if ref != "" && (s == Log || s == Tree) {
-//line templates/navbar.qtpl:42
+//line templates/navbar.qtpl:46
 		qw422016.N().S(`@ `)
-//line templates/navbar.qtpl:42
+//line templates/navbar.qtpl:46
 		qw422016.E().S(ref)
-//line templates/navbar.qtpl:42
+//line templates/navbar.qtpl:46
 	}
-//line templates/navbar.qtpl:42
+//line templates/navbar.qtpl:46
 	qw422016.N().S(`</h3>
 </div>
 <div class="row">
   <ul class="nav">
     <li class="nav-item">
       <a class="nav-link`)
-//line templates/navbar.qtpl:47
+//line templates/navbar.qtpl:51
 	streaminsertIfEqual(qw422016, s, Readme)
-//line templates/navbar.qtpl:47
+//line templates/navbar.qtpl:51
 	qw422016.N().S(`" aria-current="page" href="/`)
-//line templates/navbar.qtpl:47
+//line templates/navbar.qtpl:51
 	qw422016.E().S(name)
-//line templates/navbar.qtpl:47
+//line templates/navbar.qtpl:51
 	qw422016.N().S(`/about/">about</a>
     </li>
     <li class="nav-item">
       <a class="nav-link`)
-//line templates/navbar.qtpl:50
+//line templates/navbar.qtpl:54
 	streaminsertIfEqual(qw422016, s, Summary)
-//line templates/navbar.qtpl:50
+//line templates/navbar.qtpl:54
 	qw422016.N().S(`" aria-current="page" href="/`)
-//line templates/navbar.qtpl:50
+//line templates/navbar.qtpl:54
 	qw422016.E().S(name)
-//line templates/navbar.qtpl:50
+//line templates/navbar.qtpl:54
 	qw422016.N().S(`/">summary</a>
     </li>
     <li class="nav-item">
       <a class="nav-link`)
-//line templates/navbar.qtpl:53
+//line templates/navbar.qtpl:57
 	streaminsertIfEqual(qw422016, s, Refs)
-//line templates/navbar.qtpl:53
+//line templates/navbar.qtpl:57
 	qw422016.N().S(`" aria-current="page" href="/`)
-//line templates/navbar.qtpl:53
+//line templates/navbar.qtpl:57
 	qw422016.E().S(name)
-//line templates/navbar.qtpl:53
+//line templates/navbar.qtpl:57
 	qw422016.N().S(`/refs">refs</a>
     </li>
     <li class="nav-item">
       <a class="nav-link`)
-//line templates/navbar.qtpl:56
+//line templates/navbar.qtpl:60
 	streaminsertIfEqual(qw422016, s, Log)
-//line templates/navbar.qtpl:56
+//line templates/navbar.qtpl:60
 	qw422016.N().S(`" aria-current="page" href="/`)
-//line templates/navbar.qtpl:56
+//line templates/navbar.qtpl:60
 	qw422016.E().S(name)
-//line templates/navbar.qtpl:56
+//line templates/navbar.qtpl:60
 	qw422016.N().S(`/log/`)
-//line templates/navbar.qtpl:56
+//line templates/navbar.qtpl:60
 	qw422016.E().S(ref)
-//line templates/navbar.qtpl:56
+//line templates/navbar.qtpl:60
 	qw422016.N().S(`/">log</a>
     </li>
     <li class="nav-item">
       <a class="nav-link`)
-//line templates/navbar.qtpl:59
+//line templates/navbar.qtpl:63
 	streaminsertIfEqual(qw422016, s, Tree)
-//line templates/navbar.qtpl:59
+//line templates/navbar.qtpl:63
 	qw422016.N().S(`" aria-current="page" href="/`)
-//line templates/navbar.qtpl:59
+//line templates/navbar.qtpl:63
 	qw422016.E().S(name)
-//line templates/navbar.qtpl:59
+//line templates/navbar.qtpl:63
 	qw422016.N().S(`/tree/`)
-//line templates/navbar.qtpl:59
+//line templates/navbar.qtpl:63
 	qw422016.E().S(ref)
-//line templates/navbar.qtpl:59
+//line templates/navbar.qtpl:63
 	qw422016.N().S(`/">tree</a>
     </li>
   </ul>
 </div>
 `)
-//line templates/navbar.qtpl:63
+//line templates/navbar.qtpl:67
 }
 
-//line templates/navbar.qtpl:63
+//line templates/navbar.qtpl:67
 func WriteGitItemNav(qq422016 qtio422016.Writer, name, ref string, s GitSelection) {
-//line templates/navbar.qtpl:63
+//line templates/navbar.qtpl:67
 	qw422016 := qt422016.AcquireWriter(qq422016)
-//line templates/navbar.qtpl:63
+//line templates/navbar.qtpl:67
 	StreamGitItemNav(qw422016, name, ref, s)
-//line templates/navbar.qtpl:63
+//line templates/navbar.qtpl:67
 	qt422016.ReleaseWriter(qw422016)
-//line templates/navbar.qtpl:63
+//line templates/navbar.qtpl:67
 }
 
-//line templates/navbar.qtpl:63
+//line templates/navbar.qtpl:67
 func GitItemNav(name, ref string, s GitSelection) string {
-//line templates/navbar.qtpl:63
+//line templates/navbar.qtpl:67
 	qb422016 := qt422016.AcquireByteBuffer()
-//line templates/navbar.qtpl:63
+//line templates/navbar.qtpl:67
 	WriteGitItemNav(qb422016, name, ref, s)
-//line templates/navbar.qtpl:63
+//line templates/navbar.qtpl:67
 	qs422016 := string(qb422016.B)
-//line templates/navbar.qtpl:63
+//line templates/navbar.qtpl:67
 	qt422016.ReleaseByteBuffer(qb422016)
-//line templates/navbar.qtpl:63
+//line templates/navbar.qtpl:67
 	return qs422016
-//line templates/navbar.qtpl:63
+//line templates/navbar.qtpl:67
 }