diff --git a/config.js b/config.js index 22ff245..7dc7a8f 100644 --- a/config.js +++ b/config.js @@ -7,7 +7,7 @@ "maxLength": 400000, - "cacheStaticAssets": true, + "cacheStaticAssets": false, "logging": [ { diff --git a/lib/static_handler.js b/lib/static_handler.js index cd50d13..3cc5ec3 100644 --- a/lib/static_handler.js +++ b/lib/static_handler.js @@ -28,6 +28,7 @@ StaticHandler.contentTypeFor = function(ext) { else if (ext == '.html') return 'text/html'; else if (ext == '.ico') return 'image/ico'; else if (ext == '.txt') return 'text/plain'; + else if (ext == '.png') return 'image/png'; else { winston.error('unable to determine content type for static asset with extension: ' + ext); return 'text/plain'; diff --git a/static/application.css b/static/application.css index dbed46c..141e2b2 100644 --- a/static/application.css +++ b/static/application.css @@ -33,18 +33,80 @@ textarea { #key { position: fixed; - top: 20px; - right: 20px; - text-align: right; - z-index: -1000; /* watch out */ - color: #999; - font-size: 13px; - font-family: monospace; - line-height: 1.3em; + top: 0px; + right: 0px; + z-index: +1000; /* watch out */ } -#key em { - display: block; - margin-bottom: 5px; - color: #ccc !important; +#key .box1 { + padding: 5px; + text-align: center; + background: #00222b; } + +#key .box2 { + padding: 5px; + background: #08323c; + font-size: 0px; +} + +#key .box1 a.logo, #key .box1 a.logo:visited { + display: inline-block; + background: url(logo.png); + width: 126px; + height: 42px; +} + +#key .box1 a.logo:hover { + background-position: 0 bottom; +} + +#key .box2 .function { + background: url(function-icons.png); + width: 32px; + height: 37px; + display: inline-block; +} + +#key .box2 .function.enabled:hover { + cursor: hand; + cursor: pointer; +} + +#key .box3 { + background: #173e48; + font-family: Helvetica, sans-serif; + font-size: 12px; + line-height: 14px; + padding: 10px 15px; +} + +#key .box3 .label { + color: #fff; + font-weight: bold; +} + +#key .box3 .shortcut { + color: #c4dce3; + font-weight: normal; +} + +#key .box2 .function.save { background-position: 0px top; } +#key .box2 .function.enabled.save { background-position: 0px center; } +#key .box2 .function.enabled.save:hover { background-position: 0px bottom; } + +#key .box2 .function.new { background-position: -32px top; } +#key .box2 .function.enabled.new { background-position: -32px center; } +#key .box2 .function.enabled.new:hover { background-position: -32px bottom; } + +#key .box2 .function.duplicate { background-position: -64px top; } +#key .box2 .function.enabled.duplicate { background-position: -64px center; } +#key .box2 .function.enabled.duplicate:hover { background-position: -64px bottom; } + +#key .box2 .function.link { background-position: -96px top; } +#key .box2 .function.enabled.link { background-position: -96px center; } +#key .box2 .function.enabled.link:hover { background-position: -96px bottom; } + +#key .box2 .function.twitter { background-position: -128px top; } +#key .box2 .function.enabled.twitter { background-position: -128px center; } +#key .box2 .function.enabled.twitter:hover { background-position: -128px bottom; } diff --git a/static/application.js b/static/application.js index 393371c..5687ca7 100644 --- a/static/application.js +++ b/static/application.js @@ -61,6 +61,11 @@ var haste = function(appName, options) { this.$code = $('#box code'); this.options = options; this.configureShortcuts(); + this.configureButtons(); + // If twitter is disabled, hide the button + if (!options.twitter) { + $('#key .box2 .twitter').hide(); + } }; // Set the page title - include the appName @@ -71,23 +76,27 @@ haste.prototype.setTitle = function(ext) { // Show the light key haste.prototype.lightKey = function() { - var text = ''; - text += '' + this.appName + ''; - text += '^s - save
'; - text += '^n - new'; - $('#key').html(text); + this.configureKey(['new', 'save']); }; // Show the full key haste.prototype.fullKey = function() { - var text = ''; - text += '' + this.appName + ''; - text += '^n - new
'; - text += '^d - duplicate
'; - if (this.options.twitter) { - text += '^t - twitter'; - } - $('#key').html(text); + this.configureKey(['new', 'duplicate', 'twitter', 'link']); +}; + +// Set the key up for certain things to be enabled +haste.prototype.configureKey = function(enable) { + var $this, i = 0; + $('#key .box2 .function').each(function() { + $this = $(this); + for (i = 0; i < enable.length; i++) { + if ($this.hasClass(enable[i])) { + $this.addClass('enabled'); + return true; + } + } + $this.removeClass('enabled'); + }); }; // Remove the current document (if there is one) @@ -170,32 +179,101 @@ haste.prototype.lockDocument = function() { }); }; +haste.prototype.configureButtons = function() { + var _this = this; + this.buttons = [ + { + $where: $('#key .box2 .save'), + label: 'Save', + shortcutDescription: 'control + s', + shortcut: function(evt) { + return evt.ctrlKey && (evt.keyCode === 76 || evt.keyCode === 83); + }, + action: function() { + if (_this.$textarea.val().replace(/^\s+|\s+$/g, '') !== '') { + _this.lockDocument(); + } + } + }, + { + $where: $('#key .box2 .new'), + label: 'New', + shortcut: function(evt) { + return evt.ctrlKey && evt.keyCode === 78 + }, + shortcutDescription: 'control + n', + action: function() { + _this.newDocument(!_this.doc.key); + } + }, + { + $where: $('#key .box2 .duplicate'), + label: 'Duplicate & Edit', + shortcut: function(evt) { + return _this.doc.locked && evt.ctrlKey && evt.keyCode === 68; + }, + shortcutDescription: 'control + d', + action: function() { + _this.duplicateDocument(); + } + }, + { + $where: $('#key .box2 .twitter'), + label: 'Twitter', + shortcut: function(evt) { + return _this.options.twitter && _this.doc.locked && evt.ctrlKey && evt.keyCode == 84; + }, + shortcutDescription: 'control + t', + action: function() { + window.open('https://twitter.com/share?url=' + encodeURI(_this.baseUrl + _this.doc.key)); + } + }, + { + $where: $('#key .box2 .link'), + label: 'Copy URL', + action: function() { + alert('not yet implemented'); + } + } + ]; + for (var i = 0; i < this.buttons.length; i++) { + this.configureButton(this.buttons[i]); + } +}; + +haste.prototype.configureButton = function(options) { + // Handle the click action + options.$where.click(function(evt) { + evt.preventDefault(); + if ($(this).hasClass('enabled')) { + options.action(); + } + }); + // Show the label + options.$where.mouseenter(function(evt) { + $('#key .box3 .label').text(options.label); + $('#key .box3 .shortcut').text(options.shortcutDescription || ''); + $('#key .box3').show(); + }); + // Hide the label + options.$where.mouseleave(function(evt) { + $('#key .box3').hide(); + }); +}; + // Configure keyboard shortcuts for the textarea haste.prototype.configureShortcuts = function() { var _this = this; $(document.body).keydown(function(evt) { - // ^L or ^S for lock - if (evt.ctrlKey && (evt.keyCode === 76 || evt.keyCode === 83)) { - if (_this.$textarea.val().replace(/^\s+|\s+$/g, '') !== '') { + var button; + for (var i = 0 ; i < _this.buttons.length; i++) { + button = _this.buttons[i]; + if (button.shortcut && button.shortcut(evt)) { evt.preventDefault(); - _this.lockDocument(); + button.action(); + return; } } - // ^N for new document - else if (evt.ctrlKey && evt.keyCode === 78) { - evt.preventDefault(); - _this.newDocument(!_this.doc.key); - } - // ^D for duplicate - only when locked - else if (_this.doc.locked && evt.ctrlKey && evt.keyCode === 68) { - evt.preventDefault(); - _this.duplicateDocument(); - } - // ^T for redirecting to twitter - else if (_this.options.twitter && _this.doc.locked && evt.ctrlKey && evt.keyCode == 84) { - evt.preventDefault(); - window.open('https://twitter.com/share?url=' + encodeURI(_this.baseUrl + _this.doc.key)); - } }); }; diff --git a/static/function-icons.png b/static/function-icons.png new file mode 100644 index 0000000..f2bb192 Binary files /dev/null and b/static/function-icons.png differ diff --git a/static/hover-dropdown-tip.png b/static/hover-dropdown-tip.png new file mode 100644 index 0000000..4841492 Binary files /dev/null and b/static/hover-dropdown-tip.png differ diff --git a/static/index.html b/static/index.html index 5817aa3..886ace6 100644 --- a/static/index.html +++ b/static/index.html @@ -44,7 +44,23 @@ -
+
+
+ +
+
+ + + + + +
+ +
+ diff --git a/static/logo.png b/static/logo.png new file mode 100644 index 0000000..a03ce90 Binary files /dev/null and b/static/logo.png differ