atom Logo atom guides demos

Demo apps

Simple to do app

import { LitElement, html, css } from "lit-element";
import { LitAtom, atom, selector } from "@klaxon/atom";

const [todos, setTodos] = atom({
  key: 'todos',
  default: [{id: Date.now(), text: 'todo', isComplete: false}]
});

const [filter, setFilter] = atom({
  key: 'filter',
  default: 'all'
});

const filteredTodos = selector({
  key: 'filteredTodos',
  get: ({getAtom}) => {
    const todoList = getAtom(todos);
    const todoFilter = getAtom(filter);

    switch(todoFilter) {
      case 'active':
        return todoList.filter(todo => !todo.isComplete);
      case 'completed':
        return todoList.filter(todo => todo.isComplete);
      case 'all':
        return todoList;
    }
  }
});


const addTodo = e => {
  e.preventDefault();
  setTodos(old => [
    ...old,
    {
      id: Date.now(),
      text: e.target.elements.todo.value,
      isComplete: false
    }
  ])
}

export class TodoApp extends LitAtom(LitElement) {
  static atoms = [todos, filter];
  static selectors = [filteredTodos];

  render() {
    return html`
      <h1>todos</h1>
      
      <form @submit=${addTodo}>
        <input name="todo" placeholder="What needs to be done?"/>
        <button type="submit">submit</button>
      </form>

      <ul>
        ${this.filteredTodos?.map(({text, isComplete, id}) => html`
          <li>
            <input 
              type="checkbox" 
              .checked=${isComplete} 
              @change=${() => setTodos(old => old.map(todo => todo.id === id ? {...todo, isComplete: true} : todo))} 
            />
            <p>${text}</p>
            <button @click=${() => setTodos(old => old.filter(todo => todo.id !== id))}></button>
          </li>
        `)}
      </ul>

      <div>
        <p>${this.filteredTodos?.length} items</p>
        <div>
          <button @click=${() => setFilter('all')}>all</button>
          <button @click=${() => setFilter('active')}>active</button>
          <button @click=${() => setFilter('completed')}>completed</button>
        </div>
      </div>
    `;
  }
}

customElements.define("todo-app", TodoApp);

Advanced to do app

import { LitElement, html, css} from 'lit-element';
import './todo-debug.js';
import './todo-list.js';
import './todo-detail.js';

class TodoApp extends LitElement {
  render() {
    return html`
      <todo-debug></todo-debug>
      <todo-list></todo-list>
      <todo-detail></todo-detail>
    `
  }
}

customElements.define('todo-app', TodoApp);