From f8b17d4177bd13585d319e0e86399f128b56ba40 Mon Sep 17 00:00:00 2001 From: dpilafian Date: Tue, 3 Jan 2023 02:25:53 -0800 Subject: [PATCH] Release v1.6.2 --- LICENSE.txt | 2 +- dist/blogger-tweaks.min.css | 8 +++---- dist/layouts/block-duo.css | 2 +- dist/layouts/color-blocks.css | 2 +- dist/layouts/color-slide.css | 2 +- dist/layouts/letterbox.css | 2 +- dist/layouts/modern.css | 2 +- dist/layouts/neon.css | 2 +- dist/layouts/neon.min.js | 2 +- dist/layouts/vertical-bars.css | 2 +- dist/layouts/zebra-sections.css | 2 +- dist/lib-x.d.ts | 36 ++++++++++++++++---------------- dist/lib-x.dev.js | 16 +++++++------- dist/lib-x.js | 16 +++++++------- dist/lib-x.min.js | 4 ++-- dist/reset.min.css | 2 +- package.json | 22 +++++++++---------- spec/package.spec.js | 2 +- src/css/blogger-tweaks/spec.html | 6 +++--- src/js/lib-x.ts | 4 ++-- task-runner.sh.command | 2 +- 21 files changed, 69 insertions(+), 69 deletions(-) diff --git a/LICENSE.txt b/LICENSE.txt index f58a88f..61ab4dd 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2018-2022 individual contributors to web-ignition +Copyright (c) 2018-2023 Individual contributors to web-ignition Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/dist/blogger-tweaks.min.css b/dist/blogger-tweaks.min.css index 0e4ee76..bb4751b 100644 --- a/dist/blogger-tweaks.min.css +++ b/dist/blogger-tweaks.min.css @@ -1,4 +1,4 @@ -/*! web-ignition v1.6.1 ~~ https://github.com/center-key/web-ignition ~~ MIT License */ +/*! web-ignition v1.6.2 ~~ https://github.com/center-key/web-ignition ~~ MIT License */ #header-container #header .header-bar .title h3{border-bottom:2px solid transparent;margin-left:20px;transition:all 400ms}#header-container #header .header-bar .title h3:hover{border-color:#000}#header-container #header .header-drawer{top:35px}#attribution-container,#header-container #header .header-drawer #views.menu,#main #content .article .article-content .hide-me,body>.viewitem-panel{display:none;visibility:hidden;max-width:0;max-height:0;opacity:0;z-index:-10000}#main #sidebar{width:340px;margin-top:-30px}#main #sidebar .items .item h3.title{font-size:1rem}#main #content{margin-left:360px}#main #content .article .article-header h1.title{font-size:2rem;font-weight:700;padding-right:0}#main #content .article .article-content{font-size:1.2rem;text-align:left;word-break:normal;margin-bottom:40px}#main #content .article .article-content table{border-collapse:collapse;margin-bottom:20px}#main #content .article .article-content table caption{font-size:.9rem;font-weight:700;text-transform:uppercase;letter-spacing:.16em;color:#696969;margin:.4rem 0}#main #content .article .article-content table thead tr{border-bottom:3px solid #4682b4}#main #content .article .article-content table thead tr th{text-align:left;padding:4px 10px}#main #content .article .article-content table tbody tr{border-bottom:1px solid #4682b4;transition:all 400ms}#main #content .article .article-content table tbody tr:hover{background-color:#f0f8ff}#main #content .article .article-content table tbody tr td{vertical-align:top;padding:4px 10px}#main #content .article .article-content output{display:block;background-color:#f0fff0;border:3px solid #8fbc8f;padding:0 10px 5px;margin-bottom:20px;overflow:hidden}#main #content .article .article-content output>h2{font-size:1.3rem;color:#fff;background-color:#8fbc8f;padding:0 10px 3px;margin:0-10px 5px}#main #content .article .article-content output>pre{margin:0 0-1.2em -3.3em;overflow-x:scroll;overflow-y:hidden}#main #content .article .article-content .indent{display:block;margin-left:30px}#main #content .article .article-content .framed,#main #content .article .article-content .framed-padded{border:15px solid silver}#main #content .article .article-content .framed-padded{padding:15px}#main #content .article .article-content .highlight{background-color:#ffffe0;padding:0 3px}#main #content .article .article-content .highlight2{padding:0 3px;background-color:#ffe4e1}#main #content .article .article-content *{box-sizing:border-box}#main #content .article .article-content h2{font-size:1.2rem;font-weight:100;letter-spacing:.08rem;text-align:center;color:gray;margin:-10px 0 20px}#main #content .article .article-content h3{margin-bottom:5px}#main #content .article .article-content nav{clear:both;border:1px solid silver;padding:10px 20px;background-color:#f5f5f5;margin-bottom:20px}#main #content .article .article-content nav ol,#main #content .article .article-content nav ul{margin:0}#main #content .article .article-content p{margin-top:0}#main #content .article .article-content ol,#main #content .article .article-content ul{padding-left:3em;margin:0 0 1em}#main #content .article .article-content pre{word-break:normal;word-wrap:normal}#main #content .article .article-content img{max-width:100%;border-image:none;border-width:0;padding:0;margin:0}#main #content .article .article-content figure{text-align:center;margin:0 0 20px}#main #content .article .article-content figure.full-width img{max-height:none}#main #content .article .article-content figure.small-image img{max-height:120px}#main #content .article .article-content figure figcaption{font-weight:700}#main #content .article .article-content figure img{max-height:200px}#main #content .article .article-content figure.hljs-enhance{clear:both;text-align:left}#main #content .article .article-content figure.hljs-enhance figcaption{font-size:1.1rem}#main #content .article .article-content aside{float:right;max-width:150px;margin:0 0 15px 20px}#main #content .article .article-content aside.left{float:left;margin:0 20px 15px 0}#main #content .article .article-content>footer{text-align:center;border-top:1px solid silver;padding-top:35px;margin-top:40px}#main #content .article .article-content>footer>i{font-weight:lighter}#main #content .article .article-footer{border-top:1px solid silver} /* @@ -21,11 +21,11 @@ - + - - + + diff --git a/dist/layouts/block-duo.css b/dist/layouts/block-duo.css index f8165e7..4e78bfc 100644 --- a/dist/layouts/block-duo.css +++ b/dist/layouts/block-duo.css @@ -1,4 +1,4 @@ -/*! web-ignition v1.6.1 ~~ https://github.com/center-key/web-ignition ~~ MIT License */ +/*! web-ignition v1.6.2 ~~ https://github.com/center-key/web-ignition ~~ MIT License */ /* Block Duo layout -- Two big columns followed by a single footer diff --git a/dist/layouts/color-blocks.css b/dist/layouts/color-blocks.css index 2cebc0c..55955d0 100644 --- a/dist/layouts/color-blocks.css +++ b/dist/layouts/color-blocks.css @@ -1,4 +1,4 @@ -/*! web-ignition v1.6.1 ~~ https://github.com/center-key/web-ignition ~~ MIT License */ +/*! web-ignition v1.6.2 ~~ https://github.com/center-key/web-ignition ~~ MIT License */ /* Color Blocks layout -- Two columns of colorful blocks diff --git a/dist/layouts/color-slide.css b/dist/layouts/color-slide.css index c54af69..498561a 100644 --- a/dist/layouts/color-slide.css +++ b/dist/layouts/color-slide.css @@ -1,4 +1,4 @@ -/*! web-ignition v1.6.1 ~~ https://github.com/center-key/web-ignition ~~ MIT License */ +/*! web-ignition v1.6.2 ~~ https://github.com/center-key/web-ignition ~~ MIT License */ /* Color Slide layout -- Top to botttom color transition diff --git a/dist/layouts/letterbox.css b/dist/layouts/letterbox.css index d95befd..abb4d84 100644 --- a/dist/layouts/letterbox.css +++ b/dist/layouts/letterbox.css @@ -1,4 +1,4 @@ -/*! web-ignition v1.6.1 ~~ https://github.com/center-key/web-ignition ~~ MIT License */ +/*! web-ignition v1.6.2 ~~ https://github.com/center-key/web-ignition ~~ MIT License */ /* Letterbox layout -- Edge-to-edge semi-opaque bar over cover background image diff --git a/dist/layouts/modern.css b/dist/layouts/modern.css index b08c782..d5afc60 100644 --- a/dist/layouts/modern.css +++ b/dist/layouts/modern.css @@ -1,4 +1,4 @@ -/*! web-ignition v1.6.1 ~~ https://github.com/center-key/web-ignition ~~ MIT License */ +/*! web-ignition v1.6.2 ~~ https://github.com/center-key/web-ignition ~~ MIT License */ /* Modern layout -- Clean blog post page diff --git a/dist/layouts/neon.css b/dist/layouts/neon.css index b0b16bc..0fbd739 100644 --- a/dist/layouts/neon.css +++ b/dist/layouts/neon.css @@ -1,4 +1,4 @@ -/*! web-ignition v1.6.1 ~~ https://github.com/center-key/web-ignition ~~ MIT License */ +/*! web-ignition v1.6.2 ~~ https://github.com/center-key/web-ignition ~~ MIT License */ /* Neon layout -- For hackers and space junkies diff --git a/dist/layouts/neon.min.js b/dist/layouts/neon.min.js index ed6b9d3..a75b038 100644 --- a/dist/layouts/neon.min.js +++ b/dist/layouts/neon.min.js @@ -1,2 +1,2 @@ -//! web-ignition v1.6.1 ~~ https://github.com/center-key/web-ignition ~~ MIT License +//! web-ignition v1.6.2 ~~ https://github.com/center-key/web-ignition ~~ MIT License const numNeonImages=8;$("body").addClass("neon-image-"+(Date.now()%numNeonImages+1)); diff --git a/dist/layouts/vertical-bars.css b/dist/layouts/vertical-bars.css index 38d54c2..9e42f95 100644 --- a/dist/layouts/vertical-bars.css +++ b/dist/layouts/vertical-bars.css @@ -1,4 +1,4 @@ -/*! web-ignition v1.6.1 ~~ https://github.com/center-key/web-ignition ~~ MIT License */ +/*! web-ignition v1.6.2 ~~ https://github.com/center-key/web-ignition ~~ MIT License */ /* Vertical Bars layout -- traditional boring old-school webpage diff --git a/dist/layouts/zebra-sections.css b/dist/layouts/zebra-sections.css index eec4048..943c559 100644 --- a/dist/layouts/zebra-sections.css +++ b/dist/layouts/zebra-sections.css @@ -1,4 +1,4 @@ -/*! web-ignition v1.6.1 ~~ https://github.com/center-key/web-ignition ~~ MIT License */ +/*! web-ignition v1.6.2 ~~ https://github.com/center-key/web-ignition ~~ MIT License */ /* Zebra Sections layout -- Edge-to-edge blocks with alternating background colors diff --git a/dist/lib-x.d.ts b/dist/lib-x.d.ts index 1c80df0..d02f983 100644 --- a/dist/lib-x.d.ts +++ b/dist/lib-x.d.ts @@ -1,4 +1,4 @@ -//! web-ignition v1.6.1 ~~ https://github.com/center-key/web-ignition ~~ MIT License +//! web-ignition v1.6.2 ~~ https://github.com/center-key/web-ignition ~~ MIT License /// declare global { @@ -10,48 +10,48 @@ declare global { forEach: (fn: LibXForEachCallback) => JQuery; } } -export declare type Json = string | number | boolean | null | undefined | JsonObject | Json[]; -export declare type JsonObject = { +export type Json = string | number | boolean | null | undefined | JsonObject | Json[]; +export type JsonObject = { [key: string]: Json; }; -export declare type JsonData = JsonObject | Json[]; -export declare type LibXForEachCallback = (elem: JQuery, index: number) => void; -export declare type LibXObject = { +export type JsonData = JsonObject | Json[]; +export type LibXForEachCallback = (elem: JQuery, index: number) => void; +export type LibXObject = { [key: string]: unknown; }; -export declare type LibXUiPopupSettings = { +export type LibXUiPopupSettings = { width: number; height: number; }; -export declare type LibXUiPopupOptions = Partial; -export declare type LibXUiKeepOnScreenSettings = { +export type LibXUiPopupOptions = Partial; +export type LibXUiKeepOnScreenSettings = { padding: number; }; -export declare type LibXUiKeepOnScreenOptions = Partial; -export declare type LibXCryptoHashSettings = { +export type LibXUiKeepOnScreenOptions = Partial; +export type LibXCryptoHashSettings = { algorithm: string; salt: string; }; -export declare type LibXCryptoHashOptions = Partial; -export declare type LibXUiEnei = JQuery | HTMLElement | JQuery.EventBase | number; -export declare type LibXCounterMap = { +export type LibXCryptoHashOptions = Partial; +export type LibXUiEnei = JQuery | HTMLElement | JQuery.EventBase | number; +export type LibXCounterMap = { [counter: string]: number; }; -export declare type LibXSocialButton = { +export type LibXSocialButton = { title: string; icon: string; x: number; y: number; link: string; }; -export declare type LibXMontageLoopSettings = { +export type LibXMontageLoopSettings = { container: string | JQuery; start: number | null; intervalMs: number; fadeMs: number; }; -export declare type LibXMontageLoopOptions = Partial; -export declare type NavigatorUAData = { +export type LibXMontageLoopOptions = Partial; +export type NavigatorUAData = { readonly brands: { brand: string; version: string; diff --git a/dist/lib-x.dev.js b/dist/lib-x.dev.js index e72999e..8234f98 100644 --- a/dist/lib-x.dev.js +++ b/dist/lib-x.dev.js @@ -1,4 +1,4 @@ -//! web-ignition v1.6.1 ~~ https://github.com/center-key/web-ignition ~~ MIT License +//! web-ignition v1.6.2 ~~ https://github.com/center-key/web-ignition ~~ MIT License const libXUi = { plugin: { @@ -210,7 +210,7 @@ const libXCounter = { const libXBrowser = { userAgentData() { var _a; - const polyfil = () => { + const polyfill = () => { var _a, _b, _c, _d, _e; const brandEntry = (_b = (_a = globalThis.navigator.userAgent.split(' ').pop()) === null || _a === void 0 ? void 0 : _a.split('/')) !== null && _b !== void 0 ? _b : []; const hasTouch = !!navigator.maxTouchPoints; @@ -223,7 +223,7 @@ const libXBrowser = { platform: (_e = platforms[platform]) !== null && _e !== void 0 ? _e : platform, }; }; - return (_a = globalThis.navigator['userAgentData']) !== null && _a !== void 0 ? _a : polyfil(); + return (_a = globalThis.navigator['userAgentData']) !== null && _a !== void 0 ? _a : polyfill(); }, iOS() { return libX.browser.userAgentData().platform === 'iOS'; @@ -366,21 +366,21 @@ const libXExtra = { console.log('Article: %c' + $('h1.entry-title').text().trim(), 'color: purple;'); $('#header >.header-bar h3').attr('data-href', websiteUrl); libX.ui.normalize(); - window['hljsEnhance'].setup(); + globalThis['hljsEnhance'].setup(); }; globalThis.setTimeout(libX.ui.normalize, 2000); - return $(window['blogger'].ui()).on({ viewitem: onArticleLoad }); + return $(globalThis['blogger'].ui()).on({ viewitem: onArticleLoad }); }, gTags(scriptTag) { const trackingID = $(scriptTag).attr('src').split('=')[1]; - window['dataLayer'] = window['dataLayer'] || []; - function gtag(...args) { window['dataLayer'].push(args); } + globalThis['dataLayer'] = globalThis['dataLayer'] || []; + function gtag(...args) { globalThis['dataLayer'].push(args); } gtag('js', new Date()); gtag('config', trackingID); }, }; const libX = { - version: '1.6.1', + version: '1.6.2', ui: libXUi, util: libXUtil, crypto: libXCrypto, diff --git a/dist/lib-x.js b/dist/lib-x.js index 85b0766..179d43b 100644 --- a/dist/lib-x.js +++ b/dist/lib-x.js @@ -1,4 +1,4 @@ -//! web-ignition v1.6.1 ~~ https://github.com/center-key/web-ignition ~~ MIT License +//! web-ignition v1.6.2 ~~ https://github.com/center-key/web-ignition ~~ MIT License import { dna } from 'dna-engine'; const libXUi = { @@ -211,7 +211,7 @@ const libXCounter = { const libXBrowser = { userAgentData() { var _a; - const polyfil = () => { + const polyfill = () => { var _a, _b, _c, _d, _e; const brandEntry = (_b = (_a = globalThis.navigator.userAgent.split(' ').pop()) === null || _a === void 0 ? void 0 : _a.split('/')) !== null && _b !== void 0 ? _b : []; const hasTouch = !!navigator.maxTouchPoints; @@ -224,7 +224,7 @@ const libXBrowser = { platform: (_e = platforms[platform]) !== null && _e !== void 0 ? _e : platform, }; }; - return (_a = globalThis.navigator['userAgentData']) !== null && _a !== void 0 ? _a : polyfil(); + return (_a = globalThis.navigator['userAgentData']) !== null && _a !== void 0 ? _a : polyfill(); }, iOS() { return libX.browser.userAgentData().platform === 'iOS'; @@ -367,21 +367,21 @@ const libXExtra = { console.log('Article: %c' + $('h1.entry-title').text().trim(), 'color: purple;'); $('#header >.header-bar h3').attr('data-href', websiteUrl); libX.ui.normalize(); - window['hljsEnhance'].setup(); + globalThis['hljsEnhance'].setup(); }; globalThis.setTimeout(libX.ui.normalize, 2000); - return $(window['blogger'].ui()).on({ viewitem: onArticleLoad }); + return $(globalThis['blogger'].ui()).on({ viewitem: onArticleLoad }); }, gTags(scriptTag) { const trackingID = $(scriptTag).attr('src').split('=')[1]; - window['dataLayer'] = window['dataLayer'] || []; - function gtag(...args) { window['dataLayer'].push(args); } + globalThis['dataLayer'] = globalThis['dataLayer'] || []; + function gtag(...args) { globalThis['dataLayer'].push(args); } gtag('js', new Date()); gtag('config', trackingID); }, }; const libX = { - version: '1.6.1', + version: '1.6.2', ui: libXUi, util: libXUtil, crypto: libXCrypto, diff --git a/dist/lib-x.min.js b/dist/lib-x.min.js index 93e583d..9c9aad7 100644 --- a/dist/lib-x.min.js +++ b/dist/lib-x.min.js @@ -1,2 +1,2 @@ -//! web-ignition v1.6.1 ~~ https://github.com/center-key/web-ignition ~~ MIT License -const libXUi={plugin:{id:function(name){const elem=this;return name===undefined?elem.attr("id"):elem.attr({id:name})},enable:function(setOn){const elem=this;return elem.prop({disabled:setOn!==undefined&&!setOn})},disable:function(setOff){const elem=this;return elem.prop({disabled:setOff===undefined||!!setOff})},findAll:function(selector){const elem=this;return elem.find(selector).addBack(selector)},forEach:function(fn){const elems=this;return elems.each((index,node)=>fn($(node),index))}},toElem(elemOrNodeOrEventOrIndex,that){const elem=elemOrNodeOrEventOrIndex instanceof $&&elemOrNodeOrEventOrIndex;const target=elemOrNodeOrEventOrIndex&&elemOrNodeOrEventOrIndex.target;return elem||$(target||elemOrNodeOrEventOrIndex||that)},makeIcons(holder){const makeIcon=elem=>elem.addClass("fa-"+elem.data().icon);const makeBrand=elem=>elem.addClass("fa-"+elem.data().brand);holder["findAll"]("i[data-icon]").addClass("font-icon fas").forEach(makeIcon);holder["findAll"]("i[data-brand]").addClass("font-icon fab").forEach(makeBrand);return holder},normalize(holder){const elem=holder||$(document.body);libX.ui.makeIcons(elem);elem.find("button:not([type])").attr({type:"button"});elem.find("input:not([type])").attr({type:"text"});elem.find("input[type=email]").attr({autocorrect:"off",spellcheck:false});elem.find("a img, a i.font-icon").closest("a").addClass("image-link");if(!libX.browser.userAgentData().mobile)elem.find("a.external-site, .external-site a").attr({target:"_blank"});return elem},displayAddr(){const elems=$(".display-addr");const display=elem=>elem.html(elem.data().name+""+String.fromCharCode(64)+elem.data().domain+"");return elems.forEach(display)},popup(url,options){const defaults={width:600,height:400};const settings=Object.assign(Object.assign({},defaults),options);const dimensions="left=200,top=100,width="+settings.width+",height="+settings.height;return globalThis.open(url,"_blank",dimensions+",scrollbars,resizable,status")},popupClick(event){const data=$(event.target).data();return libX.ui.popup(data.hrefPopup,data)},revealSection(event){const button=$(event.target).closest(".reveal-button");const findTarget=".reveal-target[data-reveal="+button.data().reveal+"]";const target=button.data().reveal?$(findTarget):button.next();dna.ui.slideFadeOut(button);return dna.ui.slideFadeIn(target)},keepOnScreen(elem,options){const defaults={padding:10};const settings=Object.assign(Object.assign({},defaults),options);const pad=settings.padding;const win={width:$(window).width(),height:$(window).height(),scroll:$(window).scrollTop()};const offset=elem.offset();const moveR=Math.max(-offset.left,-pad)+pad;const moveL=Math.max(offset.left+elem.width()-win.width,-pad)+pad;const moveU=Math.min(win.scroll+win.height-offset.top-elem.height()-pad,0);const moveD=Math.max(moveU,win.scroll-offset.top+pad);return elem.css({left:`+=${moveR-moveL}px`,top:`+=${moveD}px`})},autoDisableButtons(){const disableButton=event=>{const elem=$(event.target);if(!elem.closest("nav,.no-disable").length)elem.closest("button").disable()};const disableFormButton=event=>$(event.target).find("button:not(.no-disable)").disable();$(globalThis.document).on({submit:disableFormButton},"form").on({click:disableButton},"button:not([type=submit],[data-href],[data-href-popup])")},loadImageFadeIn(elem,url,duration){const handleImg=event=>{elem.fadeIn(duration!==null&&duration!==void 0?duration:1500);return elem[0].nodeName==="IMG"?elem.attr({src:event.target.src}):elem.css({backgroundImage:"url("+event.target.src+")"})};const img=new Image;img.onload=handleImg;img.src=url;return elem},setupVideos(){const makeVideoClickable=elem=>{var _a;const src=(_a=elem.find("iframe").attr("src"))!==null&&_a!==void 0?_a:"";const url=src.replace("//www.youtube.com/embed","//youtu.be");elem.attr("data-href",url).addClass("external-site")};$("figure.video-container-link").forEach(makeVideoClickable);return $("figure.video-container >iframe").attr({allow:"fullscreen"}).parent()},setupForkMe(){const forkMe=$("#fork-me").wrap($("
"));const icon=$("",{"data-brand":"github","data-href":forkMe.attr("href")});return forkMe.after(icon).parent().parent().addClass("forkable")}};const libXUtil={cleanupEmail(email){email=email&&email.replace(/\s/g,"").toLowerCase();return/.+@.+[.].+/.test(email)?email:null},isObj(thing){return!!thing&&thing.constructor===Object},removeWhitespace(text){return text.replace(/\s/g,"")},details(thing){const obj=thing;const elem=thing;let msg=typeof thing+" --\x3e ";const addProp=property=>{msg+=property+":"+obj[property]+" "};const jQueryDetials=elem=>elem.length===0?"":" [#1"+" elem:"+elem.first()[0].nodeName+" id:"+elem.first().id()+" class:"+elem.first().attr("class")+" kids:"+elem.first().children().length+"]";if(thing instanceof $)msg+="jquery:"+elem.jquery+" elems:"+elem.length+jQueryDetials(elem);else if(thing===null)msg+="[null]";else if(typeof thing==="object")Object.keys(obj).forEach(addProp);else msg+=thing;return msg},debug(thing){console.log(Date.now()+": "+libX.util.details(thing))}};const libXCrypto={hash(message,options){const defaults={algorithm:"SHA-256",salt:""};const settings=Object.assign(Object.assign({},defaults),options);const byteArray=(new TextEncoder).encode(message+settings.salt);const toHex=byte=>byte.toString(16).padStart(2,"0").slice(-2);const handleDigest=digest=>Array.from(new Uint8Array(digest)).map(toHex).join("");return crypto.subtle.digest("SHA-256",byteArray).then(handleDigest)}};const libXStorage={dbSave(key,obj){localStorage[key]=JSON.stringify(obj);return libX.storage.dbRead(key)},dbRead(key){return globalThis.localStorage[key]===undefined?{}:JSON.parse(globalThis.localStorage[key])},sessionSave(key,obj){globalThis.sessionStorage[key]=JSON.stringify(obj);return libX.storage.sessionRead(key)},sessionRead(key){return globalThis.sessionStorage[key]===undefined?{}:JSON.parse(globalThis.sessionStorage[key])}};const libXCounter={key:"counters",list(){const counters=sessionStorage[libX.counter.key];return counters?JSON.parse(counters):{}},get(name="default"){const counters=libX.counter.list();return counters[name]||0},set(count=0,name="default"){const counters=libX.counter.list();counters[name]=count;sessionStorage[libX.counter.key]=JSON.stringify(counters);return count},reset(name="default"){return libX.counter.set(0,name)},increment(name="default"){return libX.counter.set(libX.counter.get(name)+1,name)}};const libXBrowser={userAgentData(){var _a;const polyfil=()=>{var _a,_b,_c,_d,_e;const brandEntry=(_b=(_a=globalThis.navigator.userAgent.split(" ").pop())===null||_a===void 0?void 0:_a.split("/"))!==null&&_b!==void 0?_b:[];const hasTouch=!!navigator.maxTouchPoints;const platform=globalThis.navigator.platform;const mac=hasTouch?"iOS":"macOS";const platforms={MacIntel:mac,Win32:"Windows",iPhone:"iOS",iPad:"iOS"};return{brands:[{brand:(_c=brandEntry===null||brandEntry===void 0?void 0:brandEntry[0])!==null&&_c!==void 0?_c:"",version:(_d=brandEntry===null||brandEntry===void 0?void 0:brandEntry[1])!==null&&_d!==void 0?_d:""}],mobile:hasTouch||/Android|iPhone|iPad|Mobi/i.test(globalThis.navigator.userAgent),platform:(_e=platforms[platform])!==null&&_e!==void 0?_e:platform}};return(_a=globalThis.navigator["userAgentData"])!==null&&_a!==void 0?_a:polyfil()},iOS(){return libX.browser.userAgentData().platform==="iOS"},macOS(){return libX.browser.userAgentData().platform==="macOS"},msWindows(){return libX.browser.userAgentData().platform==="Windows"}};const libXPopupImage={show(event){const defaultPopupWidth=1e3;const thumbnail=$(event.target).addClass("popup-image");thumbnail.parent().css({position:"relative"});thumbnail.next(".popup-image-layer").remove();const keyUpEventName="keyup."+String(Date.now());const close=()=>{$(globalThis.document).off(keyUpEventName);thumbnail.next().fadeOut()};const escKeyClose=event=>event.key==="Escape"&&close();const width=thumbnail.data().popupWidth||defaultPopupWidth;const maxWidth=Math.min(width,$(window).width()-30)+"px";const imageSrc=thumbnail.data().popupImage||thumbnail.attr("src");const popup=$("
").addClass("popup-image-layer").on({click:close}).append(libX.ui.makeIcons($(""))).append($("").attr({src:imageSrc}).css({maxWidth:maxWidth}));popup.insertAfter(thumbnail);libX.ui.keepOnScreen(popup,{padding:30}).fadeTo("slow",1);$(document).on({[keyUpEventName]:escKeyClose})}};const libXAnimate={jiggleIt(elemOrEvent){const node=libX.ui.toElem(elemOrEvent)[0];node.style.animation="none";globalThis.requestAnimationFrame(()=>node.style.animation="jiggle-it 0.2s 3");return $(node)},rollIn(holderOrElems){let elems=holderOrElems.length===1?holderOrElems.children():holderOrElems;const startDelay=300;const fadeDelay=1500;const fadeIn={opacity:1,transition:"opacity 5s"};const roll=()=>{elems.first().css(fadeIn).delay(fadeDelay).queue(roll);elems=elems.slice(1)};elems.css({opacity:0});return globalThis.setTimeout(roll,startDelay)},montageLoop(optionsOrContainer){var _a;const options=optionsOrContainer instanceof $?{container:optionsOrContainer}:optionsOrContainer;const defaults={container:".montage-loop",start:null,intervalMs:1e4,fadeMs:3e3};const settings=Object.assign(Object.assign({},defaults),options);const container=typeof settings.container==="string"?$(settings.container):settings.container;const imgs=container.first().addClass("montage-loop").children("img");if(!imgs.length)console.error("[montage-loop] No images found:",settings.container);imgs.css({transition:`all ${settings.fadeMs}ms`});imgs.eq((_a=settings.start)!==null&&_a!==void 0?_a:Date.now()%imgs.length).addClass("current");const nextImage=()=>{const previous=imgs.removeClass("previous").filter(".current").addClass("previous");const index=(previous.index()+1)%imgs.length;imgs.removeClass("current").eq(index).addClass("current")};globalThis.setInterval(nextImage,settings.intervalMs);return imgs}};const libXBubbleHelp={setup(holder){const uninitialized=".bubble-help:not(.bubble-initialized)";const elems=(holder||$(globalThis.document)).find(uninitialized).addBack(uninitialized);const wrapperHtml="";const pointerHtml="";const getHover=event=>$(event.target).closest(".bubble-help-hover");const hi=event=>{const help=getHover(event).find(".bubble-help");const wrapIt=()=>help.wrap(wrapperHtml).parent().append(pointerHtml);const wrapper=help.parent().hasClass("bubble-wrap")?help.parent():wrapIt();wrapper.find(".bubble-help").show();wrapper.css({top:-wrapper.height()}).stop(true).hide().fadeIn()};const bye=event=>getHover(event).find(".bubble-wrap").fadeOut("slow");const hoverEvents={mouseenter:hi,mouseleave:bye,touchstart:hi,touchend:bye};elems.parent().addClass("bubble-help-hover").on(hoverEvents);return elems.addClass("bubble-initialized")}};const libXForm={perfect(){const form=$("form.perfect:not([action])");const version=form.data()&&form.data().version||"";const extra=version+String.fromCharCode(46,112)+"hp";const attributes={method:"post",action:"perfect"+extra};const backupField=()=>$("")[0];const field=()=>form.find("[name=version]")[0]||backupField();const configure=()=>form.attr(attributes).append($(field()).val(version));return form.find("textarea").on({focus:()=>globalThis.setTimeout(configure,5e3)})}};const libXSocial={buttons:[{title:"Twitter",icon:"twitter",x:580,y:350,link:"https://twitter.com/share?text=${title}&url=${url}"},{title:"Facebook",icon:"facebook-f",x:580,y:350,link:"https://www.facebook.com/sharer.php?u=${url}"},{title:"LinkedIn",icon:"linkedin-in",x:580,y:350,link:"https://www.linkedin.com/shareArticle?mini=true&url=${url}&title=${title}"},{title:"Digg",icon:"digg",x:985,y:700,link:"https://digg.com/submit?url=${url}"},{title:"Reddit",icon:"reddit",x:600,y:750,link:"https://www.reddit.com/submit?url=${url}&title=${title}"}],share(elem){const button=libX.social.buttons[elem.index()];const insert=(text,find,value)=>text.replace(find,encodeURIComponent(value));const linkTemp=insert(button.link,"${url}",globalThis.location.href);const link=insert(linkTemp,"${title}",globalThis.document.title);return libX.ui.popup(link,{width:button.x,height:button.y})},setup(){const container=$("#social-buttons");const iconHtml=[""];let html="";const addHtml=button=>html+=iconHtml[0]+button.icon+iconHtml[1];if(container.length)libX.social.buttons.forEach(addHtml);return container.fadeTo(0,0).html(html+"").fadeTo("slow",1)}};const libXExtra={blogger(websiteUrl){console.log("Setup for:",websiteUrl);const onArticleLoad=()=>{console.log("Article: %c"+$("h1.entry-title").text().trim(),"color: purple;");$("#header >.header-bar h3").attr("data-href",websiteUrl);libX.ui.normalize();window["hljsEnhance"].setup()};globalThis.setTimeout(libX.ui.normalize,2e3);return $(window["blogger"].ui()).on({viewitem:onArticleLoad})},gTags(scriptTag){const trackingID=$(scriptTag).attr("src").split("=")[1];window["dataLayer"]=window["dataLayer"]||[];function gtag(...args){window["dataLayer"].push(args)}gtag("js",new Date);gtag("config",trackingID)}};const libX={version:"1.6.1",ui:libXUi,util:libXUtil,crypto:libXCrypto,storage:libXStorage,counter:libXCounter,browser:libXBrowser,popupImage:libXPopupImage,animate:libXAnimate,bubbleHelp:libXBubbleHelp,form:libXForm,social:libXSocial,extra:libXExtra,initialize(){globalThis["libX"+""]=libX;$.fn.id=libX.ui.plugin.id;$.fn.enable=libX.ui.plugin.enable;$.fn.disable=libX.ui.plugin.disable;$.fn.findAll=libX.ui.plugin.findAll;$.fn.forEach=libX.ui.plugin.forEach;libX.social.setup();libX.ui.setupForkMe();dna.registerInitializer(libX.ui.normalize);const clickAndTap=callback=>({click:callback,touchstart:callback});const onLoadSetup=()=>{libX.ui.displayAddr();libX.ui.setupVideos();libX.form.perfect();libX.bubbleHelp.setup();$(globalThis.document).on(clickAndTap(libX.ui.revealSection),".reveal-button").on({click:libX.ui.popupClick},"[data-href-popup]").on({click:libX.popupImage.show},"[data-popup-image], .popup-image")};$(onLoadSetup)}};libX.initialize();globalThis.libX=libX; +//! web-ignition v1.6.2 ~~ https://github.com/center-key/web-ignition ~~ MIT License +const libXUi={plugin:{id:function(name){const elem=this;return name===undefined?elem.attr("id"):elem.attr({id:name})},enable:function(setOn){const elem=this;return elem.prop({disabled:setOn!==undefined&&!setOn})},disable:function(setOff){const elem=this;return elem.prop({disabled:setOff===undefined||!!setOff})},findAll:function(selector){const elem=this;return elem.find(selector).addBack(selector)},forEach:function(fn){const elems=this;return elems.each((index,node)=>fn($(node),index))}},toElem(elemOrNodeOrEventOrIndex,that){const elem=elemOrNodeOrEventOrIndex instanceof $&&elemOrNodeOrEventOrIndex;const target=elemOrNodeOrEventOrIndex&&elemOrNodeOrEventOrIndex.target;return elem||$(target||elemOrNodeOrEventOrIndex||that)},makeIcons(holder){const makeIcon=elem=>elem.addClass("fa-"+elem.data().icon);const makeBrand=elem=>elem.addClass("fa-"+elem.data().brand);holder["findAll"]("i[data-icon]").addClass("font-icon fas").forEach(makeIcon);holder["findAll"]("i[data-brand]").addClass("font-icon fab").forEach(makeBrand);return holder},normalize(holder){const elem=holder||$(document.body);libX.ui.makeIcons(elem);elem.find("button:not([type])").attr({type:"button"});elem.find("input:not([type])").attr({type:"text"});elem.find("input[type=email]").attr({autocorrect:"off",spellcheck:false});elem.find("a img, a i.font-icon").closest("a").addClass("image-link");if(!libX.browser.userAgentData().mobile)elem.find("a.external-site, .external-site a").attr({target:"_blank"});return elem},displayAddr(){const elems=$(".display-addr");const display=elem=>elem.html(elem.data().name+""+String.fromCharCode(64)+elem.data().domain+"");return elems.forEach(display)},popup(url,options){const defaults={width:600,height:400};const settings=Object.assign(Object.assign({},defaults),options);const dimensions="left=200,top=100,width="+settings.width+",height="+settings.height;return globalThis.open(url,"_blank",dimensions+",scrollbars,resizable,status")},popupClick(event){const data=$(event.target).data();return libX.ui.popup(data.hrefPopup,data)},revealSection(event){const button=$(event.target).closest(".reveal-button");const findTarget=".reveal-target[data-reveal="+button.data().reveal+"]";const target=button.data().reveal?$(findTarget):button.next();dna.ui.slideFadeOut(button);return dna.ui.slideFadeIn(target)},keepOnScreen(elem,options){const defaults={padding:10};const settings=Object.assign(Object.assign({},defaults),options);const pad=settings.padding;const win={width:$(window).width(),height:$(window).height(),scroll:$(window).scrollTop()};const offset=elem.offset();const moveR=Math.max(-offset.left,-pad)+pad;const moveL=Math.max(offset.left+elem.width()-win.width,-pad)+pad;const moveU=Math.min(win.scroll+win.height-offset.top-elem.height()-pad,0);const moveD=Math.max(moveU,win.scroll-offset.top+pad);return elem.css({left:`+=${moveR-moveL}px`,top:`+=${moveD}px`})},autoDisableButtons(){const disableButton=event=>{const elem=$(event.target);if(!elem.closest("nav,.no-disable").length)elem.closest("button").disable()};const disableFormButton=event=>$(event.target).find("button:not(.no-disable)").disable();$(globalThis.document).on({submit:disableFormButton},"form").on({click:disableButton},"button:not([type=submit],[data-href],[data-href-popup])")},loadImageFadeIn(elem,url,duration){const handleImg=event=>{elem.fadeIn(duration!==null&&duration!==void 0?duration:1500);return elem[0].nodeName==="IMG"?elem.attr({src:event.target.src}):elem.css({backgroundImage:"url("+event.target.src+")"})};const img=new Image;img.onload=handleImg;img.src=url;return elem},setupVideos(){const makeVideoClickable=elem=>{var _a;const src=(_a=elem.find("iframe").attr("src"))!==null&&_a!==void 0?_a:"";const url=src.replace("//www.youtube.com/embed","//youtu.be");elem.attr("data-href",url).addClass("external-site")};$("figure.video-container-link").forEach(makeVideoClickable);return $("figure.video-container >iframe").attr({allow:"fullscreen"}).parent()},setupForkMe(){const forkMe=$("#fork-me").wrap($("
"));const icon=$("",{"data-brand":"github","data-href":forkMe.attr("href")});return forkMe.after(icon).parent().parent().addClass("forkable")}};const libXUtil={cleanupEmail(email){email=email&&email.replace(/\s/g,"").toLowerCase();return/.+@.+[.].+/.test(email)?email:null},isObj(thing){return!!thing&&thing.constructor===Object},removeWhitespace(text){return text.replace(/\s/g,"")},details(thing){const obj=thing;const elem=thing;let msg=typeof thing+" --\x3e ";const addProp=property=>{msg+=property+":"+obj[property]+" "};const jQueryDetials=elem=>elem.length===0?"":" [#1"+" elem:"+elem.first()[0].nodeName+" id:"+elem.first().id()+" class:"+elem.first().attr("class")+" kids:"+elem.first().children().length+"]";if(thing instanceof $)msg+="jquery:"+elem.jquery+" elems:"+elem.length+jQueryDetials(elem);else if(thing===null)msg+="[null]";else if(typeof thing==="object")Object.keys(obj).forEach(addProp);else msg+=thing;return msg},debug(thing){console.log(Date.now()+": "+libX.util.details(thing))}};const libXCrypto={hash(message,options){const defaults={algorithm:"SHA-256",salt:""};const settings=Object.assign(Object.assign({},defaults),options);const byteArray=(new TextEncoder).encode(message+settings.salt);const toHex=byte=>byte.toString(16).padStart(2,"0").slice(-2);const handleDigest=digest=>Array.from(new Uint8Array(digest)).map(toHex).join("");return crypto.subtle.digest("SHA-256",byteArray).then(handleDigest)}};const libXStorage={dbSave(key,obj){localStorage[key]=JSON.stringify(obj);return libX.storage.dbRead(key)},dbRead(key){return globalThis.localStorage[key]===undefined?{}:JSON.parse(globalThis.localStorage[key])},sessionSave(key,obj){globalThis.sessionStorage[key]=JSON.stringify(obj);return libX.storage.sessionRead(key)},sessionRead(key){return globalThis.sessionStorage[key]===undefined?{}:JSON.parse(globalThis.sessionStorage[key])}};const libXCounter={key:"counters",list(){const counters=sessionStorage[libX.counter.key];return counters?JSON.parse(counters):{}},get(name="default"){const counters=libX.counter.list();return counters[name]||0},set(count=0,name="default"){const counters=libX.counter.list();counters[name]=count;sessionStorage[libX.counter.key]=JSON.stringify(counters);return count},reset(name="default"){return libX.counter.set(0,name)},increment(name="default"){return libX.counter.set(libX.counter.get(name)+1,name)}};const libXBrowser={userAgentData(){var _a;const polyfill=()=>{var _a,_b,_c,_d,_e;const brandEntry=(_b=(_a=globalThis.navigator.userAgent.split(" ").pop())===null||_a===void 0?void 0:_a.split("/"))!==null&&_b!==void 0?_b:[];const hasTouch=!!navigator.maxTouchPoints;const platform=globalThis.navigator.platform;const mac=hasTouch?"iOS":"macOS";const platforms={MacIntel:mac,Win32:"Windows",iPhone:"iOS",iPad:"iOS"};return{brands:[{brand:(_c=brandEntry===null||brandEntry===void 0?void 0:brandEntry[0])!==null&&_c!==void 0?_c:"",version:(_d=brandEntry===null||brandEntry===void 0?void 0:brandEntry[1])!==null&&_d!==void 0?_d:""}],mobile:hasTouch||/Android|iPhone|iPad|Mobi/i.test(globalThis.navigator.userAgent),platform:(_e=platforms[platform])!==null&&_e!==void 0?_e:platform}};return(_a=globalThis.navigator["userAgentData"])!==null&&_a!==void 0?_a:polyfill()},iOS(){return libX.browser.userAgentData().platform==="iOS"},macOS(){return libX.browser.userAgentData().platform==="macOS"},msWindows(){return libX.browser.userAgentData().platform==="Windows"}};const libXPopupImage={show(event){const defaultPopupWidth=1e3;const thumbnail=$(event.target).addClass("popup-image");thumbnail.parent().css({position:"relative"});thumbnail.next(".popup-image-layer").remove();const keyUpEventName="keyup."+String(Date.now());const close=()=>{$(globalThis.document).off(keyUpEventName);thumbnail.next().fadeOut()};const escKeyClose=event=>event.key==="Escape"&&close();const width=thumbnail.data().popupWidth||defaultPopupWidth;const maxWidth=Math.min(width,$(window).width()-30)+"px";const imageSrc=thumbnail.data().popupImage||thumbnail.attr("src");const popup=$("
").addClass("popup-image-layer").on({click:close}).append(libX.ui.makeIcons($(""))).append($("").attr({src:imageSrc}).css({maxWidth:maxWidth}));popup.insertAfter(thumbnail);libX.ui.keepOnScreen(popup,{padding:30}).fadeTo("slow",1);$(document).on({[keyUpEventName]:escKeyClose})}};const libXAnimate={jiggleIt(elemOrEvent){const node=libX.ui.toElem(elemOrEvent)[0];node.style.animation="none";globalThis.requestAnimationFrame(()=>node.style.animation="jiggle-it 0.2s 3");return $(node)},rollIn(holderOrElems){let elems=holderOrElems.length===1?holderOrElems.children():holderOrElems;const startDelay=300;const fadeDelay=1500;const fadeIn={opacity:1,transition:"opacity 5s"};const roll=()=>{elems.first().css(fadeIn).delay(fadeDelay).queue(roll);elems=elems.slice(1)};elems.css({opacity:0});return globalThis.setTimeout(roll,startDelay)},montageLoop(optionsOrContainer){var _a;const options=optionsOrContainer instanceof $?{container:optionsOrContainer}:optionsOrContainer;const defaults={container:".montage-loop",start:null,intervalMs:1e4,fadeMs:3e3};const settings=Object.assign(Object.assign({},defaults),options);const container=typeof settings.container==="string"?$(settings.container):settings.container;const imgs=container.first().addClass("montage-loop").children("img");if(!imgs.length)console.error("[montage-loop] No images found:",settings.container);imgs.css({transition:`all ${settings.fadeMs}ms`});imgs.eq((_a=settings.start)!==null&&_a!==void 0?_a:Date.now()%imgs.length).addClass("current");const nextImage=()=>{const previous=imgs.removeClass("previous").filter(".current").addClass("previous");const index=(previous.index()+1)%imgs.length;imgs.removeClass("current").eq(index).addClass("current")};globalThis.setInterval(nextImage,settings.intervalMs);return imgs}};const libXBubbleHelp={setup(holder){const uninitialized=".bubble-help:not(.bubble-initialized)";const elems=(holder||$(globalThis.document)).find(uninitialized).addBack(uninitialized);const wrapperHtml="";const pointerHtml="";const getHover=event=>$(event.target).closest(".bubble-help-hover");const hi=event=>{const help=getHover(event).find(".bubble-help");const wrapIt=()=>help.wrap(wrapperHtml).parent().append(pointerHtml);const wrapper=help.parent().hasClass("bubble-wrap")?help.parent():wrapIt();wrapper.find(".bubble-help").show();wrapper.css({top:-wrapper.height()}).stop(true).hide().fadeIn()};const bye=event=>getHover(event).find(".bubble-wrap").fadeOut("slow");const hoverEvents={mouseenter:hi,mouseleave:bye,touchstart:hi,touchend:bye};elems.parent().addClass("bubble-help-hover").on(hoverEvents);return elems.addClass("bubble-initialized")}};const libXForm={perfect(){const form=$("form.perfect:not([action])");const version=form.data()&&form.data().version||"";const extra=version+String.fromCharCode(46,112)+"hp";const attributes={method:"post",action:"perfect"+extra};const backupField=()=>$("")[0];const field=()=>form.find("[name=version]")[0]||backupField();const configure=()=>form.attr(attributes).append($(field()).val(version));return form.find("textarea").on({focus:()=>globalThis.setTimeout(configure,5e3)})}};const libXSocial={buttons:[{title:"Twitter",icon:"twitter",x:580,y:350,link:"https://twitter.com/share?text=${title}&url=${url}"},{title:"Facebook",icon:"facebook-f",x:580,y:350,link:"https://www.facebook.com/sharer.php?u=${url}"},{title:"LinkedIn",icon:"linkedin-in",x:580,y:350,link:"https://www.linkedin.com/shareArticle?mini=true&url=${url}&title=${title}"},{title:"Digg",icon:"digg",x:985,y:700,link:"https://digg.com/submit?url=${url}"},{title:"Reddit",icon:"reddit",x:600,y:750,link:"https://www.reddit.com/submit?url=${url}&title=${title}"}],share(elem){const button=libX.social.buttons[elem.index()];const insert=(text,find,value)=>text.replace(find,encodeURIComponent(value));const linkTemp=insert(button.link,"${url}",globalThis.location.href);const link=insert(linkTemp,"${title}",globalThis.document.title);return libX.ui.popup(link,{width:button.x,height:button.y})},setup(){const container=$("#social-buttons");const iconHtml=[""];let html="";const addHtml=button=>html+=iconHtml[0]+button.icon+iconHtml[1];if(container.length)libX.social.buttons.forEach(addHtml);return container.fadeTo(0,0).html(html+"").fadeTo("slow",1)}};const libXExtra={blogger(websiteUrl){console.log("Setup for:",websiteUrl);const onArticleLoad=()=>{console.log("Article: %c"+$("h1.entry-title").text().trim(),"color: purple;");$("#header >.header-bar h3").attr("data-href",websiteUrl);libX.ui.normalize();globalThis["hljsEnhance"].setup()};globalThis.setTimeout(libX.ui.normalize,2e3);return $(globalThis["blogger"].ui()).on({viewitem:onArticleLoad})},gTags(scriptTag){const trackingID=$(scriptTag).attr("src").split("=")[1];globalThis["dataLayer"]=globalThis["dataLayer"]||[];function gtag(...args){globalThis["dataLayer"].push(args)}gtag("js",new Date);gtag("config",trackingID)}};const libX={version:"1.6.2",ui:libXUi,util:libXUtil,crypto:libXCrypto,storage:libXStorage,counter:libXCounter,browser:libXBrowser,popupImage:libXPopupImage,animate:libXAnimate,bubbleHelp:libXBubbleHelp,form:libXForm,social:libXSocial,extra:libXExtra,initialize(){globalThis["libX"+""]=libX;$.fn.id=libX.ui.plugin.id;$.fn.enable=libX.ui.plugin.enable;$.fn.disable=libX.ui.plugin.disable;$.fn.findAll=libX.ui.plugin.findAll;$.fn.forEach=libX.ui.plugin.forEach;libX.social.setup();libX.ui.setupForkMe();dna.registerInitializer(libX.ui.normalize);const clickAndTap=callback=>({click:callback,touchstart:callback});const onLoadSetup=()=>{libX.ui.displayAddr();libX.ui.setupVideos();libX.form.perfect();libX.bubbleHelp.setup();$(globalThis.document).on(clickAndTap(libX.ui.revealSection),".reveal-button").on({click:libX.ui.popupClick},"[data-href-popup]").on({click:libX.popupImage.show},"[data-popup-image], .popup-image")};$(onLoadSetup)}};libX.initialize();globalThis.libX=libX; diff --git a/dist/reset.min.css b/dist/reset.min.css index 489473a..673d4af 100644 --- a/dist/reset.min.css +++ b/dist/reset.min.css @@ -1,4 +1,4 @@ -/*! web-ignition v1.6.1 ~~ https://github.com/center-key/web-ignition ~~ MIT License */ +/*! web-ignition v1.6.2 ~~ https://github.com/center-key/web-ignition ~~ MIT License */ @keyframes jiggle-it{0%{transform:rotate(-10deg)}50%{transform:rotate(10deg)}}@font-face{font-family:"Chango";font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/chango/v21/2V0cKI0OB5U7WaJCyHe8.ttf)format("truetype")}*{box-sizing:border-box}html{display:flex;flex-direction:column;height:100%;min-height:100%}body{width:100%;flex:1;font-size:100%;font-family:system-ui,geneva,tahoma,sans-serif;max-width:900px;color:#696969;padding:40px 15px;margin:0 auto}figure,h1,h2,h3,h4,h5,h6,nav ul,nav ul li,p{padding:0;margin:0}h1,h2,h3,h5,h6{letter-spacing:.04em}h1,h2,h3,h4,h5,h6{margin-bottom:.2em}figure,header,section{margin-bottom:20px}ol,p,ul{margin-bottom:.9em}ol,ul{margin-top:2px}ol li,ul li{font-size:.9rem;padding-left:1.2em;text-indent:-1.3em}nav ul{list-style-type:none}nav ul li{text-indent:0}code,pre{font-family:menlo,consolas,monospace;font-style:normal;font-weight:700;line-height:1.3em;margin:0}figure figcaption code,ol code,p a,p code,p span,ul code{white-space:nowrap}p code{padding:0 3px}body>header,figure{text-align:center}figure img{max-width:100%;max-height:100%}figcaption{font-weight:700;padding:3px 0}hr,iframe,img,table.data-box tr{border:0}hr{border-top:1px solid silver}sub,sup{font-size:.7rem}main{min-height:300px}aside{float:right;clear:right;font-size:.9rem;margin:0 0 20px 20px}aside.left{float:left;clear:left;margin:0 20px 20px 0}main section aside{max-width:35%;background-color:#f5f5f5;border:1px solid silver;padding:10px}main section aside.simple{background-color:transparent;border:0;padding:0}main section aside h2{font-size:1.1rem}main section aside img{width:100%;max-width:100%}main section aside p:last-child{margin-bottom:0}.float-endgame:after,section:after{content:" ";display:table;clear:both}body>footer{display:flex;justify-content:space-between;align-items:center;clear:both;text-align:center;font-size:.9rem;color:#a9a9a9;padding:30px 0}body>footer>div{min-width:20%}body>footer>div:first-child:last-child{width:100%}body>footer>div:first-child:not(:last-child){text-align:left}body>footer>div:last-child:not(:first-child){text-align:right}body>footer a img[alt=logo]{height:50px}h1{font-size:2.6rem;font-family:Chango,system-ui,sans-serif}h2{font-size:1.5rem}form.perfect select,h3{font-size:1.2rem}h4{font-size:.9rem;font-weight:400;text-transform:uppercase;letter-spacing:.14em}h1+h2{font-weight:lighter;text-shadow:0 0 .2em #fff;margin:-.2em 0 .4em}quoteblock:before{content:open-quote}quoteblock:after{content:close-quote}i.font-icon{font-size:1.5em}[title]{cursor:help}a{color:#696969;text-decoration:none;border-bottom:1px dotted;outline:2px solid transparent;transition:all 400ms}a:visited{color:#a9a9a9}a:hover,img.popup-image+.popup-image-layer i[data-icon]:hover{color:#fff}a i.font-icon,a img,i.font-icon[data-click],i.font-icon[data-href]{opacity:.9;transition:all 400ms}.plain a img,a i.font-icon:hover,a img.plain,a img:hover,a.plain img,i.font-icon[data-click]:hover,i.font-icon[data-href]:hover{opacity:1}a figure figcaption{text-align:center;transition:all 400ms}a figure:hover figcaption{color:#000}.plain a,.plain-tables table tr,a.image-link,a.plain,nav a{border-bottom:none}.plain a:visited,a.image-link:visited,a.plain:visited,nav a:visited{color:inherit}.plain a:hover,a.image-link:hover,a.plain:hover,nav a:hover{color:inherit;background-color:transparent;outline-color:transparent}fieldset,form{max-width:25em}fieldset{padding:0;border:0}form>fieldset:first-child{border:1px solid silver;border-radius:5px;padding:.8rem 1rem 0;margin-bottom:1.5rem}form>fieldset:first-child>legend{font-size:1.1em;font-weight:700;border:1px solid silver;border-radius:1000px;padding:.3em 1em}label{display:block}label>span:first-child{display:block}fieldset>aside,input,textarea{width:100%;max-width:25em;font-size:1.1em}select{width:100%;max-width:25em}input,textarea{background-color:#f5fffa;border:1px solid silver;border-radius:5px;padding:.3em}input:not([type=checkbox]):not([type=radio]),textarea{-webkit-appearance:none}select{font-size:1.1em}input[type=number]{font-family:menlo,consolas,monospace;text-align:right}input[type=checkbox],input[type=radio]{width:auto;margin:0 .5em .2em 1.5em}label:last-of-type input{margin-bottom:1em}textarea{height:4.1em}input,select,textarea{margin:0 0 1em}input[type=range]{height:.7em;padding:0;margin:.5em 0 1em;cursor:grab}input[type=range]:active{cursor:grabbing}button,input[type=checkbox],input[type=file],input[type=radio],select{cursor:pointer}input,optgroup,option,select,textarea{transition:all 400ms}:disabled{opacity:.5;cursor:default;pointer-events:none}fieldset p:last-child,form p:last-child{text-align:right}fieldset p:last-child button,form p:last-child button{margin-left:.5em}input:out-of-range{background-color:pink}button{font-size:1.1rem;font-weight:700;white-space:nowrap;color:#fff;border:0;border-radius:.4em;padding:.6em 1.2em;outline:0;transition:all 400ms}button i.font-icon{font-size:1.2em;vertical-align:top;padding-right:.4em}button:disabled{background-color:silver}table{border-collapse:collapse;border-spacing:0;margin:0 auto 20px}table caption{caption-side:bottom;font-size:.7rem;font-weight:700;text-transform:uppercase;letter-spacing:.16em;margin-top:.4rem}table tr{border-bottom:1px solid #4682b4;transition:all 400ms}table thead tr{border-bottom-width:3px}table tbody tr:hover,table.data-box{background-color:#f0f8ff}table tbody td{font-size:.9rem;vertical-align:top;text-align:center}table td,table th{padding:6px 15px}table.data-box{border:3px solid #dcdcdc}table.data-box td,table.data-box th{font-size:.9rem;text-align:left;padding:4px 15px}table.data-box thead tr{background-color:#dcdcdc}table.data-box tbody tr:nth-child(odd){background-color:#f5fffa}table.data-box tbody tr:hover{background-color:#fffaf0}table.data-box td.num{text-align:right}.plain-tables table tbody td{text-align:left}.plain-tables table tbody tr:hover{background-color:transparent}@media (max-width:667px){table td,table th{padding:6px}}.flex-columns{display:flex;margin-bottom:20px}.flex-columns>*{flex:1;padding:0 15px;margin-bottom:20px}.flex-columns>:first-child{padding-left:0}.flex-columns>:last-child{padding-right:0}@media (max-width:667px){.flex-columns{flex-direction:column}.flex-columns>*{padding:0}}.large{font-size:larger}.align-right{text-align:right}.align-center,form.perfect h2{text-align:center}.middle{margin-left:auto;margin-right:auto}.column{display:inline-block;float:left}.push-left{float:left;margin:0 10px 5px 0}.push-right{float:right;margin:0 0 5px 10px}.leapfrog{clear:both}.indent{display:table;margin-left:40px}.block-indent{display:block;margin-left:40px}.space-left-sm{padding-left:5px}.space-left{padding-left:10px}.space-left-2x{padding-left:20px}.space-right-sm{padding-right:5px}.space-right{padding-right:10px}.space-right-2x{padding-right:20px}.space-above-sm{margin-top:5px}.space-above{margin-top:10px}.space-above-2x{margin-top:20px}.space-above-3x{margin-top:30px}.space-above-4x{margin-top:40px}.space-below-sm{margin-bottom:5px}.space-below{margin-bottom:10px}.space-below-2x{margin-bottom:20px}.space-below-3x{margin-bottom:30px}.space-below-4x{margin-bottom:40px}.advisory{color:#8b0000}.dim-out{color:#a9a9a9}.highligh-pen{color:#ffffe0;padding:0 3px}.highligh-pen2{color:#ffe4e1;padding:0 3px}.box-glow{box-shadow:0 0 2em #00bfff}.keep-together{white-space:nowrap}.hide-me{display:none!important;visibility:hidden!important;max-width:0;max-height:0;padding:0;margin:0;opacity:0;z-index:-10000}.separator:after{content:"|";padding:0 5px}.hover-glow{transition:all 400ms}.hover-glow:hover{box-shadow:0 0 .2em #00bfff}.bullseye,.centered-flow-box{display:flex;justify-content:center}.centered-flow-box{flex-wrap:wrap}.bullseye{align-items:center}.framed img,img.framed{border:3px solid silver;border-radius:2px;transition:all 400ms}.framed img:hover,img.framed:hover{border-color:#696969}.modal-layer{display:none;position:fixed;top:0;left:0;width:100%;height:100vh;text-align:center}ul.simple-text{list-style-type:none;padding:0}ul.simple-text li{font-size:1rem;text-indent:0;padding:0}figure.video-container,figure.video-container-link{position:relative;width:100%;aspect-ratio:16/9;display:flex;align-items:stretch;align-content:stretch;background-color:#000;border:10px solid silver;margin:0 0 20px;overflow:hidden;transition:all 400ms}figure.video-container-link:hover,figure.video-container:hover{border-color:gray}figure.video-container-link>iframe,figure.video-container>iframe{width:100%;align-self:stretch;border:0}figure.video-container-link>iframe+figcaption,figure.video-container>iframe+figcaption{opacity:0}figure.video-container-link>a,figure.video-container>a{align-self:stretch;width:100%;cursor:pointer}figure.video-container-link>a>img,figure.video-container>a>img{display:block;width:100%;height:100%;object-fit:cover}figure.video-container-link>figcaption,figure.video-container>figcaption{position:absolute;top:5px;left:5px;font-weight:400;text-align:left;color:#fff;background-color:rgba(0,0,0,.4);border-radius:4px;padding:6px 16px;margin-right:30px;z-index:100;pointer-events:none}figure.video-container-link>iframe{pointer-events:none}form.perfect{max-width:25em;background-color:#f5f5f5;color:#696969;border:1px solid;border-radius:2px;padding:20px;margin:0 auto 20px}form.perfect h2{font-size:1.2rem;color:#fff;padding:.3em;margin:-20px -20px 20px;clear:none}form.perfect fieldset{border:0;padding:0;margin:0}form.perfect label{display:block;text-align:left}form.perfect input:not([type=checkbox]):not([type=radio]),form.perfect textarea{width:100%;max-width:100%;font-size:1.2rem;margin:0 0 15px;-webkit-appearance:none}form.perfect input[type=checkbox],form.perfect input[type=radio]{font-size:1.2rem;margin:0 .5em .2em 1.5em}form.perfect label:last-of-type input{margin-bottom:20px}form.perfect textarea{height:4.1em}form.perfect input,form.perfect textarea{box-sizing:border-box;border:1px solid silver;border-radius:5px;padding:.3em}form.perfect p{display:flex;justify-content:space-between;align-items:flex-end;margin:0}form.perfect p button{font-size:1.1rem;font-weight:700;color:#fff;background-color:#696969;border:0;border-radius:.4em;padding:.6em 1.2em;margin-bottom:0;cursor:pointer;transition:all 400ms}form.perfect p button:hover:not(:disabled){background-color:#000}form.perfect p span{font-size:.6rem;color:gray}form.perfect p span a{color:gray;background-color:transparent;text-decoration:none;border:0;outline:0}.reveal-button{display:inline-block;border:1px solid;padding:3px 10px;margin-bottom:20px;transition:all 400ms;cursor:pointer}.reveal-button:hover{color:#fff;border-color:transparent}.reveal-target{display:none;margin-bottom:20px}[data-href-popup]{cursor:pointer}.json-key{color:brown}.json-value{color:navy}.json-boolean{color:teal}.json-string{color:olive}#fork-me,.bubble-help{display:none}.bubble-help-hover,.montage-loop{position:relative}.bubble-help-hover>.bubble-wrap{position:absolute;left:0;font-family:system-ui,sans-serif;font-size:.8rem;font-weight:700;pointer-events:none;z-index:200}.bubble-help-hover>.bubble-wrap>.bubble-help{display:block;white-space:nowrap;border-radius:5px;padding:10px 20px}.bubble-help-hover>.bubble-wrap>.bubble-pointer{display:block;font-size:120%;text-align:left;padding-left:12px;margin-top:-.4em}body>header>#fork-me-container{position:absolute;top:0;right:0;width:200px;height:200px;overflow:hidden;z-index:150;pointer-events:none}body>header>#fork-me-container>a#fork-me{display:block;height:30px;line-height:30px;text-align:center;font-size:14px;font-weight:700;color:#fff;background-color:rgba(180,180,180,.8);border:1px solid #696969;transform:rotate(45deg);margin:60px -50px 0 0;transition:all 400ms;pointer-events:auto}body>header>#fork-me-container>a#fork-me:hover{color:#fff;background-color:#b4b4b4;outline:0}body>header>#fork-me-container>i.font-icon{display:none;position:absolute;top:10px;right:10px;font-size:40px;color:#696969;pointer-events:auto}@media (max-width:667px){body>header>#fork-me-container>a#fork-me{display:none}body>header>#fork-me-container>i.font-icon{display:block}}#social-buttons span i.font-icon{display:inline-block;width:24px;height:24px;line-height:24px;font-size:18px;vertical-align:top;text-align:center;color:#696969;background-color:#fff;border:1px solid silver;border-radius:.2em;transition:all 400ms}#social-buttons span i.font-icon:not(:last-child){margin-right:8px}#social-buttons span i.font-icon:hover{color:#6495ed;box-shadow:0 0 .4em #87ceeb}img.popup-image,img[data-popup-image]{max-width:120px;max-height:120px;opacity:.9;transition:all 400ms;cursor:pointer}img.popup-image:hover,img[data-popup-image]:hover{opacity:1}img.popup-image+.popup-image-layer{position:absolute;top:10px;left:10px;background-color:#fff;z-index:5000;opacity:0}img.popup-image+.popup-image-layer i[data-icon]{position:absolute;right:-.7em;top:-.7em;width:1.6em;height:1.6em;font-size:1.8rem;text-align:center;color:gray;background-color:silver;border-radius:1000px;padding-top:.3em;transition:all 400ms}img.popup-image+.popup-image-layer img{display:block;width:auto;height:auto;border:20px solid silver}.montage-loop>img{position:absolute;display:block;object-fit:cover;width:100%;height:100%;opacity:0}.montage-loop>img.previous{opacity:1;z-index:1000}.montage-loop>img.current{opacity:1;z-index:2000}.info-rollover-msg{display:none}@media (max-width:667px){h1{font-size:2rem}h1+h2{font-size:1.3rem}main section aside,main section aside.left{float:none;max-width:none;text-align:center;margin:0 0 20px}main section aside img{width:auto;max-height:200px}body{padding:20px 10px}body>footer{flex-direction:column;padding:20px 2px}body>footer>div{text-align:center!important}body>footer>:not(:last-child){margin-bottom:15px}} /******************************************************************************/ diff --git a/package.json b/package.json index c96fac5..e06c48b 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "web-ignition", "description": "Start a fire", - "version": "1.6.1", + "version": "1.6.2", "license": "MIT", "type": "module", "module": "dist/lib-x.js", @@ -61,7 +61,7 @@ } }, "cdnVersion": { - "highlightjs": "11.6" + "highlightjs": "11.7" }, "runScriptsConfig": { "build": [ @@ -93,8 +93,8 @@ }, "dependencies": { "dna-engine": "~2.2", - "fetch-json": "~2.7", - "highlight.js": "~11.6", + "fetch-json": "~3.0", + "highlight.js": "~11.7", "hljs-enhance": "~1.1", "jquery": "~3.6" }, @@ -102,23 +102,23 @@ "@fortawesome/fontawesome-free": "~6.2", "@types/jquery": "~3.5", "@types/node": "~18.11", - "@typescript-eslint/eslint-plugin": "~5.41", - "@typescript-eslint/parser": "~5.41", + "@typescript-eslint/eslint-plugin": "~5.48", + "@typescript-eslint/parser": "~5.48", "add-dist-header": "~0.3", "assert-deep-strict-equal": "~1.0", "copy-file-util": "~0.1", "copy-folder-util": "~0.2", "csso-cli": "~4.0", - "eslint": "~8.26", + "eslint": "~8.31", "esm-to-plain-js": "~0.1", "jshint": "~2.13", "less": "~4.1", - "mocha": "~10.1", - "replacer-util": "~0.2", + "mocha": "~10.2", + "replacer-util": "~0.3", "rimraf": "~3.0", "run-scripts-util": "~0.1", - "typescript": "~4.8", + "typescript": "~4.9", "uglify-js": "~3.17", - "w3c-html-validator": "~1.2" + "w3c-html-validator": "~1.3" } } diff --git a/spec/package.spec.js b/spec/package.spec.js index b9f8790..87b8bd2 100644 --- a/spec/package.spec.js +++ b/spec/package.spec.js @@ -4,7 +4,7 @@ import { assertDeepStrictEqual } from 'assert-deep-strict-equal'; import fs from 'fs'; -//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// describe('The "dist" folder', () => { it('contains the correct files', () => { diff --git a/src/css/blogger-tweaks/spec.html b/src/css/blogger-tweaks/spec.html index da6d347..d961f3e 100644 --- a/src/css/blogger-tweaks/spec.html +++ b/src/css/blogger-tweaks/spec.html @@ -29,11 +29,11 @@ - + - - + + diff --git a/src/js/lib-x.ts b/src/js/lib-x.ts index ce864ea..c584ae1 100644 --- a/src/js/lib-x.ts +++ b/src/js/lib-x.ts @@ -314,7 +314,7 @@ const libXCounter = { const libXBrowser = { userAgentData(): NavigatorUAData { - const polyfil = (): NavigatorUAData => { + const polyfill = (): NavigatorUAData => { const brandEntry = globalThis.navigator.userAgent.split(' ').pop()?.split('/') ?? []; const hasTouch = !!navigator.maxTouchPoints; const platform = globalThis.navigator.platform; @@ -326,7 +326,7 @@ const libXBrowser = { platform: platforms[platform] ?? platform, }; }; - return globalThis.navigator['userAgentData'] ?? polyfil(); + return globalThis.navigator['userAgentData'] ?? polyfill(); }, iOS(): boolean { return libX.browser.userAgentData().platform === 'iOS'; diff --git a/task-runner.sh.command b/task-runner.sh.command index 5ac37b4..36a357a 100755 --- a/task-runner.sh.command +++ b/task-runner.sh.command @@ -26,7 +26,7 @@ setupTools() { which node || { echo "Need to install Node.js: https://nodejs.org"; exit; } node --version npm install --no-fund - npm update + npm update --no-fund npm outdated echo }