Update myShaarli theme

This commit is contained in:
Knah Tsaeb 2018-01-04 14:47:54 +01:00
parent 8ead0f9219
commit aa228207a0
46 changed files with 9910 additions and 127 deletions

16
tpl/myShaarli/404.html Normal file
View File

@ -0,0 +1,16 @@
<!DOCTYPE html>
<html>
<head>
{include="includes"}
</head>
<body>
<div id="pageheader">
{include="page.header"}
<div class="center" id="page404">
<h2>{'Sorry, nothing to see here.'|t}</h2>
<img src="img/sad_star.png">
<p>{$error_message}</p>
</div>
{include="page.footer"}
</body>
</html>

View File

@ -32,7 +32,7 @@
</div>
</form>
<p>{'You can also edit tags in the'|t} <a href="?do=taglist&sort=usage">{'tag list'|t}</a>.</p>
<p>You can also edit tags in the <a href="?do=taglist&sort=usage">tag list</a>.</p>
</div>
</div>
{include="page.footer"}

View File

@ -69,30 +69,6 @@
</div>
</div>
</div>
<div class="pure-g">
<div class="pure-u-lg-{$ratioLabel} pure-u-1">
<div class="form-label">
<label for="language">
<span class="label-name">{'Language'|t}</span>
</label>
</div>
</div>
<div class="pure-u-lg-{$ratioInput} pure-u-1">
<div class="form-input">
<select name="language" id="language" class="align">
{loop="$languages"}
<option value="{$key}"
{if="$key===$language"}
selected="selected"
{/if}
>
{$value}
</option>
{/loop}
</select>
</div>
</div>
</div>
<div class="pure-g">
<div class="pure-u-lg-{$ratioLabel} pure-u-1 ">
<div class="form-label">
@ -129,6 +105,21 @@
</div>
</div>
</div>
<div class="pure-g">
<div class="pure-u-lg-{$ratioLabel} pure-u-1 ">
<div class="form-label">
<label for="redirector">
<span class="label-name">{'Redirector'|t}</span><br>
<span class="label-desc">{'e. g.'|t} <i>http://anonym.to/?</i> {'will mask the HTTP_REFERER'|t}</span>
</label>
</div>
</div>
<div class="pure-u-lg-{$ratioInput} pure-u-1 ">
<div class="form-input">
<input type="text" name="redirector" id="redirector" size="50" value="{$redirector}">
</div>
</div>
</div>
<div class="clear"></div>
<div class="pure-g">
<div class="pure-u-lg-{$ratioLabel} pure-u-{$ratioLabelMobile} ">

2086
tpl/myShaarli/css/font-awesome.css vendored Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,861 @@
/*!
Pure v0.6.0
Copyright 2014 Yahoo! Inc. All rights reserved.
Licensed under the BSD License.
https://github.com/yahoo/pure/blob/master/LICENSE.md
*/
@media screen and (min-width: 35.5em) {
.pure-u-sm-1,
.pure-u-sm-1-1,
.pure-u-sm-1-2,
.pure-u-sm-1-3,
.pure-u-sm-2-3,
.pure-u-sm-1-4,
.pure-u-sm-3-4,
.pure-u-sm-1-5,
.pure-u-sm-2-5,
.pure-u-sm-3-5,
.pure-u-sm-4-5,
.pure-u-sm-5-5,
.pure-u-sm-1-6,
.pure-u-sm-5-6,
.pure-u-sm-1-8,
.pure-u-sm-3-8,
.pure-u-sm-5-8,
.pure-u-sm-7-8,
.pure-u-sm-1-12,
.pure-u-sm-5-12,
.pure-u-sm-7-12,
.pure-u-sm-11-12,
.pure-u-sm-1-24,
.pure-u-sm-2-24,
.pure-u-sm-3-24,
.pure-u-sm-4-24,
.pure-u-sm-5-24,
.pure-u-sm-6-24,
.pure-u-sm-7-24,
.pure-u-sm-8-24,
.pure-u-sm-9-24,
.pure-u-sm-10-24,
.pure-u-sm-11-24,
.pure-u-sm-12-24,
.pure-u-sm-13-24,
.pure-u-sm-14-24,
.pure-u-sm-15-24,
.pure-u-sm-16-24,
.pure-u-sm-17-24,
.pure-u-sm-18-24,
.pure-u-sm-19-24,
.pure-u-sm-20-24,
.pure-u-sm-21-24,
.pure-u-sm-22-24,
.pure-u-sm-23-24,
.pure-u-sm-24-24 {
display: inline-block;
*display: inline;
zoom: 1;
letter-spacing: normal;
word-spacing: normal;
vertical-align: top;
text-rendering: auto;
}
.pure-u-sm-1-24 {
width: 4.1667%;
*width: 4.1357%;
}
.pure-u-sm-1-12,
.pure-u-sm-2-24 {
width: 8.3333%;
*width: 8.3023%;
}
.pure-u-sm-1-8,
.pure-u-sm-3-24 {
width: 12.5000%;
*width: 12.4690%;
}
.pure-u-sm-1-6,
.pure-u-sm-4-24 {
width: 16.6667%;
*width: 16.6357%;
}
.pure-u-sm-1-5 {
width: 20%;
*width: 19.9690%;
}
.pure-u-sm-5-24 {
width: 20.8333%;
*width: 20.8023%;
}
.pure-u-sm-1-4,
.pure-u-sm-6-24 {
width: 25%;
*width: 24.9690%;
}
.pure-u-sm-7-24 {
width: 29.1667%;
*width: 29.1357%;
}
.pure-u-sm-1-3,
.pure-u-sm-8-24 {
width: 33.3333%;
*width: 33.3023%;
}
.pure-u-sm-3-8,
.pure-u-sm-9-24 {
width: 37.5000%;
*width: 37.4690%;
}
.pure-u-sm-2-5 {
width: 40%;
*width: 39.9690%;
}
.pure-u-sm-5-12,
.pure-u-sm-10-24 {
width: 41.6667%;
*width: 41.6357%;
}
.pure-u-sm-11-24 {
width: 45.8333%;
*width: 45.8023%;
}
.pure-u-sm-1-2,
.pure-u-sm-12-24 {
width: 50%;
*width: 49.9690%;
}
.pure-u-sm-13-24 {
width: 54.1667%;
*width: 54.1357%;
}
.pure-u-sm-7-12,
.pure-u-sm-14-24 {
width: 58.3333%;
*width: 58.3023%;
}
.pure-u-sm-3-5 {
width: 60%;
*width: 59.9690%;
}
.pure-u-sm-5-8,
.pure-u-sm-15-24 {
width: 62.5000%;
*width: 62.4690%;
}
.pure-u-sm-2-3,
.pure-u-sm-16-24 {
width: 66.6667%;
*width: 66.6357%;
}
.pure-u-sm-17-24 {
width: 70.8333%;
*width: 70.8023%;
}
.pure-u-sm-3-4,
.pure-u-sm-18-24 {
width: 75%;
*width: 74.9690%;
}
.pure-u-sm-19-24 {
width: 79.1667%;
*width: 79.1357%;
}
.pure-u-sm-4-5 {
width: 80%;
*width: 79.9690%;
}
.pure-u-sm-5-6,
.pure-u-sm-20-24 {
width: 83.3333%;
*width: 83.3023%;
}
.pure-u-sm-7-8,
.pure-u-sm-21-24 {
width: 87.5000%;
*width: 87.4690%;
}
.pure-u-sm-11-12,
.pure-u-sm-22-24 {
width: 91.6667%;
*width: 91.6357%;
}
.pure-u-sm-23-24 {
width: 95.8333%;
*width: 95.8023%;
}
.pure-u-sm-1,
.pure-u-sm-1-1,
.pure-u-sm-5-5,
.pure-u-sm-24-24 {
width: 100%;
}
}
@media screen and (min-width: 48em) {
.pure-u-md-1,
.pure-u-md-1-1,
.pure-u-md-1-2,
.pure-u-md-1-3,
.pure-u-md-2-3,
.pure-u-md-1-4,
.pure-u-md-3-4,
.pure-u-md-1-5,
.pure-u-md-2-5,
.pure-u-md-3-5,
.pure-u-md-4-5,
.pure-u-md-5-5,
.pure-u-md-1-6,
.pure-u-md-5-6,
.pure-u-md-1-8,
.pure-u-md-3-8,
.pure-u-md-5-8,
.pure-u-md-7-8,
.pure-u-md-1-12,
.pure-u-md-5-12,
.pure-u-md-7-12,
.pure-u-md-11-12,
.pure-u-md-1-24,
.pure-u-md-2-24,
.pure-u-md-3-24,
.pure-u-md-4-24,
.pure-u-md-5-24,
.pure-u-md-6-24,
.pure-u-md-7-24,
.pure-u-md-8-24,
.pure-u-md-9-24,
.pure-u-md-10-24,
.pure-u-md-11-24,
.pure-u-md-12-24,
.pure-u-md-13-24,
.pure-u-md-14-24,
.pure-u-md-15-24,
.pure-u-md-16-24,
.pure-u-md-17-24,
.pure-u-md-18-24,
.pure-u-md-19-24,
.pure-u-md-20-24,
.pure-u-md-21-24,
.pure-u-md-22-24,
.pure-u-md-23-24,
.pure-u-md-24-24 {
display: inline-block;
*display: inline;
zoom: 1;
letter-spacing: normal;
word-spacing: normal;
vertical-align: top;
text-rendering: auto;
}
.pure-u-md-1-24 {
width: 4.1667%;
*width: 4.1357%;
}
.pure-u-md-1-12,
.pure-u-md-2-24 {
width: 8.3333%;
*width: 8.3023%;
}
.pure-u-md-1-8,
.pure-u-md-3-24 {
width: 12.5000%;
*width: 12.4690%;
}
.pure-u-md-1-6,
.pure-u-md-4-24 {
width: 16.6667%;
*width: 16.6357%;
}
.pure-u-md-1-5 {
width: 20%;
*width: 19.9690%;
}
.pure-u-md-5-24 {
width: 20.8333%;
*width: 20.8023%;
}
.pure-u-md-1-4,
.pure-u-md-6-24 {
width: 25%;
*width: 24.9690%;
}
.pure-u-md-7-24 {
width: 29.1667%;
*width: 29.1357%;
}
.pure-u-md-1-3,
.pure-u-md-8-24 {
width: 33.3333%;
*width: 33.3023%;
}
.pure-u-md-3-8,
.pure-u-md-9-24 {
width: 37.5000%;
*width: 37.4690%;
}
.pure-u-md-2-5 {
width: 40%;
*width: 39.9690%;
}
.pure-u-md-5-12,
.pure-u-md-10-24 {
width: 41.6667%;
*width: 41.6357%;
}
.pure-u-md-11-24 {
width: 45.8333%;
*width: 45.8023%;
}
.pure-u-md-1-2,
.pure-u-md-12-24 {
width: 50%;
*width: 49.9690%;
}
.pure-u-md-13-24 {
width: 54.1667%;
*width: 54.1357%;
}
.pure-u-md-7-12,
.pure-u-md-14-24 {
width: 58.3333%;
*width: 58.3023%;
}
.pure-u-md-3-5 {
width: 60%;
*width: 59.9690%;
}
.pure-u-md-5-8,
.pure-u-md-15-24 {
width: 62.5000%;
*width: 62.4690%;
}
.pure-u-md-2-3,
.pure-u-md-16-24 {
width: 66.6667%;
*width: 66.6357%;
}
.pure-u-md-17-24 {
width: 70.8333%;
*width: 70.8023%;
}
.pure-u-md-3-4,
.pure-u-md-18-24 {
width: 75%;
*width: 74.9690%;
}
.pure-u-md-19-24 {
width: 79.1667%;
*width: 79.1357%;
}
.pure-u-md-4-5 {
width: 80%;
*width: 79.9690%;
}
.pure-u-md-5-6,
.pure-u-md-20-24 {
width: 83.3333%;
*width: 83.3023%;
}
.pure-u-md-7-8,
.pure-u-md-21-24 {
width: 87.5000%;
*width: 87.4690%;
}
.pure-u-md-11-12,
.pure-u-md-22-24 {
width: 91.6667%;
*width: 91.6357%;
}
.pure-u-md-23-24 {
width: 95.8333%;
*width: 95.8023%;
}
.pure-u-md-1,
.pure-u-md-1-1,
.pure-u-md-5-5,
.pure-u-md-24-24 {
width: 100%;
}
}
@media screen and (min-width: 64em) {
.pure-u-lg-1,
.pure-u-lg-1-1,
.pure-u-lg-1-2,
.pure-u-lg-1-3,
.pure-u-lg-2-3,
.pure-u-lg-1-4,
.pure-u-lg-3-4,
.pure-u-lg-1-5,
.pure-u-lg-2-5,
.pure-u-lg-3-5,
.pure-u-lg-4-5,
.pure-u-lg-5-5,
.pure-u-lg-1-6,
.pure-u-lg-5-6,
.pure-u-lg-1-8,
.pure-u-lg-3-8,
.pure-u-lg-5-8,
.pure-u-lg-7-8,
.pure-u-lg-1-12,
.pure-u-lg-5-12,
.pure-u-lg-7-12,
.pure-u-lg-11-12,
.pure-u-lg-1-24,
.pure-u-lg-2-24,
.pure-u-lg-3-24,
.pure-u-lg-4-24,
.pure-u-lg-5-24,
.pure-u-lg-6-24,
.pure-u-lg-7-24,
.pure-u-lg-8-24,
.pure-u-lg-9-24,
.pure-u-lg-10-24,
.pure-u-lg-11-24,
.pure-u-lg-12-24,
.pure-u-lg-13-24,
.pure-u-lg-14-24,
.pure-u-lg-15-24,
.pure-u-lg-16-24,
.pure-u-lg-17-24,
.pure-u-lg-18-24,
.pure-u-lg-19-24,
.pure-u-lg-20-24,
.pure-u-lg-21-24,
.pure-u-lg-22-24,
.pure-u-lg-23-24,
.pure-u-lg-24-24 {
display: inline-block;
*display: inline;
zoom: 1;
letter-spacing: normal;
word-spacing: normal;
vertical-align: top;
text-rendering: auto;
}
.pure-u-lg-1-24 {
width: 4.1667%;
*width: 4.1357%;
}
.pure-u-lg-1-12,
.pure-u-lg-2-24 {
width: 8.3333%;
*width: 8.3023%;
}
.pure-u-lg-1-8,
.pure-u-lg-3-24 {
width: 12.5000%;
*width: 12.4690%;
}
.pure-u-lg-1-6,
.pure-u-lg-4-24 {
width: 16.6667%;
*width: 16.6357%;
}
.pure-u-lg-1-5 {
width: 20%;
*width: 19.9690%;
}
.pure-u-lg-5-24 {
width: 20.8333%;
*width: 20.8023%;
}
.pure-u-lg-1-4,
.pure-u-lg-6-24 {
width: 25%;
*width: 24.9690%;
}
.pure-u-lg-7-24 {
width: 29.1667%;
*width: 29.1357%;
}
.pure-u-lg-1-3,
.pure-u-lg-8-24 {
width: 33.3333%;
*width: 33.3023%;
}
.pure-u-lg-3-8,
.pure-u-lg-9-24 {
width: 37.5000%;
*width: 37.4690%;
}
.pure-u-lg-2-5 {
width: 40%;
*width: 39.9690%;
}
.pure-u-lg-5-12,
.pure-u-lg-10-24 {
width: 41.6667%;
*width: 41.6357%;
}
.pure-u-lg-11-24 {
width: 45.8333%;
*width: 45.8023%;
}
.pure-u-lg-1-2,
.pure-u-lg-12-24 {
width: 50%;
*width: 49.9690%;
}
.pure-u-lg-13-24 {
width: 54.1667%;
*width: 54.1357%;
}
.pure-u-lg-7-12,
.pure-u-lg-14-24 {
width: 58.3333%;
*width: 58.3023%;
}
.pure-u-lg-3-5 {
width: 60%;
*width: 59.9690%;
}
.pure-u-lg-5-8,
.pure-u-lg-15-24 {
width: 62.5000%;
*width: 62.4690%;
}
.pure-u-lg-2-3,
.pure-u-lg-16-24 {
width: 66.6667%;
*width: 66.6357%;
}
.pure-u-lg-17-24 {
width: 70.8333%;
*width: 70.8023%;
}
.pure-u-lg-3-4,
.pure-u-lg-18-24 {
width: 75%;
*width: 74.9690%;
}
.pure-u-lg-19-24 {
width: 79.1667%;
*width: 79.1357%;
}
.pure-u-lg-4-5 {
width: 80%;
*width: 79.9690%;
}
.pure-u-lg-5-6,
.pure-u-lg-20-24 {
width: 83.3333%;
*width: 83.3023%;
}
.pure-u-lg-7-8,
.pure-u-lg-21-24 {
width: 87.5000%;
*width: 87.4690%;
}
.pure-u-lg-11-12,
.pure-u-lg-22-24 {
width: 91.6667%;
*width: 91.6357%;
}
.pure-u-lg-23-24 {
width: 95.8333%;
*width: 95.8023%;
}
.pure-u-lg-1,
.pure-u-lg-1-1,
.pure-u-lg-5-5,
.pure-u-lg-24-24 {
width: 100%;
}
}
@media screen and (min-width: 80em) {
.pure-u-xl-1,
.pure-u-xl-1-1,
.pure-u-xl-1-2,
.pure-u-xl-1-3,
.pure-u-xl-2-3,
.pure-u-xl-1-4,
.pure-u-xl-3-4,
.pure-u-xl-1-5,
.pure-u-xl-2-5,
.pure-u-xl-3-5,
.pure-u-xl-4-5,
.pure-u-xl-5-5,
.pure-u-xl-1-6,
.pure-u-xl-5-6,
.pure-u-xl-1-8,
.pure-u-xl-3-8,
.pure-u-xl-5-8,
.pure-u-xl-7-8,
.pure-u-xl-1-12,
.pure-u-xl-5-12,
.pure-u-xl-7-12,
.pure-u-xl-11-12,
.pure-u-xl-1-24,
.pure-u-xl-2-24,
.pure-u-xl-3-24,
.pure-u-xl-4-24,
.pure-u-xl-5-24,
.pure-u-xl-6-24,
.pure-u-xl-7-24,
.pure-u-xl-8-24,
.pure-u-xl-9-24,
.pure-u-xl-10-24,
.pure-u-xl-11-24,
.pure-u-xl-12-24,
.pure-u-xl-13-24,
.pure-u-xl-14-24,
.pure-u-xl-15-24,
.pure-u-xl-16-24,
.pure-u-xl-17-24,
.pure-u-xl-18-24,
.pure-u-xl-19-24,
.pure-u-xl-20-24,
.pure-u-xl-21-24,
.pure-u-xl-22-24,
.pure-u-xl-23-24,
.pure-u-xl-24-24 {
display: inline-block;
*display: inline;
zoom: 1;
letter-spacing: normal;
word-spacing: normal;
vertical-align: top;
text-rendering: auto;
}
.pure-u-xl-1-24 {
width: 4.1667%;
*width: 4.1357%;
}
.pure-u-xl-1-12,
.pure-u-xl-2-24 {
width: 8.3333%;
*width: 8.3023%;
}
.pure-u-xl-1-8,
.pure-u-xl-3-24 {
width: 12.5000%;
*width: 12.4690%;
}
.pure-u-xl-1-6,
.pure-u-xl-4-24 {
width: 16.6667%;
*width: 16.6357%;
}
.pure-u-xl-1-5 {
width: 20%;
*width: 19.9690%;
}
.pure-u-xl-5-24 {
width: 20.8333%;
*width: 20.8023%;
}
.pure-u-xl-1-4,
.pure-u-xl-6-24 {
width: 25%;
*width: 24.9690%;
}
.pure-u-xl-7-24 {
width: 29.1667%;
*width: 29.1357%;
}
.pure-u-xl-1-3,
.pure-u-xl-8-24 {
width: 33.3333%;
*width: 33.3023%;
}
.pure-u-xl-3-8,
.pure-u-xl-9-24 {
width: 37.5000%;
*width: 37.4690%;
}
.pure-u-xl-2-5 {
width: 40%;
*width: 39.9690%;
}
.pure-u-xl-5-12,
.pure-u-xl-10-24 {
width: 41.6667%;
*width: 41.6357%;
}
.pure-u-xl-11-24 {
width: 45.8333%;
*width: 45.8023%;
}
.pure-u-xl-1-2,
.pure-u-xl-12-24 {
width: 50%;
*width: 49.9690%;
}
.pure-u-xl-13-24 {
width: 54.1667%;
*width: 54.1357%;
}
.pure-u-xl-7-12,
.pure-u-xl-14-24 {
width: 58.3333%;
*width: 58.3023%;
}
.pure-u-xl-3-5 {
width: 60%;
*width: 59.9690%;
}
.pure-u-xl-5-8,
.pure-u-xl-15-24 {
width: 62.5000%;
*width: 62.4690%;
}
.pure-u-xl-2-3,
.pure-u-xl-16-24 {
width: 66.6667%;
*width: 66.6357%;
}
.pure-u-xl-17-24 {
width: 70.8333%;
*width: 70.8023%;
}
.pure-u-xl-3-4,
.pure-u-xl-18-24 {
width: 75%;
*width: 74.9690%;
}
.pure-u-xl-19-24 {
width: 79.1667%;
*width: 79.1357%;
}
.pure-u-xl-4-5 {
width: 80%;
*width: 79.9690%;
}
.pure-u-xl-5-6,
.pure-u-xl-20-24 {
width: 83.3333%;
*width: 83.3023%;
}
.pure-u-xl-7-8,
.pure-u-xl-21-24 {
width: 87.5000%;
*width: 87.4690%;
}
.pure-u-xl-11-12,
.pure-u-xl-22-24 {
width: 91.6667%;
*width: 91.6357%;
}
.pure-u-xl-23-24 {
width: 95.8333%;
*width: 95.8023%;
}
.pure-u-xl-1,
.pure-u-xl-1-1,
.pure-u-xl-5-5,
.pure-u-xl-24-24 {
width: 100%;
}
}

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,262 @@
/* Images */
.pure-img-eliptical {
border-radius: 80%;
}
.pure-img-rounded {
border-radius: 3px;
}
.pure-img-bordered {
background-color: #FFFFFF;
border: 1px solid rgba(0, 0, 0, 0.2);
padding: 5px;
}
/* Thumbnails */
.pure-thumbnails li {
text-align: center;
display: inline-block;
*display: inline;
/* IE7 inline-block hack */
*zoom: 1;
vertical-align: top;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
padding: 0.5em;
}
.pure-thumbnails {
list-style: none;
margin: 0;
padding: 0;
}
.pure-thumbnails a:focus {
outline: 0 none;
}
.pure-thumb {
display: block;
text-decoration: none;
color: inherit;
}
.pure-thumb img {
max-width: 100%;
margin-right: auto;
margin-left: auto;
vertical-align: middle; /* this will remove a thin line below the image */
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
.pure-thumb-bordered {
border: 1px solid rgba(0, 0, 0, 0.2);
}
.pure-thumb .caption {
text-align: left;
display: block;
margin: 0 5px 6px;
}
.pure-thumb .caption p {
margin: 0.3em 0 0;
font-size: 75%;
}
.pure-thumb .caption .caption-head {
font-weight: bold;
margin-top: 0.3em;
}
.pure-thumb-eliptical img {
border-radius: 50%;
}
.pure-thumb-rounded img {
border-radius: 3px;
}
/* Badges/Pills */
.pure-badge,
.pure-badge-error,
.pure-badge-warning,
.pure-badge-success,
.pure-badge-info,
.pure-badge-inverse {
padding: 0.35em 0.9em 0.35em;
background-color: #9D988E;
color: #fff;
display: inline-block;
font-size: 11.844px;
font-weight: bold;
line-height: 1.2em;
vertical-align: baseline;
white-space: nowrap;
border-radius: 20px;
margin: 0.2em;
}
.pure-badge-error {
background-color: #D13C38;
}
.pure-badge-warning {
background-color: #E78C05;
}
.pure-badge-success {
background-color: rgb(83, 180, 79);
}
.pure-badge-info {
background-color: rgb(18, 169, 218);
}
.pure-badge-inverse {
background-color: #4D370C;
}
/* Alerts */
.pure-alert {
position: relative;
margin-bottom: 1em;
padding: 1em;
background: #ccc;
border-radius: 3px;
}
.pure-alert label {
display: inline-block;
*display: inline;
/* IE7 inline-block hack */
*zoom: 1;
white-space: nowrap;
}
.pure-alert {
background-color: rgb(209, 235, 238);
color: rgb(102, 131, 145);
}
.pure-alert-error {
background-color: #D13C38;
color: #fff;
}
.pure-alert-warning {
background-color: rgb(250, 191, 103);
color: rgb(151, 96, 13);
}
.pure-alert-success {
background-color: rgb(83, 180, 79);
color: #fff;
}
/* Contextual Modals */
.pure-popover {
position: relative;
width: 300px;
background-color: #f0f1f3;
color: #2f3034;
padding: 15px;
border: 1px solid #bfc0c8;
border-radius: 2px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
box-padding: border-box;
-webkit-background-clip: padding-box;
-moz-background-clip: padding;
background-clip: padding-box;
}
.pure-arrow-border, .pure-arrow {
border-style: solid;
border-width: 10px;
height:0;
width:0;
position:absolute;
}
/* POPOVER ARROW POSITIONING BOTTOM */
.pure-popover.bottom .pure-arrow-border {
border-color: #bfc0c8 transparent transparent transparent;
bottom: -20px;
left: 50%;
}
.pure-popover.bottom .pure-arrow {
border-color: #f0f1f3 transparent transparent transparent;
bottom:-19px;
left: 50%;
}
/* POPOVER ARROW POSITIONING TOP*/
.pure-popover.top .pure-arrow-border {
border-color: transparent transparent #bfc0c8 transparent;
top: -21px;
left: 50%;
}
.pure-popover.top .pure-arrow {
border-color: transparent transparent #f0f1f3 transparent;
top:-20px;
left: 50%;
}
/* POPOVER ARROW POSITIONING RIGHT*/
.pure-popover.right .pure-arrow-border {
border-color: transparent transparent transparent #bfc0c8;
top: 45%;
right: -21px;
}
.pure-popover.right .pure-arrow {
border-color: transparent transparent transparent #f0f1f3;
top:45%;
right: -20px;
}
/* POPOVER ARROW POSITIONING LEFT*/
.pure-popover.left .pure-arrow-border {
border-color: transparent #bfc0c8 transparent transparent;
top: 45%;
left: -21px;
}
.pure-popover.left .pure-arrow {
border-color: transparent #f0f1f3 transparent transparent;
top:45%;
left: -20px;
}
/* BUTTON IMPROVEMENTS */
.pure-button-block {
display: block;
}
.pure-button-small {
padding: .6em 2em .65em;
font-size:70%;
}
.pure-button-large {
padding: .8em 5em .9em;
font-size:110%;
}
.pure-button-selected {
background-color: #345fcb;
color: #fff;
}
.pure-button-secondary {
background: rgb(161, 195, 238);
color: rgb(26, 88, 122);
}
.pure-button-error {
background: rgb(214, 86, 75);
color: white;
}
.pure-button-success {
background: rgb(54, 197, 71);
color: white;
}
.pure-button-warning {
background: rgb(255, 163, 0);
color: white;
}

1475
tpl/myShaarli/css/pure.css Normal file

File diff suppressed because it is too large Load Diff

11
tpl/myShaarli/css/pure.min.css vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,10 @@
<!DOCTYPE NETSCAPE-Bookmark-file-1>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
<!-- This is an automatically generated file.
It will be read and overwritten.
Do Not Edit! -->{ignore}The RainTPL loop is formatted to avoid generating extra newlines{/ignore}
<TITLE>{$pagetitle}</TITLE>
<H1>Shaarli export of {$selection} bookmarks on {$date}</H1>
<DL><p>{loop="links"}
<DT><A HREF="{$value.url}" ADD_DATE="{$value.timestamp}" PRIVATE="{$value.private}" TAGS="{$value.taglist}">{$value.title}</A>{if="$value.description"}{$eol}<DD>{$value.description}{/if}{/loop}
</DL><p>

View File

@ -0,0 +1,40 @@
<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>{$pagetitle}</title>
<subtitle>Shaared links</subtitle>
{if="$show_dates"}
<updated>{$last_update}</updated>
{/if}
<link rel="self" href="{$self_link}#" />
{loop="$plugins_feed_header"}
{$value}
{/loop}
<author>
<name>{$index_url}</name>
<uri>{$index_url}</uri>
</author>
<id>{$index_url}</id>
<generator>Shaarli</generator>
{loop="$links"}
<entry>
<title>{$value.title}</title>
{if="$usepermalinks"}
<link href="{$value.guid}#" />
{else}
<link href="{$value.url}#" />
{/if}
<id>{$value.guid}</id>
{if="$show_dates"}
<published>{$value.pub_iso_date}</published>
<updated>{$value.up_iso_date}</updated>
{/if}
<content type="html" xml:lang="{$language}"><![CDATA[{$value.description}]]></content>
{loop="$value.taglist"}
<category scheme="{$index_url}?searchtags=" term="{$value|strtolower}" label="{$value}" />
{/loop}
{loop="$value.feed_plugins"}
{$value}
{/loop}
</entry>
{/loop}
</feed>

View File

@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>{$pagetitle}</title>
<link>{$index_url}</link>
<description>Shaared links</description>
<language>{$language}</language>
<copyright>{$index_url}</copyright>
<generator>Shaarli</generator>
<atom:link rel="self" href="{$self_link}" />
{loop="$plugins_feed_header"}
{$value}
{/loop}
{loop="$links"}
<item>
<title>{$value.title}</title>
<guid isPermaLink="{if="$usepermalinks"}true{else}false{/if}">{$value.guid}</guid>
{if="$usepermalinks"}
<link>{$value.guid}</link>
{else}
<link>{$value.url}</link>
{/if}
{if="$show_dates"}
<pubDate>{$value.pub_iso_date}</pubDate>
<atom:modified>{$value.up_iso_date}</atom:modified>
{/if}
<description><![CDATA[{$value.description}]]></description>
{loop="$value.taglist"}
<category domain="{$index_url}?searchtags=">{$value}</category>
{/loop}
{loop="$value.feed_plugins"}
{$value}
{/loop}
</item>
{/loop}
</channel>
</rss>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 434 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 684 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

BIN
tpl/myShaarli/img/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 530 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

View File

@ -18,7 +18,7 @@
<div class="center" id="import-field">
<input type="hidden" name="MAX_FILE_SIZE" value="{$maxfilesize}">
<input type="file" name="filetoupload">
<p><br>{'Maximum size allowed:'|t} <strong>{$maxfilesizeHuman}</strong></p>
<p><br>Maximum size allowed: <strong>{$maxfilesizeHuman}</strong></p>
</div>
<div class="pure-g">
@ -31,15 +31,15 @@
<div class="radio-buttons">
<div>
<input type="radio" name="privacy" value="default" checked="checked">
{'Use values from the imported file, default to public'|t}
Use values from the imported file, default to public
</div>
<div>
<input type="radio" name="privacy" value="private">
{'Import all bookmarks as private'|t}
Import all bookmarks as private
</div>
<div>
<input type="radio" name="privacy" value="public">
{'Import all bookmarks as public'|t}
Import all bookmarks as public
</div>
</div>
</div>

View File

@ -4,14 +4,12 @@
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="alternate" type="application/atom+xml" href="{$feedurl}?do=atom{$searchcrits}#" title="ATOM Feed" />
<link rel="alternate" type="application/rss+xml" href="{$feedurl}?do=rss{$searchcrits}#" title="RSS Feed" />
<link href="img/favicon.png" rel="shortcut icon" type="image/png" />
<link href="img/apple-touch-icon.png" rel="apple-touch-icon" sizes="180x180" />
<link href="img/favicon_64.png" rel="shortcut icon" type="image/png" />
<link type="text/css" rel="stylesheet" href="css/pure.min.css?v={$version_hash}" />
<link type="text/css" rel="stylesheet" href="css/grids-responsive.min.css?v={$version_hash}">
<link type="text/css" rel="stylesheet" href="css/pure-extras.css?v={$version_hash}">
<link type="text/css" rel="stylesheet" href="css/font-awesome.min.css?v={$version_hash}" />
<link type="text/css" rel="stylesheet" href="inc/awesomplete.css?v={$version_hash}#" />
<!--<link type="text/css" rel="stylesheet" href="css/shaarli.css?v={$version_hash}" />-->
<link type="text/css" rel="stylesheet" href="css/myShaarli.css?v={$version_hash}" />
{if="is_file('data/user.css')"}
<link type="text/css" rel="stylesheet" href="data/user.css#" />

View File

@ -65,27 +65,6 @@
</div>
</div>
<div class="pure-g">
<div class="pure-u-lg-{$ratioLabel} pure-u-1">
<div class="form-label">
<label for="language">
<span class="label-name">{'Language'|t}</span>
</label>
</div>
</div>
<div class="pure-u-lg-{$ratioInput} pure-u-1">
<div class="form-input">
<select name="language" id="language" class="align">
{loop="$languages"}
<option value="{$key}">
{$value}
</option>
{/loop}
</select>
</div>
</div>
</div>
<div class="pure-g">
<div class="pure-u-lg-{$ratioLabel} pure-u-1">
<div class="form-label">

661
tpl/myShaarli/js/shaarli.js Normal file
View File

@ -0,0 +1,661 @@
/** @licstart The following is the entire license notice for the
* JavaScript code in this page.
*
* Copyright: (c) 2011-2015 Sébastien SAUVAGE <sebsauvage@sebsauvage.net>
* (c) 2011-2017 The Shaarli Community, see AUTHORS
*
* This software is provided 'as-is', without any express or implied warranty.
* In no event will the authors be held liable for any damages arising from
* the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would
* be appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must
* not be misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source distribution.
*
* @licend The above is the entire license notice
* for the JavaScript code in this page.
*/
window.onload = function () {
/**
* Retrieve an element up in the tree from its class name.
*/
function getParentByClass(el, className) {
var p = el.parentNode;
if (p == null || p.classList.contains(className)) {
return p;
}
return getParentByClass(p, className);
}
/**
* Handle responsive menu.
* Source: http://purecss.io/layouts/tucked-menu-vertical/
*/
(function (window, document) {
var menu = document.getElementById('shaarli-menu'),
WINDOW_CHANGE_EVENT = ('onorientationchange' in window) ? 'orientationchange':'resize';
function toggleHorizontal() {
[].forEach.call(
document.getElementById('shaarli-menu').querySelectorAll('.menu-transform'),
function(el){
el.classList.toggle('pure-menu-horizontal');
}
);
};
function toggleMenu() {
// set timeout so that the panel has a chance to roll up
// before the menu switches states
if (menu.classList.contains('open')) {
setTimeout(toggleHorizontal, 500);
}
else {
toggleHorizontal();
}
menu.classList.toggle('open');
document.getElementById('menu-toggle').classList.toggle('x');
};
function closeMenu() {
if (menu.classList.contains('open')) {
toggleMenu();
}
}
var menuToggle = document.getElementById('menu-toggle');
if (menuToggle != null) {
menuToggle.addEventListener('click', function (e) {
toggleMenu();
});
}
window.addEventListener(WINDOW_CHANGE_EVENT, closeMenu);
})(this, this.document);
/**
* Fold/Expand shaares description and thumbnail.
*/
var foldAllButtons = document.getElementsByClassName('fold-all');
var foldButtons = document.getElementsByClassName('fold-button');
[].forEach.call(foldButtons, function (foldButton) {
// Retrieve description
var description = null;
var thumbnail = null;
var linklistItem = getParentByClass(foldButton, 'linklist-item');
if (linklistItem != null) {
description = linklistItem.querySelector('.linklist-item-description');
thumbnail = linklistItem.querySelector('.linklist-item-thumbnail');
if (description != null || thumbnail != null) {
foldButton.style.display = 'inline';
}
}
foldButton.addEventListener('click', function (event) {
event.preventDefault();
toggleFold(event.target, description, thumbnail);
});
});
if (foldAllButtons != null) {
[].forEach.call(foldAllButtons, function (foldAllButton) {
foldAllButton.addEventListener('click', function (event) {
event.preventDefault();
var state = foldAllButton.firstElementChild.getAttribute('class').indexOf('down') != -1 ? 'down' : 'up';
[].forEach.call(foldButtons, function (foldButton) {
if (foldButton.firstElementChild.classList.contains('fa-chevron-up') && state == 'down'
|| foldButton.firstElementChild.classList.contains('fa-chevron-down') && state == 'up'
) {
return;
}
// Retrieve description
var description = null;
var thumbnail = null;
var linklistItem = getParentByClass(foldButton, 'linklist-item');
if (linklistItem != null) {
description = linklistItem.querySelector('.linklist-item-description');
thumbnail = linklistItem.querySelector('.linklist-item-thumbnail');
if (description != null || thumbnail != null) {
foldButton.style.display = 'inline';
}
}
toggleFold(foldButton.firstElementChild, description, thumbnail);
});
foldAllButton.firstElementChild.classList.toggle('fa-chevron-down');
foldAllButton.firstElementChild.classList.toggle('fa-chevron-up');
});
});
}
function toggleFold(button, description, thumb)
{
// Switch fold/expand - up = fold
if (button.classList.contains('fa-chevron-up')) {
button.title = 'Expand';
if (description != null) {
description.style.display = 'none';
}
if (thumb != null) {
thumb.style.display = 'none';
}
}
else {
button.title = 'Fold';
if (description != null) {
description.style.display = 'block';
}
if (thumb != null) {
thumb.style.display = 'block';
}
}
button.classList.toggle('fa-chevron-down');
button.classList.toggle('fa-chevron-up');
}
/**
* Confirmation message before deletion.
*/
var deleteLinks = document.querySelectorAll('.confirm-delete');
[].forEach.call(deleteLinks, function(deleteLink) {
deleteLink.addEventListener('click', function(event) {
if(! confirm('Are you sure you want to delete this link ?')) {
event.preventDefault();
}
});
});
/**
* Close alerts
*/
var closeLinks = document.querySelectorAll('.pure-alert-close');
[].forEach.call(closeLinks, function(closeLink) {
closeLink.addEventListener('click', function(event) {
var alert = getParentByClass(event.target, 'pure-alert-closable');
alert.style.display = 'none';
});
});
/**
* New version dismiss.
* Hide the message for one week using localStorage.
*/
var newVersionDismiss = document.getElementById('new-version-dismiss');
var newVersionMessage = document.querySelector('.new-version-message');
if (newVersionMessage != null
&& localStorage.getItem('newVersionDismiss') != null
&& parseInt(localStorage.getItem('newVersionDismiss')) + 7*24*60*60*1000 > (new Date()).getTime()
) {
newVersionMessage.style.display = 'none';
}
if (newVersionDismiss != null) {
newVersionDismiss.addEventListener('click', function () {
localStorage.setItem('newVersionDismiss', (new Date()).getTime());
});
}
var hiddenReturnurl = document.getElementsByName('returnurl');
if (hiddenReturnurl != null) {
hiddenReturnurl.value = window.location.href;
}
/**
* Autofocus text fields
*/
var autofocusElements = document.querySelectorAll('.autofocus');
var breakLoop = false;
[].forEach.call(autofocusElements, function(autofocusElement) {
if (autofocusElement.value == '' && ! breakLoop) {
autofocusElement.focus();
breakLoop = true;
}
});
/**
* Handle sub menus/forms
*/
var openers = document.getElementsByClassName('subheader-opener');
if (openers != null) {
[].forEach.call(openers, function(opener) {
opener.addEventListener('click', function(event) {
event.preventDefault();
var id = opener.getAttribute('data-open-id');
var sub = document.getElementById(id);
if (sub != null) {
[].forEach.call(document.getElementsByClassName('subheader-form'), function (element) {
if (element != sub) {
removeClass(element, 'open')
}
});
sub.classList.toggle('open');
}
});
});
}
function removeClass(element, classname) {
element.className = element.className.replace(new RegExp('(?:^|\\s)'+ classname + '(?:\\s|$)'), ' ');
}
/**
* Remove CSS target padding (for fixed bar)
*/
if (location.hash != '') {
var anchor = document.getElementById(location.hash.substr(1));
if (anchor != null) {
var padsize = anchor.clientHeight;
this.window.scroll(0, this.window.scrollY - padsize);
anchor.style.paddingTop = 0;
}
}
/**
* Text area resizer
*/
var description = document.getElementById('lf_description');
var observe = function (element, event, handler) {
element.addEventListener(event, handler, false);
};
function init () {
function resize () {
/* Fix jumpy resizing: https://stackoverflow.com/a/18262927/1484919 */
var scrollTop = window.pageYOffset ||
(document.documentElement || document.body.parentNode || document.body).scrollTop;
description.style.height = 'auto';
description.style.height = description.scrollHeight+10+'px';
window.scrollTo(0, scrollTop);
}
/* 0-timeout to get the already changed text */
function delayedResize () {
window.setTimeout(resize, 0);
}
observe(description, 'change', resize);
observe(description, 'cut', delayedResize);
observe(description, 'paste', delayedResize);
observe(description, 'drop', delayedResize);
observe(description, 'keydown', delayedResize);
resize();
}
if (description != null) {
init();
// Submit editlink form with CTRL + Enter in the text area.
description.addEventListener('keydown', function (event) {
if (event.ctrlKey && event.keyCode === 13) {
document.getElementById('button-save-edit').click();
}
});
}
/**
* Awesomplete trigger.
*/
var tags = document.getElementById('lf_tags');
if (tags != null) {
awesompleteUniqueTag('#lf_tags');
}
/**
* bLazy trigger
*/
var picwall = document.getElementById('picwall_container');
if (picwall != null) {
var bLazy = new Blazy();
}
/**
* Bookmarklet alert
*/
var bookmarkletLinks = document.querySelectorAll('.bookmarklet-link');
var bkmMessage = document.getElementById('bookmarklet-alert');
[].forEach.call(bookmarkletLinks, function(link) {
link.addEventListener('click', function(event) {
event.preventDefault();
alert(bkmMessage.value);
});
});
/**
* Firefox Social
*/
var ffButton = document.getElementById('ff-social-button');
if (ffButton != null) {
ffButton.addEventListener('click', function(event) {
activateFirefoxSocial(event.target);
});
}
/**
* Plugin admin order
*/
var orderPA = document.querySelectorAll('.order');
[].forEach.call(orderPA, function(link) {
link.addEventListener('click', function(event) {
event.preventDefault();
if (event.target.classList.contains('order-up')) {
return orderUp(event.target.parentNode.parentNode.getAttribute('data-order'));
} else if (event.target.classList.contains('order-down')) {
return orderDown(event.target.parentNode.parentNode.getAttribute('data-order'));
}
});
});
var continent = document.getElementById('continent');
var city = document.getElementById('city');
if (continent != null && city != null) {
continent.addEventListener('change', function (event) {
hideTimezoneCities(city, continent.options[continent.selectedIndex].value, true);
});
hideTimezoneCities(city, continent.options[continent.selectedIndex].value, false);
}
/**
* Bulk actions
*/
var linkCheckboxes = document.querySelectorAll('.delete-checkbox');
var bar = document.getElementById('actions');
[].forEach.call(linkCheckboxes, function(checkbox) {
checkbox.style.display = 'block';
checkbox.addEventListener('click', function(event) {
var count = 0;
var linkCheckedCheckboxes = document.querySelectorAll('.delete-checkbox:checked');
[].forEach.call(linkCheckedCheckboxes, function(checkbox) {
count++;
});
if (count == 0 && bar.classList.contains('open')) {
bar.classList.toggle('open');
} else if (count > 0 && ! bar.classList.contains('open')) {
bar.classList.toggle('open');
}
});
});
var deleteButton = document.getElementById('actions-delete');
var token = document.querySelector('input[type="hidden"][name="token"]');
if (deleteButton != null && token != null) {
deleteButton.addEventListener('click', function(event) {
event.preventDefault();
var links = [];
var linkCheckedCheckboxes = document.querySelectorAll('.delete-checkbox:checked');
[].forEach.call(linkCheckedCheckboxes, function(checkbox) {
links.push({
'id': checkbox.value,
'title': document.querySelector('.linklist-item[data-id="'+ checkbox.value +'"] .linklist-link').innerHTML
});
});
var message = 'Are you sure you want to delete '+ links.length +' links?\n';
message += 'This action is IRREVERSIBLE!\n\nTitles:\n';
var ids = [];
links.forEach(function(item) {
message += ' - '+ item['title'] +'\n';
ids.push(item['id']);
});
if (window.confirm(message)) {
window.location = '?delete_link&lf_linkdate='+ ids.join('+') +'&token='+ token.value;
}
});
}
/**
* Tag list operations
*
* TODO: support error code in the backend for AJAX requests
*/
var tagList = document.querySelector('input[name="taglist"]');
var existingTags = tagList ? tagList.value.split(' ') : [];
var awesomepletes = [];
// Display/Hide rename form
var renameTagButtons = document.querySelectorAll('.rename-tag');
[].forEach.call(renameTagButtons, function(rename) {
rename.addEventListener('click', function(event) {
event.preventDefault();
var block = findParent(event.target, 'div', {'class': 'tag-list-item'});
var form = block.querySelector('.rename-tag-form');
if (form.style.display == 'none' || form.style.display == '') {
form.style.display = 'block';
} else {
form.style.display = 'none';
}
block.querySelector('input').focus();
});
});
// Rename a tag with an AJAX request
var renameTagSubmits = document.querySelectorAll('.validate-rename-tag');
[].forEach.call(renameTagSubmits, function(rename) {
rename.addEventListener('click', function(event) {
event.preventDefault();
var block = findParent(event.target, 'div', {'class': 'tag-list-item'});
var input = block.querySelector('.rename-tag-input');
var totag = input.value.replace('/"/g', '\\"');
if (totag.trim() == '') {
return;
}
var fromtag = block.getAttribute('data-tag');
var token = document.getElementById('token').value;
xhr = new XMLHttpRequest();
xhr.open('POST', '?do=changetag');
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.onload = function() {
if (xhr.status !== 200) {
alert('An error occurred. Return code: '+ xhr.status);
location.reload();
} else {
block.setAttribute('data-tag', totag);
input.setAttribute('name', totag);
input.setAttribute('value', totag);
findParent(input, 'div', {'class': 'rename-tag-form'}).style.display = 'none';
block.querySelector('a.tag-link').innerHTML = htmlEntities(totag);
block.querySelector('a.tag-link').setAttribute('href', '?searchtags='+ encodeURIComponent(totag));
block.querySelector('a.rename-tag').setAttribute('href', '?do=changetag&fromtag='+ encodeURIComponent(totag));
// Refresh awesomplete values
for (var key in existingTags) {
if (existingTags[key] == fromtag) {
existingTags[key] = totag;
}
}
awesomepletes = updateAwesompleteList('.rename-tag-input', existingTags, awesomepletes);
}
};
xhr.send('renametag=1&fromtag='+ encodeURIComponent(fromtag) +'&totag='+ encodeURIComponent(totag) +'&token='+ token);
refreshToken();
});
});
// Validate input with enter key
var renameTagInputs = document.querySelectorAll('.rename-tag-input');
[].forEach.call(renameTagInputs, function(rename) {
rename.addEventListener('keypress', function(event) {
if (event.keyCode === 13) { // enter
findParent(event.target, 'div', {'class': 'tag-list-item'}).querySelector('.validate-rename-tag').click();
}
});
});
// Delete a tag with an AJAX query (alert popup confirmation)
var deleteTagButtons = document.querySelectorAll('.delete-tag');
[].forEach.call(deleteTagButtons, function(rename) {
rename.style.display = 'inline';
rename.addEventListener('click', function(event) {
event.preventDefault();
var block = findParent(event.target, 'div', {'class': 'tag-list-item'});
var tag = block.getAttribute('data-tag');
var token = document.getElementById('token').value;
if (confirm('Are you sure you want to delete the tag "'+ tag +'"?')) {
xhr = new XMLHttpRequest();
xhr.open('POST', '?do=changetag');
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.onload = function() {
block.remove();
};
xhr.send(encodeURI('deletetag=1&fromtag='+ tag +'&token='+ token));
refreshToken();
}
});
});
updateAwesompleteList('.rename-tag-input', existingTags, awesomepletes);
};
/**
* Find a parent element according to its tag and its attributes
*
* @param element Element where to start the search
* @param tagName Expected parent tag name
* @param attributes Associative array of expected attributes (name=>value).
*
* @returns Found element or null.
*/
function findParent(element, tagName, attributes)
{
while (element) {
if (element.tagName.toLowerCase() == tagName) {
var match = true;
for (var key in attributes) {
if (! element.hasAttribute(key)
|| (attributes[key] != '' && element.getAttribute(key).indexOf(attributes[key]) == -1)
) {
match = false;
break;
}
}
if (match) {
return element;
}
}
element = element.parentElement;
}
return null;
}
/**
* Ajax request to refresh the CSRF token.
*/
function refreshToken()
{
var xhr = new XMLHttpRequest();
xhr.open('GET', '?do=token');
xhr.onload = function() {
var token = document.getElementById('token');
token.setAttribute('value', xhr.responseText);
};
xhr.send();
}
/**
* Update awesomplete list of tag for all elements matching the given selector
*
* @param selector CSS selector
* @param tags Array of tags
* @param instances List of existing awesomplete instances
*/
function updateAwesompleteList(selector, tags, instances)
{
// First load: create Awesomplete instances
if (instances.length == 0) {
var elements = document.querySelectorAll(selector);
[].forEach.call(elements, function (element) {
instances.push(new Awesomplete(
element,
{'list': tags}
));
});
} else {
// Update awesomplete tag list
for (var key in instances) {
instances[key].list = tags;
}
}
return instances;
}
/**
* html_entities in JS
*
* @see http://stackoverflow.com/questions/18749591/encode-html-entities-in-javascript
*/
function htmlEntities(str)
{
return str.replace(/[\u00A0-\u9999<>\&]/gim, function(i) {
return '&#'+i.charCodeAt(0)+';';
});
}
function activateFirefoxSocial(node) {
var loc = location.href;
var baseURL = loc.substring(0, loc.lastIndexOf("/") + 1);
var title = document.title;
// Keeping the data separated (ie. not in the DOM) so that it's maintainable and diffable.
var data = {
name: title,
description: "The personal, minimalist, super-fast, database free, bookmarking service by the Shaarli community.",
author: "Shaarli",
version: "1.0.0",
iconURL: baseURL + "/images/favicon.ico",
icon32URL: baseURL + "/images/favicon.ico",
icon64URL: baseURL + "/images/favicon.ico",
shareURL: baseURL + "?post=%{url}&title=%{title}&description=%{text}&source=firefoxsocialapi",
homepageURL: baseURL
};
node.setAttribute("data-service", JSON.stringify(data));
var activate = new CustomEvent("ActivateSocialFeature");
node.dispatchEvent(activate);
}
/**
* Add the class 'hidden' to city options not attached to the current selected continent.
*
* @param cities List of <option> elements
* @param currentContinent Current selected continent
* @param reset Set to true to reset the selected value
*/
function hideTimezoneCities(cities, currentContinent) {
var first = true;
if (reset == null) {
reset = false;
}
[].forEach.call(cities, function (option) {
if (option.getAttribute('data-continent') != currentContinent) {
option.className = 'hidden';
} else {
option.className = '';
if (reset === true && first === true) {
option.setAttribute('selected', 'selected');
first = false;
}
}
});
}

View File

@ -53,9 +53,9 @@
{/loop}
<div id="linklist">
<div id="link-count-block" class="pure-g">
<div class="pure-g">
<div class="pure-u-lg-2-24 pure-u-1-24"></div>
<div id="link-count-content" class="pure-u-lg-20-24 pure-u-22-24">
<div class="pure-u-lg-20-24 pure-u-22-24">
<div class="linkcount pure-u-lg-0 center">
{if="!empty($linkcount)"}
<span class="strong">{$linkcount}</span> {function="t('shaare', 'shaares', $linkcount)"}
@ -76,17 +76,17 @@
</div>
{if="count($links)==0"}
<div id="search-result-block" class="pure-g pure-alert pure-alert-error search-result">
<div class="pure-g pure-alert pure-alert-error search-result">
<div class="pure-u-2-24"></div>
<div id="search-result-content" class="pure-u-20-24">
<div class="pure-u-20-24">
<div id="searchcriteria">{'Nothing found.'|t}</div>
</div>
</div>
{elseif="!empty($search_term) or $search_tags !== '' or !empty($visibility) or $untaggedonly"}
<div id="search-result-block" class="pure-g pure-alert pure-alert-success search-result">
<div class="pure-g pure-alert pure-alert-success search-result">
<div class="pure-u-2-24"></div>
<div id="search-result-content" class="pure-u-20-24 search-result-main">
{function="sprintf(t('%s result', '%s results', $result_count), $result_count)"}
<div class="pure-u-20-24">
{function="t('%s result', '%s results', $result_count)"}
{if="!empty($search_term)"}
{'for'|t} <em><strong>{$search_term}</strong></em>
{/if}
@ -114,34 +114,28 @@
</div>
{/if}
<div id="linklist-loop-block" class="pure-g">
<div class="pure-g">
<div class="pure-u-lg-2-24 pure-u-1-24"></div>
<div id="linklist-loop-content" class="pure-u-lg-20-24 pure-u-22-24">
{ignore}Set translation here, for performances{/ignore}
{$strPrivate=t('Private')}
{$strEdit=t('Edit')}
{$strDelete=t('Delete')}
{$strFold=t('Fold')}
{$strEdited=t('Edited: ')}
{$strPermalink=t('Permalink')}
{$strPermalinkLc=t('permalink')}
{$strAddTag=t('Add tag')}
{ignore}End of translations{/ignore}
<div class="pure-u-lg-20-24 pure-u-22-24">
{loop="links"}
<div class="anchor" id="{$value.shorturl}"></div>
<div class="linklist-item linklist-item{if="$value.class"} {$value.class}{/if}" data-id="{$value.id}">
<div class="linklist-item-title">
{$thumb=thumbnail($value.url)}
{if="$thumb!=false"}
<div class="linklist-item-thumbnail">{$thumb}</div>
{/if}
{$thumb=($value.thumbnail)}
{if="$thumb!=false"}
<div class="linklist-item-thumbnail">{$thumb}</div>
{/if}
<div class="linklist-item-title">
{if="isLoggedIn()"}
<div class="linklist-item-editbuttons">
{if="$value.private"}
<span class="label label-private">{$strPrivate}</span>
<span class="label label-private">{'Private'|t}</span>
{/if}
<input type="checkbox" class="delete-checkbox" value="{$value.id}">
<!-- FIXME! JS translation -->
<a href="?edit_link={$value.id}" title="{'Edit'|t}"><i class="fa fa-pencil-square-o edit-link"></i></a>
<a href="#" title="{'Fold'|t}" class="fold-button"><i class="fa fa-chevron-up"></i></a>
</div>
{/if}
@ -158,6 +152,8 @@
</h2>
</div>
{if="$value.description"}
<div class="linklist-item-description">
{$value.description}
@ -170,7 +166,7 @@
<i class="fa fa-tags"></i>
{$tag_counter=count($value.taglist)}
{loop="value.taglist"}
<span class="label label-tag" title="{$strAddTag}">
<span class="label label-tag" title="Add tag">
<a href="?addtag={$value|urlencode}">{$value}</a>
</span>
{if="$tag_counter - 1 != $counter"}&middot;{/if}
@ -178,27 +174,11 @@
</div>
{/if}
<div class="linklist-item-infos-date-url-block pure-g">
<div class="linklist-item-infos-dateblock pure-u-lg-7-12 pure-u-1">
{if="isLoggedIn()"}
<div class="linklist-item-infos-controls-group pure-u-0 pure-u-lg-visible">
<span class="linklist-item-infos-controls-item ctrl-checkbox">
<input type="checkbox" class="delete-checkbox" value="{$value.id}">
</span>
<span class="linklist-item-infos-controls-item ctrl-edit">
<a href="?edit_link={$value.id}" title="{$strEdit}"><i class="fa fa-pencil-square-o edit-link"></i></a>
</span>
<span class="linklist-item-infos-controls-item ctrl-delete">
<a href="?delete_link&amp;lf_linkdate={$value.id}&amp;token={$token}"
title="{$strDelete}" class="delete-link pure-u-0 pure-u-lg-visible confirm-delete">
<i class="fa fa-trash"></i>
</a>
</span>
</div>
{/if}
<a href="?{$value.shorturl}" title="{$strPermalink}">
<div class="pure-g">
<div class="linklist-item-infos-dateblock pure-u-lg-3-8 pure-u-1">
<a href="?{$value.shorturl}" title="{'Permalink'|t}">
{if="!$hide_timestamps || isLoggedIn()"}
{$updated=$value.updated_timestamp ? $strEdited. format_date($value.updated) : $strPermalink}
{$updated=$value.updated_timestamp ? 'Edited: '. format_date($value.updated) : 'Permalink'}
<span class="linkdate" title="{$updated}">
<i class="fa fa-clock-o"></i>
{$value.created|format_date}
@ -206,7 +186,7 @@
&middot;
</span>
{/if}
{$strPermalinkLc}
{'permalink'|t}
</a>
<div class="pure-u-0 pure-u-lg-visible">
@ -221,13 +201,16 @@
</div>
</div><div
{ignore}do not add space or line break between these div - Firefox issue{/ignore}
class="linklist-item-infos-url pure-u-lg-5-12 pure-u-1">
class="linklist-item-infos-url pure-u-lg-5-8 pure-u-1">
<a href="{$value.real_url}" title="{$value.title}">
<i class="fa fa-link"></i> {$value.url}
</a>
<div class="linklist-item-buttons pure-u-0 pure-u-lg-visible">
<a href="#" title="{$strFold}" class="fold-button"><i class="fa fa-chevron-up"></i></a>
</div>
{if="isLoggedIn()"}
<a href="?delete_link&amp;lf_linkdate={$value.id}&amp;token={$token}"
title="{'Delete'|t}" class="delete-link pure-u-0 pure-u-lg-visible confirm-delete">
<i class="fa fa-trash"></i>
</a>
{/if}
</div>
<div class="mobile-buttons pure-u-1 pure-u-lg-0">
{if="isset($value.link_plugin)"}
@ -240,11 +223,9 @@
{if="isLoggedIn()"}
&middot;
<a href="?delete_link&amp;lf_linkdate={$value.id}&amp;token={$token}"
title="{$strDelete}" class="delete-link confirm-delete">
title="{'Delete'|t}" class="delete-link confirm-delete">
<i class="fa fa-trash"></i>
</a>
&middot;
<a href="?edit_link={$value.id}" title="{$strEdit}"><i class="fa fa-pencil-square-o edit-link"></i></a>
{/if}
</div>
</div>
@ -261,9 +242,9 @@
{/loop}
</div>
<div id="linklist-paging-bottom-block" class="pure-g">
<div class="pure-g">
<div class="pure-u-lg-2-24 pure-u-1-24"></div>
<div id="linklist-paging-bottom-content" class="pure-u-lg-20-24 pure-u-22-24">
<div class="pure-u-lg-20-24 pure-u-22-24">
{include="linklist.paging"}
</div>
</div>

View File

@ -13,7 +13,7 @@
<a href="?untaggedonly" title="{'Filter untagged links'|t}"
class={if="$untaggedonly"}"filter-on"{else}"filter-off"{/if}
><i class="fa fa-tag"></i></a>
<a href="#" class="filter-off fold-all pure-u-lg-0" title="{'Fold all'|t}">
<a href="#" class="filter-off fold-all pure-u-lg-0" title="Fold all">
<i class="fa fa-chevron-up"></i>
</a>
{loop="$action_plugin"}
@ -53,7 +53,7 @@
<form method="GET" class="pure-u-0 pure-u-lg-visible">
<input type="text" name="linksperpage" placeholder="133">
</form>
<a href="#" class="filter-off fold-all pure-u-0 pure-u-lg-visible" title="{'Fold all'|t}">
<a href="#" class="filter-off fold-all pure-u-0 pure-u-lg-visible" title="Fold all">
<i class="fa fa-chevron-up"></i>
</a>
</div>

View File

@ -8,8 +8,8 @@
{$version}
{/if}
&middot;
{'The personal, minimalist, super-fast, database free, bookmarking service'|t} {'by the Shaarli community'|t} &middot;
<a href="doc/html/index.html" rel="nofollow">{'Documentation'|t}</a>
The personal, minimalist, super-fast, database free, bookmarking service by the Shaarli community &middot;
<a href="doc/html/index.html" rel="nofollow">Documentation</a>
{loop="$plugins_footer.text"}
{$value}
{/loop}
@ -27,17 +27,6 @@
<script src="{$value}#"></script>
{/loop}
<div id="js-translations" class="hidden">
<span id="translation-fold">{'Fold'|t}</span>
<span id="translation-fold-all">{'Fold all'|t}</span>
<span id="translation-expand">{'Expand'|t}</span>
<span id="translation-expand-all">{'Expand all'|t}</span>
<span id="translation-delete-link">{'Are you sure you want to delete this link?'|t}</span>
<span id="translation-shaarli-desc">
{'The personal, minimalist, super-fast, database free, bookmarking service'|t} {'by the Shaarli community'|t}
</span>
</div>
<script src="js/shaarli.js?v={$version_hash}"></script>
<script src="inc/awesomplete.js?v={$version_hash}#"></script>
<script src="inc/awesomplete-multiple-tags.js?v={$version_hash}#"></script>

View File

@ -2,7 +2,7 @@
<div class="pure-u-lg-0 pure-u-1">
<div class="pure-menu">
<a href="{$titleLink}" class="pure-menu-link">
<img src="img/icon.png" width="16" height="16" class="head-logo" alt="logo" />
<img src="img/favicon_32.png" width="16" height="16" class="head-logo" alt="logo" />
{$shaarlititle}
</a>
<a href="#" class="menu-toggle" id="menu-toggle"><s class="bar"></s><s class="bar"></s></a>
@ -11,9 +11,11 @@
<div class="pure-u-1">
<div class="pure-menu menu-transform pure-menu-horizontal pure-g">
<ul class="pure-menu-list pure-u-lg-5-6 pure-u-1">
<li>
<img src="img/logo_myShaarli.png" class="head-logo" alt="logo" />
</li>
<li class="pure-menu-item pure-u-0 pure-u-lg-visible">
<a href="{$titleLink}" class="pure-menu-link">
<img src="img/icon.png" width="16" height="16" class="head-logo" alt="logo" />
{$shaarlititle}
</a>
</li>

View File

@ -0,0 +1,176 @@
<!DOCTYPE html>
<html>
<head>
{include="includes"}
</head>
<body>
{include="page.header"}
<noscript>
<div class="pure-g new-version-message pure-alert pure-alert-warning">
<div class="pure-u-2-24"></div>
<div class="pure-u-20-24">
{'You need to enable Javascript to change plugin loading order.'|t}
</div>
</div>
<div class="clear"></div>
</noscript>
<form method="POST" action="?do=save_pluginadmin" name="pluginform" id="pluginform">
<div class="pure-g">
<div class="pure-u-lg-1-8 pure-u-1-24"></div>
<div class="pure-u-lg-3-4 pure-u-22-24 page-form page-form-complete">
<h2 class="window-title">{'Plugin administration'|t}</h2>
<section id="enabled_plugins">
<h3 class="window-subtitle">{'Enabled Plugins'|t}</h3>
<div>
{if="count($enabledPlugins)==0"}
<p>{'No plugin enabled.'|t}</p>
{else}
<table id="plugin_table">
<thead>
<tr>
<th class="center">{'Disable'|t}</th>
<th>{'Name'|t}</th>
<th><div class="pure-u-0 pure-u-lg-visible">{'Description'|t}</div></th>
<th class="center">{'Order'|t}</th>
</tr>
</thead>
<tbody>
{loop="$enabledPlugins"}
<tr data-line="{$key}" data-order="{$counter}" class="main-row">
<td class="center"><input type="checkbox" name="{$key}" id="{$key}" checked="checked"></td>
<td class="center">
<label for="{$key}"><strong>{function="str_replace('_', ' ', $key)"}</strong></label>
</td>
<td><div class="pure-u-0 pure-u-lg-visible"><label for="{$key}">{$value.description}</label></div></td>
<td class="center">
{if="count($enabledPlugins)>1"}
<a href="#" class="order order-up"></a>
<a href="#" class="order order-down"></a>
{/if}
<input type="hidden" name="order_{$key}" value="{$counter}">
</td>
</tr>
<tr data-line="{$key}" data-order="{$counter}" class="pure-u-lg-0 mobile-row">
<td colspan="4"><label for="{$key}">{$value.description}</label></td>
</tr>
{/loop}
</tbody>
<tfoot>
<tr>
<th class="center">{'Disable'|t}</th>
<th>{'Name'|t}</th>
<th><div class="pure-u-0 pure-u-lg-visible">{'Description'|t}</div></th>
<th class="center">{'Order'|t}</th>
</tr>
</tfoot>
</table>
{/if}
</div>
</section>
<section id="disabled_plugins">
<h3 class="window-subtitle">{'Disabled Plugins'|t}</h3>
<div>
{if="count($disabledPlugins)==0"}
<p>{'No plugin disabled.'|t}</p>
{else}
<table>
<thead>
<tr>
<th class="center">{'Enable'|t}</th>
<th>{'Name'|t}</th>
<th><div class="pure-u-0 pure-u-lg-visible">{'Description'|t}</div></th>
</tr>
</thead>
<tbody>
{loop="$disabledPlugins"}
<tr class="main-row">
<td class="center"><input type="checkbox" name="{$key}" id="{$key}"></td>
<td class="center">
<label for="{$key}"><strong>{function="str_replace('_', ' ', $key)"}</strong></label>
</td>
<td><div class="pure-u-0 pure-u-lg-visible">
<label for="{$key}">{$value.description}</label>
</div></td>
</tr>
<tr class="pure-u-lg-0 mobile-row">
<td colspan="3"><label for="{$key}">{$value.description}</label></td>
</tr>
{/loop}
</tbody>
<tfoot>
<tr>
<th class="center">{'Enable'|t}</th>
<th>{'Name'|t}</th>
<th><div class="pure-u-0 pure-u-lg-visible">{'Description'|t}</div></th>
</tr>
</tfoot>
</table>
{/if}
</div>
</section>
<div class="center more">
More plugins available
<a href="doc/Community-&-Related-software.html#third-party-plugins">in the documentation</a>.
</div>
<div class="center">
<input type="submit" value="{'Save'|t}" name="save">
</div>
</div>
</div>
<input type="hidden" name="token" value="{$token}">
</form>
<form action="?do=save_pluginadmin" method="POST">
<div class="pure-g">
<div class="pure-u-lg-1-8 pure-u-1-24"></div>
<div class="pure-u-lg-3-4 pure-u-22-24 page-form page-form-light">
<h2 class="window-title">{'Plugin configuration'|t}</h2>
<section id="plugin_parameters">
<div>
{if="count($enabledPlugins)==0"}
<p>{'No plugin enabled.'|t}</p>
{else}
{loop="$enabledPlugins"}
{if="count($value.parameters) > 0"}
<div class="plugin_parameters">
<h3 class="window-subtitle">{function="str_replace('_', ' ', $key)"}</h3>
{loop="$value.parameters"}
<div class="plugin_parameter">
<p class="float_label">
<label for="{$key}">
<code>{$key}</code>
{if="isset($value.desc)"}
&middot; {$value.desc}
{/if}
</label>
</p>
<div class="float_input">
<input name="{$key}" value="{$value.value}" id="{$key}" type="text" />
</div>
</div>
{/loop}
</div>
{/if}
{/loop}
{/if}
<div class="center">
<input type="submit" name="parameters_form" value="{'Save'|t}"/>
</div>
</div>
</section>
</div>
</div>
</form>
{include="page.footer"}
<script src="inc/plugin_admin.js#"></script>
</body>
</html>

View File

@ -0,0 +1,69 @@
<!DOCTYPE html>
<html>
<head>
{include="includes"}
</head>
<body>
{include="page.header"}
{include="tag.sort"}
<div class="pure-g">
<div class="pure-u-lg-1-6 pure-u-1-24"></div>
<div class="pure-u-lg-2-3 pure-u-22-24 page-form page-visitor">
{$countTags=count($tags)}
<h2 class="window-title">{'Tag cloud'|t} - {$countTags} {'tags'|t}</h2>
{if="!empty($search_tags)"}
<p class="enter">
<a href="?searchtags={$search_tags|urlencode}">{'List all links with those tags'|t}</a>
</p>
{/if}
<div id="search-tagcloud" class="pure-g">
<div class="pure-u-lg-1-4"></div>
<div class="pure-u-1 pure-u-lg-1-2">
<form method="GET">
<input type="hidden" name="do" value="tagcloud">
<input type="text" name="searchtags" placeholder="{'Filter by tag'|t}"
{if="!empty($search_tags)"}
value="{$search_tags}"
{/if}
autocomplete="off" data-multiple data-autofirst data-minChars="1"
data-list="{loop="$tags"}{$key}, {/loop}"
>
<button type="submit" class="search-button"><i class="fa fa-search"></i></button>
</form>
</div>
<div class="pure-u-lg-1-4"></div>
</div>
<div id="plugin_zone_start_tagcloud" class="plugin_zone">
{loop="$plugin_start_zone"}
{$value}
{/loop}
</div>
<div id="cloudtag">
{loop="tags"}
<a href="?searchtags={$key|urlencode} {$search_tags|urlencode}" style="font-size:{$value.size}em;">{$key}</a
><a href="?addtag={$key|urlencode}" title="{'Filter by tag'|t}" class="count">{$value.count}</a>
{loop="$value.tag_plugin"}
{$value}
{/loop}
{/loop}
</div>
<div id="plugin_zone_end_tagcloud" class="plugin_zone">
{loop="$plugin_end_zone"}
{$value}
{/loop}
</div>
</div>
</div>
{include="tag.sort"}
{include="page.footer"}
</body>
</html>

View File

@ -0,0 +1,89 @@
<!DOCTYPE html>
<html>
<head>
{include="includes"}
</head>
<body>
{include="page.header"}
{include="tag.sort"}
<div class="pure-g">
<div class="pure-u-lg-1-6 pure-u-1-24"></div>
<div class="pure-u-lg-2-3 pure-u-22-24 page-form page-visitor">
{$countTags=count($tags)}
<h2 class="window-title">{'Tag list'|t} - {$countTags} {'tags'|t}</h2>
{if="!empty($search_tags)"}
<p class="center">
<a href="?searchtags={$search_tags|urlencode}">{'List all links with those tags'|t}</a>
</p>
{/if}
<div id="search-tagcloud" class="pure-g">
<div class="pure-u-lg-1-4"></div>
<div class="pure-u-1 pure-u-lg-1-2">
<form method="GET">
<input type="hidden" name="do" value="taglist">
<input type="text" name="searchtags" placeholder="{'Filter by tag'|t}"
{if="!empty($search_tags)"}
value="{$search_tags}"
{/if}
autocomplete="off" data-multiple data-autofirst data-minChars="1"
data-list="{loop="$tags"}{$key}, {/loop}"
>
<button type="submit" class="search-button"><i class="fa fa-search"></i></button>
</form>
</div>
<div class="pure-u-lg-1-4"></div>
</div>
<div id="plugin_zone_start_tagcloud" class="plugin_zone">
{loop="$plugin_start_zone"}
{$value}
{/loop}
</div>
<div id="taglist">
{loop="tags"}
<div class="tag-list-item pure-g" data-tag="{$key}">
<div class="pure-u-1">
{if="isLoggedIn()===true"}
<a href="#" class="delete-tag"><i class="fa fa-trash"></i></a>&nbsp;&nbsp;
<a href="?do=changetag&fromtag={$key|urlencode}" class="rename-tag">
<i class="fa fa-pencil-square-o {$key}"></i>
</a>
{/if}
<a href="?addtag={$key|urlencode}" title="{'Filter by tag'|t}" class="count">{$value}</a>
<a href="?searchtags={$key|urlencode} {$search_tags|urlencode}" class="tag-link">{$key}</a>
{loop="$value.tag_plugin"}
{$value}
{/loop}
</div>
{if="isLoggedIn()===true"}
<div class="rename-tag-form pure-u-1">
<input type="text" name="{$key}" value="{$key}" class="rename-tag-input" />
<a href="#" class="validate-rename-tag"><i class="fa fa-check"></i></a>
</div>
{/if}
</div>
{/loop}
</div>
<div id="plugin_zone_end_tagcloud" class="plugin_zone">
{loop="$plugin_end_zone"}
{$value}
{/loop}
</div>
</div>
</div>
{if="isLoggedIn()===true"}
<input type="hidden" name="taglist" value="{loop="$tags"}{$key} {/loop}"
{/if}
{include="page.footer"}
</body>
</html>

View File

@ -0,0 +1,8 @@
<div class="pure-g">
<div class="pure-u-1 pure-alert pure-alert-success tag-sort">
{'Sort by:'|t}
<a href="?do=tagcloud" title="cloud">{'Cloud'|t}</a> &middot;
<a href="?do=taglist&sort=usage" title="cloud">{'Most used'|t}</a> &middot;
<a href="?do=taglist&sort=alpha" title="cloud">{'Alphabetical'|t}</a>
</div>
</div>