Skip to content

Commit e831d3b

Browse files
authored
1 parent cc927cd commit e831d3b

File tree

1 file changed

+117
-0
lines changed

1 file changed

+117
-0
lines changed

word-counter.html

+117
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8">
5+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
6+
<title>Word counter</title>
7+
<style>
8+
* {
9+
box-sizing: border-box;
10+
}
11+
12+
body {
13+
font-family: Helvetica, Arial, sans-serif;
14+
margin: 0;
15+
padding: 20px;
16+
background: #f5f5f5;
17+
}
18+
19+
.container {
20+
max-width: 800px;
21+
margin: 0 auto;
22+
}
23+
24+
h1 {
25+
color: #333;
26+
margin-bottom: 20px;
27+
}
28+
29+
.writing-area {
30+
width: 100%;
31+
min-height: 400px;
32+
padding: 20px;
33+
margin-bottom: 15px;
34+
border: 1px solid #ccc;
35+
border-radius: 4px;
36+
background: white;
37+
font-size: 16px;
38+
line-height: 1.5;
39+
resize: vertical;
40+
}
41+
42+
.stats {
43+
color: #666;
44+
font-size: 14px;
45+
}
46+
47+
.save-status {
48+
color: #888;
49+
font-style: italic;
50+
margin-left: 15px;
51+
}
52+
</style>
53+
</head>
54+
<body>
55+
<div class="container">
56+
<h1>Word counter</h1>
57+
<textarea class="writing-area" placeholder="Start writing here..."></textarea>
58+
<div class="stats">
59+
Words: <span id="wordCount">0</span>
60+
<span class="save-status" id="saveStatus"></span>
61+
</div>
62+
</div>
63+
64+
<script type="module">
65+
const STORAGE_KEY = 'writing-content'
66+
const textarea = document.querySelector('.writing-area')
67+
const wordCountElement = document.getElementById('wordCount')
68+
const saveStatus = document.getElementById('saveStatus')
69+
70+
let saveTimeout
71+
72+
function countWords(text) {
73+
return text.trim() ? text.trim().split(/\s+/).length : 0
74+
}
75+
76+
function updateWordCount() {
77+
const count = countWords(textarea.value)
78+
wordCountElement.textContent = count
79+
}
80+
81+
function showSavedStatus() {
82+
saveStatus.textContent = 'Saved'
83+
setTimeout(() => {
84+
saveStatus.textContent = ''
85+
}, 2000)
86+
}
87+
88+
function saveToLocalStorage() {
89+
localStorage.setItem(STORAGE_KEY, textarea.value)
90+
showSavedStatus()
91+
}
92+
93+
function debouncedSave() {
94+
clearTimeout(saveTimeout)
95+
saveStatus.textContent = 'Saving...'
96+
saveTimeout = setTimeout(saveToLocalStorage, 1000)
97+
}
98+
99+
// Load saved content
100+
const savedContent = localStorage.getItem(STORAGE_KEY)
101+
if (savedContent) {
102+
textarea.value = savedContent
103+
updateWordCount()
104+
}
105+
106+
// Event listeners
107+
textarea.addEventListener('input', () => {
108+
updateWordCount()
109+
debouncedSave()
110+
})
111+
112+
textarea.addEventListener('paste', () => {
113+
setTimeout(updateWordCount, 0)
114+
})
115+
</script>
116+
</body>
117+
</html>

0 commit comments

Comments
 (0)