仰望星辰工作室

gitcat

gitcat/ webroot/templates/layout.html 7.6 KB · 150 行 原始文件
1{{define "av"}}{{if .U}}{{if .U.Avatar}}<img class="av" style="width:{{.S}}px;height:{{.S}}px" src="/media/avatars/{{.U.Avatar}}" alt="{{.U.Display}}">{{else}}<span class="av av-txt {{ava .U.Display}}" style="width:{{.S}}px;height:{{.S}}px;font-size:{{sub .S 14}}px">{{.U.Initial}}</span>{{end}}{{else}}<span class="av av-txt g0" style="width:{{.S}}px;height:{{.S}}px;font-size:{{sub .S 14}}px">?</span>{{end}}{{end}}
2
3{{define "flash"}}{{if .Flash}}<div class="flash ok" role="status"><span class="flash-ico">✓</span><span>{{.Flash}}</span><button class="flash-x" type="button" aria-label="关闭">×</button></div>{{end}}{{if .Error}}<div class="flash err" role="alert"><span class="flash-ico">!</span><span>{{.Error}}</span><button class="flash-x" type="button" aria-label="关闭">×</button></div>{{end}}{{end}}
4
5{{define "avin"}}<span class="av av-txt {{ava .N}}" style="width:{{.S}}px;height:{{.S}}px;font-size:{{sub .S 12}}px">{{initial .N}}</span>{{end}}
6
7{{define "pushbox"}}
8<article class="pushcard">
9 <header class="pushcard-h">
10 {{if .U}}{{template "av" (dict "U" .U "S" 34)}}{{else}}{{template "avin" (dict "N" .P.ActorDisplay "S" 34)}}{{end}}
11 <div class="pushcard-meta">
12 <div class="pushcard-line">
13 <strong>{{if .U}}{{.U.Display}}{{else}}{{.P.ActorDisplay}}{{end}}</strong>
14 <span class="muted">推送了</span>
15 <span class="pill">{{.P.CommitCount}} 个提交</span>
16 <span class="muted">到</span>
17 <code class="ref">{{.P.Ref}}</code>
18 </div>
19 <div class="pushcard-sub">
20 <a class="quiet" href="/{{.P.RepoName}}">{{.P.RepoName}}</a>
21 <span class="dot">·</span>
22 <span class="muted" title="{{datetime .P.CreatedAt}}">{{timeago .P.CreatedAt}}</span>
23 {{if eq .P.AIStatus "done"}}<span class="tag tag-ai">AI 摘要</span>{{else if eq .P.AIStatus "pending"}}<span class="tag tag-pending">AI 生成中…</span>{{else if eq .P.AIStatus "failed"}}<span class="tag tag-warn">AI 不可用 · 自动摘要</span>{{else}}<span class="tag tag-plain">自动摘要</span>{{end}}
24 </div>
25 </div>
26 </header>
27 {{if .P.WhatsNew}}<div class="whatsnew">{{md .P.WhatsNew}}</div>{{end}}
28 {{if .P.Details}}
29 <details class="commitlist-wrap">
30 <summary>查看这次改动的 {{len .P.Details}} 个提交</summary>
31 <ul class="commitlist">
32 {{range .P.Details}}
33 <li>
34 <a class="csha" href="/{{$.P.RepoName}}/commit/{{.SHA}}">{{short .SHA}}</a>
35 <span class="cmsg">{{.Subject}}</span>
36 <span class="cmeta">{{.Author}} · {{timeago (unix .When)}}</span>
37 <span class="cstat"><span class="add">+{{.Additions}}</span> <span class="del">-{{.Deletions}}</span></span>
38 </li>
39 {{end}}
40 </ul>
41 </details>
42 {{end}}
43</article>
44{{end}}
45
46{{define "repotabs"}}
47<nav class="repotabs">
48 <a class="{{if eq .Tab "code"}}on{{end}}" href="/{{.Repo.Name}}{{if .Ref}}?ref={{.Ref}}{{end}}">代码</a>
49 <a class="{{if eq .Tab "commits"}}on{{end}}" href="/{{.Repo.Name}}/commits/{{.Ref}}">提交 <span class="cnt">{{.CommitCount}}</span></a>
50 <a class="{{if eq .Tab "branches"}}on{{end}}" href="/{{.Repo.Name}}/branches">分支 <span class="cnt">{{.BranchCount}}</span></a>
51 <a class="{{if eq .Tab "activity"}}on{{end}}" href="/{{.Repo.Name}}/activity">动态</a>
52 {{if .CanManage}}<a class="{{if eq .Tab "settings"}}on{{end}}" href="/{{.Repo.Name}}/settings">设置</a>{{end}}
53</nav>
54{{end}}
55
56{{define "adminnav"}}
57<nav class="adminnav">
58 <a class="{{if eq .Tab "dash"}}on{{end}}" href="/admin">概览</a>
59 <a class="{{if eq .Tab "users"}}on{{end}}" href="/admin/users">用户</a>
60 <a class="{{if eq .Tab "repos"}}on{{end}}" href="/admin/repos">项目</a>
61 <a class="{{if eq .Tab "activity"}}on{{end}}" href="/admin/activity">操作动态</a>
62 <a class="{{if eq .Tab "ai"}}on{{end}}" href="/admin/ai">AI 接入</a>
63 <a class="{{if eq .Tab "settings"}}on{{end}}" href="/admin/settings">站点设置</a>
64 <a class="{{if eq .Tab "upgrade"}}on{{end}}" href="/admin/upgrade">升级</a>
65</nav>
66{{end}}
67
68{{define "layout.html"}}<!DOCTYPE html>
69<html lang="zh-CN">
70<head>
71<meta charset="utf-8">
72<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
73<meta name="color-scheme" content="light">
74<title>{{.Title}} · {{.SiteName}}</title>
75<link rel="icon" type="image/svg+xml" href="/static/favicon.svg">
76<link rel="stylesheet" href="/static/style.css">
77</head>
78<body>
79<div class="bg-deco" aria-hidden="true"></div>
80<header class="topbar">
81 <div class="wrap topbar-in">
82 <a class="brand" href="/">
83 <span class="brand-mark" aria-hidden="true">
84 <svg viewBox="0 0 24 24" width="20" height="20" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round">
85 <path d="M4 8.5 8 4l4 3 4-3 4 4.5"/><path d="M6 12h12v4.5a3.5 3.5 0 0 1-3.5 3.5h-5A3.5 3.5 0 0 1 6 16.5z"/>
86 <circle cx="10" cy="15" r="0.6" fill="currentColor" stroke="none"/><circle cx="14" cy="15" r="0.6" fill="currentColor" stroke="none"/>
87 <path d="M12 18.2c.7.7 1.6.7 2.3 0"/>
88 </svg>
89 </span>
90 <span class="brand-name">{{.SiteName}}</span>
91 </a>
92 <form class="navsearch" action="/" method="get" role="search">
93 <svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><circle cx="11" cy="11" r="7"/><path d="m20 20-3.6-3.6"/></svg>
94 <input type="search" name="q" placeholder="搜索项目…" value="{{if .Data}}{{if .Data.Query}}{{.Data.Query}}{{end}}{{end}}" aria-label="搜索项目">
95 </form>
96 <button class="navtoggle" type="button" aria-label="打开菜单" aria-expanded="false">
97 <span></span><span></span><span></span>
98 </button>
99 <nav class="navmenu">
100 <a class="navlink {{if eq .Active "home"}}on{{end}}" href="/">项目</a>
101 {{if .User}}
102 <a class="navlink {{if eq .Active "new"}}on{{end}}" href="/new">新建项目</a>
103 {{if .User.IsAdmin}}<a class="navlink {{if eq .Active "admin"}}on{{end}}" href="/admin">管理后台</a>{{end}}
104 {{end}}
105 <div class="navactions">
106 {{if .User}}
107 <div class="usermenu">
108 <button class="userbtn" type="button" aria-haspopup="true" aria-expanded="false">
109 {{template "av" (dict "U" .User "S" 28)}}
110 <span class="username">{{.User.Display}}</span>
111 <svg viewBox="0 0 24 24" width="13" height="13" fill="none" stroke="currentColor" stroke-width="2.2" aria-hidden="true"><path d="m6 9 6 6 6-6"/></svg>
112 </button>
113 <div class="usermenu-pop" role="menu">
114 <div class="um-head">
115 {{template "av" (dict "U" .User "S" 40)}}
116 <div><strong>{{.User.Display}}</strong><span class="muted">@{{.User.Username}}</span></div>
117 </div>
118 <a href="/settings" role="menuitem">账号设置</a>
119 {{if .User.IsAdmin}}<a href="/admin" role="menuitem">管理后台</a>{{end}}
120 <form method="post" action="/logout">
121 <input type="hidden" name="csrf" value="{{.CSRF}}">
122 <button type="submit" role="menuitem" class="danger">退出登录</button>
123 </form>
124 </div>
125 </div>
126 {{else}}
127 <a class="btn btn-primary" href="/login">登录</a>
128 {{end}}
129 </div>
130 </nav>
131 </div>
132</header>
133
134<main class="page">
135 <div class="wrap">
136 {{template "flash" .}}
137 {{template "content" .}}
138 </div>
139</main>
140
141<footer class="foot">
142 <div class="wrap foot-in">
143 <span><strong>{{.SiteName}}</strong> · 工作室自建 Git 服务</span>
144 <span class="muted">Powered by gitcat {{.Version}}</span>
145 </div>
146</footer>
147<script src="/static/app.js" defer></script>
148</body>
149</html>
150{{end}}