aboutsummaryrefslogtreecommitdiffhomepage
path: root/assets
diff options
context:
space:
mode:
authorArthurHoaro <arthur@hoa.ro>2018-02-24 18:18:33 +0100
committerArthurHoaro <arthur@hoa.ro>2018-03-28 19:01:17 +0200
commitb3375c7f86f35fce723185bb76d3b5f9c4ff7a07 (patch)
tree9add15148b2efbfa6dc25a883769f33da60f70a5 /assets
parent9b2bd66fb60ffd5a833480bf329062c7d57bc8c4 (diff)
downloadShaarli-b3375c7f86f35fce723185bb76d3b5f9c4ff7a07.tar.gz
Shaarli-b3375c7f86f35fce723185bb76d3b5f9c4ff7a07.tar.zst
Shaarli-b3375c7f86f35fce723185bb76d3b5f9c4ff7a07.zip
Webpack / Remove frontend dependencies from tpl/ & inc/ and move them to assets/
Diffstat (limited to 'assets')
-rw-r--r--assets/.htaccess13
-rw-r--r--assets/default/fonts/Roboto-Bold.woffbin0 -> 89584 bytes
-rw-r--r--assets/default/fonts/Roboto-Bold.woff2bin0 -> 63320 bytes
-rw-r--r--assets/default/fonts/Roboto-Regular.woffbin0 -> 89732 bytes
-rw-r--r--assets/default/fonts/Roboto-Regular.woff2bin0 -> 63412 bytes
-rw-r--r--assets/default/img/apple-touch-icon.pngbin0 -> 18276 bytes
-rw-r--r--assets/default/img/favicon.pngbin0 -> 41600 bytes
-rw-r--r--assets/default/img/icon.pngbin0 -> 530 bytes
-rw-r--r--assets/default/img/sad_star.pngbin0 -> 7099 bytes
-rw-r--r--assets/default/js/base.js664
-rw-r--r--assets/default/js/plugins-admin.js103
-rw-r--r--assets/default/scss/shaarli.scss1353
-rw-r--r--assets/vintage/css/reset.css6
-rw-r--r--assets/vintage/css/shaarli.css1212
-rw-r--r--assets/vintage/img/50pc_transparent.pngbin0 -> 599 bytes
-rw-r--r--assets/vintage/img/Paper_texture_v5_by_bashcorpo_w1000.jpgbin0 -> 127449 bytes
-rw-r--r--assets/vintage/img/calendar.pngbin0 -> 650 bytes
-rw-r--r--assets/vintage/img/delete_icon.pngbin0 -> 302 bytes
-rw-r--r--assets/vintage/img/edit_icon.pngbin0 -> 1548 bytes
-rw-r--r--assets/vintage/img/favicon.icobin0 -> 76949 bytes
-rw-r--r--assets/vintage/img/feed-icon-14x14.pngbin0 -> 658 bytes
-rw-r--r--assets/vintage/img/floral_left.pngbin0 -> 1284 bytes
-rw-r--r--assets/vintage/img/floral_right.pngbin0 -> 1309 bytes
-rw-r--r--assets/vintage/img/logo.pngbin0 -> 5456 bytes
-rw-r--r--assets/vintage/img/private.pngbin0 -> 813 bytes
-rw-r--r--assets/vintage/img/private_16x16.pngbin0 -> 679 bytes
-rw-r--r--assets/vintage/img/private_16x16_active.pngbin0 -> 648 bytes
-rw-r--r--assets/vintage/img/squiggle.pngbin0 -> 720 bytes
-rw-r--r--assets/vintage/img/squiggle_closing.pngbin0 -> 1244 bytes
-rw-r--r--assets/vintage/img/tag_blue.pngbin0 -> 714 bytes
-rw-r--r--assets/vintage/js/base.js32
31 files changed, 3383 insertions, 0 deletions
diff --git a/assets/.htaccess b/assets/.htaccess
new file mode 100644
index 00000000..f601c1ee
--- /dev/null
+++ b/assets/.htaccess
@@ -0,0 +1,13 @@
1<IfModule version_module>
2 <IfVersion >= 2.4>
3 Require all denied
4 </IfVersion>
5 <IfVersion < 2.4>
6 Allow from none
7 Deny from all
8 </IfVersion>
9</IfModule>
10
11<IfModule !version_module>
12 Require all denied
13</IfModule>
diff --git a/assets/default/fonts/Roboto-Bold.woff b/assets/default/fonts/Roboto-Bold.woff
new file mode 100644
index 00000000..3d86753b
--- /dev/null
+++ b/assets/default/fonts/Roboto-Bold.woff
Binary files differ
diff --git a/assets/default/fonts/Roboto-Bold.woff2 b/assets/default/fonts/Roboto-Bold.woff2
new file mode 100644
index 00000000..bd05e2ea
--- /dev/null
+++ b/assets/default/fonts/Roboto-Bold.woff2
Binary files differ
diff --git a/assets/default/fonts/Roboto-Regular.woff b/assets/default/fonts/Roboto-Regular.woff
new file mode 100644
index 00000000..464d2062
--- /dev/null
+++ b/assets/default/fonts/Roboto-Regular.woff
Binary files differ
diff --git a/assets/default/fonts/Roboto-Regular.woff2 b/assets/default/fonts/Roboto-Regular.woff2
new file mode 100644
index 00000000..f9661967
--- /dev/null
+++ b/assets/default/fonts/Roboto-Regular.woff2
Binary files differ
diff --git a/assets/default/img/apple-touch-icon.png b/assets/default/img/apple-touch-icon.png
new file mode 100644
index 00000000..f29210ce
--- /dev/null
+++ b/assets/default/img/apple-touch-icon.png
Binary files differ
diff --git a/assets/default/img/favicon.png b/assets/default/img/favicon.png
new file mode 100644
index 00000000..4644321b
--- /dev/null
+++ b/assets/default/img/favicon.png
Binary files differ
diff --git a/assets/default/img/icon.png b/assets/default/img/icon.png
new file mode 100644
index 00000000..474edec3
--- /dev/null
+++ b/assets/default/img/icon.png
Binary files differ
diff --git a/assets/default/img/sad_star.png b/assets/default/img/sad_star.png
new file mode 100644
index 00000000..ed3bd158
--- /dev/null
+++ b/assets/default/img/sad_star.png
Binary files differ
diff --git a/assets/default/js/base.js b/assets/default/js/base.js
new file mode 100644
index 00000000..cf628e87
--- /dev/null
+++ b/assets/default/js/base.js
@@ -0,0 +1,664 @@
1/** @licstart The following is the entire license notice for the
2 * JavaScript code in this page.
3 *
4 * Copyright: (c) 2011-2015 Sébastien SAUVAGE <sebsauvage@sebsauvage.net>
5 * (c) 2011-2017 The Shaarli Community, see AUTHORS
6 *
7 * This software is provided 'as-is', without any express or implied warranty.
8 * In no event will the authors be held liable for any damages arising from
9 * the use of this software.
10 *
11 * Permission is granted to anyone to use this software for any purpose,
12 * including commercial applications, and to alter it and redistribute it
13 * freely, subject to the following restrictions:
14 *
15 * 1. The origin of this software must not be misrepresented; you must not
16 * claim that you wrote the original software. If you use this software
17 * in a product, an acknowledgment in the product documentation would
18 * be appreciated but is not required.
19 *
20 * 2. Altered source versions must be plainly marked as such, and must
21 * not be misrepresented as being the original software.
22 *
23 * 3. This notice may not be removed or altered from any source distribution.
24 *
25 * @licend The above is the entire license notice
26 * for the JavaScript code in this page.
27 */
28
29window.onload = function () {
30
31 /**
32 * Retrieve an element up in the tree from its class name.
33 */
34 function getParentByClass(el, className) {
35 var p = el.parentNode;
36 if (p == null || p.classList.contains(className)) {
37 return p;
38 }
39 return getParentByClass(p, className);
40 }
41
42
43 /**
44 * Handle responsive menu.
45 * Source: http://purecss.io/layouts/tucked-menu-vertical/
46 */
47 (function (window, document) {
48 var menu = document.getElementById('shaarli-menu'),
49 WINDOW_CHANGE_EVENT = ('onorientationchange' in window) ? 'orientationchange':'resize';
50
51 function toggleHorizontal() {
52 [].forEach.call(
53 document.getElementById('shaarli-menu').querySelectorAll('.menu-transform'),
54 function(el){
55 el.classList.toggle('pure-menu-horizontal');
56 }
57 );
58 };
59
60 function toggleMenu() {
61 // set timeout so that the panel has a chance to roll up
62 // before the menu switches states
63 if (menu.classList.contains('open')) {
64 setTimeout(toggleHorizontal, 500);
65 }
66 else {
67 toggleHorizontal();
68 }
69 menu.classList.toggle('open');
70 document.getElementById('menu-toggle').classList.toggle('x');
71 };
72
73 function closeMenu() {
74 if (menu.classList.contains('open')) {
75 toggleMenu();
76 }
77 }
78
79 var menuToggle = document.getElementById('menu-toggle');
80 if (menuToggle != null) {
81 menuToggle.addEventListener('click', function (e) {
82 toggleMenu();
83 });
84 }
85
86 window.addEventListener(WINDOW_CHANGE_EVENT, closeMenu);
87 })(this, this.document);
88
89 /**
90 * Fold/Expand shaares description and thumbnail.
91 */
92 var foldAllButtons = document.getElementsByClassName('fold-all');
93 var foldButtons = document.getElementsByClassName('fold-button');
94
95 [].forEach.call(foldButtons, function (foldButton) {
96 // Retrieve description
97 var description = null;
98 var thumbnail = null;
99 var linklistItem = getParentByClass(foldButton, 'linklist-item');
100 if (linklistItem != null) {
101 description = linklistItem.querySelector('.linklist-item-description');
102 thumbnail = linklistItem.querySelector('.linklist-item-thumbnail');
103 if (description != null || thumbnail != null) {
104 foldButton.style.display = 'inline';
105 }
106 }
107
108 foldButton.addEventListener('click', function (event) {
109 event.preventDefault();
110 toggleFold(event.target, description, thumbnail);
111 });
112 });
113
114 if (foldAllButtons != null) {
115 [].forEach.call(foldAllButtons, function (foldAllButton) {
116 foldAllButton.addEventListener('click', function (event) {
117 event.preventDefault();
118 var state = foldAllButton.firstElementChild.getAttribute('class').indexOf('down') != -1 ? 'down' : 'up';
119 [].forEach.call(foldButtons, function (foldButton) {
120 if (foldButton.firstElementChild.classList.contains('fa-chevron-up') && state == 'down'
121 || foldButton.firstElementChild.classList.contains('fa-chevron-down') && state == 'up'
122 ) {
123 return;
124 }
125 // Retrieve description
126 var description = null;
127 var thumbnail = null;
128 var linklistItem = getParentByClass(foldButton, 'linklist-item');
129 if (linklistItem != null) {
130 description = linklistItem.querySelector('.linklist-item-description');
131 thumbnail = linklistItem.querySelector('.linklist-item-thumbnail');
132 if (description != null || thumbnail != null) {
133 foldButton.style.display = 'inline';
134 }
135 }
136
137 toggleFold(foldButton.firstElementChild, description, thumbnail);
138 });
139 foldAllButton.firstElementChild.classList.toggle('fa-chevron-down');
140 foldAllButton.firstElementChild.classList.toggle('fa-chevron-up');
141 foldAllButton.title = state === 'down'
142 ? document.getElementById('translation-fold-all').innerHTML
143 : document.getElementById('translation-expand-all').innerHTML
144 });
145 });
146 }
147
148 function toggleFold(button, description, thumb)
149 {
150 // Switch fold/expand - up = fold
151 if (button.classList.contains('fa-chevron-up')) {
152 button.title = document.getElementById('translation-expand').innerHTML;
153 if (description != null) {
154 description.style.display = 'none';
155 }
156 if (thumb != null) {
157 thumb.style.display = 'none';
158 }
159 }
160 else {
161 button.title = document.getElementById('translation-fold').innerHTML;
162 if (description != null) {
163 description.style.display = 'block';
164 }
165 if (thumb != null) {
166 thumb.style.display = 'block';
167 }
168 }
169 button.classList.toggle('fa-chevron-down');
170 button.classList.toggle('fa-chevron-up');
171 }
172
173 /**
174 * Confirmation message before deletion.
175 */
176 var deleteLinks = document.querySelectorAll('.confirm-delete');
177 [].forEach.call(deleteLinks, function(deleteLink) {
178 deleteLink.addEventListener('click', function(event) {
179 if(! confirm(document.getElementById('translation-delete-link').innerHTML)) {
180 event.preventDefault();
181 }
182 });
183 });
184
185 /**
186 * Close alerts
187 */
188 var closeLinks = document.querySelectorAll('.pure-alert-close');
189 [].forEach.call(closeLinks, function(closeLink) {
190 closeLink.addEventListener('click', function(event) {
191 var alert = getParentByClass(event.target, 'pure-alert-closable');
192 alert.style.display = 'none';
193 });
194 });
195
196 /**
197 * New version dismiss.
198 * Hide the message for one week using localStorage.
199 */
200 var newVersionDismiss = document.getElementById('new-version-dismiss');
201 var newVersionMessage = document.querySelector('.new-version-message');
202 if (newVersionMessage != null
203 && localStorage.getItem('newVersionDismiss') != null
204 && parseInt(localStorage.getItem('newVersionDismiss')) + 7*24*60*60*1000 > (new Date()).getTime()
205 ) {
206 newVersionMessage.style.display = 'none';
207 }
208 if (newVersionDismiss != null) {
209 newVersionDismiss.addEventListener('click', function () {
210 localStorage.setItem('newVersionDismiss', (new Date()).getTime());
211 });
212 }
213
214 var hiddenReturnurl = document.getElementsByName('returnurl');
215 if (hiddenReturnurl != null) {
216 hiddenReturnurl.value = window.location.href;
217 }
218
219 /**
220 * Autofocus text fields
221 */
222 var autofocusElements = document.querySelectorAll('.autofocus');
223 var breakLoop = false;
224 [].forEach.call(autofocusElements, function(autofocusElement) {
225 if (autofocusElement.value == '' && ! breakLoop) {
226 autofocusElement.focus();
227 breakLoop = true;
228 }
229 });
230
231 /**
232 * Handle sub menus/forms
233 */
234 var openers = document.getElementsByClassName('subheader-opener');
235 if (openers != null) {
236 [].forEach.call(openers, function(opener) {
237 opener.addEventListener('click', function(event) {
238 event.preventDefault();
239
240 var id = opener.getAttribute('data-open-id');
241 var sub = document.getElementById(id);
242
243 if (sub != null) {
244 [].forEach.call(document.getElementsByClassName('subheader-form'), function (element) {
245 if (element != sub) {
246 removeClass(element, 'open')
247 }
248 });
249
250 sub.classList.toggle('open');
251 }
252 });
253 });
254 }
255
256 function removeClass(element, classname) {
257 element.className = element.className.replace(new RegExp('(?:^|\\s)'+ classname + '(?:\\s|$)'), ' ');
258 }
259
260 /**
261 * Remove CSS target padding (for fixed bar)
262 */
263 if (location.hash != '') {
264 var anchor = document.getElementById(location.hash.substr(1));
265 if (anchor != null) {
266 var padsize = anchor.clientHeight;
267 this.window.scroll(0, this.window.scrollY - padsize);
268 anchor.style.paddingTop = 0;
269 }
270 }
271
272 /**
273 * Text area resizer
274 */
275 var description = document.getElementById('lf_description');
276 var observe = function (element, event, handler) {
277 element.addEventListener(event, handler, false);
278 };
279 function init () {
280 function resize () {
281 /* Fix jumpy resizing: https://stackoverflow.com/a/18262927/1484919 */
282 var scrollTop = window.pageYOffset ||
283 (document.documentElement || document.body.parentNode || document.body).scrollTop;
284
285 description.style.height = 'auto';
286 description.style.height = description.scrollHeight+10+'px';
287
288 window.scrollTo(0, scrollTop);
289 }
290 /* 0-timeout to get the already changed text */
291 function delayedResize () {
292 window.setTimeout(resize, 0);
293 }
294 observe(description, 'change', resize);
295 observe(description, 'cut', delayedResize);
296 observe(description, 'paste', delayedResize);
297 observe(description, 'drop', delayedResize);
298 observe(description, 'keydown', delayedResize);
299
300 resize();
301 }
302
303 if (description != null) {
304 init();
305 // Submit editlink form with CTRL + Enter in the text area.
306 description.addEventListener('keydown', function (event) {
307 if (event.ctrlKey && event.keyCode === 13) {
308 document.getElementById('button-save-edit').click();
309 }
310 });
311 }
312
313 /**
314 * Awesomplete trigger.
315 */
316 var tags = document.getElementById('lf_tags');
317 if (tags != null) {
318 awesompleteUniqueTag('#lf_tags');
319 }
320
321 /**
322 * bLazy trigger
323 */
324 var picwall = document.getElementById('picwall_container');
325 if (picwall != null) {
326 var bLazy = new Blazy();
327 }
328
329 /**
330 * Bookmarklet alert
331 */
332 var bookmarkletLinks = document.querySelectorAll('.bookmarklet-link');
333 var bkmMessage = document.getElementById('bookmarklet-alert');
334 [].forEach.call(bookmarkletLinks, function(link) {
335 link.addEventListener('click', function(event) {
336 event.preventDefault();
337 alert(bkmMessage.value);
338 });
339 });
340
341 /**
342 * Firefox Social
343 */
344 var ffButton = document.getElementById('ff-social-button');
345 if (ffButton != null) {
346 ffButton.addEventListener('click', function(event) {
347 activateFirefoxSocial(event.target);
348 });
349 }
350
351 /**
352 * Plugin admin order
353 */
354 var orderPA = document.querySelectorAll('.order');
355 [].forEach.call(orderPA, function(link) {
356 link.addEventListener('click', function(event) {
357 event.preventDefault();
358 if (event.target.classList.contains('order-up')) {
359 return orderUp(event.target.parentNode.parentNode.getAttribute('data-order'));
360 } else if (event.target.classList.contains('order-down')) {
361 return orderDown(event.target.parentNode.parentNode.getAttribute('data-order'));
362 }
363 });
364 });
365
366 var continent = document.getElementById('continent');
367 var city = document.getElementById('city');
368 if (continent != null && city != null) {
369 continent.addEventListener('change', function (event) {
370 hideTimezoneCities(city, continent.options[continent.selectedIndex].value, true);
371 });
372 hideTimezoneCities(city, continent.options[continent.selectedIndex].value, false);
373 }
374
375 /**
376 * Bulk actions
377 */
378 var linkCheckboxes = document.querySelectorAll('.delete-checkbox');
379 var bar = document.getElementById('actions');
380 [].forEach.call(linkCheckboxes, function(checkbox) {
381 checkbox.style.display = 'inline-block';
382 checkbox.addEventListener('click', function(event) {
383 var count = 0;
384 var linkCheckedCheckboxes = document.querySelectorAll('.delete-checkbox:checked');
385 [].forEach.call(linkCheckedCheckboxes, function(checkbox) {
386 count++;
387 });
388 if (count == 0 && bar.classList.contains('open')) {
389 bar.classList.toggle('open');
390 } else if (count > 0 && ! bar.classList.contains('open')) {
391 bar.classList.toggle('open');
392 }
393 });
394 });
395
396 var deleteButton = document.getElementById('actions-delete');
397 var token = document.querySelector('input[type="hidden"][name="token"]');
398 if (deleteButton != null && token != null) {
399 deleteButton.addEventListener('click', function(event) {
400 event.preventDefault();
401
402 var links = [];
403 var linkCheckedCheckboxes = document.querySelectorAll('.delete-checkbox:checked');
404 [].forEach.call(linkCheckedCheckboxes, function(checkbox) {
405 links.push({
406 'id': checkbox.value,
407 'title': document.querySelector('.linklist-item[data-id="'+ checkbox.value +'"] .linklist-link').innerHTML
408 });
409 });
410
411 var message = 'Are you sure you want to delete '+ links.length +' links?\n';
412 message += 'This action is IRREVERSIBLE!\n\nTitles:\n';
413 var ids = [];
414 links.forEach(function(item) {
415 message += ' - '+ item['title'] +'\n';
416 ids.push(item['id']);
417 });
418
419 if (window.confirm(message)) {
420 window.location = '?delete_link&lf_linkdate='+ ids.join('+') +'&token='+ token.value;
421 }
422 });
423 }
424
425 /**
426 * Tag list operations
427 *
428 * TODO: support error code in the backend for AJAX requests
429 */
430 var tagList = document.querySelector('input[name="taglist"]');
431 var existingTags = tagList ? tagList.value.split(' ') : [];
432 var awesomepletes = [];
433
434 // Display/Hide rename form
435 var renameTagButtons = document.querySelectorAll('.rename-tag');
436 [].forEach.call(renameTagButtons, function(rename) {
437 rename.addEventListener('click', function(event) {
438 event.preventDefault();
439 var block = findParent(event.target, 'div', {'class': 'tag-list-item'});
440 var form = block.querySelector('.rename-tag-form');
441 if (form.style.display == 'none' || form.style.display == '') {
442 form.style.display = 'block';
443 } else {
444 form.style.display = 'none';
445 }
446 block.querySelector('input').focus();
447 });
448 });
449
450 // Rename a tag with an AJAX request
451 var renameTagSubmits = document.querySelectorAll('.validate-rename-tag');
452 [].forEach.call(renameTagSubmits, function(rename) {
453 rename.addEventListener('click', function(event) {
454 event.preventDefault();
455 var block = findParent(event.target, 'div', {'class': 'tag-list-item'});
456 var input = block.querySelector('.rename-tag-input');
457 var totag = input.value.replace('/"/g', '\\"');
458 if (totag.trim() == '') {
459 return;
460 }
461 var fromtag = block.getAttribute('data-tag');
462 var token = document.getElementById('token').value;
463
464 xhr = new XMLHttpRequest();
465 xhr.open('POST', '?do=changetag');
466 xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
467 xhr.onload = function() {
468 if (xhr.status !== 200) {
469 alert('An error occurred. Return code: '+ xhr.status);
470 location.reload();
471 } else {
472 block.setAttribute('data-tag', totag);
473 input.setAttribute('name', totag);
474 input.setAttribute('value', totag);
475 findParent(input, 'div', {'class': 'rename-tag-form'}).style.display = 'none';
476 block.querySelector('a.tag-link').innerHTML = htmlEntities(totag);
477 block.querySelector('a.tag-link').setAttribute('href', '?searchtags='+ encodeURIComponent(totag));
478 block.querySelector('a.rename-tag').setAttribute('href', '?do=changetag&fromtag='+ encodeURIComponent(totag));
479
480 // Refresh awesomplete values
481 for (var key in existingTags) {
482 if (existingTags[key] == fromtag) {
483 existingTags[key] = totag;
484 }
485 }
486 awesomepletes = updateAwesompleteList('.rename-tag-input', existingTags, awesomepletes);
487 }
488 };
489 xhr.send('renametag=1&fromtag='+ encodeURIComponent(fromtag) +'&totag='+ encodeURIComponent(totag) +'&token='+ token);
490 refreshToken();
491 });
492 });
493
494 // Validate input with enter key
495 var renameTagInputs = document.querySelectorAll('.rename-tag-input');
496 [].forEach.call(renameTagInputs, function(rename) {
497
498 rename.addEventListener('keypress', function(event) {
499 if (event.keyCode === 13) { // enter
500 findParent(event.target, 'div', {'class': 'tag-list-item'}).querySelector('.validate-rename-tag').click();
501 }
502 });
503 });
504
505 // Delete a tag with an AJAX query (alert popup confirmation)
506 var deleteTagButtons = document.querySelectorAll('.delete-tag');
507 [].forEach.call(deleteTagButtons, function(rename) {
508 rename.style.display = 'inline';
509 rename.addEventListener('click', function(event) {
510 event.preventDefault();
511 var block = findParent(event.target, 'div', {'class': 'tag-list-item'});
512 var tag = block.getAttribute('data-tag');
513 var token = document.getElementById('token').value;
514
515 if (confirm('Are you sure you want to delete the tag "'+ tag +'"?')) {
516 xhr = new XMLHttpRequest();
517 xhr.open('POST', '?do=changetag');
518 xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
519 xhr.onload = function() {
520 block.remove();
521 };
522 xhr.send(encodeURI('deletetag=1&fromtag='+ tag +'&token='+ token));
523 refreshToken();
524 }
525 });
526 });
527
528 updateAwesompleteList('.rename-tag-input', existingTags, awesomepletes);
529};
530
531/**
532 * Find a parent element according to its tag and its attributes
533 *
534 * @param element Element where to start the search
535 * @param tagName Expected parent tag name
536 * @param attributes Associative array of expected attributes (name=>value).
537 *
538 * @returns Found element or null.
539 */
540function findParent(element, tagName, attributes)
541{
542 while (element) {
543 if (element.tagName.toLowerCase() == tagName) {
544 var match = true;
545 for (var key in attributes) {
546 if (! element.hasAttribute(key)
547 || (attributes[key] != '' && element.getAttribute(key).indexOf(attributes[key]) == -1)
548 ) {
549 match = false;
550 break;
551 }
552 }
553
554 if (match) {
555 return element;
556 }
557 }
558 element = element.parentElement;
559 }
560 return null;
561}
562
563/**
564 * Ajax request to refresh the CSRF token.
565 */
566function refreshToken()
567{
568 var xhr = new XMLHttpRequest();
569 xhr.open('GET', '?do=token');
570 xhr.onload = function() {
571 var token = document.getElementById('token');
572 token.setAttribute('value', xhr.responseText);
573 };
574 xhr.send();
575}
576
577/**
578 * Update awesomplete list of tag for all elements matching the given selector
579 *
580 * @param selector CSS selector
581 * @param tags Array of tags
582 * @param instances List of existing awesomplete instances
583 */
584function updateAwesompleteList(selector, tags, instances)
585{
586 // First load: create Awesomplete instances
587 if (instances.length == 0) {
588 var elements = document.querySelectorAll(selector);
589 [].forEach.call(elements, function (element) {
590 instances.push(new Awesomplete(
591 element,
592 {'list': tags}
593 ));
594 });
595 } else {
596 // Update awesomplete tag list
597 for (var key in instances) {
598 instances[key].list = tags;
599 }
600 }
601 return instances;
602}
603
604/**
605 * html_entities in JS
606 *
607 * @see http://stackoverflow.com/questions/18749591/encode-html-entities-in-javascript
608 */
609function htmlEntities(str)
610{
611 return str.replace(/[\u00A0-\u9999<>\&]/gim, function(i) {
612 return '&#'+i.charCodeAt(0)+';';
613 });
614}
615
616function activateFirefoxSocial(node) {
617 var loc = location.href;
618 var baseURL = loc.substring(0, loc.lastIndexOf("/") + 1);
619 var title = document.title;
620
621 // Keeping the data separated (ie. not in the DOM) so that it's maintainable and diffable.
622 var data = {
623 name: title,
624 description: document.getElementById('translation-delete-link').innerHTML,
625 author: "Shaarli",
626 version: "1.0.0",
627
628 iconURL: baseURL + "/images/favicon.ico",
629 icon32URL: baseURL + "/images/favicon.ico",
630 icon64URL: baseURL + "/images/favicon.ico",
631
632 shareURL: baseURL + "?post=%{url}&title=%{title}&description=%{text}&source=firefoxsocialapi",
633 homepageURL: baseURL
634 };
635 node.setAttribute("data-service", JSON.stringify(data));
636
637 var activate = new CustomEvent("ActivateSocialFeature");
638 node.dispatchEvent(activate);
639}
640
641/**
642 * Add the class 'hidden' to city options not attached to the current selected continent.
643 *
644 * @param cities List of <option> elements
645 * @param currentContinent Current selected continent
646 * @param reset Set to true to reset the selected value
647 */
648function hideTimezoneCities(cities, currentContinent) {
649 var first = true;
650 if (reset == null) {
651 reset = false;
652 }
653 [].forEach.call(cities, function (option) {
654 if (option.getAttribute('data-continent') != currentContinent) {
655 option.className = 'hidden';
656 } else {
657 option.className = '';
658 if (reset === true && first === true) {
659 option.setAttribute('selected', 'selected');
660 first = false;
661 }
662 }
663 });
664}
diff --git a/assets/default/js/plugins-admin.js b/assets/default/js/plugins-admin.js
new file mode 100644
index 00000000..4b55e0f3
--- /dev/null
+++ b/assets/default/js/plugins-admin.js
@@ -0,0 +1,103 @@
1/** @licstart The following is the entire license notice for the
2 * JavaScript code in this page.
3 *
4 * Copyright: (c) 2011-2015 Sébastien SAUVAGE <sebsauvage@sebsauvage.net>
5 * (c) 2011-2017 The Shaarli Community, see AUTHORS
6 *
7 * This software is provided 'as-is', without any express or implied warranty.
8 * In no event will the authors be held liable for any damages arising from
9 * the use of this software.
10 *
11 * Permission is granted to anyone to use this software for any purpose,
12 * including commercial applications, and to alter it and redistribute it
13 * freely, subject to the following restrictions:
14 *
15 * 1. The origin of this software must not be misrepresented; you must not
16 * claim that you wrote the original software. If you use this software
17 * in a product, an acknowledgment in the product documentation would
18 * be appreciated but is not required.
19 *
20 * 2. Altered source versions must be plainly marked as such, and must
21 * not be misrepresented as being the original software.
22 *
23 * 3. This notice may not be removed or altered from any source distribution.
24 *
25 * @licend The above is the entire license notice
26 * for the JavaScript code in this page.
27 */
28
29/**
30 * Change the position counter of a row.
31 *
32 * @param elem Element Node to change.
33 * @param toPos int New position.
34 */
35function changePos(elem, toPos)
36{
37 var elemName = elem.getAttribute('data-line')
38
39 elem.setAttribute('data-order', toPos);
40 var hiddenInput = document.querySelector('[name="order_'+ elemName +'"]');
41 hiddenInput.setAttribute('value', toPos);
42}
43
44/**
45 * Move a row up or down.
46 *
47 * @param pos Element Node to move.
48 * @param move int Move: +1 (down) or -1 (up)
49 */
50function changeOrder(pos, move)
51{
52 var newpos = parseInt(pos) + move;
53 var lines = document.querySelectorAll('[data-order="'+ pos +'"]');
54 var changelines = document.querySelectorAll('[data-order="'+ newpos +'"]');
55
56 // If we go down reverse lines to preserve the rows order
57 if (move > 0) {
58 lines = [].slice.call(lines).reverse();
59 }
60
61 for (var i = 0 ; i < lines.length ; i++) {
62 var parent = changelines[0].parentNode;
63 changePos(lines[i], newpos);
64 changePos(changelines[i], parseInt(pos));
65 var changeItem = move < 0 ? changelines[0] : changelines[changelines.length - 1].nextSibling;
66 parent.insertBefore(lines[i], changeItem);
67 }
68
69}
70
71/**
72 * Move a row up in the table.
73 *
74 * @param pos int row counter.
75 *
76 * @returns false
77 */
78function orderUp(pos)
79{
80 if (pos == 0) {
81 return false;
82 }
83 changeOrder(pos, -1);
84 return false;
85}
86
87/**
88 * Move a row down in the table.
89 *
90 * @param pos int row counter.
91 *
92 * @returns false
93 */
94function orderDown(pos)
95{
96 var lastpos = document.querySelector('[data-order]:last-child').getAttribute('data-order');
97 if (pos == lastpos) {
98 return false;
99 }
100
101 changeOrder(pos, +1);
102 return false;
103}
diff --git a/assets/default/scss/shaarli.scss b/assets/default/scss/shaarli.scss
new file mode 100644
index 00000000..1e07a88e
--- /dev/null
+++ b/assets/default/scss/shaarli.scss
@@ -0,0 +1,1353 @@
1/**
2 * General
3 */
4body {
5 background: #d0d0d0;
6}
7
8.strong {
9 font-weight: bold;
10}
11
12.clear {
13 clear: both;
14}
15
16.center {
17 text-align: center;
18 margin: auto;
19}
20
21.label {
22 display: inline-block;
23 padding: .25em .4em;
24 font-size: 75%;
25 font-weight: 700;
26 line-height: 1;
27 text-align: center;
28 white-space: nowrap;
29 vertical-align: baseline;
30 border-radius: .25rem;
31}
32
33pre {
34 max-width: 100%;
35}
36
37@font-face {
38 font-family: 'Roboto';
39 font-weight: 400;
40 font-style: normal;
41 src:
42 local('Roboto'),
43 local('Roboto-Regular'),
44 url('../fonts/Roboto-Regular.woff2') format('woff2'),
45 url('../fonts/Roboto-Regular.woff') format('woff');
46}
47
48@font-face {
49 font-family: 'Roboto';
50 font-weight: 700;
51 font-style: normal;
52 src:
53 local('Roboto'),
54 local('Roboto-Bold'),
55 url('../fonts/Roboto-Bold.woff2') format('woff2'),
56 url('../fonts/Roboto-Bold.woff') format('woff');
57}
58
59body, .pure-g [class*="pure-u"] {
60 font-family: Roboto, Arial, sans-serif;
61}
62
63/**
64 * Extends Pure grids responsive to hide items.
65 * Use xx-0 to hide an item on xx screen.
66 * Display it at any level with xx-visible.
67 */
68.pure-u-0 { display: none !important; }
69@media screen and (min-width: 35.5em) {
70 .pure-u-sm-0 { display: none !important; }
71 .pure-u-sm-visible { display: inline-block !important; }
72}
73@media screen and (min-width: 48em) {
74 .pure-u-md-0 { display: none !important; }
75 .pure-u-md-visible { display: inline-block !important; }
76}
77@media screen and (min-width: 64em) {
78 .pure-u-lg-0 { display: none !important; }
79 .pure-u-lg-visible { display: inline-block !important; }
80}
81@media screen and (min-width: 80em) {
82 .pure-u-xl-0 { display: none !important; }
83 .pure-u-xl-visible { display: inline-block !important; }
84}
85
86/**
87 * Make pure-extras alert closable.
88 */
89.pure-alert-closable .fa-times {
90 float: right;
91}
92.pure-alert-close {
93 cursor: pointer;
94}
95
96.pure-alert-success {
97 background-color: #1b926c;
98}
99
100.anchor:target {
101 padding-top: 40px;
102}
103/**
104 * MENU
105 **/
106.shaarli-menu {
107 position: fixed;
108 top: 0;
109 width: 100%;
110 --height: 50px;
111 background: #1b926c;
112 -webkit-font-smoothing: antialiased;
113 /* Hack to transition with auto height: http://stackoverflow.com/a/8331169/1484919 */
114 max-height: 45px;
115 transition: max-height 0.5s;
116 overflow: hidden;
117 z-index: 999;
118}
119
120/* Chrome bugfix: with 100% height, it only displays the first element. */
121.pure-menu-item {
122 height: 45px;
123}
124
125.shaarli-menu.open {
126 max-height: 500px;
127 transition: max-height 0.75s;
128}
129
130.head-logo {
131 float: left;
132 margin: 0 5px 0 0;
133}
134
135.pure-menu-link,
136.pure-menu-link:visited,
137.pure-menu-selected .pure-menu-link,
138.pure-menu-selected .pure-menu-link:visited {
139 padding: 0.8em 1em;
140 color: #f5f5f5;
141}
142
143.pure-menu-link:hover, .pure-menu-link:focus,
144.pure-menu-selected .pure-menu-link:hover,
145.pure-menu-selected .pure-menu-link:focus {
146 color: #fff;
147 background: transparent;
148}
149
150.pure-menu-item:hover::after {
151 margin: -4px auto 0 auto;
152 display: block;
153 content:"";
154 background: #fff;
155 height: 4px;
156 width: 100%;
157}
158
159.menu-toggle {
160 width: 34px;
161 height: 45px;
162 position: absolute;
163 top: 5px;
164 right: 0;
165 display: none;
166}
167
168.menu-toggle .bar {
169 background-color: #b0ddce;
170 display: block;
171 width: 20px;
172 height: 2px;
173 border-radius: 100px;
174 position: absolute;
175 top: 18px;
176 right: 7px;
177 transition: all 0.5s;
178}
179
180.menu-toggle .bar:first-child {
181 transform: translateY(-6px);
182}
183
184.menu-toggle.x .bar {
185 transform: rotate(45deg);
186}
187
188.menu-toggle.x .bar:first-child {
189 transform: rotate(-45deg);
190}
191
192@media screen and (max-width: 64em) {
193 .menu-toggle {
194 display: block;
195 }
196}
197
198.header-buttons {
199 text-align: right;
200}
201
202.linkcount {
203 color: #252525;
204 font-size: 0.8em;
205}
206
207@media screen and (min-width: 64em) {
208 .linkcount {
209 position: absolute;
210 right: 5px;
211 }
212}
213
214#search, #search-linklist, #search-tagcloud {
215 text-align: center;
216 width: 100%;
217}
218
219#search input[type="text"], #search-linklist input[type="text"] {
220 padding: 0 5px;
221 height: 30px;
222 width: 260px;
223 background: #f5f5f5;
224 border: medium none currentColor;
225 box-shadow: 0 1px 0 rgba(255, 255, 255, 0.078), 0 1px 1px rgba(0, 0, 0, 0.298) inset;
226 border-radius: 2px;
227 color: #252525;
228}
229@media screen and (max-width: 64em) {
230 .searchform {
231 max-width: 260px;
232 margin: 0 auto;
233 }
234}
235
236/* because chrome */
237#search input[type="text"]::-webkit-input-placeholder,
238#search-linklist input[type="text"]::-webkit-input-placeholder {
239 color: #777777;
240}
241
242#search button,
243#search-tagcloud button,
244#search-linklist button {
245 padding: 4px 8px 6px 8px;
246 background-color: #1B926C;
247 color: #f5f5f5;
248 border: none;
249 border-radius: 2px;
250}
251
252#search-tagcloud button {
253 width: 90%;
254}
255
256@media screen and (max-width: 64em) {
257 #search-linklist button {
258 width: 100%;
259 }
260 #search-linklist .awesomplete {
261 margin: 5px 0;
262 }
263}
264
265#search button:hover,
266#search-linklist button:hover,
267#search-tagcloud button:hover {
268 color: #d0d0d0;
269}
270
271#search,
272#search-linklist {
273 padding: 6px 0;
274}
275
276@media screen and (max-width: 64em) {
277 #search, #search * {
278 visibility: hidden;
279 }
280}
281
282.subheader-form a.button {
283 color: #f5f5f5;
284 font-weight: bold;
285 text-decoration: none;
286 border: 2px solid #f5f5f5;
287 border-radius: 5px;
288 padding: 3px 10px;
289}
290
291.linklist-item-editbuttons .delete-checkbox {
292 display: none;
293}
294
295#header-login-form input[type="text"], #header-login-form input[type="password"] {
296 width: 200px;
297}
298
299/* because chrome */
300#header-login-form input[type="text"]::-webkit-input-placeholder,
301#header-login-form input[type="password"]::-webkit-input-placeholder {
302 color: #777777;
303}
304
305.subheader-form {
306 visibility: hidden;
307 position: fixed;
308 width: 100%;
309 text-align: center;
310 background: #1b926c;
311 display: block;
312 z-index: 999;
313 height: 30px;
314 padding: 5px 0;
315}
316
317@media screen and (min-width: 64em) {
318 .subheader-form.open, .subheader-form.open * {
319 visibility: visible;
320 }
321}
322
323.subheader-form input[type="text"], .subheader-form input[type="password"], .subheader-form .remember-me {
324 padding: 5px 5px 3px 15px;
325 height: 20px;
326 width: 20%;
327 background: #f5f5f5;
328 border: medium none currentColor;
329 border-radius: 2px;
330 box-shadow: 0 1px 0 rgba(255, 255, 255, 0.078), 0 1px 4px rgba(0, 0, 0, 0.298) inset;
331 color: #252525;
332}
333
334/* because chrome */
335.subheader-form input[type="text"]::-webkit-input-placeholder,
336.subheader-form input[type="password"]::-webkit-input-placeholder
337{
338 color: #252525;
339}
340
341.subheader-form .remember-me {
342 display: inline-block;
343 width: auto;
344 padding: 5px 20px 3px 20px;
345 cursor: pointer;
346}
347
348.subheader-form .remember-me label, .subheader-form .remember-me input {
349 cursor: pointer;
350}
351
352.subheader-form input[type="submit"] {
353 display: inline-block;
354 margin: 0 0 5px 0;
355 padding: 4px 0 4px 0;
356 height: 28px;
357 width: 100px;
358 background: #1b926c;
359 border: 1px solid #f5f5f5;
360 color: #f5f5f5;
361 border-radius: 2px;
362}
363
364.subheader-form input[type="submit"]:hover {
365 background: #f5f5f5;
366 color: #1b926c;
367}
368
369.new-version-message {
370 text-align: center;
371}
372
373.new-version-message a {
374 color: rgb(151, 96, 13);
375 font-weight: bold;
376}
377
378/**
379 * CONTENT - GENERAL
380 */
381#content {
382 position: relative;
383 z-index: 2;
384 margin-top: 45px;
385}
386
387/**
388 * Plugins additional forms
389 */
390.toolbar-plugin {
391 margin: 5px 0;
392 text-align: center;
393}
394
395.toolbar-plugin input[type="text"] {
396 padding: 0 5px;
397 height: 30px;
398 width: 300px;
399 background: #f5f5f5;
400 border: medium none currentColor;
401 box-shadow: 0 1px 0 rgba(255, 255, 255, 0.078), 0 1px 1px rgba(0, 0, 0, 0.298) inset;
402 border-radius: 2px;
403 color: #252525;
404}
405
406/* because chrome */
407.toolbar-plugin input[type="text"]::-webkit-input-placeholder {
408 color: #777777;
409}
410
411.toolbar-plugin input[type="submit"] {
412 padding: 0 10px;
413 height: 30px;
414 background: #f5f5f5;
415 border: medium none currentColor;
416 border-radius: 2px;
417 color: #252525;
418}
419
420.toolbar-plugin input[type="submit"]:hover {
421 background: #fff;
422}
423
424@media screen and (max-width: 64em) {
425 .toolbar-plugin input[type="text"] {
426 width: 70%;
427
428 }
429}
430
431/**
432 * CONTENT - LINKLIST PAGING
433 * 64em -> lg
434 */
435.linklist-filters {
436 margin: 5px 0;
437 color: #252525;
438 font-size: 0.9em;
439}
440
441.linklist-filters a {
442 padding: 5px 8px;
443 text-decoration: none;
444}
445
446.linklist-filters .filter-off {
447 color: #252525;
448 background: #f5f5f5;
449}
450
451.linklist-filters .filter-on {
452 color: #b0ddce;
453 background: #1b926c;
454}
455
456.linklist-filters .filter-block {
457 color: #f5f5f5;
458 background: #ac2925;
459}
460
461.linklist-pages {
462 margin: 5px 0;
463 color: #252525;
464 text-align: center;
465}
466
467.linklist-pages a {
468 color: #252525;
469 text-decoration: none;
470}
471
472.linklist-pages a:hover {
473 color: #fff;
474}
475
476.linksperpage {
477 margin: 5px 0;
478 text-align: right;
479 color: #252525;
480 font-size: 0.9em;
481}
482
483.linksperpage a {
484 padding: 5px 5px;
485 text-decoration: none;
486 color: #252525;
487 background: #f5f5f5;
488}
489
490.linksperpage a, .linksperpage input[type="text"] {
491 display: inline-block;
492 width: 20px;
493 text-align: center;
494}
495
496.linksperpage form {
497 display: inline;
498}
499
500.linksperpage input[type="text"] {
501 height: 20px;
502 margin: 0;
503 padding: 4px 5px 3px 8px;
504 background: #f5f5f5;
505 border: medium none currentColor;
506 color: #252525;
507 font-size: 0.8em;
508}
509
510/**
511 * CONTENT - LINKLIST ITEMS
512 */
513.linklist-item {
514 margin: 0 0 10px 0;
515 background: #f5f5f5;
516 box-shadow: 1px 1px 3px #797979;
517}
518
519.linklist-item-buttons {
520 background: transparent;
521 position: relative;
522 width: 23px;
523 z-index: 99;
524}
525
526.linklist-item-buttons-right {
527 float: right;
528 margin-right: -25px;
529}
530
531.linklist-item-buttons * {
532 display: block;
533 float: left;
534 width:100%;
535 margin: auto;
536 text-align: center;
537}
538
539.linklist-item-title, .linklist-item-title h2 {
540 margin: 0;
541 word-wrap: break-word;
542}
543
544.linklist-item-title {
545 position: relative;
546 background: #f5f5f5;
547}
548
549.linklist-item-title h2 {
550 padding: 3px 10px 0 10px;
551 line-height: 30px;
552}
553
554.linklist-item-title h2 a {
555 font-size: 0.7em;
556 color: #252525;
557 text-decoration: none;
558 vertical-align: middle;
559}
560
561.linklist-item-title .linklist-link {
562 font-size: 1.1em;
563 color: #1b926c;
564}
565
566.linklist-item-title h2 a:visited .linklist-link {
567 color: #2a4c41;
568}
569
570.linklist-item-title h2 a:hover, .linklist-item-title .linklist-link:hover{
571 color: #252525;
572}
573
574
575.linklist-item-title .label-private {
576 border: solid 1px #F89406;
577 font-family: Arial, sans-serif;
578 font-size: 0.65em;
579 color: #F89406;
580}
581
582.fold-button {
583 display: none;
584 color: #252525;
585}
586
587.linklist-item-editbuttons {
588 float: right;
589 padding: 8px 5px;
590}
591
592.linklist-item-editbuttons * {
593 display: block;
594 float: left;
595 margin: 0 1px;
596}
597
598.linklist-item-editbuttons a {
599 font-size: 1em;
600}
601
602.edit-link {
603 font-size: 1.2em;
604 color: #0b5ea6;
605}
606
607.delete-link {
608 font-size: 1.3em;
609 color: #ac2925 !important;
610}
611
612.linklist-item-description {
613 position: relative;
614 padding: 0 10px;
615 word-wrap: break-word;
616 color: #252525;
617 line-height: 1.3em;
618}
619
620.linklist-item-description a {
621 text-decoration: none;
622 color: #1b926c;
623}
624
625.linklist-item-description a:hover {
626 color: #252525;
627}
628
629.linklist-item-description a:visited {
630 color: #14553f;
631}
632
633.linklist-item-thumbnail {
634 position: relative;
635 padding: 0 0 0 5px;
636 margin: 0;
637 float: right;
638 z-index: 50;
639 height: 90px;
640}
641
642.linklist-item.private .linklist-item-title::before,
643.linklist-item.private .linklist-item-description::before {
644 position: absolute;
645 left: 3px;
646 top: 0;
647 display: block;
648 content:"";
649 background: #F89406;
650 height: 96%;
651 width: 2px;
652 z-index: 1;
653}
654
655.linklist-item.private .linklist-item-description::before {
656 height: 100%;
657}
658
659.linklist-item.private .linklist-item-title::before {
660 margin-top: 3px;
661}
662
663.linklist-item-infos {
664 padding: 4px 8px 4px 8px;
665 background: #ddd;
666 color: #252525;
667}
668
669.linklist-item-infos a {
670 color: #252525;
671 text-decoration: none;
672}
673
674.linklist-item-infos a:hover {
675 color: #000;
676}
677
678.linklist-item-infos .linklist-item-tags {
679 font-size: 0.8em;
680}
681
682.linklist-item-infos .label-tag {
683 font-size: 1em;
684}
685
686.linklist-item-infos-dateblock {
687 font-size: 0.9em;
688}
689
690.linklist-plugin-icon {
691 width: 13px;
692 height: 13px;
693}
694
695.linklist-item-infos-url {
696 text-align: right;
697 white-space: nowrap;
698 overflow: hidden;
699 text-overflow: ellipsis;
700 font-size: 0.8em;
701 height:23px;
702 line-height:23px;
703}
704
705.linklist-item-infos .mobile-buttons {
706 text-align: right;
707}
708
709.linklist-item-infos .linklist-plugin-icon {
710 display: inline-block;
711 margin: 0 2px;
712 width: 16px;
713 height: 16px;
714}
715
716.linklist-item-infos-controls-group {
717 display: inline-block;
718 border-right: 1px solid #5d5d5d;
719 padding-right: 6px;
720}
721
722.ctrl-edit {
723 margin: 0 7px;
724}
725
726/** 64em -> lg **/
727@media screen and (max-width: 64em) {
728 .linklist-item-infos-url {
729 text-align: left;
730 }
731}
732
733/**
734 * Footer
735 */
736#footer {
737 margin: 20px 0;
738 padding: 5px;
739 text-align: center;
740 color: #252525;
741}
742
743#footer:before {
744 display: block;
745 content:"";
746 background: linear-gradient(to right, #949393, #252525, #949393);
747 height: 1px;
748 width: 80%;
749 margin: 10px auto;
750}
751
752#footer a {
753 color: #252525;
754}
755
756/**
757 * PAGE FORM
758 */
759.page-form {
760 margin: 20px 0 0 0;
761 background: #f5f5f5;
762 box-shadow: 1px 1px 2px #797979;
763 color: #252525;
764 overflow: hidden;
765}
766
767.page-form .window-title {
768 margin: 0 0 10px 0;
769 padding: 10px 0;
770 width: 100%;
771 color: #1b926c;
772 background: #f5f5f5;
773 text-align: center;
774}
775
776.page-form .window-subtitle {
777 text-align: center;
778}
779
780.page-form a {
781 color: #1b926c;
782 font-weight: bold;
783 text-decoration: none;
784}
785
786.page-form p {
787 padding: 5px 10px;
788 margin: 0;
789}
790
791.page-form input[type="text"],
792.page-form input[type="password"],
793.page-form textarea {
794 box-sizing: border-box;
795 margin: 10px 0;
796 padding: 5px 5px 3px 15px;
797 height: 35px;
798 width: 90%;
799 background: #eeeeee;
800 border: solid 1px #d8d8d8;
801 border-radius: 2px;
802 color: #252525;
803}
804
805.page-form textarea {
806 min-height: 240px;
807 padding: 15px 5px 3px 15px;
808 resize: vertical;
809 overflow-y: auto;
810 word-wrap:break-word
811}
812
813/* because chrome */
814.page-form input[type="text"]::-webkit-input-placeholder,
815.page-form input[type="password"]::-webkit-input-placeholder {
816 color: #777777;
817}
818
819.page-form input[type="submit"], .page-form a.button {
820 margin: 15px 5px;
821 height: 35px;
822 line-height: 35px;
823 width: 150px;
824 background: #1b926c;
825 color: #f5f5f5;
826 border: none;
827 box-shadow: 1px 1px 1px #ddd, -1px -1px 6px #ddd, -1px 1px 2px #ddd, 1px -1px 2px #ddd;
828 font-size: 1.2em;
829 text-decoration: none;
830 vertical-align: center;
831 font-weight: normal;
832 display: inline-block;
833}
834
835
836.page-form .button.button-red {
837 background: #ac2925;
838}
839
840.page-form .submit-buttons {
841 margin-bottom: 10px;
842}
843
844@media screen and (min-width: 64em) {
845 .page-form .submit-buttons {
846 position: relative;
847 }
848
849 .page-form .submit-buttons .button.button-red {
850 position: absolute;
851 right: 5%;
852 }
853}
854
855@media screen and (max-width: 64em) {
856 .page-form .submit-buttons .button {
857 display: block;
858 margin: auto;
859 }
860}
861
862.page-form select {
863 color: #252525;
864}
865
866/**
867 * PAGE FORM - LIGHT
868 */
869.page-form-light div, .page-form-light p {
870 text-align: center;
871}
872
873/**
874 * PAGE FORM - COMPLETE
875 */
876.page-form-complete {
877 #background: #f5f5f5;
878}
879
880.page-form-complete div, .page-form-complete p {
881 color: #252525;
882}
883
884.page-form-complete .form-label, .page-form-complete .form-input {
885 position: relative;
886 height: 60px;
887}
888
889.page-form-complete .form-label label,
890.page-form-complete .form-input input,
891.page-form-complete .form-input select.align,
892.page-form-complete .timezone {
893 position: absolute;
894 top: 50%;
895 transform: translateY(-50%);
896}
897
898.page-form-complete .form-label label {
899 text-align: right;
900 right: 0;
901 padding: 0 20px;
902}
903
904.page-form-complete .label-name {
905 font-weight: bold;
906}
907
908.page-form-complete .label-desc {
909 font-size: 0.8em;
910}
911
912.page-form-complete input[type="text"],
913.page-form-complete input[type="password"],
914.page-form-complete textarea {
915 margin: 0;
916}
917
918.page-form section {
919 margin: 10px 0 25px 0;
920}
921
922.page-form table {
923 margin: auto;
924 width: 90%;
925}
926
927.page-form table .order {
928 text-decoration: none;
929 color: #252525;
930}
931
932.page-form table, .page-form th, .page-form td {
933 border-width: 1px 0;
934 border-style: solid;
935 border-color: #aaaaaa;
936}
937
938.page-form th, .page-form td {
939 padding: 5px;
940
941}
942
943/* Awesomeplete fix */
944div.awesomplete {
945 width: inherit;
946}
947
948div.awesomplete > input {
949 display: inherit;
950}
951
952div.awesomplete > ul {
953 z-index: 9999;
954}
955
956.page-form .awesomplete {
957 width: 90%;
958}
959
960.page-form .awesomplete input {
961 width: 100%;
962}
963
964.page-form div.awesomplete > ul {
965 color: black;
966}
967
968form[name="linkform"].page-form {
969 overflow: visible;
970}
971
972@media screen and (max-width: 64em) {
973 .page-form-complete .form-label {
974 height: inherit;
975 }
976
977 .page-form-complete .form-label label,
978 .page-form-complete .form-input input,
979 .page-form-complete .timezone {
980 position: inherit;
981 top: inherit;
982 transform: translateY(0);
983 }
984
985 .page-form-complete .form-input input[type="checkbox"] {
986 position: absolute;
987 top: 50%;
988 right: 50%;
989 transform: translateY(-50%);
990 }
991
992 .page-form-complete .form-input {
993 text-align: center;
994 }
995
996 .page-form-complete .form-label label {
997 display: block;
998 text-align: left;
999 margin: 10px 0 0 0;
1000 }
1001
1002 .timezone-continent:after {
1003 content:"\a\a";
1004 white-space: pre;
1005 }
1006
1007 .page-form-complete .radio-buttons {
1008 text-align: left;
1009 padding: 5px 15px;
1010 }
1011}
1012
1013/**
1014 * Page visitor (page form extended)
1015 */
1016.page-visitor {
1017 color: #252525;
1018}
1019
1020#page404 {
1021 color: #3f3f3f;
1022}
1023
1024/**
1025 * EDIT LINK
1026 */
1027#editlinkform .created-date {
1028 color: #767676;
1029 margin-bottom: 10px;
1030}
1031
1032/**
1033 * LOGIN
1034 */
1035#login-form .remember-me {
1036 margin: 5px 0;
1037}
1038
1039/**
1040 * Search results
1041 */
1042.search-result a {
1043 color: white;
1044 text-decoration: none;
1045}
1046
1047.search-result .label-tag {
1048 border-color: white;
1049}
1050
1051.search-result .label-tag .remove {
1052 border-left: white 1px solid;
1053 padding: 0 0 0 5px;
1054 margin: 0 0 0 5px;
1055}
1056
1057.search-result .label-private {
1058 border: 1px solid white;
1059}
1060
1061/**
1062 * TOOLS
1063 */
1064.tools-item {
1065 margin: 10px 0;
1066}
1067
1068.tools-item .pure-button:hover {
1069 background-image: none;
1070 background-color: #1b926c;
1071 color: #f5f5f5;
1072}
1073
1074/**
1075 * PLUGIN ADMIN
1076 */
1077#pluginform .mobile-row {
1078 font-size: 0.9em;
1079}
1080
1081#pluginform .more {
1082 margin-top: 10px;
1083}
1084
1085@media screen and (max-width: 64em) {
1086 #pluginform .main-row, #pluginform .main-row td {
1087 border-bottom-style: none;
1088 }
1089
1090 #pluginform .mobile-row, #pluginform .mobile-row td {
1091 border-top-style: none;
1092 }
1093}
1094
1095/**
1096 * IMPORT
1097 */
1098#import-field {
1099 margin: 15px 0;
1100}
1101
1102/**
1103 * TAG CLOUD
1104 */
1105#cloudtag {
1106 padding: 10px;
1107 text-align: center;
1108}
1109
1110#cloudtag, #cloudtag a {
1111 color: #252525;
1112 text-decoration: none;
1113}
1114
1115#cloudtag .count {
1116 color: #7f7f7f;
1117}
1118
1119/**
1120 * TAG LIST
1121 */
1122#taglist {
1123 padding: 0 10px;
1124}
1125
1126#taglist a {
1127 color: #252525;
1128 text-decoration: none;
1129}
1130
1131#taglist .count {
1132 display: inline-block;
1133 width: 35px;
1134 text-align: right;
1135 color: #7f7f7f;
1136}
1137
1138#taglist .rename-tag-form {
1139 display: none;
1140}
1141
1142#taglist .delete-tag {
1143 color: #ac2925;
1144 display: none;
1145}
1146
1147#taglist .rename-tag {
1148 color: #0b5ea6;
1149}
1150
1151#taglist .validate-rename-tag {
1152 color: #1b926c;
1153}
1154
1155/**
1156 * Picture wall CSS
1157 */
1158#picwall_container {
1159 margin: 0 10px 10px 10px;
1160 color: #252525;
1161 background-color: #f5f5f5;
1162 clear: both;
1163}
1164
1165.picwall_pictureframe {
1166 margin: 2px;
1167 background-color: #f5f5f5;
1168 z-index: 5;
1169 position: relative;
1170 display: table-cell;
1171 vertical-align: middle;
1172 width: 90px;
1173 height: 90px;
1174 overflow: hidden;
1175 text-align: center;
1176 float: left;
1177}
1178
1179.b-lazy {
1180 -webkit-transition: opacity 500ms ease-in-out;
1181 -moz-transition: opacity 500ms ease-in-out;
1182 -o-transition: opacity 500ms ease-in-out;
1183 transition: opacity 500ms ease-in-out;
1184 opacity: 0;
1185}
1186.b-lazy.b-loaded {
1187 opacity: 1;
1188}
1189
1190.picwall_pictureframe img {
1191 max-width: 100%;
1192 height: auto;
1193 color: transparent;
1194} /* Adapt the width of the image */
1195
1196.picwall_pictureframe a {
1197 text-decoration: none;
1198}
1199
1200/* CSS to show title when hovering an image - no javascript required. */
1201.picwall_pictureframe span.info {
1202 display: none;
1203 font-family: Arial, sans-serif;
1204}
1205
1206.picwall_pictureframe:hover span.info {
1207 display: block;
1208 position: absolute;
1209 top: 0;
1210 left: 0;
1211 width: 90px;
1212 height: 90px;
1213 font-weight: bold;
1214 font-size: 9pt;
1215 color: #f5f5f5;
1216 text-align: left;
1217 background-color: rgba(0, 0, 0, 0.8);
1218}
1219
1220/**
1221 * DAILY
1222 */
1223.daily-desc {
1224 color: #7f7f7f;
1225 font-size: 0.8em;
1226}
1227
1228.daily-about a {
1229 color: #343434;
1230 text-decoration: none;
1231}
1232
1233.daily-about a:hover {
1234 color: #7f7f7f;
1235}
1236
1237.daily-about h3:before, .daily-about h3:after {
1238 display: block;
1239 content:"";
1240 background: linear-gradient(to right, #d5d4d4, #252525, #d5d4d4);
1241 height: 1px;
1242 width: 90%;
1243 margin: 10px auto;
1244}
1245
1246.daily-entry {
1247 padding: 0 10px;
1248}
1249
1250.daily-entry .daily-entry-title:after {
1251 display: block;
1252 content:"";
1253 background: linear-gradient(to right, #fff, #515151, #fff);
1254 height: 1px;
1255 width: 70%;
1256 margin: 5px auto;
1257}
1258
1259.daily-entry .daily-entry-title {
1260 margin: 10px 0 0 0;
1261}
1262
1263.daily-entry .daily-entry-title a {
1264 color: #000;
1265 text-decoration: none;
1266}
1267
1268.daily-entry .daily-entry-description {
1269 padding: 5px 5px 0 5px;
1270 font-size: 0.9em;
1271 text-align: justify;
1272 word-wrap: break-word;
1273}
1274
1275.daily-entry .daily-entry-tags {
1276 padding: 0 5px 5px 5px;
1277 font-size: 0.8em;
1278}
1279
1280.daily-entry-thumbnail {
1281 float: left;
1282 margin: 15px 5px 5px 15px;
1283}
1284
1285.daily-entry-description a {
1286 text-decoration: none;
1287 color: #1b926c;
1288}
1289
1290.daily-entry-description a:hover {
1291 text-shadow: 1px 1px #ddd;
1292}
1293
1294.daily-entry-description a:visited {
1295 color: #20b988;
1296}
1297
1298/*
1299 * Fix empty bookmarklet name in Firefox
1300 */
1301.pure-button {
1302 -moz-user-select: auto;
1303}
1304
1305.tag-sort {
1306 margin-top: 30px;
1307 text-align: center;
1308}
1309
1310.tag-sort a {
1311 display: inline-block;
1312 margin: 0 15px;
1313 color: white;
1314 text-decoration: none;
1315 font-weight: bold;
1316}
1317
1318/**
1319 * Markdown
1320 */
1321.markdown p {
1322 margin: 0 !important;
1323}
1324
1325.markdown p + p {
1326 margin: 0.5em 0 0 0 !important;
1327}
1328
1329.markdown *:first-child {
1330 margin-top: 0 !important;
1331}
1332
1333.markdown *:last-child {
1334 margin-bottom: 5px !important;
1335}
1336
1337/**
1338 * Pure Button
1339 */
1340.pure-button-success,
1341.pure-button-error,
1342.pure-button-warning,
1343.pure-button-primary,
1344.pure-button-shaarli,
1345.pure-button-secondary {
1346 color: white !important;
1347 border-radius: 4px;
1348 text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
1349}
1350
1351.pure-button-shaarli {
1352 background-color: #1B926C;
1353}
diff --git a/assets/vintage/css/reset.css b/assets/vintage/css/reset.css
new file mode 100644
index 00000000..e29699e2
--- /dev/null
+++ b/assets/vintage/css/reset.css
@@ -0,0 +1,6 @@
1/* CSS Reset from Yahoo to cope with browsers CSS inconsistencies. */
2/*
3 Copyright (c) 2010, Yahoo! Inc. All rights reserved. Code licensed under the BSD License: http://developer.yahoo.com/yui/license.html
4 version: 2.8.2r1
5 */
6html{color:#000;background:#FFF;}body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,button,textarea,p,blockquote,th,td{margin:0;padding:0;}table{border-collapse:collapse;border-spacing:0;}fieldset,img{border:0;}address,caption,cite,code,dfn,em,strong,th,var,optgroup{font-style:inherit;font-weight:inherit;}del,ins{text-decoration:none;}li{list-style:none;}caption,th{text-align:left;}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal;}q:before,q:after{content:'';}abbr,acronym{border:0;font-variant:normal;}sup{vertical-align:baseline;}sub{vertical-align:baseline;}legend{color:#000;}input,button,textarea,select,optgroup,option{font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;}input,button,textarea,select{*font-size:100%;} \ No newline at end of file
diff --git a/assets/vintage/css/shaarli.css b/assets/vintage/css/shaarli.css
new file mode 100644
index 00000000..c919339b
--- /dev/null
+++ b/assets/vintage/css/shaarli.css
@@ -0,0 +1,1212 @@
1/* Cascading Stylesheet for Shaarli - https://github.com/shaarli/Shaarli */
2
3body {
4 font-family: "Trebuchet MS",Verdana,Arial,Helvetica,sans-serif;
5 font-size: 10pt;
6 background-color: #ffffff;
7 word-wrap: break-word;
8}
9
10input, textarea {
11 background-color: #dedede;
12 background: -webkit-gradient(linear, 0 0, 0 bottom, from(#dedede), to(#ffffff));
13 background: -webkit-linear-gradient(#dedede, #ffffff);
14 background: -moz-linear-gradient(#dedede, #ffffff);
15 background: -ms-linear-gradient(#dedede, #ffffff);
16 background: -o-linear-gradient(#dedede, #ffffff);
17 background: linear-gradient(#dedede, #ffffff);
18 box-shadow: 0 1px 2px rgba(0, 0, 0, 0.5);
19 padding: 5px;
20 border-radius: 3px 3px 3px 3px;
21 border: none;
22 color: #000;
23}
24
25a {
26 text-decoration: none;
27}
28
29h1 {
30 font-size: 20pt;
31 font-weight: bold;
32 font-style: italic;
33 margin-bottom: 20px;
34}
35
36em {
37 font-style: italic;
38}
39
40strong {
41 font-weight: bold;
42}
43
44.hidden {
45 display: none;
46}
47
48/* Buttons */
49.bigbutton, #pageheader a.bigbutton {
50 background-color: #c0c0c0;
51 background: -moz-linear-gradient(#c0c0c0, #ffffff) repeat scroll 0 0 transparent;
52 background: -webkit-gradient(linear, 0 0, 0 bottom, from(#c0c0c0), to(#ffffff));
53 background: -webkit-linear-gradient(#c0c0c0, #ffffff);
54 background: -ms-linear-gradient(#c0c0c0, #ffffff);
55 background: -o-linear-gradient(#c0c0c0, #ffffff);
56 background: linear-gradient(#c0c0c0, #ffffff);
57 border-radius: 3px 3px 3px 3px;
58 box-shadow: 0 1px 1px rgba(0, 0, 0, 0.5);
59 cursor: pointer;
60 height: 24px;
61 padding: 0 5px;
62 margin: 0 5px 0 0;
63 color: #606060;
64 border-style: outset;
65 border-width: 1px;
66 display: inline-block;
67}
68
69a.bigbutton, #pageheader a.bigbutton {
70 height: 22px;
71 line-height: 22px;
72}
73
74.smallbutton {
75 background-color: #c0c0c0;
76 background: -moz-linear-gradient(#c0c0c0, #ffffff) repeat scroll 0 0 transparent;
77 background: -webkit-gradient(linear, 0 0, 0 bottom, from(#c0c0c0), to(#ffffff));
78 background: -webkit-linear-gradient(#c0c0c0, #ffffff);
79 background: -ms-linear-gradient(#c0c0c0, #ffffff);
80 background: -o-linear-gradient(#c0c0c0, #ffffff);
81 background: linear-gradient(#c0c0c0, #ffffff);
82 border-radius: 3px 3px 3px 3px;
83 box-shadow: 0 1px 1px rgba(0, 0, 0, 0.5);
84 cursor: pointer;
85 height: 20px;
86 margin-left: 5px;
87 padding: 0 5px;
88 color: #606060;
89 border-style: outset;
90 border-width: 1px;
91}
92
93/* Small tab on the left of each link with edit/delete buttons. */
94.button_edit, .button_delete {
95 border-radius: 0;
96 box-shadow: none;
97 border-style: none;
98 border-width: 0;
99 padding: 0;
100 background: none;
101}
102
103.linkeditbuttons {
104 position: absolute;
105 left: 2px;
106 padding: 4px 2px 2px 2px;
107
108 -webkit-border-radius: 0px 6px 6px 0px;
109 -moz-border-radius: 0px 6px 6px 0px;
110 -o-border-radius: 0px 6px 6px 0px;
111 -ms-border-radius: 0px 6px 6px 0px;
112 border-radius: 0px 6px 6px 0px;
113}
114
115#pageheader #logo {
116 background-image: url('../img/logo.png');
117 background-repeat: no-repeat;
118 float: left;
119 margin: 0 10px 0 10px;
120 width: 105px;
121 height: 55px;
122 cursor: pointer;
123}
124
125#pageheader #menu {
126 width: 100%;
127}
128
129#pageheader #menu ul {
130 margin: auto;
131 padding: 7px 0px 0px 0px;
132 float: none;
133}
134
135#pageheader #menu ul li {
136 list-style: none;
137 display: inline;
138 position: relative;
139 box-sizing: border-box;
140}
141
142#pageheader a {
143 background-color: #333333;
144 background: -webkit-gradient(linear, 0 0, 0 bottom, from(#333333), to(#000000));
145 background: -webkit-linear-gradient(#333333, #000000);
146 background: -moz-linear-gradient(#333333, #000000);
147 background: -ms-linear-gradient(#333333, #000000);
148 background: -o-linear-gradient(#333333, #000000);
149 background: linear-gradient(#333333, #000000);
150 box-shadow: 0 1px 2px rgba(0, 0, 0, 0.5);
151 padding: 5px;
152 border-radius: 3px 3px 3px 3px;
153 margin: 10px 3px 3px 3px;
154 color: #A2DD42;
155 text-decoration: none;
156 line-height: 2.5;
157 white-space: nowrap;
158}
159
160#pageheader #linkcount {
161 float: right;
162 font-style: italic;
163 color: #bbb;
164 text-align: right;
165 padding-right: 5px;
166 margin: 3px 3px 0px 0px;
167}
168
169#pageheader {
170 background-color: #333333;
171 background: -webkit-gradient(linear, 0 0, 0 bottom, from(#333333), to(#111111));
172 background: -webkit-linear-gradient(#333333, #111111);
173 background: -moz-linear-gradient(#333333, #111111);
174 background: -ms-linear-gradient(#333333, #111111);
175 background: -o-linear-gradient(#333333, #111111);
176 background: linear-gradient(#333333, #111111);
177 box-shadow: 0 1px 2px rgba(0, 0, 0, 0.5);
178 width: auto;
179 padding: 0 10px 5px 10px;
180 margin: auto;
181}
182
183#pageheader .search {
184 width: 100%;
185 white-space: nowrap;
186}
187
188#toolsdiv a {
189 clear: both;
190}
191
192#toolsdiv #bookmark {
193 clear: none;
194}
195
196#toolsdiv a span {
197 color: #ffffff;
198}
199
200.linksperpage, .tagfilter, .searchform, .addform {
201 background-color: #dedede;
202 background: -webkit-gradient(linear, 0 0, 0 bottom, from(#dedede), to(#ffffff));
203 background: -webkit-linear-gradient(#dedede, #ffffff);
204 background: -moz-linear-gradient(#dedede, #ffffff);
205 background: -ms-linear-gradient(#dedede, #ffffff);
206 background: -o-linear-gradient(#dedede, #ffffff);
207 background: linear-gradient(#dedede, #ffffff);
208 display: inline;
209 box-shadow: 0 1px 2px rgba(0, 0, 0, 0.5);
210 padding: 5px;
211 border: none;
212 border-radius: 3px 3px 3px 3px;
213 margin: 10px 3px 3px 3px;
214 color: #cecece;
215}
216
217.linksperpage {
218 box-shadow: 0 0 0 rgba(0, 0, 0, 0.5);
219 padding: 3px;
220}
221
222.linksperpage input, .tagfilter input, .searchform input, .addform input {
223 border: none;
224 color: #606060;
225 background: none;
226 box-shadow: none;
227 padding: 5px;
228}
229
230.linksperpage input {
231 padding: 0;
232}
233
234.searchform #searchform_value {
235 width: 30%;
236}
237
238.tagfilter {
239 margin-left:24px;
240}
241
242.tagfilter div.awesomplete {
243 width: 15%;
244}
245
246.tagfilter #tagfilter_value {
247 display: inline;
248}
249
250.tagfilter li {
251 color: black;
252}
253
254.tagfilter input.bigbutton, .searchform input.bigbutton, .addform input.bigbutton {
255 background-color: #dedede;
256 background: -webkit-gradient(linear, 0 0, 0 bottom, from(#dedede), to(#ffffff));
257 background: -webkit-linear-gradient(#dedede, #ffffff);
258 background: -moz-linear-gradient(#dedede, #ffffff);
259 background: -ms-linear-gradient(#dedede, #ffffff);
260 background: -o-linear-gradient(#dedede, #ffffff);
261 background: linear-gradient(#dedede, #ffffff);
262 box-shadow: 0 1px 2px rgba(0, 0, 0, 0.5);
263 padding: 0 5px 0 5px;
264 margin: 5px 0 5px 0;
265 height: 20px;
266 border-radius: 3px 3px 3px 3px;
267 cursor: pointer;
268}
269
270#shaarli_title {
271 font-weight: bold;
272 font-style: italic;
273 margin-top: 0;
274}
275
276#shaarli_title a {
277 color: #fff !important;
278}
279
280#pageheader a:visited {
281 color: #98C943;
282 text-decoration: none;
283}
284
285#pageheader a:hover {
286 color: #FFFFC9;
287 text-decoration: none;
288}
289
290#pageheader a:active {
291 color: #bbb;
292 text-decoration: none;
293}
294
295#searchcriteria {
296 padding: 4px 0px 5px 5px;
297 font-weight: bold;
298}
299
300.paging {
301 padding: 5px;
302 background-color: #777;
303 color: #ccc;
304 text-align: center;
305 clear: both;
306}
307
308.paging a:link {
309 color: #ccc;
310 text-decoration: none;
311}
312
313.paging a:visited {
314 color: #ccc;
315}
316
317.paging a:hover {
318 color: #FFFFC9;
319}
320
321.paging a:active {
322 color: #fff;
323}
324
325.paging_privatelinks {
326 float: left;
327}
328
329.paging_linksperpage {
330 float: right;
331 padding-right: 5px;
332 margin: 0px 10px 2px 0px;
333}
334
335.paging_linksperpage form.linksperpage {
336 display: inline;
337}
338
339.paging_linksperpage form.linksperpage input {
340 height: 15px;
341}
342
343.paging_current {
344 display: inline;
345 color: #fff;
346 padding: 0 20 0 20;
347}
348
349.paging_older {
350 margin-right: 15px;
351}
352
353.paging_newer {
354 margin-left: 15px;
355}
356
357#headerform {
358 color: #ffffff;
359 padding: 5px 5px 5px 5px;
360 clear: both;
361}
362
363#headerform input.linkurl {
364 width: 50%;
365 font-size: inherit;
366}
367
368#headerform label {
369 cursor: pointer;
370 margin-right: 10px;
371}
372
373#headerform label[for=longlastingsession] {
374 display: block;
375 width: 100%;
376 margin-top: 5px;
377}
378
379#toolsdiv {
380 color: #ffffff;
381 padding: 5px 5px 5px 5px;
382 clear: left;
383}
384
385#uploaddiv {
386 color: #ffffff;
387 padding: 5px 5px 5px 5px;
388 clear: left;
389}
390
391#editlinkform {
392 height: 100%;
393 padding: 5px 5px 5px 15px;
394 width: 80%;
395 clear: left;
396}
397
398#editlinkform label {
399 cursor: pointer;
400 color: #ffffff;
401}
402
403#editlinkform textarea, #editlinkform .lf_input {
404 width: 100%;
405}
406
407#linklist li {
408 padding: 4px 10px 15px 20px;
409 border-top: 1px solid #bbb;
410 clear: both;
411 background-color: #F2F2F2;
412 background: -webkit-gradient(linear, 0 0, 0 bottom, from(#F2F2F2), to(#ffffff));
413 background: -webkit-linear-gradient(#F2F2F2, #ffffff);
414 background: -moz-linear-gradient(#F2F2F2, #ffffff);
415 background: -ms-linear-gradient(#F2F2F2, #ffffff);
416 background: -o-linear-gradient(#F2F2F2, #ffffff);
417 background: linear-gradient(#F2F2F2, #ffffff);
418}
419
420/*
421#linklist li.publicLinkHightLight:hover, #linklist li:hover {
422 background: #E9FFCE;
423}
424*/
425
426.linkdate {
427 font-size:8pt;
428 color:#888;
429}
430
431.linkdate a {
432 color:#E28E3F;
433}
434
435#linklist li.private {
436 background: url('../img/private.png') no-repeat 4px center;
437 padding-left: 30px;
438}
439
440#linklist li {
441 padding-left: 30px;
442}
443
444.private .linktitle a {
445 color: #969696;
446}
447
448.linktitle {
449 font-size: 14pt;
450 font-weight: bold;
451}
452
453.linktitle a {
454 text-decoration: none;
455 color: #80AD48;
456}
457
458.linktitle a:hover {
459 color: #F57900;
460}
461
462.linkdate {
463 font-size: 8pt;
464 color: #888;
465}
466
467.linkdate a {
468 background-image: url('../img/calendar.png');
469 padding: 2px 0 3px 20px;
470 background-repeat: no-repeat;
471 text-decoration: none;
472 color: #E28E3F;
473}
474
475.linkdate a:hover {
476 color: #F57900 }
477
478.linkurl {
479 font-size: 8pt;
480 color: #4BAA74;
481}
482
483.linkdescription {
484 color: #000;
485 margin-top: 0;
486 margin-bottom: 12px;
487 font-weight: normal;
488 overflow: auto;
489}
490
491.linkdescription a {
492 text-decoration: none;
493 color: #3465A4;
494}
495
496.linkdescription a:hover {
497 color: #F57900;
498}
499
500.linktaglist {
501 padding-top: 10px;
502 line-height: 200%;
503}
504
505.linktag {
506 font-size: 9pt;
507 background-color: #F2F2F2;
508 background: -webkit-gradient(linear, 0 0, 0 bottom, from(#F2F2F2), to(#ffffff));
509 background: -webkit-linear-gradient(#F2F2F2, #ffffff);
510 background: -moz-linear-gradient(#F2F2F2, #ffffff);
511 background: -ms-linear-gradient(#F2F2F2, #ffffff);
512 background: -o-linear-gradient(#F2F2F2, #ffffff);
513 background: linear-gradient(#F2F2F2, #ffffff);
514 box-shadow: 0 0 2px rgba(0, 0, 0, 0.5);
515 padding: 3px 5px 3px 20px;
516 height: 20px;
517 border-radius: 3px;
518 cursor: pointer;
519 background-image: url('../img/tag_blue.png');
520 background-repeat: no-repeat;
521 background-position: 3px center;
522 background-color: #ffffff;
523}
524
525.linktag:hover {
526 border-color: #555573;
527 color: #000;
528}
529
530.linktag a {
531 color: #777;
532 text-decoration: none;
533}
534
535.linktag .remove {
536 border-left: 1px solid #aaa;
537 padding-left: 5px;
538 color:#6767A7;
539}
540
541.linkshort {
542 font-size: 8pt;
543 color: #888;
544}
545
546.linkshort a {
547 text-decoration: none;
548 color: #393964;
549}
550
551.linkshort a:hover {
552 text-decoration: underline;
553}
554
555.buttoneditform {
556 display: inline;
557}
558
559#footer {
560 font-size: 8pt;
561 text-align: center;
562 color: #888;
563 clear: both;
564 max-width: 30em;
565 margin: 15px auto 15px auto;
566}
567
568#footer a {
569 color: #486D08;
570}
571
572#footer a:hover {
573 color: #000000;
574}
575
576#newversion {
577 background-color: #FFFFA0;
578 color: #000;
579 position: absolute;
580 top: 0;
581 right: 0;
582 padding: 2 7 2 7;
583 font-size: 9pt;
584}
585
586#newversion #version_id {
587 text-decoration: blink;
588}
589
590#cloudtag {
591 padding-left: 10%;
592 padding-right: 10%;
593}
594
595#cloudtag .count {
596 color: #99f;
597 font-size: 9pt;
598 padding-left: 5px;
599 padding-right: 2px;
600}
601
602#cloudtag a {
603 color: black;
604 text-decoration: none;
605}
606
607#install {
608 margin: 0 20px;
609}
610
611#installform {
612 border: 1px solid black;
613 padding: 10px;
614}
615
616#installform table {
617 border: none;
618}
619
620#installform td {
621 font-size: 10pt;
622 color: black;
623 padding: 10px 5px 10px 5px;
624 clear: left;
625}
626
627#installform input.bigbutton {
628 float: right;
629}
630
631#changepasswordform {
632 color: #ccc;
633 padding: 10px 5px 10px 5px;
634 clear: left;
635}
636
637#changetag {
638 color: #ccc;
639 padding: 10px 5px 10px 5px;
640 clear: left;
641}
642
643#changetag #totag {
644 margin-left: 40px;
645}
646
647#changetag div {
648 float:left;
649}
650
651#changetag label {
652 padding: 5px;
653}
654
655#changetag li {
656 color: #000;
657}
658#configform td {
659 color: #ccc;
660 font-size: 10pt;
661 padding: 10px 5px 10px 5px;
662}
663
664#configform {
665 color: #ccc;
666 padding: 10px 5px 10px 5px;
667 clear: left;
668}
669
670.thumbnail {
671 float: right;
672 margin: 0px 10px 0px 10px;
673}
674
675.thumbnail img {
676 border-radius: 3px;
677 box-shadow: 0.5px 0.5px 0.5px 1px #dde4e6;
678}
679
680/* If you want thumbnails on the left:
681.thumbnail {
682 float: left;
683 margin-right: 10px;
684}
685.linkcontainer {
686 position: static;
687 margin-left: 130px;
688}
689*/
690
691/* --- Picture wall CSS --- */
692#picwall_container {
693 color: #fff;
694 background-color: #000;
695 clear: both;
696}
697
698.picwall_pictureframe {
699 background-color: #000;
700 z-index: 5;
701 position: relative;
702 display: table-cell;
703 vertical-align: middle;
704 width: 90px;
705 height: 90px;
706 overflow: hidden;
707 text-align: center;
708 float: left;
709}
710
711.b-lazy {
712 -webkit-transition: opacity 500ms ease-in-out;
713 -moz-transition: opacity 500ms ease-in-out;
714 -o-transition: opacity 500ms ease-in-out;
715 transition: opacity 500ms ease-in-out;
716 opacity: 0;
717}
718.b-lazy.b-loaded {
719 opacity: 1;
720}
721
722.picwall_pictureframe img {
723 max-width: 100%;
724 height: auto;
725 color: transparent;
726} /* Adapt the width of the image */
727
728.picwall_pictureframe a {
729 text-decoration: none;
730}
731
732/* CSS to show title when hovering an image - no javascript required. */
733.picwall_pictureframe span.info {
734 display: none;
735}
736
737.picwall_pictureframe:hover span.info {
738 display: block;
739 position: absolute;
740 top: 0;
741 left: 0;
742 width: 90px;
743 font-weight: bold;
744 font-size: 8pt;
745 color: #fff;
746 text-align: left;
747 background-color: transparent;
748 background-color: rgba(0, 0, 0, 0.4);
749 /* FF3+, Saf3+, Opera 10.10+, Chrome, IE9 */
750 filter: progid: DXImageTransform.Microsoft.gradient(startColorstr=#66000000, endColorstr=#66000000);
751 /* IE6–IE9 */
752 text-shadow: 2px 2px 1px #000000;
753}
754
755#linklist li.publicLinkHightLight {
756 background: #ffffff;
757}
758
759div.daily {
760 font-family: Georgia, 'DejaVu Serif', Norasi, serif;
761 background-color: #E6D6BE;
762 /* Background paper texture by BashCorpo:
763 http://www.bashcorpo.dk/textures.php
764 http://bashcorpo.deviantart.com/art/Grungy-paper-texture-v-5-22966998 */
765 background-image: url("../img/Paper_texture_v5_by_bashcorpo_w1000.jpg");
766 -webkit-background-size: cover;
767 -moz-background-size: cover;
768 -o-background-size: cover;
769 background-size: cover;
770 position: relative;
771 border-bottom: 2px solid black;
772}
773
774#daily_col1 {
775 float: left;
776 position: relative;
777 width: 33%;
778 padding-left: 1%;
779}
780
781#daily_col2 {
782 float: left;
783 position: relative;
784 width: 33%;
785}
786
787#daily_col3 {
788 float: left;
789 position: relative;
790 width: 33%;
791}
792
793div.dailyAbout {
794 float: left;
795 border: 1px solid black;
796 font-size: 8pt;
797 position: absolute;
798 left: 10px;
799 top: 15px;
800 padding: 5px 5px 5px 5px;
801 text-align: center;
802}
803
804div.dailyAbout a {
805 color: #890500;
806}
807
808div.dailyAbout img {
809 position: relative;
810 top: 3px;
811 margin-right: 4px;
812 width: 14px;
813 height: 14px;
814}
815
816div.dailyEntryPermalink {
817 float: right;
818}
819
820div.dailyTitle {
821 font-weight: bold;
822 font-size: 44pt;
823 text-align: center;
824 padding: 10px 20px 0px 20px;
825}
826
827div.dailyDate {
828 font-size: 12pt;
829 font-weight: bold;
830 text-align: center;
831 padding: 0px 20px 30px 20px;
832}
833
834/* Individual entries in "Daily": */
835div.dailyEntry {
836 margin: 5px 10px 2px 5px;
837 font-size: 11pt;
838 border-top: 1px solid #555;
839}
840
841div.dailyEntry a {
842 text-decoration: none;
843 color: #890500;
844}
845
846div.dailyEntryTags {
847 font-size: 7.75pt;
848}
849
850div.dailyEntryTitle {
851 font-size: 18pt;
852 font-weight: bold;
853}
854
855div.dailyEntryLinkdate {
856 font-size: 8pt;
857}
858
859div.dailyEntryThumbnail {
860 width: 100%;
861 text-align: center;
862 background-color: rgb(128, 128, 128);
863 background: url(../img/50pc_transparent.png);
864 padding: 4px 0px 2px 0px;
865}
866
867div.dailyEntryDescription {
868 margin-top: 10px;
869 margin-bottom: 30px;
870 text-align: justify;
871 overflow: auto;
872}
873
874div.dailyNoEntry {
875 text-align: center;
876 padding: 40px 0px 90px 0px;
877}
878
879.daily #closing {
880 clear: both;
881 text-align: center;
882 padding-bottom: 20px;
883}
884
885/* Common CSS screwdriver */
886.clear {
887 clear: both;
888}
889
890.right {
891 text-align: right;
892}
893
894.white {
895 color: white;
896}
897
898/* For lazy images loading in picture wall.
899 Using http://www.appelsiini.net/projects/lazyload
900*/
901.lazyimage {
902 display: none;
903}
904
905#configuration_table td {
906 border: none;
907 padding: 10px;
908 vertical-align: top;
909}
910
911@media print {
912 html {
913 border: none;
914 background: #fff !important;
915 color: #000 !important;
916 }
917
918 body {
919 font-size: 12pt;
920 width: auto !important;
921 margin: auto !important;
922 }
923
924 /* Minimum numer of lines to display when splitting a paragraph
925 over two pages */
926 p {
927 orphans: 3;
928 widows: 3;
929 }
930
931 a {
932 color: #000 !important;
933 text-decoration: none !important;
934 }
935
936 #pageheader, .paging, #linklist li form, #footer {
937 display: none;
938 }
939
940 #linklist li {
941 padding: 2 0 10 0;
942 border-top: 2px solid #000;
943 clear: both;
944 }
945
946 #linklist li.private {
947 background-color: none;
948 border-left: 0;
949 }
950
951 .linkdate {
952 line-height: 2;
953 }
954
955 .linkurl {
956 color: #000;
957 }
958
959 .linkdescription {
960 font-size: 10pt;
961 }
962
963 .linktag {
964 border: 1px solid black;
965 font-style: italic;
966 font-size: 8pt;
967 }
968}
969
970@media handheld, only screen and (max-width: 480px), only screen and (max-device-width: 854px) {
971 /* A few fixes for mobile devices (far from perfect). */
972
973 .tagfilter div.awesomplete {
974 width: 70%;
975 }
976
977 .nomobile {
978 display: none;
979 }
980
981 #logo {
982 display: none;
983 }
984
985 #pageheader #menu ul {
986 text-align: center;
987 }
988
989 #pageheader #menu a {
990 padding: 5px;
991 border-radius: 3px 3px 3px 3px;
992 margin: 3px;
993 }
994
995 #headerform label {
996 width: 100%;
997 display: block;
998 height: auto;
999 line-height: 25px;
1000 padding-bottom: 10px;
1001 }
1002
1003 #headerform label input[type=text],
1004 #headerform label input[type=password]{
1005 float: right;
1006 width: 70%;
1007 }
1008
1009 .searchform, .tagfilter {
1010 display: block !important;
1011 margin: 0px 3px 7px 0px !important;
1012 padding: 0px !important;
1013 width: 97% !important;
1014 }
1015
1016 .searchform input, .tagfilter input {
1017 margin: 0px !important;
1018 padding: 0px !important;
1019 display: inline !important;
1020 }
1021
1022 .tagfilter input.bigbutton, .searchform input.bigbutton, .addform input.bigbutton, a.bigbutton {
1023 width: 30%;
1024 font-size: smaller;
1025 }
1026
1027 #searchform_value {
1028 width: 70% !important;
1029 }
1030
1031 #tagfilter_value {
1032 width: 70% !important;
1033 }
1034
1035 div.qrcode {
1036 position: relative;
1037 float: left;
1038 top: -10px;
1039 left: 0px;
1040 }
1041
1042 .paging_privatelinks {
1043 float: none;
1044 }
1045
1046 .paging_linksperpage {
1047 float: none;
1048 margin-bottom: 10px;
1049 font-size: smaller;
1050 }
1051
1052 #paging_older, #paging_newer, .paging_linksperpage a {
1053 border: 1px solid black;
1054 padding: 3px 5px 3px 5px;
1055 background-color: #666;
1056 color: #fff;
1057 border-radius: 3px 3px 3px 3px;
1058 }
1059
1060 .thumbnail {
1061 float: none;
1062 height: auto;
1063 margin: 0px;
1064 text-align: center;
1065 }
1066
1067 #cloudtag {
1068 padding: 0px;
1069 }
1070
1071 div.dailyAbout {
1072 float: none;
1073 position: relative;
1074 width: 100%;
1075 clear: both;
1076 padding: 0px;
1077 top: 0px;
1078 left: 0px;
1079 }
1080
1081 #daily_col1, #daily_col2, #daily_col3 {
1082 float: none;
1083 width: 100%;
1084 padding: 0px;
1085 }
1086
1087 div.dailyTitle {
1088 font-size: 18pt;
1089 margin-top: 5px;
1090 padding: 0px;
1091 }
1092
1093 div.dailyDate {
1094 font-size: 11pt;
1095 padding: 0px;
1096 display: block;
1097 }
1098
1099 div.dailyEntryTitle {
1100 font-size: 16pt;
1101 font-weight: bold;
1102 }
1103
1104 div.dailyEntryDescription {
1105 font-size: 10pt;
1106 }
1107}
1108
1109#toolsdiv a.button-description {
1110 clear: none;
1111}
1112
1113/* Highlight search results */
1114.highlight {
1115 background-color: #FFFF33;
1116}
1117
1118.center {
1119 text-align: center;
1120}
1121
1122ul.errors {
1123 color: red;
1124 float: left;
1125}
1126
1127#pluginsadmin {
1128 width: 80%;
1129 padding: 20px 0 0 20px;
1130}
1131
1132#pluginsadmin section {
1133 padding: 20px 0;
1134}
1135
1136#pluginsadmin .plugin_parameters {
1137 margin: 10px 0;
1138}
1139
1140#pluginsadmin h1 {
1141 font-style: normal;
1142}
1143
1144#pluginsadmin h2 {
1145 font-size: 1.4em;
1146 font-weight: bold;
1147}
1148
1149#pluginsadmin table {
1150 width: 100%;
1151}
1152
1153#pluginsadmin table, #pluginsadmin th, #pluginsadmin td {
1154 border-width: 1px 0;
1155 border-style: solid;
1156 border-color: #c0c0c0;
1157}
1158
1159#pluginsadmin table th {
1160 font-weight: bold;
1161 padding: 10px 0;
1162}
1163
1164#pluginsadmin table td {
1165 padding: 5px 0;
1166}
1167
1168#pluginsadmin input[type=submit] {
1169 margin: 10px 0;
1170}
1171
1172#pluginsadmin label {
1173 cursor: pointer;
1174}
1175
1176#pluginsadmin .plugin_parameter {
1177 padding: 10px 0;
1178 border-width: 1px 0;
1179 border-style: solid;
1180 border-color: #c0c0c0;
1181}
1182
1183#pluginsadmin .float_label {
1184 float: left;
1185 width: 40%;
1186}
1187
1188#pluginsadmin a {
1189 color: #486D08;
1190}
1191
1192#pluginsadmin a.arrow {
1193 color: black;
1194}
1195
1196/* 404 page */
1197.error-container {
1198
1199 margin: 50px;
1200 margin-top: 20px;
1201}
1202
1203.error-container h1 {
1204 text-decoration: none;
1205 font-style: normal;
1206 color: #80AD48;
1207}
1208
1209.linklist-plugin-icon {
1210 width: 13px;
1211 height: 13px;
1212}
diff --git a/assets/vintage/img/50pc_transparent.png b/assets/vintage/img/50pc_transparent.png
new file mode 100644
index 00000000..8d8f99de
--- /dev/null
+++ b/assets/vintage/img/50pc_transparent.png
Binary files differ
diff --git a/assets/vintage/img/Paper_texture_v5_by_bashcorpo_w1000.jpg b/assets/vintage/img/Paper_texture_v5_by_bashcorpo_w1000.jpg
new file mode 100644
index 00000000..dd8e67ac
--- /dev/null
+++ b/assets/vintage/img/Paper_texture_v5_by_bashcorpo_w1000.jpg
Binary files differ
diff --git a/assets/vintage/img/calendar.png b/assets/vintage/img/calendar.png
new file mode 100644
index 00000000..81c74519
--- /dev/null
+++ b/assets/vintage/img/calendar.png
Binary files differ
diff --git a/assets/vintage/img/delete_icon.png b/assets/vintage/img/delete_icon.png
new file mode 100644
index 00000000..810b94d8
--- /dev/null
+++ b/assets/vintage/img/delete_icon.png
Binary files differ
diff --git a/assets/vintage/img/edit_icon.png b/assets/vintage/img/edit_icon.png
new file mode 100644
index 00000000..16c440c8
--- /dev/null
+++ b/assets/vintage/img/edit_icon.png
Binary files differ
diff --git a/assets/vintage/img/favicon.ico b/assets/vintage/img/favicon.ico
new file mode 100644
index 00000000..c8b043b4
--- /dev/null
+++ b/assets/vintage/img/favicon.ico
Binary files differ
diff --git a/assets/vintage/img/feed-icon-14x14.png b/assets/vintage/img/feed-icon-14x14.png
new file mode 100644
index 00000000..10161702
--- /dev/null
+++ b/assets/vintage/img/feed-icon-14x14.png
Binary files differ
diff --git a/assets/vintage/img/floral_left.png b/assets/vintage/img/floral_left.png
new file mode 100644
index 00000000..f09a861d
--- /dev/null
+++ b/assets/vintage/img/floral_left.png
Binary files differ
diff --git a/assets/vintage/img/floral_right.png b/assets/vintage/img/floral_right.png
new file mode 100644
index 00000000..0dfb6112
--- /dev/null
+++ b/assets/vintage/img/floral_right.png
Binary files differ
diff --git a/assets/vintage/img/logo.png b/assets/vintage/img/logo.png
new file mode 100644
index 00000000..f8b0c94f
--- /dev/null
+++ b/assets/vintage/img/logo.png
Binary files differ
diff --git a/assets/vintage/img/private.png b/assets/vintage/img/private.png
new file mode 100644
index 00000000..8919d658
--- /dev/null
+++ b/assets/vintage/img/private.png
Binary files differ
diff --git a/assets/vintage/img/private_16x16.png b/assets/vintage/img/private_16x16.png
new file mode 100644
index 00000000..8bb34d7d
--- /dev/null
+++ b/assets/vintage/img/private_16x16.png
Binary files differ
diff --git a/assets/vintage/img/private_16x16_active.png b/assets/vintage/img/private_16x16_active.png
new file mode 100644
index 00000000..af990d2c
--- /dev/null
+++ b/assets/vintage/img/private_16x16_active.png
Binary files differ
diff --git a/assets/vintage/img/squiggle.png b/assets/vintage/img/squiggle.png
new file mode 100644
index 00000000..c795f0a3
--- /dev/null
+++ b/assets/vintage/img/squiggle.png
Binary files differ
diff --git a/assets/vintage/img/squiggle_closing.png b/assets/vintage/img/squiggle_closing.png
new file mode 100644
index 00000000..3f9d02b1
--- /dev/null
+++ b/assets/vintage/img/squiggle_closing.png
Binary files differ
diff --git a/assets/vintage/img/tag_blue.png b/assets/vintage/img/tag_blue.png
new file mode 100644
index 00000000..7ec902fc
--- /dev/null
+++ b/assets/vintage/img/tag_blue.png
Binary files differ
diff --git a/assets/vintage/js/base.js b/assets/vintage/js/base.js
new file mode 100644
index 00000000..9bcc96fb
--- /dev/null
+++ b/assets/vintage/js/base.js
@@ -0,0 +1,32 @@
1window.onload = function () {
2 var continent = document.getElementById('continent');
3 var city = document.getElementById('city');
4 if (continent != null && city != null) {
5 continent.addEventListener('change', function(event) {
6 hideTimezoneCities(city, continent.options[continent.selectedIndex].value, true);
7 });
8 hideTimezoneCities(city, continent.options[continent.selectedIndex].value, false);
9 }
10};
11
12/**
13 * Add the class 'hidden' to city options not attached to the current selected continent.
14 *
15 * @param cities List of <option> elements
16 * @param currentContinent Current selected continent
17 * @param reset Set to true to reset the selected value
18 */
19function hideTimezoneCities(cities, currentContinent, reset = false) {
20 var first = true;
21 [].forEach.call(cities, function(option) {
22 if (option.getAttribute('data-continent') != currentContinent) {
23 option.className = 'hidden';
24 } else {
25 option.className = '';
26 if (reset === true && first === true) {
27 option.setAttribute('selected', 'selected');
28 first = false;
29 }
30 }
31 });
32}