caddy-git-server
Provides a git_server caddy module for serving git repositories.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- <script src="https://cdn.tailwindcss.com"></script> -->
<link rel="stylesheet" href="/style.css">
<!-- <style>
/*! tailwindcss v3.2.4 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button;background-color:initial;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:initial}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}*,::backdrop,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.m-2{margin:.5rem}.m-4{margin:1rem}.m-5{margin:1.25rem}.mx-4{margin-left:1rem;margin-right:1rem}.mr-1\.5{margin-right:.375rem}.mr-1{margin-right:.25rem}.ml-12{margin-left:3rem}.mb-0{margin-bottom:0}.mt-2{margin-top:.5rem}.mb-1{margin-bottom:.25rem}.mb-4{margin-bottom:1rem}.inline-block{display:inline-block}.flex{display:flex}.table{display:table}.grid{display:grid}.h-1{height:.25rem}.max-h-32{max-height:8rem}.w-full{width:100%}.flex-none{flex:none}.grow{flex-grow:1}.basis-full{flex-basis:100%}.basis-auto{flex-basis:auto}.basis-3\/4{flex-basis:75%}.table-auto{table-layout:auto}.border-collapse{border-collapse:collapse}.cursor-pointer{cursor:pointer}.select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-between{justify-content:space-between}.justify-evenly{justify-content:space-evenly}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(1px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px*var(--tw-divide-y-reverse))}.divide-neutral-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(212 212 212/var(--tw-divide-opacity))}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-y-scroll{overflow-y:scroll}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-wrap{white-space:pre-wrap}.rounded{border-radius:.25rem}.border{border-width:1px}.border-y{border-top-width:1px;border-bottom-width:1px}.border-x{border-left-width:1px;border-right-width:1px}.border-t-2{border-top-width:2px}.border-b{border-bottom-width:1px}.border-neutral-300{--tw-border-opacity:1;border-color:rgb(212 212 212/var(--tw-border-opacity))}.bg-neutral-200{--tw-bg-opacity:1;background-color:rgb(229 229 229/var(--tw-bg-opacity))}.bg-neutral-300{--tw-bg-opacity:1;background-color:rgb(212 212 212/var(--tw-bg-opacity))}.bg-neutral-100{--tw-bg-opacity:1;background-color:rgb(245 245 245/var(--tw-bg-opacity))}.p-4{padding:1rem}.p-2{padding:.5rem}.py-4{padding-top:1rem;padding-bottom:1rem}.px-1{padding-left:.25rem;padding-right:.25rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-0{padding-top:0;padding-bottom:0}.px-2{padding-left:.5rem;padding-right:.5rem}.px-4{padding-right:1rem}.pl-4,.px-4{padding-left:1rem}.pr-2{padding-right:.5rem}.pt-1{padding-top:.25rem}.pb-0\.5{padding-bottom:.125rem}.pb-0{padding-bottom:0}.pt-2{padding-top:.5rem}.pl-2{padding-left:.5rem}.text-center{text-align:center}.text-right{text-align:right}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-9xl{font-size:8rem;line-height:1}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.font-bold{font-weight:700}.shadow{--tw-shadow:0 1px 3px 0 #0000001a,0 1px 2px -1px #0000001a;--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.hover\:border-t-2:hover{border-top-width:2px}.hover\:bg-neutral-100:hover{--tw-bg-opacity:1;background-color:rgb(245 245 245/var(--tw-bg-opacity))}.hover\:bg-cyan-200:hover{--tw-bg-opacity:1;background-color:rgb(165 243 252/var(--tw-bg-opacity))}@media (min-width:768px){.md\:basis-1\/4{flex-basis:25%}}@media (min-width:1280px){.xl\:basis-1\/6{flex-basis:16.666667%}}
</style> -->
<title>{{.Name}}{{ if ne .Page "home" }} - {{.Page}}{{ end }} - {{ .Host }}</title>
</head>
<body>
<div class="flex flex-col m-2 border border-neutral-300 shadow">
<!-- Header -->
<div class="flex flex-row flex-wrap justify-between bg-neutral-200">
<!-- Heading -->
<div class="grow">
<h1 class="text-3xl font-bold pl-4 pr-2">
<span class="inline-block">{{.Host}}</span>
<span class="inline-block">
{{range (split .Root "/")}}
{{if .}}
/ <span>{{.}}</span>
{{end}}
{{end}}
</span>
</h1>
</div>
<!-- Clone URL and git icon -->
<div class="grow flex flex-row justify-end items-center m-2">
<code class="select-all mr-1.5 pt-1 text-right">
<span class="inline-block">git clone</span>
<span class="inline-block">{{.CloneURL}}</span>
</code>
<a href="https://git-scm.com/">
<img src="data:image/ico;base64,{{.Assets.GitIcon}}">
</a>
</div>
<!-- Navigation -->
<div class="basis-full">
<div class="text-xl ml-12 mb-0">
<a onclick="window.location='/{{.Root}}'+window.location.search;" class="pb-0.5 px-1 cursor-pointer border-neutral-300 {{ if eq .Page "home" }}bg-neutral-300 border-t-2{{else}}hover:border-t-2{{end}}">home</a>
<a onclick="window.location='/{{.Root}}/log'+window.location.search;" class="pb-0.5 px-1 cursor-pointer border-neutral-300 {{ if eq .Page "log" }}bg-neutral-300 border-t-2{{else}}hover:border-t-2{{end}}">log</a>
<a onclick="window.location='/{{.Root}}/tree'+window.location.search;" class="pb-0.5 px-1 cursor-pointer border-neutral-300 {{ if eq .Page "tree" }}bg-neutral-300 border-t-2{{else}}hover:border-t-2{{end}}">tree</a>
</div>
<div class="w-full h-1 bg-neutral-300"></div>
</div>
</div>
<!-- Page Content -->
{{ template "page" . }}
<!-- Footer -->
<div class="flex flex-row flex-wrap justify-between items-center bg-neutral-100 py-0.5">
<p class="grow px-2">{{.Name}} - {{.Tagline}}</p>
<p class="grow px-2 text-sm text-right">generated {{.Now}}</p>
</div>
</div>
</body>
</html>