├── .gitignore ├── LICENSE ├── README.md ├── dist ├── climacons │ ├── climacons-webfont.eot │ ├── climacons-webfont.svg │ ├── climacons-webfont.ttf │ └── climacons-webfont.woff ├── index.html ├── scripts.js └── style.css ├── gulpfile.js ├── logo.png ├── manifest.json ├── opt ├── options.html └── options.js ├── package.json ├── screenshot.png └── src ├── index.html ├── script.js ├── style.sass └── vendor ├── climacons.scss ├── jquery-3.3.1.js ├── mousetrap.js └── unsplash-source.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | src/scripts.js 3 | src/style.css 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Paul Schaefer 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 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | #  Start [https://pschfr.github.io/start/dist](https://pschfr.github.io/start/dist) 2 |  3 | ## Personal new tab page with keyboard navigation, bookmarks, weather, quote, most recently listened to song, unread emails, and image background. 4 | 5 | ## Features: 6 | - Background is a random nature photo that changes daily from [Unsplash Source](https://source.unsplash.com/) 7 | - Weather is [powered by Dark Sky!](https://darksky.net/poweredby/) 8 | - If it is snowing or raining, it will "snow" thanks to [HermannBjorgvin/SnowJs](https://github.com/HermannBjorgvin/SnowJs) 9 | - Weather icons are from [Climacons](https://github.com/christiannaths/Climacons-Font) 10 | - Keyboard navigation is thanks to [ccampbell/mousetrap](https://github.com/ccampbell/mousetrap)! (Hit ? for a explanation) 11 | - Random inspirational quote! 12 | - Most recently listened to song thanks to my Last.FM script [pschfr/LastFM.js](https://github.com/pschfr/LastFM.js)! 13 | - Unread emails come straight from Gmail if you're signed in. 14 | 15 | Each category can open by keyboard and click, press escape or click background to close all. 16 | 17 | #### Hint! Press `?` to see a keyboard shortcut explanation. 18 | 19 | ## You need extensions for most browsers to use this as your new tab page: 20 | - [New Tab Redirect for Chrome](https://chrome.google.com/webstore/detail/new-tab-redirect/icpgjfneehieebagbmdbhnlpiopdcmna) 21 | - You can also go to chrome://extensions, tick Developer Mode, and Load as unpacked extension for faster loading. 22 | - [New Tab Override for Firefox](https://addons.mozilla.org/en-US/firefox/addon/new-tab-override/) 23 | - [Custom New Tab Page for Opera](https://addons.opera.com/en/extensions/details/custom-new-tab-page/) 24 | - Safari - just set it as your homepage in settings. 25 | 26 | It's super fast. Fully loaded at ~300ms (~150ms as an extension!!) :D 27 | 28 | Feel free to fork, and add your own bookmarks and quotes. If you have any questions, [tweet me](http://twitter.com/pschfr) or file an issue or pull request. 29 | -------------------------------------------------------------------------------- /dist/climacons/climacons-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pschfr/start/b1f3e699625503a8e9c21de6ecf865b6374f1bb9/dist/climacons/climacons-webfont.eot -------------------------------------------------------------------------------- /dist/climacons/climacons-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pschfr/start/b1f3e699625503a8e9c21de6ecf865b6374f1bb9/dist/climacons/climacons-webfont.ttf -------------------------------------------------------------------------------- /dist/climacons/climacons-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pschfr/start/b1f3e699625503a8e9c21de6ecf865b6374f1bb9/dist/climacons/climacons-webfont.woff -------------------------------------------------------------------------------- /dist/index.html: -------------------------------------------------------------------------------- 1 |
Loading song from Last.FM…
Fetching unread emails…
Hover over the cells to see the keys to open them.
W | Weather details |
G | GitHub repo |
Alt+G | Github repo ideas project |
Esc | Close all cells |
? | Opens this modal |
=0&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-i-u-s-.5))),u}function $(e,t,n){var r=ft(e),o=P(e,t,r),i="border-box"===Te.css(e,"boxSizing",!1,r),a=i;if(ct.test(o)){if(!n)return o;o="auto"}return a=a&&(me.boxSizingReliable()||o===e.style[t]),("auto"===o||!parseFloat(o)&&"inline"===Te.css(e,"display",!1,r))&&(o=e["offset"+t[0].toUpperCase()+t.slice(1)],a=!0),o=parseFloat(o)||0,o+_(e,t,n||(i?"border":"content"),a,r,o)+"px"}function F(e,t,n,r,o){return new F.prototype.init(e,t,n,r,o)}function W(){xt&&(ae.hidden===!1&&e.requestAnimationFrame?e.requestAnimationFrame(W):e.setTimeout(W,Te.fx.interval),Te.fx.tick())}function z(){return e.setTimeout(function(){bt=void 0}),bt=Date.now()}function U(e,t){var n,r=0,o={height:e};for(t=t?1:0;r<4;r+=2-t)n=Ke[r],o["margin"+n]=o["padding"+n]=e;return t&&(o.opacity=o.width=e),o}function X(e,t,n){for(var r,o=(Y.tweeners[t]||[]).concat(Y.tweeners["*"]),i=0,a=o.length;i=0&&n","
"],col:[2,"
"],tr:[2,"","
"],td:[3,"
"],_default:[0,"",""]};et.optgroup=et.option,et.tbody=et.tfoot=et.colgroup=et.caption=et.thead,et.th=et.td;var tt=/<|?\w+;/;!function(){var e=ae.createDocumentFragment(),t=e.appendChild(ae.createElement("div")),n=ae.createElement("input");n.setAttribute("type","radio"),n.setAttribute("checked","checked"),n.setAttribute("name","t"),t.appendChild(n),me.checkClone=t.cloneNode(!0).cloneNode(!0).lastChild.checked,t.innerHTML="",me.noCloneChecked=!!t.cloneNode(!0).lastChild.defaultValue}();var nt=ae.documentElement,rt=/^key/,ot=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,it=/^([^.]*)(?:\.(.+)|)/;Te.event={global:{},add:function(e,t,n,r,o){var i,a,s,u,l,c,f,p,d,h,y,g=$e.get(e);if(g)for(n.handler&&(i=n,n=i.handler,o=i.selector),o&&Te.find.matchesSelector(nt,o),n.guid||(n.guid=Te.guid++),(u=g.events)||(u=g.events={}),(a=g.handle)||(a=g.handle=function(t){return"undefined"!=typeof Te&&Te.event.triggered!==t.type?Te.event.dispatch.apply(e,arguments):void 0}),t=(t||"").match(He)||[""],l=t.length;l--;)s=it.exec(t[l])||[],d=y=s[1],h=(s[2]||"").split(".").sort(),d&&(f=Te.event.special[d]||{},d=(o?f.delegateType:f.bindType)||d,f=Te.event.special[d]||{},c=Te.extend({type:d,origType:y,data:r,handler:n,guid:n.guid,selector:o,needsContext:o&&Te.expr.match.needsContext.test(o),namespace:h.join(".")},i),(p=u[d])||(p=u[d]=[],p.delegateCount=0,f.setup&&f.setup.call(e,r,h,a)!==!1||e.addEventListener&&e.addEventListener(d,a)),f.add&&(f.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),o?p.splice(p.delegateCount++,0,c):p.push(c),Te.event.global[d]=!0)},remove:function(e,t,n,r,o){var i,a,s,u,l,c,f,p,d,h,y,g=$e.hasData(e)&&$e.get(e);if(g&&(u=g.events)){for(t=(t||"").match(He)||[""],l=t.length;l--;)if(s=it.exec(t[l])||[],d=y=s[1],h=(s[2]||"").split(".").sort(),d){for(f=Te.event.special[d]||{},d=(r?f.delegateType:f.bindType)||d,p=u[d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=i=p.length;i--;)c=p[i],!o&&y!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(i,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&f.teardown.call(e,h,g.handle)!==!1||Te.removeEvent(e,d,g.handle),delete u[d])}else for(d in u)Te.event.remove(e,d+t[l],n,r,!0);Te.isEmptyObject(u)&&$e.remove(e,"handle events")}},dispatch:function(e){var t,n,r,o,i,a,s=Te.event.fix(e),u=new Array(arguments.length),l=($e.get(this,"events")||{})[s.type]||[],c=Te.event.special[s.type]||{};for(u[0]=s,t=1;t","