Lindenii Project Forge
Commit info | |
---|---|
ID | 77d4e60f2c8f0ba970be49b719d3b21c2a2860c8 |
Author | Runxi Yu<me@runxiyu.org> |
Author date | Fri, 14 Feb 2025 17:08:00 +0800 |
Committer | Runxi Yu<me@runxiyu.org> |
Committer date | Fri, 14 Feb 2025 17:08:00 +0800 |
Actions | Get patch |
style.css, repo_index: Use div, not table, for expandables
/* Base styles and variables */ html { font-family: sans-serif; background-color: var(--background-color); color: var(--text-color); --background-color: hsl(0, 0%, 100%); --text-color: hsl(0, 0%, 0%); --link-color: hsl(320, 50%, 36%); --light-text-color: hsl(0, 0%, 45%); --darker-border-color: hsl(0, 0%, 72%); --lighter-border-color: hsl(0, 0%, 85%); --text-decoration-color: hsl(0, 0%, 72%); --darker-box-background-color: hsl(0, 0%, 92%); --lighter-box-background-color: hsl(0, 0%, 95%); --primary-color: hsl(320, 50%, 36%); --primary-color-contrast: hsl(320, 0%, 100%); --danger-color: hsl(0, 50%, 36%); --danger-color-contrast: hsl(0, 0%, 100%); } /* Dark mode overrides */ @media (prefers-color-scheme: dark) { html { --background-color: hsl(0, 0%, 0%); --text-color: hsl(0, 0%, 100%); --link-color: hsl(320, 50%, 76%); --light-text-color: hsl(0, 0%, 78%); --darker-border-color: hsl(0, 0%, 35%); --lighter-border-color: hsl(0, 0%, 25%); --text-decoration-color: hsl(0, 0%, 30%); --darker-box-background-color: hsl(0, 0%, 20%); --lighter-box-background-color: hsl(0, 0%, 15%); } } /* Global layout */ body { margin: 0; } html, code, pre { font-size: 1rem; /* TODO: Not always correct */ }
/* Toggle table controls */ .toggle-table-off, .toggle-table-on { display: none; } .toggle-table-off + table > thead > tr > th, .toggle-table-on + table > thead > tr > th { padding: 0; } .toggle-table-off + table > thead > tr > th > label, .toggle-table-on + table > thead > tr > th > label { width: 100%; display: inline-block; padding: 3px 0; cursor: pointer; } .toggle-table-off:checked + table > tbody { display: none; } .toggle-table-on + table > tbody { display: none; } .toggle-table-on:checked + table > tbody { display: table-row-group; }
/* Footer styles */ footer { margin-top: 1rem; margin-left: auto; margin-right: auto; display: block; padding: 0 5px; width: fit-content; text-align: center; color: var(--light-text-color); } footer a:link, footer a:visited { color: inherit; } /* Padding containers */ .padding-wrapper { margin: 1rem auto; max-width: 60rem; padding: 0 5px; } .padding { padding: 0 5px; } /* Link styles */ a:link, a:visited { text-decoration-color: var(--text-decoration-color); color: var(--link-color); } /* Readme inline code styling */ #readme code:not(pre > code) { background-color: var(--lighter-box-background-color); border-radius: 2px; padding: 2px; } /* Table styles */ table { border: var(--lighter-border-color) solid 1px; border-spacing: 0px; border-collapse: collapse; } table.wide { width: 100%; } td, th { padding: 3px 5px; border: var(--lighter-border-color) solid 1px; }
.pad { padding: 3px 5px; }
th, thead, tfoot { background-color: var(--lighter-box-background-color); } th[scope=row] { text-align: left; } tr.title-row > th, th.title-row, .title-row { background-color: var(--darker-box-background-color); } td > pre { margin: 0; }
td#readme > *:last-child {
#readme > *:last-child {
margin-bottom: 0; }
td#readme > *:first-child {
#readme > *:first-child {
margin-top: 0; } /* Table misc and scrolling */ .commit-id { font-family: monospace; } .scroll { overflow-x: auto; }
/* Toggle table controls */ .toggle-table-off, .toggle-table-on { display: none; } .toggle-table-off + table > thead > tr > th, .toggle-table-on + table > thead > tr > th { padding: 0; } .toggle-table-off + table > thead > tr > th > label, .toggle-table-on + table > thead > tr > th > label { width: 100%; display: inline-block; padding: 3px 0; cursor: pointer; } .toggle-table-off:checked + table > tbody { display: none; } .toggle-table-on + table > tbody { display: none; } .toggle-table-on:checked + table > tbody { display: table-row-group; }
/* Diff/chunk styles */ .chunk-unchanged { color: grey; } .chunk-addition { background-color: green; } @media (prefers-color-scheme: dark) { .chunk-addition { background-color: lime; } } .chunk-deletion { background-color: red; } .chunk-unknown { background-color: yellow; } pre.chunk { margin-top: 0; margin-bottom: 0; }
.centering { text-align: center; }
/* Toggle content sections */
.toggle-on-wrapper {
.toggle-off-wrapper, .toggle-on-wrapper {
border: var(--lighter-border-color) solid 1px; }
.toggle-on-toggle {
.toggle-off-toggle, .toggle-on-toggle {
display: none; }
.toggle-on-header {
.toggle-off-header, .toggle-on-header { font-weight: bold;
cursor: pointer; display: block; width: 100%; background-color: var(--lighter-box-background-color); }
.toggle-on-header > span {
.toggle-off-header > div, .toggle-on-header > div {
padding: 3px 5px;
display: inline-block;
display: block;
} .toggle-on-content { display: none; } .toggle-on-toggle:checked + .toggle-on-header + .toggle-on-content { display: block;
} .toggle-off-content { display: block; } .toggle-off-toggle:checked + .toggle-off-header + .toggle-off-content { display: none;
} /* File display styles */ .file-patch + .file-patch { margin-top: 0.5rem; } .file-content { padding: 3px 5px; } .file-header { font-family: monospace; } /* Form elements */ textarea { box-sizing: border-box; background-color: var(--lighter-box-background-color); resize: vertical; } textarea, input[type=text], input[type=password] { font-family: sans-serif; font-size: smaller; background-color: var(--lighter-box-background-color); color: var(--text-color); border: none; padding: 0.3rem; width: 100%; box-sizing: border-box; } td.tdinput, th.tdinput { padding: 0; } td.tdinput textarea, td.tdinput input[type=text], td.tdinput input[type=password], th.tdinput textarea, th.tdinput input[type=text], th.tdinput input[type=password] { background-color: transparent; } /* Button styles */ .btn-primary { background: var(--primary-color); color: var(--primary-color-contrast); border: var(--lighter-border-color) 1px solid; font-weight: bold; } .btn-danger { background: var(--danger-color); color: var(--danger-color-contrast); border: var(--lighter-border-color) 1px solid; font-weight: bold; } .btn-white { background: var(--primary-color-contrast); color: var(--primary-color); border: var(--lighter-border-color) 1px solid; } .btn-normal, input[type=file]::file-selector-button { background: var(--lighter-box-background-color); border: var(--lighter-border-color) 1px solid !important; color: var(--light-text-color); } .btn, .btn-white, .btn-danger, .btn-normal, .btn-primary, input[type=submit], input[type=file]::file-selector-button { display: inline-block; width: auto; min-width: fit-content; border-radius: 0; padding: .1rem .75rem; font-size: 0.9rem; transition: background .1s linear; cursor: pointer; } a.btn, a.btn-white, a.btn-danger, a.btn-normal, a.btn-primary { text-decoration: none; } /* Header layout */ header#main-header { background-color: var(--lighter-box-background-color); display: flex; justify-content: space-between; align-items: center; padding: 10px; } header#main-header > div#main-header-forge-title { flex-grow: 1; } header#main-header > div#main-header-user { display: flex; align-items: center; }
{{- define "repo_commit" -}} <!DOCTYPE html> <html lang="en"> <head> {{ template "head_common" . }} <title>{{ .group_name }}/repos/{{ .repo_name }} – {{ .global.forge_title }}</title> </head> <body class="repo-commit"> {{ template "header" . }} <div class="padding-wrapper scroll"> <table id="commit-info-table"> <thead> <tr class="title-row"> <th colspan="2">Commit info</th> </tr> </thead> <tbody> <tr> <th scope="row">ID</th> <td>{{ .commit_id }}</td> </tr> <tr> <th scope="row">Author</th> <td>{{ .commit_object.Author.Name }} <<a href="mailto:{{ .commit_object.Author.Email }}">{{ .commit_object.Author.Email }}</a>></td> </tr> <tr> <th scope="row">Author date</th> <td>{{ .commit_object.Author.When.Format "Mon, 02 Jan 2006 15:04:05 -0700" }}</td> </tr> <tr> <th scope="row">Committer</th> <td>{{ .commit_object.Committer.Name }} <<a href="mailto:{{ .commit_object.Committer.Email }}">{{ .commit_object.Committer.Email }}</a>></td> </tr> <tr> <th scope="row">Committer date</th> <td>{{ .commit_object.Committer.When.Format "Mon, 02 Jan 2006 15:04:05 -0700" }}</td> </tr> <tr> <th scope="row">Message</th> <td><pre>{{ .commit_object.Message }}</pre></td> </tr> <tr> <th scope="row">Actions</th> <td><pre><a href="{{ .commit_object.Hash }}.patch">Get patch</a></pre></td> </tr> </tbody> </table> </div> <div class="padding-wrapper"> {{ $parent_commit_hash := .parent_commit_hash }} {{ $commit_object := .commit_object }} {{ range .file_patches }} <div class="file-patch toggle-on-wrapper"> <input type="checkbox" id="toggle-{{ .From.Hash }}{{ .To.Hash }}" class="file-toggle toggle-on-toggle"> <label for="toggle-{{ .From.Hash }}{{ .To.Hash }}" class="file-header toggle-on-header">
<span>
<div>
{{ if eq .From.Path "" }} --- /dev/null {{ else }} --- a/<a href="../tree/{{ .From.Path }}?commit={{ $parent_commit_hash }}">{{ .From.Path }}</a> {{ .From.Mode }} {{ end }} <br /> {{ if eq .To.Path "" }} +++ /dev/null {{ else }} +++ b/<a href="../tree/{{ .To.Path }}?commit={{ $commit_object.Hash }}">{{ .To.Path }}</a> {{ .To.Mode }} {{ end }}
</span>
</div>
</label> <div class="file-content toggle-on-content scroll"> {{ range .Chunks }} {{ if eq .Operation 0 }} <pre class="chunk chunk-unchanged">{{ .Content }}</pre> {{ else if eq .Operation 1 }} <pre class="chunk chunk-addition">{{ .Content }}</pre> {{ else if eq .Operation 2 }} <pre class="chunk chunk-deletion">{{ .Content }}</pre> {{ else }} <pre class="chunk chunk-unknown">{{ .Content }}</pre> {{ end }} {{ end }} </div> </div> {{ end }} </div> <footer> {{ template "footer" . }} </footer> </body> </html> {{- end -}}
{{- define "repo_index" -}} <!DOCTYPE html> <html lang="en"> <head> {{ template "head_common" . }} <title>{{ .group_name }}/repos/{{ .repo_name }} – {{ .global.forge_title }}</title> </head> <body class="repo-index"> {{ template "header" . }} <div class="padding-wrapper"> <table id="repo-info-table"> <thead> <tr class="title-row"> <th colspan="2">Repo info</th> </tr> </thead> <tbody> <tr> <th scope="row">Name</th> <td>{{ .repo_name }}</td> </tr> <tr> <th scope="row">Clone</th> <td><code>git clone {{ .clone_url }}</code></td> </tr> {{ if .repo_description }} <tr> <th scope="row">Description</th> <td>{{ .repo_description }}</td> </tr> {{ end }} </tbody> </table> </div> <div class="padding-wrapper scroll"> <input id="toggle-table-recent-commits" type="checkbox" class="toggle-table-off" /> <table id="recent-commits" class="wide"> <thead> <tr class="title-row"> <th colspan="3"><label for="toggle-table-recent-commits">Recent commits (<a href="log/{{ if .ref_type }}?{{ .ref_type }}={{ .ref_name }}{{ end }}">see all</a>)</label></th> </tr> </thead> <tbody> {{- range .commits }} <tr> <td class="commit-title"><a href="commit/{{ .ID }}">{{ .Message | first_line }}</a></td> <td class="commit-author"> <a class="email-name" href="mailto:{{ .Author.Email }}">{{ .Author.Name }}</a> </td> <td class="commit-time"> {{ .Author.When.Format "2006-01-02 15:04:05 -0700" }} </td> </tr> {{- end }} </tbody> </table> </div> <div class="padding-wrapper scroll"> <input id="toggle-table-file-tree" type="checkbox" class="toggle-table-off" /> <table id="file-tree" class="wide"> <thead> <tr class="title-row"> <th colspan="3"><label for="toggle-table-file-tree">/{{ if .ref_name }} on {{ .ref_name }}{{ end }}</label></th> </tr> </thead> <tbody> {{- $ref_type := .ref_type }} {{- $ref := .ref_name }} {{- range .files }} <tr> <td class="file-mode">{{ .Mode }}</td> <td class="file-name"><a href="tree/{{ .Name }}{{ if not .Is_file }}/{{ end }}{{ if $ref_type }}?{{ $ref_type }}={{ $ref }}{{ end }}">{{ .Name }}</a>{{ if not .Is_file }}/{{ end }}</td> <td class="file-size">{{ .Size }}</td> </tr> {{- end }} </tbody> </table> </div> <div class="padding-wrapper">
<div id="refs">
<div class="toggle-off-wrapper"> <input type="checkbox" id="toggle-readme" class="toggle-off-toggle" /> <label for="toggle-readme" class="toggle-off-header centering"><div>{{ .readme_filename }}</div></label> <div class="toggle-off-content pad" id="readme"> {{ .readme }} </div>
</div>
</div> <div class="padding-wrapper"> {{ if .readme }} <input id="toggle-table-readme" type="checkbox" class="toggle-table-off" /> <table class="wide"> <thead> <tr class="title-row"> <th><label for="toggle-table-readme">{{ .readme_filename }}</label></th> </tr> </thead> <tbody> <tr> <td id="readme"> {{ .readme -}} </td> </tr> </tbody> </table> {{ end }}
</div> <footer> {{ template "footer" . }} </footer> </body> </html> {{- end -}}