mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 08:30:25 +08:00 
			
		
		
		
	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:
		@@ -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
 | 
						src := user.RealSizedAvatarLink(size * 2) // request double size for finer rendering
 | 
				
			||||||
	if src != "" {
 | 
						if src != "" {
 | 
				
			||||||
		return avatarHTML(src, size, class, user.DisplayName())
 | 
							return avatarHTML(src, size, class, user.DisplayName())
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						return template.HTML("")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if repo, ok := item.(*models.Repository); ok {
 | 
					// 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()
 | 
						src := repo.RelAvatarLink()
 | 
				
			||||||
	if src != "" {
 | 
						if src != "" {
 | 
				
			||||||
		return avatarHTML(src, size, class, repo.FullName())
 | 
							return avatarHTML(src, size, class, repo.FullName())
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return template.HTML("")
 | 
						return template.HTML("")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,11 +1,16 @@
 | 
				
			|||||||
<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">
 | 
				
			||||||
 | 
										{{$avatar := (repoAvatar . 32 "mr-3")}}
 | 
				
			||||||
 | 
										{{if $avatar}}
 | 
				
			||||||
 | 
											{{$avatar}}
 | 
				
			||||||
 | 
										{{end}}
 | 
				
			||||||
					<a class="name" href="{{.Link}}">
 | 
										<a class="name" href="{{.Link}}">
 | 
				
			||||||
						{{if or $.PageIsExplore $.PageIsProfileStarList }}{{if .Owner}}{{.Owner.Name}} / {{end}}{{end}}{{.Name}}
 | 
											{{if or $.PageIsExplore $.PageIsProfileStarList }}{{if .Owner}}{{.Owner.Name}} / {{end}}{{end}}{{.Name}}
 | 
				
			||||||
					</a>
 | 
										</a>
 | 
				
			||||||
 | 
										<div class="labels df ac fw">
 | 
				
			||||||
						{{if .IsArchived}}
 | 
											{{if .IsArchived}}
 | 
				
			||||||
							<span class="ui basic label">{{$.i18n.Tr "repo.desc.archived"}}</span>
 | 
												<span class="ui basic label">{{$.i18n.Tr "repo.desc.archived"}}</span>
 | 
				
			||||||
						{{end}}
 | 
											{{end}}
 | 
				
			||||||
@@ -27,11 +32,13 @@
 | 
				
			|||||||
							{{end}}
 | 
												{{end}}
 | 
				
			||||||
						{{end}}
 | 
											{{end}}
 | 
				
			||||||
						{{if .IsFork}}
 | 
											{{if .IsFork}}
 | 
				
			||||||
					<span class="middle">{{svg "octicon-repo-forked"}}</span>
 | 
												{{svg "octicon-repo-forked"}}
 | 
				
			||||||
						{{else if .IsMirror}}
 | 
											{{else if .IsMirror}}
 | 
				
			||||||
					<span class="middle">{{svg "octicon-mirror"}}</span>
 | 
												{{svg "octicon-mirror"}}
 | 
				
			||||||
						{{end}}
 | 
											{{end}}
 | 
				
			||||||
				<div class="ui right metas">
 | 
										</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,15 +2,18 @@
 | 
				
			|||||||
{{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")}}
 | 
				
			||||||
 | 
										{{if $avatar}}
 | 
				
			||||||
 | 
											{{$avatar}}
 | 
				
			||||||
					{{else}}
 | 
										{{else}}
 | 
				
			||||||
					{{template "repo/header_icon" .}}
 | 
											{{template "repo/icon" .}}
 | 
				
			||||||
					{{end}}
 | 
										{{end}}
 | 
				
			||||||
					<a href="{{AppSubUrl}}/{{.Owner.Name}}">{{.Owner.Name}}</a>
 | 
										<a href="{{AppSubUrl}}/{{.Owner.Name}}">{{.Owner.Name}}</a>
 | 
				
			||||||
				<div class="divider"> / </div>
 | 
										<div class="mx-2">/</div>
 | 
				
			||||||
					<a href="{{$.RepoLink}}">{{.Name}}</a>
 | 
										<a href="{{$.RepoLink}}">{{.Name}}</a>
 | 
				
			||||||
 | 
										<div class="labels df ac fw">
 | 
				
			||||||
						{{if .IsTemplate}}
 | 
											{{if .IsTemplate}}
 | 
				
			||||||
							{{if .IsPrivate}}
 | 
												{{if .IsPrivate}}
 | 
				
			||||||
								<span class="ui basic label">{{$.i18n.Tr "repo.desc.private_template"}}</span>
 | 
													<span class="ui basic label">{{$.i18n.Tr "repo.desc.private_template"}}</span>
 | 
				
			||||||
@@ -31,6 +34,8 @@
 | 
				
			|||||||
						{{if .IsArchived}}
 | 
											{{if .IsArchived}}
 | 
				
			||||||
						  <span class="ui basic label">{{$.i18n.Tr "repo.desc.archived"}}</span>
 | 
											  <span class="ui basic label">{{$.i18n.Tr "repo.desc.archived"}}</span>
 | 
				
			||||||
						{{end}}
 | 
											{{end}}
 | 
				
			||||||
 | 
										</div>
 | 
				
			||||||
 | 
									</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 {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user