Repo avatar fixes (#13891)
- Split up avatar rendering helpers for performance - Fix showing repo SVG icon when no avatar is set - Make repo SVG and avatar same size at 32px - Fix fork line by adding vertical flexbox on repo title Co-authored-by: 6543 <6543@obermui.de> Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com>
This commit is contained in:
parent
9b22ada0a7
commit
e7938c9c44
7 changed files with 112 additions and 104 deletions
|
@ -341,6 +341,7 @@ func NewFuncMap() []template.FuncMap {
|
||||||
"svg": SVG,
|
"svg": SVG,
|
||||||
"avatar": Avatar,
|
"avatar": Avatar,
|
||||||
"avatarByEmail": AvatarByEmail,
|
"avatarByEmail": AvatarByEmail,
|
||||||
|
"repoAvatar": RepoAvatar,
|
||||||
"SortArrow": func(normSort, revSort, urlSort string, isDefault bool) template.HTML {
|
"SortArrow": func(normSort, revSort, urlSort string, isDefault bool) template.HTML {
|
||||||
// if needed
|
// if needed
|
||||||
if len(normSort) == 0 || len(urlSort) == 0 {
|
if len(normSort) == 0 || len(urlSort) == 0 {
|
||||||
|
@ -545,23 +546,25 @@ func SVG(icon string, others ...interface{}) template.HTML {
|
||||||
return template.HTML("")
|
return template.HTML("")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Avatar renders user and repo avatars. args: user/repo, size (int), class (string)
|
// Avatar renders user avatars. args: user, size (int), class (string)
|
||||||
func Avatar(item interface{}, others ...interface{}) template.HTML {
|
func Avatar(user *models.User, others ...interface{}) template.HTML {
|
||||||
size, class := parseOthers(28, "ui avatar image", others...)
|
size, class := parseOthers(28, "ui avatar image", others...)
|
||||||
if user, ok := item.(*models.User); ok {
|
|
||||||
src := user.RealSizedAvatarLink(size * 2) // request double size for finer rendering
|
|
||||||
if src != "" {
|
|
||||||
return avatarHTML(src, size, class, user.DisplayName())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if repo, ok := item.(*models.Repository); ok {
|
src := user.RealSizedAvatarLink(size * 2) // request double size for finer rendering
|
||||||
src := repo.RelAvatarLink()
|
if src != "" {
|
||||||
if src != "" {
|
return avatarHTML(src, size, class, user.DisplayName())
|
||||||
return avatarHTML(src, size, class, repo.FullName())
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
return template.HTML("")
|
||||||
|
}
|
||||||
|
|
||||||
|
// RepoAvatar renders repo avatars. args: repo, size(int), class (string)
|
||||||
|
func RepoAvatar(repo *models.Repository, others ...interface{}) template.HTML {
|
||||||
|
size, class := parseOthers(28, "ui avatar image", others...)
|
||||||
|
|
||||||
|
src := repo.RelAvatarLink()
|
||||||
|
if src != "" {
|
||||||
|
return avatarHTML(src, size, class, repo.FullName())
|
||||||
|
}
|
||||||
return template.HTML("")
|
return template.HTML("")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,37 +1,44 @@
|
||||||
<div class="ui repository list">
|
<div class="ui repository list">
|
||||||
{{range .Repos}}
|
{{range .Repos}}
|
||||||
<div class="item">
|
<div class="item">
|
||||||
<div class="ui header">
|
<div class="ui header df ac">
|
||||||
{{avatar .}}
|
<div class="repo-title">
|
||||||
<a class="name" href="{{.Link}}">
|
{{$avatar := (repoAvatar . 32 "mr-3")}}
|
||||||
{{if or $.PageIsExplore $.PageIsProfileStarList }}{{if .Owner}}{{.Owner.Name}} / {{end}}{{end}}{{.Name}}
|
{{if $avatar}}
|
||||||
</a>
|
{{$avatar}}
|
||||||
{{if .IsArchived}}
|
|
||||||
<span class="ui basic label">{{$.i18n.Tr "repo.desc.archived"}}</span>
|
|
||||||
{{end}}
|
|
||||||
{{if .IsTemplate}}
|
|
||||||
{{if .IsPrivate}}
|
|
||||||
<span class="ui basic label">{{$.i18n.Tr "repo.desc.private_template"}}</span>
|
|
||||||
{{else}}
|
|
||||||
{{if .Owner.Visibility.IsPrivate}}
|
|
||||||
<span class="ui basic label">{{$.i18n.Tr "repo.desc.internal_template"}}</span>
|
|
||||||
{{end}}
|
|
||||||
{{end}}
|
{{end}}
|
||||||
{{else}}
|
<a class="name" href="{{.Link}}">
|
||||||
{{if .IsPrivate}}
|
{{if or $.PageIsExplore $.PageIsProfileStarList }}{{if .Owner}}{{.Owner.Name}} / {{end}}{{end}}{{.Name}}
|
||||||
<span class="ui basic label">{{$.i18n.Tr "repo.desc.private"}}</span>
|
</a>
|
||||||
{{else}}
|
<div class="labels df ac fw">
|
||||||
{{if .Owner.Visibility.IsPrivate}}
|
{{if .IsArchived}}
|
||||||
<span class="ui basic label">{{$.i18n.Tr "repo.desc.internal"}}</span>
|
<span class="ui basic label">{{$.i18n.Tr "repo.desc.archived"}}</span>
|
||||||
{{end}}
|
{{end}}
|
||||||
{{end}}
|
{{if .IsTemplate}}
|
||||||
{{end}}
|
{{if .IsPrivate}}
|
||||||
{{if .IsFork}}
|
<span class="ui basic label">{{$.i18n.Tr "repo.desc.private_template"}}</span>
|
||||||
<span class="middle">{{svg "octicon-repo-forked"}}</span>
|
{{else}}
|
||||||
{{else if .IsMirror}}
|
{{if .Owner.Visibility.IsPrivate}}
|
||||||
<span class="middle">{{svg "octicon-mirror"}}</span>
|
<span class="ui basic label">{{$.i18n.Tr "repo.desc.internal_template"}}</span>
|
||||||
{{end}}
|
{{end}}
|
||||||
<div class="ui right metas">
|
{{end}}
|
||||||
|
{{else}}
|
||||||
|
{{if .IsPrivate}}
|
||||||
|
<span class="ui basic label">{{$.i18n.Tr "repo.desc.private"}}</span>
|
||||||
|
{{else}}
|
||||||
|
{{if .Owner.Visibility.IsPrivate}}
|
||||||
|
<span class="ui basic label">{{$.i18n.Tr "repo.desc.internal"}}</span>
|
||||||
|
{{end}}
|
||||||
|
{{end}}
|
||||||
|
{{end}}
|
||||||
|
{{if .IsFork}}
|
||||||
|
{{svg "octicon-repo-forked"}}
|
||||||
|
{{else if .IsMirror}}
|
||||||
|
{{svg "octicon-mirror"}}
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="metas">
|
||||||
{{if .PrimaryLanguage }}
|
{{if .PrimaryLanguage }}
|
||||||
<span class="text grey"><i class="color-icon" style="background-color: {{.PrimaryLanguage.Color}}"></i>{{ .PrimaryLanguage.Language }}</span>
|
<span class="text grey"><i class="color-icon" style="background-color: {{.PrimaryLanguage.Color}}"></i>{{ .PrimaryLanguage.Language }}</span>
|
||||||
{{end}}
|
{{end}}
|
||||||
|
|
|
@ -2,35 +2,40 @@
|
||||||
{{with .Repository}}
|
{{with .Repository}}
|
||||||
<div class="ui container">
|
<div class="ui container">
|
||||||
<div class="repo-header">
|
<div class="repo-header">
|
||||||
<div class="ui huge breadcrumb repo-title">
|
<div class="repo-title-wrap df fc">
|
||||||
{{if .Name}}
|
<div class="repo-title">
|
||||||
{{avatar .}}
|
{{$avatar := (repoAvatar . 32 "mr-3")}}
|
||||||
{{else}}
|
{{if $avatar}}
|
||||||
{{template "repo/header_icon" .}}
|
{{$avatar}}
|
||||||
{{end}}
|
|
||||||
<a href="{{AppSubUrl}}/{{.Owner.Name}}">{{.Owner.Name}}</a>
|
|
||||||
<div class="divider"> / </div>
|
|
||||||
<a href="{{$.RepoLink}}">{{.Name}}</a>
|
|
||||||
{{if .IsTemplate}}
|
|
||||||
{{if .IsPrivate}}
|
|
||||||
<span class="ui basic label">{{$.i18n.Tr "repo.desc.private_template"}}</span>
|
|
||||||
{{else}}
|
{{else}}
|
||||||
{{if .Owner.Visibility.IsPrivate}}
|
{{template "repo/icon" .}}
|
||||||
<span class="ui basic label">{{$.i18n.Tr "repo.desc.internal_template"}}</span>
|
|
||||||
{{end}}
|
|
||||||
{{end}}
|
{{end}}
|
||||||
{{else}}
|
<a href="{{AppSubUrl}}/{{.Owner.Name}}">{{.Owner.Name}}</a>
|
||||||
{{if .IsPrivate}}
|
<div class="mx-2">/</div>
|
||||||
<span class="ui basic label">{{$.i18n.Tr "repo.desc.private"}}</span>
|
<a href="{{$.RepoLink}}">{{.Name}}</a>
|
||||||
{{else}}
|
<div class="labels df ac fw">
|
||||||
{{if .Owner.Visibility.IsPrivate}}
|
{{if .IsTemplate}}
|
||||||
<span class="ui basic label">{{$.i18n.Tr "repo.desc.internal"}}</span>
|
{{if .IsPrivate}}
|
||||||
|
<span class="ui basic label">{{$.i18n.Tr "repo.desc.private_template"}}</span>
|
||||||
|
{{else}}
|
||||||
|
{{if .Owner.Visibility.IsPrivate}}
|
||||||
|
<span class="ui basic label">{{$.i18n.Tr "repo.desc.internal_template"}}</span>
|
||||||
|
{{end}}
|
||||||
|
{{end}}
|
||||||
|
{{else}}
|
||||||
|
{{if .IsPrivate}}
|
||||||
|
<span class="ui basic label">{{$.i18n.Tr "repo.desc.private"}}</span>
|
||||||
|
{{else}}
|
||||||
|
{{if .Owner.Visibility.IsPrivate}}
|
||||||
|
<span class="ui basic label">{{$.i18n.Tr "repo.desc.internal"}}</span>
|
||||||
|
{{end}}
|
||||||
|
{{end}}
|
||||||
{{end}}
|
{{end}}
|
||||||
{{end}}
|
{{if .IsArchived}}
|
||||||
{{end}}
|
<span class="ui basic label">{{$.i18n.Tr "repo.desc.archived"}}</span>
|
||||||
{{if .IsArchived}}
|
{{end}}
|
||||||
<span class="ui basic label">{{$.i18n.Tr "repo.desc.archived"}}</span>
|
</div>
|
||||||
{{end}}
|
</div>
|
||||||
{{if .IsMirror}}<div class="fork-flag">{{$.i18n.Tr "repo.mirror_from"}} <a target="_blank" rel="noopener noreferrer" href="{{if .SanitizedOriginalURL}}{{.SanitizedOriginalURL}}{{else}}{{MirrorAddress $.Mirror}}{{end}}">{{if .SanitizedOriginalURL}}{{.SanitizedOriginalURL}}{{else}}{{MirrorAddress $.Mirror}}{{end}}</a></div>{{end}}
|
{{if .IsMirror}}<div class="fork-flag">{{$.i18n.Tr "repo.mirror_from"}} <a target="_blank" rel="noopener noreferrer" href="{{if .SanitizedOriginalURL}}{{.SanitizedOriginalURL}}{{else}}{{MirrorAddress $.Mirror}}{{end}}">{{if .SanitizedOriginalURL}}{{.SanitizedOriginalURL}}{{else}}{{MirrorAddress $.Mirror}}{{end}}</a></div>{{end}}
|
||||||
{{if .IsFork}}<div class="fork-flag">{{$.i18n.Tr "repo.forked_from"}} <a href="{{.BaseRepo.Link}}">{{SubStr .BaseRepo.RelLink 1 -1}}</a></div>{{end}}
|
{{if .IsFork}}<div class="fork-flag">{{$.i18n.Tr "repo.forked_from"}} <a href="{{.BaseRepo.Link}}">{{SubStr .BaseRepo.RelLink 1 -1}}</a></div>{{end}}
|
||||||
{{if .IsGenerated}}<div class="fork-flag">{{$.i18n.Tr "repo.generated_from"}} <a href="{{.TemplateRepo.Link}}">{{SubStr .TemplateRepo.RelLink 1 -1}}</a></div>{{end}}
|
{{if .IsGenerated}}<div class="fork-flag">{{$.i18n.Tr "repo.generated_from"}} <a href="{{.TemplateRepo.Link}}">{{SubStr .TemplateRepo.RelLink 1 -1}}</a></div>{{end}}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<div class="repo-header-icon">
|
<div class="repo-icon mr-3">
|
||||||
{{if $.IsTemplate}}
|
{{if $.IsTemplate}}
|
||||||
{{svg "octicon-repo-template" 32}}
|
{{svg "octicon-repo-template" 32}}
|
||||||
{{else}}
|
{{else}}
|
|
@ -1247,6 +1247,32 @@ footer {
|
||||||
margin-bottom: 2px !important;
|
margin-bottom: 2px !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.repo-title {
|
||||||
|
font-size: 1.5rem;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
flex: 1;
|
||||||
|
word-break: break-all;
|
||||||
|
color: var(--color-text-light);
|
||||||
|
|
||||||
|
.avatar {
|
||||||
|
width: 32px !important;
|
||||||
|
height: 32px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.labels {
|
||||||
|
margin-left: .5rem;
|
||||||
|
|
||||||
|
> * + * {
|
||||||
|
margin-left: .5rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.repo-icon {
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
.activity-bar-graph {
|
.activity-bar-graph {
|
||||||
background-color: var(--color-primary);
|
background-color: var(--color-primary);
|
||||||
color: #fff;
|
color: #fff;
|
||||||
|
|
|
@ -49,11 +49,6 @@
|
||||||
.ui.tags {
|
.ui.tags {
|
||||||
margin-bottom: 1em;
|
margin-bottom: 1em;
|
||||||
}
|
}
|
||||||
|
|
||||||
.ui.avatar.image {
|
|
||||||
width: 24px;
|
|
||||||
height: 24px;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -8,38 +8,9 @@
|
||||||
margin-top: 0;
|
margin-top: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.ui.huge.breadcrumb {
|
|
||||||
font-weight: 400;
|
|
||||||
font-size: 1.5rem;
|
|
||||||
|
|
||||||
.label {
|
|
||||||
vertical-align: middle;
|
|
||||||
margin-top: -.29165em;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.repo-title .repo-header-icon {
|
|
||||||
display: inline-block;
|
|
||||||
position: relative;
|
|
||||||
|
|
||||||
.avatar {
|
|
||||||
position: absolute;
|
|
||||||
right: 0;
|
|
||||||
bottom: 0;
|
|
||||||
width: 16px;
|
|
||||||
height: 16px;
|
|
||||||
color: #fafafa;
|
|
||||||
box-shadow: 0 0 0 2px;
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.fork-flag {
|
.fork-flag {
|
||||||
margin-left: 36px;
|
|
||||||
margin-top: 3px;
|
|
||||||
display: block;
|
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
white-space: nowrap;
|
margin-top: 2px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.repo-buttons .svg {
|
.repo-buttons .svg {
|
||||||
|
@ -2985,6 +2956,7 @@ tbody.commit-list {
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
|
word-break: break-all;
|
||||||
}
|
}
|
||||||
|
|
||||||
.repo-header .repo-buttons {
|
.repo-header .repo-buttons {
|
||||||
|
|
Loading…
Reference in a new issue