-
Notifications
You must be signed in to change notification settings - Fork 94
Expand file tree
/
Copy pathtodo-app.ts
More file actions
122 lines (107 loc) · 3.55 KB
/
todo-app.ts
File metadata and controls
122 lines (107 loc) · 3.55 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
import { LitElement, html, css } from "lit";
import { classMap } from "lit/directives/class-map.js";
import { customElement } from "lit/decorators/custom-element.js";
import { state } from "lit/decorators/state.js";
import { todoStyles } from "./todo.css.js";
import { Todos } from "./todos.js";
import "./todo-list.js";
import "./todo-form.js";
import "./todo-footer.js";
import { AddTodoEvent, DeleteTodoEvent, ToggleAllTodoEvent, EditTodoEvent, ClearCompletedEvent } from "./events.js";
import { updateOnEvent } from "./utils.js";
@customElement("todo-app")
export class TodoApp extends LitElement {
static override styles = [
todoStyles,
css`
:host {
display: block;
background: #fff;
margin: 130px 0 40px 0;
position: relative;
box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2), 0 25px 50px 0 rgba(0, 0, 0, 0.1);
}
h1 {
position: absolute;
top: -140px;
width: 100%;
font-size: 80px;
font-weight: 200;
text-align: center;
color: #b83f45;
-webkit-text-rendering: optimizeLegibility;
-moz-text-rendering: optimizeLegibility;
text-rendering: optimizeLegibility;
}
main {
position: relative;
z-index: 2;
border-top: 1px solid #e6e6e6;
}
.hidden {
display: none;
}
:focus {
box-shadow: none !important;
}
`,
];
@updateOnEvent("change")
@state()
accessor todoList = new Todos();
constructor() {
super();
// event handlers for the app
this.addEventListener(AddTodoEvent.eventName, this.#onAddTodo);
this.addEventListener(DeleteTodoEvent.eventName, this.#onDeleteTodo);
this.addEventListener(EditTodoEvent.eventName, this.#onEditTodo);
this.addEventListener(ToggleAllTodoEvent.eventName, this.#onToggleAll);
this.addEventListener(ClearCompletedEvent.eventName, this.#onClearCompleted);
}
override connectedCallback(): void {
super.connectedCallback();
this.todoList.connect();
}
override disconnectedCallback(): void {
super.disconnectedCallback();
this.todoList.disconnect();
}
override render() {
return html`<section>
<header class="header">
<h1>todos</h1>
<todo-form .todoList=${this.todoList}></todo-form>
</header>
<main class="main">
<todo-list class="show-priority" .todoList=${this.todoList}></todo-list>
</main>
<todo-footer
class="${classMap({
hidden: this.todoList.all.length === 0,
})}"
.todoList=${this.todoList}
></todo-footer>
</section>`;
}
#onAddTodo = (e: AddTodoEvent) => {
this.todoList.add(e.text);
};
#onDeleteTodo = (e: DeleteTodoEvent) => {
this.todoList.delete(e.id);
};
#onEditTodo = (e: EditTodoEvent) => {
this.todoList.update(e.edit);
};
#onToggleAll = (_e: ToggleAllTodoEvent) => {
this.todoList.toggleAll();
};
#onClearCompleted = (_e: ClearCompletedEvent) => {
this.todoList.clearCompleted();
};
}
declare global {
// eslint-disable-next-line no-unused-vars
interface HTMLElementTagNameMap {
"todo-app": TodoApp;
}
}