├── .dependabot └── config.yml ├── .gitattributes ├── .github └── FUNDING.yml ├── .gitignore ├── LICENSE ├── README.md ├── account.hbs ├── amp.hbs ├── assets ├── css │ ├── bootstrap.min.css │ ├── bootstrap.min.css.map │ └── hl-styles │ │ └── atom-one-dark.min.css ├── dist │ └── sw-toolbox.js ├── images │ ├── apple-icon.png │ ├── apple-touch-icon-120x120.png │ ├── apple-touch-icon-120x120_.png │ ├── apple-touch-icon-152x152.png │ ├── apple-touch-icon-152x152_.png │ ├── apple-touch-icon-512x512.png │ ├── apple-touch-icon-76x76.png │ ├── apple-touch-icon-76x76_.png │ ├── apple-touch-icon.png │ ├── apple-touch-icon_.png │ ├── favicon.png │ ├── favicon_.png │ ├── logo-alternate.svg │ ├── logo-alternate_.svg │ ├── logo.png │ ├── qr-alipay-255.png │ └── qr-wechat-255.png ├── js │ ├── app.bundle.min.js │ ├── index.js │ └── vendor │ │ ├── clipboard.min.js │ │ ├── fuse.min.js │ │ ├── jquery-3.5.1.min.js │ │ ├── jquery.disqusloader.js │ │ ├── jquery.fitvids.js │ │ ├── jquery.toc.js │ │ ├── lazy.js │ │ ├── medium-zoom.min.js │ │ └── prism.js └── scss │ ├── ampstyle-dark.scss │ ├── ampstyle-light.scss │ ├── components │ ├── _archive.scss │ ├── _color-and-font.scss │ ├── _common.scss │ ├── _cover.scss │ ├── _error.scss │ ├── _footer.scss │ ├── _header.scss │ ├── _hero-area.scss │ ├── _members.scss │ ├── _post-list.scss │ ├── _prism.scss │ ├── _search-popup.scss │ └── _single-article.scss │ └── screen.scss ├── author.hbs ├── custom-author-archive.hbs ├── custom-tag-archive.hbs ├── default.hbs ├── error-404.hbs ├── error.hbs ├── example ├── Gruntfile.js ├── README.md ├── checkwave │ ├── checkwave.png │ ├── index.html │ └── style.css ├── cloudy-spiral │ ├── index.html │ ├── style.css │ └── style.scss ├── device-loop │ ├── device-loop.png │ ├── index.html │ ├── style.css │ └── style.scss ├── flexing-pagination │ ├── flexing-pagination.png │ ├── index.html │ ├── style.css │ └── style.scss ├── flipside │ ├── index.html │ ├── script.js │ ├── style.css │ └── style.scss ├── monocle │ ├── index.html │ ├── script.js │ ├── style.css │ └── style.scss ├── package-lock.json ├── package.json └── progress-nav │ ├── index.html │ ├── normalize.css │ ├── script.js │ ├── style.css │ └── style.scss ├── gulpfile.js ├── index.hbs ├── locales └── en.json ├── logo.png ├── manifest.json ├── package-lock.json ├── package.json ├── page.hbs ├── partials ├── about-author.hbs ├── api-key.hbs ├── disqus-comment.hbs ├── footer-simple.hbs ├── footer.hbs ├── header.hbs ├── hero-section.hbs ├── icons │ ├── arrow-down.hbs │ ├── arrow-left.hbs │ ├── arrow-right.hbs │ ├── arrow-up.hbs │ ├── behance.hbs │ ├── check-mark.hbs │ ├── close.hbs │ ├── dribbble.hbs │ ├── facebook.hbs │ ├── github.hbs │ ├── image.hbs │ ├── instagram.hbs │ ├── link.hbs │ ├── linkedin.hbs │ ├── location.hbs │ ├── medium.hbs │ ├── menu.hbs │ ├── pinterest.hbs │ ├── search.hbs │ ├── star.hbs │ ├── twitter.hbs │ ├── user.hbs │ └── youtube.hbs ├── loop.hbs ├── members │ ├── notifications.hbs │ ├── pricing-table-free.hbs │ ├── pricing-table-monthly.hbs │ └── pricing-table-yearly.hbs ├── navigation.hbs ├── pagination.hbs ├── prev-next.hbs ├── search-popup.hbs ├── share.hbs ├── social-links.hbs ├── styles │ ├── ampstyle-dark.hbs │ ├── ampstyle-light.hbs │ └── bundle-css.hbs ├── subscription.hbs └── widgets │ ├── footer-about.hbs │ ├── footer-newsletter.hbs │ ├── footer-recent-posts.hbs │ ├── footer-tags.hbs │ ├── sidebar-featured-posts.hbs │ ├── sidebar-recent-posts.hbs │ └── tags-clouds.hbs ├── post.hbs ├── routes.yaml ├── serviceworker-v1.js ├── signin.hbs ├── signup-free.hbs ├── signup.hbs └── tag.hbs /.dependabot/config.yml: -------------------------------------------------------------------------------- 1 | version: 1 2 | update_configs: 3 | # Keep package.json (& lockfiles) secure and up-to-date, 4 | # batching pull requests daily 5 | - package_manager: "javascript" 6 | directory: "/" 7 | update_schedule: "daily" -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | *.hbs linguist-language=css -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: [halfrost] 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry 13 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 14 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Generated Stuff 2 | .sass-cache 3 | .sass-cache/* 4 | css/*.map 5 | 6 | # bundling output 7 | build/* 8 | build 9 | dist/* 10 | dist 11 | 12 | # Node Modules (use `npm install` to generate these) 13 | node_modules/* 14 | node_modules 15 | ../* 16 | 17 | # OS X Junk 18 | .DS_Store 19 | .DS_Store/* 20 | 21 | 22 | # Not-Needed System Files 23 | *.swp 24 | *.bak 25 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 halfrost 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /account.hbs: -------------------------------------------------------------------------------- 1 | {{!< default}} 2 | {{! The tag above means - insert everything in this file into the {body} of the default.hbs template }} 3 |
4 |
5 |
6 |
7 |
8 |
9 | {{#if @member.paid}} 10 |
11 |
12 |

{{t "Nice, you're a paid subscriber!"}}

13 |
14 |
15 |
16 |
17 | {{t "Hey! You are currently logged in with"}} {{@member.email}}.
{{t "You have an active"}} {{@site.title}} {{t "account with access to all areas."}} {{t "You're all set, but if you need any help, get in touch with us and we'd be happy to help."}} 18 |
19 | 22 |
23 | {{else if @member}} 24 |
25 |
26 |

{{t "Nice, you're a subscriber!"}}

27 |
28 |
29 |
30 |
31 | {{t "Hey! You are currently logged in with"}} {{@member.email}}. {{t "You have subscribed to free updates from"}} {{@site.title}}. {{t "Subscribe to paid plan to unlock full access."}} 32 |
33 |
34 | {{> members/pricing-table-monthly}} 35 | {{> members/pricing-table-yearly}} 36 |
37 |
38 | {{else}} 39 | {{!-- Not logged in: Redirect to signin --}} 40 | 41 | {{/if}} 42 |
43 |
44 |
45 |
46 |
47 |
-------------------------------------------------------------------------------- /assets/css/hl-styles/atom-one-dark.min.css: -------------------------------------------------------------------------------- 1 | .hljs{display:block;overflow-x:auto;padding:.5em;color:#abb2bf;background:#282c34}.hljs-comment,.hljs-quote{color:#5c6370;font-style:italic}.hljs-doctag,.hljs-formula,.hljs-keyword{color:#c678dd}.hljs-deletion,.hljs-name,.hljs-section,.hljs-selector-tag,.hljs-subst{color:#e06c75}.hljs-literal{color:#56b6c2}.hljs-addition,.hljs-attribute,.hljs-meta-string,.hljs-regexp,.hljs-string{color:#98c379}.hljs-built_in,.hljs-class .hljs-title{color:#e6c07b}.hljs-attr,.hljs-number,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-pseudo,.hljs-template-variable,.hljs-type,.hljs-variable{color:#d19a66}.hljs-bullet,.hljs-link,.hljs-meta,.hljs-selector-id,.hljs-symbol,.hljs-title{color:#61aeee}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}.hljs-link{text-decoration:underline} -------------------------------------------------------------------------------- /assets/images/apple-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/halfrost/Prometheus/b09016e8015685116602bd58435e18d518223c9b/assets/images/apple-icon.png -------------------------------------------------------------------------------- /assets/images/apple-touch-icon-120x120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/halfrost/Prometheus/b09016e8015685116602bd58435e18d518223c9b/assets/images/apple-touch-icon-120x120.png -------------------------------------------------------------------------------- /assets/images/apple-touch-icon-120x120_.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/halfrost/Prometheus/b09016e8015685116602bd58435e18d518223c9b/assets/images/apple-touch-icon-120x120_.png -------------------------------------------------------------------------------- /assets/images/apple-touch-icon-152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/halfrost/Prometheus/b09016e8015685116602bd58435e18d518223c9b/assets/images/apple-touch-icon-152x152.png -------------------------------------------------------------------------------- /assets/images/apple-touch-icon-152x152_.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/halfrost/Prometheus/b09016e8015685116602bd58435e18d518223c9b/assets/images/apple-touch-icon-152x152_.png -------------------------------------------------------------------------------- /assets/images/apple-touch-icon-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/halfrost/Prometheus/b09016e8015685116602bd58435e18d518223c9b/assets/images/apple-touch-icon-512x512.png -------------------------------------------------------------------------------- /assets/images/apple-touch-icon-76x76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/halfrost/Prometheus/b09016e8015685116602bd58435e18d518223c9b/assets/images/apple-touch-icon-76x76.png -------------------------------------------------------------------------------- /assets/images/apple-touch-icon-76x76_.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/halfrost/Prometheus/b09016e8015685116602bd58435e18d518223c9b/assets/images/apple-touch-icon-76x76_.png -------------------------------------------------------------------------------- /assets/images/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/halfrost/Prometheus/b09016e8015685116602bd58435e18d518223c9b/assets/images/apple-touch-icon.png -------------------------------------------------------------------------------- /assets/images/apple-touch-icon_.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/halfrost/Prometheus/b09016e8015685116602bd58435e18d518223c9b/assets/images/apple-touch-icon_.png -------------------------------------------------------------------------------- /assets/images/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/halfrost/Prometheus/b09016e8015685116602bd58435e18d518223c9b/assets/images/favicon.png -------------------------------------------------------------------------------- /assets/images/favicon_.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/halfrost/Prometheus/b09016e8015685116602bd58435e18d518223c9b/assets/images/favicon_.png -------------------------------------------------------------------------------- /assets/images/logo-alternate_.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 85 | 86 | -------------------------------------------------------------------------------- /assets/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/halfrost/Prometheus/b09016e8015685116602bd58435e18d518223c9b/assets/images/logo.png -------------------------------------------------------------------------------- /assets/images/qr-alipay-255.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/halfrost/Prometheus/b09016e8015685116602bd58435e18d518223c9b/assets/images/qr-alipay-255.png -------------------------------------------------------------------------------- /assets/images/qr-wechat-255.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/halfrost/Prometheus/b09016e8015685116602bd58435e18d518223c9b/assets/images/qr-wechat-255.png -------------------------------------------------------------------------------- /assets/js/vendor/jquery.disqusloader.js: -------------------------------------------------------------------------------- 1 | /* 2 | disqusLoader.js v1.0 3 | A JavaScript plugin for lazy-loading Disqus comments widget. 4 | - 5 | By Osvaldas Valutis, www.osvaldas.info 6 | Available for use under the MIT License 7 | */ 8 | 9 | ;( function( $, window, document, undefined ) 10 | { 11 | 'use strict'; 12 | 13 | var $win = $( window ), 14 | throttle = function(a,b){var c,d;return function(){var e=this,f=arguments,g=+new Date;c&&g $win.height() * laziness || winST - $instance.offset().top - $instance.outerHeight() - ( $win.height() * laziness ) > 0 ) 33 | return true; 34 | 35 | $( '#disqus_thread' ).removeAttr( 'id' ); 36 | $instance.attr( 'id', 'disqus_thread' ).data( 'disqusLoaderStatus', 'loaded' ); 37 | 38 | if( scriptStatus == 'loaded' ) 39 | { 40 | DISQUS.reset({ reload: true, config: disqusConfig }); 41 | } 42 | else // unloaded | loading 43 | { 44 | window.disqus_config = disqusConfig; 45 | if( scriptStatus == 'unloaded' ) 46 | { 47 | scriptStatus = 'loading'; 48 | $.ajax( 49 | { 50 | url: scriptUrl, 51 | async: true, 52 | cache: true, 53 | dataType: 'script', 54 | success: function() 55 | { 56 | scriptStatus = 'loaded'; 57 | } 58 | }); 59 | } 60 | } 61 | }; 62 | 63 | $win.on( 'scroll resize', throttle( throttleTO, init )); 64 | 65 | $.disqusLoader = function( element, options ) 66 | { 67 | options = $.extend({}, 68 | { 69 | laziness: 1, 70 | throttle: 250, 71 | scriptUrl: false, 72 | disqusConfig: false, 73 | 74 | }, options ); 75 | 76 | laziness = options.laziness + 1; 77 | throttleTO = options.throttle; 78 | disqusConfig = options.disqusConfig; 79 | scriptUrl = scriptUrl === false ? options.scriptUrl : scriptUrl; // set it only once 80 | $instance = ( typeof element == 'string' ? $( element ) : element ).eq( 0 ); 81 | 82 | $instance.data( 'disqusLoaderStatus', 'unloaded' ); 83 | 84 | init(); 85 | }; 86 | 87 | })( jQuery, window, document ); 88 | -------------------------------------------------------------------------------- /assets/js/vendor/jquery.fitvids.js: -------------------------------------------------------------------------------- 1 | /*jshint browser:true */ 2 | /*! 3 | * FitVids 1.1 4 | * 5 | * Copyright 2013, Chris Coyier - http://css-tricks.com + Dave Rupert - http://daverupert.com 6 | * Credit to Thierry Koblentz - http://www.alistapart.com/articles/creating-intrinsic-ratios-for-video/ 7 | * Released under the WTFPL license - http://sam.zoy.org/wtfpl/ 8 | * 9 | */ 10 | 11 | ;(function( $ ){ 12 | 13 | 'use strict'; 14 | 15 | $.fn.fitVids = function( options ) { 16 | var settings = { 17 | customSelector: null, 18 | ignore: null 19 | }; 20 | 21 | if(!document.getElementById('fit-vids-style')) { 22 | // appendStyles: https://github.com/toddmotto/fluidvids/blob/master/dist/fluidvids.js 23 | var head = document.head || document.getElementsByTagName('head')[0]; 24 | var css = '.fluid-width-video-wrapper{width:100%;position:relative;padding:0;}.fluid-width-video-wrapper iframe,.fluid-width-video-wrapper object,.fluid-width-video-wrapper embed {position:absolute;top:0;left:0;width:100%;height:100%;}'; 25 | var div = document.createElement("div"); 26 | div.innerHTML = '

x

'; 27 | head.appendChild(div.childNodes[1]); 28 | } 29 | 30 | if ( options ) { 31 | $.extend( settings, options ); 32 | } 33 | 34 | return this.each(function(){ 35 | var selectors = [ 36 | 'iframe[src*="player.vimeo.com"]', 37 | 'iframe[src*="youtube.com"]', 38 | 'iframe[src*="youtube-nocookie.com"]', 39 | 'iframe[src*="kickstarter.com"][src*="video.html"]', 40 | 'object', 41 | 'embed' 42 | ]; 43 | 44 | if (settings.customSelector) { 45 | selectors.push(settings.customSelector); 46 | } 47 | 48 | var ignoreList = '.fitvidsignore'; 49 | 50 | if(settings.ignore) { 51 | ignoreList = ignoreList + ', ' + settings.ignore; 52 | } 53 | 54 | var $allVideos = $(this).find(selectors.join(',')); 55 | $allVideos = $allVideos.not('object object'); // SwfObj conflict patch 56 | $allVideos = $allVideos.not(ignoreList); // Disable FitVids on this video. 57 | 58 | $allVideos.each(function(){ 59 | var $this = $(this); 60 | if($this.parents(ignoreList).length > 0) { 61 | return; // Disable FitVids on this video. 62 | } 63 | if (this.tagName.toLowerCase() === 'embed' && $this.parent('object').length || $this.parent('.fluid-width-video-wrapper').length) { return; } 64 | if ((!$this.css('height') && !$this.css('width')) && (isNaN($this.attr('height')) || isNaN($this.attr('width')))) 65 | { 66 | $this.attr('height', 9); 67 | $this.attr('width', 16); 68 | } 69 | var height = ( this.tagName.toLowerCase() === 'object' || ($this.attr('height') && !isNaN(parseInt($this.attr('height'), 10))) ) ? parseInt($this.attr('height'), 10) : $this.height(), 70 | width = !isNaN(parseInt($this.attr('width'), 10)) ? parseInt($this.attr('width'), 10) : $this.width(), 71 | aspectRatio = height / width; 72 | if(!$this.attr('name')){ 73 | var videoName = 'fitvid' + $.fn.fitVids._count; 74 | $this.attr('name', videoName); 75 | $.fn.fitVids._count++; 76 | } 77 | $this.wrap('
').parent('.fluid-width-video-wrapper').css('padding-top', (aspectRatio * 100)+'%'); 78 | $this.removeAttr('height').removeAttr('width'); 79 | }); 80 | }); 81 | }; 82 | 83 | // Internal counter for unique video names. 84 | $.fn.fitVids._count = 0; 85 | 86 | // Works with either jQuery or Zepto 87 | })( window.jQuery || window.Zepto ); 88 | -------------------------------------------------------------------------------- /assets/js/vendor/jquery.toc.js: -------------------------------------------------------------------------------- 1 | (function (factory) { 2 | if (typeof define === 'function' && define.amd) { 3 | // AMD. Register as an anonymous module. 4 | define(['jquery'], factory); 5 | } else { 6 | // Browser globals 7 | factory(jQuery); 8 | } 9 | }(function ($) { 10 | 'use strict'; 11 | 12 | /** 13 | * get header level 14 | * @param {String} header: header's tag name 15 | * 16 | * @return {Number} 17 | */ 18 | var getLevel = function (header) { 19 | if (typeof header !== 'string') { 20 | return 0; 21 | } 22 | 23 | var decs = header.match(/\d/g); 24 | return decs ? Math.min.apply(null, decs) : 1; 25 | }; 26 | 27 | /** 28 | * create ordered list 29 | * @param {jQuert} $wrapper 30 | * @param {Number} count 31 | * 32 | * @return {jQuery} list 33 | */ 34 | var createList = function ($wrapper, count) { 35 | while (count--) { 36 | $wrapper = $('