diff --git a/.eleventy.js b/.eleventy.js index b5468e2..00dded1 100644 --- a/.eleventy.js +++ b/.eleventy.js @@ -14,14 +14,14 @@ module.exports = function (eleventyConfig) { trimBlocks: true }); - eleventyConfig.addGlobalData('permalink', () => { + eleventyConfig.addGlobalData("permalink", () => { return (data) => `${data.page.filePathStem}.${data.page.outputFileExtension}`; }); let demoMode = false; let pageBase = demoMode ? './demo/' : './'; - eleventyConfig.addGlobalData('hippie', { + eleventyConfig.addGlobalData("hippie", { pageBase: pageBase, brand: 'hippie', titlePrefix: '', @@ -30,32 +30,32 @@ module.exports = function (eleventyConfig) { legacyMode: false }); - eleventyConfig.addPassthroughCopy({'source/art/images': 'art'}); + eleventyConfig.addPassthroughCopy({"source/art/images": "art"}); - eleventyConfig.addPassthroughCopy({'source/art/favicons/**/*.+(ico|png|svg)': '.'}); + eleventyConfig.addPassthroughCopy({"source/art/favicons/**/*.+(ico|png|svg)": "."}); - eleventyConfig.addPassthroughCopy({'source/code/**/*.js': 'js'}); + eleventyConfig.addPassthroughCopy({"source/code/**/*.js": "js"}); - eleventyConfig.addPassthroughCopy({'source/data/**/*.json': 'json'}); + eleventyConfig.addPassthroughCopy({"source/data/**/*.json": "json"}); - eleventyConfig.addPassthroughCopy('vendor'); - eleventyConfig.addPassthroughCopy({'node_modules/bootstrap-icons': 'vendor/bootstrap-icons'}); + eleventyConfig.addPassthroughCopy("vendor"); + eleventyConfig.addPassthroughCopy({"node_modules/bootstrap-icons": "vendor/bootstrap-icons"}); eleventyConfig.addPassthroughCopy({ - 'node_modules/jquery/dist/jquery.min.js': 'vendor/jquery.min.js', - 'node_modules/jquery/dist/jquery.min.map': 'vendor/jquery.min.map' + "node_modules/jquery/dist/jquery.min.js": "vendor", + "node_modules/jquery/dist/jquery.min.map": "vendor" }); // eleventyConfig.addPassthroughCopy({"node_modules/normalize.css/normalize.css": "vendor/normalize.css"}); - eleventyConfig.addWatchTarget('./source/style/'); + eleventyConfig.addWatchTarget("./source/style/"); return { dir: { - input: 'source/screens', - output: 'build', - includes: '../templates', - data: '../data' + input: "source/screens", + output: "build", + includes: "../templates", + data: "../data" }, - templateFormats: ['html', 'liquid', 'njk', 'md'] + templateFormats: ["html", "liquid", "njk", "md"] // pathPrefix: './demo/' }; }; diff --git a/.jshintrc b/.jshintrc index e11b79d..7554aff 100644 --- a/.jshintrc +++ b/.jshintrc @@ -7,25 +7,25 @@ // Enforcing "bitwise" : true, // true: Prohibit bitwise operators (&, |, ^, etc.) "camelcase" : false, // true: Identifiers must be in camelCase - "curly" : false, // true: Require {} for every new block or scope + "curly" : true, // true: Require {} for every new block or scope "eqeqeq" : true, // true: Require triple equals (===) for comparison "forin" : true, // true: Require filtering for..in loops with obj.hasOwnProperty() "freeze" : true, // true: prohibits overwriting prototypes of native objects such as Array, Date etc. "immed" : false, // true: Require immediate invocations to be wrapped in parens e.g. `(function () { } ());` - "latedef" : true, // true: Require variables/functions to be defined before being used - "newcap" : true, // true: Require capitalization of all constructor functions e.g. `new F()` + "latedef" : false, // true: Require variables/functions to be defined before being used + "newcap" : false, // true: Require capitalization of all constructor functions e.g. `new F()` "noarg" : true, // true: Prohibit use of `arguments.caller` and `arguments.callee` "noempty" : true, // true: Prohibit use of empty blocks "nonbsp" : true, // true: Prohibit `non-breaking whitespace` characters. "nonew" : false, // true: Prohibit use of constructors for side-effects (without assignment) "plusplus" : false, // true: Prohibit use of `++` and `--` - "quotmark" : true, // Quotation mark consistency: + "quotmark" : false, // Quotation mark consistency: // false : do nothing (default) // true : ensure whatever is used is consistent // "single" : require single quotes // "double" : require double quotes "undef" : true, // true: Require all non-global variables to be declared (prevents global leaks) - "unused" : true, // Unused variables: + "unused" : false, // Unused variables: // true : all variables, last function parameter // "vars" : all variables only // "strict" : all variables, all function parameters @@ -42,7 +42,7 @@ "boss" : false, // true: Tolerate assignments where comparisons would be expected "debug" : false, // true: Allow debugger statements e.g. browser breakpoints. "eqnull" : false, // true: Tolerate use of `== null` - "esversion" : 9, // {int} Specify the ECMAScript version to which the code must adhere. + "esversion" : 6, // {int} Specify the ECMAScript version to which the code must adhere. "moz" : false, // true: Allow Mozilla specific syntax (extends and overrides esnext features) // (ex: `for each`, multiple try/catch, function expression…) "evil" : false, // true: Tolerate use of `eval` and `new Function()` diff --git a/source/code/app.js b/source/code/app.js new file mode 100644 index 0000000..8632638 --- /dev/null +++ b/source/code/app.js @@ -0,0 +1,149 @@ +//NEW + +function Clock(id) { + this.id = id; + + var that = this; + setInterval(function () { that.updateClock(); }, 1000); + this.updateClock(); +} + +Clock.prototype.updateClock = function () { + var date = new Date(); + var clock = document.getElementById(this.id); + //console.log(this); + clock.innerHTML = this.formatDigits(date.getHours()) + ":" + this.formatDigits(date.getMinutes()) + ":" + this.formatDigits(date.getSeconds()); +}; + +Clock.prototype.formatDigits = function (val) { + if (val < 10) val = "0" + val; + + return val; +} + +//OLD + +var floor = Math.floor; + +function ongoing() { + + var now = new Date(); + + var w = Math.floor(now.getDay()); + var D = new Array("Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"); + var DNumb = Math.floor(now.getDate()); + var MNumb = Math.floor(now.getMonth()); + var M = new Array("Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"); + var y = Math.floor(now.getYear()); + if (y < 999) y += 1900; + + var ms = Math.floor(now.getMilliseconds()); + var s = Math.floor(now.getSeconds()); + var m = Math.floor(now.getMinutes() + s / 60); + var h = Math.floor(now.getHours() + m / 60); + + var j2000 = new Date(); // Bezugspunkt ist der 1.1.2000 0:00 UT (entspricht JD 2451544,5) + j2000.setUTCFullYear(2000, 0, 1); + j2000.setUTCHours(0, 0, 0, 0); + + var utc = new Date(); + utc.setUTCFullYear(y, MNumb, DNumb); // Monate müssen im Wertebereich 0...11 übergeben werden + utc.setUTCHours(h, m, s, ms); + + var utc0 = new Date(); + utc0.setUTCFullYear(y, MNumb, DNumb); + utc0.setUTCHours(0, 0, 0, 0); + + var jd = 2451544.5 + (utc - j2000) / 86400000; // Zählung erfolgt in Millisekunden, 1 Tag = 86.400.000 ms + var jdUTC0 = 2451544.5 + (utc0 - j2000) / 86400000; + + var N = jd - 2451545.0; + var L = 280.460 + 0.9856474 * N; // mittlere ekliptikale Länge der Sonne + var g = 357.528 + 0.9856003 * N; // mittlere Anomalie + var el = L + 1.915 * Math.sin(g) + 0.020 * Math.sin(2 * g); + var e = 23.439 - 0.0000004 * N; + var rektaszension = Math.atan((Math.cos(e) * Math.sin(el)) / Math.cos(el)); + + var T = (jdUTC0 - 2451545.0) / 36525; + var stGMT = (((6 * 3600) + (41 * 60) + 50.54841) + (8640184.812866 * T) + (0.093104 * Math.pow(T, 2)) - (0.0000062 * Math.pow(T, 3))) / 3600; + + var stGMT2 = 6.697376 + 2400.05134 * T + 1.002738 * T; + var hWGMT = stGMT2 * 15; + var hW = hWGMT + 11.9566185772; + + var st = (stGMT + (now.getUTCHours() * 1.00273790935)) + (11.9566185772 / 15); // Sommerzeit muss noch berücksichtigt werden + var st24 = Math.abs(st - (Math.round(st / 24) * 24)); + var stH = Math.floor(st24); + var stM = Math.floor((st24 % 1) * 60); + var stS = zeroFill(Math.floor((((st24 % 1) * 60) % 1) * 60), 2); + + var travelWidth = document.body.clientWidth; + var travelHeight = document.body.clientHeight; + var sunPosX = 0; + var sunPosY = 0; + var moonPosX = 0; + var moonPosY = 0; + + var sun = $("#sun").css({ + "left": (s / 60) * travelWidth, + "top": (m / 60) * travelHeight + }); + + $("#day").text(D[w]); + $("#dayNumb").text(DNumb); + $("#month").text(M[MNumb]); + $("#year").text(y); + $("#time").text('' + zeroFill(h, 2) + ':' + zeroFill(m, 2) + ':' + zeroFill(s, 2)); + + $("#julian").text(jd.toFixed(6)); + //$("#star").text(stH + ':' + stM + ':' + stS); + $("#star").text(stH + ':' + stM); + $("#star1").text(stGMT); + $("#star2").text(stGMT2); + +} + +function zeroFill(number, width) { + width -= number.toString().length; + if (width > 0) { + return new Array(width + (/\./.test(number) ? 2 : 1)).join('0') + number; + } + return number + ""; // always return a string +} + +//Länge der Balken im Diagram berechnen +function barwidth(size, G, W) { + var s = size; + var g = G; + var w = W; + var p = (w / g) * 100; + var newW = s * (p / 100); + + return newW; +} +//String Element erweitern +String.prototype.transform = function () { + return parseFloat(this.replace(',', '.')); +} +//Array Element erweitern +Array.prototype.arrayAdd = function () { + return eval(this.join("+")); +} +//Speicherplatz in Prozent berechnen +function percentage(total, gigs, round) { + var totalSpace = total; + var singleSpace = gigs; + var z = round; + var p = singleSpace / (totalSpace / 100); + + return p; +} +//Speicherplatz in GB berechnen +function gigabytes(percent, total, round) { + var occupiedPercent = percent; + var singleSpace = total; + var z = round; + var g = (singleSpace / 100) * occupiedPercent; + + return g; +} diff --git a/source/code/hippie/app.js b/source/code/hippie/app.js deleted file mode 100644 index 4da28e0..0000000 --- a/source/code/hippie/app.js +++ /dev/null @@ -1,533 +0,0 @@ -// TODO: Inhalte angleichen nach Zusammenfassung von app.js und function.js. -// Bennung und Beschreibungen verbessern. - -// This is called everytime -function setup() { - 'use strict'; - - console.group('Document information'); - console.info('\n', hippie.brand, '\n\n'); - console.info('HTML:', hippie.screen, '\nBODY:', hippie.body); - console.groupEnd(); - if (debugOn) { - console.group('Debug information'); - console.dir(hippie); - console.groupEnd(); - } -} - -// MODULE Scroll navigation -// Using constructor function -function HippieScroll($tp, $dn) { - 'use strict'; - - // this.$tp = $tp; - // Define initial situation - let initLeft = false; - const initY = hippie.screen.vh; - - $tp.addClass('di_none'); - - // Check scroll position and toggle element - this.check = function () { - hippie.screen.y = Math.min($(document).scrollTop(), document.documentElement.scrollTop); - if (hippie.screen.y > initY) { - if (!initLeft) { - $tp.removeClass('di_none'); - console.info('Initial viewport left'); - } - initLeft = true; - } else { - if (initLeft) { - $tp.addClass('di_none'); - console.info('Initial viewport entered'); - } - initLeft = false; - } - }; - - // Add events to navigation elements - $tp.click(function (event) { - event.preventDefault(); - $('html, body').stop().animate({ - scrollTop: 0 - }, basicEase); - // console.log('Scrolled to top'); - }); - $dn.click(function (event) { - event.preventDefault(); - var pos = Math.max(hippie.screen.dh, hippie.body.h) - hippie.screen.vh; - $('html').scrollTop(pos); - // document.documentElement.scrollTop = pos; - console.info('Scrolled down to', pos); - }); -} - -function HippieFade(toggleElement, initState) { - 'use strict'; - - const fragment = document.createDocumentFragment(); - const overlay = document.createElement('div'); - - overlay.id = 'mouse-overlay'; - - if (initState) { - overlay.classList.add('active'); - } - - toggleElement.addEventListener('click', function () { - overlay.classList.toggle('active'); - }); - - fragment.appendChild(overlay); - document.body.style.position = 'relative'; - document.body.prepend(fragment); -} - -// MODULE Meta elements -function HippieMeta($ma, $pp) { - 'use strict'; - - let metaOn = false; - - $ma.click(function () { - var $wrap, $pop; - - // if (metaOn !== true) { - if (!metaOn) { - metaOn = true; - - $pp.each(function () { - // if ($(this).css('position') === 'static') { - // $(this).addClass('js_changed_pos'); - // $(this).css('position', 'relative'); - // } - // $pop = $(this).next('.exp_pop').detach(); - // $wrap = $(this).wrap('').parent().prepend('').prepend(''); - // $wrap.after($pop); - - $('
').addClass('exp_overlay').css({ - position: 'absolute', - width: '100%', - height: '100%', - top: 0, - left: 0 - }).appendTo($(this).addClass('exp_wrap')); - - // Displays explanation popup following the mouse - $(this).on({ - mouseenter: function () { - // if ($(this).attr('emmet')) { - // - // } - $(this).next('.exp_pop').show(); - }, - mouseleave: function () { - $(this).next('.exp_pop').hide(); - }, - mousemove: function (event) { - $(this).next('.exp_pop').css({ - 'top': event.pageY - $(this).next('.exp_pop').outerHeight() - 4, - 'left': event.pageX + 8 - // 'left': event.pageX - $(this).offset().left + 8 - }); - } - }); - }); - - } else { - $pp.each(function () { - $(this).off('mouseenter mouseleave mousemove'); - - $(this).removeClass('exp_wrap').find('.exp_overlay').remove(); - // $wrap = $(this).parent('.exp_wrap'); - // $pop = $wrap.next('.exp_pop').detach(); - // $wrap.find('.exp_marker_pop').remove(); - // $(this).unwrap('.exp_wrap'); - // $(this).after($pop); - // if ($(this).hasClass('js_changed_pos')) { - // $(this).css('position', ''); - // if ($(this).attr('style') === '') { - // $(this).removeAttr('style'); - // } - // $(this).removeClass('js_changed_pos'); - // } - }); - - metaOn = false; - } - console.log('Explanation mode', metaOn); - }); -} - -// Sets the href attribute to mailto: with given information -function composeMail(tag, name, prov, suffix, text, topic) { - let trigger = tag.indexOf("."); - let mailString = name + '@' + prov + '.' + suffix; - let textString = mailString.replace(/@/g, "(at)"); - let descString = "Nachricht an " + mailString; - - if (!text) { - text = mailString; - } else if (text === "at") { - text = textString; - } else if (text === "to") { - text = descString; - } - - if (topic) { - topic = "?subject=" + topic; - } else { - topic = ""; - } - - if (trigger === -1) { - const el = document.getElementById(tag); - const elContent = el.innerHTML; - - el.innerHTML = elContent + text; - el.setAttribute("href", "mailto:" + mailString + topic); - } else { - const els = document.getElementsByClassName(tag.slice(1)); - - for (let el of els) { - const elContent = el.innerHTML; - - el.innerHTML = elContent + text; - el.setAttribute("href", "mailto:" + mailString + topic); - } - } -} - -// get document coordinates of the element -// function getCoords (elem) { -// let box = elem.getBoundingClientRect(); -// -// return { -// top: box.top + pageYOffset, -// left: box.left + pageXOffset -// }; -// } - -// https://stackoverflow.com/a/488073/1444149 -// function Utils () {} -// -// Utils.prototype = { -// constructor: Utils, -// isElementInView: function (element, fullyInView) { -// var pageTop = $(window).scrollTop(); -// var pageBottom = pageTop + $(window).height(); -// var elementTop = $(element).offset().top; -// var elementBottom = elementTop + $(element).height(); -// -// if (fullyInView === true) { -// return ((pageTop < elementTop) && (pageBottom > elementBottom)); -// } else { -// return ((elementTop <= pageBottom) && (elementBottom >= pageTop)); -// } -// } -// }; -// -// var Utils = new Utils(); - -class TimeDisplay { - constructor(element, options, interval) { - this.element = element; - this.options = options || {hour: '2-digit', minute: '2-digit', second: '2-digit', hour12: false}; - this.interval = interval || 1000; - this.isPaused = false; - this.locale = navigator.language || 'en-US'; - - this.updateTime(); - - console.group('Time information'); - console.info('\nOptions:', this.options, '\n\n'); - console.info('Interval:', this.interval); - console.groupEnd(); - } - - formatTime(time) { - return time.toLocaleTimeString(this.locale, this.options); - } - - // TODO: Zeit nur im Sekundentakt aktualisieren wenn Sekunden angezeigt werden - async updateTime() { - while (true) { - if (!this.isPaused) { - const now = new Date(); - this.element.textContent = this.formatTime(now); - } - await new Promise(resolve => setTimeout(resolve, this.interval)); - } - } - - pause() { - this.isPaused = true; - } - - resume() { - this.isPaused = false; - } -} - -class DateDisplay { - constructor(element, options, direction) { - this.element = element; - this.options = options || {year: 'numeric', month: 'long', day: 'numeric'}; - this.direction = direction || 0; - - this.updateDate(); - this.checkForDateChange(); - - console.group('Date information'); - console.info('\nOptions:', this.options, '\n\n'); - console.info('Remaining minutes:', Math.floor(this.getTimeUntilNextMidnight() / 3600)); - console.groupEnd(); - } - - formatDate(date) { - const formatter = new Intl.DateTimeFormat(navigator.language, this.options); - - switch (this.direction) { - case 1: - const dateString = formatter - .formatToParts(date) - .map(({type, value}) => { - // if (type === 'day' || type === 'month') { - if (type === 'literal') { - return `${value}
`; - } else { - return value; - } - }) - .join(''); - - return dateString; - case 0: - default: - return formatter.format(date); - } - } - - updateDate() { - const now = new Date(); - - this.element.innerHTML = this.formatDate(now); - } - - changeFormat(format, direction) { - this.options = format; - this.direction = direction; - - this.updateDate(); - } - - getTimeUntilNextMidnight() { - const now = new Date(); - const nextMidnight = new Date(now.getFullYear(), now.getMonth(), now.getDate() + 1); - - return nextMidnight - now; - } - - checkForDateChange() { - const timeUntilNextMidnight = this.getTimeUntilNextMidnight(); - - setTimeout(() => { - this.updateDate(); - this.checkForDateChange(); - }, timeUntilNextMidnight); - } -} - -// CONCEPTS - -// NOTE: Benutzt private Zuweisungen -class elementBinder { - #element; - - constructor(element) { - this.#setElement(element); - } - - #setElement(value) { - if (!value) { - throw new Error('No element found'); - } - this.#element = value; - this.#element.style.background = "hotpink"; - } - - get element() { - return this.#element; - } - - set element(value) { - this.#setElement(value); - } -} - -//OLD - -function Clock(id) { - 'use strict'; - - this.id = id; - const that = this; - - setInterval(function () { - that.updateClock(); - }, 1000); - this.updateClock(); -} - -Clock.prototype.updateClock = function () { - 'use strict'; - - const date = new Date(); - const clock = document.getElementById(this.id); - //console.log(this); - clock.innerHTML = this.formatDigits(date.getHours()) + ':' + this.formatDigits(date.getMinutes()) + ":" + this.formatDigits(date.getSeconds()); -}; - -Clock.prototype.formatDigits = function (val) { - 'use strict'; - - if (val < 10) val = '0' + val; - - return val; -}; - -var floor = Math.floor; - -function ongoing() { - - var now = new Date(); - - var w = Math.floor(now.getDay()); - var D = new Array("Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"); - var DNumb = Math.floor(now.getDate()); - var MNumb = Math.floor(now.getMonth()); - var M = new Array("Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"); - var y = Math.floor(now.getYear()); - if (y < 999) y += 1900; - - var ms = Math.floor(now.getMilliseconds()); - var s = Math.floor(now.getSeconds()); - var m = Math.floor(now.getMinutes() + s / 60); - var h = Math.floor(now.getHours() + m / 60); - - var j2000 = new Date(); // Bezugspunkt ist der 1.1.2000 0:00 UT (entspricht JD 2451544,5) - j2000.setUTCFullYear(2000, 0, 1); - j2000.setUTCHours(0, 0, 0, 0); - - var utc = new Date(); - utc.setUTCFullYear(y, MNumb, DNumb); // Monate müssen im Wertebereich 0...11 übergeben werden - utc.setUTCHours(h, m, s, ms); - - var utc0 = new Date(); - utc0.setUTCFullYear(y, MNumb, DNumb); - utc0.setUTCHours(0, 0, 0, 0); - - var jd = 2451544.5 + (utc - j2000) / 86400000; // Zählung erfolgt in Millisekunden, 1 Tag = 86.400.000 ms - var jdUTC0 = 2451544.5 + (utc0 - j2000) / 86400000; - - var N = jd - 2451545.0; - var L = 280.460 + 0.9856474 * N; // mittlere ekliptikale Länge der Sonne - var g = 357.528 + 0.9856003 * N; // mittlere Anomalie - var el = L + 1.915 * Math.sin(g) + 0.020 * Math.sin(2 * g); - var e = 23.439 - 0.0000004 * N; - var rektaszension = Math.atan((Math.cos(e) * Math.sin(el)) / Math.cos(el)); - - var T = (jdUTC0 - 2451545.0) / 36525; - var stGMT = (((6 * 3600) + (41 * 60) + 50.54841) + (8640184.812866 * T) + (0.093104 * Math.pow(T, 2)) - (0.0000062 * Math.pow(T, 3))) / 3600; - - var stGMT2 = 6.697376 + 2400.05134 * T + 1.002738 * T; - var hWGMT = stGMT2 * 15; - var hW = hWGMT + 11.9566185772; - - var st = (stGMT + (now.getUTCHours() * 1.00273790935)) + (11.9566185772 / 15); // Sommerzeit muss noch berücksichtigt werden - var st24 = Math.abs(st - (Math.round(st / 24) * 24)); - var stH = Math.floor(st24); - var stM = Math.floor((st24 % 1) * 60); - var stS = zeroFill(Math.floor((((st24 % 1) * 60) % 1) * 60), 2); - - var travelWidth = document.body.clientWidth; - var travelHeight = document.body.clientHeight; - var sunPosX = 0; - var sunPosY = 0; - var moonPosX = 0; - var moonPosY = 0; - - var sun = $("#sun").css({ - "left": (s / 60) * travelWidth, - "top": (m / 60) * travelHeight - }); - - $("#day").text(D[w]); - $("#dayNumb").text(DNumb); - $("#month").text(M[MNumb]); - $("#year").text(y); - $("#time").text('' + zeroFill(h, 2) + ':' + zeroFill(m, 2) + ':' + zeroFill(s, 2)); - - $("#julian").text(jd.toFixed(6)); - //$("#star").text(stH + ':' + stM + ':' + stS); - $("#star").text(stH + ':' + stM); - $("#star1").text(stGMT); - $("#star2").text(stGMT2); - -} - -function zeroFill(number, width) { - width -= number.toString().length; - if (width > 0) { - return new Array(width + (/\./.test(number) ? 2 : 1)).join('0') + number; - } - return number + ""; // always return a string -} - -//Länge der Balken im Diagram berechnen -function barwidth(size, G, W) { - var s = size; - var g = G; - var w = W; - var p = (w / g) * 100; - var newW = s * (p / 100); - - return newW; -} - -//String Element erweitern -String.prototype.transform = function () { - return parseFloat(this.replace(',', '.')); -} -//Array Element erweitern -Array.prototype.arrayAdd = function () { - return eval(this.join("+")); -} - -//Speicherplatz in Prozent berechnen -function percentage(total, gigs, round) { - var totalSpace = total; - var singleSpace = gigs; - var z = round; - var p = singleSpace / (totalSpace / 100); - - return p; -} - -//Speicherplatz in GB berechnen -function gigabytes(percent, total, round) { - var occupiedPercent = percent; - var singleSpace = total; - var z = round; - var g = (singleSpace / 100) * occupiedPercent; - - return g; -} - -function checkButtonAndTarget(event, element, button = 0) { - return ( - event.button === button && - event.target === element - ); -} \ No newline at end of file diff --git a/source/code/hippie/functions.js b/source/code/hippie/functions.js new file mode 100644 index 0000000..ef2e3c7 --- /dev/null +++ b/source/code/hippie/functions.js @@ -0,0 +1,228 @@ +// This is called everytime +function setup() { + 'use strict'; + + console.group('Document information'); + console.info('\n', hippie.brand, '\n\n'); + console.info('HTML:', hippie.screen, '\nBODY:', hippie.body); + console.groupEnd(); + if (debugOn) { + console.group('Debug information'); + console.dir(hippie); + console.groupEnd(); + } +} + +// MODULE Scroll navigation +// Using constructor function +function HippieScroll($tp, $dn) { + 'use strict'; + + // this.$tp = $tp; + // Define initial situation + let initLeft = false; + const initY = hippie.screen.vh; + + $tp.addClass('di_none'); + + // Check scroll position and toggle element + this.check = function () { + hippie.screen.y = Math.min($(document).scrollTop(), document.documentElement.scrollTop); + if (hippie.screen.y > initY) { + if (!initLeft) { + $tp.removeClass('di_none'); + console.info('Initial viewport left'); + } + initLeft = true; + } else { + if (initLeft) { + $tp.addClass('di_none'); + console.info('Initial viewport entered'); + } + initLeft = false; + } + }; + + // Add events to navigation elements + $tp.click(function (event) { + event.preventDefault(); + $('html, body').stop().animate({ + scrollTop: 0 + }, basicEase); + // console.log('Scrolled to top'); + }); + $dn.click(function (event) { + event.preventDefault(); + var pos = Math.max(hippie.screen.dh, hippie.body.h) - hippie.screen.vh; + $('html').scrollTop(pos); + // document.documentElement.scrollTop = pos; + console.info('Scrolled down to', pos); + }); +} + +function HippieFade(toggleElement, initState) { + 'use strict'; + + const fragment = document.createDocumentFragment(); + const overlay = document.createElement('div'); + + overlay.id = 'mouse-overlay'; + + if (initState) { + overlay.classList.add('active'); + } + + toggleElement.addEventListener('click', function () { + overlay.classList.toggle('active'); + }); + + fragment.appendChild(overlay); + document.body.style.position = 'relative'; + document.body.prepend(fragment); +} + +// MODULE Meta elements +function HippieMeta($ma, $pp) { + 'use strict'; + + let metaOn = false; + + $ma.click(function () { + var $wrap, $pop; + + // if (metaOn !== true) { + if (!metaOn) { + metaOn = true; + + $pp.each(function () { + // if ($(this).css('position') === 'static') { + // $(this).addClass('js_changed_pos'); + // $(this).css('position', 'relative'); + // } + // $pop = $(this).next('.exp_pop').detach(); + // $wrap = $(this).wrap('').parent().prepend('').prepend(''); + // $wrap.after($pop); + + $('
').addClass('exp_overlay').css({ + position: 'absolute', + width: '100%', + height: '100%', + top: 0, + left: 0 + }).appendTo($(this).addClass('exp_wrap')); + + // Displays explanation popup following the mouse + $(this).on({ + mouseenter: function () { + // if ($(this).attr('emmet')) { + // + // } + $(this).next('.exp_pop').show(); + }, + mouseleave: function () { + $(this).next('.exp_pop').hide(); + }, + mousemove: function (event) { + $(this).next('.exp_pop').css({ + 'top': event.pageY - $(this).next('.exp_pop').outerHeight() - 4, + 'left': event.pageX + 8 + // 'left': event.pageX - $(this).offset().left + 8 + }); + } + }); + }); + + } else { + $pp.each(function () { + $(this).off('mouseenter mouseleave mousemove'); + + $(this).removeClass('exp_wrap').find('.exp_overlay').remove(); + // $wrap = $(this).parent('.exp_wrap'); + // $pop = $wrap.next('.exp_pop').detach(); + // $wrap.find('.exp_marker_pop').remove(); + // $(this).unwrap('.exp_wrap'); + // $(this).after($pop); + // if ($(this).hasClass('js_changed_pos')) { + // $(this).css('position', ''); + // if ($(this).attr('style') === '') { + // $(this).removeAttr('style'); + // } + // $(this).removeClass('js_changed_pos'); + // } + }); + + metaOn = false; + } + console.log('Explanation mode', metaOn); + }); +} + +// Sets the href attribute to mailto: with given information +function composeMail(tag, name, prov, suffix, text, topic) { + let trigger = tag.indexOf("."); + let mailString = name + '@' + prov + '.' + suffix; + let textString = mailString.replace(/@/g, "(at)"); + let descString = "Nachricht an " + mailString; + + if (!text) { + text = mailString; + } else if (text === "at") { + text = textString; + } else if (text === "to") { + text = descString; + } + + if (topic) { + topic = "?subject=" + topic; + } else { + topic = ""; + } + + if (trigger === -1) { + const el = document.getElementById(tag); + const elContent = el.innerHTML; + + el.innerHTML = elContent + text; + el.setAttribute("href", "mailto:" + mailString + topic); + } else { + const els = document.getElementsByClassName(tag.slice(1)); + + for (let el of els) { + const elContent = el.innerHTML; + + el.innerHTML = elContent + text; + el.setAttribute("href", "mailto:" + mailString + topic); + }; + } +} + +// get document coordinates of the element +// function getCoords (elem) { +// let box = elem.getBoundingClientRect(); +// +// return { +// top: box.top + pageYOffset, +// left: box.left + pageXOffset +// }; +// } + +// https://stackoverflow.com/a/488073/1444149 +// function Utils () {} +// +// Utils.prototype = { +// constructor: Utils, +// isElementInView: function (element, fullyInView) { +// var pageTop = $(window).scrollTop(); +// var pageBottom = pageTop + $(window).height(); +// var elementTop = $(element).offset().top; +// var elementBottom = elementTop + $(element).height(); +// +// if (fullyInView === true) { +// return ((pageTop < elementTop) && (pageBottom > elementBottom)); +// } else { +// return ((elementTop <= pageBottom) && (elementBottom >= pageTop)); +// } +// } +// }; +// +// var Utils = new Utils(); diff --git a/source/code/hippie/global.js b/source/code/hippie/global.js new file mode 100644 index 0000000..0b05906 --- /dev/null +++ b/source/code/hippie/global.js @@ -0,0 +1,3 @@ +// Setup +// ----------------------------------------------------------------------------- +setup(); diff --git a/source/code/hippie/globals.js b/source/code/hippie/variables.js similarity index 92% rename from source/code/hippie/globals.js rename to source/code/hippie/variables.js index 756af36..b5d8538 100644 --- a/source/code/hippie/globals.js +++ b/source/code/hippie/variables.js @@ -4,7 +4,7 @@ let hippie = { w: Math.max(document.documentElement.offsetWidth, document.documentElement.clientWidth, window.innerWidth, 0), vh: Math.max(document.documentElement.clientHeight, window.innerHeight, 0), dh: Math.max(document.documentElement.offsetHeight, document.documentElement.clientHeight, 0), - y: document.documentElement.scrollTop + y: Math.min($(document).scrollTop(), document.documentElement.scrollTop) // hippie.screen.y: document.documentElement.scrollTop }, body: { diff --git a/source/code/windows.js b/source/code/windows.js index 6ca9f64..f282729 100644 --- a/source/code/windows.js +++ b/source/code/windows.js @@ -1,47 +1,155 @@ -class HippieTaskBar { - constructor(element, placeholder, options) { +class Draggable { + constructor(element) { this.element = element; - this.placeholder = placeholder; - this.date = null; this.offsetX = 0; this.offsetY = 0; this.isDragging = false; - this.barSize = '64px'; - // TODO: Erweitern auf allgemeine Möglichkeiten und dann aus JSON-Datei laden - this.options = options || { - direction: 0, - date: { - year: 'numeric', - month: '2-digit', - day: '2-digit' - } - }; + this.barSize = ''; this.init(); } - // TODO: Ereignisse besser delegieren init() { this.element.addEventListener('mousedown', this.onMouseDown.bind(this)); document.addEventListener('mousemove', this.onMouseMove.bind(this)); document.addEventListener('mouseup', this.onMouseUp.bind(this)); - - const dateElement = document.createElement('span'); - - dateElement.id = 'date'; - this.element.querySelector('.clock').appendChild(dateElement); - this.date = new DateDisplay(dateElement, this.options.date); - - this.setOptions('bottom'); + this.setPosition('bottom'); } onMouseDown(event) { - if (checkButtonAndTarget(event, this.element, 0)) { - console.debug('Drag mode enabled'); + this.isDragging = true; + this.offsetX = event.clientX - this.element.getBoundingClientRect().left; + this.offsetY = event.clientY - this.element.getBoundingClientRect().top; + event.preventDefault(); + } + + onMouseMove(event) { + if (!this.isDragging) { + return; + } + + let x = event.clientX - this.offsetX; + let y = event.clientY - this.offsetY; + + // Update the position of the element + this.element.style.left = `${x}px`; + this.element.style.top = `${y}px`; + } + + onMouseUp() { + if (!this.isDragging) { + return; + } + this.isDragging = false; + + this.snapToEdges(); + } + + snapToEdges() { + const rect = this.element.getBoundingClientRect(); + const windowWidth = window.innerWidth; + const windowHeight = window.innerHeight; + + // Determine the closest edge + const distances = { + left: rect.left, + right: windowWidth - rect.right, + top: rect.top, + bottom: windowHeight - rect.bottom + }; + + const closestEdge = Object.keys(distances).reduce((a, b) => distances[a] < distances[b] ? a : b); + + /*switch (closestEdge) { + case 'left': + this.element.style.left = '0px'; + this.element.style.top = `${rect.top}px`; + break; + case 'right': + this.element.style.left = `${windowWidth - rect.width}px`; + this.element.style.top = `${rect.top}px`; + break; + case 'top': + this.element.style.top = '0px'; + this.element.style.left = `${rect.left}px`; + break; + case 'bottom': + this.element.style.top = `${windowHeight - rect.height}px`; + this.element.style.left = `${rect.left}px`; + break; + }*/ + this.setPosition(closestEdge, this.barSize); + } + + setPosition(side, barSize) { + switch (side) { + case 'left': + // this.element.style.top = `${rect.top}px`; // Optional: keep vertical position + this.element.style.top = '0px'; + this.element.style.right = ''; + this.element.style.bottom = '0px'; + this.element.style.left = '0px'; + this.element.style.width = barSize; + this.element.style.height = ''; + break; + case 'right': + // this.element.style.left = `${windowWidth - rect.width}px`; + // this.element.style.top = `${rect.top}px`; // Optional: keep vertical position + this.element.style.top = '0px'; + this.element.style.right = '0px'; + this.element.style.bottom = '0px'; + this.element.style.left = ''; + this.element.style.width = barSize; + this.element.style.height = ''; + break; + case 'top': + // this.element.style.top = '0px'; + // this.element.style.left = `${rect.left}px`; // Optional: keep horizontal position + this.element.style.top = '0px'; + this.element.style.right = '0px'; + this.element.style.bottom = ''; + this.element.style.left = '0px'; + this.element.style.width = ''; + this.element.style.height = barSize; + break; + case 'bottom': + // this.element.style.top = `${windowHeight - rect.height}px`; + // this.element.style.left = `${rect.left}px`; // Optional: keep horizontal position + this.element.style.top = ''; + this.element.style.right = '0px'; + this.element.style.bottom = '0px'; + this.element.style.left = '0px'; + this.element.style.width = ''; + this.element.style.height = barSize; + break; + } + } +} + +class DragAdv { + constructor(element, placeholder) { + this.element = element; + this.placeholder = placeholder; + this.offsetX = 0; + this.offsetY = 0; + this.isDragging = false; + this.barSize = ''; + + this.init(); + } + + init() { + this.element.addEventListener('mousedown', this.onMouseDown.bind(this)); + document.addEventListener('mousemove', this.onMouseMove.bind(this)); + document.addEventListener('mouseup', this.onMouseUp.bind(this)); + this.setPosition('bottom', this.barSize); + } + + onMouseDown(event) { + if (event.button === 0) { this.isDragging = true; - // TODO: Platzhalter anpassen je nach Ziel this.showPlaceholder(); this.offsetX = this.placeholder.getBoundingClientRect().width / 2; @@ -58,29 +166,21 @@ class HippieTaskBar { } onMouseMove(event) { - if (this.isDragging) { - if (!this.isDragging) return; + if (!this.isDragging) return; - let x = event.clientX - this.offsetX; - let y = event.clientY - this.offsetY; + let x = event.clientX - this.offsetX; + let y = event.clientY - this.offsetY; - console.debug('Position: ', x, y); - - this.placeholder.style.left = `${x}px`; - this.placeholder.style.top = `${y}px`; - } + this.placeholder.style.left = `${x}px`; + this.placeholder.style.top = `${y}px`; } onMouseUp() { - if (event.target === this.placeholder) { - console.debug('Drag mode disabled'); + if (!this.isDragging) return; + this.isDragging = false; - if (!this.isDragging) return; - this.isDragging = false; - - this.snapToEdges(); - this.hidePlaceholder(); - } + this.snapToEdges(); + this.hidePlaceholder(); } showPlaceholder() { @@ -93,85 +193,88 @@ class HippieTaskBar { this.element.style.display = ''; } - // TODO: Prüfung auf Ziel auslagern und schon bei Mausbewegung verfügbar machen snapToEdges() { const rect = this.placeholder.getBoundingClientRect(); const windowWidth = window.innerWidth; const windowHeight = window.innerHeight; + const distances = { - top: rect.top, + left: rect.left, right: windowWidth - rect.right, - bottom: windowHeight - rect.bottom, - left: rect.left + top: rect.top, + bottom: windowHeight - rect.bottom }; + const closestEdge = Object.keys(distances).reduce((a, b) => distances[a] < distances[b] ? a : b); - this.setOptions(closestEdge); - this.date.changeFormat(this.options.date, this.options.direction); + this.setPosition(closestEdge, this.barSize); } - setOptions(position) { - const attributes = { - top: { - className: 'top', - styles: { - top: '0', right: '0', bottom: '', left: '0', - width: '', height: this.barSize, - flexDirection: 'row' - } - }, - right: { - className: 'right', - styles: { - top: '0', right: '0', bottom: '0', left: '', - width: this.barSize, height: '', - flexDirection: 'column' - } - }, - bottom: { - className: 'bottom', - styles: { - top: '', right: '0', bottom: '0', left: '0', - width: '', height: this.barSize, - flexDirection: 'row' - } - }, - left: { - className: 'left', - styles: { - top: '0', - right: '', - bottom: '0', - left: '0', - width: this.barSize, - height: '', - flexDirection: 'column' - } - } - }; - - this.element.classList.remove(...Object.values(attributes).map(pos => pos.className)); - Object.keys(attributes[position].styles).forEach(key => { - this.element.style[key] = ''; - }); - - this.element.classList.add(attributes[position].className); - Object.entries(attributes[position].styles).forEach(([key, value]) => { - this.element.style[key] = value; - }); - - switch (position) { - case 'right': + setPosition(side, barSize) { + switch (side) { case 'left': - this.options.date = {year: '2-digit', month: '2-digit', day: '2-digit'}; - this.options.direction = 1; + // this.element.style.top = `${rect.top}px`; // Optional: keep vertical position + this.element.style.top = '0px'; + this.element.style.right = ''; + this.element.style.bottom = '0px'; + this.element.style.left = '0px'; + this.element.style.width = barSize; + this.element.style.height = ''; + break; + case 'right': + // this.element.style.left = `${windowWidth - rect.width}px`; + // this.element.style.top = `${rect.top}px`; // Optional: keep vertical position + this.element.style.top = '0px'; + this.element.style.right = '0px'; + this.element.style.bottom = '0px'; + this.element.style.left = ''; + this.element.style.width = barSize; + this.element.style.height = ''; break; case 'top': + // this.element.style.top = '0px'; + // this.element.style.left = `${rect.left}px`; // Optional: keep horizontal position + this.element.style.top = '0px'; + this.element.style.right = '0px'; + this.element.style.bottom = ''; + this.element.style.left = '0px'; + this.element.style.width = ''; + this.element.style.height = barSize; + break; case 'bottom': - default: - this.options.date = {year: 'numeric', month: '2-digit', day: '2-digit'}; - this.options.direction = 0; + // this.element.style.top = `${windowHeight - rect.height}px`; + // this.element.style.left = `${rect.left}px`; // Optional: keep horizontal position + this.element.style.top = ''; + this.element.style.right = '0px'; + this.element.style.bottom = '0px'; + this.element.style.left = '0px'; + this.element.style.width = ''; + this.element.style.height = barSize; break; } } } + +class BestDrag { + #element; + + constructor(element) { + this.#setElement(element); + } + + #setElement(value) { + if (!value) { + throw new Error('No element found'); + } + this.#element = value; + this.#element.style.background = "hotpink"; + } + + get element() { + return this.#element; + } + + set element(value) { + this.#setElement(value); + } +} \ No newline at end of file diff --git a/source/data/start.json b/source/data/new.json similarity index 56% rename from source/data/start.json rename to source/data/new.json index cc0da22..9d4a0a8 100644 --- a/source/data/start.json +++ b/source/data/new.json @@ -5,10 +5,10 @@ }, { "text": "Basics", - "href": "/demo/basics.html" + "href": "./demo/basics.html" }, { "text": "Drag", - "href": "/demo/examples/ui/drag.html" + "href": "./demo/examples/ui/drag.html" } ] \ No newline at end of file diff --git a/source/screens/demo/examples/ui/gallery.liquid b/source/screens/demo/examples/ui/gallery.liquid index c548374..f29cae5 100755 --- a/source/screens/demo/examples/ui/gallery.liquid +++ b/source/screens/demo/examples/ui/gallery.liquid @@ -37,7 +37,7 @@ tags: {{ block.super -}} +{% endblock %} \ No newline at end of file diff --git a/source/screens/demo/examples/ui/start.liquid b/source/screens/demo/examples/ui/start.liquid deleted file mode 100644 index 261cb16..0000000 --- a/source/screens/demo/examples/ui/start.liquid +++ /dev/null @@ -1,45 +0,0 @@ ---- -title: Start -tags: -- ui ---- -{% assign bodyClass = "body_new" -%} -{% layout "hippie/app.liquid" %} - -{% block body %} -{% render 'hippie/partials/header-status', hippie: hippie, links: start %} - -
-
1
-
2
-
3
-
4
-
-{% endblock %} - -{%- block script %} -{{ block.super -}} - -{% endblock %} \ No newline at end of file diff --git a/source/screens/demo/examples/ui/windows.liquid b/source/screens/demo/examples/ui/windows.liquid index a0603e6..daacb66 100644 --- a/source/screens/demo/examples/ui/windows.liquid +++ b/source/screens/demo/examples/ui/windows.liquid @@ -18,8 +18,6 @@ tags:
-
- ##:## -
-
+ @@ -43,8 +40,6 @@ tags: {% endblock %} {%- block script %} - - {% endblock %} \ No newline at end of file diff --git a/source/style/modules/ui/_windows_module.scss b/source/style/modules/ui/_windows_module.scss index d633b29..c7a9846 100644 --- a/source/style/modules/ui/_windows_module.scss +++ b/source/style/modules/ui/_windows_module.scss @@ -25,54 +25,18 @@ $padding_half: calc(#{hippie.$space_half} - 3px) hippie.$space_half; padding: hippie.$space_basic; background-color: rgba(0, 0, 0, .1); - &.top, - &.bottom { - nav, - & > div { - &:last-child { - margin-top: unset; - margin-left: auto; - } - } - - .clock { - text-align: end; - } - } - - &.right, - &.left { - nav, - & > div { - &:last-child { - margin-top: auto; - margin-left: unset; - } - } - - .clock { - text-align: center; - - & > span { - display: inline-block; - word-wrap: anywhere; - } - } - } - nav, & > div { @extend %flex-bar; - flex-direction: inherit; + + &:last-child { + margin-left: auto; + } } button { @extend .button_io; overflow: hidden; - - * { - pointer-events: none; - } } nav.small { @@ -102,6 +66,8 @@ $padding_half: calc(#{hippie.$space_half} - 3px) hippie.$space_half; } .clock { + text-align: end; + &, & > * { line-height: 1; diff --git a/source/templates/demo/_default.njk b/source/templates/demo/_default.njk index e9b46de..c8aeed3 100644 --- a/source/templates/demo/_default.njk +++ b/source/templates/demo/_default.njk @@ -15,5 +15,5 @@ {% block script %} {{ super() }} - + {% endblock %} \ No newline at end of file diff --git a/source/templates/hippie/_app.njk b/source/templates/hippie/_app.njk index cf48706..3dcc729 100755 --- a/source/templates/hippie/_app.njk +++ b/source/templates/hippie/_app.njk @@ -22,8 +22,8 @@ {% block body %}{% endblock %} {% block script %} - - + + #} - - - + + {# // TODO: Remove dependecy to jQuery; at least maek it optional #} + + + + - +