mirror of https://github.com/gogits/gogs.git
Browse Source
With the usage of a port of github's linguist functionality to Go, which I have made as a separate library and is hosted here: https://github.com/generaltso/linguist And a quick design I made, I have hacked a language statistics bar into gogs I wasn't sure where to put everything so it's sitting directly on the view router and the CSS is inlined into a new template file Based on the structure of this project I would fully expect this feature to belong in its own sub-package Also, even though determining language stats on-the-fly is pretty fast, caching the results in the database for large codebases would probably be a much better strategy, especially if the top language were to be displayed in the "Explore" view like GitHub has I also had difficulty trying to figure out how to do: if len(something) == 1 ? '' : 's' with go templates for plurals (1 Commit vs 2 Commits), and I kinda gave up there...pull/2134/head
tso
9 years ago
3 changed files with 344 additions and 0 deletions
@ -0,0 +1,168 @@ |
|||||||
|
<div class="statistics"> |
||||||
|
<div class="statistics-box"> |
||||||
|
<div class="statistics-box__toppanel statistics-box__repo"> |
||||||
|
<ul class="statistics-nav"> |
||||||
|
<li class="statistics-nav__item"> |
||||||
|
<i class="octicon octicon-history"></i> |
||||||
|
<a href="{{.RepoLink}}/commits/{{EscapePound .BranchName}}">{{.CommitsCount}} Commit(s)</a> |
||||||
|
</li> |
||||||
|
<li class="statistics-nav__item"> |
||||||
|
<i class="octicon octicon-git-branch"></i> |
||||||
|
{{len .Branches}} Branch(es) |
||||||
|
</li> |
||||||
|
<li class="statistics-nav__item"> |
||||||
|
<i class="octicon octicon-tag"></i> |
||||||
|
<a href="{{.RepoLink}}/releases">{{.Repository.NumTags}} Release(s)</a> |
||||||
|
</li> |
||||||
|
<li class="statistics-nav__item"> |
||||||
|
<i class="octicon octicon-organization"></i> |
||||||
|
1337 Contributors |
||||||
|
</li> |
||||||
|
</ul> |
||||||
|
<div class="statistics-box__bottompanel statistics-box__lang"> |
||||||
|
<ul class="statistics-nav"> |
||||||
|
{{range $Lang := .LanguageStats}} |
||||||
|
<li class="statistics-nav__item" |
||||||
|
style="color:{{$Lang.Color}}" |
||||||
|
data-percent="{{$Lang.Percent}}"> |
||||||
|
<a href="#">{{$Lang.Name}}</a> |
||||||
|
</li> |
||||||
|
{{end}} |
||||||
|
</ul> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<!-- |
||||||
|
would prefer not to use inline styles for this |
||||||
|
in favor of data-* attributes + attr() in css |
||||||
|
however browsers do not support this yet |
||||||
|
and JavaScript cannot target ::before, ::after |
||||||
|
--> |
||||||
|
<div class="statistics-underbar" |
||||||
|
title="Language Statistics" |
||||||
|
onclick="document.querySelector('.statistics-box').classList.toggle('statistics-box__focusstate')"> |
||||||
|
{{range $Lang := .LanguageStats}} |
||||||
|
<span style="color:{{$Lang.Color}};flex-basis:{{$Lang.Percent}}">{{$Lang.Name}}</span> |
||||||
|
{{end}} |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<style> |
||||||
|
.statistics { |
||||||
|
position: relative; |
||||||
|
height: 2.6667em; |
||||||
|
border: 1px solid #dedede; |
||||||
|
border-radius: 5px; |
||||||
|
background: #fff; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 3D box effect technique |
||||||
|
* |
||||||
|
* http://codepen.io/rachsmith/pen/cojza |
||||||
|
*/ |
||||||
|
.statistics-box { |
||||||
|
perspective: 1000px; |
||||||
|
overflow: hidden; |
||||||
|
border-radius: 5px 5px 0 0; |
||||||
|
padding: 0 1.5em; |
||||||
|
} |
||||||
|
.statistics-box__toppanel, .statistics-box__bottompanel { |
||||||
|
transform-origin: 50% 0; |
||||||
|
transition-delay: 125ms; |
||||||
|
|
||||||
|
/** |
||||||
|
* this timing function from |
||||||
|
* http://codepen.io/sbchewitt/pen/KpPZMx |
||||||
|
*/ |
||||||
|
transition: all 0.5s cubic-bezier(.57,-0.42,.46,1.4); |
||||||
|
} |
||||||
|
.statistics-box__toppanel { |
||||||
|
position: relative; |
||||||
|
transform-style: preserve-3d; |
||||||
|
background: #fff; |
||||||
|
} |
||||||
|
.statistics-box__bottompanel { |
||||||
|
transform: rotateX(-90deg) translateZ(0); |
||||||
|
position: absolute; |
||||||
|
width: 100%; |
||||||
|
height: 100%; |
||||||
|
left: 0; |
||||||
|
top: 100%; |
||||||
|
background: #999; |
||||||
|
} |
||||||
|
|
||||||
|
.statistics-box__focusstate .statistics-box__toppanel { |
||||||
|
transform: rotateX(90deg) translateY(-22px); |
||||||
|
transition-delay: 0s; |
||||||
|
} |
||||||
|
.statistics-box__focusstate .statistics-box__bottompanel { |
||||||
|
background: #fff; |
||||||
|
transition-delay: 0s; |
||||||
|
} |
||||||
|
|
||||||
|
/*ul*/.statistics-nav { |
||||||
|
list-style: none; |
||||||
|
margin: 0; |
||||||
|
padding: 0; |
||||||
|
display: flex; |
||||||
|
justify-content: space-around; |
||||||
|
padding: 0.5em; |
||||||
|
} |
||||||
|
/*li*/.statistics-nav__item { |
||||||
|
flex: 0 1 auto; |
||||||
|
} |
||||||
|
/*li*/.statistics-nav__item a { |
||||||
|
color: #222; |
||||||
|
text-decoration: none; |
||||||
|
} |
||||||
|
.statistics-box__repo /*li*/.statistics-nav__item:hover a { |
||||||
|
color: #4183c4; |
||||||
|
} |
||||||
|
.statistics-box__lang /*li*/.statistics-nav__item::before { |
||||||
|
background-color: currentColor; |
||||||
|
content: ''; |
||||||
|
display: inline-block; |
||||||
|
width: 0.75em; |
||||||
|
height: 0.75em; |
||||||
|
border-radius: 50%; |
||||||
|
vertical-align: middle; |
||||||
|
margin: 0 0.25em 2px 0; |
||||||
|
cursor: pointer; |
||||||
|
} |
||||||
|
/*li*/.statistics-nav__item::after { |
||||||
|
content: attr(data-percent); |
||||||
|
margin-left: 0.5em; |
||||||
|
color: #555; |
||||||
|
} |
||||||
|
|
||||||
|
.statistics-underbar { |
||||||
|
position: absolute; |
||||||
|
left: 0; |
||||||
|
bottom: 0; |
||||||
|
padding-top: 5px; |
||||||
|
height: 8px; |
||||||
|
width: 100%; |
||||||
|
bottom: 0; |
||||||
|
display: flex; |
||||||
|
cursor: pointer; |
||||||
|
border-radius: 0 0 5px 5px; |
||||||
|
overflow: hidden; |
||||||
|
opacity: 0.6; |
||||||
|
transition: all 0.5s cubic-bezier(.57,-0.42,.46,1.4); |
||||||
|
} |
||||||
|
.statistics-box__focusstate ~ .statistics-underbar, |
||||||
|
.statistics-underbar:hover { |
||||||
|
opacity: 1; |
||||||
|
padding: 0; |
||||||
|
padding-top: 3px; |
||||||
|
} |
||||||
|
.statistics-underbar:hover { |
||||||
|
opacity: 0.8; |
||||||
|
} |
||||||
|
.statistics-underbar span { |
||||||
|
font-size: 0; |
||||||
|
background-color: currentColor; |
||||||
|
} |
||||||
|
</style> |
Loading…
Reference in new issue