nakome
11/18/2014 - 3:41 AM

Css editor experimet

Css editor experimet

::-webkit-scrollbar {
    width: 12px
}
::-webkit-scrollbar-track {
    background-color: #fff;
    border-left: 1px solid #fff
}
::-webkit-scrollbar-thumb {
    background-color: #ccc
}
::-webkit-scrollbar-thumb:hover {
    background-color: #aaa
}
* {
    -moz-box-sizing: border-box;
    box-sizing: border-box
}
html,
body {
    width: 100%;
    height: 100%;
    position: relative;
}
body {
    margin: 0;
    padding: 0;
    background: #DB5B35;
    font-family: "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;
    font-weight: 300;
    font-size: 13px;
}
.wrapper {
    display: block;
    width: 100%;
    height: 100%;
    margin: 0 auto;
    background: #F5F5F5;
    padding: 0;
    box-shadow: 0 0.2em 0.5em #842E0F;
    position: relative;
}
.header {
    display: block;
    width: 100%;
    height: 3em;
    margin: 0;
    padding: 0;
    overflow: hidden;
    background: #FFF;
    border-bottom: 0.1em solid #DADADA;
    position: absolute;
    top: 0;
    left: 0;
}
.header-left {
    display: inline-block;
    float: left;
    height: 2.7em;
}
.header-left a {
    display: inline-block;
    float: left;
    line-height: 2.5em;
    margin-left: 0.2em;
    text-decoration: none;
    color: #5A5858;
    padding: 0.5em 0.2em;
    font-size: 0.8em;
}
.header-left a:hover {
    color: #FF3000;
}
.main {
    margin: 0;
    padding: 0;
    position: absolute;
    top: 3em;
    width: 100%;
    height: calc(100% - 4.5em);
    overflow: auto;
}
.footer {
    background: #FFF;
    border-top: 0.1em solid #E8E8E8;
    height: 1.5em;
    width: 100%;
    position: absolute;
    bottom: 0;
    left: 0;
    margin: 0;
    padding: 0;
}
#input {
    display: block;
    width: 48% !important;
    float: left;
    border: 0;
    height: 100%;
    background-color: #eee;
    color: #000;
    resize: none;
    outline: none;
}
#output {
    background-color: #000;
    display: block;
    width: 52% !important;
    float: left;
    border: 0;
    height: 100%;
    background-color: #fff;
    color: #333;
    resize: none;
    outline: none;
}
document.addEventListener('load',cssEdit);
var cssEdit = (function(){
  'use strict';
  
  String.prototype.capitalize = function(lower) {
        return (lower ? this.toLowerCase() : this).replace(/(?:^|\s)\S/g, function(a) {
            return a.toUpperCase();
        });
    };


    var btn = document.querySelector('#controls').getElementsByTagName('a');
    var input = document.querySelector('#input');
    var output = document.querySelector('#output');
    var editor = new Editor(input);
    var controls = {
        //editor.insert('\n#id{\n}');
        //editor.wrap('','');
        'class': function() {
            editor.wrap('.class{\n\t', '\n}\n');
        },
        'id': function() {
            editor.wrap('#id{\n\t', '\n}\n');
        },
        'float': function() {
            editor.insert('float:');
        },
        'width': function() {
            editor.insert('width:');
        },
        'height': function() {
            editor.insert('height:');
        },
        'position': function() {
            editor.insert('position:');
        },
        'display': function() {
            editor.insert('display:');
        },
        'background': function() {
            editor.insert('background:');
        },
        'color': function() {
            editor.insert('color:');
        },
        'transform': function() {
            editor.insert('transform:');
        },
        'translate': function() {
            editor.wrap('translate(', ')');
        },
        'scale': function() {
            editor.wrap('scale(', ');');
        },
        'rotate': function() {
            editor.wrap('rotate(', ')');
        },
        'transition': function() {
            editor.insert('transition:');
        },
        'animation': function() {
            editor.insert('animation:');
        },
        'keyframes': function() {
            editor.wrap('@keyframes foo{\n\tfrom{\n\t\t', '\n\t}\n\tto{\n\t\t\n\t}\n}\n');
        },
        'full': function() {
            editor.insert('100%');
        },
    };


    for (var i = 0, len = btn.length; i < len; ++i) {
        click(btn[i]);
        btn[i].href = '#';
    }


    var pressed = 0;
    editor.area.onkeydown = function(e) {
        if (pressed < 5) {
            pressed++;
        } else {
            editor.updateHistory();
            pressed = 0;
        }
        if (e.keyCode == 9) {
            editor.indent('    ');
            return false;
        }
        if (e.keyCode == 13) {
            editor.indent('\n\t');
            return false;
        }
    };
    
    if(!input.value){ autoprefix(input);}
    input.addEventListener('keyup', function() {
        autoprefix(this);
    });

    input.focus();

    // localStorage
    if (localStorage !== null) {
      input.value = localStorage.getItem('css_saved');
      var t = setInterval(function() {
        localStorage.setItem('css_saved', input.value);
        console.info('save text');
      }, 10000);
    } 

    function autoprefix(el){
      var source = el.value;
      var compiled = autoprefixer().process(source);
      output.value = compiled.css;
    }
    function click(elem) {
        var hash = elem.hash.replace('#', "");
        if (controls[hash]) {
            elem.onclick = function() {
                controls[hash]();
                return false;
            };
        }
    }
})();

<!-- wrapper -->
<div class="wrapper">
    <div class="header">
        <div class="header-left">
            <div id="controls">
                <a href="#class">Class</a>
                <a href="#id">Id</a>
                <a href="#position">Position</a>
                <a href="#width">Width</a>
                <a href="#height">Height</a>
                <a href="#float">Float</a>
                <a href="#display">Display</a>
                <a href="#background">Background</a>
                <a href="#color">Color</a>
                <a href="#transform">Transform</a>
                <a href="#translate">Translate</a>
                <a href="#scale">Scale</a>
                <a href="#rotate">Rotate</a>
                <a href="#transition">Transition</a>
                <a href="#animation">Animation</a>
                <a href="#keyframes">Keyframes</a>
                <a href="#full">100%</a>
            </div>
        </div>
    </div>
    <div class="main">
        <textarea id="input">
.class{
	transform:translate(50%,50%);
	transition:all 1s ease;
	animation: foo 1s infinite ease;
}
	
@keyframes foo{
	from{
		transform:scale(1.1,1.1);
	}
	to{
		transform:scale(1,1);
	}
}

        </textarea>
        <textarea id="output"></textarea>
    </div>
    <div class="footer">

    </div>
</div>

Css editor experimet

Css editor expriment with: Editor_library.js by Taufik Nurrohman http://www.dte.web.id, http://latitudu.com autoprefixer.js by Andrey Sitnik https://github.com/ai/autoprefixer-rails And localStore to save session. See Fullscreen for good experience

A Pen by Moncho Varela on CodePen.

License.