From 14a8d2f5b83a1ea28abbb490f6c94c43b4e1f960 Mon Sep 17 00:00:00 2001 From: Maximilian Hils Date: Tue, 9 Dec 2014 18:18:14 +0100 Subject: always use the app dispatcher --- web/src/flows.json | 2012 -------- web/src/js/actions.js | 35 +- web/src/js/app.js | 7 +- web/src/js/components/flowdetail.jsx.js | 2 +- web/src/js/components/mainview.jsx.js | 2 +- web/src/js/connection.js | 52 +- web/src/js/stores/flowstore.js | 69 +- web/src/vendor/bootstrap/bootstrap.css | 535 +- web/src/vendor/bootstrap/bootstrap.js | 566 ++- .../bootstrap/glyphicons-halflings-regular.svg | 2 +- web/src/vendor/qunit/qunit.css | 33 +- web/src/vendor/qunit/qunit.js | 1364 +++-- web/src/vendor/react-bootstrap/react-bootstrap.js | 5346 -------------------- web/src/vendor/react-router/react-router.js | 253 +- 14 files changed, 1865 insertions(+), 8413 deletions(-) delete mode 100644 web/src/flows.json delete mode 100644 web/src/vendor/react-bootstrap/react-bootstrap.js (limited to 'web/src') diff --git a/web/src/flows.json b/web/src/flows.json deleted file mode 100644 index bdbfd5cc..00000000 --- a/web/src/flows.json +++ /dev/null @@ -1,2012 +0,0 @@ -[{ - "request": { - "timestamp_end": 1410651311.107, - "timestamp_start": 1410651311.106, - "form_in": "relative", - "headers": [ - [ - "Host", - "news.ycombinator.com" - ], - [ - "User-Agent", - "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:32.0) Gecko/20100101 Firefox/32.0" - ], - [ - "Accept", - "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" - ], - [ - "Accept-Language", - "de,en-US;q=0.7,en;q=0.3" - ], - [ - "Accept-Encoding", - "gzip, deflate" - ], - [ - "Cookie", - "__cfduid=d0486ff404fe3beb320f15e958861aaea1410651010546" - ], - [ - "Connection", - "keep-alive" - ], - [ - "Pragma", - "no-cache" - ], - [ - "Cache-Control", - "no-cache" - ] - ], - "host": "news.ycombinator.com", - "form_out": "relative", - "path": "/", - "method": "GET", - "scheme": "https", - "port": 443, - "httpversion": [ - 1, - 1 - ] - }, - "server_conn": { - "timestamp_tcp_setup": 1410651311.055, - "state": [], - "timestamp_ssl_setup": 1410651311.096, - "sni": "news.ycombinator.com", - "timestamp_start": 1410651311.04, - "address": { - "use_ipv6": false, - "address": [ - "news.ycombinator.com", - 443 - ] - }, - "timestamp_end": null, - "source_address": { - "use_ipv6": false, - "address": [ - "192.168.1.117", - 63383 - ] - }, - "ssl_established": true - }, - "client_conn": { - "timestamp_start": 1410651310.36, - "address": { - "use_ipv6": false, - "address": [ - "127.0.0.1", - 63380 - ] - }, - "timestamp_ssl_setup": 1410651311.105, - "timestamp_end": null, - "clientcert": null, - "ssl_established": true - }, - "conntype": "http", - "version": [ - 0, - 11 - ], - "error": null, - "response": { - "code": 200, - "headers": [ - [ - "Server", - "cloudflare-nginx" - ], - [ - "Date", - "Sat, 13 Sep 2014 23:35:08 GMT" - ], - [ - "Content-Type", - "text/html; charset=utf-8" - ], - [ - "Transfer-Encoding", - "chunked" - ], - [ - "Connection", - "keep-alive" - ], - [ - "Vary", - "Accept-Encoding" - ], - [ - "Cache-Control", - "private" - ], - [ - "X-Frame-Options", - "DENY" - ], - [ - "Cache-Control", - "max-age=0" - ], - [ - "Strict-Transport-Security", - "max-age=31556900; includeSubDomains" - ], - [ - "CF-RAY", - "169828d0108e088d-FRA" - ], - [ - "Content-Encoding", - "gzip" - ] - ], - "timestamp_start": 1410651311.6, - "msg": "OK", - "timestamp_end": 1410651311.603, - "httpversion": [ - 1, - 1 - ] - } -}, -{ - "request": { - "timestamp_end": 1410651311.657, - "timestamp_start": 1410651311.653, - "form_in": "relative", - "headers": [ - [ - "Host", - "news.ycombinator.com" - ], - [ - "User-Agent", - "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:32.0) Gecko/20100101 Firefox/32.0" - ], - [ - "Accept", - "text/css,*/*;q=0.1" - ], - [ - "Accept-Language", - "de,en-US;q=0.7,en;q=0.3" - ], - [ - "Accept-Encoding", - "gzip, deflate" - ], - [ - "Referer", - "https://news.ycombinator.com/" - ], - [ - "Cookie", - "__cfduid=d0486ff404fe3beb320f15e958861aaea1410651010546" - ], - [ - "Connection", - "keep-alive" - ], - [ - "Pragma", - "no-cache" - ], - [ - "Cache-Control", - "no-cache" - ] - ], - "host": "news.ycombinator.com", - "form_out": "relative", - "path": "/news.css?IZYAdhDe5bN6BGyHv1jq", - "method": "GET", - "scheme": "https", - "port": 443, - "httpversion": [ - 1, - 1 - ] - }, - "server_conn": { - "timestamp_tcp_setup": 1410651311.055, - "state": [], - "timestamp_ssl_setup": 1410651311.096, - "sni": "news.ycombinator.com", - "timestamp_start": 1410651311.04, - "address": { - "use_ipv6": false, - "address": [ - "news.ycombinator.com", - 443 - ] - }, - "timestamp_end": null, - "source_address": { - "use_ipv6": false, - "address": [ - "192.168.1.117", - 63383 - ] - }, - "ssl_established": true - }, - "client_conn": { - "timestamp_start": 1410651310.36, - "address": { - "use_ipv6": false, - "address": [ - "127.0.0.1", - 63380 - ] - }, - "timestamp_ssl_setup": 1410651311.105, - "timestamp_end": null, - "clientcert": null, - "ssl_established": true - }, - "conntype": "http", - "version": [ - 0, - 11 - ], - "error": null, - "response": { - "code": 200, - "headers": [ - [ - "Server", - "cloudflare-nginx" - ], - [ - "Date", - "Sat, 13 Sep 2014 23:35:08 GMT" - ], - [ - "Content-Type", - "text/css" - ], - [ - "Transfer-Encoding", - "chunked" - ], - [ - "Connection", - "keep-alive" - ], - [ - "Last-Modified", - "Fri, 01 Aug 2014 04:27:14 GMT" - ], - [ - "Vary", - "Accept-Encoding" - ], - [ - "Expires", - "Mon, 29 Jul 2024 04:27:14 GMT" - ], - [ - "Cache-Control", - "max-age=311575926" - ], - [ - "Cache-Control", - "public" - ], - [ - "CF-RAY", - "169828d38096088d-FRA" - ], - [ - "Content-Encoding", - "gzip" - ] - ], - "timestamp_start": 1410651312.167, - "msg": "OK", - "timestamp_end": 1410651312.17, - "httpversion": [ - 1, - 1 - ] - } -}, -{ - "request": { - "timestamp_end": 1410651312.362, - "timestamp_start": 1410651312.359, - "form_in": "relative", - "headers": [ - [ - "Host", - "news.ycombinator.com" - ], - [ - "User-Agent", - "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:32.0) Gecko/20100101 Firefox/32.0" - ], - [ - "Accept", - "image/png,image/*;q=0.8,*/*;q=0.5" - ], - [ - "Accept-Language", - "de,en-US;q=0.7,en;q=0.3" - ], - [ - "Accept-Encoding", - "gzip, deflate" - ], - [ - "Referer", - "https://news.ycombinator.com/" - ], - [ - "Cookie", - "__cfduid=d0486ff404fe3beb320f15e958861aaea1410651010546" - ], - [ - "Connection", - "keep-alive" - ], - [ - "Pragma", - "no-cache" - ], - [ - "Cache-Control", - "no-cache" - ] - ], - "host": "news.ycombinator.com", - "form_out": "relative", - "path": "/s.gif", - "method": "GET", - "scheme": "https", - "port": 443, - "httpversion": [ - 1, - 1 - ] - }, - "server_conn": { - "timestamp_tcp_setup": 1410651312.303, - "state": [], - "timestamp_ssl_setup": 1410651312.349, - "sni": "news.ycombinator.com", - "timestamp_start": 1410651312.287, - "address": { - "use_ipv6": false, - "address": [ - "news.ycombinator.com", - 443 - ] - }, - "timestamp_end": null, - "source_address": { - "use_ipv6": false, - "address": [ - "192.168.1.117", - 63391 - ] - }, - "ssl_established": true - }, - "client_conn": { - "timestamp_start": 1410651312.193, - "address": { - "use_ipv6": false, - "address": [ - "127.0.0.1", - 63386 - ] - }, - "timestamp_ssl_setup": 1410651312.358, - "timestamp_end": null, - "clientcert": null, - "ssl_established": true - }, - "conntype": "http", - "version": [ - 0, - 11 - ], - "error": null, - "response": { - "code": 200, - "headers": [ - [ - "Server", - "cloudflare-nginx" - ], - [ - "Date", - "Sat, 13 Sep 2014 23:35:08 GMT" - ], - [ - "Content-Type", - "image/gif" - ], - [ - "Content-Length", - "43" - ], - [ - "Connection", - "keep-alive" - ], - [ - "Last-Modified", - "Tue, 12 Mar 2013 09:06:31 GMT" - ], - [ - "ETag", - "\"513ef017-2b\"" - ], - [ - "Expires", - "Fri, 31 Mar 2023 21:06:02 GMT" - ], - [ - "Cache-Control", - "public, max-age=269645454" - ], - [ - "CF-Cache-Status", - "HIT" - ], - [ - "Vary", - "Accept-Encoding" - ], - [ - "Accept-Ranges", - "bytes" - ], - [ - "CF-RAY", - "169828d7e771088d-FRA" - ] - ], - "timestamp_start": 1410651312.383, - "msg": "OK", - "timestamp_end": 1410651312.393, - "httpversion": [ - 1, - 1 - ] - } -}, -{ - "request": { - "timestamp_end": 1410651312.389, - "timestamp_start": 1410651312.368, - "form_in": "relative", - "headers": [ - [ - "Host", - "news.ycombinator.com" - ], - [ - "User-Agent", - "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:32.0) Gecko/20100101 Firefox/32.0" - ], - [ - "Accept", - "image/png,image/*;q=0.8,*/*;q=0.5" - ], - [ - "Accept-Language", - "de,en-US;q=0.7,en;q=0.3" - ], - [ - "Accept-Encoding", - "gzip, deflate" - ], - [ - "Referer", - "https://news.ycombinator.com/news.css?IZYAdhDe5bN6BGyHv1jq" - ], - [ - "Cookie", - "__cfduid=d0486ff404fe3beb320f15e958861aaea1410651010546" - ], - [ - "Connection", - "keep-alive" - ], - [ - "Pragma", - "no-cache" - ], - [ - "Cache-Control", - "no-cache" - ] - ], - "host": "news.ycombinator.com", - "form_out": "relative", - "path": "/grayarrow.gif", - "method": "GET", - "scheme": "https", - "port": 443, - "httpversion": [ - 1, - 1 - ] - }, - "server_conn": { - "timestamp_tcp_setup": 1410651312.307, - "state": [], - "timestamp_ssl_setup": 1410651312.355, - "sni": "news.ycombinator.com", - "timestamp_start": 1410651312.291, - "address": { - "use_ipv6": false, - "address": [ - "news.ycombinator.com", - 443 - ] - }, - "timestamp_end": null, - "source_address": { - "use_ipv6": false, - "address": [ - "192.168.1.117", - 63393 - ] - }, - "ssl_established": true - }, - "client_conn": { - "timestamp_start": 1410651312.2, - "address": { - "use_ipv6": false, - "address": [ - "127.0.0.1", - 63387 - ] - }, - "timestamp_ssl_setup": 1410651312.368, - "timestamp_end": null, - "clientcert": null, - "ssl_established": true - }, - "conntype": "http", - "version": [ - 0, - 11 - ], - "error": null, - "response": { - "code": 200, - "headers": [ - [ - "Server", - "cloudflare-nginx" - ], - [ - "Date", - "Sat, 13 Sep 2014 23:35:08 GMT" - ], - [ - "Content-Type", - "image/gif" - ], - [ - "Content-Length", - "111" - ], - [ - "Connection", - "keep-alive" - ], - [ - "Last-Modified", - "Tue, 12 Mar 2013 09:06:31 GMT" - ], - [ - "ETag", - "\"513ef017-6f\"" - ], - [ - "Expires", - "Sat, 01 Apr 2023 05:56:11 GMT" - ], - [ - "Cache-Control", - "public, max-age=269677263" - ], - [ - "CF-Cache-Status", - "HIT" - ], - [ - "Vary", - "Accept-Encoding" - ], - [ - "Accept-Ranges", - "bytes" - ], - [ - "CF-RAY", - "169828d81430088d-FRA" - ] - ], - "timestamp_start": 1410651312.409, - "msg": "OK", - "timestamp_end": 1410651312.412, - "httpversion": [ - 1, - 1 - ] - } -}, -{ - "request": { - "timestamp_end": 1410651312.386, - "timestamp_start": 1410651312.368, - "form_in": "relative", - "headers": [ - [ - "Host", - "news.ycombinator.com" - ], - [ - "User-Agent", - "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:32.0) Gecko/20100101 Firefox/32.0" - ], - [ - "Accept", - "image/png,image/*;q=0.8,*/*;q=0.5" - ], - [ - "Accept-Language", - "de,en-US;q=0.7,en;q=0.3" - ], - [ - "Accept-Encoding", - "gzip, deflate" - ], - [ - "Referer", - "https://news.ycombinator.com/" - ], - [ - "Cookie", - "__cfduid=d0486ff404fe3beb320f15e958861aaea1410651010546" - ], - [ - "Connection", - "keep-alive" - ], - [ - "Pragma", - "no-cache" - ], - [ - "Cache-Control", - "no-cache" - ] - ], - "host": "news.ycombinator.com", - "form_out": "relative", - "path": "/y18.gif", - "method": "GET", - "scheme": "https", - "port": 443, - "httpversion": [ - 1, - 1 - ] - }, - "server_conn": { - "timestamp_tcp_setup": 1410651312.303, - "state": [], - "timestamp_ssl_setup": 1410651312.355, - "sni": "news.ycombinator.com", - "timestamp_start": 1410651312.287, - "address": { - "use_ipv6": false, - "address": [ - "news.ycombinator.com", - 443 - ] - }, - "timestamp_end": null, - "source_address": { - "use_ipv6": false, - "address": [ - "192.168.1.117", - 63392 - ] - }, - "ssl_established": true - }, - "client_conn": { - "timestamp_start": 1410651312.192, - "address": { - "use_ipv6": false, - "address": [ - "127.0.0.1", - 63385 - ] - }, - "timestamp_ssl_setup": 1410651312.368, - "timestamp_end": null, - "clientcert": null, - "ssl_established": true - }, - "conntype": "http", - "version": [ - 0, - 11 - ], - "error": null, - "response": { - "code": 200, - "headers": [ - [ - "Server", - "cloudflare-nginx" - ], - [ - "Date", - "Sat, 13 Sep 2014 23:35:08 GMT" - ], - [ - "Content-Type", - "image/gif" - ], - [ - "Content-Length", - "100" - ], - [ - "Connection", - "keep-alive" - ], - [ - "Last-Modified", - "Tue, 12 Mar 2013 09:06:31 GMT" - ], - [ - "ETag", - "\"513ef017-64\"" - ], - [ - "Expires", - "Sat, 01 Apr 2023 04:28:54 GMT" - ], - [ - "Cache-Control", - "public, max-age=269672026" - ], - [ - "CF-Cache-Status", - "HIT" - ], - [ - "Vary", - "Accept-Encoding" - ], - [ - "Accept-Ranges", - "bytes" - ], - [ - "CF-RAY", - "169828d8109a088d-FRA" - ] - ], - "timestamp_start": 1410651312.413, - "msg": "OK", - "timestamp_end": 1410651312.416, - "httpversion": [ - 1, - 1 - ] - } -}, -{ - "request": { - "timestamp_end": 1410651373.965, - "timestamp_start": 1410651373.963, - "form_in": "absolute", - "headers": [ - [ - "Host", - "mitmproxy.org" - ], - [ - "User-Agent", - "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:32.0) Gecko/20100101 Firefox/32.0" - ], - [ - "Accept", - "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" - ], - [ - "Accept-Language", - "de,en-US;q=0.7,en;q=0.3" - ], - [ - "Accept-Encoding", - "gzip, deflate" - ], - [ - "Connection", - "keep-alive" - ] - ], - "host": "mitmproxy.org", - "form_out": "relative", - "path": "/", - "method": "GET", - "scheme": "http", - "port": 80, - "httpversion": [ - 1, - 1 - ] - }, - "server_conn": { - "timestamp_tcp_setup": 1410651374.189, - "state": [], - "timestamp_ssl_setup": null, - "sni": null, - "timestamp_start": 1410651373.985, - "address": { - "use_ipv6": false, - "address": [ - "mitmproxy.org", - 80 - ] - }, - "timestamp_end": null, - "source_address": { - "use_ipv6": false, - "address": [ - "192.168.1.117", - 63404 - ] - }, - "ssl_established": false - }, - "client_conn": { - "timestamp_start": 1410651373.958, - "address": { - "use_ipv6": false, - "address": [ - "127.0.0.1", - 63403 - ] - }, - "timestamp_ssl_setup": null, - "timestamp_end": null, - "clientcert": null, - "ssl_established": false - }, - "conntype": "http", - "version": [ - 0, - 11 - ], - "error": null, - "response": { - "code": 200, - "headers": [ - [ - "Server", - "nginx/1.1.19" - ], - [ - "Date", - "Sat, 13 Sep 2014 23:36:10 GMT" - ], - [ - "Content-Type", - "text/html" - ], - [ - "Last-Modified", - "Wed, 26 Feb 2014 19:58:20 GMT" - ], - [ - "Transfer-Encoding", - "chunked" - ], - [ - "Connection", - "keep-alive" - ], - [ - "Vary", - "Accept-Encoding" - ], - [ - "Content-Encoding", - "gzip" - ] - ], - "timestamp_start": 1410651374.365, - "msg": "OK", - "timestamp_end": 1410651374.366, - "httpversion": [ - 1, - 1 - ] - } -}, -{ - "request": { - "timestamp_end": 1410651374.391, - "timestamp_start": 1410651374.387, - "form_in": "absolute", - "headers": [ - [ - "Host", - "mitmproxy.org" - ], - [ - "User-Agent", - "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:32.0) Gecko/20100101 Firefox/32.0" - ], - [ - "Accept", - "text/css,*/*;q=0.1" - ], - [ - "Accept-Language", - "de,en-US;q=0.7,en;q=0.3" - ], - [ - "Accept-Encoding", - "gzip, deflate" - ], - [ - "Referer", - "http://mitmproxy.org/" - ], - [ - "Connection", - "keep-alive" - ] - ], - "host": "mitmproxy.org", - "form_out": "relative", - "path": "/01-bootstrap.min.css", - "method": "GET", - "scheme": "http", - "port": 80, - "httpversion": [ - 1, - 1 - ] - }, - "server_conn": { - "timestamp_tcp_setup": 1410651374.189, - "state": [], - "timestamp_ssl_setup": null, - "sni": null, - "timestamp_start": 1410651373.985, - "address": { - "use_ipv6": false, - "address": [ - "mitmproxy.org", - 80 - ] - }, - "timestamp_end": null, - "source_address": { - "use_ipv6": false, - "address": [ - "192.168.1.117", - 63404 - ] - }, - "ssl_established": false - }, - "client_conn": { - "timestamp_start": 1410651373.958, - "address": { - "use_ipv6": false, - "address": [ - "127.0.0.1", - 63403 - ] - }, - "timestamp_ssl_setup": null, - "timestamp_end": null, - "clientcert": null, - "ssl_established": false - }, - "conntype": "http", - "version": [ - 0, - 11 - ], - "error": null, - "response": { - "code": 200, - "headers": [ - [ - "Server", - "nginx/1.1.19" - ], - [ - "Date", - "Sat, 13 Sep 2014 23:36:10 GMT" - ], - [ - "Content-Type", - "text/css" - ], - [ - "Last-Modified", - "Wed, 26 Feb 2014 19:58:20 GMT" - ], - [ - "Transfer-Encoding", - "chunked" - ], - [ - "Connection", - "keep-alive" - ], - [ - "Vary", - "Accept-Encoding" - ], - [ - "Content-Encoding", - "gzip" - ] - ], - "timestamp_start": 1410651374.579, - "msg": "OK", - "timestamp_end": 1410651374.58, - "httpversion": [ - 1, - 1 - ] - } -}, -{ - "request": { - "timestamp_end": 1410651374.396, - "timestamp_start": 1410651374.394, - "form_in": "absolute", - "headers": [ - [ - "Host", - "mitmproxy.org" - ], - [ - "User-Agent", - "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:32.0) Gecko/20100101 Firefox/32.0" - ], - [ - "Accept", - "text/css,*/*;q=0.1" - ], - [ - "Accept-Language", - "de,en-US;q=0.7,en;q=0.3" - ], - [ - "Accept-Encoding", - "gzip, deflate" - ], - [ - "Referer", - "http://mitmproxy.org/" - ], - [ - "Connection", - "keep-alive" - ] - ], - "host": "mitmproxy.org", - "form_out": "relative", - "path": "/03-sitestyle.css", - "method": "GET", - "scheme": "http", - "port": 80, - "httpversion": [ - 1, - 1 - ] - }, - "server_conn": { - "timestamp_tcp_setup": 1410651374.567, - "state": [], - "timestamp_ssl_setup": null, - "sni": null, - "timestamp_start": 1410651374.401, - "address": { - "use_ipv6": false, - "address": [ - "mitmproxy.org", - 80 - ] - }, - "timestamp_end": null, - "source_address": { - "use_ipv6": false, - "address": [ - "192.168.1.117", - 63407 - ] - }, - "ssl_established": false - }, - "client_conn": { - "timestamp_start": 1410651374.389, - "address": { - "use_ipv6": false, - "address": [ - "127.0.0.1", - 63405 - ] - }, - "timestamp_ssl_setup": null, - "timestamp_end": null, - "clientcert": null, - "ssl_established": false - }, - "conntype": "http", - "version": [ - 0, - 11 - ], - "error": null, - "response": { - "code": 200, - "headers": [ - [ - "Server", - "nginx/1.1.19" - ], - [ - "Date", - "Sat, 13 Sep 2014 23:36:11 GMT" - ], - [ - "Content-Type", - "text/css" - ], - [ - "Content-Length", - "124" - ], - [ - "Last-Modified", - "Wed, 26 Feb 2014 19:58:20 GMT" - ], - [ - "Connection", - "keep-alive" - ], - [ - "Accept-Ranges", - "bytes" - ] - ], - "timestamp_start": 1410651374.746, - "msg": "OK", - "timestamp_end": 1410651374.747, - "httpversion": [ - 1, - 1 - ] - } -}, -{ - "request": { - "timestamp_end": 1410651374.795, - "timestamp_start": 1410651374.793, - "form_in": "absolute", - "headers": [ - [ - "Host", - "www.google-analytics.com" - ], - [ - "User-Agent", - "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:32.0) Gecko/20100101 Firefox/32.0" - ], - [ - "Accept", - "*/*" - ], - [ - "Accept-Language", - "de,en-US;q=0.7,en;q=0.3" - ], - [ - "Accept-Encoding", - "gzip, deflate" - ], - [ - "Referer", - "http://mitmproxy.org/" - ], - [ - "Connection", - "keep-alive" - ] - ], - "host": "www.google-analytics.com", - "form_out": "relative", - "path": "/ga.js", - "method": "GET", - "scheme": "http", - "port": 80, - "httpversion": [ - 1, - 1 - ] - }, - "server_conn": { - "timestamp_tcp_setup": 1410651374.99, - "state": [], - "timestamp_ssl_setup": null, - "sni": null, - "timestamp_start": 1410651374.974, - "address": { - "use_ipv6": false, - "address": [ - "www.google-analytics.com", - 80 - ] - }, - "timestamp_end": null, - "source_address": { - "use_ipv6": false, - "address": [ - "192.168.1.117", - 63409 - ] - }, - "ssl_established": false - }, - "client_conn": { - "timestamp_start": 1410651374.389, - "address": { - "use_ipv6": false, - "address": [ - "127.0.0.1", - 63405 - ] - }, - "timestamp_ssl_setup": null, - "timestamp_end": null, - "clientcert": null, - "ssl_established": false - }, - "conntype": "http", - "version": [ - 0, - 11 - ], - "error": null, - "response": { - "code": 200, - "headers": [ - [ - "Date", - "Sat, 13 Sep 2014 22:02:27 GMT" - ], - [ - "Expires", - "Sun, 14 Sep 2014 00:02:27 GMT" - ], - [ - "Last-Modified", - "Mon, 08 Sep 2014 18:50:13 GMT" - ], - [ - "X-Content-Type-Options", - "nosniff" - ], - [ - "Content-Type", - "text/javascript" - ], - [ - "Vary", - "Accept-Encoding" - ], - [ - "Content-Encoding", - "gzip" - ], - [ - "Server", - "Golfe2" - ], - [ - "Content-Length", - "16062" - ], - [ - "Age", - "5624" - ], - [ - "Cache-Control", - "public, max-age=7200" - ], - [ - "Alternate-Protocol", - "80:quic,p=0.002" - ] - ], - "timestamp_start": 1410651375.013, - "msg": "OK", - "timestamp_end": 1410651375.015, - "httpversion": [ - 1, - 1 - ] - } -}, -{ - "request": { - "timestamp_end": 1410651375.084, - "timestamp_start": 1410651375.078, - "form_in": "absolute", - "headers": [ - [ - "Host", - "www.google-analytics.com" - ], - [ - "User-Agent", - "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:32.0) Gecko/20100101 Firefox/32.0" - ], - [ - "Accept", - "image/png,image/*;q=0.8,*/*;q=0.5" - ], - [ - "Accept-Language", - "de,en-US;q=0.7,en;q=0.3" - ], - [ - "Accept-Encoding", - "gzip, deflate" - ], - [ - "Referer", - "http://mitmproxy.org/" - ], - [ - "Connection", - "keep-alive" - ] - ], - "host": "www.google-analytics.com", - "form_out": "relative", - "path": "/__utm.gif?utmwv=5.5.7&utms=1&utmn=1242429522&utmhn=mitmproxy.org&utmcs=UTF-8&utmsr=1536x864&utmvp=1091x742&utmsc=24-bit&utmul=de&utmje=1&utmfl=15.0%20r0&utmdt=mitmproxy%20-%20home&utmhid=812953117&utmr=-&utmp=%2F&utmht=1410651375077&utmac=UA-4150636-13&utmcc=__utma%3D30234659.1711188806.1410651375.1410651375.1410651375.1%3B%2B__utmz%3D30234659.1410651375.1.1.utmcsr%3D(direct)%7Cutmccn%3D(direct)%7Cutmcmd%3D(none)%3B&utmu=q~", - "method": "GET", - "scheme": "http", - "port": 80, - "httpversion": [ - 1, - 1 - ] - }, - "server_conn": { - "timestamp_tcp_setup": 1410651374.99, - "state": [], - "timestamp_ssl_setup": null, - "sni": null, - "timestamp_start": 1410651374.974, - "address": { - "use_ipv6": false, - "address": [ - "www.google-analytics.com", - 80 - ] - }, - "timestamp_end": null, - "source_address": { - "use_ipv6": false, - "address": [ - "192.168.1.117", - 63409 - ] - }, - "ssl_established": false - }, - "client_conn": { - "timestamp_start": 1410651374.389, - "address": { - "use_ipv6": false, - "address": [ - "127.0.0.1", - 63405 - ] - }, - "timestamp_ssl_setup": null, - "timestamp_end": null, - "clientcert": null, - "ssl_established": false - }, - "conntype": "http", - "version": [ - 0, - 11 - ], - "error": null, - "response": { - "code": 200, - "headers": [ - [ - "Pragma", - "no-cache" - ], - [ - "Expires", - "Wed, 19 Apr 2000 11:43:00 GMT" - ], - [ - "Last-Modified", - "Wed, 21 Jan 2004 19:51:30 GMT" - ], - [ - "X-Content-Type-Options", - "nosniff" - ], - [ - "Content-Type", - "image/gif" - ], - [ - "Date", - "Thu, 04 Sep 2014 18:39:58 GMT" - ], - [ - "Server", - "Golfe2" - ], - [ - "Content-Length", - "35" - ], - [ - "Age", - "795373" - ], - [ - "Cache-Control", - "private, no-cache, no-cache=Set-Cookie, proxy-revalidate" - ], - [ - "Alternate-Protocol", - "80:quic,p=0.002" - ] - ], - "timestamp_start": 1410651375.104, - "msg": "OK", - "timestamp_end": 1410651375.107, - "httpversion": [ - 1, - 1 - ] - } -}, -{ - "request": { - "timestamp_end": 1410651374.778, - "timestamp_start": 1410651374.766, - "form_in": "absolute", - "headers": [ - [ - "Host", - "mitmproxy.org" - ], - [ - "User-Agent", - "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:32.0) Gecko/20100101 Firefox/32.0" - ], - [ - "Accept", - "image/png,image/*;q=0.8,*/*;q=0.5" - ], - [ - "Accept-Language", - "de,en-US;q=0.7,en;q=0.3" - ], - [ - "Accept-Encoding", - "gzip, deflate" - ], - [ - "Referer", - "http://mitmproxy.org/" - ], - [ - "Connection", - "keep-alive" - ] - ], - "host": "mitmproxy.org", - "form_out": "relative", - "path": "/images/apple.png", - "method": "GET", - "scheme": "http", - "port": 80, - "httpversion": [ - 1, - 1 - ] - }, - "server_conn": { - "timestamp_tcp_setup": 1410651374.952, - "state": [], - "timestamp_ssl_setup": null, - "sni": null, - "timestamp_start": 1410651374.782, - "address": { - "use_ipv6": false, - "address": [ - "mitmproxy.org", - 80 - ] - }, - "timestamp_end": null, - "source_address": { - "use_ipv6": false, - "address": [ - "192.168.1.117", - 63408 - ] - }, - "ssl_established": false - }, - "client_conn": { - "timestamp_start": 1410651374.39, - "address": { - "use_ipv6": false, - "address": [ - "127.0.0.1", - 63406 - ] - }, - "timestamp_ssl_setup": null, - "timestamp_end": null, - "clientcert": null, - "ssl_established": false - }, - "conntype": "http", - "version": [ - 0, - 11 - ], - "error": null, - "response": { - "code": 200, - "headers": [ - [ - "Server", - "nginx/1.1.19" - ], - [ - "Date", - "Sat, 13 Sep 2014 23:36:11 GMT" - ], - [ - "Content-Type", - "image/png" - ], - [ - "Content-Length", - "20532" - ], - [ - "Last-Modified", - "Wed, 26 Feb 2014 19:58:20 GMT" - ], - [ - "Connection", - "keep-alive" - ], - [ - "Accept-Ranges", - "bytes" - ] - ], - "timestamp_start": 1410651375.125, - "msg": "OK", - "timestamp_end": 1410651375.126, - "httpversion": [ - 1, - 1 - ] - } -}, -{ - "request": { - "timestamp_end": 1410651374.778, - "timestamp_start": 1410651374.766, - "form_in": "absolute", - "headers": [ - [ - "Host", - "mitmproxy.org" - ], - [ - "User-Agent", - "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:32.0) Gecko/20100101 Firefox/32.0" - ], - [ - "Accept", - "image/png,image/*;q=0.8,*/*;q=0.5" - ], - [ - "Accept-Language", - "de,en-US;q=0.7,en;q=0.3" - ], - [ - "Accept-Encoding", - "gzip, deflate" - ], - [ - "Referer", - "http://mitmproxy.org/" - ], - [ - "Connection", - "keep-alive" - ] - ], - "host": "mitmproxy.org", - "form_out": "relative", - "path": "/images/mitmproxy-small.png", - "method": "GET", - "scheme": "http", - "port": 80, - "httpversion": [ - 1, - 1 - ] - }, - "server_conn": { - "timestamp_tcp_setup": 1410651374.189, - "state": [], - "timestamp_ssl_setup": null, - "sni": null, - "timestamp_start": 1410651373.985, - "address": { - "use_ipv6": false, - "address": [ - "mitmproxy.org", - 80 - ] - }, - "timestamp_end": null, - "source_address": { - "use_ipv6": false, - "address": [ - "192.168.1.117", - 63404 - ] - }, - "ssl_established": false - }, - "client_conn": { - "timestamp_start": 1410651373.958, - "address": { - "use_ipv6": false, - "address": [ - "127.0.0.1", - 63403 - ] - }, - "timestamp_ssl_setup": null, - "timestamp_end": null, - "clientcert": null, - "ssl_established": false - }, - "conntype": "http", - "version": [ - 0, - 11 - ], - "error": null, - "response": { - "code": 200, - "headers": [ - [ - "Server", - "nginx/1.1.19" - ], - [ - "Date", - "Sat, 13 Sep 2014 23:36:11 GMT" - ], - [ - "Content-Type", - "image/png" - ], - [ - "Content-Length", - "170108" - ], - [ - "Last-Modified", - "Wed, 26 Feb 2014 19:58:20 GMT" - ], - [ - "Connection", - "keep-alive" - ], - [ - "Accept-Ranges", - "bytes" - ] - ], - "timestamp_start": 1410651374.953, - "msg": "OK", - "timestamp_end": 1410651374.954, - "httpversion": [ - 1, - 1 - ] - } -}, -{ - "request": { - "timestamp_end": 1410651376.078, - "timestamp_start": 1410651376.075, - "form_in": "absolute", - "headers": [ - [ - "Host", - "mitmproxy.org" - ], - [ - "User-Agent", - "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:32.0) Gecko/20100101 Firefox/32.0" - ], - [ - "Accept", - "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" - ], - [ - "Accept-Language", - "de,en-US;q=0.7,en;q=0.3" - ], - [ - "Accept-Encoding", - "gzip, deflate" - ], - [ - "Cookie", - "__utma=30234659.1711188806.1410651375.1410651375.1410651375.1; __utmb=30234659.1.10.1410651375; __utmc=30234659; __utmz=30234659.1410651375.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)" - ], - [ - "Connection", - "keep-alive" - ] - ], - "host": "mitmproxy.org", - "form_out": "relative", - "path": "/favicon.ico", - "method": "GET", - "scheme": "http", - "port": 80, - "httpversion": [ - 1, - 1 - ] - }, - "server_conn": { - "timestamp_tcp_setup": 1410651374.189, - "state": [], - "timestamp_ssl_setup": null, - "sni": null, - "timestamp_start": 1410651373.985, - "address": { - "use_ipv6": false, - "address": [ - "mitmproxy.org", - 80 - ] - }, - "timestamp_end": null, - "source_address": { - "use_ipv6": false, - "address": [ - "192.168.1.117", - 63404 - ] - }, - "ssl_established": false - }, - "client_conn": { - "timestamp_start": 1410651373.958, - "address": { - "use_ipv6": false, - "address": [ - "127.0.0.1", - 63403 - ] - }, - "timestamp_ssl_setup": null, - "timestamp_end": null, - "clientcert": null, - "ssl_established": false - }, - "conntype": "http", - "version": [ - 0, - 11 - ], - "error": null, - "response": { - "code": 404, - "headers": [ - [ - "Server", - "nginx/1.1.19" - ], - [ - "Date", - "Sat, 13 Sep 2014 23:36:12 GMT" - ], - [ - "Content-Type", - "text/html" - ], - [ - "Content-Length", - "169" - ], - [ - "Connection", - "keep-alive" - ] - ], - "timestamp_start": 1410651376.254, - "msg": "Not Found", - "timestamp_end": 1410651376.255, - "httpversion": [ - 1, - 1 - ] - } -}, -{ - "request": { - "timestamp_end": 1410651376.282, - "timestamp_start": 1410651376.279, - "form_in": "absolute", - "headers": [ - [ - "Host", - "mitmproxy.org" - ], - [ - "User-Agent", - "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:32.0) Gecko/20100101 Firefox/32.0" - ], - [ - "Accept", - "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" - ], - [ - "Accept-Language", - "de,en-US;q=0.7,en;q=0.3" - ], - [ - "Accept-Encoding", - "gzip, deflate" - ], - [ - "Cookie", - "__utma=30234659.1711188806.1410651375.1410651375.1410651375.1; __utmb=30234659.1.10.1410651375; __utmc=30234659; __utmz=30234659.1410651375.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)" - ], - [ - "Connection", - "keep-alive" - ] - ], - "host": "mitmproxy.org", - "form_out": "relative", - "path": "/favicon.ico", - "method": "GET", - "scheme": "http", - "port": 80, - "httpversion": [ - 1, - 1 - ] - }, - "server_conn": { - "timestamp_tcp_setup": 1410651374.189, - "state": [], - "timestamp_ssl_setup": null, - "sni": null, - "timestamp_start": 1410651373.985, - "address": { - "use_ipv6": false, - "address": [ - "mitmproxy.org", - 80 - ] - }, - "timestamp_end": null, - "source_address": { - "use_ipv6": false, - "address": [ - "192.168.1.117", - 63404 - ] - }, - "ssl_established": false - }, - "client_conn": { - "timestamp_start": 1410651373.958, - "address": { - "use_ipv6": false, - "address": [ - "127.0.0.1", - 63403 - ] - }, - "timestamp_ssl_setup": null, - "timestamp_end": null, - "clientcert": null, - "ssl_established": false - }, - "conntype": "http", - "version": [ - 0, - 11 - ], - "error": null, - "response": { - "code": 404, - "headers": [ - [ - "Server", - "nginx/1.1.19" - ], - [ - "Date", - "Sat, 13 Sep 2014 23:36:12 GMT" - ], - [ - "Content-Type", - "text/html" - ], - [ - "Content-Length", - "169" - ], - [ - "Connection", - "keep-alive" - ] - ], - "timestamp_start": 1410651376.461, - "msg": "Not Found", - "timestamp_end": 1410651376.462, - "httpversion": [ - 1, - 1 - ] - } -}] \ No newline at end of file diff --git a/web/src/js/actions.js b/web/src/js/actions.js index 3e7510ad..28bb58b8 100644 --- a/web/src/js/actions.js +++ b/web/src/js/actions.js @@ -1,13 +1,38 @@ var ActionTypes = { - //Settings + // Connection + CONNECTION_OPEN: "connection_open", + CONNECTION_CLOSE: "connection_close", + CONNECTION_ERROR: "connection_error", + + // Settings UPDATE_SETTINGS: "update_settings", - //EventLog + // EventLog ADD_EVENT: "add_event", - //Flow + // Flow ADD_FLOW: "add_flow", UPDATE_FLOW: "update_flow", + REMOVE_FLOW: "remove_flow", + RESET_FLOWS: "reset_flows", +}; + +var ConnectionActions = { + open: function () { + AppDispatcher.dispatchViewAction({ + type: ActionTypes.CONNECTION_OPEN + }); + }, + close: function () { + AppDispatcher.dispatchViewAction({ + type: ActionTypes.CONNECTION_CLOSE + }); + }, + error: function () { + AppDispatcher.dispatchViewAction({ + type: ActionTypes.CONNECTION_ERROR + }); + } }; var SettingsActions = { @@ -23,7 +48,7 @@ var SettingsActions = { } }; -var event_id = 0; +var EventLogActions_event_id = 0; var EventLogActions = { add_event: function (message) { AppDispatcher.dispatchViewAction({ @@ -31,7 +56,7 @@ var EventLogActions = { data: { message: message, level: "web", - id: "viewAction-" + event_id++ + id: "viewAction-" + EventLogActions_event_id++ } }); } diff --git a/web/src/js/app.js b/web/src/js/app.js index b5d50d34..5146cb46 100644 --- a/web/src/js/app.js +++ b/web/src/js/app.js @@ -1,10 +1,7 @@ $(function () { + window.ws = new Connection("/updates"); + ReactRouter.run(routes, function (Handler) { React.render(, document.body); }); - var UpdateConnection = new Connection("/updates"); - UpdateConnection.onmessage = function (message) { - var m = JSON.parse(message.data); - AppDispatcher.dispatchServerAction(m); - }; }); \ No newline at end of file diff --git a/web/src/js/components/flowdetail.jsx.js b/web/src/js/components/flowdetail.jsx.js index 2bda5b80..6d46cd2e 100644 --- a/web/src/js/components/flowdetail.jsx.js +++ b/web/src/js/components/flowdetail.jsx.js @@ -306,7 +306,7 @@ var FlowDetail = React.createClass({ return tabs; }, nextTab: function (i) { - var tabs = this.getTabs(); + var tabs = this.getTabs(this.props.flow); var currentIndex = tabs.indexOf(this.getParams().detailTab); // JS modulo operator doesn't correct negative numbers, make sure that we are positive. var nextIndex = (currentIndex + i + tabs.length) % tabs.length; diff --git a/web/src/js/components/mainview.jsx.js b/web/src/js/components/mainview.jsx.js index d5066b1a..c7c9ee9b 100644 --- a/web/src/js/components/mainview.jsx.js +++ b/web/src/js/components/mainview.jsx.js @@ -24,7 +24,7 @@ var MainView = React.createClass({ this.forceUpdate(); var selected = this.getSelected(); if(selected){ - this.refs.flowTable.scrollIntoView(); + this.refs.flowTable.scrollIntoView(selected); } }, onUpdate: function (flow) { diff --git a/web/src/js/connection.js b/web/src/js/connection.js index d511270d..6ca353b3 100644 --- a/web/src/js/connection.js +++ b/web/src/js/connection.js @@ -1,38 +1,24 @@ function Connection(url) { - if (url[0] != "/") { - this.url = url; - } else { - this.url = location.origin.replace("http", "ws") + url; + + if (url[0] === "/") { + url = location.origin.replace("http", "ws") + url; } - var ws = new WebSocket(this.url); + + var ws = new WebSocket(url); ws.onopen = function () { - this.onopen.apply(this, arguments); - }.bind(this); - ws.onmessage = function () { - this.onmessage.apply(this, arguments); - }.bind(this); + ConnectionActions.open(); + }; + ws.onmessage = function (message) { + var m = JSON.parse(message.data); + AppDispatcher.dispatchServerAction(m); + }; ws.onerror = function () { - this.onerror.apply(this, arguments); - }.bind(this); + ConnectionActions.error(); + EventLogActions.add_event("WebSocket connection error."); + }; ws.onclose = function () { - this.onclose.apply(this, arguments); - }.bind(this); - this.ws = ws; -} -Connection.prototype.onopen = function (open) { - console.debug("onopen", this, arguments); -}; -Connection.prototype.onmessage = function (message) { - console.warn("onmessage (not implemented)", this, message.data); -}; -Connection.prototype.onerror = function (error) { - EventLogActions.add_event("WebSocket Connection Error."); - console.debug("onerror", this, arguments); -}; -Connection.prototype.onclose = function (close) { - EventLogActions.add_event("WebSocket Connection closed."); - console.debug("onclose", this, arguments); -}; -Connection.prototype.close = function () { - this.ws.close(); -}; \ No newline at end of file + ConnectionActions.close(); + EventLogActions.add_event("WebSocket connection closed."); + }; + return ws; +} \ No newline at end of file diff --git a/web/src/js/stores/flowstore.js b/web/src/js/stores/flowstore.js index 1034bd53..4110ea7f 100644 --- a/web/src/js/stores/flowstore.js +++ b/web/src/js/stores/flowstore.js @@ -1,4 +1,4 @@ -function FlowStore(endpoint) { +function FlowStore() { this._views = []; this.reset(); } @@ -43,21 +43,46 @@ _.extend(FlowStore.prototype, { }); -function LiveFlowStore(endpoint) { +function LiveFlowStore() { FlowStore.call(this); this.updates_before_fetch = undefined; this._fetchxhr = false; - this.endpoint = endpoint || "/flows"; - this.conn = new Connection(this.endpoint + "/updates"); - this.conn.onopen = this._onopen.bind(this); - this.conn.onmessage = function (e) { - var message = JSON.parse(e.data); - this.handle_update(message.type, message.data); - }.bind(this); + + this.handle = this.handle.bind(this); + AppDispatcher.register(this.handle); + + // Avoid double-fetch on startup. + if(!(window.ws && window.ws.readyState === WebSocket.CONNECTING)) { + this.fetch(); + } } _.extend(LiveFlowStore.prototype, FlowStore.prototype, { + handle: function (event) { + switch (event.type) { + case ActionTypes.CONNECTION_OPEN: + case ActionTypes.RESET_FLOWS: + this.fetch(); + break; + case ActionTypes.ADD_FLOW: + case ActionTypes.UPDATE_FLOW: + case ActionTypes.REMOVE_FLOW: + if (this.updates_before_fetch) { + console.log("defer update", type, data); + this.updates_before_fetch.push(event); + } else { + if(event.type === ActionTypes.ADD_FLOW){ + this.add(event.data); + } else if (event.type === ActionTypes.UPDATE_FLOW){ + this.update(event.data); + } else { + this.remove(event.data); + } + } + break; + } + }, close: function () { - this.conn.close(); + AppDispatcher.unregister(this.handle); }, add: function (flow) { // Make sure that deferred adds don't add an element twice. @@ -65,32 +90,14 @@ _.extend(LiveFlowStore.prototype, FlowStore.prototype, { FlowStore.prototype.add.call(this, flow); } }, - _onopen: function () { - //Update stream openend, fetch list of flows. - console.log("Update Connection opened, fetching flows..."); - this.fetch(); - }, fetch: function () { + console.log("fetch"); if (this._fetchxhr) { this._fetchxhr.abort(); } - this._fetchxhr = $.getJSON(this.endpoint, this.handle_fetch.bind(this)); + this._fetchxhr = $.getJSON("/flows", this.handle_fetch.bind(this)); this.updates_before_fetch = []; // (JS: empty array is true) }, - handle_update: function (type, data) { - console.log("LiveFlowStore.handle_update", type, data); - - if (type === "reset") { - return this.fetch(); - } - - if (this.updates_before_fetch) { - console.log("defer update", type, data); - this.updates_before_fetch.push(arguments); - } else { - this[type](data); - } - }, handle_fetch: function (data) { this._fetchxhr = false; console.log("Flows fetched.", this.updates_before_fetch); @@ -98,7 +105,7 @@ _.extend(LiveFlowStore.prototype, FlowStore.prototype, { var updates = this.updates_before_fetch; this.updates_before_fetch = false; for (var i = 0; i < updates.length; i++) { - this.handle_update.apply(this, updates[i]); + this.handle(updates[i]); } }, }); diff --git a/web/src/vendor/bootstrap/bootstrap.css b/web/src/vendor/bootstrap/bootstrap.css index 037dd056..c6f3d210 100644 --- a/web/src/vendor/bootstrap/bootstrap.css +++ b/web/src/vendor/bootstrap/bootstrap.css @@ -1,10 +1,10 @@ /*! - * Bootstrap v3.2.0 (http://getbootstrap.com) + * Bootstrap v3.3.1 (http://getbootstrap.com) * Copyright 2011-2014 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) */ -/*! normalize.css v3.0.1 | MIT License | git.io/normalize */ +/*! normalize.css v3.0.2 | MIT License | git.io/normalize */ html { font-family: sans-serif; -webkit-text-size-adjust: 100%; @@ -22,6 +22,7 @@ footer, header, hgroup, main, +menu, nav, section, summary { @@ -43,7 +44,7 @@ template { display: none; } a { - background: transparent; + background-color: transparent; } a:active, a:hover { @@ -187,8 +188,11 @@ td, th { padding: 0; } +/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ @media print { - * { + *, + *:before, + *:after { color: #000 !important; text-shadow: none !important; background: transparent !important; @@ -205,8 +209,8 @@ th { abbr[title]:after { content: " (" attr(title) ")"; } - a[href^="javascript:"]:after, - a[href^="#"]:after { + a[href^="#"]:after, + a[href^="javascript:"]:after { content: ""; } pre, @@ -241,10 +245,6 @@ th { .navbar { display: none; } - .table td, - .table th { - background-color: #fff !important; - } .btn > .caret, .dropup > .btn > .caret { border-top-color: #000 !important; @@ -255,6 +255,10 @@ th { .table { border-collapse: collapse !important; } + .table td, + .table th { + background-color: #fff !important; + } .table-bordered th, .table-bordered td { border: 1px solid #ddd !important; @@ -284,7 +288,8 @@ th { .glyphicon-plus:before { content: "\2b"; } -.glyphicon-euro:before { +.glyphicon-euro:before, +.glyphicon-eur:before { content: "\20ac"; } .glyphicon-minus:before { @@ -910,12 +915,12 @@ textarea { line-height: inherit; } a { - color: #428bca; + color: #337ab7; text-decoration: none; } a:hover, a:focus { - color: #2a6496; + color: #23527c; text-decoration: underline; } a:focus { @@ -935,7 +940,6 @@ img { .carousel-inner > .item > img, .carousel-inner > .item > a > img { display: block; - width: 100% \9; max-width: 100%; height: auto; } @@ -944,7 +948,6 @@ img { } .img-thumbnail { display: inline-block; - width: 100% \9; max-width: 100%; height: auto; padding: 4px; @@ -1117,9 +1120,6 @@ small, .small { font-size: 85%; } -cite { - font-style: normal; -} mark, .mark { padding: .2em; @@ -1153,10 +1153,10 @@ mark, color: #777; } .text-primary { - color: #428bca; + color: #337ab7; } a.text-primary:hover { - color: #3071a9; + color: #286090; } .text-success { color: #3c763d; @@ -1184,10 +1184,10 @@ a.text-danger:hover { } .bg-primary { color: #fff; - background-color: #428bca; + background-color: #337ab7; } a.bg-primary:hover { - background-color: #3071a9; + background-color: #286090; } .bg-success { background-color: #dff0d8; @@ -1328,10 +1328,6 @@ blockquote.pull-right small:after, blockquote.pull-right .small:after { content: '\00A0 \2014'; } -blockquote:before, -blockquote:after { - content: ""; -} address { margin-bottom: 20px; font-style: normal; @@ -1362,6 +1358,7 @@ kbd { kbd kbd { padding: 0; font-size: 100%; + font-weight: bold; -webkit-box-shadow: none; box-shadow: none; } @@ -2060,6 +2057,12 @@ pre code { table { background-color: transparent; } +caption { + padding-top: 8px; + padding-bottom: 8px; + color: #777; + text-align: left; +} th { text-align: left; } @@ -2120,12 +2123,10 @@ th { .table-bordered > thead > tr > td { border-bottom-width: 2px; } -.table-striped > tbody > tr:nth-child(odd) > td, -.table-striped > tbody > tr:nth-child(odd) > th { +.table-striped > tbody > tr:nth-child(odd) { background-color: #f9f9f9; } -.table-hover > tbody > tr:hover > td, -.table-hover > tbody > tr:hover > th { +.table-hover > tbody > tr:hover { background-color: #f5f5f5; } table col[class*="col-"] { @@ -2244,13 +2245,15 @@ table th[class*="col-"] { .table-hover > tbody > tr.danger:hover > th { background-color: #ebcccc; } +.table-responsive { + min-height: .01%; + overflow-x: auto; +} @media screen and (max-width: 767px) { .table-responsive { width: 100%; margin-bottom: 15px; - overflow-x: auto; overflow-y: hidden; - -webkit-overflow-scrolling: touch; -ms-overflow-style: -ms-autohiding-scrollbar; border: 1px solid #ddd; } @@ -2375,14 +2378,14 @@ output { box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); } .form-control::-moz-placeholder { - color: #777; + color: #999; opacity: 1; } .form-control:-ms-input-placeholder { - color: #777; + color: #999; } .form-control::-webkit-input-placeholder { - color: #777; + color: #999; } .form-control[disabled], .form-control[readonly], @@ -2397,24 +2400,25 @@ textarea.form-control { input[type="search"] { -webkit-appearance: none; } -input[type="date"], -input[type="time"], -input[type="datetime-local"], -input[type="month"] { - line-height: 34px; - line-height: 1.42857143 \0; -} -input[type="date"].input-sm, -input[type="time"].input-sm, -input[type="datetime-local"].input-sm, -input[type="month"].input-sm { - line-height: 30px; -} -input[type="date"].input-lg, -input[type="time"].input-lg, -input[type="datetime-local"].input-lg, -input[type="month"].input-lg { - line-height: 46px; +@media screen and (-webkit-min-device-pixel-ratio: 0) { + input[type="date"], + input[type="time"], + input[type="datetime-local"], + input[type="month"] { + line-height: 34px; + } + input[type="date"].input-sm, + input[type="time"].input-sm, + input[type="datetime-local"].input-sm, + input[type="month"].input-sm { + line-height: 30px; + } + input[type="date"].input-lg, + input[type="time"].input-lg, + input[type="datetime-local"].input-lg, + input[type="month"].input-lg { + line-height: 46px; + } } .form-group { margin-bottom: 15px; @@ -2423,12 +2427,12 @@ input[type="month"].input-lg { .checkbox { position: relative; display: block; - min-height: 20px; margin-top: 10px; margin-bottom: 10px; } .radio label, .checkbox label { + min-height: 20px; padding-left: 20px; margin-bottom: 0; font-weight: normal; @@ -2491,35 +2495,41 @@ fieldset[disabled] .checkbox label { padding-left: 0; } .input-sm, -.form-horizontal .form-group-sm .form-control { +.form-group-sm .form-control { height: 30px; padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } -select.input-sm { +select.input-sm, +select.form-group-sm .form-control { height: 30px; line-height: 30px; } textarea.input-sm, -select[multiple].input-sm { +textarea.form-group-sm .form-control, +select[multiple].input-sm, +select[multiple].form-group-sm .form-control { height: auto; } .input-lg, -.form-horizontal .form-group-lg .form-control { +.form-group-lg .form-control { height: 46px; padding: 10px 16px; font-size: 18px; line-height: 1.33; border-radius: 6px; } -select.input-lg { +select.input-lg, +select.form-group-lg .form-control { height: 46px; line-height: 46px; } textarea.input-lg, -select[multiple].input-lg { +textarea.form-group-lg .form-control, +select[multiple].input-lg, +select[multiple].form-group-lg .form-control { height: auto; } .has-feedback { @@ -2530,7 +2540,7 @@ select[multiple].input-lg { } .form-control-feedback { position: absolute; - top: 25px; + top: 0; right: 0; z-index: 2; display: block; @@ -2538,6 +2548,7 @@ select[multiple].input-lg { height: 34px; line-height: 34px; text-align: center; + pointer-events: none; } .input-lg + .form-control-feedback { width: 46px; @@ -2554,7 +2565,11 @@ select[multiple].input-lg { .has-success .radio, .has-success .checkbox, .has-success .radio-inline, -.has-success .checkbox-inline { +.has-success .checkbox-inline, +.has-success.radio label, +.has-success.checkbox label, +.has-success.radio-inline label, +.has-success.checkbox-inline label { color: #3c763d; } .has-success .form-control { @@ -2580,7 +2595,11 @@ select[multiple].input-lg { .has-warning .radio, .has-warning .checkbox, .has-warning .radio-inline, -.has-warning .checkbox-inline { +.has-warning .checkbox-inline, +.has-warning.radio label, +.has-warning.checkbox label, +.has-warning.radio-inline label, +.has-warning.checkbox-inline label { color: #8a6d3b; } .has-warning .form-control { @@ -2606,7 +2625,11 @@ select[multiple].input-lg { .has-error .radio, .has-error .checkbox, .has-error .radio-inline, -.has-error .checkbox-inline { +.has-error .checkbox-inline, +.has-error.radio label, +.has-error.checkbox label, +.has-error.radio-inline label, +.has-error.checkbox-inline label { color: #a94442; } .has-error .form-control { @@ -2627,6 +2650,9 @@ select[multiple].input-lg { .has-error .form-control-feedback { color: #a94442; } +.has-feedback label ~ .form-control-feedback { + top: 25px; +} .has-feedback label.sr-only ~ .form-control-feedback { top: 0; } @@ -2647,6 +2673,9 @@ select[multiple].input-lg { width: auto; vertical-align: middle; } + .form-inline .form-control-static { + display: inline-block; + } .form-inline .input-group { display: inline-table; vertical-align: middle; @@ -2707,7 +2736,6 @@ select[multiple].input-lg { } } .form-horizontal .has-feedback .form-control-feedback { - top: 0; right: 15px; } @media (min-width: 768px) { @@ -2730,6 +2758,8 @@ select[multiple].input-lg { text-align: center; white-space: nowrap; vertical-align: middle; + -ms-touch-action: manipulation; + touch-action: manipulation; cursor: pointer; -webkit-user-select: none; -moz-user-select: none; @@ -2741,13 +2771,17 @@ select[multiple].input-lg { } .btn:focus, .btn:active:focus, -.btn.active:focus { +.btn.active:focus, +.btn.focus, +.btn:active.focus, +.btn.active.focus { outline: thin dotted; outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } .btn:hover, -.btn:focus { +.btn:focus, +.btn.focus { color: #333; text-decoration: none; } @@ -2775,6 +2809,7 @@ fieldset[disabled] .btn { } .btn-default:hover, .btn-default:focus, +.btn-default.focus, .btn-default:active, .btn-default.active, .open > .dropdown-toggle.btn-default { @@ -2796,6 +2831,9 @@ fieldset[disabled] .btn-default:hover, .btn-default.disabled:focus, .btn-default[disabled]:focus, fieldset[disabled] .btn-default:focus, +.btn-default.disabled.focus, +.btn-default[disabled].focus, +fieldset[disabled] .btn-default.focus, .btn-default.disabled:active, .btn-default[disabled]:active, fieldset[disabled] .btn-default:active, @@ -2811,17 +2849,18 @@ fieldset[disabled] .btn-default.active { } .btn-primary { color: #fff; - background-color: #428bca; - border-color: #357ebd; + background-color: #337ab7; + border-color: #2e6da4; } .btn-primary:hover, .btn-primary:focus, +.btn-primary.focus, .btn-primary:active, .btn-primary.active, .open > .dropdown-toggle.btn-primary { color: #fff; - background-color: #3071a9; - border-color: #285e8e; + background-color: #286090; + border-color: #204d74; } .btn-primary:active, .btn-primary.active, @@ -2837,17 +2876,20 @@ fieldset[disabled] .btn-primary:hover, .btn-primary.disabled:focus, .btn-primary[disabled]:focus, fieldset[disabled] .btn-primary:focus, +.btn-primary.disabled.focus, +.btn-primary[disabled].focus, +fieldset[disabled] .btn-primary.focus, .btn-primary.disabled:active, .btn-primary[disabled]:active, fieldset[disabled] .btn-primary:active, .btn-primary.disabled.active, .btn-primary[disabled].active, fieldset[disabled] .btn-primary.active { - background-color: #428bca; - border-color: #357ebd; + background-color: #337ab7; + border-color: #2e6da4; } .btn-primary .badge { - color: #428bca; + color: #337ab7; background-color: #fff; } .btn-success { @@ -2857,6 +2899,7 @@ fieldset[disabled] .btn-primary.active { } .btn-success:hover, .btn-success:focus, +.btn-success.focus, .btn-success:active, .btn-success.active, .open > .dropdown-toggle.btn-success { @@ -2878,6 +2921,9 @@ fieldset[disabled] .btn-success:hover, .btn-success.disabled:focus, .btn-success[disabled]:focus, fieldset[disabled] .btn-success:focus, +.btn-success.disabled.focus, +.btn-success[disabled].focus, +fieldset[disabled] .btn-success.focus, .btn-success.disabled:active, .btn-success[disabled]:active, fieldset[disabled] .btn-success:active, @@ -2898,6 +2944,7 @@ fieldset[disabled] .btn-success.active { } .btn-info:hover, .btn-info:focus, +.btn-info.focus, .btn-info:active, .btn-info.active, .open > .dropdown-toggle.btn-info { @@ -2919,6 +2966,9 @@ fieldset[disabled] .btn-info:hover, .btn-info.disabled:focus, .btn-info[disabled]:focus, fieldset[disabled] .btn-info:focus, +.btn-info.disabled.focus, +.btn-info[disabled].focus, +fieldset[disabled] .btn-info.focus, .btn-info.disabled:active, .btn-info[disabled]:active, fieldset[disabled] .btn-info:active, @@ -2939,6 +2989,7 @@ fieldset[disabled] .btn-info.active { } .btn-warning:hover, .btn-warning:focus, +.btn-warning.focus, .btn-warning:active, .btn-warning.active, .open > .dropdown-toggle.btn-warning { @@ -2960,6 +3011,9 @@ fieldset[disabled] .btn-warning:hover, .btn-warning.disabled:focus, .btn-warning[disabled]:focus, fieldset[disabled] .btn-warning:focus, +.btn-warning.disabled.focus, +.btn-warning[disabled].focus, +fieldset[disabled] .btn-warning.focus, .btn-warning.disabled:active, .btn-warning[disabled]:active, fieldset[disabled] .btn-warning:active, @@ -2980,6 +3034,7 @@ fieldset[disabled] .btn-warning.active { } .btn-danger:hover, .btn-danger:focus, +.btn-danger.focus, .btn-danger:active, .btn-danger.active, .open > .dropdown-toggle.btn-danger { @@ -3001,6 +3056,9 @@ fieldset[disabled] .btn-danger:hover, .btn-danger.disabled:focus, .btn-danger[disabled]:focus, fieldset[disabled] .btn-danger:focus, +.btn-danger.disabled.focus, +.btn-danger[disabled].focus, +fieldset[disabled] .btn-danger.focus, .btn-danger.disabled:active, .btn-danger[disabled]:active, fieldset[disabled] .btn-danger:active, @@ -3016,12 +3074,12 @@ fieldset[disabled] .btn-danger.active { } .btn-link { font-weight: normal; - color: #428bca; - cursor: pointer; + color: #337ab7; border-radius: 0; } .btn-link, .btn-link:active, +.btn-link.active, .btn-link[disabled], fieldset[disabled] .btn-link { background-color: transparent; @@ -3036,7 +3094,7 @@ fieldset[disabled] .btn-link { } .btn-link:hover, .btn-link:focus { - color: #2a6496; + color: #23527c; text-decoration: underline; background-color: transparent; } @@ -3091,9 +3149,11 @@ input[type="button"].btn-block { } .collapse { display: none; + visibility: hidden; } .collapse.in { display: block; + visibility: visible; } tr.collapse.in { display: table-row; @@ -3105,9 +3165,15 @@ tbody.collapse.in { position: relative; height: 0; overflow: hidden; - -webkit-transition: height .35s ease; - -o-transition: height .35s ease; - transition: height .35s ease; + -webkit-transition-timing-function: ease; + -o-transition-timing-function: ease; + transition-timing-function: ease; + -webkit-transition-duration: .35s; + -o-transition-duration: .35s; + transition-duration: .35s; + -webkit-transition-property: height, visibility; + -o-transition-property: height, visibility; + transition-property: height, visibility; } .caret { display: inline-block; @@ -3177,7 +3243,7 @@ tbody.collapse.in { .dropdown-menu > .active > a:focus { color: #fff; text-decoration: none; - background-color: #428bca; + background-color: #337ab7; outline: 0; } .dropdown-menu > .disabled > a, @@ -3270,10 +3336,6 @@ tbody.collapse.in { .btn-group-vertical > .btn.active { z-index: 2; } -.btn-group > .btn:focus, -.btn-group-vertical > .btn:focus { - outline: 0; -} .btn-group .btn + .btn, .btn-group .btn + .btn-group, .btn-group .btn-group + .btn, @@ -3413,12 +3475,13 @@ tbody.collapse.in { .btn-group-justified > .btn-group .dropdown-menu { left: auto; } -[data-toggle="buttons"] > .btn > input[type="radio"], -[data-toggle="buttons"] > .btn > input[type="checkbox"] { +[data-toggle="buttons"] > .btn input[type="radio"], +[data-toggle="buttons"] > .btn-group > .btn input[type="radio"], +[data-toggle="buttons"] > .btn input[type="checkbox"], +[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { position: absolute; - z-index: -1; - filter: alpha(opacity=0); - opacity: 0; + clip: rect(0, 0, 0, 0); + pointer-events: none; } .input-group { position: relative; @@ -3607,7 +3670,7 @@ select[multiple].input-group-sm > .input-group-btn > .btn { .nav .open > a:hover, .nav .open > a:focus { background-color: #eee; - border-color: #428bca; + border-color: #337ab7; } .nav .nav-divider { height: 1px; @@ -3700,7 +3763,7 @@ select[multiple].input-group-sm > .input-group-btn > .btn { .nav-pills > li.active > a:hover, .nav-pills > li.active > a:focus { color: #fff; - background-color: #428bca; + background-color: #337ab7; } .nav-stacked > li { float: none; @@ -3757,9 +3820,11 @@ select[multiple].input-group-sm > .input-group-btn > .btn { } .tab-content > .tab-pane { display: none; + visibility: hidden; } .tab-content > .active { display: block; + visibility: visible; } .nav-tabs .dropdown-menu { margin-top: -1px; @@ -3806,6 +3871,7 @@ select[multiple].input-group-sm > .input-group-btn > .btn { height: auto !important; padding-bottom: 0; overflow: visible !important; + visibility: visible !important; } .navbar-collapse.in { overflow-y: visible; @@ -3821,7 +3887,7 @@ select[multiple].input-group-sm > .input-group-btn > .btn { .navbar-fixed-bottom .navbar-collapse { max-height: 340px; } -@media (max-width: 480px) and (orientation: landscape) { +@media (max-device-width: 480px) and (orientation: landscape) { .navbar-fixed-top .navbar-collapse, .navbar-fixed-bottom .navbar-collapse { max-height: 200px; @@ -3858,9 +3924,6 @@ select[multiple].input-group-sm > .input-group-btn > .btn { right: 0; left: 0; z-index: 1030; - -webkit-transform: translate3d(0, 0, 0); - -o-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); } @media (min-width: 768px) { .navbar-fixed-top, @@ -3888,6 +3951,9 @@ select[multiple].input-group-sm > .input-group-btn > .btn { .navbar-brand:focus { text-decoration: none; } +.navbar-brand > img { + display: block; +} @media (min-width: 768px) { .navbar > .container .navbar-brand, .navbar > .container-fluid .navbar-brand { @@ -3966,17 +4032,6 @@ select[multiple].input-group-sm > .input-group-btn > .btn { padding-top: 15px; padding-bottom: 15px; } - .navbar-nav.navbar-right:last-child { - margin-right: -15px; - } -} -@media (min-width: 768px) { - .navbar-left { - float: left !important; - } - .navbar-right { - float: right !important; - } } .navbar-form { padding: 10px 15px; @@ -4000,6 +4055,9 @@ select[multiple].input-group-sm > .input-group-btn > .btn { width: auto; vertical-align: middle; } + .navbar-form .form-control-static { + display: inline-block; + } .navbar-form .input-group { display: inline-table; vertical-align: middle; @@ -4040,6 +4098,9 @@ select[multiple].input-group-sm > .input-group-btn > .btn { .navbar-form .form-group { margin-bottom: 5px; } + .navbar-form .form-group:last-child { + margin-bottom: 0; + } } @media (min-width: 768px) { .navbar-form { @@ -4052,9 +4113,6 @@ select[multiple].input-group-sm > .input-group-btn > .btn { -webkit-box-shadow: none; box-shadow: none; } - .navbar-form.navbar-right:last-child { - margin-right: -15px; - } } .navbar-nav > li > .dropdown-menu { margin-top: 0; @@ -4062,6 +4120,8 @@ select[multiple].input-group-sm > .input-group-btn > .btn { border-top-right-radius: 0; } .navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { + border-top-left-radius: 4px; + border-top-right-radius: 4px; border-bottom-right-radius: 0; border-bottom-left-radius: 0; } @@ -4087,7 +4147,16 @@ select[multiple].input-group-sm > .input-group-btn > .btn { margin-right: 15px; margin-left: 15px; } - .navbar-text.navbar-right:last-child { +} +@media (min-width: 768px) { + .navbar-left { + float: left !important; + } + .navbar-right { + float: right !important; + margin-right: -15px; + } + .navbar-right ~ .navbar-right { margin-right: 0; } } @@ -4192,7 +4261,7 @@ fieldset[disabled] .navbar-default .btn-link:focus { border-color: #080808; } .navbar-inverse .navbar-brand { - color: #777; + color: #9d9d9d; } .navbar-inverse .navbar-brand:hover, .navbar-inverse .navbar-brand:focus { @@ -4200,10 +4269,10 @@ fieldset[disabled] .navbar-default .btn-link:focus { background-color: transparent; } .navbar-inverse .navbar-text { - color: #777; + color: #9d9d9d; } .navbar-inverse .navbar-nav > li > a { - color: #777; + color: #9d9d9d; } .navbar-inverse .navbar-nav > li > a:hover, .navbar-inverse .navbar-nav > li > a:focus { @@ -4250,7 +4319,7 @@ fieldset[disabled] .navbar-default .btn-link:focus { background-color: #080808; } .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { - color: #777; + color: #9d9d9d; } .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { @@ -4271,13 +4340,13 @@ fieldset[disabled] .navbar-default .btn-link:focus { } } .navbar-inverse .navbar-link { - color: #777; + color: #9d9d9d; } .navbar-inverse .navbar-link:hover { color: #fff; } .navbar-inverse .btn-link { - color: #777; + color: #9d9d9d; } .navbar-inverse .btn-link:hover, .navbar-inverse .btn-link:focus { @@ -4323,7 +4392,7 @@ fieldset[disabled] .navbar-inverse .btn-link:focus { padding: 6px 12px; margin-left: -1px; line-height: 1.42857143; - color: #428bca; + color: #337ab7; text-decoration: none; background-color: #fff; border: 1px solid #ddd; @@ -4343,7 +4412,7 @@ fieldset[disabled] .navbar-inverse .btn-link:focus { .pagination > li > span:hover, .pagination > li > a:focus, .pagination > li > span:focus { - color: #2a6496; + color: #23527c; background-color: #eee; border-color: #ddd; } @@ -4356,8 +4425,8 @@ fieldset[disabled] .navbar-inverse .btn-link:focus { z-index: 2; color: #fff; cursor: default; - background-color: #428bca; - border-color: #428bca; + background-color: #337ab7; + border-color: #337ab7; } .pagination > .disabled > span, .pagination > .disabled > span:hover, @@ -4471,11 +4540,11 @@ a.label:focus { background-color: #5e5e5e; } .label-primary { - background-color: #428bca; + background-color: #337ab7; } .label-primary[href]:hover, .label-primary[href]:focus { - background-color: #3071a9; + background-color: #286090; } .label-success { background-color: #5cb85c; @@ -4536,16 +4605,22 @@ a.badge:focus { text-decoration: none; cursor: pointer; } -a.list-group-item.active > .badge, +.list-group-item.active > .badge, .nav-pills > .active > a > .badge { - color: #428bca; + color: #337ab7; background-color: #fff; } +.list-group-item > .badge { + float: right; +} +.list-group-item > .badge + .badge { + margin-right: 5px; +} .nav-pills > li > a > .badge { margin-left: 3px; } .jumbotron { - padding: 30px; + padding: 30px 15px; margin-bottom: 30px; color: inherit; background-color: #eee; @@ -4562,7 +4637,8 @@ a.list-group-item.active > .badge, .jumbotron > hr { border-top-color: #d5d5d5; } -.container .jumbotron { +.container .jumbotron, +.container-fluid .jumbotron { border-radius: 6px; } .jumbotron .container { @@ -4570,10 +4646,10 @@ a.list-group-item.active > .badge, } @media screen and (min-width: 768px) { .jumbotron { - padding-top: 48px; - padding-bottom: 48px; + padding: 48px 0; } - .container .jumbotron { + .container .jumbotron, + .container-fluid .jumbotron { padding-right: 60px; padding-left: 60px; } @@ -4590,9 +4666,9 @@ a.list-group-item.active > .badge, background-color: #fff; border: 1px solid #ddd; border-radius: 4px; - -webkit-transition: all .2s ease-in-out; - -o-transition: all .2s ease-in-out; - transition: all .2s ease-in-out; + -webkit-transition: border .2s ease-in-out; + -o-transition: border .2s ease-in-out; + transition: border .2s ease-in-out; } .thumbnail > img, .thumbnail a > img { @@ -4602,7 +4678,7 @@ a.list-group-item.active > .badge, a.thumbnail:hover, a.thumbnail:focus, a.thumbnail.active { - border-color: #428bca; + border-color: #337ab7; } .thumbnail .caption { padding: 9px; @@ -4724,7 +4800,7 @@ a.thumbnail.active { line-height: 20px; color: #fff; text-align: center; - background-color: #428bca; + background-color: #337ab7; -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); -webkit-transition: width .6s ease; @@ -4745,18 +4821,6 @@ a.thumbnail.active { -o-animation: progress-bar-stripes 2s linear infinite; animation: progress-bar-stripes 2s linear infinite; } -.progress-bar[aria-valuenow="1"], -.progress-bar[aria-valuenow="2"] { - min-width: 30px; -} -.progress-bar[aria-valuenow="0"] { - min-width: 30px; - color: #777; - background-color: transparent; - background-image: none; - -webkit-box-shadow: none; - box-shadow: none; -} .progress-bar-success { background-color: #5cb85c; } @@ -4789,29 +4853,35 @@ a.thumbnail.active { background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); } -.media, -.media-body { - overflow: hidden; - zoom: 1; -} -.media, -.media .media { +.media { margin-top: 15px; } .media:first-child { margin-top: 0; } -.media-object { - display: block; -} -.media-heading { - margin: 0 0 5px; +.media-right, +.media > .pull-right { + padding-left: 10px; } +.media-left, .media > .pull-left { - margin-right: 10px; + padding-right: 10px; } -.media > .pull-right { - margin-left: 10px; +.media-left, +.media-right, +.media-body { + display: table-cell; + vertical-align: top; +} +.media-middle { + vertical-align: middle; +} +.media-bottom { + vertical-align: bottom; +} +.media-heading { + margin-top: 0; + margin-bottom: 5px; } .media-list { padding-left: 0; @@ -4838,12 +4908,6 @@ a.thumbnail.active { border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; } -.list-group-item > .badge { - float: right; -} -.list-group-item > .badge + .badge { - margin-right: 5px; -} a.list-group-item { color: #555; } @@ -4860,6 +4924,7 @@ a.list-group-item:focus { .list-group-item.disabled:hover, .list-group-item.disabled:focus { color: #777; + cursor: not-allowed; background-color: #eee; } .list-group-item.disabled .list-group-item-heading, @@ -4877,8 +4942,8 @@ a.list-group-item:focus { .list-group-item.active:focus { z-index: 2; color: #fff; - background-color: #428bca; - border-color: #428bca; + background-color: #337ab7; + border-color: #337ab7; } .list-group-item.active .list-group-item-heading, .list-group-item.active:hover .list-group-item-heading, @@ -4894,7 +4959,7 @@ a.list-group-item:focus { .list-group-item.active .list-group-item-text, .list-group-item.active:hover .list-group-item-text, .list-group-item.active:focus .list-group-item-text { - color: #e1edf7; + color: #c7ddef; } .list-group-item-success { color: #3c763d; @@ -5028,19 +5093,23 @@ a.list-group-item-danger.active:focus { border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } -.panel > .list-group { +.panel > .list-group, +.panel > .panel-collapse > .list-group { margin-bottom: 0; } -.panel > .list-group .list-group-item { +.panel > .list-group .list-group-item, +.panel > .panel-collapse > .list-group .list-group-item { border-width: 1px 0; border-radius: 0; } -.panel > .list-group:first-child .list-group-item:first-child { +.panel > .list-group:first-child .list-group-item:first-child, +.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { border-top: 0; border-top-left-radius: 3px; border-top-right-radius: 3px; } -.panel > .list-group:last-child .list-group-item:last-child { +.panel > .list-group:last-child .list-group-item:last-child, +.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { border-bottom: 0; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; @@ -5056,11 +5125,24 @@ a.list-group-item-danger.active:focus { .panel > .panel-collapse > .table { margin-bottom: 0; } +.panel > .table caption, +.panel > .table-responsive > .table caption, +.panel > .panel-collapse > .table caption { + padding-right: 15px; + padding-left: 15px; +} .panel > .table:first-child, .panel > .table-responsive:first-child > .table:first-child { border-top-left-radius: 3px; border-top-right-radius: 3px; } +.panel > .table:first-child > thead:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} .panel > .table:first-child > thead:first-child > tr:first-child td:first-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, .panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, @@ -5086,6 +5168,13 @@ a.list-group-item-danger.active:focus { border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } +.panel > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} .panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, .panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, @@ -5107,7 +5196,9 @@ a.list-group-item-danger.active:focus { border-bottom-right-radius: 3px; } .panel > .panel-body + .table, -.panel > .panel-body + .table-responsive { +.panel > .panel-body + .table-responsive, +.panel > .table + .panel-body, +.panel > .table-responsive + .panel-body { border-top: 1px solid #ddd; } .panel > .table > tbody:first-child > tr:first-child th, @@ -5183,7 +5274,8 @@ a.list-group-item-danger.active:focus { .panel-group .panel-heading { border-bottom: 0; } -.panel-group .panel-heading + .panel-collapse > .panel-body { +.panel-group .panel-heading + .panel-collapse > .panel-body, +.panel-group .panel-heading + .panel-collapse > .list-group { border-top: 1px solid #ddd; } .panel-group .panel-footer { @@ -5211,22 +5303,22 @@ a.list-group-item-danger.active:focus { border-bottom-color: #ddd; } .panel-primary { - border-color: #428bca; + border-color: #337ab7; } .panel-primary > .panel-heading { color: #fff; - background-color: #428bca; - border-color: #428bca; + background-color: #337ab7; + border-color: #337ab7; } .panel-primary > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #428bca; + border-top-color: #337ab7; } .panel-primary > .panel-heading .badge { - color: #428bca; + color: #337ab7; background-color: #fff; } .panel-primary > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #428bca; + border-bottom-color: #337ab7; } .panel-success { border-color: #d6e9c6; @@ -5310,7 +5402,8 @@ a.list-group-item-danger.active:focus { .embed-responsive .embed-responsive-item, .embed-responsive iframe, .embed-responsive embed, -.embed-responsive object { +.embed-responsive object, +.embed-responsive video { position: absolute; top: 0; bottom: 0; @@ -5381,7 +5474,7 @@ button.close { right: 0; bottom: 0; left: 0; - z-index: 1050; + z-index: 1040; display: none; overflow: hidden; -webkit-overflow-scrolling: touch; @@ -5391,14 +5484,16 @@ button.close { -webkit-transition: -webkit-transform .3s ease-out; -o-transition: -o-transform .3s ease-out; transition: transform .3s ease-out; - -webkit-transform: translate3d(0, -25%, 0); - -o-transform: translate3d(0, -25%, 0); - transform: translate3d(0, -25%, 0); + -webkit-transform: translate(0, -25%); + -ms-transform: translate(0, -25%); + -o-transform: translate(0, -25%); + transform: translate(0, -25%); } .modal.in .modal-dialog { - -webkit-transform: translate3d(0, 0, 0); - -o-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); } .modal-open .modal { overflow-x: hidden; @@ -5422,12 +5517,10 @@ button.close { box-shadow: 0 3px 9px rgba(0, 0, 0, .5); } .modal-backdrop { - position: fixed; + position: absolute; top: 0; right: 0; - bottom: 0; left: 0; - z-index: 1040; background-color: #000; } .modal-backdrop.fade { @@ -5498,7 +5591,9 @@ button.close { position: absolute; z-index: 1070; display: block; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 12px; + font-weight: normal; line-height: 1.4; visibility: visible; filter: alpha(opacity=0); @@ -5548,14 +5643,16 @@ button.close { border-top-color: #000; } .tooltip.top-left .tooltip-arrow { + right: 5px; bottom: 0; - left: 5px; + margin-bottom: -5px; border-width: 5px 5px 0; border-top-color: #000; } .tooltip.top-right .tooltip-arrow { - right: 5px; bottom: 0; + left: 5px; + margin-bottom: -5px; border-width: 5px 5px 0; border-top-color: #000; } @@ -5582,13 +5679,15 @@ button.close { } .tooltip.bottom-left .tooltip-arrow { top: 0; - left: 5px; + right: 5px; + margin-top: -5px; border-width: 0 5px 5px; border-bottom-color: #000; } .tooltip.bottom-right .tooltip-arrow { top: 0; - right: 5px; + left: 5px; + margin-top: -5px; border-width: 0 5px 5px; border-bottom-color: #000; } @@ -5600,6 +5699,10 @@ button.close { display: none; max-width: 276px; padding: 1px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + font-weight: normal; + line-height: 1.42857143; text-align: left; white-space: normal; background-color: #fff; @@ -5627,8 +5730,6 @@ button.close { padding: 8px 14px; margin: 0; font-size: 14px; - font-weight: normal; - line-height: 18px; background-color: #f7f7f7; border-bottom: 1px solid #ebebeb; border-radius: 5px 5px 0 0; @@ -5731,6 +5832,37 @@ button.close { .carousel-inner > .item > a > img { line-height: 1; } +@media all and (transform-3d), (-webkit-transform-3d) { + .carousel-inner > .item { + -webkit-transition: -webkit-transform .6s ease-in-out; + -o-transition: -o-transform .6s ease-in-out; + transition: transform .6s ease-in-out; + + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-perspective: 1000; + perspective: 1000; + } + .carousel-inner > .item.next, + .carousel-inner > .item.active.right { + left: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } + .carousel-inner > .item.prev, + .carousel-inner > .item.active.left { + left: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } + .carousel-inner > .item.next.left, + .carousel-inner > .item.prev.right, + .carousel-inner > .item.active { + left: 0; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} .carousel-inner > .active, .carousel-inner > .next, .carousel-inner > .prev { @@ -5986,9 +6118,6 @@ button.close { } .affix { position: fixed; - -webkit-transform: translate3d(0, 0, 0); - -o-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); } @-ms-viewport { width: device-width; diff --git a/web/src/vendor/bootstrap/bootstrap.js b/web/src/vendor/bootstrap/bootstrap.js index 53da1c77..b6ac8d99 100644 --- a/web/src/vendor/bootstrap/bootstrap.js +++ b/web/src/vendor/bootstrap/bootstrap.js @@ -1,13 +1,22 @@ /*! - * Bootstrap v3.2.0 (http://getbootstrap.com) + * Bootstrap v3.3.1 (http://getbootstrap.com) * Copyright 2011-2014 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) */ -if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript requires jQuery') } +if (typeof jQuery === 'undefined') { + throw new Error('Bootstrap\'s JavaScript requires jQuery') +} + ++function ($) { + var version = $.fn.jquery.split(' ')[0].split('.') + if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1)) { + throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher') + } +}(jQuery); /* ======================================================================== - * Bootstrap: transition.js v3.2.0 + * Bootstrap: transition.js v3.3.1 * http://getbootstrap.com/javascript/#transitions * ======================================================================== * Copyright 2011-2014 Twitter, Inc. @@ -67,7 +76,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re }(jQuery); /* ======================================================================== - * Bootstrap: alert.js v3.2.0 + * Bootstrap: alert.js v3.3.1 * http://getbootstrap.com/javascript/#alerts * ======================================================================== * Copyright 2011-2014 Twitter, Inc. @@ -86,7 +95,9 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re $(el).on('click', dismiss, this.close) } - Alert.VERSION = '3.2.0' + Alert.VERSION = '3.3.1' + + Alert.TRANSITION_DURATION = 150 Alert.prototype.close = function (e) { var $this = $(this) @@ -102,7 +113,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re if (e) e.preventDefault() if (!$parent.length) { - $parent = $this.hasClass('alert') ? $this : $this.parent() + $parent = $this.closest('.alert') } $parent.trigger(e = $.Event('close.bs.alert')) @@ -119,7 +130,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re $.support.transition && $parent.hasClass('fade') ? $parent .one('bsTransitionEnd', removeElement) - .emulateTransitionEnd(150) : + .emulateTransitionEnd(Alert.TRANSITION_DURATION) : removeElement() } @@ -160,7 +171,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re }(jQuery); /* ======================================================================== - * Bootstrap: button.js v3.2.0 + * Bootstrap: button.js v3.3.1 * http://getbootstrap.com/javascript/#buttons * ======================================================================== * Copyright 2011-2014 Twitter, Inc. @@ -180,7 +191,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re this.isLoading = false } - Button.VERSION = '3.2.0' + Button.VERSION = '3.3.1' Button.DEFAULTS = { loadingText: 'loading...' @@ -196,10 +207,10 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re if (data.resetText == null) $el.data('resetText', $el[val]()) - $el[val](data[state] == null ? this.options[state] : data[state]) - // push to event loop to allow forms to submit setTimeout($.proxy(function () { + $el[val](data[state] == null ? this.options[state] : data[state]) + if (state == 'loadingText') { this.isLoading = true $el.addClass(d).attr(d, d) @@ -221,6 +232,8 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re else $parent.find('.active').removeClass('active') } if (changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change') + } else { + this.$element.attr('aria-pressed', !this.$element.hasClass('active')) } if (changed) this.$element.toggleClass('active') @@ -261,17 +274,21 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re // BUTTON DATA-API // =============== - $(document).on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) { - var $btn = $(e.target) - if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') - Plugin.call($btn, 'toggle') - e.preventDefault() - }) + $(document) + .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) { + var $btn = $(e.target) + if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') + Plugin.call($btn, 'toggle') + e.preventDefault() + }) + .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) { + $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type)) + }) }(jQuery); /* ======================================================================== - * Bootstrap: carousel.js v3.2.0 + * Bootstrap: carousel.js v3.3.1 * http://getbootstrap.com/javascript/#carousel * ======================================================================== * Copyright 2011-2014 Twitter, Inc. @@ -286,7 +303,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re // ========================= var Carousel = function (element, options) { - this.$element = $(element).on('keydown.bs.carousel', $.proxy(this.keydown, this)) + this.$element = $(element) this.$indicators = this.$element.find('.carousel-indicators') this.options = options this.paused = @@ -295,20 +312,26 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re this.$active = this.$items = null - this.options.pause == 'hover' && this.$element + this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this)) + + this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element .on('mouseenter.bs.carousel', $.proxy(this.pause, this)) .on('mouseleave.bs.carousel', $.proxy(this.cycle, this)) } - Carousel.VERSION = '3.2.0' + Carousel.VERSION = '3.3.1' + + Carousel.TRANSITION_DURATION = 600 Carousel.DEFAULTS = { interval: 5000, pause: 'hover', - wrap: true + wrap: true, + keyboard: true } Carousel.prototype.keydown = function (e) { + if (/input|textarea/i.test(e.target.tagName)) return switch (e.which) { case 37: this.prev(); break case 39: this.next(); break @@ -335,6 +358,13 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re return this.$items.index(item || this.$active) } + Carousel.prototype.getItemForDirection = function (direction, active) { + var delta = direction == 'prev' ? -1 : 1 + var activeIndex = this.getItemIndex(active) + var itemIndex = (activeIndex + delta) % this.$items.length + return this.$items.eq(itemIndex) + } + Carousel.prototype.to = function (pos) { var that = this var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active')) @@ -344,7 +374,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid" if (activeIndex == pos) return this.pause().cycle() - return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos])) + return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos)) } Carousel.prototype.pause = function (e) { @@ -372,7 +402,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re Carousel.prototype.slide = function (type, next) { var $active = this.$element.find('.item.active') - var $next = next || $active[type]() + var $next = next || this.getItemForDirection(type, $active) var isCycling = this.interval var direction = type == 'next' ? 'left' : 'right' var fallback = type == 'next' ? 'first' : 'last' @@ -418,7 +448,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re that.$element.trigger(slidEvent) }, 0) }) - .emulateTransitionEnd($active.css('transition-duration').slice(0, -1) * 1000) + .emulateTransitionEnd(Carousel.TRANSITION_DURATION) } else { $active.removeClass('active') $next.addClass('active') @@ -467,7 +497,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re // CAROUSEL DATA-API // ================= - $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) { + var clickHandler = function (e) { var href var $this = $(this) var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7 @@ -483,7 +513,11 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re } e.preventDefault() - }) + } + + $(document) + .on('click.bs.carousel.data-api', '[data-slide]', clickHandler) + .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler) $(window).on('load', function () { $('[data-ride="carousel"]').each(function () { @@ -495,7 +529,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re }(jQuery); /* ======================================================================== - * Bootstrap: collapse.js v3.2.0 + * Bootstrap: collapse.js v3.3.1 * http://getbootstrap.com/javascript/#collapse * ======================================================================== * Copyright 2011-2014 Twitter, Inc. @@ -512,16 +546,25 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re var Collapse = function (element, options) { this.$element = $(element) this.options = $.extend({}, Collapse.DEFAULTS, options) + this.$trigger = $(this.options.trigger).filter('[href="#' + element.id + '"], [data-target="#' + element.id + '"]') this.transitioning = null - if (this.options.parent) this.$parent = $(this.options.parent) + if (this.options.parent) { + this.$parent = this.getParent() + } else { + this.addAriaAndCollapsedClass(this.$element, this.$trigger) + } + if (this.options.toggle) this.toggle() } - Collapse.VERSION = '3.2.0' + Collapse.VERSION = '3.3.1' + + Collapse.TRANSITION_DURATION = 350 Collapse.DEFAULTS = { - toggle: true + toggle: true, + trigger: '[data-toggle="collapse"]' } Collapse.prototype.dimension = function () { @@ -532,17 +575,21 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re Collapse.prototype.show = function () { if (this.transitioning || this.$element.hasClass('in')) return + var activesData + var actives = this.$parent && this.$parent.find('> .panel').children('.in, .collapsing') + + if (actives && actives.length) { + activesData = actives.data('bs.collapse') + if (activesData && activesData.transitioning) return + } + var startEvent = $.Event('show.bs.collapse') this.$element.trigger(startEvent) if (startEvent.isDefaultPrevented()) return - var actives = this.$parent && this.$parent.find('> .panel > .in') - if (actives && actives.length) { - var hasData = actives.data('bs.collapse') - if (hasData && hasData.transitioning) return Plugin.call(actives, 'hide') - hasData || actives.data('bs.collapse', null) + activesData || actives.data('bs.collapse', null) } var dimension = this.dimension() @@ -550,6 +597,11 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re this.$element .removeClass('collapse') .addClass('collapsing')[dimension](0) + .attr('aria-expanded', true) + + this.$trigger + .removeClass('collapsed') + .attr('aria-expanded', true) this.transitioning = 1 @@ -568,7 +620,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re this.$element .one('bsTransitionEnd', $.proxy(complete, this)) - .emulateTransitionEnd(350)[dimension](this.$element[0][scrollSize]) + .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize]) } Collapse.prototype.hide = function () { @@ -584,17 +636,21 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re this.$element .addClass('collapsing') - .removeClass('collapse') - .removeClass('in') + .removeClass('collapse in') + .attr('aria-expanded', false) + + this.$trigger + .addClass('collapsed') + .attr('aria-expanded', false) this.transitioning = 1 var complete = function () { this.transitioning = 0 this.$element - .trigger('hidden.bs.collapse') .removeClass('collapsing') .addClass('collapse') + .trigger('hidden.bs.collapse') } if (!$.support.transition) return complete.call(this) @@ -602,13 +658,40 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re this.$element [dimension](0) .one('bsTransitionEnd', $.proxy(complete, this)) - .emulateTransitionEnd(350) + .emulateTransitionEnd(Collapse.TRANSITION_DURATION) } Collapse.prototype.toggle = function () { this[this.$element.hasClass('in') ? 'hide' : 'show']() } + Collapse.prototype.getParent = function () { + return $(this.options.parent) + .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]') + .each($.proxy(function (i, element) { + var $element = $(element) + this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element) + }, this)) + .end() + } + + Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) { + var isOpen = $element.hasClass('in') + + $element.attr('aria-expanded', isOpen) + $trigger + .toggleClass('collapsed', !isOpen) + .attr('aria-expanded', isOpen) + } + + function getTargetFromTrigger($trigger) { + var href + var target = $trigger.attr('data-target') + || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7 + + return $(target) + } + // COLLAPSE PLUGIN DEFINITION // ========================== @@ -619,7 +702,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re var data = $this.data('bs.collapse') var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option) - if (!data && options.toggle && option == 'show') option = !option + if (!data && options.toggle && option == 'show') options.toggle = false if (!data) $this.data('bs.collapse', (data = new Collapse(this, options))) if (typeof option == 'string') data[option]() }) @@ -644,21 +727,13 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re // ================= $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) { - var href var $this = $(this) - var target = $this.attr('data-target') - || e.preventDefault() - || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7 - var $target = $(target) - var data = $target.data('bs.collapse') - var option = data ? 'toggle' : $this.data() - var parent = $this.attr('data-parent') - var $parent = parent && $(parent) - if (!data || !data.transitioning) { - if ($parent) $parent.find('[data-toggle="collapse"][data-parent="' + parent + '"]').not($this).addClass('collapsed') - $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed') - } + if (!$this.attr('data-target')) e.preventDefault() + + var $target = getTargetFromTrigger($this) + var data = $target.data('bs.collapse') + var option = data ? 'toggle' : $.extend({}, $this.data(), { trigger: this }) Plugin.call($target, option) }) @@ -666,7 +741,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re }(jQuery); /* ======================================================================== - * Bootstrap: dropdown.js v3.2.0 + * Bootstrap: dropdown.js v3.3.1 * http://getbootstrap.com/javascript/#dropdowns * ======================================================================== * Copyright 2011-2014 Twitter, Inc. @@ -686,7 +761,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re $(element).on('click.bs.dropdown', this.toggle) } - Dropdown.VERSION = '3.2.0' + Dropdown.VERSION = '3.3.1' Dropdown.prototype.toggle = function (e) { var $this = $(this) @@ -709,7 +784,9 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re if (e.isDefaultPrevented()) return - $this.trigger('focus') + $this + .trigger('focus') + .attr('aria-expanded', 'true') $parent .toggleClass('open') @@ -720,7 +797,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re } Dropdown.prototype.keydown = function (e) { - if (!/(38|40|27)/.test(e.keyCode)) return + if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return var $this = $(this) @@ -732,7 +809,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re var $parent = getParent($this) var isActive = $parent.hasClass('open') - if (!isActive || (isActive && e.keyCode == 27)) { + if ((!isActive && e.which != 27) || (isActive && e.which == 27)) { if (e.which == 27) $parent.find(toggle).trigger('focus') return $this.trigger('click') } @@ -742,10 +819,10 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re if (!$items.length) return - var index = $items.index($items.filter(':focus')) + var index = $items.index(e.target) - if (e.keyCode == 38 && index > 0) index-- // up - if (e.keyCode == 40 && index < $items.length - 1) index++ // down + if (e.which == 38 && index > 0) index-- // up + if (e.which == 40 && index < $items.length - 1) index++ // down if (!~index) index = 0 $items.eq(index).trigger('focus') @@ -755,11 +832,17 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re if (e && e.which === 3) return $(backdrop).remove() $(toggle).each(function () { - var $parent = getParent($(this)) + var $this = $(this) + var $parent = getParent($this) var relatedTarget = { relatedTarget: this } + if (!$parent.hasClass('open')) return + $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget)) + if (e.isDefaultPrevented()) return + + $this.attr('aria-expanded', 'false') $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget) }) } @@ -813,12 +896,14 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re .on('click.bs.dropdown.data-api', clearMenus) .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() }) .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle) - .on('keydown.bs.dropdown.data-api', toggle + ', [role="menu"], [role="listbox"]', Dropdown.prototype.keydown) + .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown) + .on('keydown.bs.dropdown.data-api', '[role="menu"]', Dropdown.prototype.keydown) + .on('keydown.bs.dropdown.data-api', '[role="listbox"]', Dropdown.prototype.keydown) }(jQuery); /* ======================================================================== - * Bootstrap: modal.js v3.2.0 + * Bootstrap: modal.js v3.3.1 * http://getbootstrap.com/javascript/#modals * ======================================================================== * Copyright 2011-2014 Twitter, Inc. @@ -849,7 +934,10 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re } } - Modal.VERSION = '3.2.0' + Modal.VERSION = '3.3.1' + + Modal.TRANSITION_DURATION = 300 + Modal.BACKDROP_TRANSITION_DURATION = 150 Modal.DEFAULTS = { backdrop: true, @@ -872,10 +960,11 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re this.isShown = true this.checkScrollbar() + this.setScrollbar() this.$body.addClass('modal-open') - this.setScrollbar() this.escape() + this.resize() this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this)) @@ -890,6 +979,9 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re .show() .scrollTop(0) + if (that.options.backdrop) that.adjustBackdrop() + that.adjustDialog() + if (transition) { that.$element[0].offsetWidth // force reflow } @@ -907,7 +999,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re .one('bsTransitionEnd', function () { that.$element.trigger('focus').trigger(e) }) - .emulateTransitionEnd(300) : + .emulateTransitionEnd(Modal.TRANSITION_DURATION) : that.$element.trigger('focus').trigger(e) }) } @@ -923,10 +1015,8 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re this.isShown = false - this.$body.removeClass('modal-open') - - this.resetScrollbar() this.escape() + this.resize() $(document).off('focusin.bs.modal') @@ -938,7 +1028,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re $.support.transition && this.$element.hasClass('fade') ? this.$element .one('bsTransitionEnd', $.proxy(this.hideModal, this)) - .emulateTransitionEnd(300) : + .emulateTransitionEnd(Modal.TRANSITION_DURATION) : this.hideModal() } @@ -954,11 +1044,19 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re Modal.prototype.escape = function () { if (this.isShown && this.options.keyboard) { - this.$element.on('keyup.dismiss.bs.modal', $.proxy(function (e) { + this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) { e.which == 27 && this.hide() }, this)) } else if (!this.isShown) { - this.$element.off('keyup.dismiss.bs.modal') + this.$element.off('keydown.dismiss.bs.modal') + } + } + + Modal.prototype.resize = function () { + if (this.isShown) { + $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this)) + } else { + $(window).off('resize.bs.modal') } } @@ -966,6 +1064,9 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re var that = this this.$element.hide() this.backdrop(function () { + that.$body.removeClass('modal-open') + that.resetAdjustments() + that.resetScrollbar() that.$element.trigger('hidden.bs.modal') }) } @@ -983,14 +1084,13 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re var doAnimate = $.support.transition && animate this.$backdrop = $('