diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 00000000..e740ec5d --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,12 @@ +# These are supported funding model platforms + +github: cheeaun # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] +patreon: # Replace with a single Patreon username +open_collective: # Replace with a single Open Collective username +ko_fi: # Replace with a single Ko-fi username +tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: # Replace with a single IssueHunt username +otechie: # Replace with a single Otechie username +custom: https://www.buymeacoffee.com/cheeaun # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] diff --git a/.gitignore b/.gitignore index b512c09d..fd4f2b06 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -node_modules \ No newline at end of file +node_modules +.DS_Store diff --git a/404.html b/404.html index ef1a2b19..cf05e857 100644 --- a/404.html +++ b/404.html @@ -1,8 +1,8 @@ - + 404 – Page not found. -

Page not found. Go to HackerWeb.

\ No newline at end of file +

Page not found. Go to HackerWeb.

diff --git a/CNAME b/CNAME index 4d27e1b6..a44a387e 100644 --- a/CNAME +++ b/CNAME @@ -1 +1 @@ -app.hackerwebapp.com \ No newline at end of file +hackerweb.app \ No newline at end of file diff --git a/Gruntfile.js b/Gruntfile.js index 7427f2bd..be2ca9fe 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -6,14 +6,9 @@ module.exports = function(grunt) { web: { options: { sourceMap: 'js/hw-web.min.js.map', - sourceMappingURL: function(path){ - return path.replace(/^js\//i, '') + '.map'; - }, - sourceMapRoot: '../', - beautify: { + output: { max_line_len: 500, - screw_ie8: true - } + }, }, files: { 'js/hw-web.min.js': [ @@ -22,7 +17,6 @@ module.exports = function(grunt) { 'assets/js/libs/hogan.js', 'assets/js/libs/hnapi.js', 'assets/js/libs/ibento.js', - 'assets/js/libs/classList.js', 'assets/js/templates.js', 'assets/js/hw.js', 'assets/js/hw-web.js' @@ -32,14 +26,9 @@ module.exports = function(grunt) { ios: { options: { sourceMap: 'js/hw-ios.min.js.map', - sourceMappingURL: function(path){ - return path.replace(/^js\//i, '') + '.map'; - }, - sourceMapRoot: '../', - beautify: { + output: { max_line_len: 500, - screw_ie8: true - } + }, }, files: { 'js/hw-ios.min.js': [ @@ -59,14 +48,9 @@ module.exports = function(grunt) { ios2: { options: { sourceMap: 'js/hw-ios-2.min.js.map', - sourceMappingURL: function(path){ - return path.replace(/^js\//i, '') + '.map'; - }, - sourceMapRoot: '../', - beautify: { + output: { max_line_len: 500, - screw_ie8: true - } + }, }, files: { 'js/hw-ios-2.min.js': [ @@ -84,11 +68,16 @@ module.exports = function(grunt) { } } }, - jshint: { - all: [ - 'assets/js/libs/*.js', - 'assets/js/*.js' - ] + cssmin: { + target: { + files: [{ + expand: true, + cwd: 'assets/css', + src: ['*.css', '!*.min.css'], + dest: 'assets/css', + ext: '.min.css' + }] + } }, templates: { all: { @@ -108,6 +97,13 @@ module.exports = function(grunt) { ], tasks: ['uglify'] }, + css: { + files: [ + 'assets/css/*.css', + '!assets/css/*.min.css' + ], + tasks: ['cssmin'] + }, templates: { files: 'assets/templates/*.mustache', tasks: ['templates'] @@ -121,26 +117,9 @@ module.exports = function(grunt) { connect: { server: { options: { - port: process.env.HACKERWEB_PORT || 80, keepalive: true, hostname: '*', - debug: true, - // middleware: function(connect, options){ - // var appcache = grunt.option('appcache'); - // grunt.log.writeln('Application Cache: ' + (appcache ? 'ON' : 'OFF')); - // return [ - // function(req, res, next){ - // if (req.url == '/manifest.appcache' && !appcache){ - // res.writeHead(404); - // res.end(); - // } else { - // next(); - // } - // }, - // connect.static(options.base), - // connect.directory(options.base) - // ]; - // } + debug: true } } }, @@ -151,55 +130,18 @@ module.exports = function(grunt) { logConcurrentOutput: true } } - }, - bumpAppCache: { - files: ['manifest.appcache'], - options: { - rVersion: /#\s(\d+\-.*)/i, - format: function(match, version){ - version = version.replace(/\d+\-\d+\-\d+/i, function(date){ - var d = new Date(); - var month = d.getMonth() + 1; - if (month < 10) month = '0' + month; - var date = d.getDate(); - if (date < 10) date = '0' + date; - var dateStr = d.getFullYear() + '-' + month + '-' + date; - return dateStr; - }); - return '# ' + version; - } - } - }, - shell: { - deploy: { - options: { - stdout: true - }, - command: [ - 'git checkout gh-pages', - 'git merge master', - 'git push origin gh-pages', - 'git checkout master' - ].join(' && ') - } } }); grunt.loadTasks('tasks'); grunt.loadNpmTasks('grunt-contrib-uglify'); - grunt.loadNpmTasks('grunt-contrib-jshint'); grunt.loadNpmTasks('grunt-contrib-watch'); grunt.loadNpmTasks('grunt-concurrent'); - grunt.loadNpmTasks('grunt-shell'); + grunt.loadNpmTasks('grunt-contrib-cssmin'); // Configurable port number var port = grunt.option('port'); if (port) grunt.config('connect.server.options.port', port); grunt.loadNpmTasks('grunt-contrib-connect'); grunt.registerTask('server', 'concurrent:server'); - - // Shorter aliases - grunt.registerTask('bump', 'bumpAppCache'); - grunt.registerTask('deploy', 'shell:deploy'); - }; diff --git a/README.md b/README.md index f167b13b..e2b8e66b 100644 --- a/README.md +++ b/README.md @@ -33,73 +33,43 @@ This web app works best on iOS 5+ Mobile Safari (iOS theme) and other modern bro Also uses the [unofficial Hacker News API](https://github.com/cheeaun/node-hnapi/). -Some of the *cutting-edge* web technologies used: - -- [localStorage & sessionStorage](http://caniuse.com/namevalue-storage) -- [CORS](http://caniuse.com/cors) -- [Application Cache](http://caniuse.com/offline-apps) -- [CSS Animation](http://caniuse.com/css-animation) -- [CSS Media Queries](http://caniuse.com/css-mediaqueries) -- [Flexible Box Layout](http://caniuse.com/flexbox) (old spec) -- [requestAnimationFrame](http://caniuse.com/requestanimationframe) -- [Web Workers](http://caniuse.com/webworkers) - Development stuff -------------------- -Use [Nitrous.IO](https://www.nitrous.io/?utm_source=github.com&utm_campaign=Hackerweb&utm_medium=hackonnitrous) to create your own *Hackerweb* in seconds: - -[![Hack cheeaun/hackerweb on Nitrous.IO](https://d3o0mnbgv6k92a.cloudfront.net/assets/hack-l-v1-3cc067e71372f6045e1949af9d96095b.png)](https://www.nitrous.io/hack_button?source=embed&runtime=nodejs&repo=cheeaun%2Fhackerweb&file_to_open=README.nitrous.md) - -- Prerequisites - - git clone git://github.com/cheeaun/hackerweb.git - cd hackerweb/ - npm install - -- [Grunt](http://gruntjs.com/) tasks - - - Compile templates in `templates/*` to generate `assets/js/templates.js` - - grunt templates - - - Concat and minify JavaScript files in `assets/js/*` to generate `js/*` +### Prerequisites - grunt uglify +``` +git clone git://github.com/cheeaun/hackerweb.git +cd hackerweb/ +npm install +``` - - Watch the templates and scripts, run `templates` and `uglify` tasks when they're changed +### [Grunt](http://gruntjs.com/) tasks - grunt watch +- `grunt templates` - Compile templates in `templates/*` to generate `assets/js/templates.js` +- `grunt uglify` - Concat and minify JavaScript files in `assets/js/*` to generate `js/*` +- `grunt watch` - Watch the templates and scripts, run `templates` and `uglify` tasks when they're changed +- `grunt embedImage` - Embed images into CSS files. This will parse CSS files in `assets/css/*` and change this (any lines with `url()`): - - Embed images into CSS files + ``` + background-image: url(PATH); /* embedImages:url(PATH) */ + ``` - grunt embedImages + ... into this: - This will parse CSS files in `assets/css/*` and change this (any lines with `url()`): + ``` + background-image: url(data:DATAURI); /* embedImages:url(PATH) */ + ``` - background-image: url(PATH); /* embedImages:url(PATH) */ +- `grunt connect` - Run a local dev server. Arguments: + - `--port=XX` - specify a custom port number - ... into this: - - background-image: url(data:DATAURI); /* embedImages:url(PATH) */ - - - Run a local dev server. - - grunt connect - - Arguments: - - - `--appcache` - enable Application Cache - - `--port=XX` - specify a custom port number - - - Run both `watch` and `connect` tasks at the same time - - grunt server +- `grunt server` - Run both `watch` and `connect` tasks at the same time Contributing and Feedback ------------------------- -Feel free to fork, file some issues or [tweet your feedback](http://twitter.com/cheeaun) to me. +Feel free to fork, file some issues or [tweet your feedback](https://twitter.com/cheeaun) to me. Do check out these awesome contributions as well: @@ -107,17 +77,12 @@ Do check out these awesome contributions as well: - [HNmobile Bookmarklet](http://neocoder.github.com/hnmbookmarklet/) by [neocoder](https://github.com/neocoder) - [Hacker News Menu Tab](http://www.guidefreitas.com/2012/03/hacker-news-menu-tab.html) ([GitHub](https://github.com/guidefreitas/HNewsTab)) by Guilherme Defreitas -Other platforms? ----------------- - -I have plans to make this app look native on other mobile platforms once I fork our some money and get my hands on other mobile devices (Android, Windows Phone, etc) for development and testing. Contact me if you feel generous enough to donate some devices to me :) - License ------- -Licensed under the [MIT License](http://cheeaun.mit-license.org/). +[MIT](http://cheeaun.mit-license.org/). Other similar apps ------------------ -This is the not the first third-party app for Hacker News. Others have tried doing the same thing, despite some slight differences. I've compiled [a list of apps here](https://github.com/cheeaun/hackerweb/wiki/Hacker-News-apps). +This is the not the first third-party app for Hacker News. Others have tried doing the same thing, despite some slight differences. I've compiled [a list of apps here](https://github.com/cheeaun/awesome-hacker-news). diff --git a/README.nitrous.md b/README.nitrous.md deleted file mode 100644 index d2bfcb28..00000000 --- a/README.nitrous.md +++ /dev/null @@ -1,12 +0,0 @@ -# Setup for Nitrous.IO - -Before you can run this project, you will need to install the dependencies. - -Run the following commands in the terminal to configure and start the server: - -1. `cd ~/workspace/hackerweb/` -2. `npm install` -3. `npm install -g grunt-cli` -4. `./script/server` - -Go to the "Preview Menu" and click "Port 3000" diff --git a/assets/css/hw-ios-2.css b/assets/css/hw-ios-2.css index f44ed915..4fd6a48e 100644 --- a/assets/css/hw-ios-2.css +++ b/assets/css/hw-ios-2.css @@ -1,4 +1,4 @@ -@import url(http://fonts.googleapis.com/css?family=Inconsolata); +@import url('https://fonts.googleapis.com/css2?family=Inconsolata&display=swap'); html{ height: 100%; @@ -17,22 +17,6 @@ body{ overflow: hidden; } -#apploader{ - position: fixed; - top: 0; - z-index: 100; - width: 100%; - height: 100%; - background-color: #fff; - pointer-events: none; - opacity: 1; - -webkit-transition: opacity .3s; - transition: opacity .3s; -} -#apploader.hide{ - opacity: 0; -} - a{ color: #007aff; text-decoration: none; @@ -50,9 +34,6 @@ pre, code{ .link-text{ color: #007aff; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; } .inline-block{ @@ -263,6 +244,7 @@ i.icon-loading{ text-decoration: none; -webkit-tap-highlight-color: rgba(0,0,0,0); box-sizing: border-box; + width: 100%; } .tableview-links li>a:visited{ color: #8e8e93; @@ -276,6 +258,7 @@ i.icon-loading{ .tableview-links li>a .story{ -webkit-flex-grow: 1; flex-grow: 1; + min-width: 0; } .tableview-links li>a .story>b{ font-weight: normal; @@ -290,6 +273,10 @@ i.icon-loading{ } .tableview-links li>a .metadata .link-text{ color: #003d80; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + display: block; } .tableview-links li:not(:first-child)>a:first-child:before{ pointer-events: none; @@ -322,17 +309,21 @@ i.icon-loading{ -webkit-touch-callout: none; padding: 0; margin-left: -44px; - min-width: 44px; - background: transparent url(../images/ios7/comment-button.png) no-repeat center; + width: 44px; + background: transparent url(../images/ios7/comment-button.png) no-repeat center 15px; background-size: 20px 19px; -webkit-transition: opacity .3s; transition: opacity .3s; } .tableview-links li>a.detail-disclosure-button.tappable-active{ opacity: .205; + -webkit-transition-duration: 0; + transition-duration: 0; background-color: transparent; } .tableview-links li>a.disclosure{ + -webkit-flex-grow: 1; + flex-grow: 1; padding-right: 15px; } .tableview-links li>a.disclosure:after{ @@ -451,6 +442,7 @@ ol.grouped-tableview-links li>a{ background: transparent url(../images/ios7/disclosure-indicator.png) no-repeat; background-position: right 15px top 50%; background-size: 8px 12.5px; + line-height: 1.2em; } ul.grouped-tableview-links li>a.tappable-active, ol.grouped-tableview-links li>a.tappable-active{ @@ -477,16 +469,20 @@ ol.grouped-tableview-links li>a.tappable-active{ font: -apple-system-body; line-height: 1.2em; } -.view .post-content header h1 a{ +.view .post-content header a{ color: #000; display: block; text-decoration: none; } -.view .post-content header h1 .link-text{ +.view .post-content header a .link-text{ font-size: 13px; font: -apple-system-footnote; line-height: 1.2em; color: #003d80; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + display: block; } .view .post-content header .metadata{ font-size: 13px; @@ -519,6 +515,7 @@ ol.grouped-tableview-links li>a.tappable-active{ width: 100%; } .view .post-content .poll li .poll-details b{ + font-weight: normal; display: table-cell; color: #333; } @@ -555,6 +552,10 @@ ol.grouped-tableview-links li>a.tappable-active{ background-size: 1px 2px; margin-bottom: 30px; } +.view section.comments>*{ + font-size: 110%; + line-height: 1.3em; +} .view section.comments ul{ margin: 0 auto; padding: 0; @@ -592,6 +593,12 @@ ol.grouped-tableview-links li>a.tappable-active{ float: left; color: #bf223f; } +.view section.comments p.metadata.deleted{ + margin-bottom: 8px; +} +.view section.comments p.metadata.deleted span{ + float: left; +} .view section.comments p.metadata .user.op:after{ content: 'OP'; display: inline-block; @@ -709,11 +716,12 @@ ol.grouped-tableview-links li>a.tappable-active{ } #y-icon{ - background: transparent url(../../icons/touch-icon-120.png) no-repeat; + background: transparent url(../../icons/icon.svg) no-repeat; background-size: 60px 60px; width: 60px; height: 60px; float: left; + border: 1px solid #eee; border-radius: 14px; } @@ -999,7 +1007,7 @@ ol.grouped-tableview-links li>a.tappable-active{ } } -@media only screen and (min-width: 640px){ +@media only screen and (min-width: 737px){ .view:after{ -webkit-transform-origin: bottom left; transform-origin: bottom left; @@ -1099,8 +1107,8 @@ ol.grouped-tableview-links li>a.tappable-active{ transition: -webkit-transform 350ms; } #view-about.hidden{ - -webkit-transform: translateY(175%); - transform: translateY(175%); + -webkit-transform: translateY(220%); + transform: translateY(220%); } #view-about>.scroll>section{ padding: 0 28px; @@ -1120,14 +1128,126 @@ ol.grouped-tableview-links li>a.tappable-active{ padding-bottom: 34px; } - #y-icon{ - background: transparent url(../../icons/touch-icon-152.png) no-repeat; - background-size: 76px 76px; - width: 76px; - height: 76px; - border-radius: 18px; - } #app-desc{ margin-left: 86px; } +} + +@media (prefers-color-scheme: dark){ + body{ + color: #fff; + background-color: #1c1c1e; + } + #apploader{ + background-color: #1c1c1e; + } + a, + .link-text{ + color: #1684ff; + } + .view>header, + .view.shaded>header{ + background-color: #2c2c2e; + } + .view>header .header-button{ + filter: brightness(1.1); + /* color: #1684ff; */ + } + .view:after{ + background-color: rgba(255,255,255,.15); + } + .view.shaded>.scroll, + .tableview{ + background-color: #1c1c1e; + } + .tableview li{ + background-image: -webkit-linear-gradient(bottom, #3a3a3c, #3a3a3c 50%, transparent 50%); + background-image: linear-gradient(bottom, #3a3a3c, #3a3a3c 50%, transparent 50%); + } + .tableview-links li>a{ + color: #fff; + } + .tableview-links li>a .metadata .link-text, + .view .post-content header a .link-text{ + color: #2988cf; + } + .tableview-links li:not(:first-child)>a:first-child:before{ + background-image: -webkit-linear-gradient(bottom, #48484a, #48484a 50%, transparent 50%); + background-image: linear-gradient(bottom, #48484a, #48484a 50%, transparent 50%); + } + .tableview-links li>a.tappable-active, + .tableview-links li>a.selected{ + background-color: #48484a; + } + .grouped-tableview{ + background-color: #2c2c2e; + background-image: -webkit-linear-gradient(top, #3a3a3c, #3a3a3c 50%, transparent 50%), -webkit-linear-gradient(bottom, #3a3a3c, #3a3a3c 50%, transparent 50%); + background-image: linear-gradient(top, #3a3a3c, #3a3a3c 50%, transparent 50%), linear-gradient(bottom, #3a3a3c, #3a3a3c 50%, transparent 50%); + } + ul.grouped-tableview li, + ol.grouped-tableview li, + ul.grouped-tableview-links:before, + ol.grouped-tableview-links:before{ + background-image: -webkit-linear-gradient(bottom, #3a3a3c, #3a3a3c 50%, transparent 50%); + background-image: linear-gradient(bottom, #3a3a3c, #3a3a3c 50%, transparent 50%); + } + ul.grouped-tableview-links li, + ol.grouped-tableview-links li{ + background-color: #2c2c2e; + } + ul.grouped-tableview-links li>a, + ol.grouped-tableview-links li>a{ + color: #fff; + } + ul.grouped-tableview-links li>a.tappable-active, + ol.grouped-tableview-links li>a.tappable-active{ + background-color: #48484a; + } + .view .post-content header a{ + color: #fff; + } + .view .post-content pre, + .view section.comments pre{ + background-color: #48484a; + } + .view section.comments{ + background-color: #2c2c2e; + background-image: -webkit-linear-gradient(top, #48484a, #48484a 50%, transparent 50%), -webkit-linear-gradient(bottom, #48484a, #48484a 50%, transparent 50%); + background-image: linear-gradient(top, #48484a, #48484a 50%, transparent 50%), linear-gradient(bottom, #48484a, #48484a 50%, transparent 50%); + } + .view section.comments ul li{ + background-image: -webkit-linear-gradient(top, #48484a, #48484a 50%, transparent 50%); + background-image: linear-gradient(top, #48484a, #48484a 50%, transparent 50%); + } + .view section.comments ul ul li{ + color: #f2f2f7; + } + .view section.comments p.metadata .user{ + color: #e84f66; + } + .view section.comments p.metadata .user.op:after{ + background-color: #e84f66; + } + .view section.comments .load-error button{ + filter: brightness(1.1); + /* color: #1684ff; */ + } + @media only screen and (min-width: 737px){ + .tableview-links li>a.selected:visited{ + color: #fff; + } + #view-home>header, + #view-home>.scroll{ + border-right-color: #48484a; + } + } + .icon-refresh, + #view-comments .header-button-left button, + #view-about .header-button-left button, + .tableview-links li>a.detail-disclosure-button{ + filter: brightness(1.1); + } + .loader{ + filter: invert(1); + } } \ No newline at end of file diff --git a/assets/css/hw-ios-2.min.css b/assets/css/hw-ios-2.min.css new file mode 100644 index 00000000..d7b7e90a --- /dev/null +++ b/assets/css/hw-ios-2.min.css @@ -0,0 +1 @@ +@import url(https://fonts.googleapis.com/css2?family=Inconsolata&display=swap);html{height:100%;overflow:hidden}body{font-family:-apple-system-font,'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:17px;margin:0;padding:0;background-color:#fff;word-wrap:break-word;overflow-wrap:break-word;-webkit-text-size-adjust:none;visibility:visible;overflow:hidden}a{color:#007aff;text-decoration:none;-webkit-tap-highlight-color:rgba(0,0,0,.1)}pre{word-wrap:normal;overflow-wrap:normal;line-height:1.2em}code,pre{font-family:Inconsolata,Consolas,"Lucida Console",monospace}.link-text{color:#007aff}.inline-block{display:inline-block}i.icon-refresh{display:inline-block;width:14px;height:17px;background:transparent url(../images/ios7/refresh-icon.png) no-repeat;background-size:14px 17px;vertical-align:text-bottom;white-space:nowrap;overflow:hidden;text-indent:100%;-webkit-transform:translateY(-3px)}i.icon-loading{display:inline-block;width:20px;height:20px;background:transparent url(../images/ios/activity-indicator.png) no-repeat;background-size:20px auto;vertical-align:text-bottom;-webkit-animation:loading-sprite 1s step-start infinite;animation:loading-sprite 1s step-start infinite}@-webkit-keyframes loading-sprite{0%{background-position:0 0}8.33%{background-position:0 -20px}16.67%{background-position:0 -40px}25%{background-position:0 -60px}33.33%{background-position:0 -80px}41.67%{background-position:0 -100px}50%{background-position:0 -120px}58.33%{background-position:0 -140px}66.67%{background-position:0 -160px}75%{background-position:0 -180px}83.33%{background-position:0 -200px}91.67%{background-position:0 -220px}100%{background-position:0 0}}@keyframes loading-sprite{0%{background-position:0 0}8.33%{background-position:0 -20px}16.67%{background-position:0 -40px}25%{background-position:0 -60px}33.33%{background-position:0 -80px}41.67%{background-position:0 -100px}50%{background-position:0 -120px}58.33%{background-position:0 -140px}66.67%{background-position:0 -160px}75%{background-position:0 -180px}83.33%{background-position:0 -200px}91.67%{background-position:0 -220px}100%{background-position:0 0}}.view{position:fixed;top:0;left:0;right:0;bottom:0;overflow:hidden;z-index:2}.view.hidden{-webkit-transform:translate3d(-100%,-100%,0);transform:translate3d(-100%,-100%,0);pointer-events:none}.view>header{height:44px;min-height:44px;max-height:44px;line-height:44px;background-color:#f8f8f8;-webkit-user-select:none;-webkit-touch-callout:none}.view:after{content:'';position:absolute;top:44px;width:100%;height:1px;background-color:rgba(0,0,0,.3);z-index:3}.view.shaded>header{background-color:#f6f6f7}.view>header .header-button{cursor:pointer;text-decoration:none;position:absolute;top:0;padding:0 8px;color:#007aff;font-style:normal;-webkit-transition:opacity .3s;transition:opacity .3s;-webkit-tap-highlight-color:transparent}.view>header .header-button.tappable-active{opacity:.205;-webkit-transition-duration:0;transition-duration:0}.view>header .header-button-left{left:0}.view>header .header-button-right{right:0}.view>header .header-button button{outline:0;cursor:pointer;-webkit-appearance:none;appearance:none;padding:0;margin:0;border:0;background:transparent none;font:inherit;color:inherit;display:block;white-space:nowrap}.view>header .header-button button>i{margin:0 7px}.view>header .header-back-button{background:transparent url(../images/ios7/back-icon.png) no-repeat center left;background-size:12.5px 20.5px;background-position:8px center}.view>header .header-back-button button{padding-left:19px}.view>header h1{font-size:17px;text-align:center;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;margin:0;padding:0}.view>.scroll{height:calc(100% - 44px);overflow:auto;-webkit-overflow-scrolling:touch}.view>.scroll>section{height:100%;overflow:auto;-webkit-overflow-scrolling:touch}.view.shaded>.scroll{background-color:#efeff4}.view>.scroll .load-error,.view>.scroll .loader{padding:100px 0 50px;-webkit-user-select:none;text-align:center;color:#8e8e93;font-size:17px;font-weight:400;font:-apple-system-body}.tableview{margin:0;padding:0;list-style:none;background-color:#fff;-webkit-user-select:none}.tableview li{display:block;background-image:-webkit-linear-gradient(bottom,#c8c7cc,#c8c7cc 50%,transparent 50%);background-image:linear-gradient(bottom,#c8c7cc,#c8c7cc 50%,transparent 50%);background-position:15px bottom;background-repeat:no-repeat;background-size:100% 2px}.tableview-links li{display:-webkit-flex;display:flex}.tableview-links li>a{display:-webkit-flex;display:flex;font-size:17px;font:-apple-system-body;line-height:1.2em;color:#000;padding:10px 10px 10px 15px;text-decoration:none;-webkit-tap-highlight-color:transparent;box-sizing:border-box;width:100%}.tableview-links li>a:visited{color:#8e8e93}.tableview-links li>a .number{text-align:center;min-width:2.5ex;padding-right:10px;color:#8e8e93}.tableview-links li>a .story{-webkit-flex-grow:1;flex-grow:1;min-width:0}.tableview-links li>a .story>b{font-weight:400}.tableview-links li>a .metadata{margin-top:1px;font-size:13px;font:-apple-system-footnote;line-height:1.2em;display:block;color:#8e8e93}.tableview-links li>a .metadata .link-text{color:#003d80;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}.tableview-links li:not(:first-child)>a:first-child:before{pointer-events:none;content:'';width:100%;position:absolute;height:1px;background-image:-webkit-linear-gradient(bottom,#fff,#fff 50%,transparent 50%);background-image:linear-gradient(bottom,#fff,#fff 50%,transparent 50%);background-position:bottom;background-size:1px 2px;left:0;-webkit-transform:translateY(-11px);transform:translateY(-11px);opacity:0}.tableview-links li>a.selected,.tableview-links li>a.tappable-active{background-color:#d9d9d9}.tableview-links li:not(:first-child)>a.tappable-active:first-child:before{opacity:1}.tableview-links li>a.detail-disclosure{-webkit-flex-grow:1;flex-grow:1;padding-right:44px}.tableview-links li>a.detail-disclosure-button{-webkit-touch-callout:none;padding:0;margin-left:-44px;width:44px;background:transparent url(../images/ios7/comment-button.png) no-repeat center 15px;background-size:20px 19px;-webkit-transition:opacity .3s;transition:opacity .3s}.tableview-links li>a.detail-disclosure-button.tappable-active{opacity:.205;-webkit-transition-duration:0;transition-duration:0;background-color:transparent}.tableview-links li>a.disclosure{-webkit-flex-grow:1;flex-grow:1;padding-right:15px}.tableview-links li>a.disclosure:after{pointer-events:none;content:'';width:30px;background:transparent url(../images/ios7/disclosure-indicator.png) no-repeat center right;background-size:8px 12.5px}.tableview-links li>a.more-link{cursor:pointer;-webkit-touch-callout:none;display:block;padding:20px 20px 20px calc(25px + 2.5ex);-webkit-flex-grow:1;flex-grow:1;display:-webkit-flex;display:flex}.tableview-links li>a.more-link:before{content:none!important}.tableview-links li>a.more-link .loader{display:none;padding:0;text-align:right;-webkit-flex-grow:1;flex-grow:1}.tableview-links li>a.more-link.loading .loader{display:block}.grouped-tableview{background-color:#fff;background-image:-webkit-linear-gradient(top,#c8c7cc,#c8c7cc 50%,transparent 50%),-webkit-linear-gradient(bottom,#c8c7cc,#c8c7cc 50%,transparent 50%);background-image:linear-gradient(top,#c8c7cc,#c8c7cc 50%,transparent 50%),linear-gradient(bottom,#c8c7cc,#c8c7cc 50%,transparent 50%);background-position:top,bottom;background-repeat:repeat-x;background-size:1px 2px;padding:10px 13px;margin:0 0 34px}.grouped-tableview:first-child{margin-top:34px}.grouped-tableview+.grouped-tableview{margin-top:35px}section.grouped-tableview{font-size:13px;font:-apple-system-footnote;line-height:1.4em}section.grouped-tableview p{margin:0 0 1em}section.grouped-tableview p:last-child{margin:0}ol.grouped-tableview,ul.grouped-tableview{display:block;list-style:none;padding:0}ol.grouped-tableview li,ul.grouped-tableview li{background-image:-webkit-linear-gradient(bottom,#c8c7cc,#c8c7cc 50%,transparent 50%);background-image:linear-gradient(bottom,#c8c7cc,#c8c7cc 50%,transparent 50%);background-position:15px bottom;background-repeat:no-repeat;background-size:100% 2px;padding:15px}ol.grouped-tableview li:last-child,ul.grouped-tableview li:last-child{background-position:0 -1px}ol.grouped-tableview-links,ul.grouped-tableview-links{background-color:transparent;background-image:none}ol.grouped-tableview-links:before,ul.grouped-tableview-links:before{content:'';display:block;height:1px;background-color:transparent;background-image:-webkit-linear-gradient(bottom,#c8c7cc,#c8c7cc 50%,transparent 50%);background-image:linear-gradient(bottom,#c8c7cc,#c8c7cc 50%,transparent 50%);background-repeat:repeat-x;background-position:bottom;background-size:1px 2px}ol.grouped-tableview-links li,ul.grouped-tableview-links li{padding:0;background-color:#fff}ol.grouped-tableview-links li:last-child,ul.grouped-tableview-links li:last-child{background-position:bottom}ol.grouped-tableview-links li>a,ul.grouped-tableview-links li>a{-webkit-tap-highlight-color:transparent;display:block;padding:15px;text-decoration:none;color:#000;background:transparent url(../images/ios7/disclosure-indicator.png) no-repeat;background-position:right 15px top 50%;background-size:8px 12.5px;line-height:1.2em}ol.grouped-tableview-links li>a.tappable-active,ul.grouped-tableview-links li>a.tappable-active{background-color:#d9d9d9}.view .post-content{min-height:5em}.view .post-content header{padding:15px;font-size:17px;font:-apple-system-body;line-height:1.2em}.view .post-content header h1,.view .post-content header p{margin:0;padding:0}.view .post-content header h1{font-size:17px;font-weight:400;font:-apple-system-body;line-height:1.2em}.view .post-content header a{color:#000;display:block;text-decoration:none}.view .post-content header a .link-text{font-size:13px;font:-apple-system-footnote;line-height:1.2em;color:#003d80;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}.view .post-content header .metadata{font-size:13px;font:-apple-system-footnote;line-height:1.4em;color:#8e8e93}.view .post-content pre,.view section.comments pre{-webkit-overflow-scrolling:touch;font-size:inherit;margin:0 0 8px;overflow:auto;padding:.65em 0;background-color:#eee;border-radius:3px}.view .post-content .poll{margin:0;padding:0;list-style:none}.view .post-content .poll li{margin-bottom:9px}.view .post-content .poll li .poll-details{display:table;width:100%}.view .post-content .poll li .poll-details b{font-weight:400;display:table-cell;color:#333}.view .post-content .poll li .poll-details .points{display:table-cell;white-space:nowrap;color:#888;text-align:right;vertical-align:bottom}.view .post-content .poll li .poll-bar{background-color:#eee;width:100%;height:3px;overflow:hidden;border-radius:3px}.view .post-content .poll li .poll-bar span{background-color:#007aff;display:block;width:0;height:3px}.view section.comments{background-color:#fff;font-size:13px;font:-apple-system-footnote;line-height:1.4em;background-image:-webkit-linear-gradient(top,#c8c7cc,#c8c7cc 50%,transparent 50%),-webkit-linear-gradient(bottom,#c8c7cc,#c8c7cc 50%,transparent 50%);background-image:linear-gradient(top,#c8c7cc,#c8c7cc 50%,transparent 50%),linear-gradient(bottom,#c8c7cc,#c8c7cc 50%,transparent 50%);background-position:top,bottom;background-repeat:repeat-x;background-size:1px 2px;margin-bottom:30px}.view section.comments>*{font-size:110%;line-height:1.3em}.view section.comments ul{margin:0 auto;padding:0;list-style:none;max-width:88ex}.view section.comments ul li{padding:15px;background-image:-webkit-linear-gradient(top,#c8c7cc,#c8c7cc 50%,transparent 50%);background-image:linear-gradient(top,#c8c7cc,#c8c7cc 50%,transparent 50%);background-position:top;background-repeat:repeat-x;background-size:1px 2px}.view section.comments>ul>li:first-child{background-image:none}.view section.comments ul ul li{padding:0 0 0 14px;border:0;color:#333;background:transparent url(../images/ios7/comment-arrow.png) no-repeat 0 4px;background-size:8px 9px;image-rendering:-webkit-optimize-contrast;image-rendering:crisp-edges}.view section.comments p{margin:8px 0}.view section.comments p.metadata{padding:0;margin:0}.view section.comments p.metadata .user{float:left;color:#bf223f}.view section.comments p.metadata.deleted{margin-bottom:8px}.view section.comments p.metadata.deleted span{float:left}.view section.comments p.metadata .user.op:after{content:'OP';display:inline-block;font-size:70%;color:#fff;background-color:#bf223f;padding:3px 4px;line-height:1;margin-left:5px;border-radius:2px}.view section.comments p.metadata time{display:block;text-align:right}.view section.comments p.metadata time a{color:#8e8e93}.view .post-content header .metadata a.external-link{color:#8e8e93;text-decoration:none;display:block;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;padding-left:16px;background:transparent url(../images/ios7/external-arrow.png) no-repeat 0 50%;background-size:12px 9px;image-rendering:-webkit-optimize-contrast;image-rendering:crisp-edges}.view section.comments button.comments-toggle{outline:0;display:block;width:100%;max-width:320px;cursor:pointer;padding:5px 10px;font-size:inherit;border-radius:3px;-webkit-tap-highlight-color:transparent;margin:2px auto 4px;color:#848484;border:1px solid #848484;background-color:transparent;-webkit-user-select:none}.view section.comments button.comments-toggle.tappable-active{color:#fff;background-color:#848484}.view section.comments li.more-link-container{padding:0}.view section.comments li>a.more-link{display:block;cursor:pointer;-webkit-touch-callout:none;padding:20px;color:#000}.view section.comments li>a.more-link.tappable-active{background-color:#d9d9d9}.view section.comments p.no-comments{text-align:center;padding:50px 0;margin:0;color:#8e8e93;font-size:17px;font:-apple-system-body}.view section.comments .load-error,.view section.comments .loader{padding-top:50px}.view section.comments .load-error button{cursor:pointer;-webkit-appearance:none;appearance:none;border:0;margin:0;padding:0;font-size:inherit;color:#007aff;background-color:transparent;outline:0}.view section.comments .load-error button.tappable-active{opacity:.205}.foot-label{margin:0;padding:10px 15px;color:#6d6d72;font-size:15px;font:-apple-system-subheadline;font-weight:400;line-height:1.2em}.grouped-tableview+.foot-label{margin-top:-34px}.cf:after,.cf:before{content:"";display:table}.cf:after{clear:both}#y-icon{background:transparent url(../../icons/icon.svg) no-repeat;background-size:60px 60px;width:60px;height:60px;float:left;border:1px solid #eee;border-radius:14px}#app-desc{margin:0 0 0 70px;font-size:15px;font:-apple-system-subheadline;font-weight:400;line-height:1.2em}#app-desc strong{font-size:17px;font:-apple-system-body;line-height:1.3}.view:before{content:'';background-color:rgba(0,0,0,.095);background-image:-webkit-linear-gradient(left,rgba(0,0,0,0),rgba(0,0,0,.18));background-image:linear-gradient(left,rgba(0,0,0,0),rgba(0,0,0,.18));background-size:9px 1px;background-position:right;background-repeat:repeat-y;position:absolute;top:44px;left:0;width:100%;height:100%;pointer-events:none;opacity:0}.slide-up,.view,.view:after,.view:before,.view>.scroll,.view>header,.view>header .header-button button,.view>header h1{-webkit-animation-timing-function:cubic-bezier(.3,.5,0,1);-webkit-animation-duration:.5s;animation-timing-function:cubic-bezier(.3,.5,0,1);animation-duration:.5s}.view{-webkit-transition:-webkit-filter .5s;transition-property:-webkit-filter,filter;transition-duration:.5s}.view>.scroll,.view>.scroll>section{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.no-pointer,.slide-in-from-left,.slide-in-from-right,.slide-out-to-left,.slide-out-to-right{pointer-events:none}.slide-in-from-right:before{-webkit-animation-name:slidefadeinfromright;animation-name:slidefadeinfromright}.slide-in-from-right>.scroll{-webkit-animation-name:slideinfromright;animation-name:slideinfromright}.slide-in-from-right:after,.slide-in-from-right>header{-webkit-animation-name:fadein;animation-name:fadein}.slide-in-from-right>header h1{-webkit-animation-name:slide60infromright;animation-name:slide60infromright}.slide-in-from-right>header .header-back-button button{-webkit-animation-name:backinfromcenter;animation-name:backinfromcenter}.slide-in-from-left>.scroll{-webkit-animation-name:slide33infromleft;animation-name:slide33infromleft}.slide-in-from-left>header h1{-webkit-animation-name:slide60infromleft;animation-name:slide60infromleft}.slide-in-from-left>header .header-back-button button{-webkit-animation-name:backinfromleft;animation-name:backinfromleft}.slide-out-to-right:before{-webkit-animation-name:slidefadeouttoright;animation-name:slidefadeouttoright}.slide-out-to-right>.scroll{-webkit-animation-name:slideouttoright;animation-name:slideouttoright}.slide-out-to-right:after,.slide-out-to-right>header{-webkit-animation-name:fadeout;animation-name:fadeout}.slide-out-to-right>header h1{-webkit-animation-name:slide60outtoright;animation-name:slide60outtoright}.slide-out-to-right>header .header-back-button button{-webkit-animation-name:backouttocenter;animation-name:backouttocenter}.slide-out-to-left>.scroll{-webkit-animation-name:slide33outtoleft;animation-name:slide33outtoleft}.slide-out-to-left>header h1{-webkit-animation-name:slide60outtoleft;animation-name:slide60outtoleft}.slide-out-to-left>header .header-back-button button{-webkit-animation-name:backouttoleft;animation-name:backouttoleft}.slide-up{-webkit-animation-name:slideup;animation-name:slideup}.slide-down{-webkit-animation-name:slidedown;animation-name:slidedown}@-webkit-keyframes slideinfromright{from{-webkit-transform:translate3d(100%,0,0)}to{-webkit-transform:translate3d(0,0,0)}}@-webkit-keyframes slide33infromleft{from{-webkit-transform:translate3d(-33%,0,0)}to{-webkit-transform:translate3d(0,0,0)}}@-webkit-keyframes slide33outtoleft{from{-webkit-transform:translate3d(0,0,0)}to{-webkit-transform:translate3d(-33%,0,0)}}@-webkit-keyframes slideouttoright{from{-webkit-transform:translate3d(0,0,0)}to{-webkit-transform:translate3d(100%,0,0)}}@-webkit-keyframes slidefadeinfromright{from{-webkit-transform:translate3d(0,0,0);opacity:0}to{-webkit-transform:translate3d(-100%,0,0);opacity:1}}@-webkit-keyframes slidefadeouttoright{from{-webkit-transform:translate3d(-100%,0,0);opacity:1}to{-webkit-transform:translate3d(0,0,0);opacity:0}}@-webkit-keyframes slide60infromright{from{-webkit-transform:translate3d(60%,0,0)}to{-webkit-transform:translate3d(0,0,0)}}@-webkit-keyframes slide60infromleft{from{-webkit-transform:translate3d(-60%,0,0)}to{-webkit-transform:translate3d(0,0,0)}}@-webkit-keyframes slide60outtoleft{from{-webkit-transform:translate3d(0,0,0)}to{-webkit-transform:translate3d(-60%,0,0)}}@-webkit-keyframes slide60outtoright{from{-webkit-transform:translate3d(0,0,0)}to{-webkit-transform:translate3d(60%,0,0)}}@-webkit-keyframes fadein{from{opacity:0}to{opacity:1}}@-webkit-keyframes fadeout{from{opacity:1}to{opacity:0}}@-webkit-keyframes backinfromcenter{from{-webkit-transform:translate3d(200%,0,0)}to{-webkit-transform:translate3d(0,0,0)}}@-webkit-keyframes backinfromleft{from{-webkit-transform:translate3d(-100%,0,0)}to{-webkit-transform:translate3d(0,0,0)}}@-webkit-keyframes backouttocenter{from{-webkit-transform:translate3d(0,0,0)}to{-webkit-transform:translate3d(200%,0,0)}}@-webkit-keyframes backouttoleft{from{-webkit-transform:translate3d(0,0,0)}to{-webkit-transform:translate3d(-100%,0,0)}}@-webkit-keyframes slideup{from{-webkit-transform:translate3d(0,100%,0)}to{-webkit-transform:translate3d(0,0,0)}}@-webkit-keyframes slidedown{from{-webkit-transform:translate3d(0,0,0)}to{-webkit-transform:translate3d(0,100%,0)}}@media only screen and (-webkit-min-device-pixel-ratio:1.5),only screen and (min-resolution:144dpi){.view:after{width:200%;-webkit-transform:scale(.5);transform:scale(.5);-webkit-transform-origin:0 0;transform-origin:0 0}.grouped-tableview,.tableview-links li:not(:first-child)>a:first-child:before,.view section.comments,.view section.comments ul li,ol.grouped-tableview-links:before,ul.grouped-tableview-links:before{background-size:1px 1px}.tableview li,ol.grouped-tableview li,ul.grouped-tableview li{background-size:100% 1px}.view section.comments button.comments-toggle{border:0;position:relative}.view section.comments button.comments-toggle:after{content:'';position:absolute;top:0;left:0;box-sizing:border-box;width:200%;height:200%;border:1px solid #848484;border-radius:6px;-webkit-transform:scale(.5);transform:scale(.5);-webkit-transform-origin:0 0;transform-origin:0 0}}@media only screen and (min-width:737px){.view:after{-webkit-transform-origin:bottom left;transform-origin:bottom left}.tableview-links li>a.selected:visited{color:#000}#view-comments>header,#view-home>header{position:absolute;bottom:0;width:100%;box-sizing:border-box}#view-comments:after,#view-home:after{top:auto;bottom:44px}#view-home{width:301px}#view-home>header{border-right:1px solid #bbbbbe}#view-home>header h1{display:none}#view-home>.scroll{border-right:1px solid #8e8e93}#view-comments{left:301px}#view-comments .header-back-button{padding:0 15px;width:13px;background:transparent url(../images/ios7/close-button.png) center no-repeat;background-size:13px 13px;height:44px}#view-comments .header-back-button button{display:none}#view-comments>header h1{text-align:left;margin-left:44px!important;margin-right:10px!important;font-weight:400}.view-blank-state{display:-webkit-flex;display:flex;height:100%}.view-blank-state-text{margin:auto;-webkit-user-select:none;text-align:center;color:#8e8e93;font-size:17px;font-weight:400;font:-apple-system-body}#overlay{position:absolute;top:0;z-index:100;width:100%;height:100%;background-color:rgba(0,2,8,.5);opacity:1;-webkit-transition:opacity 350ms ease-in-out;transition:opacity 350ms ease-in-out}#overlay.hide{opacity:0;pointer-events:none;visibility:hidden}#view-about{width:540px;height:400px;left:50%;margin-left:-270px;top:50%;margin-top:-200px;z-index:101;-webkit-transform:translateY(0);transform:translateY(0);box-sizing:border-box}#view-about.animated{-webkit-transition:-webkit-transform 350ms;transition:-webkit-transform 350ms}#view-about.hidden{-webkit-transform:translateY(220%);transform:translateY(220%)}#view-about>.scroll>section{padding:0 28px}#view-about .grouped-tableview,#view-about .grouped-tableview li:last-child{background-image:none}#view-about .grouped-tableview{border-radius:5px;overflow:hidden}#view-about .grouped-tableview:before{content:none}#view-about .foot-label{padding-bottom:34px}#app-desc{margin-left:86px}}@media (prefers-color-scheme:dark){body{color:#fff;background-color:#1c1c1e}#apploader{background-color:#1c1c1e}.link-text,a{color:#1684ff}.view.shaded>header,.view>header{background-color:#2c2c2e}.view>header .header-button{filter:brightness(1.1)}.view:after{background-color:rgba(255,255,255,.15)}.tableview,.view.shaded>.scroll{background-color:#1c1c1e}.tableview li{background-image:-webkit-linear-gradient(bottom,#3a3a3c,#3a3a3c 50%,transparent 50%);background-image:linear-gradient(bottom,#3a3a3c,#3a3a3c 50%,transparent 50%)}.tableview-links li>a{color:#fff}.tableview-links li>a .metadata .link-text,.view .post-content header a .link-text{color:#2988cf}.tableview-links li:not(:first-child)>a:first-child:before{background-image:-webkit-linear-gradient(bottom,#48484a,#48484a 50%,transparent 50%);background-image:linear-gradient(bottom,#48484a,#48484a 50%,transparent 50%)}.tableview-links li>a.selected,.tableview-links li>a.tappable-active{background-color:#48484a}.grouped-tableview{background-color:#2c2c2e;background-image:-webkit-linear-gradient(top,#3a3a3c,#3a3a3c 50%,transparent 50%),-webkit-linear-gradient(bottom,#3a3a3c,#3a3a3c 50%,transparent 50%);background-image:linear-gradient(top,#3a3a3c,#3a3a3c 50%,transparent 50%),linear-gradient(bottom,#3a3a3c,#3a3a3c 50%,transparent 50%)}ol.grouped-tableview li,ol.grouped-tableview-links:before,ul.grouped-tableview li,ul.grouped-tableview-links:before{background-image:-webkit-linear-gradient(bottom,#3a3a3c,#3a3a3c 50%,transparent 50%);background-image:linear-gradient(bottom,#3a3a3c,#3a3a3c 50%,transparent 50%)}ol.grouped-tableview-links li,ul.grouped-tableview-links li{background-color:#2c2c2e}ol.grouped-tableview-links li>a,ul.grouped-tableview-links li>a{color:#fff}ol.grouped-tableview-links li>a.tappable-active,ul.grouped-tableview-links li>a.tappable-active{background-color:#48484a}.view .post-content header a{color:#fff}.view .post-content pre,.view section.comments pre{background-color:#48484a}.view section.comments{background-color:#2c2c2e;background-image:-webkit-linear-gradient(top,#48484a,#48484a 50%,transparent 50%),-webkit-linear-gradient(bottom,#48484a,#48484a 50%,transparent 50%);background-image:linear-gradient(top,#48484a,#48484a 50%,transparent 50%),linear-gradient(bottom,#48484a,#48484a 50%,transparent 50%)}.view section.comments ul li{background-image:-webkit-linear-gradient(top,#48484a,#48484a 50%,transparent 50%);background-image:linear-gradient(top,#48484a,#48484a 50%,transparent 50%)}.view section.comments ul ul li{color:#f2f2f7}.view section.comments p.metadata .user{color:#e84f66}.view section.comments p.metadata .user.op:after{background-color:#e84f66}.view section.comments .load-error button{filter:brightness(1.1)}@media only screen and (min-width:737px){.tableview-links li>a.selected:visited{color:#fff}#view-home>.scroll,#view-home>header{border-right-color:#48484a}}#view-about .header-button-left button,#view-comments .header-button-left button,.icon-refresh,.tableview-links li>a.detail-disclosure-button{filter:brightness(1.1)}.loader{filter:invert(1)}} \ No newline at end of file diff --git a/assets/css/hw-ios.css b/assets/css/hw-ios.css index 3ad6e0e4..38562334 100644 --- a/assets/css/hw-ios.css +++ b/assets/css/hw-ios.css @@ -1,5 +1,3 @@ -@import url(http://fonts.googleapis.com/css?family=Inconsolata); - html{ height: 100%; } @@ -682,10 +680,10 @@ ol.grouped-tableview-links li>a.disclosure.tappable-active:after{ margin: 0; padding: 0; } -.view .post-content header h1 a{ +.view .post-content header a{ display: block; } -.view .post-content header h1 a .link-text{ +.view .post-content header a .link-text{ font-size: 13px; } .view .post-content header .metadata{ @@ -707,7 +705,7 @@ ol.grouped-tableview-links li>a.disclosure.tappable-active:after{ font-size: 17px; line-height: 1.2em; } -.view .post-content header h1 a{ +.view .post-content header > a{ color: #000; text-decoration: none; } @@ -806,6 +804,9 @@ ol.grouped-tableview-links li>a.disclosure.tappable-active:after{ display: -webkit-box; display: box; } +.view section.comments p.metadata.deleted{ + margin-bottom: 8px; +} .view section.comments p.metadata .user{ color: #b23914; } @@ -921,13 +922,13 @@ ol.grouped-tableview-links li>a.disclosure.tappable-active:after{ } #y-icon{ - background: transparent url(../../icons/touch-icon-114.png) no-repeat; + background: transparent url(../../icons/icon.svg) no-repeat; background-size: 57px 57px; width: 57px; height: 57px; float: left; border-radius: 9px; - box-shadow: 0 2px 2px rgba(0,0,0,.5); + box-shadow: 0 1px 1px rgba(0,0,0,.5); } #app-desc{ margin-left: 67px; @@ -1549,4 +1550,4 @@ ol.grouped-tableview-links li>a.disclosure.tappable-active:after{ #view-comments{ left: 321px; } -} \ No newline at end of file +} diff --git a/assets/css/hw-ios.min.css b/assets/css/hw-ios.min.css new file mode 100644 index 00000000..567db807 --- /dev/null +++ b/assets/css/hw-ios.min.css @@ -0,0 +1 @@ +html{height:100%}body{font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:16px;margin:0;padding:0;height:100%;background-color:#fff;overflow:hidden;position:relative;word-wrap:break-word;-webkit-text-size-adjust:none;visibility:visible}#apploader{position:fixed;top:0;z-index:100;width:100%;height:100%;background-color:#fff;pointer-events:none;opacity:1;-webkit-transition:opacity .6s;transition:opacity .6s}#apploader.hide{opacity:0}pre{word-wrap:normal}code,pre{font-family:Menlo,Monaco,Inconsolata,Consolas,"Lucida Console",monospace}i.icon-refresh{display:inline-block;width:14px;height:18px;background:transparent url(../images/ios/refresh-icon.png) no-repeat;background-size:14px 18px;vertical-align:text-bottom;overflow:hidden;text-indent:-999px}header.fake{pointer-events:none;position:fixed;top:0;left:0}.view{position:fixed;width:100%;height:100%;display:-webkit-box;display:box;-webkit-box-orient:vertical;box-orient:vertical;z-index:2}.view.hidden{position:fixed;top:-9999px;left:-9999px;pointer-events:none}.header-fake{z-index:1}.view>header,header.fake{background:#b2bbca url(../images/ios/nav-bar.png) repeat-x;background-size:1px 44px;height:44px;line-height:44px;width:100%;color:#fff;-webkit-user-select:none;-webkit-touch-callout:none}.ios5 .view>header,.ios5 header.fake{background-image:url(../images/ios/nav-bar-5.png)}.view>header.transparent{background:transparent none}.header-button{position:absolute;top:0;padding:7px 5px;-webkit-tap-highlight-color:transparent;line-height:1em}.header-button button{pointer-events:none;box-sizing:border-box;min-width:50px;height:30px;line-height:25px;font-weight:700;font-size:12px;text-align:center;color:#fff;background-color:transparent;text-shadow:0 -1px rgba(0,0,0,.6);padding:0 4px;margin:0;text-decoration:none;border-width:2px 5px;-webkit-border-image:url(../images/ios/button.png) 4 10 4 10;border-image:url(../images/ios/button.png) 4 10 4 10 fill}.ios5 .header-button button{-webkit-border-image:url(../images/ios/button-5.png) 4 10 4 10;border-image-source:url(../images/ios/button-5.png)}.header-button-icon button{min-width:0}.header-button-icon button img{vertical-align:text-bottom}.header-button.tappable-active button{-webkit-border-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAA8CAYAAABig0prAAAE8klEQVRYw7WYW4hVZRTHf9+3v3P22WfOmcuZmcYxU0wlRjLvmClFVhBEEsRQ9BCE0ZOCvRRF0ItS+CBqvfSQ1IsPhS+9BJFQoJFiF43wRYlCG++XuZ3L3t9aPex9pikVL7P9YLEPh73/+89a///61v4MN1mPLF+30QS8YtQsVHSJMaYIoKotg/lNjZ5Uz77jvxz66kbPm///sXTl+vXG8pELCsvCsERYiigUi1gbACDiiVstmo06zWaDxMe/qrDl2E8HD94UeOmqdZsLrrgr6qgEA7Pm0FPrp6PSSTEsEQQOAO8TWs0GE+OjXLl8gXNnT1OfGPdx0tp67Oihj68DXrZi/RthFH3SNzCbOXMX0Ns/SFQu41yBIHAYk96qqnifkCQx9clJLl0Y4fSfJ7l4foR6c/L140cPfQoQACxZsX5lKSrvnz1nXrBoaCmzBh+g3FHFuQLW2uvyZ63FuQJhKaJS7aKj2kncatGYrD9b6x/8+vzIXyMOoBQWd9R6+4vzFiym1juIcw7VlN2tliuE1HoH8QuFZqNevHRhZAfwVLBk+WNru3r6ts1f9DADs+eloHBHYawlLEUYDGNj1+ZXO3u+ceVyZWOls4ee3vsIggAR4W5WEDh6+gaodvVQnxjf6Irl8obuWh9hqXzXoO0Vlsp09/Rx9eqlZ1wYRnOjqIoxASI6I2BjAqJyJ2EpWuiKxbA/KBRSGc2QMaoErkixEHU5awuBoc12ZoxT1gYbOJwxFiyIzhwUQE0K7hRQr4iXfIC9ogpOVPCqeM0H2KsiKjiRlG1ejMULIopTUUQVL/nkWFRRUZyqICIzNscUsAiqghMF7wWfUyq8F0TBpW/Q3Bi3sZyK5s5YRXGiafHyMkgby4kKIh7vfU7F86mOVcFLDg2onQppO0+UduTDWNsGkdydp5LpOJWI5ie3qSaUc47T4kkqaJ+npdNeQe7F07alRXNsQhmWU+4BY9qMcyyeZDVzZI1Z85Jbql+cl3S/y01umXxdW9Sq+RkEpvUKn3uvQPPf81CcCumQnQ/uFJZTJOv6eRlEUQQnkkpEcpSbCDi9B3ueqt5Dg6QZyZExmqlC8zdINsam8pC85CakWxPKbX8s3q6OSRmrV5UgP+B0FnTGcFG8DIjo1If4TAdCMKPOGHvG+3hAxUN2JnH3+fWIj7HW/mE7K9EPcatO4mOmD4h3E4mPiVsNujqjg3bV8sXfqwg+bqVGmSrmHYYoPm4h4lmxdOg7o6qLhx4d3ltvypqwo0bgQrjTXKvikybNictEoT184scvX7WAHX7uiT0gcdKcQHzCnZ4riE9ImhOAxC8+/+RuoGFUdT5QG37tneEjP594OyiUcWEHQVC8NXNVvG+RNMfxcZ01K4e2f7H3g33AGaOqncD9QPfwpndfPnz0xGZjrC2UqlgXYqzFGDvt+EhTrYogSZO4MYaqyOrlD+3Z/9mHnwN/A1eMqgZAFZgN1Lbv3Ltq3/4DW0bHJh40NsAGBax1/7JXRSRBfIyKp1qJTr30wtO73n9r0yFgBLgCxCYTtgPKQH8W1a3v7d5w5Ojvj4+N1weuXhtbMD0D3V3VU5WO6Oza1UMHdm5781vgMnAOGAUSY4yYaa6xQBGoAL1Ad/a7mJ12maxcAsRAHbiagY4CDcAbY/SGJ4VZagoZYJhdC9OAPdACmtk1zgD/0x//AWRGyHKoS7EwAAAAAElFTkSuQmCC) 4 10 4 10;border-image-source:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAA8CAYAAABig0prAAAE8klEQVRYw7WYW4hVZRTHf9+3v3P22WfOmcuZmcYxU0wlRjLvmClFVhBEEsRQ9BCE0ZOCvRRF0ItS+CBqvfSQ1IsPhS+9BJFQoJFiF43wRYlCG++XuZ3L3t9aPex9pikVL7P9YLEPh73/+89a///61v4MN1mPLF+30QS8YtQsVHSJMaYIoKotg/lNjZ5Uz77jvxz66kbPm///sXTl+vXG8pELCsvCsERYiigUi1gbACDiiVstmo06zWaDxMe/qrDl2E8HD94UeOmqdZsLrrgr6qgEA7Pm0FPrp6PSSTEsEQQOAO8TWs0GE+OjXLl8gXNnT1OfGPdx0tp67Oihj68DXrZi/RthFH3SNzCbOXMX0Ns/SFQu41yBIHAYk96qqnifkCQx9clJLl0Y4fSfJ7l4foR6c/L140cPfQoQACxZsX5lKSrvnz1nXrBoaCmzBh+g3FHFuQLW2uvyZ63FuQJhKaJS7aKj2kncatGYrD9b6x/8+vzIXyMOoBQWd9R6+4vzFiym1juIcw7VlN2tliuE1HoH8QuFZqNevHRhZAfwVLBk+WNru3r6ts1f9DADs+eloHBHYawlLEUYDGNj1+ZXO3u+ceVyZWOls4ee3vsIggAR4W5WEDh6+gaodvVQnxjf6Irl8obuWh9hqXzXoO0Vlsp09/Rx9eqlZ1wYRnOjqIoxASI6I2BjAqJyJ2EpWuiKxbA/KBRSGc2QMaoErkixEHU5awuBoc12ZoxT1gYbOJwxFiyIzhwUQE0K7hRQr4iXfIC9ogpOVPCqeM0H2KsiKjiRlG1ejMULIopTUUQVL/nkWFRRUZyqICIzNscUsAiqghMF7wWfUyq8F0TBpW/Q3Bi3sZyK5s5YRXGiafHyMkgby4kKIh7vfU7F86mOVcFLDg2onQppO0+UduTDWNsGkdydp5LpOJWI5ie3qSaUc47T4kkqaJ+npdNeQe7F07alRXNsQhmWU+4BY9qMcyyeZDVzZI1Z85Jbql+cl3S/y01umXxdW9Sq+RkEpvUKn3uvQPPf81CcCumQnQ/uFJZTJOv6eRlEUQQnkkpEcpSbCDi9B3ueqt5Dg6QZyZExmqlC8zdINsam8pC85CakWxPKbX8s3q6OSRmrV5UgP+B0FnTGcFG8DIjo1If4TAdCMKPOGHvG+3hAxUN2JnH3+fWIj7HW/mE7K9EPcatO4mOmD4h3E4mPiVsNujqjg3bV8sXfqwg+bqVGmSrmHYYoPm4h4lmxdOg7o6qLhx4d3ltvypqwo0bgQrjTXKvikybNictEoT184scvX7WAHX7uiT0gcdKcQHzCnZ4riE9ImhOAxC8+/+RuoGFUdT5QG37tneEjP594OyiUcWEHQVC8NXNVvG+RNMfxcZ01K4e2f7H3g33AGaOqncD9QPfwpndfPnz0xGZjrC2UqlgXYqzFGDvt+EhTrYogSZO4MYaqyOrlD+3Z/9mHnwN/A1eMqgZAFZgN1Lbv3Ltq3/4DW0bHJh40NsAGBax1/7JXRSRBfIyKp1qJTr30wtO73n9r0yFgBLgCxCYTtgPKQH8W1a3v7d5w5Ojvj4+N1weuXhtbMD0D3V3VU5WO6Oza1UMHdm5781vgMnAOGAUSY4yYaa6xQBGoAL1Ad/a7mJ12maxcAsRAHbiagY4CDcAbY/SGJ4VZagoZYJhdC9OAPdACmtk1zgD/0x//AWRGyHKoS7EwAAAAAElFTkSuQmCC)}.ios5 .header-button.tappable-active button{-webkit-border-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAA8CAYAAABig0prAAAEgElEQVRYw+2YXYgVZRjHf+/MOzPnHPfDPev6saGpUbRrrqRpWmRhBHWnElg3IREEUXTjZUVSFChBRAYV1IUXYfR10bVa4FfQRYrbRWWk2Cbr7rrrOXvOmZn3ebqYWVvTPtgz3vnAw1wM83v//Od5n5n3MarK9WLVmo2PAjuA1cAKoJrfGgXOAt8DB4CDAKd/OH7V8+bv4MGhjeuMMe/5vt0QhCFhWCYIAjzfYgDnUpIkIW41SJIY59JvVPWF4ZPHT/0jeHBo007f+u+XSpVwQV8/XT0LqFQ6CcMI37fgebgkptVq0mjUuDQ+yvjFEZrN6YZL3VPDJ499dg141dCmnUEYfdzTu5DFt6ykWl1EqVzBtwG+52OMAWNQEZw4XJrQbNQZu/gHI+fPMDkxShLH20+fPPblFfDg0MbVYVQ+sWBhf3nZigHm9ywkCKMM9i+hqsRxk4nxC5w78yNjoyOTcdy8Z/jk8Z8tgA2it7q6e8tLbx1gfnUx1gaoZg/+VwQ2olrtR0VptVrdU5cuvg48YQaGNm3o7KqeWL5ykCVLb8PakLlEksT8fvYnfvt1mNrUxJ02CEvbKh3z6epZhPEsTnROYM+3dFUXURk9T7M5vc1GUXlLV3cvYVRGRIG5gQGiqExHZy/1qcktNohKy6JSBeN5iAjthPF8SuV5BFFpmbW21OfbkEystgVWBc8GWBv1WeP5Pvg4154NM+UHHsbzfQsGRdu2YQasagCDVRSniisILCooihVRxAnOFQN2ThAlAzspULEIIoJVgUy1FgQGFbBCtkKhilVmrCgO7ERQVayIIE6Le3kiOFGsSlYihdWxZGmFgq3QWR5nVhRTFeoU0RtghYjkVqhkdVzYls4VS75B5vrluFaxogoW/lqlADKimjchLc5jruoVypXaKwKc9WSwsw0vBpx5badqDRKvRtD0KIBM0qjRqDUpgnb9/4yb4Jvgm+Cb4P8RNv/Jz7NIsCmYm7NuqMeu3bPHrD4/Q3KeMeaiirR9Ysq4Cip4nhmzge+fR90iUIxp0xlV1DlsYM97nZ2Voy5popK2rVgkxbkWvfO7jnnr7x48rCq4NG7PDlUkZzz84PrDRlUH79jw+P5mrGvDeb34NpqTuy5tEdfH6KgEh4aPHnjWA7ytjz3wDkji4vocLFHEpaStGgZtPbn9kX1A0wOm9+x+8fTa1bfvc0mDtFVDJcnq3Jh/T0BcTNqcQtIW962/a8/Lu54ZBiY9YAyof7V/z6cb1g68m8Z14ukJ0riOuARVuY6dLgPGdeL6OOJasnnTmjc++fC1z3New6iqBTqBJUD1pTc/uP+Lr799rlafXmY8i+eHeJ4PM/MhVURSxMWoODo7Kr/s2Lrl7Vd2PX0EGAEmgHhmimWBCrAQ6JtuNLt27/1o85HvTj00PnF5ea0+3T9bcWdH5VxvT/eZe9cNHNr76vMHc5UXgMtACsjsuZsHREBHPhXsAeYBIeDPalUpkADTwCQwDkwBzaw9ZLvaXGdS5QNBDozytPnCBojzbOXXJAde9TL+BGXs5CYMrjqOAAAAAElFTkSuQmCC) 4 10 4 10;border-image-source:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAA8CAYAAABig0prAAAEgElEQVRYw+2YXYgVZRjHf+/MOzPnHPfDPev6saGpUbRrrqRpWmRhBHWnElg3IREEUXTjZUVSFChBRAYV1IUXYfR10bVa4FfQRYrbRWWk2Cbr7rrrOXvOmZn3ebqYWVvTPtgz3vnAw1wM83v//Od5n5n3MarK9WLVmo2PAjuA1cAKoJrfGgXOAt8DB4CDAKd/OH7V8+bv4MGhjeuMMe/5vt0QhCFhWCYIAjzfYgDnUpIkIW41SJIY59JvVPWF4ZPHT/0jeHBo007f+u+XSpVwQV8/XT0LqFQ6CcMI37fgebgkptVq0mjUuDQ+yvjFEZrN6YZL3VPDJ499dg141dCmnUEYfdzTu5DFt6ykWl1EqVzBtwG+52OMAWNQEZw4XJrQbNQZu/gHI+fPMDkxShLH20+fPPblFfDg0MbVYVQ+sWBhf3nZigHm9ywkCKMM9i+hqsRxk4nxC5w78yNjoyOTcdy8Z/jk8Z8tgA2it7q6e8tLbx1gfnUx1gaoZg/+VwQ2olrtR0VptVrdU5cuvg48YQaGNm3o7KqeWL5ykCVLb8PakLlEksT8fvYnfvt1mNrUxJ02CEvbKh3z6epZhPEsTnROYM+3dFUXURk9T7M5vc1GUXlLV3cvYVRGRIG5gQGiqExHZy/1qcktNohKy6JSBeN5iAjthPF8SuV5BFFpmbW21OfbkEystgVWBc8GWBv1WeP5Pvg4154NM+UHHsbzfQsGRdu2YQasagCDVRSniisILCooihVRxAnOFQN2ThAlAzspULEIIoJVgUy1FgQGFbBCtkKhilVmrCgO7ERQVayIIE6Le3kiOFGsSlYihdWxZGmFgq3QWR5nVhRTFeoU0RtghYjkVqhkdVzYls4VS75B5vrluFaxogoW/lqlADKimjchLc5jruoVypXaKwKc9WSwsw0vBpx5badqDRKvRtD0KIBM0qjRqDUpgnb9/4yb4Jvgm+Cb4P8RNv/Jz7NIsCmYm7NuqMeu3bPHrD4/Q3KeMeaiirR9Ysq4Cip4nhmzge+fR90iUIxp0xlV1DlsYM97nZ2Voy5popK2rVgkxbkWvfO7jnnr7x48rCq4NG7PDlUkZzz84PrDRlUH79jw+P5mrGvDeb34NpqTuy5tEdfH6KgEh4aPHnjWA7ytjz3wDkji4vocLFHEpaStGgZtPbn9kX1A0wOm9+x+8fTa1bfvc0mDtFVDJcnq3Jh/T0BcTNqcQtIW962/a8/Lu54ZBiY9YAyof7V/z6cb1g68m8Z14ukJ0riOuARVuY6dLgPGdeL6OOJasnnTmjc++fC1z3New6iqBTqBJUD1pTc/uP+Lr799rlafXmY8i+eHeJ4PM/MhVURSxMWoODo7Kr/s2Lrl7Vd2PX0EGAEmgHhmimWBCrAQ6JtuNLt27/1o85HvTj00PnF5ea0+3T9bcWdH5VxvT/eZe9cNHNr76vMHc5UXgMtACsjsuZsHREBHPhXsAeYBIeDPalUpkADTwCQwDkwBzaw9ZLvaXGdS5QNBDozytPnCBojzbOXXJAde9TL+BGXs5CYMrjqOAAAAAElFTkSuQmCC)}.header-back-button button{padding:0 4px 0 0;border-width:2px 4px 2px 13px;-webkit-border-image:url(../images/ios/back-button.png) 4 8 4 26;border-image:url(../images/ios/back-button.png) 4 8 4 26 fill}.ios5 .header-back-button button{-webkit-border-image:url(../images/ios/back-button-5.png) 4 8 4 26;border-image-source:url(../images/ios/back-button-5.png)}.header-back-button.tappable-active button{-webkit-border-image:url(data:image/png;base64,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) 4 8 4 26;border-image-source:url(data:image/png;base64,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)}.ios5 .header-back-button.tappable-active button{-webkit-border-image:url(data:image/png;base64,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) 4 8 4 26;border-image-source:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACoAAAA8CAYAAAAQTCjdAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA9CUAAITRAABtXwAA6GwAADyLAAAbWIPnB3gAAAewSURBVHjazZh7bBxXFcbPzL0zs/PY2Yd3/Vh7nbhO/Eoc7Ka2FRQkaBFNARWqVqQQVUBCWxUFVZSYtNQqKFA5TQpKUEulprRpUANV29C0EipIFRWqSlKp/zQilQICAnJIE8d29r0zOzOcO57tRt5YtrOP7JE+X3kt7/z23O+7Z2Y5qGENbBjbjMtW1CZUO6oVymsG9S/UKdTLpz88+RZcpWoC2j84tpnjuF8RQgapIIIkySDgyvME8HUoloOyrQKYpgmGkQXTMMCyCu87jvPdj06d/KBmoAhIALhJSum4rGgQCjeDHmwCWfWDJPqAUAocwn5Sts3AEDIPmUwSErPTMH3xHORyGcMqWPd/dOrE4aqD9q8fFTmefwm7d1ekpQOaW+IQCEZAkhWgVABS7Caq1FIHHJRlW2AVTMhlMzAz8zGcn/onzF66gB3Obzt96sRRwCLVAm1u7TzmU7Q7Olb1Qnx1L4SjbYC/u5D4AVxAB6BM+Lr7d0IFENEiiqqDLGtohzzk85kvhptafz99YeoiqU5oNk0i1I74qj5oj68FTQ8BIdRr2vLFiicURJ8CAlolnU4I6Nv4hf+d/V3FoH3rx3ZIPnVfR+daaIuvAUXTsUk829JrFvt/UfK5LU+nLvfqwcgrFYH2rBu9WfIpv420dpIYgqpaAAAYJFQsBsvzFJKJGTDy2SS5ZsiBkUHcnj8Gw80q23JNbyp2skqa928+l4VsJknotUCu7b+pC83/Nnox0N7ZA1og7Cbatm2oZrEPjjvGQhZdMWh330bCE+ElRQtGY/Fe0EMtmFoBLNuBahfrKl4LCJVWDorT5SFM+Ka2jh4INLUhJAXLsqEW5VoAOLwmD3RF3ezdOCCK8s+aonEIIiQ7I223k07tQB2OafmgXT03EiKIRxR/SAxFY0BFCawSZM1AbccGxF0+KE6PRyWftjHSshonTgDmc+P+qCkosxX2Y3mgq9YODwmi/GgwEgPMEFITsEoJr21HbZtpadDO7iGRUumIooXEQCgGhIhgW+521wkUV9SSoDwhj0myOtjU3AmS4od5W9p1BGVbv0RH491Do1SUH9bDMVD0si2vCyhej62Lg7Z3bRB5IhzxqUHiD7aWnZd1BEUx0MUP9klMeW840gGSrHk3C/UHdWzUYqCx1Rs2U9H3oB5uA1lrAgf44pbXv6POIh5tXbVeI1R8waeGiBrALceUW6WU17+jFgbqah7leTopSOqaQLgdBEmpfERWnvryrW/tXH8zFaSdLOWy2sSwK751q3yELuhoc8c6jafSC7IWAcXfDEBKt27XFRQZcCmB8oQcEH1qpxpqAyIp7qe47jXfzdJNSbRj3RYi+HZowRj4lCAAeHfr17uunPWR9v4wpvw55knZH8EwCa55G6KueH6ilIoHMeXtSqAFbVna8sYBBReWSrJfzBYESKRNyFgJ94GqgUjBzKYgm8oB/4fXD+9T/frfC0Ya7ILh/rERix/o7S6M77xnnOcgVcgn2deAjQmKSjyw/c7/3vq50QkLO2qZWXbz0ZCgl1DpZw888u6arvZDZi7ZkLA8g0RdROXePLr/UFBXTxqZOfRrjsWtcUA5jrNwTbLO+jXF+PmenROiSM8b2ctgWY0TLh4FCGviMoeavfWWTZe+uXXLOHbTLORT4Nh244B6lUfNoJI//uF3To8M9e61zFzRr40Dil11cMmgplHZY0f2Hm+Jht5kFkBgBtsYoB4so0l6sMbLz+3Zq8rSGTPLwpW/ruEqm5deuC6jZtbcEM/sfnDbLsJzCTOXANs2GwfUgzVYsBjw9m23T932+bEJx7ZwwmaYBRoH1KtscRg88+Tu97pXx35dyKeL4WocUC9cqQXD4D0jU/QrYHG11tKgpXCVhsFTTzw0IUnCOSOHJ4GNsJyDgjpoCdCFw+CzmzfOffvrt+3iwM6jDeo6DHhYXuU9vyYnfrD9zMhQ337mVcusfbiclYB6fs16fs28dnjyeDwWfQ2HQU3D5cw/h7DrJ5YDWvJrKVz5P716cH8kpP/lk2EA7htWV6yftgUCJeeXB1o+DC5iuHKHDjz8E1kS/2FmZ2syuRyEtPB9dV19vwx0meGaRc2MDA/MjX/vG7vZY4yJNrAts5r7jpCGa6vR4XXv8HBtZXjhunzvPV85++UvfHrCcdjkSrldqLwQ0soDe4bTVN/J55/e82EZ6ArDNY1KPfXErr8ODnQ9w0ZswWDHVqHiLWfHH4Bt3v3VW37BBg5XYSp5XAKoGErf8rXv33f6zNlvEUEGKqlAiMQ+1cq+wrEMMPMp9zS56VM9+469uPdFAJjiqnCEUA+2ja133/vY1hMf/O0BvCalkg5EkIDjiffFBrfIe9isi24g2cMlgG2PDPf98tXnH2eQ51CzFYCWweqoVlT40G/eGDj47Cu7E8n0DQyQpyLCCswyV+8ig7QM1zKaqvznji995sDjP7r/HQA47z11mJWBlsMqqAgqivI/+fTR4eNvvXt7IpFum0ukulyrlBfCyVOhoP7vsRv73/7pI/f9WVV87Kz+GJVAFdgZXg5auWdFlIoKo0KMw3uNojimBdPRYjCoTPGG3VtzKMsLbsk0NQAWPEDJE0WRBaCOB2qg8p5MD9CGK+r/Iw86fAO/JQ8AAAAASUVORK5CYII=)}.header-button-left{left:0}.header-button-right{right:0}.view>header h1{padding:0;text-align:center;font-size:20px;text-shadow:0 -1px rgba(0,0,0,.4);margin:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;-webkit-box-flex:1;box-flex:1}.view>header h1 img{vertical-align:-15%;border:1px solid #fff}.view>.scroll{-webkit-box-flex:1;box-flex:1;overflow:auto;-webkit-overflow-scrolling:touch;background-color:#fff;display:-webkit-box;display:box;-webkit-box-orient:vertical;box-orient:vertical;height:100%;position:relative}.view>.scroll.striped{background-color:#d7dce5;background-image:-webkit-linear-gradient(left,#d3d8e2,#d3d8e2 12.49%,#d7dce5 12.5%,#d7dce5 81.24%,#d3d8e2 81.25%,#d3d8e2);background-image:linear-gradient(left,#d3d8e2,#d3d8e2 12.49%,#d7dce5 12.5%,#d7dce5 81.24%,#d3d8e2 81.25%,#d3d8e2);background-size:8px 1px}.ios5 .view>.scroll.striped{background-color:#cbd2d8;background-image:-webkit-linear-gradient(left,#c5ccd4,#c5ccd4 71.4%,#cbd2d8 71.5%,#cbd2d8);background-image:linear-gradient(left,#c5ccd4,#c5ccd4 71.4%,#cbd2d8 71.5%,#cbd2d8);background-size:7px 1px}.view>.scroll.striped p.foot-label{margin:11px 10px 10px;font-size:14px;color:#4c566c;text-shadow:0 1px #fff;text-align:center}body:not(.ios5) .view>.scroll:before{content:'';display:block;overflow:hidden;position:absolute;top:0;width:100%;height:3px;z-index:1;background-image:-webkit-linear-gradient(top,rgba(0,0,0,.205),rgba(0,0,0,0));background-image:linear-gradient(top,rgba(0,0,0,.205),rgba(0,0,0,0));background-size:1px 3px}.view>.scroll>section{-webkit-box-flex:1;box-flex:1;-webkit-overflow-scrolling:touch;overflow:auto}.view>.scroll .loader{-webkit-user-select:none;pointer-events:none;margin:0 0 0 -50px;position:absolute;top:45%;left:50%;height:20px;font-size:16px;color:#666;line-height:20px;padding-left:26px;color:#666;text-shadow:0 1px #fff;background:transparent url(../images/ios/activity-indicator.png) no-repeat;background-size:20px auto;-webkit-animation:loading-sprite 1s step-start infinite;animation:loading-sprite 1s step-start infinite}.view>.scroll .comments .loader{display:table;position:static;margin:50px auto 0}.view>.scroll.striped .loader{color:#2f343c}@-webkit-keyframes loading-sprite{0%{background-position:0 0}8.33%{background-position:0 -20px}16.67%{background-position:0 -40px}25%{background-position:0 -60px}33.33%{background-position:0 -80px}41.67%{background-position:0 -100px}50%{background-position:0 -120px}58.33%{background-position:0 -140px}66.67%{background-position:0 -160px}75%{background-position:0 -180px}83.33%{background-position:0 -200px}91.67%{background-position:0 -220px}100%{background-position:0 0}}@keyframes loading-sprite{0%{background-position:0 0}8.33%{background-position:0 -20px}16.67%{background-position:0 -40px}25%{background-position:0 -60px}33.33%{background-position:0 -80px}41.67%{background-position:0 -100px}50%{background-position:0 -120px}58.33%{background-position:0 -140px}66.67%{background-position:0 -160px}75%{background-position:0 -180px}83.33%{background-position:0 -200px}91.67%{background-position:0 -220px}100%{background-position:0 0}}.view>.scroll .load-error{-webkit-user-select:none;position:absolute;top:45%;text-align:center;width:100%;font-size:16px;color:#666;line-height:20px;text-shadow:0 1px #fff}.view>.scroll .comments .load-error{position:static;margin:50px 0 0}.view>.scroll .load-error button{font-size:14px;height:30px;line-height:30px;cursor:pointer;padding:0 20px;font-weight:700;color:grey;border-radius:6px;text-shadow:0 1px #fff;-webkit-tap-highlight-color:transparent;margin:6px auto 4px;background-color:#dedede;border:1px solid #d9d9d9;background-image:-webkit-linear-gradient(top,#fdfdfd,#dedede);background-image:linear-gradient(top,#fdfdfd,#dedede);background-size:10px 100%;-webkit-user-select:none}.view>.scroll .load-error button.tappable-active{color:#444;background-color:#c8c8c8;border-color:#c8c8c8;background-image:-webkit-linear-gradient(top,#f0f0f0,#c8c8c8);background-image:linear-gradient(top,#f0f0f0,#c8c8c8)}.view-blank-state{-webkit-box-flex:1;box-flex:1;background-color:#fcfcfc;background-image:-webkit-linear-gradient(top,#fcfcfc,#dadce0);background-image:linear-gradient(top,#fcfcfc,#dadce0);background-size:1px 100%}.view-blank-state-text{color:#666;text-shadow:0 1px #fff;height:20px;line-height:20px;position:absolute;top:45%;width:100%;text-align:center;pointer-events:none}.tableview{margin:0;padding:0;list-style:none;background-color:#fff}.tableview:before{content:'';height:0;overflow:hidden;display:block;border-top:1px solid #e0e0e0;margin-top:-1px;-webkit-transform:translate3d(0,0,0)}.tableview li{display:block;border-bottom:1px solid #e0e0e0;padding:10px}.tableview-links li{padding:0;display:-webkit-box;display:box;width:100%}.tableview-links li>a{font-size:15px;line-height:1.3em;color:#000;display:block;padding:5px;text-decoration:none;-webkit-tap-highlight-color:transparent;display:-webkit-box;display:box;width:100%;-webkit-box-flex:1;box-flex:1;box-sizing:border-box;background-image:-webkit-linear-gradient(top,#4286f5,#194fdb);background-image:linear-gradient(top,#4286f5,#194fdb);background-position:-10px 0;background-repeat:no-repeat;background-size:10px 100%}.tableview-links li>a:visited{color:#666}.tableview-links li>a *{pointer-events:none}.tableview-links li>a .number{text-align:right;width:3ex;padding-right:5px;color:#666d74}.tableview-links li>a .number:after{content:'.'}.tableview-links li>a .story{-webkit-box-flex:1;box-flex:1}.tableview-links li>a .metadata{display:block;font-size:13px;color:#666d74;line-height:1.2em}.tableview-links li>a.detail-disclosure{padding-right:44px}.tableview-links li>a.disclosure:after{content:'';display:-webkit-box;display:box;pointer-events:none;background:transparent url(../images/ios/disclosure-indicator.png) no-repeat left center;background-size:10px 13px;width:10px;margin:0 10px}.tableview-links li>a.disclosure.tappable-active:after{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAaCAYAAAC3g3x9AAAAeUlEQVRIx+3VOwqAMBBF0UFBcOWCIFgFsgZBsHJ510bQws+oL0XAu4BDkkmI2UFAAwRTBLRsBSX2DQU6zgtPsRqYue5HE6BAqUYHoMoCHZOhhekqlaubXFuWnp90wk4sui62F1MOIHdsh/Yy7OZficqfL0oe5Yq+whZB/z2/Tbi0zwAAAABJRU5ErkJggg==)}.tableview-links li>a.more-link{cursor:pointer;-webkit-touch-callout:none;line-height:3em;padding:10px;display:block;color:#2960d9;text-align:center;font-weight:700}.tableview-links li>a.more-link.loading{position:relative;pointer-events:none}.view>.scroll .tableview-links li>a.more-link .loader{display:none;position:absolute;top:50%;left:auto;right:20px;margin:-10px 0 0;padding-left:0;width:20px;height:20px}.view>.scroll .tableview-links li>a.more-link.loading .loader{display:block}.tableview-links li>a.selected,.tableview-links li>a.tappable-active{color:#fff;background-color:#4286f5;background-repeat:repeat-x}.tableview-links li>a.selected *,.tableview-links li>a.tappable-active *{color:#fff}.tableview-links.list-tapped li>a.selected:not(.tappable-active){color:#000;background-color:transparent;background-repeat:no-repeat}.tableview-links.list-tapped li>a.selected:not(.tappable-active) *{color:#000}.tableview-links li>a.detail-disclosure-button{-webkit-touch-callout:none;padding:0;width:44px;margin:0 0 0 -44px;-webkit-box-align:center;box-align:center;-webkit-box-pack:center;box-pack:center;-webkit-box-flex:0;box-flex:0}.tableview-links li>a.detail-disclosure-button.tappable-active{background:transparent none}.tableview-links li>a.detail-disclosure-button span{display:inline-block;width:29px;height:31px;background:transparent url(../images/ios/detail-disclosure-button.png);background-size:29px 31px}.tableview-links li>a.detail-disclosure-button.tappable-active span{background-image:url(data:image/png;base64,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)}#view-about,#view-home{-webkit-user-select:none}#view-home .tableview-links li>a{min-height:70px}#view-home .tableview-links li>a[href^="#/item"]{-webkit-touch-callout:none}.grouped-tableview{margin:10px 9px 11px;border:1px solid #a1a7ae;border-radius:8px;padding:10px;background-color:#f7f7f7;box-shadow:inset 0 1px rgba(0,0,0,.08),0 1px rgba(255,255,255,.81);font-size:13px}.grouped-tableview+.grouped-tableview{margin-top:0}.grouped-tableview p{margin:0 0 1em}.grouped-tableview p:last-child{margin:0}.grouped-tableview ol,.grouped-tableview ul{margin:0 0 0 2em;padding:0;line-height:1.5em}ol.grouped-tableview,ul.grouped-tableview{display:block;list-style:none;padding:0}ol.grouped-tableview li,ul.grouped-tableview li{display:block;box-shadow:inset 0 1px #fdfdfd;border-bottom:1px solid #cacaca;padding:10px}ol.grouped-tableview li:first-child,ul.grouped-tableview li:first-child{box-shadow:none}ol.grouped-tableview li:last-child,ul.grouped-tableview li:last-child{border-bottom:0}ol.grouped-tableview-links li,ul.grouped-tableview-links li{padding:0;display:-webkit-box;display:box;width:100%}ol.grouped-tableview-links li>a,ul.grouped-tableview-links li>a{color:#000;font-size:16px;font-weight:700;display:block;padding:10px;text-decoration:none;-webkit-tap-highlight-color:transparent;display:-webkit-box;display:box;width:100%;-webkit-box-flex:1;box-flex:1;box-sizing:border-box;background-image:-webkit-linear-gradient(top,#4286f5,#194fdb);background-image:linear-gradient(top,#4286f5,#194fdb);background-position:-1px 0;background-repeat:no-repeat;background-size:1px 100%;white-space:nowrap;text-overflow:ellipsis}ol.grouped-tableview li:first-child>a,ul.grouped-tableview li:first-child>a{border-top-left-radius:8px;border-top-right-radius:8px}ol.grouped-tableview li:last-child>a,ul.grouped-tableview li:last-child>a{border-bottom-left-radius:8px;border-bottom-right-radius:8px}ol.grouped-tableview-links li>a.disclosure,ul.grouped-tableview-links li>a.disclosure{-webkit-box-align:center;box-align:center}ol.grouped-tableview-links li>a.disclosure:after,ul.grouped-tableview-links li>a.disclosure:after{content:'';display:-webkit-box;display:box;-webkit-box-flex:1;box-flex:1;height:13px;background:transparent url(../images/ios/disclosure-indicator.png) no-repeat right center;background-size:10px 13px}ol.grouped-tableview-links li>a *,ul.grouped-tableview-links li>a *{pointer-events:none}ol.grouped-tableview-links li>a.tappable-active,ul.grouped-tableview-links li>a.tappable-active{box-shadow:none;color:#fff;background-color:#4286f5;background-repeat:repeat-x}ol.grouped-tableview-links li>a.tappable-active *,ul.grouped-tableview-links li>a.tappable-active *{color:#fff}ol.grouped-tableview-links li>a.disclosure.tappable-active:after,ul.grouped-tableview-links li>a.disclosure.tappable-active:after{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAaCAYAAAC3g3x9AAAAeUlEQVRIx+3VOwqAMBBF0UFBcOWCIFgFsgZBsHJ510bQws+oL0XAu4BDkkmI2UFAAwRTBLRsBSX2DQU6zgtPsRqYue5HE6BAqUYHoMoCHZOhhekqlaubXFuWnp90wk4sui62F1MOIHdsh/Yy7OZficqfL0oe5Yq+whZB/z2/Tbi0zwAAAABJRU5ErkJggg==)}.view .post-content{padding-bottom:1px;background-color:#d7dce5;background-image:-webkit-linear-gradient(top,rgba(0,0,0,0),rgba(0,0,0,.12)),-webkit-linear-gradient(left,#d3d8e2,#d3d8e2 12.49%,#d7dce5 12.5%,#d7dce5 81.24%,#d3d8e2 81.25%,#d3d8e2);background-image:linear-gradient(top,rgba(0,0,0,0),rgba(0,0,0,.12)),linear-gradient(left,#d3d8e2,#d3d8e2 12.49%,#d7dce5 12.5%,#d7dce5 81.24%,#d3d8e2 81.25%,#d3d8e2);background-size:1px 11px,8px 100px;border-bottom:1px solid #9297a2;background-repeat:repeat-x,repeat;background-position:bottom,top left;-webkit-transform:translate3d(0,0,0);min-height:5em}.ios5 .view .post-content{background-color:#cbd2d8;background-image:-webkit-linear-gradient(top,rgba(0,0,0,0),rgba(0,0,0,.12)),-webkit-linear-gradient(left,#c5ccd4,#c5ccd4 71.4%,#cbd2d8 71.5%,#cbd2d8);background-image:linear-gradient(top,rgba(0,0,0,0),rgba(0,0,0,.12)),linear-gradient(left,#c5ccd4,#c5ccd4 71.4%,#cbd2d8 71.5%,#cbd2d8);background-size:1px 11px,7px 100px}.view .post-content:before{content:'';position:absolute;width:100%;height:300px;background-color:#d7dce5;background-image:-webkit-linear-gradient(left,#d3d8e2,#d3d8e2 12.49%,#d7dce5 12.5%,#d7dce5 81.24%,#d3d8e2 81.25%,#d3d8e2);background-image:linear-gradient(left,#d3d8e2,#d3d8e2 12.49%,#d7dce5 12.5%,#d7dce5 81.24%,#d3d8e2 81.25%,#d3d8e2);background-size:8px 1px;-webkit-transform:translate3d(0,-300px,0);transform:translate3d(0,-300px,0)}.ios5 .view .post-content:before{background-color:#cbd2d8;background-image:-webkit-linear-gradient(left,#c5ccd4,#c5ccd4 71.4%,#cbd2d8 71.5%,#cbd2d8);background-image:linear-gradient(left,#c5ccd4,#c5ccd4 71.4%,#cbd2d8 71.5%,#cbd2d8);background-size:7px 1px}.view .post-content header{padding:10px 15px;text-shadow:0 1px rgba(255,255,255,.85);-webkit-user-select:none}.view .post-content header h1,.view .post-content header p{margin:0;padding:0}.view .post-content header a{display:block}.view .post-content header a .link-text{font-size:13px}.view .post-content header .metadata{font-size:13px;color:#666d74}.view .post-content header .metadata a.external-link{color:#666d74;text-decoration:none;display:block;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;padding-left:16px;background:transparent url(../images/external-arrow.png) no-repeat 0 50%;background-size:12px 10px}.view .post-content header h1{font-size:17px;line-height:1.2em}.view .post-content header>a{color:#000;text-decoration:none}.view .post-content header+.grouped-tableview{margin-top:0}.view .post-content .poll{margin:0;list-style:none}.view .post-content .poll li{margin-bottom:9px}.view .post-content .poll li .poll-details{display:table;width:100%}.view .post-content .poll li .poll-details b{display:table-cell;color:#333}.view .post-content .poll li .poll-details .points{display:table-cell;white-space:nowrap;color:#888;text-align:right;vertical-align:bottom}.view .post-content .poll li .poll-bar{background-color:#fff;width:100%;height:9px;border-radius:5px;overflow:hidden;box-shadow:inset 0 0 2px grey,0 1px #fff;background-image:-webkit-linear-gradient(top,#ddd,#fff);background-image:linear-gradient(top,#ddd,#fff);background-repeat:repeat-x;background-size:10px 9px}.view .post-content .poll li .poll-bar span{display:block;width:0;height:9px;border-top-left-radius:5px;border-bottom-left-radius:5px;box-shadow:inset 0 0 2px #0b3a88;background-image:-webkit-linear-gradient(top,#2f64b7,#77adf6);background-image:linear-gradient(top,#2f64b7,#77adf6);background-repeat:repeat-x;background-size:10px 9px}.view .post-content pre,.view section.comments pre{margin:0 0 8px;overflow:auto;padding:.65em 0;background-color:#eee;border-radius:3px;box-shadow:inset 0 1px 1px #ddd}.view section.comments{min-height:100%;font-size:13px;overflow:hidden}.view section.comments ul{margin:0 auto;padding:0;list-style:none;max-width:88ex}.view section.comments ul li{padding:15px;border-bottom:1px solid #ddd}.view section.comments ul>li:last-child{border-bottom:0}.view section.comments ul ul li{padding:0 0 0 15px;border:0;background:transparent url(../images/comment-arrow.png) no-repeat 0 4px;background-size:10px 9px;color:#333}.view section.comments p{margin:8px 0}.view section.comments p.metadata{color:#666d74;padding:0;margin:0;display:-webkit-box;display:box}.view section.comments p.metadata.deleted{margin-bottom:8px}.view section.comments p.metadata .user{color:#b23914}.view section.comments p.metadata .user.op:after{content:'OP';display:inline-block;font-size:70%;color:#fff;background-color:#c16143;padding:3px 4px;line-height:1;margin-left:5px;border-radius:2px}.view section.comments p.metadata time{display:block;text-align:right;-webkit-box-flex:1;box-flex:1;font-weight:700;color:#888}.view section.comments p.metadata time a{color:#888;text-decoration:none}.view section.comments p.no-comments{text-align:center;margin:50px 0;font-size:16px;color:#666}.view section.comments button.comments-toggle{display:block;width:100%;max-width:300px;height:27px;line-height:27px;cursor:pointer;padding:0 10px;font-weight:700;color:grey;border-radius:6px;text-shadow:0 1px #fff;-webkit-tap-highlight-color:transparent;margin:2px auto 4px;background-color:#dedede;border:1px solid #d9d9d9;background-image:-webkit-linear-gradient(top,#fdfdfd,#dedede);background-image:linear-gradient(top,#fdfdfd,#dedede);background-size:10px 100%;-webkit-user-select:none}.view section.comments button.comments-toggle.tappable-active{color:#444;background-color:#c8c8c8;border-color:#c8c8c8;background-image:-webkit-linear-gradient(top,#f0f0f0,#c8c8c8);background-image:linear-gradient(top,#f0f0f0,#c8c8c8)}.view section.comments li.more-link-container{padding:0}.view section.comments li>a.more-link{font-size:15px;text-decoration:none;-webkit-tap-highlight-color:transparent;display:-webkit-box;display:box;width:100%;-webkit-box-flex:1;box-flex:1;box-sizing:border-box;background-image:-webkit-linear-gradient(top,#4286f5,#194fdb);background-image:linear-gradient(top,#4286f5,#194fdb);background-position:-10px 0;background-repeat:no-repeat;background-size:10px 100%;cursor:pointer;-webkit-touch-callout:none;line-height:3em;padding:10px;display:block;color:#2960d9;text-align:center;font-weight:700}.view section.comments li>a.more-link.tappable-active{color:#fff;background-color:#4286f5;background-repeat:repeat-x}.view section.comments li>a.more-link.tappable-active *{color:#fff}.link-text{color:#385487;font-weight:700}.inline-block{display:inline-block}.cf:after,.cf:before{content:"";display:table}.cf:after{clear:both}#y-icon{background:transparent url(../../icons/icon.svg) no-repeat;background-size:57px 57px;width:57px;height:57px;float:left;border-radius:9px;box-shadow:0 1px 1px rgba(0,0,0,.5)}#app-desc{margin-left:67px;line-height:1.3em}#app-desc strong{font-size:16px;line-height:1.3}.view,.view>.scroll,.view>header .header-button,.view>header h1{-webkit-animation-timing-function:ease-in-out;-webkit-animation-duration:350ms;animation-timing-function:ease-in-out;animation-duration:350ms}.slow-anim .view,.slow-anim .view>.scroll,.slow-anim .view>header .header-button,.slow-anim .view>header h1{-webkit-animation-duration:3.5s;animation-duration:3.5s}.sliding{pointer-events:none}.slide-in-from-right>.scroll{-webkit-animation-name:slideinfromright;animation-name:slideinfromright}.slide-in-from-right>header h1{-webkit-animation-name:slidefadeinfromright;animation-name:slidefadeinfromright}.slide-in-from-right>header .header-button{-webkit-animation-name:fadein;animation-name:fadein}.slide-in-from-right>header .header-back-button{-webkit-animation-name:backinfromcenter;animation-name:backinfromcenter}.slide-in-from-left>.scroll{-webkit-animation-name:slideinfromleft;animation-name:slideinfromleft}.slide-in-from-left>header h1{-webkit-animation-name:slidefadeinfromleft;animation-name:slidefadeinfromleft}.slide-in-from-left>header .header-button{-webkit-animation-name:fadein;animation-name:fadein}.slide-in-from-left>header .header-back-button{-webkit-animation-name:backinfromleft;animation-name:backinfromleft}.slide-in-from-bottom{-webkit-animation-name:slideinfrombottom;animation-name:slideinfrombottom}.slide-out-to-right>.scroll{-webkit-animation-name:slideouttoright;animation-name:slideouttoright}.slide-out-to-right>header h1{-webkit-animation-name:slidefadeouttoright;animation-name:slidefadeouttoright}.slide-out-to-right>header .header-button{-webkit-animation-name:fadeout;animation-name:fadeout}.slide-out-to-right>header .header-back-button{-webkit-animation-name:backouttocenter;animation-name:backouttocenter}.slide-out-to-left>.scroll{-webkit-animation-name:slideouttoleft;animation-name:slideouttoleft}.slide-out-to-left>header h1{-webkit-animation-name:slidefadeouttoleft;animation-name:slidefadeouttoleft}.slide-out-to-left>header .header-button{-webkit-animation-name:fadeout;animation-name:fadeout}.slide-out-to-left>header .header-back-button{-webkit-animation-name:backouttoleft;animation-name:backouttoleft}.slide-out-to-bottom{-webkit-animation-name:slideouttobottom;animation-name:slideouttobottom}@-webkit-keyframes slideinfromright{from{-webkit-transform:translateX(100%)}to{-webkit-transform:translateX(0)}}@-webkit-keyframes slideinfromleft{from{-webkit-transform:translateX(-100%)}to{-webkit-transform:translateX(0)}}@-webkit-keyframes slideinfrombottom{from{-webkit-transform:translateY(100%)}to{-webkit-transform:translateY(0)}}@-webkit-keyframes slideouttoleft{from{-webkit-transform:translateX(0)}to{-webkit-transform:translateX(-100%)}}@-webkit-keyframes slideouttoright{from{-webkit-transform:translateX(0)}to{-webkit-transform:translateX(100%)}}@-webkit-keyframes slideouttobottom{from{-webkit-transform:translateY(0)}to{-webkit-transform:translateY(100%)}}@-webkit-keyframes slidefadeinfromright{from{-webkit-transform:translateX(60%);opacity:0}to{-webkit-transform:translateX(0);opacity:1}}@-webkit-keyframes slidefadeinfromleft{from{-webkit-transform:translateX(-60%);opacity:0}to{-webkit-transform:translateX(0);opacity:1}}@-webkit-keyframes slidefadeouttoleft{from{-webkit-transform:translateX(0);opacity:1}to{-webkit-transform:translateX(-60%);opacity:0}}@-webkit-keyframes slidefadeouttoright{from{-webkit-transform:translateX(0);opacity:1}to{-webkit-transform:translateX(60%);opacity:0}}@-webkit-keyframes fadein{from{opacity:0}to{opacity:1}}@-webkit-keyframes fadeout{from{opacity:1}to{opacity:0}}@-webkit-keyframes backinfromcenter{from{-webkit-transform:translateX(200%);opacity:0}to{left:0;-webkit-transform:translateX(0);opacity:1}}@-webkit-keyframes backinfromleft{from{-webkit-transform:translateX(-100%);opacity:0}to{-webkit-transform:translateX(0);opacity:1}}@-webkit-keyframes backouttocenter{from{-webkit-transform:translateX(0);opacity:1}to{-webkit-transform:translateX(200%);opacity:0}}@-webkit-keyframes backouttoleft{from{-webkit-transform:translateX(0);opacity:1}to{-webkit-transform:translateX(-100%);opacity:0}}.viewport-flip{-webkit-perspective:1000;perspective:1000;background-color:#000}.viewport-flip header.fake{visibility:hidden}.flip{background-color:#fff;-webkit-animation-timing-function:ease-in-out;-webkit-animation-duration:.7s;-webkit-backface-visibility:hidden;animation-timing-function:ease-in-out;animation-duration:.7s;backface-visibility:hidden;border:1px solid #000;margin:-1px;pointer-events:none}.slow-anim .flip{-webkit-animation-duration:7s;animation-duration:7s}.flip-out-to-left{-webkit-animation-name:flipouttoleft;animation-name:flipouttoleft}.flip-out-to-right{-webkit-animation-name:flipouttoright;animation-name:flipouttoright}.flip-in-from-left{-webkit-animation-name:flipinfromleft;animation-name:flipinfromleft}.flip-in-from-right{-webkit-animation-name:flipinfromright;animation-name:flipinfromright}@-webkit-keyframes flipinfromright{from{-webkit-transform:rotateY(-180deg) scale(.65);opacity:0}50%{opacity:.4}to{-webkit-transform:rotateY(0) scale(1);opacity:1}}@-webkit-keyframes flipinfromleft{from{-webkit-transform:rotateY(180deg) scale(.65);opacity:0}50%{opacity:.4}to{-webkit-transform:rotateY(0) scale(1);opacity:1}}@-webkit-keyframes flipouttoleft{from{-webkit-transform:rotateY(0) scale(1);opacity:1}50%{opacity:.4}to{-webkit-transform:rotateY(-180deg) scale(.65);opacity:0}}@-webkit-keyframes flipouttoright{from{-webkit-transform:rotateY(0) scale(1);opacity:1}50%{opacity:.4}to{-webkit-transform:rotateY(180deg) scale(.65);opacity:0}}@media only screen and (max-height:300px){.view>header,header.fake{background-image:url(../images/ios/nav-bar-mini.png);background-size:1px 32px;height:32px;line-height:32px}.ios5 .view>header,.ios5 header.fake{background-image:url(../images/ios/nav-bar-mini-5.png)}.view>header h1{font-size:16px}.header-button{padding:4px}.header-button button{height:24px;line-height:18px;border-width:2px 4px}.header-back-button button{border-width:2px 4px 2px 10px}.header-button-icon button{line-height:14px}.header-button-icon button img{width:auto;height:14px;margin-bottom:2px}.header-button-icon button i{-webkit-transform:scale(.77);transform:scale(.77);margin-bottom:2px}}@media only screen and (min-width:640px){html{overflow:hidden}body:after{content:'wide';display:none}body{background-image:-webkit-linear-gradient(top,#000,#000);background-image:linear-gradient(top,#000,#000);background-size:10px 10px;background-position:bottom;background-repeat:repeat-x;overflow:hidden}#apploader{display:none}#overlay{position:absolute;top:0;z-index:100;width:100%;height:100%;background-color:rgba(8,11,18,.5);opacity:1;-webkit-transition:opacity 350ms ease-in-out;transition:opacity 350ms ease-in-out}#overlay.hide{opacity:0;pointer-events:none;visibility:hidden}header.fake{display:none}.view,.view.hidden{position:absolute}.view>header{color:#656c73;background-color:#d2d4db;background-image:url(../images/ios/silver-nav-bar.png)}.view>header h1{text-shadow:0 1px rgba(255,255,255,.75)}.header-button button{-webkit-border-image:url(../images/ios/silver-button.png) 4 10 4 10;border-image-source:url(../images/ios/silver-button.png)}.header-button.tappable-active button{-webkit-border-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAA8CAYAAAB4v6rlAAAFAUlEQVR4nN2Y32sUVxTHP3f27swk2STubqw/1l9p/EXTqqUS9aHQ1yL0oQhapaXQ/0Cw7UMfC4It9aVUBCvYQm1BEHztS/FFDUJ/aB+ERsVqm2giZrNxd2fmntOH2fVXEkHN5KFfuOywDPc7557v+XGPYXbkhoZ2vIOnu4yyAWO2ALk53nWo/qaGK4g5NTx87gzgnnzJPPnH1q1bN1ib/y7v+0O+H9DREeL7AZ7nzcoiIkRRk3q9QRQ1iaNoOEniDy5evHhlTqKhoe37bd5+XigUOpZXKvT1LabQ3U0YhticnZUocQmNRoPa1BTj43f459YtarVaPYmTz4aHz381g2jbth2Hwo7wwJIlS1nT38+Spcvo6uoiby05azFmhvEAqCouSYiThOnpacZG/+X6tWuMjY3SqDe+uHDh3McPiLZv3767o7PrxzUvDzAwMEC5VCYIwzk3nwuqSrPRYOLuBCMjI1y/OkL9/vSe8+fP/2QGBwf9xS8tubpy5arK4KuvUS734XneM5M8SiYiTEyM8+flS9y4ceOv8Ttjg7anWNzVu2hRZXV/P8VSEeMZFEVVn4sIwHiGYqnI6jVrqFYn10ZJtMt2hZ07y6Uy5VIZz+RQeX6CR+GZHOVyH6VyH1PVqZ22o7Pjjd5FRWzex4nMC0kbeT+gWCwxfvv2DhsE4dKwI8TzDCIz4uyFYAyEYUgQhhWb9/1ea/OIKM/p/6fC2jx+EPi2rTDVFxPAnDDgeR7WGIOKIPPsnzbaH29VFFWyIxJFRbGighOHc/MrhDacOEQF247krCwSEVQV60QRpziXEZFTnCgWVUQF0YyIVEAVmx6bQzLykYhDRFIxiOi8p5+HRLrAYlDXIspKDCKoU6xoemxZHZ0TQVSxog51kpkY1AmiDqsKoopkkVBJ91YFK5K9j0QUq604cvNc9B4SOVQEq604yk7eiqqkqkuDNrsUJKpti7IOWMGqpMUp28JHOwWlKwukPtL/o49ENNsuqB2woEgrDWWB1PXaUp0KmllfJ23VLZSPdAF8lKpOs+u74cHeVhdADJqKIfuA1bSBJPOjQ1u5jlbHnwnauW6BxZBt752KgbRLyc6ituo0renZEbVaYgNVEe1Jb+Xzey1vF1UValaNGXPO9YjInDO554WI4JzD88yoDXz/UhxH68S5ebdInCOOI4LAv+StWL7sbJIkxHH04IoxH0tEiOOIJElYsaJy1ly9eXPz3t37znieXdVV6CaXm2t0+mxwzjFdmyJJkps/fP/t215/pSJbNm85EscxzWYDJ4LCCy0nQrPZII5jXt+y6euBgYH7RlXXAYve3b13/983bu4JghA/CLFPGW/OBVUlSRKiZoNms8GKSuXk6VMnDwL/eMA4UD9x7Og3r2zceDyOmkmteo9mo04Sx4hLm/RWVM9YKundKoljmo06teokcdRMNm5Yf+zE8aOHgQmgZlQ1D3QDy4DSqdOn1x45cuzTyWp1veflsNbi5XKYmZPr1Ao0JUoSRBw93d1XPvrw/YP79r13GRhtEUWmZbIFOoE+YPH09HTvoS8Pv/Xr73+8WZuqLZusVgeedmS9PT0jha7O0c2bN/3yyYH9PxcKhTvAbWAKiI0x8uAzVdUAAVAASkCx9eyTTvENj8/J2znLATFQB+4Bd4FJoAk4Y4zCLJN8Vc0B+RZB0PrNA94sRAokQNTaOGqROmPMY+XgP38v+gZFkbzTAAAAAElFTkSuQmCC) 4 10 4 10;border-image-source:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAA8CAYAAAB4v6rlAAAFAUlEQVR4nN2Y32sUVxTHP3f27swk2STubqw/1l9p/EXTqqUS9aHQ1yL0oQhapaXQ/0Cw7UMfC4It9aVUBCvYQm1BEHztS/FFDUJ/aB+ERsVqm2giZrNxd2fmntOH2fVXEkHN5KFfuOywDPc7557v+XGPYXbkhoZ2vIOnu4yyAWO2ALk53nWo/qaGK4g5NTx87gzgnnzJPPnH1q1bN1ib/y7v+0O+H9DREeL7AZ7nzcoiIkRRk3q9QRQ1iaNoOEniDy5evHhlTqKhoe37bd5+XigUOpZXKvT1LabQ3U0YhticnZUocQmNRoPa1BTj43f459YtarVaPYmTz4aHz381g2jbth2Hwo7wwJIlS1nT38+Spcvo6uoiby05azFmhvEAqCouSYiThOnpacZG/+X6tWuMjY3SqDe+uHDh3McPiLZv3767o7PrxzUvDzAwMEC5VCYIwzk3nwuqSrPRYOLuBCMjI1y/OkL9/vSe8+fP/2QGBwf9xS8tubpy5arK4KuvUS734XneM5M8SiYiTEyM8+flS9y4ceOv8Ttjg7anWNzVu2hRZXV/P8VSEeMZFEVVn4sIwHiGYqnI6jVrqFYn10ZJtMt2hZ07y6Uy5VIZz+RQeX6CR+GZHOVyH6VyH1PVqZ22o7Pjjd5FRWzex4nMC0kbeT+gWCwxfvv2DhsE4dKwI8TzDCIz4uyFYAyEYUgQhhWb9/1ea/OIKM/p/6fC2jx+EPi2rTDVFxPAnDDgeR7WGIOKIPPsnzbaH29VFFWyIxJFRbGighOHc/MrhDacOEQF247krCwSEVQV60QRpziXEZFTnCgWVUQF0YyIVEAVmx6bQzLykYhDRFIxiOi8p5+HRLrAYlDXIspKDCKoU6xoemxZHZ0TQVSxog51kpkY1AmiDqsKoopkkVBJ91YFK5K9j0QUq604cvNc9B4SOVQEq604yk7eiqqkqkuDNrsUJKpti7IOWMGqpMUp28JHOwWlKwukPtL/o49ENNsuqB2woEgrDWWB1PXaUp0KmllfJ23VLZSPdAF8lKpOs+u74cHeVhdADJqKIfuA1bSBJPOjQ1u5jlbHnwnauW6BxZBt752KgbRLyc6ituo0renZEbVaYgNVEe1Jb+Xzey1vF1UValaNGXPO9YjInDO554WI4JzD88yoDXz/UhxH68S5ebdInCOOI4LAv+StWL7sbJIkxHH04IoxH0tEiOOIJElYsaJy1ly9eXPz3t37znieXdVV6CaXm2t0+mxwzjFdmyJJkps/fP/t215/pSJbNm85EscxzWYDJ4LCCy0nQrPZII5jXt+y6euBgYH7RlXXAYve3b13/983bu4JghA/CLFPGW/OBVUlSRKiZoNms8GKSuXk6VMnDwL/eMA4UD9x7Og3r2zceDyOmkmteo9mo04Sx4hLm/RWVM9YKundKoljmo06teokcdRMNm5Yf+zE8aOHgQmgZlQ1D3QDy4DSqdOn1x45cuzTyWp1veflsNbi5XKYmZPr1Ao0JUoSRBw93d1XPvrw/YP79r13GRhtEUWmZbIFOoE+YPH09HTvoS8Pv/Xr73+8WZuqLZusVgeedmS9PT0jha7O0c2bN/3yyYH9PxcKhTvAbWAKiI0x8uAzVdUAAVAASkCx9eyTTvENj8/J2znLATFQB+4Bd4FJoAk4Y4zCLJN8Vc0B+RZB0PrNA94sRAokQNTaOGqROmPMY+XgP38v+gZFkbzTAAAAAElFTkSuQmCC)}#view-comments>.scroll:before,#view-home>.scroll:before{top:auto;bottom:0;background-image:-webkit-linear-gradient(bottom,rgba(0,0,0,.205),rgba(0,0,0,0));background-image:linear-gradient(bottom,rgba(0,0,0,.205),rgba(0,0,0,0))}#view-home{width:280px;border-right:1px solid #000;-webkit-box-direction:reverse;box-direction:reverse;left:0}#view-home>header{position:relative;background-image:url(../images/ios/silver-button-bar.png);border-bottom-left-radius:5px;border-bottom-right-radius:3px}#view-home>header h1{display:none}#view-home .scroll{-webkit-box-direction:normal;box-direction:normal;background-color:#fff}#view-home .tableview-links li>a .story b{-webkit-line-clamp:2;overflow:hidden;display:-webkit-box;display:box;-webkit-box-orient:vertical;box-orient:vertical}#view-about{width:540px;height:400px;border-radius:5px;box-shadow:0 0 15px #080b12;left:50%;margin-left:-270px;top:50%;margin-top:-200px;z-index:101;-webkit-transform:translateY(0);-webkit-transition:-webkit-transform 350ms;transform:translateY(0);transition:-webkit-transform 350ms}#view-about.hidden{-webkit-transform:translateY(175%);transform:translateY(175%)}#view-about>header{border-top-left-radius:5px;border-top-right-radius:5px}#view-about>.scroll{border-bottom-left-radius:5px;border-bottom-right-radius:5px}#view-about>.scroll.striped{background-color:#e2e5ea;background-image:-webkit-linear-gradient(top,#e2e5ea,#d0d2d8);background-image:linear-gradient(top,#e2e5ea,#d0d2d8)}#view-about>.scroll>section{padding:21px 22px}#view-about .grouped-tableview{font-size:14px}#view-comments{left:281px;right:0;width:auto;-webkit-box-direction:reverse;box-direction:reverse}#view-comments .scroll{-webkit-box-direction:normal;box-direction:normal}#view-comments>header{position:relative;background-image:url(../images/ios/silver-button-bar.png);border-bottom-left-radius:3px;border-bottom-right-radius:5px}#view-comments>header h1{text-align:left;font-size:14px;padding-left:44px!important;padding-right:10px!important;margin-left:0!important;margin-right:0!important}#view-comments>header a.header-back-button{padding:0;height:44px;width:44px;background:transparent url(../images/ios/close-button.png) no-repeat center;background-size:9px 10px}#view-comments>header a.header-back-button button{display:none}#view-comments>header a.header-back-button:after{pointer-events:none;opacity:0;content:'';display:block;width:60px;height:60px;position:absolute;left:-8px;top:-8px;z-index:1;background:transparent no-repeat;background-image:-webkit-radial-gradient(center contain,rgba(255,255,255,.8) 0,rgba(255,255,255,0) 100%);background-image:radial-gradient(center contain,rgba(255,255,255,.8) 0,rgba(255,255,255,0) 100%)}#view-comments>header a.header-back-button.tappable-active:after{opacity:1}.view section.comments p.metadata time{font-weight:400}.view section.comments p.no-comments{margin:100px auto}.view section.comments li.more-link-container{padding:15px}.view section.comments li>a.more-link{max-width:300px;height:30px;line-height:30px;padding:0 10px;color:grey;border-radius:6px;text-shadow:0 1px #fff;-webkit-tap-highlight-color:transparent;margin:2px auto 4px;background-color:#dedede;border:1px solid #d9d9d9;background-image:-webkit-linear-gradient(top,#fdfdfd,#dedede);background-image:linear-gradient(top,#fdfdfd,#dedede);background-size:10px 100%;background-repeat:repeat-x;-webkit-user-select:none}.view section.comments li>a.more-link.tappable-active{color:#444;background-color:#c8c8c8;border-color:#c8c8c8;background-image:-webkit-linear-gradient(top,#f0f0f0,#c8c8c8);background-image:linear-gradient(top,#f0f0f0,#c8c8c8)}.view section.comments li>a.more-link.tappable-active *{color:#444}.view .post-content header h1{font-size:18px;line-height:1.05em}.view .post-content header h1 a .link-text,.view section.comments{font-size:14px}#view-comments>.scroll>section{display:-webkit-box;display:box;-webkit-box-orient:vertical;box-orient:vertical}#view-comments>.scroll .comments{background-color:#fff}#view-comments>.scroll .comments .loader,#view-comments>.scroll .load-error{margin:100px auto 0}#view-comments>.scroll .load-error{font-size:16px;color:#666;font-weight:400}.view .post-content:before{height:600px;background-color:#e2e5ea;background-image:-webkit-linear-gradient(top,rgba(0,0,0,0),rgba(0,0,0,.12));background-image:linear-gradient(top,rgba(0,0,0,0),rgba(0,0,0,.12));background-size:1px 11px;background-position:bottom;background-repeat:repeat-x;-webkit-transform:translate3d(0,-600px,0);transform:translate3d(0,-600px,0)}.view .post-content{box-shadow:inset 0 1px #fff;background-color:#dedfe5;background-image:-webkit-linear-gradient(top,rgba(0,0,0,0),rgba(0,0,0,.08)),-webkit-linear-gradient(top,#f3f3f5,rgba(255,255,255,0));background-image:linear-gradient(top,rgba(0,0,0,0),rgba(0,0,0,.08)),linear-gradient(top,#f3f3f5,rgba(255,255,255,0));background-size:1px 11px,1px 100%;background-repeat:repeat-x}#y-icon{width:72px;height:72px;background-size:72px 72px;background-image:url(../../icons/touch-icon-144.png);border-radius:12px}#app-desc{margin-left:82px}}@media only screen and (min-width:1000px){#view-home{width:320px}#view-comments{left:321px}} \ No newline at end of file diff --git a/assets/css/hw-web.css b/assets/css/hw-web.css index 5775ab0e..d23b447b 100644 --- a/assets/css/hw-web.css +++ b/assets/css/hw-web.css @@ -1,7 +1,5 @@ -@import url(//fonts.googleapis.com/css?family=Open+Sans:400,400italic,600,600italic); - body{ - font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Helvetica Neue", sans-serif; font-size: 16px; margin: 0; padding: 0; @@ -25,6 +23,7 @@ pre{ } pre, code{ font-family: Menlo, Monaco, Inconsolata, Consolas, "Lucida Console", monospace; + font-size: 12px; } #outdated-browser{ @@ -43,8 +42,7 @@ pre, code{ display: inline-block; width: 14px; height: 18px; - background: transparent url(../images/web/refresh-icon.png) no-repeat; - background-image: url(../images/web/refresh-icon.svg), none; + background: transparent url(../images/web/refresh-icon.svg) no-repeat; background-size: 14px 18px; vertical-align: middle; overflow: hidden; @@ -127,8 +125,7 @@ pre, code{ overflow: hidden; text-indent: -999px; min-width: 32px; - background-image: url(../images/web/home-icon.png); - background-image: url(../images/web/home-icon.svg), none; + background-image: url(../images/web/home-icon.svg); background-size: 19.5px 17px; background-repeat: no-repeat; background-position: center; @@ -138,7 +135,7 @@ pre, code{ cursor: default; padding: 0; text-align: center; - font-size: 18px; + font-size: 1em; font-weight: normal; margin: 0; white-space: nowrap; @@ -163,20 +160,18 @@ pre, code{ } .view>.scroll .loader, .view>.scroll .load-error{ - font-size: 16px; - color: #666; + font-size: 14px; color: #666; text-align: center; padding: 50px 0; } .view>.scroll .load-error button{ border: 0; - font-size: 14px; height: 30px; line-height: 30px; cursor: pointer; padding: 0 20px; - font-weight: bold; + font-weight: 500; color: #666; margin: 6px auto 4px; background-color: #f0f0ea; @@ -207,8 +202,7 @@ pre, code{ position: relative; } .tableview-links li>a{ - font-size: 14px; - line-height: 1.3em; + line-height: 1.2em; color: #000; display: block; padding: 10px 5px; @@ -224,6 +218,7 @@ pre, code{ pointer-events: none; } .tableview-links li>a .number{ + font-weight: lighter; text-align: right; width: 3.5ex; color: #666d74; @@ -236,13 +231,12 @@ pre, code{ padding-left: 5px; } .tableview-links li>a .story b{ - font-weight: 600; + font-weight: normal; } .tableview-links li>a .metadata{ display: block; - font-size: 12px; + font-size: 14px; color: #666d74; - line-height: 1.2em; } .tableview-links li>a:hover .link-text{ text-decoration: underline; @@ -265,8 +259,7 @@ pre, code{ display: inline-block; width: 17px; height: 17px; - background: transparent url(../images/web/comments-icon.png) no-repeat; - background-image: url(../images/web/comments-icon.svg), none; + background: transparent url(../images/web/comments-icon.svg) no-repeat; background-size: 17px 17px; margin: 15px 0; } @@ -281,13 +274,15 @@ pre, code{ display: block; text-align: center; } +.tableview-links li>a.more-link:active{ + opacity: .5; +} .grouped-tableview{ margin: 10px 9px 11px; padding: 10px; border: 1px solid #E0E0E0; background-color: #fff; - font-size: 13px; border-radius: 2px; overflow: hidden; } @@ -333,7 +328,6 @@ ol.grouped-tableview-links li{ ul.grouped-tableview-links li>a, ol.grouped-tableview-links li>a{ color: #000; - font-size: 16px; display: inline-block; box-sizing: border-box; width: 100%; @@ -341,6 +335,7 @@ ol.grouped-tableview-links li>a{ text-decoration: none; white-space: nowrap; text-overflow: ellipsis; + line-height: 1.2em; } ul.grouped-tableview-links li>a:hover, ol.grouped-tableview-links li>a:hover{ @@ -353,20 +348,28 @@ ol.grouped-tableview-links li>a:hover{ } .view .post-content header{ padding: 10px 15px; + line-height: 1.2em; } .view .post-content header h1, .view .post-content header p{ + font-size: 1em; margin: 0; padding: 0; } -.view .post-content header h1 a{ +.view .post-content header a{ display: block; + text-decoration: none; } -.view .post-content header h1 a .link-text{ - font-size: 13px; +.view .post-content header h1{ + color: #000; + font-weight: normal; + font-size: 1em; +} +.view .post-content header .link-text{ + font-size: 14px; } .view .post-content header .metadata{ - font-size: 13px; + font-size: 14px; color: #666d74; } .view .post-content header .metadata a.external-link{ @@ -377,21 +380,12 @@ ol.grouped-tableview-links li>a:hover{ white-space: nowrap; text-overflow: ellipsis; padding-left: 16px; - background: transparent url(../images/external-arrow.png) no-repeat 0 50%; - background-image: url(../images/web/external-arrow.svg), none; + background: transparent url(../images/web/external-arrow.svg) no-repeat 0 50%; background-size: 12px 10px; } .view .post-content header .metadata a.external-link:hover{ color: #007aff; } -.view .post-content header h1{ - font-size: 17px; - line-height: 1.2em; -} -.view .post-content header h1 a{ - color: #000; - text-decoration: none; -} .view .post-content header + .grouped-tableview{ margin-top: 0; } @@ -408,6 +402,7 @@ ol.grouped-tableview-links li>a:hover{ width: 100%; } .view .post-content .poll li .poll-details b{ + font-weight: normal; display: table-cell; color: #333; } @@ -441,7 +436,7 @@ ol.grouped-tableview-links li>a:hover{ } .view section.comments{ - font-size: 13px; + font-size: 14px; background-color: #fff; border-top: 1px solid #E0E0E0; border-bottom: 1px solid #E0E0E0; @@ -463,8 +458,7 @@ ol.grouped-tableview-links li>a:hover{ .view section.comments ul ul li{ padding: 0 0 0 15px; border: 0; - background: transparent url(../images/comment-arrow.png) no-repeat 0 4px; - background-image: url(../images/web/comment-arrow.svg), none; + background: transparent url(../images/web/comment-arrow.svg) no-repeat 0 4px; background-size: 10px 9px; color: #333; } @@ -477,9 +471,16 @@ ol.grouped-tableview-links li>a:hover{ margin: 0; } .view section.comments p.metadata .user{ + font-weight: normal; float: left; color: #bf223f; } +.view section.comments p.metadata.deleted{ + margin-bottom: 8px; +} +.view section.comments p.metadata.deleted span{ + float: left; +} .view section.comments p.metadata .user.op:after{ content: 'OP'; display: inline-block; @@ -506,7 +507,6 @@ ol.grouped-tableview-links li>a:hover{ .view section.comments p.no-comments{ text-align: center; margin: 50px 0; - font-size: 16px; color: #666; } .view section.comments button.comments-toggle{ @@ -515,8 +515,7 @@ ol.grouped-tableview-links li>a:hover{ line-height: 22px; cursor: pointer; padding: 0 13px; - font-weight: bold; - font-size: 12px; + font-size: 1em; color: #666; margin: 2px 0 6px; background-color: #f0f0ea; @@ -533,16 +532,6 @@ ol.grouped-tableview-links li>a:hover{ .view section.comments li.more-link-container{ padding: 0; } -.view section.comments li>a.more-link{ - font-size: 15px; - text-decoration: none; - cursor: pointer; - line-height: 3em; - padding: 10px; - display: block; - color: #007aff; - text-align: center; -} .link-text{ color: #003d80; @@ -564,19 +553,23 @@ ol.grouped-tableview-links li>a:hover{ } #y-icon{ - background: transparent url(../../icons/touch-icon-114.png) no-repeat; - background-image: url(../../icons/icon.svg), none; + background: transparent url(../../icons/icon.svg) no-repeat; background-size: 57px 57px; width: 57px; height: 57px; float: left; + border: 1px solid #eee; border-radius: 4px; } #app-desc{ margin-left: 67px; + font-size: 14px; + color: #666d74; } #app-desc strong{ - font-size: 18px; + color: #000; + font-size: 1rem; + font-weight: normal; } @-ms-viewport{ @@ -599,11 +592,134 @@ ol.grouped-tableview-links li>a:hover{ box-shadow: 0 0 1px #aaa; } .view>header{ - border-top-left-radius: 2px; - border-top-right-radius: 2px; position: static; } .view>.scroll{ margin-top: 0; } } + +@media (prefers-color-scheme: dark){ + body{ + color: rgba(255,255,255,.87); + background-color: #121212; + } + + a:link{ + color: #2988cf; + } + a:visited{ + color: #c06dc8; + } + + /* Home */ + .tableview{ + background-color: #121212; + } + .tableview-links li>a{ + color: rgba(255,255,255,.87); + } + .tableview-links li>a:hover{ + background-color: rgba(255,255,255,.05); + } + .tableview-links li>a:visited{ + opacity: .38; + } + .tableview-links li>a .metadata, + .tableview-links li>a .number{ + color: rgba(255,255,255,.6); + } + .tableview li, + .view>header{ + border-color: rgba(255,255,255,.05); + } + + /* Post */ + .view>header{ + background-color: #1e1e1e; + } + .view section.comments, + .header-button:hover{ + background-color: rgba(255,255,255,.05); + } + .view.shaded>.scroll{ + background-color: transparent; + } + .view>header h1, + .view .post-content header h1{ + color: rgba(255,255,255,.87); + } + .view section.comments, + .view section.comments ul li{ + border-color: rgba(255,255,255,.05); + } + .view section.comments p.metadata .user{ + color: #e84f66; + } + .view section.comments p.metadata .user.op:after{ + background-color: #e84f66; + } + .link-text, + .tableview-links li>a.more-link, + .view .post-content header .metadata a.external-link:hover{ + color: #2988cf; + } + .view .post-content .poll li .poll-bar span{ + background-color: #2988cf; + } + .view section.comments button.comments-toggle{ + background-color: #333; + color: #eee + } + .view section.comments button.comments-toggle:active{ + background-color: #555; + } + .view section.comments button.comments-toggle:hover{ + background-color: #444; + } + .header-button button{ + color: #ff8700; + } + .icon-refresh, + #view-comments .header-button-left button, + #view-about .header-button-left button, + .tableview-links li>a.detail-disclosure-button span{ + filter: brightness(1.3); + } + .view .post-content pre, + .view section.comments pre{ + background-color: rgba(255,255,255,.05); + } + .view section.comments ul ul li{ + color: rgba(255,255,255,.6); + } + + /* About */ + .grouped-tableview{ + background-color: rgba(255,255,255,.05); + } + #app-desc strong, + ol.grouped-tableview-links li>a, + ul.grouped-tableview-links li>a{ + color: rgba(255,255,255,.87); + } + .grouped-tableview, + ol.grouped-tableview li, + ul.grouped-tableview li{ + border-color: rgba(255,255,255,.05); + } + .view.shaded>.scroll p.foot-label, + .grouped-tableview p{ + color: rgba(255,255,255,.6); + } + ol.grouped-tableview-links li>a:hover, + ul.grouped-tableview-links li>a:hover{ + background-color: rgba(255,255,255,.05); + } + + @media only screen and (min-width: 788px){ + .view{ + background-color: #121212; + } + } +} diff --git a/assets/css/hw-web.min.css b/assets/css/hw-web.min.css new file mode 100644 index 00000000..7407ae86 --- /dev/null +++ b/assets/css/hw-web.min.css @@ -0,0 +1 @@ +body{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;margin:0;padding:0;background-color:#fff;position:relative;word-wrap:break-word;-ms-text-size-adjust:none;overflow-y:scroll;visibility:visible}a:link{color:#007aff}button{font-family:inherit;outline:0;background-image:none}pre{word-wrap:normal}code,pre{font-family:Menlo,Monaco,Inconsolata,Consolas,"Lucida Console",monospace;font-size:12px}#outdated-browser{background-color:#fff;text-align:center;padding:1em;margin:0}#outdated-browser p{margin:0;padding:0;line-height:1.5em}.icon-refresh{display:inline-block;width:14px;height:18px;background:transparent url(../images/web/refresh-icon.svg) no-repeat;background-size:14px 18px;vertical-align:middle;overflow:hidden;text-indent:-999px}.view{position:relative;margin:0 auto;padding-bottom:1px;overflow:hidden}.view.hidden{display:none}.view>header{border-bottom:1px solid #ddd;background-color:rgba(255,255,255,.95);line-height:44px;height:44px;color:#333;position:absolute;position:fixed;left:0;top:0;right:0;z-index:3}.header-button{position:absolute;top:0;padding:7px 5px;line-height:1em;cursor:pointer}.header-button button{pointer-events:none;min-width:50px;height:30px;line-height:25px;font-weight:400;font-size:15px;text-align:center;color:#f60;padding:0 4px;margin:0;text-decoration:none;border:0;background-color:transparent;cursor:pointer}.header-button:hover{background-color:#f6f6ef}.header-button:active button{opacity:.5}.header-button button::-moz-focus-inner{padding:0;border:0}.header-button-icon button{min-width:0;padding:0 8px}.header-button-icon button img{vertical-align:text-bottom}.header-button-left{left:0}.header-button-right{right:0}#view-about .header-button-left button,#view-comments .header-button-left button{overflow:hidden;text-indent:-999px;min-width:32px;background-image:url(../images/web/home-icon.svg);background-size:19.5px 17px;background-repeat:no-repeat;background-position:center}.view>header h1{cursor:default;padding:0;text-align:center;font-size:1em;font-weight:400;margin:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-wrap:normal}.view>.scroll{overflow:hidden;min-height:9vh;margin-top:44px}.view.shaded>.scroll{background-color:#f6f6ef}.view.shaded>.scroll p.foot-label{margin:15px 10px;font-size:13px;line-height:1.4em;color:#4c566c;text-align:center}.view>.scroll .load-error,.view>.scroll .loader{font-size:14px;color:#666;text-align:center;padding:50px 0}.view>.scroll .load-error button{border:0;height:30px;line-height:30px;cursor:pointer;padding:0 20px;font-weight:500;color:#666;margin:6px auto 4px;background-color:#f0f0ea;border-radius:2px}.view>.scroll .load-error button:hover{background-color:#e0e0da}.view>.scroll .load-error button:active{background-color:#c8c8c8}.tableview{margin:0;padding:0;list-style:none;background-color:#fff}.tableview li{display:block;border-top:1px solid #e0e0e0;padding:10px}.tableview li:first-child{border-top:0}.tableview-links li{padding:0;position:relative}.tableview-links li>a{line-height:1.2em;color:#000;display:block;padding:10px 5px;text-decoration:none}.tableview-links li>a:visited{color:#888}.tableview-links li>a:hover{background-color:#f6f6ef}.tableview-links li>a *{pointer-events:none}.tableview-links li>a .number{font-weight:lighter;text-align:right;width:3.5ex;color:#666d74;position:absolute;left:5px;top:10px}.tableview-links li>a .story{margin-left:4ex;padding-left:5px}.tableview-links li>a .story b{font-weight:400}.tableview-links li>a .metadata{display:block;font-size:14px;color:#666d74}.tableview-links li>a:hover .link-text{text-decoration:underline}.tableview-links li>a.detail-disclosure{padding-right:44px}.tableview-links li>a.detail-disclosure-button{position:absolute;top:0;right:0;padding:0;z-index:2;width:44px;height:100%;text-align:center;vertical-align:middle}.tableview-links li>a.detail-disclosure-button span{display:inline-block;width:17px;height:17px;background:transparent url(../images/web/comments-icon.svg) no-repeat;background-size:17px 17px;margin:15px 0}.tableview-links li>a.detail-disclosure-button:active span{opacity:.5}.tableview-links li>a.more-link{color:#007aff;cursor:pointer;line-height:3em;padding:10px;display:block;text-align:center}.tableview-links li>a.more-link:active{opacity:.5}.grouped-tableview{margin:10px 9px 11px;padding:10px;border:1px solid #e0e0e0;background-color:#fff;border-radius:2px;overflow:hidden}.grouped-tableview+.grouped-tableview{margin-top:0}.grouped-tableview p{margin:0 0 1em}.grouped-tableview p:last-child{margin:0}.grouped-tableview ol,.grouped-tableview ul{margin:0 0 0 2em;padding:0;line-height:1.5em}ol.grouped-tableview,ul.grouped-tableview{display:block;list-style:none;padding:0}ol.grouped-tableview li,ul.grouped-tableview li{display:block;border-bottom:1px solid #e0e0e0;padding:10px}ol.grouped-tableview li:first-child,ul.grouped-tableview li:first-child{box-shadow:none}ol.grouped-tableview li:last-child,ul.grouped-tableview li:last-child{border-bottom:0}ol.grouped-tableview-links li,ul.grouped-tableview-links li{padding:0}ol.grouped-tableview-links li>a,ul.grouped-tableview-links li>a{color:#000;display:inline-block;box-sizing:border-box;width:100%;padding:10px;text-decoration:none;white-space:nowrap;text-overflow:ellipsis;line-height:1.2em}ol.grouped-tableview-links li>a:hover,ul.grouped-tableview-links li>a:hover{background-color:#f6f6ef}.view .post-content{min-height:4em;overflow:hidden}.view .post-content header{padding:10px 15px;line-height:1.2em}.view .post-content header h1,.view .post-content header p{font-size:1em;margin:0;padding:0}.view .post-content header a{display:block;text-decoration:none}.view .post-content header h1{color:#000;font-weight:400;font-size:1em}.view .post-content header .link-text{font-size:14px}.view .post-content header .metadata{font-size:14px;color:#666d74}.view .post-content header .metadata a.external-link{color:#666d74;text-decoration:none;display:block;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;padding-left:16px;background:transparent url(../images/web/external-arrow.svg) no-repeat 0 50%;background-size:12px 10px}.view .post-content header .metadata a.external-link:hover{color:#007aff}.view .post-content header+.grouped-tableview{margin-top:0}.view .post-content .poll{margin:0;list-style:none}.view .post-content .poll li{margin-bottom:9px}.view .post-content .poll li .poll-details{display:table;width:100%}.view .post-content .poll li .poll-details b{font-weight:400;display:table-cell;color:#333}.view .post-content .poll li .poll-details .points{display:table-cell;white-space:nowrap;color:#888;text-align:right;vertical-align:bottom}.view .post-content .poll li .poll-bar{background-color:#fafafa;width:100%;height:3px;overflow:hidden;border-radius:2px}.view .post-content .poll li .poll-bar span{background-color:#007aff;display:block;width:0;height:3px}.view .post-content pre,.view section.comments pre{margin:0 0 8px;overflow:auto;padding:.65em 0;background-color:#f6f6ef;border-radius:2px}.view section.comments{font-size:14px;background-color:#fff;border-top:1px solid #e0e0e0;border-bottom:1px solid #e0e0e0;margin-bottom:20px}.view section.comments ul{margin:0;padding:0;list-style:none;line-height:1.5em}.view section.comments ul li{padding:15px;border-bottom:1px solid #e0e0e0}.view section.comments ul>li:last-child{border-bottom:0}.view section.comments ul ul li{padding:0 0 0 15px;border:0;background:transparent url(../images/web/comment-arrow.svg) no-repeat 0 4px;background-size:10px 9px;color:#333}.view section.comments p{margin:8px 0}.view section.comments p.metadata{color:#666d74;padding:0;margin:0}.view section.comments p.metadata .user{font-weight:400;float:left;color:#bf223f}.view section.comments p.metadata.deleted{margin-bottom:8px}.view section.comments p.metadata.deleted span{float:left}.view section.comments p.metadata .user.op:after{content:'OP';display:inline-block;font-size:70%;color:#fff;background-color:#bf223f;padding:3px 4px;line-height:1;margin-left:5px;border-radius:2px}.view section.comments p.metadata time{display:block;text-align:right;color:#888}.view section.comments p.metadata time a{color:#888;text-decoration:none}.view section.comments p.metadata time a:hover{text-decoration:underline}.view section.comments p.no-comments{text-align:center;margin:50px 0;color:#666}.view section.comments button.comments-toggle{display:block;height:30px;line-height:22px;cursor:pointer;padding:0 13px;font-size:1em;color:#666;margin:2px 0 6px;background-color:#f0f0ea;border:0;-webkit-user-select:none;border-radius:2px}.view section.comments button.comments-toggle:hover{background-color:#e0e0da}.view section.comments button.comments-toggle:active{background-color:#c8c8c8}.view section.comments li.more-link-container{padding:0}.link-text{color:#003d80;font-weight:400}.inline-block{display:inline-block}.cf:after,.cf:before{content:"";display:table}.cf:after{clear:both}#y-icon{background:transparent url(../../icons/icon.svg) no-repeat;background-size:57px 57px;width:57px;height:57px;float:left;border:1px solid #eee;border-radius:4px}#app-desc{margin-left:67px;font-size:14px;color:#666d74}#app-desc strong{color:#000;font-size:1rem;font-weight:400}@-ms-viewport{width:device-width;zoom:1}@viewport{width:device-width;zoom:1}@media only screen and (min-width:788px){body{background-color:#fafafa}.view{background-color:#fff;max-width:700px;box-shadow:0 0 1px #aaa}.view>header{position:static}.view>.scroll{margin-top:0}}@media (prefers-color-scheme:dark){body{color:rgba(255,255,255,.87);background-color:#121212}a:link{color:#2988cf}a:visited{color:#c06dc8}.tableview{background-color:#121212}.tableview-links li>a{color:rgba(255,255,255,.87)}.tableview-links li>a:hover{background-color:rgba(255,255,255,.05)}.tableview-links li>a:visited{opacity:.38}.tableview-links li>a .metadata,.tableview-links li>a .number{color:rgba(255,255,255,.6)}.tableview li,.view>header{border-color:rgba(255,255,255,.05)}.view>header{background-color:#1e1e1e}.header-button:hover,.view section.comments{background-color:rgba(255,255,255,.05)}.view.shaded>.scroll{background-color:transparent}.view .post-content header h1,.view>header h1{color:rgba(255,255,255,.87)}.view section.comments,.view section.comments ul li{border-color:rgba(255,255,255,.05)}.view section.comments p.metadata .user{color:#e84f66}.view section.comments p.metadata .user.op:after{background-color:#e84f66}.link-text,.tableview-links li>a.more-link,.view .post-content header .metadata a.external-link:hover{color:#2988cf}.view .post-content .poll li .poll-bar span{background-color:#2988cf}.view section.comments button.comments-toggle{background-color:#333;color:#eee}.view section.comments button.comments-toggle:active{background-color:#555}.view section.comments button.comments-toggle:hover{background-color:#444}.header-button button{color:#ff8700}#view-about .header-button-left button,#view-comments .header-button-left button,.icon-refresh,.tableview-links li>a.detail-disclosure-button span{filter:brightness(1.3)}.view .post-content pre,.view section.comments pre{background-color:rgba(255,255,255,.05)}.view section.comments ul ul li{color:rgba(255,255,255,.6)}.grouped-tableview{background-color:rgba(255,255,255,.05)}#app-desc strong,ol.grouped-tableview-links li>a,ul.grouped-tableview-links li>a{color:rgba(255,255,255,.87)}.grouped-tableview,ol.grouped-tableview li,ul.grouped-tableview li{border-color:rgba(255,255,255,.05)}.grouped-tableview p,.view.shaded>.scroll p.foot-label{color:rgba(255,255,255,.6)}ol.grouped-tableview-links li>a:hover,ul.grouped-tableview-links li>a:hover{background-color:rgba(255,255,255,.05)}@media only screen and (min-width:788px){.view{background-color:#121212}}} \ No newline at end of file diff --git a/assets/images/web/comment-arrow.svg b/assets/images/web/comment-arrow.svg index e19d693d..2b63d67d 100644 --- a/assets/images/web/comment-arrow.svg +++ b/assets/images/web/comment-arrow.svg @@ -1,3 +1,3 @@ - - - \ No newline at end of file + + + diff --git a/assets/images/web/comments-icon.svg b/assets/images/web/comments-icon.svg index 8de214b6..ae096670 100644 --- a/assets/images/web/comments-icon.svg +++ b/assets/images/web/comments-icon.svg @@ -1,3 +1,3 @@ - - - \ No newline at end of file + + + diff --git a/assets/images/web/external-arrow.svg b/assets/images/web/external-arrow.svg index d201f741..dd4788ef 100644 --- a/assets/images/web/external-arrow.svg +++ b/assets/images/web/external-arrow.svg @@ -1,3 +1,3 @@ - - - \ No newline at end of file + + + diff --git a/assets/images/web/home-icon.svg b/assets/images/web/home-icon.svg index f795e027..0da821e7 100644 --- a/assets/images/web/home-icon.svg +++ b/assets/images/web/home-icon.svg @@ -1,3 +1,3 @@ - - - \ No newline at end of file + + + diff --git a/assets/images/web/refresh-icon.svg b/assets/images/web/refresh-icon.svg index f9223f7a..d7bad9cc 100644 --- a/assets/images/web/refresh-icon.svg +++ b/assets/images/web/refresh-icon.svg @@ -1,3 +1,3 @@ - - - \ No newline at end of file + + + diff --git a/assets/js/hw-ios-2.js b/assets/js/hw-ios-2.js index 89d4a583..89402b6a 100644 --- a/assets/js/hw-ios-2.js +++ b/assets/js/hw-ios-2.js @@ -65,7 +65,7 @@ }; var getScreenState = function(){ - return w.innerWidth >= 640 ? 'wide' : 'narrow'; + return ((body.offsetWidth || w.innerWidth) > 736) ? 'wide' : 'narrow'; }; // Disable user scale of the viewport @@ -326,10 +326,6 @@ hw.comments.toggle(target); }); - tappable('section.comments li>a.more-link', function(e, target){ - hw.comments.more(target); - }); - tappable('#view-comments .load-error button', hw.comments.reload); hw.sub('selectCurrentStory', function(id){ @@ -363,20 +359,6 @@ }, 1); }, false); - if (!isWideScreen){ - setTimeout(function(){ - var loader = $('apploader'); - if (!loader) return; - loader.classList.add('hide'); - prefixedAddEvent(loader, 'TransitionEnd', function(){ - loader.parentNode.removeChild(loader); - }); - }, 200); - } else { - var loader = $('apploader'); - loader.parentNode.removeChild(loader); - } - // Make about dialog animated after 400ms, for widescreen if (isWideScreen) setTimeout(function(){ $('view-about').classList.add('animated'); diff --git a/assets/js/hw-ios.js b/assets/js/hw-ios.js index 5641c80d..52e00ef7 100644 --- a/assets/js/hw-ios.js +++ b/assets/js/hw-ios.js @@ -357,10 +357,6 @@ hw.comments.toggle(target); }); - tappable('section.comments li>a.more-link', function(e, target){ - hw.comments.more(target); - }); - tappable('#view-comments .load-error button', hw.comments.reload); hw.sub('selectCurrentStory', function(id){ @@ -437,18 +433,6 @@ w.addEventListener('load', scrollTop, false); } if (supportOrientation) w.onorientationchange = scrollTop; - - setTimeout(function(){ - var loader = $('apploader'); - if (!loader) return; - loader.classList.add('hide'); - loader.addEventListener('webkitTransitionEnd', function(){ - loader.parentNode.removeChild(loader); - }, false); - }, 200); - } else { - var loader = $('apploader'); - loader.parentNode.removeChild(loader); } hw.news.options.disclosure = !isWideScreen; diff --git a/assets/js/hw-web.js b/assets/js/hw-web.js index d3375662..25a302a8 100644 --- a/assets/js/hw-web.js +++ b/assets/js/hw-web.js @@ -58,10 +58,6 @@ hw.comments.toggle(target); }); - ibento('section.comments li>a.more-link', 'click', function(e, target){ - hw.comments.more(target); - }); - ibento('#view-comments .load-error button', 'click', hw.comments.reload); if (/Mobile;.*Firefox/.test(navigator.userAgent) && navigator.mozApps){ // Firefox Mobile @@ -78,4 +74,4 @@ } window.onload = hw.init; -})(window); \ No newline at end of file +})(window); diff --git a/assets/js/hw.js b/assets/js/hw.js index bd951a8e..12250f1a 100644 --- a/assets/js/hw.js +++ b/assets/js/hw.js @@ -52,11 +52,6 @@ } }; - // Log API failures/errors to GA - if (typeof ga != 'undefined') hw.sub('logAPIError', function(type){ - ga('send', 'event', 'Errors', 'API', type); - }); - var tmpl = hw.tmpl; // Fix browsers freak out of amplify.store.sessionStorage not a function @@ -75,6 +70,7 @@ var pathnameLen = pathname.length; var firstPath = domain.length <= 25 && pathnameLen > 3 && pathnameLen <= 15 && /^[^0-9][^.]+$/.test(pathname) ? ('/' + pathname) : ''; domained = domain + firstPath; + domainsCache[url] = domained; return domained; }; @@ -98,6 +94,7 @@ } else { if (item.type == 'link') item.detail_disclosure = true; if (/^#\//.test(item.url)){ + item.detail_disclosure = false; item.disclosure = true; item.domain = null; } @@ -233,6 +230,7 @@ }); }, more: function(target){ + if (target.classList.contains('loading')) return; target.classList.add('loading'); var news2 = amplify.store('hacker-news2'); setTimeout(function(){ @@ -260,31 +258,6 @@ if (hw.comments.currentID == id && post) return; hw.comments.currentID = id; - var loadComments = function(_data, id){ - if (!_data || _data.error) return; - var data = clone(_data); - amplify.store.sessionStorage('hacker-comments-' + id, data); - var ul = $commentsSection.querySelector('.comments>ul'); - if (!ul.querySelector('.more-link-container')){ - ul.insertAdjacentHTML('beforeend', ''); - } - if (!data.more_comments_id) return; - - // Preload all 'More' comments - var loadMoreComments = function(id){ - var comments = amplify.store.sessionStorage('hacker-comments-' + id); - if (!comments){ - hnapi.comments(id, function(data){ - if (!data || data.error) return; - amplify.store.sessionStorage('hacker-comments-' + id, data); - if (data.more_comments_id) loadMoreComments(data.more_comments_id); - }); - } else { - if (comments.more_comments_id) loadMoreComments(comments.more_comments_id); - } - }; - loadMoreComments(data.more_comments_id); - }; var loadPost = function(_data, id){ var data = clone(_data), tmpl1 = tmpl('post-comments'); @@ -292,7 +265,7 @@ data.has_post = !!data.title; if (!data.has_post){ hw.setTitle(); - $commentsHeading.innerHTML = ''; + $commentsHeading.innerText = ''; $commentsSection.innerHTML = tmpl1.render(data); hw.pub('adjustCommentsSection'); hw.pub('onRenderComments'); @@ -329,7 +302,7 @@ data.short_hn_url = 'news.ycombinator.com/item?id=' + id; data.hn_url = '//' + data.short_hn_url; hw.setTitle(data.title); - $commentsHeading.innerHTML = data.title; + $commentsHeading.innerText = data.title; var html = tmpl1.render(data, {comments_list: tmpl2}); var div = d.createElement('div'); @@ -340,10 +313,6 @@ var links = div.querySelectorAll('a'); for (var i=0, l=links.length; iMore…'); - } - ul.removeChild(li); - while (_ul.hasChildNodes()){ - ul.appendChild(_ul.childNodes[0]); - } - delete _ul; - } else { - // TODO: Need funnier error message than this. - alert('Oops, the comments have expired.'); - } - }, reload: function(){ hw.comments.currentID = null; ruto.reload(); @@ -535,6 +446,60 @@ hw.init = function(){ hw.news.render(); ruto.init(); + + function renderColorScheme() { + var link = Array.from(document.styleSheets).find(function(s){ + return /hw.*\.css/i.test(s.href); + }); + if (!link) { + setTimeout(renderColorScheme, 1000); + return; + } + var cssRule = Array.from(link.cssRules).find(function(r){ + return r.media && /color-scheme:\s*dark/i.test(r.media.mediaText); + }); + if (cssRule) { + $('hw-appearance-container').hidden = false; + var $hwAppearance = $('hw-appearance'); + var $metaColorScheme = $('meta-color-scheme'); + var prefersColorSchemeSupported = window.matchMedia && window.matchMedia('(prefers-color-scheme)').media !== 'not all'; + var appearanceStorageKey = 'hw-appearance'; + var appearance = localStorage.getItem(appearanceStorageKey) || 'auto'; + + function setAppearance(appearance) { + if (appearance === 'dark') { + cssRule.media.mediaText = 'screen'; + $metaColorScheme.content = 'dark'; + } else if (appearance === 'light') { + cssRule.media.mediaText = 'not all'; + $metaColorScheme.content = 'light'; + } else { + cssRule.media.mediaText = '(prefers-color-scheme: dark)'; + $metaColorScheme.content = 'dark light'; + } + }; + setAppearance(appearance); + + if (prefersColorSchemeSupported) { + $hwAppearance.querySelector('[name=hw-appearance][value=auto]').parentNode.hidden = false; + var input = $hwAppearance.querySelector('[name=hw-appearance][value=' + appearance + ']'); + input.checked = true; + } else { + if (!/(light|dark)/i.test(appearance)) { + appearance = 'light'; + } + var input = $hwAppearance.querySelector('[name=hw-appearance][value="' + appearance + '"]'); + input.checked = true; + } + $hwAppearance.onclick = function() { + var checkedInput = $hwAppearance.querySelector('[name=hw-appearance]:checked'); + var appearance = checkedInput.value; + localStorage.setItem(appearanceStorageKey, appearance); + setAppearance(appearance); + } + } + } + renderColorScheme(); }; w.hw = hw; @@ -557,4 +522,4 @@ .add(/^\/item\/(\d+)$/i, 'comments', function(path, id){ hw.comments.render(id); }); -})(window); \ No newline at end of file +})(window); diff --git a/assets/js/libs/amplify.store.js b/assets/js/libs/amplify.store.js index fe68bf60..d5bec156 100644 --- a/assets/js/libs/amplify.store.js +++ b/assets/js/libs/amplify.store.js @@ -1,7 +1,7 @@ /*! - * Amplify Store - Persistent Client-Side Storage 1.1.0 + * Amplify Store - Persistent Client-Side Storage 1.1.2 * - * Copyright 2012 appendTo LLC. (http://appendto.com/team) + * Copyright 2011 - 2013 appendTo LLC. (http://appendto.com/team) * Dual licensed under the MIT or GPL licenses. * http://appendto.com/open-source-licenses * diff --git a/assets/js/libs/classList.js b/assets/js/libs/classList.js index ae90d99e..6b24565e 100644 --- a/assets/js/libs/classList.js +++ b/assets/js/libs/classList.js @@ -1,17 +1,20 @@ /* * classList.js: Cross-browser full element.classList implementation. - * 2014-01-31 + * 1.1.20150312 * * By Eli Grey, http://eligrey.com - * Public Domain. - * NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. + * License: Dedicated to the public domain. + * See https://github.com/eligrey/classList.js/blob/master/LICENSE.md */ /*global self, document, DOMException */ -/*! @source http://purl.eligrey.com/github/classList.js/blob/master/classList.js*/ +/*! @source http://purl.eligrey.com/github/classList.js/blob/master/classList.js */ -if ("document" in self && !("classList" in document.createElement("_"))) { +if ("document" in self) { + +// Full polyfill for browsers with no classList support +if (!("classList" in document.createElement("_"))) { (function (view) { @@ -117,13 +120,15 @@ classListProto.remove = function () { , l = tokens.length , token , updated = false + , index ; do { token = tokens[i] + ""; - var index = checkTokenAndGetIndex(this, token); - if (index !== -1) { + index = checkTokenAndGetIndex(this, token); + while (index !== -1) { this.splice(index, 1); updated = true; + index = checkTokenAndGetIndex(this, token); } } while (++i < l); @@ -147,7 +152,11 @@ classListProto.toggle = function (token, force) { this[method](token); } - return !result; + if (force === true || force === false) { + return force; + } else { + return !result; + } }; classListProto.toString = function () { return this.join(" "); @@ -173,4 +182,56 @@ if (objCtr.defineProperty) { }(self)); +} else { +// There is full or partial native classList support, so just check if we need +// to normalize the add/remove and toggle APIs. + +(function () { + "use strict"; + + var testElement = document.createElement("_"); + + testElement.classList.add("c1", "c2"); + + // Polyfill for IE 10/11 and Firefox <26, where classList.add and + // classList.remove exist but support only one argument at a time. + if (!testElement.classList.contains("c2")) { + var createMethod = function(method) { + var original = DOMTokenList.prototype[method]; + + DOMTokenList.prototype[method] = function(token) { + var i, len = arguments.length; + + for (i = 0; i < len; i++) { + token = arguments[i]; + original.call(this, token); + } + }; + }; + createMethod('add'); + createMethod('remove'); + } + + testElement.classList.toggle("c3", false); + + // Polyfill for IE 10 and Firefox <24, where classList.toggle does not + // support the second argument. + if (testElement.classList.contains("c3")) { + var _toggle = DOMTokenList.prototype.toggle; + + DOMTokenList.prototype.toggle = function(token, force) { + if (1 in arguments && !this.contains(token) === !force) { + return force; + } else { + return _toggle.call(this, token); + } + }; + + } + + testElement = null; +}()); + +} + } diff --git a/assets/js/libs/hnapi.js b/assets/js/libs/hnapi.js index a967d964..21437ad0 100644 --- a/assets/js/libs/hnapi.js +++ b/assets/js/libs/hnapi.js @@ -59,7 +59,7 @@ error(e); }; if (r.readyState <= 1 || supportXDomainRequest){ // XDomainRequest doesn't have readyState - r.open('GET', url + '?' + date(), true); + r.open('GET', url, true); r.send(); } requests[url] = r; @@ -77,13 +77,13 @@ }; var urls = [ - '//node-hnapi-eu.herokuapp.com/', // Heroku (EU) - '//node-hnapi.azurewebsites.net/', // Windows Azure (North EU) - '//node-hnapi-asia.azurewebsites.net/', // Windows Azure (East Asia) - '//node-hnapi-eus.azurewebsites.net/', // Windows Azure (East US) - '//node-hnapi-weu.azurewebsites.net/', // Windows Azure (West EU) - '//node-hnapi-wus.azurewebsites.net/', // Windows Azure (West US) - '//node-hnapi-ncus.azurewebsites.net/' // Windows Azure (North Central US) + 'https://node-hnapi-eu.herokuapp.com/', // Heroku (EU) + 'https://node-hnapi.azurewebsites.net/', // Windows Azure (North EU) + 'https://node-hnapi-eus.azurewebsites.net/' // Windows Azure (East US) + // '//node-hnapi-asia.azurewebsites.net/', // Windows Azure (East Asia) + // '//node-hnapi-weu.azurewebsites.net/', // Windows Azure (West EU) + // '//node-hnapi-wus.azurewebsites.net/', // Windows Azure (West US) + // '//node-hnapi-ncus.azurewebsites.net/' // Windows Azure (North Central US) ]; var shuffle = function(array){ // Fisher-Yates for (var i = array.length - 1; i > 0; i--){ @@ -94,6 +94,7 @@ } }; shuffle(urls); + urls.unshift('https://api.hackerwebapp.com/'); // The ultimate API var length = urls.length; var reqAgain = function(i, path, success, error){ diff --git a/assets/js/libs/hogan.js b/assets/js/libs/hogan.js index 5d2bb913..14f396d1 100644 --- a/assets/js/libs/hogan.js +++ b/assets/js/libs/hogan.js @@ -15,7 +15,7 @@ var Hogan = {}; -(function (Hogan, useArrayBuffer) { +(function (Hogan) { Hogan.Template = function (codeObj, text, compiler, options) { codeObj = codeObj || {}; this.r = codeObj.code || this.r; @@ -24,7 +24,7 @@ var Hogan = {}; this.text = text || ''; this.partials = codeObj.partials || {}; this.subs = codeObj.subs || {}; - this.ib(); + this.buf = ''; } Hogan.Template.prototype = { @@ -72,12 +72,14 @@ var Hogan = {}; if (partial.subs) { // Make sure we consider parent template now - if (this.activeSub === undefined) { - // Store parent template text in partials.stackText to perform substitutions in child templates correctly - partials.stackText = this.text; + if (!partials.stackText) partials.stackText = {}; + for (key in partial.subs) { + if (!partials.stackText[key]) { + partials.stackText[key] = (this.activeSub !== undefined && partials.stackText[this.activeSub]) ? partials.stackText[this.activeSub] : this.text; + } } template = createSpecializedPartial(template, partial.subs, partial.partials, - this.stackSubs, this.stackPartials, partials.stackText || this.text); + this.stackSubs, this.stackPartials, partials.stackText); } this.partials[symbol].instance = template; @@ -144,7 +146,7 @@ var Hogan = {}; } else { for (var i = 1; i < names.length; i++) { found = findInScope(names[i], val, doModelGet); - if (found != null) { + if (found !== undefined) { cx = val; val = found; } else { @@ -176,7 +178,7 @@ var Hogan = {}; for (var i = ctx.length - 1; i >= 0; i--) { v = ctx[i]; val = findInScope(key, v, doModelGet); - if (val != null) { + if (val !== undefined) { found = true; break; } @@ -194,11 +196,11 @@ var Hogan = {}; }, // higher order templates - ls: function(func, cx, partials, text, tags) { + ls: function(func, cx, ctx, partials, text, tags) { var oldTags = this.options.delimiters; this.options.delimiters = tags; - this.b(this.ct(coerceToString(func.call(cx, text)), cx, partials)); + this.b(this.ct(coerceToString(func.call(cx, text, ctx)), cx, partials)); this.options.delimiters = oldTags; return false; @@ -213,15 +215,9 @@ var Hogan = {}; }, // template result buffering - b: (useArrayBuffer) ? function(s) { this.buf.push(s); } : - function(s) { this.buf += s; }, - - fl: (useArrayBuffer) ? function() { var r = this.buf.join(''); this.buf = []; return r; } : - function() { var r = this.buf; this.buf = ''; return r; }, - // init the buffer - ib: function () { - this.buf = (useArrayBuffer) ? [] : ''; - }, + b: function(s) { this.buf += s; }, + + fl: function() { var r = this.buf; this.buf = ''; return r; }, // method replace section ms: function(func, ctx, partials, inverted, start, end, tags) { @@ -233,8 +229,8 @@ var Hogan = {}; if (inverted) { return true; } else { - textSource = (this.activeSub && this.subsText[this.activeSub]) ? this.subsText[this.activeSub] : this.text; - return this.ls(result, cx, partials, textSource.substring(start, end), tags); + textSource = (this.activeSub && this.subsText && this.subsText[this.activeSub]) ? this.subsText[this.activeSub] : this.text; + return this.ls(result, cx, ctx, partials, textSource.substring(start, end), tags); } } @@ -266,11 +262,11 @@ var Hogan = {}; //Find a key in an object function findInScope(key, scope, doModelGet) { - var val, checkVal; + var val; if (scope && typeof scope == 'object') { - if (scope[key] != null) { + if (scope[key] !== undefined) { val = scope[key]; // try lookup with get for backbone or similar model data @@ -282,7 +278,7 @@ var Hogan = {}; return val; } - function createSpecializedPartial(instance, subs, partials, stackSubs, stackPartials, childText) { + function createSpecializedPartial(instance, subs, partials, stackSubs, stackPartials, stackText) { function PartialTemplate() {}; PartialTemplate.prototype = instance; function Substitutions() {}; @@ -291,13 +287,13 @@ var Hogan = {}; var partial = new PartialTemplate(); partial.subs = new Substitutions(); partial.subsText = {}; //hehe. substext. - partial.ib(); + partial.buf = ''; stackSubs = stackSubs || {}; partial.stackSubs = stackSubs; + partial.subsText = stackText; for (key in subs) { if (!stackSubs[key]) stackSubs[key] = subs[key]; - partial.subsText[key] = childText; } for (key in stackSubs) { partial.subs[key] = stackSubs[key]; diff --git a/assets/js/libs/requestanimationframe.js b/assets/js/libs/requestanimationframe.js index 2ce3a97e..705880c1 100644 --- a/assets/js/libs/requestanimationframe.js +++ b/assets/js/libs/requestanimationframe.js @@ -1,29 +1,30 @@ // http://paulirish.com/2011/requestanimationframe-for-smart-animating/ // http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating -// requestAnimationFrame polyfill by Erik Möller -// fixes from Paul Irish and Tino Zijdel +// requestAnimationFrame polyfill by Erik Möller. fixes from Paul Irish and Tino Zijdel + +// MIT license (function() { var lastTime = 0; - var vendors = ['ms', 'moz', 'webkit', 'o']; + var vendors = ['webkit', 'moz']; for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) { window.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame']; window.cancelAnimationFrame = window[vendors[x]+'CancelAnimationFrame'] || window[vendors[x]+'CancelRequestAnimationFrame']; } - + if (!window.requestAnimationFrame) window.requestAnimationFrame = function(callback, element) { var currTime = new Date().getTime(); var timeToCall = Math.max(0, 16 - (currTime - lastTime)); - var id = window.setTimeout(function() { callback(currTime + timeToCall); }, + var id = window.setTimeout(function() { callback(currTime + timeToCall); }, timeToCall); lastTime = currTime + timeToCall; return id; }; - + if (!window.cancelAnimationFrame) window.cancelAnimationFrame = function(id) { clearTimeout(id); }; -}()); \ No newline at end of file +}()); diff --git a/assets/js/libs/tween.js b/assets/js/libs/tween.js index 781bdc28..5ad183aa 100644 --- a/assets/js/libs/tween.js +++ b/assets/js/libs/tween.js @@ -1,36 +1,41 @@ /** - * @author sole / http://soledadpenades.com - * @author mrdoob / http://mrdoob.com - * @author Robert Eisele / http://www.xarg.org - * @author Philippe / http://philippe.elsass.me - * @author Robert Penner / http://www.robertpenner.com/easing_terms_of_use.html - * @author Paul Lewis / http://www.aerotwist.com/ - * @author lechecacharro - * @author Josh Faul / http://jocafa.com/ - * @author egraether / http://egraether.com/ - * @author endel / http://endel.me - * @author Ben Delarre / http://delarre.net + * Tween.js - Licensed under the MIT license + * https://github.com/tweenjs/tween.js + * ---------------------------------------------- + * + * See https://github.com/tweenjs/tween.js/graphs/contributors for the full list of contributors. + * Thank you all, you're awesome! */ -// Date.now shim for (ahem) Internet Explo(d|r)er -if ( Date.now === undefined ) { +// Include a performance.now polyfill +(function () { - Date.now = function () { + if ('performance' in window === false) { + window.performance = {}; + } - return new Date().valueOf(); + // IE 8 + Date.now = (Date.now || function () { + return new Date().getTime(); + }); - }; + if ('now' in window.performance === false) { + var offset = window.performance.timing && window.performance.timing.navigationStart ? window.performance.timing.navigationStart + : Date.now(); -} + window.performance.now = function () { + return Date.now() - offset; + }; + } -var TWEEN = TWEEN || ( function () { +})(); + +var TWEEN = TWEEN || (function () { var _tweens = []; return { - REVISION: '12', - getAll: function () { return _tweens; @@ -43,42 +48,38 @@ var TWEEN = TWEEN || ( function () { }, - add: function ( tween ) { + add: function (tween) { - _tweens.push( tween ); + _tweens.push(tween); }, - remove: function ( tween ) { + remove: function (tween) { - var i = _tweens.indexOf( tween ); - - if ( i !== -1 ) { - - _tweens.splice( i, 1 ); + var i = _tweens.indexOf(tween); + if (i !== -1) { + _tweens.splice(i, 1); } }, - update: function ( time ) { + update: function (time) { - if ( _tweens.length === 0 ) return false; + if (_tweens.length === 0) { + return false; + } var i = 0; - time = time !== undefined ? time : ( typeof window !== 'undefined' && window.performance !== undefined && window.performance.now !== undefined ? window.performance.now() : Date.now() ); + time = time !== undefined ? time : window.performance.now(); - while ( i < _tweens.length ) { - - if ( _tweens[ i ].update( time ) ) { + while (i < _tweens.length) { + if (_tweens[i].update(time)) { i++; - } else { - - _tweens.splice( i, 1 ); - + _tweens.splice(i, 1); } } @@ -88,9 +89,9 @@ var TWEEN = TWEEN || ( function () { } }; -} )(); +})(); -TWEEN.Tween = function ( object ) { +TWEEN.Tween = function (object) { var _object = object; var _valuesStart = {}; @@ -110,20 +111,17 @@ TWEEN.Tween = function ( object ) { var _onStartCallbackFired = false; var _onUpdateCallback = null; var _onCompleteCallback = null; + var _onStopCallback = null; // Set all starting values present on the target object - for ( var field in object ) { - - _valuesStart[ field ] = parseFloat(object[field], 10); - + for (var field in object) { + _valuesStart[field] = parseFloat(object[field], 10); } - this.to = function ( properties, duration ) { - - if ( duration !== undefined ) { + this.to = function (properties, duration) { + if (duration !== undefined) { _duration = duration; - } _valuesEnd = properties; @@ -132,40 +130,44 @@ TWEEN.Tween = function ( object ) { }; - this.start = function ( time ) { + this.start = function (time) { - TWEEN.add( this ); + TWEEN.add(this); _isPlaying = true; _onStartCallbackFired = false; - _startTime = time !== undefined ? time : ( typeof window !== 'undefined' && window.performance !== undefined && window.performance.now !== undefined ? window.performance.now() : Date.now() ); + _startTime = time !== undefined ? time : window.performance.now(); _startTime += _delayTime; - for ( var property in _valuesEnd ) { + for (var property in _valuesEnd) { - // check if an Array was provided as property value - if ( _valuesEnd[ property ] instanceof Array ) { - - if ( _valuesEnd[ property ].length === 0 ) { + // Check if an Array was provided as property value + if (_valuesEnd[property] instanceof Array) { + if (_valuesEnd[property].length === 0) { continue; - } - // create a local copy of the Array with the start value at the front - _valuesEnd[ property ] = [ _object[ property ] ].concat( _valuesEnd[ property ] ); + // Create a local copy of the Array with the start value at the front + _valuesEnd[property] = [_object[property]].concat(_valuesEnd[property]); + + } + // If `to()` specifies a property that doesn't exist in the source object, + // we should not set that property in the object + if (_valuesStart[property] === undefined) { + continue; } - _valuesStart[ property ] = _object[ property ]; + _valuesStart[property] = _object[property]; - if( ( _valuesStart[ property ] instanceof Array ) === false ) { - _valuesStart[ property ] *= 1.0; // Ensures we're using numbers, not strings + if ((_valuesStart[property] instanceof Array) === false) { + _valuesStart[property] *= 1.0; // Ensures we're using numbers, not strings } - _valuesStartRepeat[ property ] = _valuesStart[ property ] || 0; + _valuesStartRepeat[property] = _valuesStart[property] || 0; } @@ -175,12 +177,17 @@ TWEEN.Tween = function ( object ) { this.stop = function () { - if ( !_isPlaying ) { + if (!_isPlaying) { return this; } - TWEEN.remove( this ); + TWEEN.remove(this); _isPlaying = false; + + if (_onStopCallback !== null) { + _onStopCallback.call(_object); + } + this.stopChainedTweens(); return this; @@ -188,29 +195,27 @@ TWEEN.Tween = function ( object ) { this.stopChainedTweens = function () { - for ( var i = 0, numChainedTweens = _chainedTweens.length; i < numChainedTweens; i++ ) { - - _chainedTweens[ i ].stop(); - + for (var i = 0, numChainedTweens = _chainedTweens.length; i < numChainedTweens; i++) { + _chainedTweens[i].stop(); } }; - this.delay = function ( amount ) { + this.delay = function (amount) { _delayTime = amount; return this; }; - this.repeat = function ( times ) { + this.repeat = function (times) { _repeat = times; return this; }; - this.yoyo = function( yoyo ) { + this.yoyo = function (yoyo) { _yoyo = yoyo; return this; @@ -218,14 +223,14 @@ TWEEN.Tween = function ( object ) { }; - this.easing = function ( easing ) { + this.easing = function (easing) { _easingFunction = easing; return this; }; - this.interpolation = function ( interpolation ) { + this.interpolation = function (interpolation) { _interpolationFunction = interpolation; return this; @@ -239,108 +244,126 @@ TWEEN.Tween = function ( object ) { }; - this.onStart = function ( callback ) { + this.onStart = function (callback) { _onStartCallback = callback; return this; }; - this.onUpdate = function ( callback ) { + this.onUpdate = function (callback) { _onUpdateCallback = callback; return this; }; - this.onComplete = function ( callback ) { + this.onComplete = function (callback) { _onCompleteCallback = callback; return this; }; - this.update = function ( time ) { - - var property; + this.onStop = function (callback) { - if ( time < _startTime ) { + _onStopCallback = callback; + return this; - return true; + }; - } + this.update = function (time) { - if ( _onStartCallbackFired === false ) { + var property; + var elapsed; + var value; - if ( _onStartCallback !== null ) { + if (time < _startTime) { + return true; + } - _onStartCallback.call( _object ); + if (_onStartCallbackFired === false) { + if (_onStartCallback !== null) { + _onStartCallback.call(_object); } _onStartCallbackFired = true; } - var elapsed = ( time - _startTime ) / _duration; + elapsed = (time - _startTime) / _duration; elapsed = elapsed > 1 ? 1 : elapsed; - var value = _easingFunction( elapsed ); + value = _easingFunction(elapsed); - for ( property in _valuesEnd ) { + for (property in _valuesEnd) { + + // Don't update properties that do not exist in the source object + if (_valuesStart[property] === undefined) { + continue; + } - var start = _valuesStart[ property ] || 0; - var end = _valuesEnd[ property ]; + var start = _valuesStart[property] || 0; + var end = _valuesEnd[property]; - if ( end instanceof Array ) { + if (end instanceof Array) { - _object[ property ] = _interpolationFunction( end, value ); + _object[property] = _interpolationFunction(end, value); } else { - // Parses relative end values with start as base (e.g.: +10, -3) - if ( typeof(end) === "string" ) { - end = start + parseFloat(end, 10); + // Parses relative end values with start as base (e.g.: +10, -3) + if (typeof (end) === 'string') { + + if (end.startsWith('+') || end.startsWith('-')) { + end = start + parseFloat(end, 10); + } else { + end = parseFloat(end, 10); + } } - // protect against non numeric properties. - if ( typeof(end) === "number" ) { - _object[ property ] = start + ( end - start ) * value; + // Protect against non numeric properties. + if (typeof (end) === 'number') { + _object[property] = start + (end - start) * value; } } } - if ( _onUpdateCallback !== null ) { - - _onUpdateCallback.call( _object, value ); - + if (_onUpdateCallback !== null) { + _onUpdateCallback.call(_object, value); } - if ( elapsed == 1 ) { + if (elapsed === 1) { - if ( _repeat > 0 ) { + if (_repeat > 0) { - if( isFinite( _repeat ) ) { + if (isFinite(_repeat)) { _repeat--; } - // reassign starting values, restart by making startTime = now - for( property in _valuesStartRepeat ) { + // Reassign starting values, restart by making startTime = now + for (property in _valuesStartRepeat) { - if ( typeof( _valuesEnd[ property ] ) === "string" ) { - _valuesStartRepeat[ property ] = _valuesStartRepeat[ property ] + parseFloat(_valuesEnd[ property ], 10); + if (typeof (_valuesEnd[property]) === 'string') { + _valuesStartRepeat[property] = _valuesStartRepeat[property] + parseFloat(_valuesEnd[property], 10); } if (_yoyo) { - var tmp = _valuesStartRepeat[ property ]; - _valuesStartRepeat[ property ] = _valuesEnd[ property ]; - _valuesEnd[ property ] = tmp; - _reversed = !_reversed; + var tmp = _valuesStartRepeat[property]; + + _valuesStartRepeat[property] = _valuesEnd[property]; + _valuesEnd[property] = tmp; } - _valuesStart[ property ] = _valuesStartRepeat[ property ]; + _valuesStart[property] = _valuesStartRepeat[property]; + + } + + if (_yoyo) { + _reversed = !_reversed; } _startTime = time + _delayTime; @@ -349,16 +372,14 @@ TWEEN.Tween = function ( object ) { } else { - if ( _onCompleteCallback !== null ) { - - _onCompleteCallback.call( _object ); - + if (_onCompleteCallback !== null) { + _onCompleteCallback.call(_object); } - for ( var i = 0, numChainedTweens = _chainedTweens.length; i < numChainedTweens; i++ ) { - - _chainedTweens[ i ].start( time ); - + for (var i = 0, numChainedTweens = _chainedTweens.length; i < numChainedTweens; i++) { + // Make the chained tweens start exactly at the time they should, + // even if the `update()` method was called way past the duration of the tween + _chainedTweens[i].start(_startTime + _duration); } return false; @@ -378,7 +399,7 @@ TWEEN.Easing = { Linear: { - None: function ( k ) { + None: function (k) { return k; @@ -388,22 +409,25 @@ TWEEN.Easing = { Quadratic: { - In: function ( k ) { + In: function (k) { return k * k; }, - Out: function ( k ) { + Out: function (k) { - return k * ( 2 - k ); + return k * (2 - k); }, - InOut: function ( k ) { + InOut: function (k) { - if ( ( k *= 2 ) < 1 ) return 0.5 * k * k; - return - 0.5 * ( --k * ( k - 2 ) - 1 ); + if ((k *= 2) < 1) { + return 0.5 * k * k; + } + + return - 0.5 * (--k * (k - 2) - 1); } @@ -411,22 +435,25 @@ TWEEN.Easing = { Cubic: { - In: function ( k ) { + In: function (k) { return k * k * k; }, - Out: function ( k ) { + Out: function (k) { return --k * k * k + 1; }, - InOut: function ( k ) { + InOut: function (k) { + + if ((k *= 2) < 1) { + return 0.5 * k * k * k; + } - if ( ( k *= 2 ) < 1 ) return 0.5 * k * k * k; - return 0.5 * ( ( k -= 2 ) * k * k + 2 ); + return 0.5 * ((k -= 2) * k * k + 2); } @@ -434,22 +461,25 @@ TWEEN.Easing = { Quartic: { - In: function ( k ) { + In: function (k) { return k * k * k * k; }, - Out: function ( k ) { + Out: function (k) { - return 1 - ( --k * k * k * k ); + return 1 - (--k * k * k * k); }, - InOut: function ( k ) { + InOut: function (k) { - if ( ( k *= 2 ) < 1) return 0.5 * k * k * k * k; - return - 0.5 * ( ( k -= 2 ) * k * k * k - 2 ); + if ((k *= 2) < 1) { + return 0.5 * k * k * k * k; + } + + return - 0.5 * ((k -= 2) * k * k * k - 2); } @@ -457,22 +487,25 @@ TWEEN.Easing = { Quintic: { - In: function ( k ) { + In: function (k) { return k * k * k * k * k; }, - Out: function ( k ) { + Out: function (k) { return --k * k * k * k * k + 1; }, - InOut: function ( k ) { + InOut: function (k) { + + if ((k *= 2) < 1) { + return 0.5 * k * k * k * k * k; + } - if ( ( k *= 2 ) < 1 ) return 0.5 * k * k * k * k * k; - return 0.5 * ( ( k -= 2 ) * k * k * k * k + 2 ); + return 0.5 * ((k -= 2) * k * k * k * k + 2); } @@ -480,21 +513,21 @@ TWEEN.Easing = { Sinusoidal: { - In: function ( k ) { + In: function (k) { - return 1 - Math.cos( k * Math.PI / 2 ); + return 1 - Math.cos(k * Math.PI / 2); }, - Out: function ( k ) { + Out: function (k) { - return Math.sin( k * Math.PI / 2 ); + return Math.sin(k * Math.PI / 2); }, - InOut: function ( k ) { + InOut: function (k) { - return 0.5 * ( 1 - Math.cos( Math.PI * k ) ); + return 0.5 * (1 - Math.cos(Math.PI * k)); } @@ -502,24 +535,33 @@ TWEEN.Easing = { Exponential: { - In: function ( k ) { + In: function (k) { - return k === 0 ? 0 : Math.pow( 1024, k - 1 ); + return k === 0 ? 0 : Math.pow(1024, k - 1); }, - Out: function ( k ) { + Out: function (k) { - return k === 1 ? 1 : 1 - Math.pow( 2, - 10 * k ); + return k === 1 ? 1 : 1 - Math.pow(2, - 10 * k); }, - InOut: function ( k ) { + InOut: function (k) { - if ( k === 0 ) return 0; - if ( k === 1 ) return 1; - if ( ( k *= 2 ) < 1 ) return 0.5 * Math.pow( 1024, k - 1 ); - return 0.5 * ( - Math.pow( 2, - 10 * ( k - 1 ) ) + 2 ); + if (k === 0) { + return 0; + } + + if (k === 1) { + return 1; + } + + if ((k *= 2) < 1) { + return 0.5 * Math.pow(1024, k - 1); + } + + return 0.5 * (- Math.pow(2, - 10 * (k - 1)) + 2); } @@ -527,22 +569,25 @@ TWEEN.Easing = { Circular: { - In: function ( k ) { + In: function (k) { - return 1 - Math.sqrt( 1 - k * k ); + return 1 - Math.sqrt(1 - k * k); }, - Out: function ( k ) { + Out: function (k) { - return Math.sqrt( 1 - ( --k * k ) ); + return Math.sqrt(1 - (--k * k)); }, - InOut: function ( k ) { + InOut: function (k) { + + if ((k *= 2) < 1) { + return - 0.5 * (Math.sqrt(1 - k * k) - 1); + } - if ( ( k *= 2 ) < 1) return - 0.5 * ( Math.sqrt( 1 - k * k) - 1); - return 0.5 * ( Math.sqrt( 1 - ( k -= 2) * k) + 1); + return 0.5 * (Math.sqrt(1 - (k -= 2) * k) + 1); } @@ -550,37 +595,82 @@ TWEEN.Easing = { Elastic: { - In: function ( k ) { + In: function (k) { - var s, a = 0.1, p = 0.4; - if ( k === 0 ) return 0; - if ( k === 1 ) return 1; - if ( !a || a < 1 ) { a = 1; s = p / 4; } - else s = p * Math.asin( 1 / a ) / ( 2 * Math.PI ); - return - ( a * Math.pow( 2, 10 * ( k -= 1 ) ) * Math.sin( ( k - s ) * ( 2 * Math.PI ) / p ) ); + var s; + var a = 0.1; + var p = 0.4; + + if (k === 0) { + return 0; + } + + if (k === 1) { + return 1; + } + + if (!a || a < 1) { + a = 1; + s = p / 4; + } else { + s = p * Math.asin(1 / a) / (2 * Math.PI); + } + + return - (a * Math.pow(2, 10 * (k -= 1)) * Math.sin((k - s) * (2 * Math.PI) / p)); }, - Out: function ( k ) { + Out: function (k) { - var s, a = 0.1, p = 0.4; - if ( k === 0 ) return 0; - if ( k === 1 ) return 1; - if ( !a || a < 1 ) { a = 1; s = p / 4; } - else s = p * Math.asin( 1 / a ) / ( 2 * Math.PI ); - return ( a * Math.pow( 2, - 10 * k) * Math.sin( ( k - s ) * ( 2 * Math.PI ) / p ) + 1 ); + var s; + var a = 0.1; + var p = 0.4; + + if (k === 0) { + return 0; + } + + if (k === 1) { + return 1; + } + + if (!a || a < 1) { + a = 1; + s = p / 4; + } else { + s = p * Math.asin(1 / a) / (2 * Math.PI); + } + + return (a * Math.pow(2, - 10 * k) * Math.sin((k - s) * (2 * Math.PI) / p) + 1); }, - InOut: function ( k ) { + InOut: function (k) { - var s, a = 0.1, p = 0.4; - if ( k === 0 ) return 0; - if ( k === 1 ) return 1; - if ( !a || a < 1 ) { a = 1; s = p / 4; } - else s = p * Math.asin( 1 / a ) / ( 2 * Math.PI ); - if ( ( k *= 2 ) < 1 ) return - 0.5 * ( a * Math.pow( 2, 10 * ( k -= 1 ) ) * Math.sin( ( k - s ) * ( 2 * Math.PI ) / p ) ); - return a * Math.pow( 2, -10 * ( k -= 1 ) ) * Math.sin( ( k - s ) * ( 2 * Math.PI ) / p ) * 0.5 + 1; + var s; + var a = 0.1; + var p = 0.4; + + if (k === 0) { + return 0; + } + + if (k === 1) { + return 1; + } + + if (!a || a < 1) { + a = 1; + s = p / 4; + } else { + s = p * Math.asin(1 / a) / (2 * Math.PI); + } + + if ((k *= 2) < 1) { + return - 0.5 * (a * Math.pow(2, 10 * (k -= 1)) * Math.sin((k - s) * (2 * Math.PI) / p)); + } + + return a * Math.pow(2, -10 * (k -= 1)) * Math.sin((k - s) * (2 * Math.PI) / p) * 0.5 + 1; } @@ -588,25 +678,31 @@ TWEEN.Easing = { Back: { - In: function ( k ) { + In: function (k) { var s = 1.70158; - return k * k * ( ( s + 1 ) * k - s ); + + return k * k * ((s + 1) * k - s); }, - Out: function ( k ) { + Out: function (k) { var s = 1.70158; - return --k * k * ( ( s + 1 ) * k + s ) + 1; + + return --k * k * ((s + 1) * k + s) + 1; }, - InOut: function ( k ) { + InOut: function (k) { var s = 1.70158 * 1.525; - if ( ( k *= 2 ) < 1 ) return 0.5 * ( k * k * ( ( s + 1 ) * k - s ) ); - return 0.5 * ( ( k -= 2 ) * k * ( ( s + 1 ) * k + s ) + 2 ); + + if ((k *= 2) < 1) { + return 0.5 * (k * k * ((s + 1) * k - s)); + } + + return 0.5 * ((k -= 2) * k * ((s + 1) * k + s) + 2); } @@ -614,38 +710,33 @@ TWEEN.Easing = { Bounce: { - In: function ( k ) { + In: function (k) { - return 1 - TWEEN.Easing.Bounce.Out( 1 - k ); + return 1 - TWEEN.Easing.Bounce.Out(1 - k); }, - Out: function ( k ) { - - if ( k < ( 1 / 2.75 ) ) { + Out: function (k) { + if (k < (1 / 2.75)) { return 7.5625 * k * k; - - } else if ( k < ( 2 / 2.75 ) ) { - - return 7.5625 * ( k -= ( 1.5 / 2.75 ) ) * k + 0.75; - - } else if ( k < ( 2.5 / 2.75 ) ) { - - return 7.5625 * ( k -= ( 2.25 / 2.75 ) ) * k + 0.9375; - + } else if (k < (2 / 2.75)) { + return 7.5625 * (k -= (1.5 / 2.75)) * k + 0.75; + } else if (k < (2.5 / 2.75)) { + return 7.5625 * (k -= (2.25 / 2.75)) * k + 0.9375; } else { - - return 7.5625 * ( k -= ( 2.625 / 2.75 ) ) * k + 0.984375; - + return 7.5625 * (k -= (2.625 / 2.75)) * k + 0.984375; } }, - InOut: function ( k ) { + InOut: function (k) { + + if (k < 0.5) { + return TWEEN.Easing.Bounce.In(k * 2) * 0.5; + } - if ( k < 0.5 ) return TWEEN.Easing.Bounce.In( k * 2 ) * 0.5; - return TWEEN.Easing.Bounce.Out( k * 2 - 1 ) * 0.5 + 0.5; + return TWEEN.Easing.Bounce.Out(k * 2 - 1) * 0.5 + 0.5; } @@ -655,45 +746,66 @@ TWEEN.Easing = { TWEEN.Interpolation = { - Linear: function ( v, k ) { + Linear: function (v, k) { - var m = v.length - 1, f = m * k, i = Math.floor( f ), fn = TWEEN.Interpolation.Utils.Linear; + var m = v.length - 1; + var f = m * k; + var i = Math.floor(f); + var fn = TWEEN.Interpolation.Utils.Linear; - if ( k < 0 ) return fn( v[ 0 ], v[ 1 ], f ); - if ( k > 1 ) return fn( v[ m ], v[ m - 1 ], m - f ); + if (k < 0) { + return fn(v[0], v[1], f); + } + + if (k > 1) { + return fn(v[m], v[m - 1], m - f); + } - return fn( v[ i ], v[ i + 1 > m ? m : i + 1 ], f - i ); + return fn(v[i], v[i + 1 > m ? m : i + 1], f - i); }, - Bezier: function ( v, k ) { + Bezier: function (v, k) { - var b = 0, n = v.length - 1, pw = Math.pow, bn = TWEEN.Interpolation.Utils.Bernstein, i; + var b = 0; + var n = v.length - 1; + var pw = Math.pow; + var bn = TWEEN.Interpolation.Utils.Bernstein; - for ( i = 0; i <= n; i++ ) { - b += pw( 1 - k, n - i ) * pw( k, i ) * v[ i ] * bn( n, i ); + for (var i = 0; i <= n; i++) { + b += pw(1 - k, n - i) * pw(k, i) * v[i] * bn(n, i); } return b; }, - CatmullRom: function ( v, k ) { + CatmullRom: function (v, k) { - var m = v.length - 1, f = m * k, i = Math.floor( f ), fn = TWEEN.Interpolation.Utils.CatmullRom; + var m = v.length - 1; + var f = m * k; + var i = Math.floor(f); + var fn = TWEEN.Interpolation.Utils.CatmullRom; - if ( v[ 0 ] === v[ m ] ) { + if (v[0] === v[m]) { - if ( k < 0 ) i = Math.floor( f = m * ( 1 + k ) ); + if (k < 0) { + i = Math.floor(f = m * (1 + k)); + } - return fn( v[ ( i - 1 + m ) % m ], v[ i ], v[ ( i + 1 ) % m ], v[ ( i + 2 ) % m ], f - i ); + return fn(v[(i - 1 + m) % m], v[i], v[(i + 1) % m], v[(i + 2) % m], f - i); } else { - if ( k < 0 ) return v[ 0 ] - ( fn( v[ 0 ], v[ 0 ], v[ 1 ], v[ 1 ], -f ) - v[ 0 ] ); - if ( k > 1 ) return v[ m ] - ( fn( v[ m ], v[ m ], v[ m - 1 ], v[ m - 1 ], f - m ) - v[ m ] ); + if (k < 0) { + return v[0] - (fn(v[0], v[0], v[1], v[1], -f) - v[0]); + } + + if (k > 1) { + return v[m] - (fn(v[m], v[m], v[m - 1], v[m - 1], f - m) - v[m]); + } - return fn( v[ i ? i - 1 : 0 ], v[ i ], v[ m < i + 1 ? m : i + 1 ], v[ m < i + 2 ? m : i + 2 ], f - i ); + return fn(v[i ? i - 1 : 0], v[i], v[m < i + 1 ? m : i + 1], v[m < i + 2 ? m : i + 2], f - i); } @@ -701,41 +813,78 @@ TWEEN.Interpolation = { Utils: { - Linear: function ( p0, p1, t ) { + Linear: function (p0, p1, t) { - return ( p1 - p0 ) * t + p0; + return (p1 - p0) * t + p0; }, - Bernstein: function ( n , i ) { + Bernstein: function (n, i) { var fc = TWEEN.Interpolation.Utils.Factorial; - return fc( n ) / fc( i ) / fc( n - i ); + + return fc(n) / fc(i) / fc(n - i); }, - Factorial: ( function () { + Factorial: (function () { - var a = [ 1 ]; + var a = [1]; - return function ( n ) { + return function (n) { - var s = 1, i; - if ( a[ n ] ) return a[ n ]; - for ( i = n; i > 1; i-- ) s *= i; - return a[ n ] = s; + var s = 1; + + if (a[n]) { + return a[n]; + } + + for (var i = n; i > 1; i--) { + s *= i; + } + + a[n] = s; + return s; }; - } )(), + })(), + + CatmullRom: function (p0, p1, p2, p3, t) { - CatmullRom: function ( p0, p1, p2, p3, t ) { + var v0 = (p2 - p0) * 0.5; + var v1 = (p3 - p1) * 0.5; + var t2 = t * t; + var t3 = t * t2; - var v0 = ( p2 - p0 ) * 0.5, v1 = ( p3 - p1 ) * 0.5, t2 = t * t, t3 = t * t2; - return ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( - 3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1; + return (2 * p1 - 2 * p2 + v0 + v1) * t3 + (- 3 * p1 + 3 * p2 - 2 * v0 - v1) * t2 + v0 * t + p1; } } }; + +// UMD (Universal Module Definition) +(function (root) { + + if (typeof define === 'function' && define.amd) { + + // AMD + define([], function () { + return TWEEN; + }); + + } else if (typeof module !== 'undefined' && typeof exports === 'object') { + + // Node.js + module.exports = TWEEN; + + } else if (root !== undefined) { + + // Global variable + root.TWEEN = TWEEN; + + } + +})(this); diff --git a/assets/js/templates.js b/assets/js/templates.js index 229095c5..c1048746 100644 --- a/assets/js/templates.js +++ b/assets/js/templates.js @@ -1,9 +1,9 @@ (function(t){ TEMPLATES = { 'comments-toggle': new t({code: function (c,p,i) { var t=this;t.b(i=i||"");t.b("");return t.fl(); },partials: {}, subs: { }}), - 'comments': new t({code: function (c,p,i) { var t=this;t.b(i=i||"");if(t.s(t.f("comments",c,p,1),c,p,0,13,202,"{{ }}")){t.rs(c,p,function(c,p,t){t.b("
  • ");t.b(t.v(t.f("user",c,p,0)));t.b("

    ");t.b(t.t(t.f("content",c,p,0)));t.b("