R4THF7FOB3LE7JE7DMA5UL6PJIYZMNUWH6TLUKDHNB2X47V4MAEQC
L3PX32UXE2SC4JK3VXLL654DHBZGVXSBLZRQIGUIB4RIXEVHU5IQC
QX7XVNQYOTBDULUCLFRGSATHL7KWBSEV6QWNFY353S7ZIR6UGJWQC
SXSLASK6UE4R24JBPAHVXH7IT4QVFU76T2ASPDIPI7HYKPF6M46QC
NLSNNB46NE4J26V72TP27OHEZFUFG5REZ5N72FDWDNB5K4TAZQIAC
UW4WSPWD7TVQWURMTLRNW6LKVFLUVQT7NBUP5A4WMAIVHSLUPH7AC
MCPXLE6LIQRLQA2OBQSVIH4O3HAEZZWKPQMEDERPBHN6IVOAVXVAC
TYCBCSGHUAHVPEH5E3LW7KURDC5W4CZ73WSBVRTOWTBSKUNPATUQC
EUMM2RHPFO5XQ6WMZO7PPRQK6A5WVOUTSPP4FSEP4EQWBXJYZN4QC
R6Y5EKVY5CYGP3RONJ6MKTUBHU4QDHALEYPEPQN25LTACKIGBDVAC
EZHOZLJCJNWS7KMYAFTMVOL54XDQNZQJ4O6E6OKWCBXPHDOMATVQC
A4YDN3ZM5CNM43BMK4BAEB6I2GVQQZUKBCZYMYCRVZSS6EXRY3VAC
TW5LVJJLFOTPD7UWZ42ZAW6OCAAQ6FUWIZT42R4W7CPFVXMGIG7QC
}
.menubar.scrolled {
background-color: @card-background-color;
position: fixed;
width: 100%;
left: 0;
right: 0;
top: 0;
margin-top: -130px;
padding-top: 0 !important;
padding-bottom: 0 !important;
-webkit-box-shadow: 0 4px 15px -5px rgba(0, 0, 0, 0.1);
box-shadow: 0 4px 15px -5px rgba(0, 0, 0, 0.1);
.menubar.scrolled.awake {
margin-top: 0px;
-webkit-transition: .3s all ease-out;
-o-transition: .3s all ease-out;
transition: .3s all ease-out;
}
.menubar.scrolled.sleep {
-webkit-transition: .3s all ease-out;
-o-transition: .3s all ease-out;
transition: .3s all ease-out;
}
#mainbox {
display: none;
}
.closebtn {
display: none;
}
.mobile-header {
display: none;
}
.mobile-header {
position: absolute;
top: 12px;
left: 0;
display: block;
width: 100%;
text-align: center;
color: @fontcolor;
font-size: 1.25em;
font-weight: 400;
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
.page-teaser-desc h2,
.page-header .home,
.page-albumtitle {
font-size: 2.0em;
#menu {
position: fixed !important;
top: 0px !important;
left: 0px !important;
height: 100%;
width: 0px;
padding: 8px 0 0 32px;
margin: 0;
background-color: @card-background-color;
padding-top: 100px;
overflow-x: hidden;
transition: all .5s;
z-index: 1500;
display: none;
text-align: left;
box-shadow: @menubar-box-shadow;
}
a.menubar-item {
padding: 8px 0 8px 0;
text-decoration: none;
font-size: 20px;
color: #999;
display: block;
text-align: left;
left: 32px;
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
border: none;
line-height: 2em;
}
#menu a:hover {
border: none;
}
#menu .closebtn {
position: absolute;
top: 0px;
right: 4px;
font-size: 36px;
padding: 8px;
margin: 0;
display: inline-block;
color: @fontcolor;
}
span.active,
span.desktop {
display: none;
}
.page-teaser-desc h2,
.page-header .home,
.page-albumtitle {
font-size: 2.0em;
}
}
.megamenu {
position: fixed;
top: 0;
left: 0;
background-color: #fafafa;
height: 100%;
width: 420px;
overflow: scroll;
z-index: 5000;
display: none;
box-shadow: 0 12px 0 0 rgba(0, 0, 0, .35)
}
#megaitems {
padding-top: 20px;
}
.megamenu-title {
padding-left: 4px;
padding-top: 18px;
line-height: 2em;
font-size: 1.2em;
font-weight: 400;
}
.megamenu #albums {
margin: 1em 0 0 40px;
}
.megamenu .card {
width: 154px;
height: 132px;
}
.megamenu .card-photo {
width: 100%;
height: 96px;
}
.megamenu #albums .card-info h3 {
font-size: 0.9em;
text-align: center;
}
.megamenu #albums .card-info .summary,
.megamenu #albums .card-info .date {
display: none;
}
.menu-close {
position: relative;
top: 3px;
border: 0;
width: 44px;
background-color: transparent;
font-size: 1.4em;
}
.menu-close:hover {
color: @hovercolor;
cursor: pointer;
}
{{#each breadcrumbs~}}
<a class="menubar-item" href="{{relative url}}">{{#compare this.title '==' 'Home'}}{{@root.gallery.settings.tabHome}}{{else}}{{this.title}}{{/compare}}</a><span class="desktop"> </span>
{{~/each~}}
<span class="menubar-item active">{{album.title}}</span>
<a href="#" class="closebtn" onclick="closeFunction()">×</a>
<a class="avatar-link" href="{{album.files.0.meta.exif.DocumentName}} title="{{album.files.0.meta.exif.DocumentName}}">
<img src="public/assets/{{album.files.0.meta.exif.Copyright}}" class="avatar-small" alt="" title="{{album.files.0.meta.exif.DocumentName}}"></img>
<a class="avatar-link" href="{{album.files.0.meta.exif.DocumentName}}" title="{{album.files.0.meta.exif.DocumentName}}">
<img src="{{@root.gallery.settings.assets}}{{album.files.0.meta.exif.Copyright}}" class="avatar-small" alt="" title="{{album.files.0.meta.exif.DocumentName}}"></img>
<img src="public/assets/{{album.files.0.meta.exif.Copyright}}" class="avatar-small" alt="" title="{{album.files.0.meta.exif.Artist}}"></img>
<img src="{{@root.gallery.settings.assets}}{{album.files.0.meta.exif.Copyright}}" class="avatar-small" alt="" title="{{album.files.0.meta.exif.Artist}}"></img>
<a class="avatar-link" href="{{album.files.0.meta.exif.DocumentName}} title="{{album.files.0.meta.exif.DocumentName}}">
<img src="public/assets/{{album.files.0.meta.exif.Copyright}}" class="avatar-small" alt="" title="{{album.files.0.meta.exif.DocumentName}}"></img>
<a class="avatar-link" href="{{album.files.0.meta.exif.DocumentName}}" title="{{album.files.0.meta.exif.DocumentName}}">
<img src="{{@root.gallery.settings.assets}}{{album.files.0.meta.exif.Copyright}}" class="avatar-small" alt="" title="{{album.files.0.meta.exif.DocumentName}}"></img>
<img src="public/assets/{{album.files.0.meta.exif.Copyright}}" class="avatar-small" alt="" title="{{album.files.0.meta.exif.Artist}}"></img>
<img src="{{@root.gallery.settings.assets}}{{album.files.0.meta.exif.Copyright}}" class="avatar-small" alt="" title="{{album.files.0.meta.exif.Artist}}"></img>
{{> galleryHeader}}
{{> galleryHeader}}
<aside id="gallery-overview" class="megamenu">
{{#if @root.gallery.settings.menutitle}}
<h2 class="megamenu-title"><button class="menu-close icon-arrow-left"></button>{{@root.gallery.settings.tabHome}} | {{@root.gallery.settings.menutitle}}</h2>
{{/if}}
<div id="megaitems"></div>
<div class="space3em"> </div>
</aside>
/*
* get the navigation menu for the current gallery
*/
"use strict";
var results = [];
/**
* @call foldertree album 'navi.json'
* foldertree album gallery.settings.navigation
*/
module.exports = (jsonObj, filename) => {
const fs = require('fs');
// console.log(jsonObj)
albumdata(jsonObj.albums);
if (results && results.length) {
var jsonContent = JSON.stringify(results, null, 4);
fs.writeFile(filename, jsonContent, 'utf8', function(err) {
if (err) {
console.log("An error occured while writing JSON Object to File " + filename);
return console.log(err);
}
});
}
}
/**
* get all album data
* @param {*} data
*/
function albumdata(data) {
data.forEach(function(obj) {
var d = {};
d.title = obj.title;
d.basename = obj.basename;
d.url = obj.url;
d.image = obj.files[0].output.thumbnail.path;
d.summary = obj.summary;
d.depth = obj.depth;
results.push(d);
if (obj.albums && obj.albums.length > 0) {
albumdata(obj.albums);
}
})
}
function openFunction(){
document.getElementById("menu").style.width="300px";
$("#menu").toggle();
}
function closeFunction(){
document.getElementById("menu").style.width="0px";
$("#menu").toggle();
document.getElementById("mainbox").innerHTML="☰";
}
//open sidebar with album teasers
function handleMegaItems(){
$('.shimlayer').toggle()
$('.megamenu').fadeToggle( "slow", "linear" );
if ( $( "#megaitems" ).data('loaded')) return;
$('#megaitems').load("index.html #albums").fadeIn('slow');
$('#megaitems').data('loaded', '1');
}
$('.menubutton').on('click', function(event){
event.preventDefault();
handleMegaItems();
});
$('.megamenu-title').on('click', function(event){
event.preventDefault();
handleMegaItems();
});
{
"input": "/Users/petsie1612/ips_apps/webfotos/tmp2",
"output": "./fbtemp2",
"title": "Fotobuch Peter Siebler",
"include-raw-photos": false,
"photo-quality": 90,
"thumb-size": 360,
"large-size": 1200,
"embed-exif": true,
"sort-albums-by": "title",
"sort-albums-direction": "desc",
"theme-path": "/Users/petsie1612/ips_apps/webfotos/theme-cards-flow/theme",
"cleanup": true,
"footer": "<span>Test Fotopalbum</span>",
"usage-stats": false,
"settings": "/Users/petsie1612/ips_apps/webfotos/tmp2-cfg.json",
"_log": "debug"
}
{
"author": "Peter Siebler",
"logo": "public/assets/icons/apple-touch-icon.png",
"application": "tumbsUp Fotobook",
"menutitle": "Meine Alben",
"appVersion": "2.1.0",
"assets": "public/assets/",
"tabHome": "Fotobuch",
"albumPrefix": "Album",
"albumsPrefix": "Alben",
"albumCardTitle": "Öffne Album ",
"copyright": "2019 Peter Siebler. All rights reserved.",
"navigation": "navi/fotobuch.json"
}
```
##Features
- Layout with cards (gallery, album)
- Flow Layout for album fotos
- Modified thumbsup: add Application settings.
- Album cover with text for gallery- & Album pages
- Cover Text is based on EXIF Data
- Sidemenu to select the albums