JSFiddle - React, Tailwind, and code Playground

by ChangJoo Park

HTML

<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.3.0/Rx.js"></script>

    <h1>todos</h1>
    <div id="todoapp">
        <header>
            <input id="new-todo" type="text" placeholder="What needs to be done?">
        </header>
        <!-- this section is hidden by default and you be shown when there are todos and hidden when not -->
        <section id="main">
            <input id="toggle-all" type="checkbox">
            <label for="toggle-all">Mark all as complete</label>
            <ul id="todo-list">
                <li class="done">
                    <div class="view">
                        <input class="toggle" type="checkbox" checked>
                        <label>Create a TodoMVC template</label>
                        <a class="destroy"></a>
                    </div>
                    <input class="edit" type="text" value="Create a TodoMVC template">
                </li>
                <li>
                    <div class="view">
                        <input class="toggle" type="checkbox">
                        <label>Rule the web</label>
                        <a class="destroy"></a>
                    </div>
                    <input class="edit" type="text" value="Rule the web">
                </li>
            </ul>
        </section>
        <!-- this footer needs to be shown with JS when there are todos and hidden when not -->
        <footer>
            <div id="todo-count">1 item left</div>
            <a id="clear-completed">Clear completed</a>
        </footer>
    </div>
    <div id="instructions">
        Double-click to edit a todo.
    </div>
    <div id="credits">
        Created by <a href="http://addyosmani.github.com/todomvc/">you</a>.

CSS

html,
body {
    margin: 0;
    padding: 0;
}

body {
    font: 14px "Helvetica Neue", Helvetica, Arial, sans-serif;
    line-height: 1.4em;
    background: #eeeeee url('bgnoise_lg2.png');
    color: #4D4D4D;
    width: 550px;
    margin: 0 auto;
    -webkit-font-smoothing: antialiased;
}

#todoapp {
    background: #fff;
    background: rgba(255, 255, 255, 0.8);
    margin: 40px 0;
    //box-shadow: rgba(0, 0, 0, 0.2) 0 2px 6px 0;
    border: 1px solid #ccc;
    position: relative;

    border-top-left-radius: 2px;
    border-top-right-radius: 2px;

    box-shadow: rgba(0, 0, 0, 0.2) 0 2px 6px 0, rgba(0,0,0,0.15) 0 25px 50px 0;
}

#todoapp:before {
    content: '';
    border-left: 1px solid #fcc;
    border-right: 1px solid #fcc;
    width: 2px;
    position: absolute;
    top: 0;
    left: 40px;
    height: 100%;
}

#todoapp:after {
    content: '';
    position: absolute;
    width: 100%;
    height: 100px;
    bottom: 0;
    box-shadow: 0 1px 1px rgba(0,0,0,0.3),
                0 6px 0 -3px rgba(255, 255, 255, 0.8),
                0 7px 1px -3px rgba(0,0,0,0.3),
                0 42px 0 -6px rgba(255, 255, 255, 0.8),
                0 43px 1px -6px rgba(0,0,0,0.3);
}


h1 {
    font-size: 70px;
    font-weight: bold;
    text-align: center;
    color: rgba(255,255,255,0.3);
    padding: 0 0 10px 0;
    //font-family: Georgia;
    -webkit-text-rendering: optimizeLegibility;
    text-shadow: -1px -1px rgba(0, 0, 0, 0.2);
}


#todoapp header {
    padding-top: 15px;
    border-radius: inherit;
}

#todoapp header:before {
    content: '';
    position: absolute;
    top: 0;
    right: 0;
    left: 0;
    height: 15px;
    //background: rgba(149, 74, 74, 0.5);
    z-index: 2;
    background: -webkit-linear-gradient(top, rgba(200, 163, 163, 0.80), rgba(165, 133, 133, 0.80)), url('bgnoise_lg2.png');
    border-radius: inherit;
    border-bottom: 1px solid #A88A8A;
}


/* 3d
h1 {
    font-size: 70px;
    font-weight: bold;
    text-align: center;
    color:...

JavaScript

var newTodoInput = document.getElementById('new-todo')

var fromEvent = Rx.Observable.fromEvent

var lengthValidationStream = fromEvent(newTodoInput, 'keyup')
															.map(event => event.target.value)
                              .filter(value => console.log(value))
                              .subscribe(value => console.log(value))
                              .startWith(false)
/*
var enterKeyStream = fromEvent(newTodoInput, 'keyup')
											.filter(event => event.keyCode === 13)

var combineLatest = Rx.Observable.combineLatest
var formInput =  combineLatest(lengthValidationStream, enterKeyStream, (lengthValidation, enterKey) => {
	return {
  	lengthValidationStream: lengthValidation,
    enterKeyStream: enterKey
	}
})

formInput.subscribe((formValid) => {
	console.log(formValid)
})
*/