├── icon.png ├── icon_small.png ├── test.html ├── todo.md ├── manifest.json ├── whoa.js ├── license.js ├── README.md ├── popup.html ├── konami.js ├── popup.js └── buttons.css /icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/christiangenco/chrome-export-history/HEAD/icon.png -------------------------------------------------------------------------------- /icon_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/christiangenco/chrome-export-history/HEAD/icon_small.png -------------------------------------------------------------------------------- /test.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /todo.md: -------------------------------------------------------------------------------- 1 | # Todo 2 | 3 | * local time zone 4 | * multiple computer/devise history API? 5 | * reply to support requests: https://chrome.google.com/webstore/detail/export-history/hcohnnbbiggngobheobhdipbgmcbelhh/support 6 | 7 | 8 | --- 9 | 10 | https://developer.chrome.com/webstore/one_time_payments#update-manifest 11 | 12 | * "export as csv" redirects to gen.co/exporthistory with a "name your price" stripe payment 13 | * show list of people that have paid with amounts 14 | * "If you really don't want to spend money (and I totally empathize with you - I didn't have a debit card and couldn't buy anything online until I was like nineteen), the secret to unlocking excel exports is in the source code :)" 15 | -------------------------------------------------------------------------------- /manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "manifest_version": 2, 3 | "name": "Export History", 4 | "description": 5 | "Download your full chrome history in Excel-readable csv and json", 6 | "key": 7 | "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAgbRhEYSFuFFubsDQmMiLL7gi+zqx+oy4cCZs0gaLK6D1LmJAMWzDrjgZ9OTXHjvqLnqely7ZLyzoPRwq8CspZdOiAukOI/Df/4crnJ+vqiJtjxT6/pkY/XCV04cMXcxONY7rsJi7GuhtsQXFG2qO/I05L00Zdh+VMv0d8vrikklh2huQAEEtJyuFN6Wzdj5NP0zJJsBDQJ1dAUF26920438LSxpDtdVCX7nmHc2M76SyFeZzy8Q/9cU8uKbS0GiCm4oSIR1L4KsAXvYjnv9xC3eE5VHrtD+LEoo2mdiRvvC4KJRHZj8m8s34d8fwomKZH2P70jlB9xlQz0RgWWEp5wIDAQAB", 8 | "version": "2.0", 9 | 10 | "permissions": [ 11 | "history", 12 | "identity", 13 | "https://www.googleapis.com/", 14 | "downloads" 15 | ], 16 | "oauth2": { 17 | "client_id": 18 | "650566817477-0080kv7ltdklamk1qf27rpjdrpa964qm.apps.googleusercontent.com", 19 | "scopes": ["https://www.googleapis.com/auth/chromewebstore.readonly"] 20 | }, 21 | "browser_action": { 22 | "default_icon": "icon.png", 23 | "default_popup": "popup.html" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /whoa.js: -------------------------------------------------------------------------------- 1 | // localStorage.removeItem('rickrolled'); 2 | 3 | var step = 0; 4 | var messages = [ 5 | "Whoa.", 6 | "Hey.", 7 | "Stop that!", 8 | "Nothing else happens.", 9 | "Nothing else happens. I promise.", 10 | "", 11 | ".", 12 | "..", 13 | "...", 14 | "...see?", 15 | "Oh, right.", 16 | "Well, fine. Nothing else happens from now on.", 17 | "At least, nothing you'll find enjoyable.", 18 | "...", 19 | "Stop it!", 20 | "Aren't your fingers getting tired?", 21 | "You'll have that konami code memorized in no time.", 22 | "You probably already have it memorized, in fact.", 23 | "Jeez! I mean, I appreciate you registering Export History and everything", 24 | "Jeez! I mean, I appreciate you registering Export History and everything (really, I do)", 25 | "Jeez! I mean, I appreciate you registering Export History and everything (really, I do), but this is just getting absurd.", 26 | "You can already export your history in Excel!", 27 | "What more do you want?", 28 | "Alright, you know what?", 29 | "You know what you get?", 30 | "You get this:", 31 | "You get this: (which you completely deserve)", 32 | ]; 33 | 34 | window.whoa = function(){ 35 | if(step < messages.length && !localStorage['rickrolled']){ 36 | var thankyou = document.getElementById("thankyou"); 37 | thankyou.innerHTML = messages[step++]; 38 | }else{ 39 | localStorage['rickrolled'] = true; 40 | chrome.tabs.create({url: "https://www.youtube.com/watch?v=dQw4w9WgXcQ"}); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /license.js: -------------------------------------------------------------------------------- 1 | var CWS_LICENSE_API_URL = 'https://www.googleapis.com/chromewebstore/v1.1/userlicenses/'; 2 | 3 | function getLicense(cb) { 4 | console.log("getting license"); 5 | try{ 6 | xhrWithAuth('GET', CWS_LICENSE_API_URL + chrome.runtime.id, true, function(error, status, res){ 7 | if(status === 200){ 8 | cb(res, null); 9 | }else{ 10 | cb(res, "Error reading license server: " + response); 11 | } 12 | }); 13 | }catch(e){ 14 | cb(null, "Error getting authenticated XHR request: " + e); 15 | } 16 | } 17 | 18 | 19 | // Helper Util for making authenticated XHRs 20 | function xhrWithAuth(method, url, interactive, callback) { 21 | var retry = true; 22 | getToken(); 23 | 24 | function getToken() { 25 | console.log("Getting auth token..."); 26 | console.log("Calling chrome.identity.getAuthToken", interactive); 27 | chrome.identity.getAuthToken({ interactive: interactive }, function(token) { 28 | if (chrome.runtime.lastError) { 29 | callback(chrome.runtime.lastError); 30 | return; 31 | } 32 | console.log("chrome.identity.getAuthToken returned a token", token); 33 | access_token = token; 34 | requestStart(); 35 | }); 36 | } 37 | 38 | function requestStart() { 39 | console.log("Starting authenticated XHR...", method, url); 40 | var xhr = new XMLHttpRequest(); 41 | xhr.open(method, url); 42 | xhr.setRequestHeader('Authorization', 'Bearer ' + access_token); 43 | xhr.onload = requestComplete; 44 | xhr.send(); 45 | } 46 | 47 | function requestComplete() { 48 | console.log("Authenticated XHR completed."); 49 | if (this.status == 401 && retry) { 50 | retry = false; 51 | chrome.identity.removeCachedAuthToken({ token: access_token }, getToken); 52 | } else { 53 | callback(null, this.status, JSON.parse(this.response)); 54 | } 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Export History 2 | 3 | A Chrome extension to export your history as csv or json. 4 | 5 | ## Usage 6 | 7 | [Download it](https://chrome.google.com/webstore/detail/export-history/hcohnnbbiggngobheobhdipbgmcbelhh) on the Chrome web store. 8 | 9 | ## Contributing 10 | 11 | Clone this repository: 12 | 13 | $ git clone github.com:christiangenco/chrome-export-history.git 14 | 15 | Then visit the [extensions panel](chrome://extensions/) of your chrome settings, check `developer mode`, click `Load unpacked extension`, and select the directory you just cloned (for a more detailed explanation of these steps, visit Chrome's [Getting Started: Building a Chrome Extension](http://developer.chrome.com/extensions/getstarted) page). 16 | 17 | Most of the logic is contained in [popup.js](popup.js). The method that makes the magic happen is [chrome.history.search](https://developer.chrome.com/extensions/history#method-search), but trying to convert the entire object returned in memory makes Chrome crash. 18 | 19 | The workaround used by this extension is to convert each object of the returned results array individually and append it to a hidden div, `#data`. For whatever reason, the DOM has a much higher memory tolerance than javascript objects in chrome extensions. 20 | 21 | The data in `#data` is then converted to a [Blob](https://developer.mozilla.org/en-US/docs/Web/API/Blob) and encoded to a [data URI](http://en.wikipedia.org/wiki/Data_URI_scheme), which you can do like this: 22 | 23 | var blob = new Blob([SOME_DATA], {type: 'application/octet-binary'}); 24 | var url = URL.createObjectURL(blob); 25 | 26 | And then *that* url is stuck into a link and clicked on so it downloads as a file, which you can do like this: 27 | 28 | var pom = document.createElement('a'); 29 | pom.setAttribute('href', url); 30 | pom.setAttribute('download', filename); 31 | pom.click(); 32 | 33 | Direct any questions to [@cgenco](https://twitter.com/cgenco) if you get stuck. 34 | 35 | ## License 36 | 37 | Do whatever you want with this - but if you make money on it, I want some. -------------------------------------------------------------------------------- /popup.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Export History 5 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 |

Export History

36 |
37 | history.json 38 | history.csv 39 |
40 | 41 | Fork me on GitHub 42 | 43 |
44 | 45 |
46 | Buy the full version to unlock csv exporting. 47 |
48 | 49 | 52 | 53 |
54 | 55 | 56 | -------------------------------------------------------------------------------- /konami.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Konami-JS ~ 3 | * :: Now with support for touch events and multiple instances for 4 | * :: those situations that call for multiple easter eggs! 5 | * Code: http://konami-js.googlecode.com/ 6 | * Examples: http://www.snaptortoise.com/konami-js 7 | * Copyright (c) 2009 George Mandis (georgemandis.com, snaptortoise.com) 8 | * Version: 1.4.2 (9/2/2013) 9 | * Licensed under the MIT License (http://opensource.org/licenses/MIT) 10 | * Tested in: Safari 4+, Google Chrome 4+, Firefox 3+, IE7+, Mobile Safari 2.2.1 and Dolphin Browser 11 | */ 12 | 13 | var Konami = function (callback) { 14 | var konami = { 15 | addEvent: function (obj, type, fn, ref_obj) { 16 | if (obj.addEventListener) 17 | obj.addEventListener(type, fn, false); 18 | else if (obj.attachEvent) { 19 | // IE 20 | obj["e" + type + fn] = fn; 21 | obj[type + fn] = function () { 22 | obj["e" + type + fn](window.event, ref_obj); 23 | } 24 | obj.attachEvent("on" + type, obj[type + fn]); 25 | } 26 | }, 27 | input: "", 28 | pattern: "38384040373937396665", 29 | load: function (link) { 30 | this.addEvent(document, "keydown", function (e, ref_obj) { 31 | if (ref_obj) konami = ref_obj; // IE 32 | konami.input += e ? e.keyCode : event.keyCode; 33 | if (konami.input.length > konami.pattern.length) 34 | konami.input = konami.input.substr((konami.input.length - konami.pattern.length)); 35 | if (konami.input == konami.pattern) { 36 | konami.code(link); 37 | konami.input = ""; 38 | e.preventDefault(); 39 | return false; 40 | } 41 | }, this); 42 | this.iphone.load(link); 43 | }, 44 | code: function (link) { 45 | window.location = link 46 | }, 47 | iphone: { 48 | start_x: 0, 49 | start_y: 0, 50 | stop_x: 0, 51 | stop_y: 0, 52 | tap: false, 53 | capture: false, 54 | orig_keys: "", 55 | keys: ["UP", "UP", "DOWN", "DOWN", "LEFT", "RIGHT", "LEFT", "RIGHT", "TAP", "TAP"], 56 | code: function (link) { 57 | konami.code(link); 58 | }, 59 | load: function (link) { 60 | this.orig_keys = this.keys; 61 | konami.addEvent(document, "touchmove", function (e) { 62 | if (e.touches.length == 1 && konami.iphone.capture == true) { 63 | var touch = e.touches[0]; 64 | konami.iphone.stop_x = touch.pageX; 65 | konami.iphone.stop_y = touch.pageY; 66 | konami.iphone.tap = false; 67 | konami.iphone.capture = false; 68 | konami.iphone.check_direction(); 69 | } 70 | }); 71 | konami.addEvent(document, "touchend", function (evt) { 72 | if (konami.iphone.tap == true) konami.iphone.check_direction(link); 73 | }, false); 74 | konami.addEvent(document, "touchstart", function (evt) { 75 | konami.iphone.start_x = evt.changedTouches[0].pageX; 76 | konami.iphone.start_y = evt.changedTouches[0].pageY; 77 | konami.iphone.tap = true; 78 | konami.iphone.capture = true; 79 | }); 80 | }, 81 | check_direction: function (link) { 82 | x_magnitude = Math.abs(this.start_x - this.stop_x); 83 | y_magnitude = Math.abs(this.start_y - this.stop_y); 84 | x = ((this.start_x - this.stop_x) < 0) ? "RIGHT" : "LEFT"; 85 | y = ((this.start_y - this.stop_y) < 0) ? "DOWN" : "UP"; 86 | result = (x_magnitude > y_magnitude) ? x : y; 87 | result = (this.tap == true) ? "TAP" : result; 88 | 89 | if (result == this.keys[0]) this.keys = this.keys.slice(1, this.keys.length); 90 | if (this.keys.length == 0) { 91 | this.keys = this.orig_keys; 92 | this.code(link); 93 | } 94 | } 95 | } 96 | } 97 | 98 | typeof callback === "string" && konami.load(callback); 99 | if (typeof callback === "function") { 100 | konami.code = callback; 101 | konami.load(); 102 | } 103 | 104 | return konami; 105 | }; -------------------------------------------------------------------------------- /popup.js: -------------------------------------------------------------------------------- 1 | // localStorage.removeItem('registered'); 2 | 3 | var unlocked = false; 4 | var unlock = function() { 5 | unlocked = true; 6 | window.csvButton.className = window.csvButton.className.replace( 7 | "caution", 8 | "action" 9 | ); 10 | document.getElementById("thankyou").style.display = "block"; 11 | document.getElementById("buy").style.display = "none"; 12 | }; 13 | 14 | getLicense(function(license, error) { 15 | console.log("got license: "); 16 | if (!error && license && license.result && license.accessLevel === "FULL") { 17 | unlock(); 18 | } 19 | }); 20 | 21 | var easter_egg = new Konami(); 22 | easter_egg.code = function() { 23 | if (!unlocked) { 24 | unlock(); 25 | } else { 26 | whoa(); 27 | } 28 | }; 29 | easter_egg.load(); 30 | 31 | var append = function(text) { 32 | data.appendChild(document.createTextNode(text)); 33 | }; 34 | 35 | const downloadFile = ({ data, filename }) => { 36 | const blob = new Blob([data], { 37 | type: "application/octet-binary" 38 | }); 39 | const url = URL.createObjectURL(blob); 40 | 41 | chrome.downloads.download({ url, filename }); 42 | // const pom = document.createElement("a"); 43 | // pom.setAttribute("href", url); 44 | // pom.setAttribute("download", filename); 45 | // pom.click(); 46 | }; 47 | 48 | var download = function(format) { 49 | if (format == "csv" && !unlocked) { 50 | // not registered 51 | // show link to purchase 52 | chrome.tabs.create({ 53 | url: 54 | "https://chrome.google.com/webstore/detail/export-history/hcohnnbbiggngobheobhdipbgmcbelhh" 55 | }); 56 | return; 57 | } 58 | 59 | document.getElementById("content").innerText = "preparing file..."; 60 | 61 | chrome.history.search( 62 | { 63 | text: "", 64 | // 'maxResults': 100, 65 | maxResults: 1000000, 66 | startTime: 0 67 | }, 68 | function(res) { 69 | window.res = res; 70 | 71 | var text, filename; 72 | 73 | // put the data in a hidden div so chrome doesn't crash 74 | if (format === "csv") { 75 | filename = "history.csv"; 76 | 77 | // header row 78 | var keys = Object.keys(res[0]); 79 | append("formattedLastVisitTime," + keys.join(",")); 80 | 81 | var row, time, value; 82 | for (var i = 0; i < res.length; i++) { 83 | row = ""; 84 | 85 | // convert time for excel 86 | time = new Date(res[i]["lastVisitTime"]); 87 | formatted = time 88 | .toISOString() 89 | .replace("T", " ") 90 | .replace(/\.\d+Z/, ""); 91 | row += formatted + ","; 92 | 93 | for (var j = 0; j < keys.length; j++) { 94 | value = res[i][keys[j]].toString(); 95 | value = value.replace(/"/g, '""'); 96 | if (value.search(/("|,|\n)/g) >= 0) value = '"' + value + '"'; 97 | row += value; 98 | if (j !== keys.length - 1) row += ","; 99 | } 100 | append("\n" + row); 101 | } 102 | } else { 103 | filename = "history.json"; 104 | 105 | append("["); 106 | for (var i = 0; i < res.length; i++) { 107 | text = JSON.stringify(res[i]); 108 | if (i !== res.length - 1) text = text + ","; 109 | append(text); 110 | } 111 | append("]"); 112 | } 113 | 114 | const isoDate = new Date().toISOString().substr(0, 10); 115 | 116 | downloadFile({ 117 | filename: isoDate + " " + filename, 118 | data: data.innerText 119 | }); 120 | 121 | // window.close(); 122 | } 123 | ); 124 | }; 125 | 126 | document.addEventListener("DOMContentLoaded", function() { 127 | window.data = document.getElementById("data"); 128 | window.jsonButton = document.getElementById("json"); 129 | window.csvButton = document.getElementById("csv"); 130 | 131 | jsonButton.onclick = function() { 132 | download("json"); 133 | }; 134 | 135 | csvButton.onclick = function() { 136 | download("csv"); 137 | }; 138 | 139 | // document.getElementById('titlex').onclick = register; 140 | 141 | // if(localStorage['registered']) register(); 142 | }); 143 | -------------------------------------------------------------------------------- /buttons.css: -------------------------------------------------------------------------------- 1 | /*http://alexwolfe.github.io/Buttons/*/ 2 | /* line 24, ../scss/partials/_buttons.scss */ 3 | .button { 4 | -webkit-box-shadow: inset 0px 1px 0px rgba(255, 255, 255, 0.5), 0px 1px 2px rgba(0, 0, 0, 0.15); 5 | -moz-box-shadow: inset 0px 1px 0px rgba(255, 255, 255, 0.5), 0px 1px 2px rgba(0, 0, 0, 0.15); 6 | box-shadow: inset 0px 1px 0px rgba(255, 255, 255, 0.5), 0px 1px 2px rgba(0, 0, 0, 0.15); 7 | background-color: #eeeeee; 8 | background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #fbfbfb), color-stop(100%, #e1e1e1)); 9 | background: -webkit-linear-gradient(top, #fbfbfb, #e1e1e1); 10 | background: -moz-linear-gradient(top, #fbfbfb, #e1e1e1); 11 | background: -o-linear-gradient(top, #fbfbfb, #e1e1e1); 12 | background: linear-gradient(top, #fbfbfb, #e1e1e1); 13 | display: -moz-inline-stack; 14 | display: inline-block; 15 | vertical-align: middle; 16 | *vertical-align: auto; 17 | zoom: 1; 18 | *display: inline; 19 | border: 1px solid #d4d4d4; 20 | height: 32px; 21 | line-height: 32px; 22 | padding: 0px 25.6px; 23 | font-weight: 300; 24 | font-size: 14px; 25 | font-family: "Helvetica Neue Light", "Helvetica Neue", "Helvetica", "Arial", "Lucida Grande", sans-serif; 26 | color: #666666; 27 | text-shadow: 0 1px 1px white; 28 | margin: 0; 29 | text-decoration: none; 30 | text-align: center; } 31 | /* line 42, ../scss/partials/_buttons.scss */ 32 | .button:hover { 33 | background-color: #eeeeee; 34 | background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(100%, #dcdcdc)); 35 | background: -webkit-linear-gradient(top, #ffffff, #dcdcdc); 36 | background: -moz-linear-gradient(top, #ffffff, #dcdcdc); 37 | background: -o-linear-gradient(top, #ffffff, #dcdcdc); 38 | background: linear-gradient(top, #ffffff, #dcdcdc); } 39 | /* line 46, ../scss/partials/_buttons.scss */ 40 | .button:active { 41 | -webkit-box-shadow: inset 0px 1px 3px rgba(0, 0, 0, 0.3), 0px 1px 0px white; 42 | -moz-box-shadow: inset 0px 1px 3px rgba(0, 0, 0, 0.3), 0px 1px 0px white; 43 | box-shadow: inset 0px 1px 3px rgba(0, 0, 0, 0.3), 0px 1px 0px white; 44 | text-shadow: 0px 1px 0px rgba(255, 255, 255, 0.4); 45 | background: #eeeeee; 46 | color: #bbbbbb; } 47 | /* line 52, ../scss/partials/_buttons.scss */ 48 | .button:focus { 49 | outline: none; } 50 | 51 | /* line 58, ../scss/partials/_buttons.scss */ 52 | input.button, button.button { 53 | height: 34px; 54 | cursor: pointer; 55 | -webkit-appearance: none; } 56 | 57 | /* line 65, ../scss/partials/_buttons.scss */ 58 | .button-block { 59 | display: block; } 60 | 61 | /* line 74, ../scss/partials/_buttons.scss */ 62 | .button.disabled, 63 | .button.disabled:hover, 64 | .button.disabled:active, 65 | input.button:disabled, 66 | button.button:disabled { 67 | -webkit-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.1); 68 | -moz-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.1); 69 | box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.1); 70 | filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=80); 71 | opacity: 0.8; 72 | background: #EEE; 73 | border: 1px solid #DDD; 74 | text-shadow: 0 1px 1px white; 75 | color: #CCC; 76 | cursor: default; 77 | -webkit-appearance: none; } 78 | 79 | /* line 86, ../scss/partials/_buttons.scss */ 80 | .button-wrap { 81 | background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #e3e3e3), color-stop(100%, #f2f2f2)); 82 | background: -webkit-linear-gradient(top, #e3e3e3, #f2f2f2); 83 | background: -moz-linear-gradient(top, #e3e3e3, #f2f2f2); 84 | background: -o-linear-gradient(top, #e3e3e3, #f2f2f2); 85 | background: linear-gradient(top, #e3e3e3, #f2f2f2); 86 | -webkit-border-radius: 200px; 87 | -moz-border-radius: 200px; 88 | -ms-border-radius: 200px; 89 | -o-border-radius: 200px; 90 | border-radius: 200px; 91 | -webkit-box-shadow: inset 0px 1px 3px rgba(0, 0, 0, 0.04); 92 | -moz-box-shadow: inset 0px 1px 3px rgba(0, 0, 0, 0.04); 93 | box-shadow: inset 0px 1px 3px rgba(0, 0, 0, 0.04); 94 | padding: 10px; 95 | display: inline-block; } 96 | 97 | /* line 96, ../scss/partials/_buttons.scss */ 98 | .button-flat { 99 | -webkit-box-shadow: none; 100 | -moz-box-shadow: none; 101 | box-shadow: none; 102 | -webkit-transition-property: background; 103 | -moz-transition-property: background; 104 | -o-transition-property: background; 105 | transition-property: background; 106 | -webkit-transition-duration: 0.3s; 107 | -moz-transition-duration: 0.3s; 108 | -o-transition-duration: 0.3s; 109 | transition-duration: 0.3s; 110 | background: #eeeeee; 111 | border: none; 112 | text-shadow: none; } 113 | /* line 105, ../scss/partials/_buttons.scss */ 114 | .button-flat:hover { 115 | background: #fbfbfb; } 116 | /* line 108, ../scss/partials/_buttons.scss */ 117 | .button-flat:active { 118 | -webkit-transition-duration: 0s; 119 | -moz-transition-duration: 0s; 120 | -o-transition-duration: 0s; 121 | transition-duration: 0s; 122 | background: #eeeeee; 123 | color: #bbbbbb; } 124 | /* line 113, ../scss/partials/_buttons.scss */ 125 | .button-flat.disabled { 126 | -webkit-box-shadow: none; 127 | -moz-box-shadow: none; 128 | box-shadow: none; 129 | -webkit-appearance: none; } 130 | 131 | /* line 123, ../scss/partials/_buttons.scss */ 132 | .button-border { 133 | -webkit-box-shadow: none; 134 | -moz-box-shadow: none; 135 | box-shadow: none; 136 | -webkit-transition-property: all; 137 | -moz-transition-property: all; 138 | -o-transition-property: all; 139 | transition-property: all; 140 | -webkit-transition-duration: 0.3s; 141 | -moz-transition-duration: 0.3s; 142 | -o-transition-duration: 0.3s; 143 | transition-duration: 0.3s; 144 | color: #666666; 145 | border: 2px solid #666666; 146 | background: none; 147 | text-shadow: none; } 148 | /* line 132, ../scss/partials/_buttons.scss */ 149 | .button-border:hover { 150 | background: none; 151 | color: gray; 152 | border: 2px solid gray; } 153 | /* line 137, ../scss/partials/_buttons.scss */ 154 | .button-border:active { 155 | -webkit-transition-duration: 0s; 156 | -moz-transition-duration: 0s; 157 | -o-transition-duration: 0s; 158 | transition-duration: 0s; 159 | background: none; 160 | color: #4d4d4d; 161 | border: 2px solid #4d4d4d; } 162 | /* line 143, ../scss/partials/_buttons.scss */ 163 | .button-border.disabled { 164 | -webkit-box-shadow: none; 165 | -moz-box-shadow: none; 166 | box-shadow: none; 167 | -webkit-appearance: none; } 168 | 169 | /* line 226, ../scss/partials/_buttons.scss */ 170 | .button-primary { 171 | background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #00b5e5), color-stop(100%, #008db2)); 172 | background: -webkit-linear-gradient(top, #00b5e5, #008db2); 173 | background: -moz-linear-gradient(top, #00b5e5, #008db2); 174 | background: -o-linear-gradient(top, #00b5e5, #008db2); 175 | background: linear-gradient(top, #00b5e5, #008db2); 176 | background-color: #00a1cb; 177 | border-color: #007998; 178 | color: white; 179 | text-shadow: 0 -1px 1px rgba(0, 40, 50, 0.35); } 180 | /* line 233, ../scss/partials/_buttons.scss */ 181 | .button-primary:hover { 182 | background-color: #00a1cb; 183 | background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #00c9fe), color-stop(100%, #008db2)); 184 | background: -webkit-linear-gradient(top, #00c9fe, #008db2); 185 | background: -moz-linear-gradient(top, #00c9fe, #008db2); 186 | background: -o-linear-gradient(top, #00c9fe, #008db2); 187 | background: linear-gradient(top, #00c9fe, #008db2); } 188 | /* line 237, ../scss/partials/_buttons.scss */ 189 | .button-primary:active { 190 | background: #1495b7; 191 | color: #005065; } 192 | 193 | /* line 321, ../scss/partials/_buttons.scss */ 194 | .button-flat-primary { 195 | -webkit-box-shadow: none; 196 | -moz-box-shadow: none; 197 | box-shadow: none; 198 | -webkit-transition-property: background; 199 | -moz-transition-property: background; 200 | -o-transition-property: background; 201 | transition-property: background; 202 | -webkit-transition-duration: 0.3s; 203 | -moz-transition-duration: 0.3s; 204 | -o-transition-duration: 0.3s; 205 | transition-duration: 0.3s; 206 | background: #00a1cb; 207 | color: white; 208 | text-shadow: none; 209 | border: none; } 210 | /* line 330, ../scss/partials/_buttons.scss */ 211 | .button-flat-primary:hover { 212 | background: #00b5e5; } 213 | /* line 333, ../scss/partials/_buttons.scss */ 214 | .button-flat-primary:active { 215 | -webkit-transition-duration: 0s; 216 | -moz-transition-duration: 0s; 217 | -o-transition-duration: 0s; 218 | transition-duration: 0s; 219 | background: #1495b7; 220 | color: #00647f; } 221 | /* line 338, ../scss/partials/_buttons.scss */ 222 | .button-flat-primary.disabled { 223 | -webkit-box-shadow: none; 224 | -moz-box-shadow: none; 225 | box-shadow: none; 226 | -webkit-appearance: none; } 227 | 228 | /* line 226, ../scss/partials/_buttons.scss */ 229 | .button-action { 230 | background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #8fcf00), color-stop(100%, #6b9c00)); 231 | background: -webkit-linear-gradient(top, #8fcf00, #6b9c00); 232 | background: -moz-linear-gradient(top, #8fcf00, #6b9c00); 233 | background: -o-linear-gradient(top, #8fcf00, #6b9c00); 234 | background: linear-gradient(top, #8fcf00, #6b9c00); 235 | background-color: #7db500; 236 | border-color: #5a8200; 237 | color: white; 238 | text-shadow: 0 -1px 1px rgba(19, 28, 0, 0.35); } 239 | /* line 233, ../scss/partials/_buttons.scss */ 240 | .button-action:hover { 241 | background-color: #7db500; 242 | background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #a0e800), color-stop(100%, #6b9c00)); 243 | background: -webkit-linear-gradient(top, #a0e800, #6b9c00); 244 | background: -moz-linear-gradient(top, #a0e800, #6b9c00); 245 | background: -o-linear-gradient(top, #a0e800, #6b9c00); 246 | background: linear-gradient(top, #a0e800, #6b9c00); } 247 | /* line 237, ../scss/partials/_buttons.scss */ 248 | .button-action:active { 249 | background: #76a312; 250 | color: #374f00; } 251 | 252 | /* line 321, ../scss/partials/_buttons.scss */ 253 | .button-flat-action { 254 | -webkit-box-shadow: none; 255 | -moz-box-shadow: none; 256 | box-shadow: none; 257 | -webkit-transition-property: background; 258 | -moz-transition-property: background; 259 | -o-transition-property: background; 260 | transition-property: background; 261 | -webkit-transition-duration: 0.3s; 262 | -moz-transition-duration: 0.3s; 263 | -o-transition-duration: 0.3s; 264 | transition-duration: 0.3s; 265 | background: #7db500; 266 | color: white; 267 | text-shadow: none; 268 | border: none; } 269 | /* line 330, ../scss/partials/_buttons.scss */ 270 | .button-flat-action:hover { 271 | background: #8fcf00; } 272 | /* line 333, ../scss/partials/_buttons.scss */ 273 | .button-flat-action:active { 274 | -webkit-transition-duration: 0s; 275 | -moz-transition-duration: 0s; 276 | -o-transition-duration: 0s; 277 | transition-duration: 0s; 278 | background: #76a312; 279 | color: #486900; } 280 | /* line 338, ../scss/partials/_buttons.scss */ 281 | .button-flat-action.disabled { 282 | -webkit-box-shadow: none; 283 | -moz-box-shadow: none; 284 | box-shadow: none; 285 | -webkit-appearance: none; } 286 | 287 | /* line 226, ../scss/partials/_buttons.scss */ 288 | .button-highlight { 289 | background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #fa9915), color-stop(100%, #d87e04)); 290 | background: -webkit-linear-gradient(top, #fa9915, #d87e04); 291 | background: -moz-linear-gradient(top, #fa9915, #d87e04); 292 | background: -o-linear-gradient(top, #fa9915, #d87e04); 293 | background: linear-gradient(top, #fa9915, #d87e04); 294 | background-color: #f18d05; 295 | border-color: #bf7004; 296 | color: white; 297 | text-shadow: 0 -1px 1px rgba(91, 53, 2, 0.35); } 298 | /* line 233, ../scss/partials/_buttons.scss */ 299 | .button-highlight:hover { 300 | background-color: #f18d05; 301 | background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #fba42e), color-stop(100%, #d87e04)); 302 | background: -webkit-linear-gradient(top, #fba42e, #d87e04); 303 | background: -moz-linear-gradient(top, #fba42e, #d87e04); 304 | background: -o-linear-gradient(top, #fba42e, #d87e04); 305 | background: linear-gradient(top, #fba42e, #d87e04); } 306 | /* line 237, ../scss/partials/_buttons.scss */ 307 | .button-highlight:active { 308 | background: #d8891e; 309 | color: #8d5303; } 310 | 311 | /* line 321, ../scss/partials/_buttons.scss */ 312 | .button-flat-highlight { 313 | -webkit-box-shadow: none; 314 | -moz-box-shadow: none; 315 | box-shadow: none; 316 | -webkit-transition-property: background; 317 | -moz-transition-property: background; 318 | -o-transition-property: background; 319 | transition-property: background; 320 | -webkit-transition-duration: 0.3s; 321 | -moz-transition-duration: 0.3s; 322 | -o-transition-duration: 0.3s; 323 | transition-duration: 0.3s; 324 | background: #f18d05; 325 | color: white; 326 | text-shadow: none; 327 | border: none; } 328 | /* line 330, ../scss/partials/_buttons.scss */ 329 | .button-flat-highlight:hover { 330 | background: #fa9915; } 331 | /* line 333, ../scss/partials/_buttons.scss */ 332 | .button-flat-highlight:active { 333 | -webkit-transition-duration: 0s; 334 | -moz-transition-duration: 0s; 335 | -o-transition-duration: 0s; 336 | transition-duration: 0s; 337 | background: #d8891e; 338 | color: #a66103; } 339 | /* line 338, ../scss/partials/_buttons.scss */ 340 | .button-flat-highlight.disabled { 341 | -webkit-box-shadow: none; 342 | -moz-box-shadow: none; 343 | box-shadow: none; 344 | -webkit-appearance: none; } 345 | 346 | /* line 226, ../scss/partials/_buttons.scss */ 347 | .button-caution { 348 | background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #e8543f), color-stop(100%, #d9331a)); 349 | background: -webkit-linear-gradient(top, #e8543f, #d9331a); 350 | background: -moz-linear-gradient(top, #e8543f, #d9331a); 351 | background: -o-linear-gradient(top, #e8543f, #d9331a); 352 | background: linear-gradient(top, #e8543f, #d9331a); 353 | background-color: #e54028; 354 | border-color: #c22d18; 355 | color: white; 356 | text-shadow: 0 -1px 1px rgba(103, 24, 13, 0.35); } 357 | /* line 233, ../scss/partials/_buttons.scss */ 358 | .button-caution:hover { 359 | background-color: #e54028; 360 | background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #eb6855), color-stop(100%, #d9331a)); 361 | background: -webkit-linear-gradient(top, #eb6855, #d9331a); 362 | background: -moz-linear-gradient(top, #eb6855, #d9331a); 363 | background: -o-linear-gradient(top, #eb6855, #d9331a); 364 | background: linear-gradient(top, #eb6855, #d9331a); } 365 | /* line 237, ../scss/partials/_buttons.scss */ 366 | .button-caution:active { 367 | background: #cd5240; 368 | color: #952312; } 369 | 370 | /* line 321, ../scss/partials/_buttons.scss */ 371 | .button-flat-caution { 372 | -webkit-box-shadow: none; 373 | -moz-box-shadow: none; 374 | box-shadow: none; 375 | -webkit-transition-property: background; 376 | -moz-transition-property: background; 377 | -o-transition-property: background; 378 | transition-property: background; 379 | -webkit-transition-duration: 0.3s; 380 | -moz-transition-duration: 0.3s; 381 | -o-transition-duration: 0.3s; 382 | transition-duration: 0.3s; 383 | background: #e54028; 384 | color: white; 385 | text-shadow: none; 386 | border: none; } 387 | /* line 330, ../scss/partials/_buttons.scss */ 388 | .button-flat-caution:hover { 389 | background: #e8543f; } 390 | /* line 333, ../scss/partials/_buttons.scss */ 391 | .button-flat-caution:active { 392 | -webkit-transition-duration: 0s; 393 | -moz-transition-duration: 0s; 394 | -o-transition-duration: 0s; 395 | transition-duration: 0s; 396 | background: #cd5240; 397 | color: #ac2815; } 398 | /* line 338, ../scss/partials/_buttons.scss */ 399 | .button-flat-caution.disabled { 400 | -webkit-box-shadow: none; 401 | -moz-box-shadow: none; 402 | box-shadow: none; 403 | -webkit-appearance: none; } 404 | 405 | /* line 226, ../scss/partials/_buttons.scss */ 406 | .button-royal { 407 | background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #99389f), color-stop(100%, #752a79)); 408 | background: -webkit-linear-gradient(top, #99389f, #752a79); 409 | background: -moz-linear-gradient(top, #99389f, #752a79); 410 | background: -o-linear-gradient(top, #99389f, #752a79); 411 | background: linear-gradient(top, #99389f, #752a79); 412 | background-color: #87318c; 413 | border-color: #632466; 414 | color: white; 415 | text-shadow: 0 -1px 1px rgba(26, 9, 27, 0.35); } 416 | /* line 233, ../scss/partials/_buttons.scss */ 417 | .button-royal:hover { 418 | background-color: #87318c; 419 | background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ab3eb2), color-stop(100%, #752a79)); 420 | background: -webkit-linear-gradient(top, #ab3eb2, #752a79); 421 | background: -moz-linear-gradient(top, #ab3eb2, #752a79); 422 | background: -o-linear-gradient(top, #ab3eb2, #752a79); 423 | background: linear-gradient(top, #ab3eb2, #752a79); } 424 | /* line 237, ../scss/partials/_buttons.scss */ 425 | .button-royal:active { 426 | background: #764479; 427 | color: #3e1740; } 428 | 429 | /* line 321, ../scss/partials/_buttons.scss */ 430 | .button-flat-royal { 431 | -webkit-box-shadow: none; 432 | -moz-box-shadow: none; 433 | box-shadow: none; 434 | -webkit-transition-property: background; 435 | -moz-transition-property: background; 436 | -o-transition-property: background; 437 | transition-property: background; 438 | -webkit-transition-duration: 0.3s; 439 | -moz-transition-duration: 0.3s; 440 | -o-transition-duration: 0.3s; 441 | transition-duration: 0.3s; 442 | background: #87318c; 443 | color: white; 444 | text-shadow: none; 445 | border: none; } 446 | /* line 330, ../scss/partials/_buttons.scss */ 447 | .button-flat-royal:hover { 448 | background: #99389f; } 449 | /* line 333, ../scss/partials/_buttons.scss */ 450 | .button-flat-royal:active { 451 | -webkit-transition-duration: 0s; 452 | -moz-transition-duration: 0s; 453 | -o-transition-duration: 0s; 454 | transition-duration: 0s; 455 | background: #764479; 456 | color: #501d53; } 457 | /* line 338, ../scss/partials/_buttons.scss */ 458 | .button-flat-royal.disabled { 459 | -webkit-box-shadow: none; 460 | -moz-box-shadow: none; 461 | box-shadow: none; 462 | -webkit-appearance: none; } 463 | 464 | /* line 358, ../scss/partials/_buttons.scss */ 465 | .button-jumbo { 466 | font-size: 24px; 467 | height: 51.2px; 468 | line-height: 51.2px; 469 | padding: 0px 40.96px; } 470 | 471 | /* line 358, ../scss/partials/_buttons.scss */ 472 | .button-large { 473 | font-size: 19px; 474 | height: 38.4px; 475 | line-height: 38.4px; 476 | padding: 0px 30.72px; } 477 | 478 | /* line 389, ../scss/partials/_buttons.scss */ 479 | input.button-large, button.button-large { 480 | height: 40.4px; } 481 | 482 | /* line 358, ../scss/partials/_buttons.scss */ 483 | .button-small { 484 | font-size: 15px; 485 | height: 25.6px; 486 | line-height: 25.6px; 487 | padding: 0px 20.48px; } 488 | 489 | /* line 389, ../scss/partials/_buttons.scss */ 490 | input.button-small, button.button-small { 491 | height: 27.6px; } 492 | 493 | /* line 358, ../scss/partials/_buttons.scss */ 494 | .button-tiny { 495 | font-size: 12px; 496 | height: 22.4px; 497 | line-height: 22.4px; 498 | padding: 0px 17.92px; } 499 | 500 | /* line 389, ../scss/partials/_buttons.scss */ 501 | input.button-tiny, button.button-tiny { 502 | height: 24.4px; } 503 | --------------------------------------------------------------------------------