qEau!ZZB-Z9>OcY(LCzEs5cG115DjO%#LH%9
zXLp@hNic|zf#1wK^S;l#zkxC8^?DU}rgXq+<_{^|xyQU#j|C{sd*mxO`PJ)i()BP6g(hOGS=$VT-371&N-4oG
zah)krS@N-%IFfKG@!T`MZ(L(MnP8||(=?aCFboJhm(X)Kzc6tw-(@Fz1%x0aEIxlZ
zVfbx8rBYe8sz?Ii;?F$9%;b{2&sy4MdNF28waR988UGypYgKpjg~WFy(lwRE8K!WM
zVy1E-j^n82;?J{|z(C3K35Axj9R$(s^Fkf}y4_+BSr((wD2nIc*Iuuev~8R9j2#{3
z{`1{Rr4p)EheHiMYBrlMl&-G$$xk)&TYv!oZ{Yz_rx7@200000NkvXXu0mjfq=x@b
literal 0
HcmV?d00001
diff --git a/public/index.html b/public/index.html
index 6a947b9..07eeb16 100644
--- a/public/index.html
+++ b/public/index.html
@@ -52,7 +52,11 @@ Arrow configuration
-
+
+
@@ -67,7 +71,8 @@ Arrow configuration
-
+
+
diff --git a/public/js/lib/app.js b/public/js/lib/app.js
index 7af2769..2d590e9 100644
--- a/public/js/lib/app.js
+++ b/public/js/lib/app.js
@@ -34,7 +34,7 @@ if (!('CSSArrowPlease' in window)) window.CSSArrowPlease = {};
this.views = [
new G.ArrowConfigurationView({ model: model, container: $('.configuration') }),
new G.ArrowPreviewView({ model: model, container: $('').appendTo('body') }),
- new G.ArrowCSSView({ model: model, container: $('.result_code') }),
+ new G.ArrowCSSView({ model: model, container: $('.css_result') }),
];
},
diff --git a/public/js/lib/views/arrow_css_view.js b/public/js/lib/views/arrow_css_view.js
index 2cf8f63..fdcb688 100644
--- a/public/js/lib/views/arrow_css_view.js
+++ b/public/js/lib/views/arrow_css_view.js
@@ -15,8 +15,10 @@ if (!('CSSArrowPlease' in window)) window.CSSArrowPlease = {};
init: function (options) {
this.container = options.container;
- this.model = options.model;
+ this._codeNode = this.container.find('.code');
+ this._copyNode = this.container.find('.copy_code');
+ this.model = options.model;
this.model.on('change', this._handleChange, this);
},
@@ -35,7 +37,12 @@ if (!('CSSArrowPlease' in window)) window.CSSArrowPlease = {};
@chainable
**/
render: function () {
- this.container.text( this.model.toCSS() );
+ var css = this.model.toCSS();
+
+ this._codeNode.text( css );
+ this._copyNode.text( css )
+ .clippy({ transparent: true });
+
return this;
}
diff --git a/public/js/lib/views/arrow_preview_view.js b/public/js/lib/views/arrow_preview_view.js
index e42b267..6b31f55 100644
--- a/public/js/lib/views/arrow_preview_view.js
+++ b/public/js/lib/views/arrow_preview_view.js
@@ -31,11 +31,11 @@ if (!('CSSArrowPlease' in window)) window.CSSArrowPlease = {};
/**
@method render
- @description borrows the render function from ArrowCSSView
+ @description renders the css to style the preview
@chainable
**/
render: function () {
- G.ArrowCSSView.prototype.render.call(this);
+ this.container.text( this.model.toCSS() );
return this;
}
diff --git a/public/js/spec/views/arrow_css_view_spec.js b/public/js/spec/views/arrow_css_view_spec.js
index 8f591a4..74f6bcf 100644
--- a/public/js/spec/views/arrow_css_view_spec.js
+++ b/public/js/spec/views/arrow_css_view_spec.js
@@ -3,24 +3,38 @@ describe("CSSArrowPlease.ArrowCSSView", function () {
var arrow, arrowCSSView, $container;
beforeEach(function () {
- $container = $('');
+ $container = $('');
+ $code = $container.find('.code');
+ $copy = $container.find('.copy_code');
+
arrow = new CSSArrowPlease.Arrow();
arrowCSSView = new CSSArrowPlease.ArrowCSSView({
model: arrow,
container: $container
});
+
+ spyOn( $copy, 'clippy' );
+
+ arrowCSSView._codeNode = $code;
+ arrowCSSView._copyNode = $copy;
});
describe('render', function () {
+
it('returns itself for chainability', function () {
expect( arrowCSSView.render() ).toBe( arrowCSSView );
});
it('renders the css when render is called', function () {
- expect( $container.text() ).toBe( '' );
+ expect( $code.text() ).toBe( '' );
+ arrowCSSView.render();
+ expect( $code.text() ).toBe( arrow.toCSS() );
+ });
+
+ it('calls clippy() on the copy_code node', function () {
arrowCSSView.render();
- expect( $container.text() ).toBe( arrow.toCSS() );
+ expect( $copy.clippy ).toHaveBeenCalled();
});
});
diff --git a/public/js/spec/views/arrow_preview_view_spec.js b/public/js/spec/views/arrow_preview_view_spec.js
index 6f08d02..0356c46 100644
--- a/public/js/spec/views/arrow_preview_view_spec.js
+++ b/public/js/spec/views/arrow_preview_view_spec.js
@@ -17,11 +17,8 @@ describe("CSSArrowPlease.ArrowPreviewView", function() {
});
it('render delegates to ArrowCSSView.render', function () {
- spyOn(CSSArrowPlease.ArrowCSSView.prototype, 'render');
-
arrowPreviewView.render();
-
- expect(CSSArrowPlease.ArrowCSSView.prototype.render).toHaveBeenCalled();
+ expect( $container.text() ).toBe( arrow.toCSS() );
});
});
diff --git a/public/js/spec_runner.html b/public/js/spec_runner.html
index c6eb8f2..98163a7 100644
--- a/public/js/spec_runner.html
+++ b/public/js/spec_runner.html
@@ -8,6 +8,7 @@
+
diff --git a/public/js/vendor/jquery.clippy/jquery.clippy.min.js b/public/js/vendor/jquery.clippy/jquery.clippy.min.js
new file mode 100755
index 0000000..ed73017
--- /dev/null
+++ b/public/js/vendor/jquery.clippy/jquery.clippy.min.js
@@ -0,0 +1 @@
+(function(a){a.fn.clippy=function(b){_opts={width:"14",height:"14",color:"#ffffff",clippy_path:"clippy.swf",keep_text:false,transparent:false};b=a.extend(_opts,b);params={movie:b.clippy_path,allowScriptAccess:"always",quality:"high",scale:"noscale"};if(b.transparent&&typeof b.transparent==="string"){params.wmode=b.transparent}else{if(b.transparent&&typeof b.transparent==="boolean"){params.wmode="transparent"}else{params.bgcolor=b.color}}embed_params=a.extend({},params,{width:b.width,height:b.height});embed_params.src=embed_params.movie;delete embed_params.movie;this.each(function(c,f){if(b.text&&b.text!=""){text=b.text}else{if(a(f).data("text")&&a(f).data("text")!=""){text=a(f).data("text")}else{text=a(f).text()}}text=encodeURIComponent(text);params.FlashVars="text="+text;embed_params.FlashVars="text="+text;dom=a("").attr({classid:"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000",width:b.width,height:b.height});embed=a("").attr(embed_params);try{dom.append(embed);a.each(params,function(e,g){dom.prepend(a("").attr({name:e,value:g}))})}catch(d){dom=embed}if(b.keep_text){a(f).html(dom).append(decodeURIComponent(text))}else{a(f).html(dom)}})}})(jQuery);
\ No newline at end of file
From 3f42200223283abd3eb9e0ac84db3240176c00d0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Simon=20H=C3=B8jberg?=
Date: Sat, 12 May 2012 15:46:19 +0200
Subject: [PATCH 02/35] Added a simple way to run the node app in dev
Run `node bin/server --development` to start
the app in development mode
---
bin/server | 16 +++++++++++++---
1 file changed, 13 insertions(+), 3 deletions(-)
diff --git a/bin/server b/bin/server
index 26c676f..f1ef1b5 100644
--- a/bin/server
+++ b/bin/server
@@ -1,8 +1,18 @@
#!/usr/bin/env node
var connect = require('connect'),
- http = require('http');
+ http = require('http'),
+ port = process.env.PORT || 3000,
+ static;
-var app = connect().use(connect.static('public-min', { maxAge: 365 * 24 * 60 * 60 * 1000}));
+if (process.argv.indexOf('--development') !== -1) {
+ console.log('CSS Arrow Please in development on http://localhost:' + port);
+ static = connect.static('public');
+}
+else {
+ static = connect.static('public-min', {
+ maxAge: 365 * 24 * 60 * 60 * 1000
+ });
+}
-http.createServer(app).listen(process.env.PORT || 3000);
+http.createServer( connect().use( static ) ).listen( port );
From 22897f04095298a58f36944d308d34800904b5fe Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Simon=20H=C3=B8jberg?=
Date: Sat, 12 May 2012 15:48:22 +0200
Subject: [PATCH 03/35] updated the readme to reflect development
---
README.md | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/README.md b/README.md
index 5c1b24d..5595316 100644
--- a/README.md
+++ b/README.md
@@ -2,5 +2,9 @@
Generate the CSS for a tooltip arrow.
Check it out at http://cssarrowplease.com
+## Contributing
+You can simply open the public/index.html file in your browser
+or start the development node app (not required): `node bin/server --development`
+
## License
CSSArrowPlease is Copyright © 2012 Simon Højberg. CSSArrowPlease is free software, and may be redistributed under the terms specified in the LICENSE file.
From 45350f9d3d6a7798addf0fe0e32317307bcd7084 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Simon=20H=C3=B8jberg?=
Date: Sat, 12 May 2012 22:16:46 +0200
Subject: [PATCH 04/35] Slightly better internet explorer support
Site now works in IE9. IE8 Still has issues
because setting text of a ').appendTo('body') }),
+ new ArrowCSSView({ model: model, container: $('.css_result') }),
+ ];
+ },
+
+ render: function () {
+ $.each(this.views, function (i, view) {
+ view.render();
+ });
+ }
+
+};
+
+new App().render();
+
diff --git a/app/models/arrow.js b/app/models/arrow.js
new file mode 100644
index 0000000..fafde4d
--- /dev/null
+++ b/app/models/arrow.js
@@ -0,0 +1,291 @@
+var $ = require('jquery');
+
+/**
+@class Arrow
+@constructor
+**/
+var Arrow = function () {
+ this.init.apply(this, arguments);
+};
+
+Arrow.prototype = {
+
+ init: function () {
+ // jquerify 'this'
+ this._$self = $(this);
+
+ this._createAttrs();
+ },
+
+ /**
+ @method invertedPosition
+ @description
+ returns the opposite of the position
+ so 'top' becomes 'bottom' and 'left' becomes 'right'
+ @returns {String}
+ **/
+ invertedPosition: function () {
+ var pos = this.get('position');
+
+ if ( pos === 'top' ) return 'bottom';
+ else if ( pos === 'bottom') return 'top';
+ else if ( pos === 'left' ) return 'right';
+ else if ( pos === 'right' ) return 'left';
+ },
+
+ /**
+ @method hexToRGB
+ @description
+ returns an rgb color from an hex color
+ @returns {Array}
+ **/
+ hexToRGB: function (h) {
+ if ( typeof h !== 'string' || !h.match(/^#([0-9A-F]{3}$)|([0-9A-F]{6}$)/i) ) return [0, 0, 0];
+ else if ( h.match(/^(#[0-9a-f]{3})$/i) ) h = '#' + h[1] + h[1] + h[2] + h[2] + h[3] + h[3];
+ var rgb = [],
+ i = 1;
+
+ for(; i < 6; i+=2) {
+ rgb.push(parseInt(h.substring(i, i + 2), 16));
+ }
+ return rgb;
+ },
+
+ /**
+ @method _baseCSS
+ @description generates the base css
+ @returns {String} css
+ @protected
+ **/
+ _baseCSS: function () {
+ var pos = this.get('position'),
+ iPos = this.invertedPosition(),
+ color = this.get('color'),
+ borderWidth = this.get('borderWidth'),
+ borderColor = this.get('borderColor'),
+ hasBorder = borderWidth > 0,
+ css = '.arrow_box {\n';
+
+ color = this._sanitizeHexColors(color);
+
+ css += '\tposition: relative;\n';
+ css += '\tbackground: ' + color + ';\n';
+
+ if (hasBorder) {
+ borderColor = this._sanitizeHexColors(borderColor);
+ css += '\tborder: ' + borderWidth + 'px solid ' + borderColor + ';\n';
+ }
+
+ css += '}\n';
+ css += '.arrow_box:after';
+
+ if (hasBorder) css += ', .arrow_box:before {\n';
+ else css += ' {\n';
+
+ css += '\t' + iPos +': 100%;\n';
+
+ if (pos === 'top' || pos === 'bottom') {
+ css += '\tleft: 50%;\n';
+ }
+ else {
+ css += '\ttop: 50%;\n';
+ }
+
+ css += '\tborder: solid transparent;\n';
+ css += '\tcontent: " ";\n';
+ css += '\theight: 0;\n';
+ css += '\twidth: 0;\n';
+ css += '\tposition: absolute;\n';
+ css += '\tpointer-events: none;\n';
+
+ if (hasBorder) css += '}\n';
+
+ return css;
+ },
+
+ /**
+ @method _arrowCSS
+ @description generates arrow css
+ @param {String} color the color of the arrow
+ @param {Integer} size the size of the arrow
+ @param {String} layer :after or :before (defaults to :after)
+ @returns {String} css
+ @protected
+ **/
+ _arrowCSS: function (color, size, layer) {
+ color = this._sanitizeHexColors(color);
+ var pos = this.get('position'),
+ iPos = this.invertedPosition(),
+ rgbColor = this.hexToRGB(color),
+ borderWidth = this.get('borderWidth'),
+ css = "";
+
+ layer = layer || 'after';
+
+ if(borderWidth > 0) css += '.arrow_box:' + layer + ' {\n';
+
+ css += '\tborder-color: rgba(' + rgbColor.join(', ') + ', 0);\n';
+ css += '\tborder-' + iPos + '-color: ' + color + ';\n';
+ css += '\tborder-width: ' + size + 'px;\n';
+
+ if (pos === 'top' || pos === 'bottom') {
+ css += '\tmargin-left: -' + size + 'px;\n';
+ }
+ else {
+ css += '\tmargin-top: -' + size + 'px;\n';
+ }
+
+ css += '}';
+
+ return css;
+ },
+
+ /**
+ @method _baseArrowCSS
+ @description generates the base arrow
+ @returns {String} css
+ @protected
+ **/
+ _baseArrowCSS: function () {
+ return this._arrowCSS(
+ this.get('color'),
+ this.get('size'),
+ 'after'
+ );
+ },
+
+ /**
+ @method _arrowBorderCSS
+ @description generates the border arrow
+ @returns {String} css
+ @protected
+ **/
+ _arrowBorderCSS: function () {
+ var css = '',
+ borderWidth = this.get('borderWidth');
+
+ if (borderWidth > 0) {
+ css = this._arrowCSS(
+ this.get('borderColor'),
+ this.get('size') + Math.round(borderWidth * 1.41421356), // cos(PI/4) * 2
+ 'before'
+ );
+ }
+
+ return css;
+ },
+
+ /**
+ @method toCSS
+ @description returns a CSS representation of the arrow
+ @returns {String} css
+ **/
+ toCSS: function () {
+
+ var css = [
+ this._baseCSS(),
+ this._baseArrowCSS(),
+ this._arrowBorderCSS()
+ ];
+
+ return css.join(css[2] ? '\n':'');
+ },
+
+ /**
+ @method _createAttrs
+ @description creates attributes from the ATTR constant
+ @protected
+ **/
+ _createAttrs: function () {
+ var ATTRS = Arrow.ATTRS,
+ attributes = {};
+
+ $.each(ATTRS, function (attr, value) {
+ attributes[attr] = value;
+ });
+
+ this._attributes = attributes;
+ },
+
+ /**
+ @method _sanitizeHexColors
+ @description prefix hexcolors with # if necessary
+ @returns {String} h
+ @protected
+ **/
+ _sanitizeHexColors: function(h) {
+ return (h.charAt(0)==='#')?h:'#' + h;
+ },
+
+ /**
+ @method getAttrs
+ @description returns all the attributes
+ @returns {Object} all the model attributes
+ **/
+ getAttrs: function () {
+ return this._attributes;
+ },
+
+ /**
+ @method get
+ @description returns the provided attribute
+ @param {String} attr the attribute to return
+ @returns {?} the attribute
+ **/
+ get: function (attr) {
+ return this._attributes[attr];
+ },
+
+ /**
+ @method set
+ @description updates the provided attribute
+ @param {String} attr the attribute to update
+ @param {?} val the value to update with
+ **/
+ set: function (attr, val) {
+ if (!(attr in this._attributes)) return;
+
+ this._attributes[attr] = val;
+ this.fire('change');
+ },
+
+ /**
+ @method on
+ @description adds event listeners
+ @note uses jQuery custom events under the hood
+ @param {String} evType the event type
+ @param {Function} callback the event handler
+ @param {Object} context the 'this' for the callback
+ **/
+ on: function (evType, callback, context) {
+ var $self = this._$self;
+
+ $self.on(
+ evType,
+ $.proxy(callback, context || this)
+ );
+ },
+
+ /**
+ @method fire
+ @description trigger event
+ @note uses jQuery custom events under the hood
+ @param {String} evType the event type
+ **/
+ fire: function (evType) {
+ var $self = this._$self;
+
+ $self.trigger(evType);
+ }
+
+};
+
+Arrow.ATTRS = {
+ position: 'top',
+ size: 30,
+ color: '#88b7d5',
+ borderWidth: 4,
+ borderColor: '#c2e1f5'
+};
+
+module.exports = Arrow;
diff --git a/app/views/arrow_configuration_view.js b/app/views/arrow_configuration_view.js
new file mode 100644
index 0000000..93595c6
--- /dev/null
+++ b/app/views/arrow_configuration_view.js
@@ -0,0 +1,108 @@
+var $ = require('jquery');
+
+/**
+@class ArrowConfigurationView
+@constructor
+**/
+var ArrowConfigurationView = function () {
+ this.init.apply(this, arguments);
+};
+
+ArrowConfigurationView.prototype = {
+
+ init: function (options) {
+ this.container = options.container;
+ this.model = options.model;
+
+ this._attachEvents();
+ },
+
+ /**
+ @method render
+ @chainable
+ **/
+ render: function () {
+ this._setDefaults();
+ return this;
+ },
+
+ /**
+ @method _setDetaults
+ @description update the view with the model defaults
+ **/
+ _setDefaults: function () {
+ var container = this.container,
+ model = this.model;
+
+ container.find('.position').val([ model.get('position') ]);
+ container.find('.size').val( model.get('size') );
+ container.find('.base_color').val( model.get('color') );
+ container.find('.border_width').val( model.get('borderWidth') );
+ container.find('.border_color').val( model.get('borderColor') );
+ },
+
+ /**
+ @method _attachEvents
+ @description attaches dom events
+ @protected
+ **/
+ _attachEvents: function () {
+ var _updateModelProxy = this._updateModel.bind(this),
+ _updateInputProxy = this._updateInput.bind(this),
+ container = this.container,
+ selectors = [ { classname: '.position', keyboard_interactive: false },
+ { classname: '.size', keyboard_interactive: true },
+ { classname: '.base_color', keyboard_interactive: false },
+ { classname: '.border_width', keyboard_interactive: true },
+ { classname: '.border_color', keyboard_interactive: false }
+ ];
+
+ selectors.forEach(function (selector, i) {
+ container.delegate(selector.classname, 'change', _updateModelProxy);
+ if (selector.keyboard_interactive) {
+ container.delegate(selector.classname, 'keydown', _updateInputProxy);
+ }
+ });
+ },
+
+ _updateModel: function (ev) {
+ var target = $(ev.currentTarget),
+ val = target.val(),
+ attr;
+
+
+ if (target.hasClass('border_width')) {
+ attr = 'borderWidth';
+ }
+ else if (target.hasClass('border_color')) {
+ attr = 'borderColor';
+ }
+ else if (target.hasClass('base_color')) {
+ attr = 'color';
+ }
+ else {
+ attr = target.attr('class');
+ }
+
+ if (attr === 'borderWidth' || attr === 'size') val = parseInt(val, 10);
+ this.model.set(attr, val);
+ },
+
+ _updateInput: function (ev) {
+ if (ev.keyCode != 38 && ev.keyCode != 40) return;
+
+ var target = $(ev.currentTarget),
+ val = parseInt(target.val()),
+ increment = ev.keyCode == 38 ? 1 : -1,
+ multiply = ev.shiftKey ? 10 : 1,
+ newVal = val + increment * multiply;
+
+ if (newVal < 0) newVal = 0;
+
+ target.val(newVal);
+ this._updateModel(ev);
+ }
+
+};
+
+module.exports = ArrowConfigurationView;
diff --git a/app/views/arrow_css_view.js b/app/views/arrow_css_view.js
new file mode 100644
index 0000000..efe89ce
--- /dev/null
+++ b/app/views/arrow_css_view.js
@@ -0,0 +1,44 @@
+/**
+@class ArrowCSSView
+@constructor
+**/
+var ArrowCSSView = function () {
+ this.init.apply(this, arguments);
+};
+
+ArrowCSSView.prototype = {
+
+ init: function (options) {
+ this.container = options.container;
+ this._codeNode = this.container.find('.code');
+ this._copyNode = this.container.find('.copy_code');
+
+ this.model = options.model;
+ this.model.on('change', this._handleChange, this);
+ },
+
+ /**
+ @method _handleChange
+ @description handles changes to the model
+ @chainable
+ **/
+ _handleChange: function () {
+ this.render();
+ },
+
+ /**
+ @method render
+ @description renders the model's css
+ @chainable
+ **/
+ render: function () {
+ var css = this.model.toCSS();
+
+ this._codeNode.text( css );
+
+ return this;
+ }
+
+};
+
+module.exports = ArrowCSSView;
diff --git a/app/views/arrow_preview_view.js b/app/views/arrow_preview_view.js
new file mode 100644
index 0000000..61d7941
--- /dev/null
+++ b/app/views/arrow_preview_view.js
@@ -0,0 +1,39 @@
+/**
+@class ArrowPreviewView
+@constructor
+**/
+var ArrowPreviewView = function () {
+ this.init.apply(this, arguments);
+};
+
+ArrowPreviewView.prototype = {
+
+ init: function (options) {
+ this.container = options.container;
+ this.model = options.model;
+
+ this.model.on('change', this._handleChange, this);
+ },
+
+ /**
+ @method _handleChange
+ @description handles changes to the model
+ @chainable
+ **/
+ _handleChange: function () {
+ this.render();
+ },
+
+ /**
+ @method render
+ @description renders the css to style the preview
+ @chainable
+ **/
+ render: function () {
+ this.container.text( this.model.toCSS() );
+ return this;
+ }
+
+};
+
+module.exports = ArrowPreviewView;
diff --git a/package.json b/package.json
index 822f80d..258cd66 100644
--- a/package.json
+++ b/package.json
@@ -16,13 +16,22 @@
],
"homepage": "http://cssarrowplease.com/",
"scripts": {
- "start": "node ./server.js"
+ "start": "node ./server.js",
+ "build": "./node_modules/browserify/bin/cmd.js -e app/main.js -o public/js/cssarrowplease.js",
+ "test": "mocha --require=test/test_helper.js"
},
"dependencies": {
- "connect": "~2.0.3"
+ "connect": "~2.0.3",
+ "browserify": "latest",
+ "jquery": "latest",
+ "jsdom": "latest",
+ "mocha": "latest",
+ "chai": "latest",
+ "sinon": "latest",
+ "sinon-chai": "latest"
},
"engines": {
- "node": ">=0.6"
+ "node": ">=0.10"
},
"licenses": [
{
diff --git a/public/css/app.css b/public/css/app.css
index c137a21..fbf43dc 100644
--- a/public/css/app.css
+++ b/public/css/app.css
@@ -54,8 +54,6 @@ input[type='radio'] { border: 0; }
/* css_result */
.css_result { position: relative; float: right; width: 402px; }
.css_result .code { white-space: pre; padding: 10px; display: block; width: 380px; font-size: 12px; font-family: 'Courier new'; font-weight: bold; background: #8c9196; background: rgba(0, 0, 0, 0.15); border-radius: 4px; color: #fff; text-shadow: 0 1px 1px rgba(0, 0, 0, 0.3); border: 1px solid #696d72; border-color: rgba(0, 0, 0, 0.2); box-shadow: 0 1px 1px 0 rgba(255, 255, 255, 0.3), inset 0 1px 5px rgba(0, 0, 0, 0.1); }
-.css_result .copy_code { position: absolute; bottom: 5px; right: 10px; width: 14px; height: 22px; background: url(../img/clippy.png) no-repeat 0 4px; }
-
/* fork_me */
.fork_me { position: absolute; top: 0; right: 0; display: block; width: 149px; height: 149px; background: url(../img/fork.png); }
diff --git a/public/index.html b/public/index.html
index fa3c54c..c336ad7 100644
--- a/public/index.html
+++ b/public/index.html
@@ -73,50 +73,30 @@ Arrow configuration
-
-
-
-
-
-
-
-
+