{
  "product": "Specification (reference)",
  "title": "TodoMVC",
  "summary": "The canonical todo app — the reference specification every framework implements.",
  "category": "apps",
  "entries": [
    {
      "path": [
        "AI",
        "Model",
        "Todo item shape"
      ],
      "value": "id, title, completed",
      "status": "yes",
      "note": "unique id per todo"
    },
    {
      "path": [
        "AI",
        "Model",
        "Add todo"
      ],
      "value": "",
      "status": "yes",
      "note": "trimmed title; empty input is ignored"
    },
    {
      "path": [
        "AI",
        "Model",
        "Edit todo title"
      ],
      "value": "",
      "status": "yes",
      "note": "empty result deletes the todo"
    },
    {
      "path": [
        "AI",
        "Model",
        "Toggle completed"
      ],
      "value": "",
      "status": "yes",
      "note": "per item"
    },
    {
      "path": [
        "AI",
        "Model",
        "Toggle all"
      ],
      "value": "",
      "status": "yes",
      "note": "sets all to the same state; unchecks when all complete"
    },
    {
      "path": [
        "AI",
        "Model",
        "Delete todo"
      ],
      "value": "",
      "status": "yes",
      "note": ""
    },
    {
      "path": [
        "AI",
        "Model",
        "Clear completed"
      ],
      "value": "",
      "status": "yes",
      "note": "removes all completed items"
    },
    {
      "path": [
        "AI",
        "Persistence",
        "Todos survive reload"
      ],
      "value": "localStorage",
      "status": "yes",
      "note": "or equivalent local store"
    },
    {
      "path": [
        "AI",
        "Routing",
        "Filter routes"
      ],
      "value": "#/, #/active, #/completed",
      "status": "yes",
      "note": "filter state in the URL, restored on load"
    },
    {
      "path": [
        "UI",
        "List",
        "Render todos per active filter"
      ],
      "value": "",
      "status": "yes",
      "note": ""
    },
    {
      "path": [
        "UI",
        "List",
        "Hide chrome when list empty"
      ],
      "value": "",
      "status": "yes",
      "note": "main section and footer hidden with no todos"
    },
    {
      "path": [
        "UI",
        "New todo input",
        "Focus on load"
      ],
      "value": "",
      "status": "yes",
      "note": "autofocus"
    },
    {
      "path": [
        "UI",
        "New todo input",
        "Enter adds and clears input"
      ],
      "value": "",
      "status": "yes",
      "note": ""
    },
    {
      "path": [
        "UI",
        "Item",
        "Double-click enters edit mode"
      ],
      "value": "",
      "status": "yes",
      "note": "input focused, caret at end"
    },
    {
      "path": [
        "UI",
        "Item",
        "Enter/blur commits, Escape cancels"
      ],
      "value": "",
      "status": "yes",
      "note": ""
    },
    {
      "path": [
        "UI",
        "Item",
        "Completed styling"
      ],
      "value": "strikethrough",
      "status": "yes",
      "note": ""
    },
    {
      "path": [
        "UI",
        "Item",
        "Destroy button on hover"
      ],
      "value": "",
      "status": "yes",
      "note": ""
    },
    {
      "path": [
        "UI",
        "Footer",
        "Active items counter"
      ],
      "value": "\"N items left\"",
      "status": "yes",
      "note": "correct singular/plural"
    },
    {
      "path": [
        "UI",
        "Footer",
        "Filter links with selected state"
      ],
      "value": "All / Active / Completed",
      "status": "yes",
      "note": ""
    },
    {
      "path": [
        "UI",
        "Footer",
        "Clear-completed visibility"
      ],
      "value": "",
      "status": "yes",
      "note": "shown only when completed items exist"
    }
  ]
}
