@aidget-community/sticky-todos 0.0.0-stage → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/agents.md +31 -0
- package/assets/screenshot.png +0 -0
- package/assets/watercolor-paper-texture.png +0 -0
- package/config.json +12 -0
- package/index.html +128 -0
- package/package.json +24 -4
- package/style.css +336 -0
- package/README.md +0 -3
package/agents.md
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# sticky-todos · 待办事项
|
|
2
|
+
|
|
3
|
+
## 用途
|
|
4
|
+
|
|
5
|
+
桌面便签,展示可勾选事项。勾选状态由宿主按 widget id 持久化,重启 aidget 后恢复。
|
|
6
|
+
|
|
7
|
+
## 可改区域
|
|
8
|
+
|
|
9
|
+
- `todos`:任务列表容器。每条 `li` 必须保留唯一的 `data-todo-id`,对应一条 `<label>` 和原生 `<input type="checkbox">`。
|
|
10
|
+
- 修改任务后,同步更新标题旁的完成计数总数。
|
|
11
|
+
|
|
12
|
+
## 存储与权限
|
|
13
|
+
|
|
14
|
+
- 必须保留 `script` 与 `storage` 权限。
|
|
15
|
+
- 浏览器原生 `localStorage` 在 opaque-origin 沙箱中不可用;脚本只使用异步 `window.aidget.storage`。
|
|
16
|
+
- 持久化 key 为 `todo-checked-v1`,值是 `data-todo-id -> boolean` 的 JSON 字符串。
|
|
17
|
+
- 加载成功后才启用复选框;保存失败时回滚本次勾选,并通过隐藏的 `role=status` 显示“保存失败”。
|
|
18
|
+
- 主窗口预览没有宿主桥时会禁用复选框并显示“预览模式”,这是预期行为。
|
|
19
|
+
- 异步初始化结束后调用 `window.aidget?.ready?.()`。
|
|
20
|
+
|
|
21
|
+
## 布局
|
|
22
|
+
|
|
23
|
+
- 窗口固定为 360×260,页面声明 `aidget-surface=none` 并绘制完整便签表面。
|
|
24
|
+
- 顶部 28px 是宿主拖拽区;纸张从 13px 开始,胶带超出纸张上边界且不能被裁剪。
|
|
25
|
+
- 纸面由 `.paper` 负责不规则纸边、水彩纹理和阴影;`.note::before` 是半透明胶带。
|
|
26
|
+
- 纸张纹理使用 `assets/watercolor-paper-texture.png`;不使用 `backdrop-filter`、横线或点阵背景。
|
|
27
|
+
- 任务列表保持单列紧凑排列,与标题间距 18px,底部留 16px。
|
|
28
|
+
|
|
29
|
+
## 刷新
|
|
30
|
+
|
|
31
|
+
无定时刷新。状态未恢复时检查 `storage` 权限、宿主存储和底部状态文案。
|
|
Binary file
|
|
Binary file
|
package/config.json
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "sticky-todos",
|
|
3
|
+
"title": "待办事项",
|
|
4
|
+
"minHostVersion": "0.1.1",
|
|
5
|
+
"logo": null,
|
|
6
|
+
"screenshots": ["assets/screenshot.png"],
|
|
7
|
+
"platforms": ["macos", "windows", "linux"],
|
|
8
|
+
"size": { "width": 360, "height": 260 },
|
|
9
|
+
"dragMode": "all",
|
|
10
|
+
"permissions": ["script", "storage"],
|
|
11
|
+
"network": []
|
|
12
|
+
}
|
package/index.html
ADDED
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="zh-CN">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
+
<meta name="aidget-surface" content="none" />
|
|
7
|
+
<link rel="stylesheet" href="./style.css" />
|
|
8
|
+
</head>
|
|
9
|
+
<body>
|
|
10
|
+
<main class="note" aria-labelledby="note-title">
|
|
11
|
+
<div class="paper" aria-hidden="true"></div>
|
|
12
|
+
<header class="note-head">
|
|
13
|
+
<h1 id="note-title">待办事项</h1>
|
|
14
|
+
<p class="count" aria-label="已完成事项"><span data-done-count>0</span><span>/2</span></p>
|
|
15
|
+
</header>
|
|
16
|
+
|
|
17
|
+
<ul class="todos" data-aidget-region="todos">
|
|
18
|
+
<li data-todo-id="try-checkbox">
|
|
19
|
+
<label class="todo-option">
|
|
20
|
+
<input type="checkbox" />
|
|
21
|
+
<span class="todo-text">点击复选框标记完成,状态会自动保存。</span>
|
|
22
|
+
</label>
|
|
23
|
+
</li>
|
|
24
|
+
<li data-todo-id="ask-agent">
|
|
25
|
+
<label class="todo-option">
|
|
26
|
+
<input type="checkbox" />
|
|
27
|
+
<span class="todo-text">让 Agent 添加、删除或整理待办事项。</span>
|
|
28
|
+
</label>
|
|
29
|
+
</li>
|
|
30
|
+
</ul>
|
|
31
|
+
|
|
32
|
+
<span class="visually-hidden" data-storage-status role="status" aria-live="polite"></span>
|
|
33
|
+
</main>
|
|
34
|
+
|
|
35
|
+
<script>
|
|
36
|
+
const STORAGE_KEY = 'todo-checked-v1';
|
|
37
|
+
const inputs = Array.from(document.querySelectorAll('[data-todo-id] input'));
|
|
38
|
+
const status = document.querySelector('[data-storage-status]');
|
|
39
|
+
const doneCount = document.querySelector('[data-done-count]');
|
|
40
|
+
const storage = window.aidget && window.aidget.storage;
|
|
41
|
+
let statusTimer;
|
|
42
|
+
|
|
43
|
+
function setStatus(message, isError = false) {
|
|
44
|
+
window.clearTimeout(statusTimer);
|
|
45
|
+
status.textContent = message;
|
|
46
|
+
status.classList.toggle('is-error', isError);
|
|
47
|
+
if (!isError && message === '已自动保存') {
|
|
48
|
+
statusTimer = window.setTimeout(() => {
|
|
49
|
+
status.textContent = '勾选后自动保存';
|
|
50
|
+
}, 1600);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function setDisabled(disabled) {
|
|
55
|
+
for (const input of inputs) input.disabled = disabled;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function syncItem(input) {
|
|
59
|
+
input.closest('[data-todo-id]').classList.toggle('is-done', input.checked);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function syncAll() {
|
|
63
|
+
for (const input of inputs) syncItem(input);
|
|
64
|
+
doneCount.textContent = String(inputs.filter((input) => input.checked).length);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function snapshot() {
|
|
68
|
+
const values = {};
|
|
69
|
+
for (const input of inputs) {
|
|
70
|
+
values[input.closest('[data-todo-id]').dataset.todoId] = input.checked;
|
|
71
|
+
}
|
|
72
|
+
return JSON.stringify(values);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
async function save(input, previous) {
|
|
76
|
+
setDisabled(true);
|
|
77
|
+
setStatus('正在保存…');
|
|
78
|
+
try {
|
|
79
|
+
await storage.setItem(STORAGE_KEY, snapshot());
|
|
80
|
+
setStatus('已自动保存');
|
|
81
|
+
} catch {
|
|
82
|
+
input.checked = previous;
|
|
83
|
+
syncAll();
|
|
84
|
+
setStatus('保存失败', true);
|
|
85
|
+
} finally {
|
|
86
|
+
setDisabled(false);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
async function boot() {
|
|
91
|
+
if (!storage) {
|
|
92
|
+
setDisabled(true);
|
|
93
|
+
setStatus('预览模式');
|
|
94
|
+
window.aidget?.ready?.();
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
setDisabled(true);
|
|
99
|
+
try {
|
|
100
|
+
const saved = await storage.getItem(STORAGE_KEY);
|
|
101
|
+
if (saved !== null) {
|
|
102
|
+
const values = JSON.parse(saved);
|
|
103
|
+
for (const input of inputs) {
|
|
104
|
+
const id = input.closest('[data-todo-id]').dataset.todoId;
|
|
105
|
+
if (typeof values[id] === 'boolean') input.checked = values[id];
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
syncAll();
|
|
109
|
+
setDisabled(false);
|
|
110
|
+
setStatus('勾选后自动保存');
|
|
111
|
+
for (const input of inputs) {
|
|
112
|
+
input.addEventListener('change', () => {
|
|
113
|
+
syncAll();
|
|
114
|
+
void save(input, !input.checked);
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
} catch {
|
|
118
|
+
setDisabled(true);
|
|
119
|
+
setStatus('存储不可用', true);
|
|
120
|
+
}
|
|
121
|
+
window.aidget?.ready?.();
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
syncAll();
|
|
125
|
+
void boot();
|
|
126
|
+
</script>
|
|
127
|
+
</body>
|
|
128
|
+
</html>
|
package/package.json
CHANGED
|
@@ -1,6 +1,26 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aidget-community/sticky-todos",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "水彩纸张风格的桌面待办便签,勾选状态自动保存。",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": {
|
|
7
|
+
"name": "micooz",
|
|
8
|
+
"email": "micooz@hotmail.com",
|
|
9
|
+
"url": "https://github.com/micooz"
|
|
10
|
+
},
|
|
11
|
+
"repository": {
|
|
12
|
+
"type": "git",
|
|
13
|
+
"url": "git+https://github.com/aidget-ai/widgets.git",
|
|
14
|
+
"directory": "packages/sticky-todos"
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"config.json",
|
|
18
|
+
"index.html",
|
|
19
|
+
"style.css",
|
|
20
|
+
"agents.md",
|
|
21
|
+
"assets"
|
|
22
|
+
],
|
|
23
|
+
"publishConfig": {
|
|
24
|
+
"access": "public"
|
|
25
|
+
}
|
|
26
|
+
}
|
package/style.css
ADDED
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
:root {
|
|
2
|
+
color-scheme: light;
|
|
3
|
+
--ink: #241d0d;
|
|
4
|
+
--ink-soft: #564722;
|
|
5
|
+
--paper: #f8e994;
|
|
6
|
+
--paper-deep: #efd874;
|
|
7
|
+
--line: rgb(106 88 35 / 0.14);
|
|
8
|
+
--check: #4d5a2d;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
* {
|
|
12
|
+
box-sizing: border-box;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
html,
|
|
16
|
+
body {
|
|
17
|
+
width: 100%;
|
|
18
|
+
height: 100%;
|
|
19
|
+
margin: 0;
|
|
20
|
+
overflow: hidden;
|
|
21
|
+
background: transparent;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
body {
|
|
25
|
+
color: var(--ink);
|
|
26
|
+
font-family: 'Kaiti SC', 'STKaiti', 'KaiTi', 'Songti SC', serif;
|
|
27
|
+
-webkit-font-smoothing: antialiased;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
.note {
|
|
31
|
+
position: absolute;
|
|
32
|
+
inset: 13px 8px 8px;
|
|
33
|
+
display: flex;
|
|
34
|
+
flex-direction: column;
|
|
35
|
+
padding: 26px 18px 8px;
|
|
36
|
+
overflow: visible;
|
|
37
|
+
isolation: isolate;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.paper {
|
|
41
|
+
position: absolute;
|
|
42
|
+
inset: 0;
|
|
43
|
+
z-index: 0;
|
|
44
|
+
clip-path: polygon(
|
|
45
|
+
1% 1%,
|
|
46
|
+
6% 0.5%,
|
|
47
|
+
12% 1.4%,
|
|
48
|
+
18% 0.4%,
|
|
49
|
+
25% 0.8%,
|
|
50
|
+
34% 0.3%,
|
|
51
|
+
42% 0.9%,
|
|
52
|
+
51% 0.5%,
|
|
53
|
+
59% 0.8%,
|
|
54
|
+
68% 0.4%,
|
|
55
|
+
76% 0.9%,
|
|
56
|
+
84% 0.5%,
|
|
57
|
+
91% 1.1%,
|
|
58
|
+
97% 0.7%,
|
|
59
|
+
99.5% 4%,
|
|
60
|
+
99% 12%,
|
|
61
|
+
99.6% 20%,
|
|
62
|
+
99.1% 29%,
|
|
63
|
+
99.5% 39%,
|
|
64
|
+
99% 50%,
|
|
65
|
+
99.6% 59%,
|
|
66
|
+
99.2% 68%,
|
|
67
|
+
99.5% 78%,
|
|
68
|
+
99.4% 90%,
|
|
69
|
+
98.7% 94.5%,
|
|
70
|
+
99.2% 96.8%,
|
|
71
|
+
98.8% 98.1%,
|
|
72
|
+
99.3% 99.1%,
|
|
73
|
+
96.5% 98.7%,
|
|
74
|
+
94.5% 99.4%,
|
|
75
|
+
90.8% 98.9%,
|
|
76
|
+
88.3% 99.3%,
|
|
77
|
+
84.5% 98.8%,
|
|
78
|
+
82% 99.4%,
|
|
79
|
+
74% 98.5%,
|
|
80
|
+
66% 99.5%,
|
|
81
|
+
58% 98.7%,
|
|
82
|
+
50% 99.4%,
|
|
83
|
+
42% 98.8%,
|
|
84
|
+
34% 99.5%,
|
|
85
|
+
26% 98.6%,
|
|
86
|
+
18% 99.3%,
|
|
87
|
+
10% 98.6%,
|
|
88
|
+
3% 96%,
|
|
89
|
+
0.8% 91%,
|
|
90
|
+
1.2% 83%,
|
|
91
|
+
0.6% 74%,
|
|
92
|
+
1.1% 65%,
|
|
93
|
+
0.7% 55%,
|
|
94
|
+
1% 45%,
|
|
95
|
+
0.6% 35%,
|
|
96
|
+
1.1% 25%,
|
|
97
|
+
0.7% 15%
|
|
98
|
+
);
|
|
99
|
+
background: #f4df83 url('./assets/watercolor-paper-texture.png') center / cover no-repeat;
|
|
100
|
+
filter: saturate(0.92) drop-shadow(0 10px 13px rgb(55 42 15 / 0.16));
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
.paper::before {
|
|
104
|
+
content: '';
|
|
105
|
+
position: absolute;
|
|
106
|
+
inset: 0;
|
|
107
|
+
box-shadow:
|
|
108
|
+
inset 0 0 0 1px rgb(122 89 11 / 0.18),
|
|
109
|
+
inset 0 0 22px rgb(165 111 0 / 0.12),
|
|
110
|
+
inset 0 2px 0 rgb(255 255 231 / 0.46);
|
|
111
|
+
pointer-events: none;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
.note::before {
|
|
115
|
+
content: '';
|
|
116
|
+
position: absolute;
|
|
117
|
+
top: -12px;
|
|
118
|
+
left: 50%;
|
|
119
|
+
z-index: 4;
|
|
120
|
+
width: 96px;
|
|
121
|
+
height: 34px;
|
|
122
|
+
opacity: 0.9;
|
|
123
|
+
clip-path: polygon(
|
|
124
|
+
3% 4%,
|
|
125
|
+
20% 0,
|
|
126
|
+
43% 3%,
|
|
127
|
+
68% 0,
|
|
128
|
+
98% 2%,
|
|
129
|
+
100% 30%,
|
|
130
|
+
97% 67%,
|
|
131
|
+
100% 96%,
|
|
132
|
+
70% 100%,
|
|
133
|
+
37% 98%,
|
|
134
|
+
10% 100%,
|
|
135
|
+
0 87%,
|
|
136
|
+
3% 58%,
|
|
137
|
+
0 31%
|
|
138
|
+
);
|
|
139
|
+
background:
|
|
140
|
+
linear-gradient(
|
|
141
|
+
104deg,
|
|
142
|
+
rgb(255 255 255 / 0.2),
|
|
143
|
+
transparent 28%,
|
|
144
|
+
rgb(255 255 255 / 0.12) 52%,
|
|
145
|
+
transparent 74%
|
|
146
|
+
),
|
|
147
|
+
repeating-linear-gradient(97deg, transparent 0 5px, rgb(255 255 255 / 0.12) 5px 6px),
|
|
148
|
+
linear-gradient(180deg, rgb(246 240 215 / 0.74), rgb(224 211 176 / 0.6));
|
|
149
|
+
box-shadow: 0 3px 5px rgb(65 53 22 / 0.12);
|
|
150
|
+
transform: translateX(-50%) rotate(-1.2deg);
|
|
151
|
+
pointer-events: none;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
.note-head,
|
|
155
|
+
.todos {
|
|
156
|
+
position: relative;
|
|
157
|
+
z-index: 3;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
.note-head {
|
|
161
|
+
display: flex;
|
|
162
|
+
align-items: center;
|
|
163
|
+
justify-content: space-between;
|
|
164
|
+
gap: 14px;
|
|
165
|
+
min-height: 24px;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
h1 {
|
|
169
|
+
margin: 0;
|
|
170
|
+
font-size: 22px;
|
|
171
|
+
font-weight: 600;
|
|
172
|
+
line-height: 1;
|
|
173
|
+
letter-spacing: 0.04em;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
.count {
|
|
177
|
+
display: flex;
|
|
178
|
+
align-items: baseline;
|
|
179
|
+
margin: 0 1px 1px 0;
|
|
180
|
+
color: var(--ink-soft);
|
|
181
|
+
font-family: 'SF Mono', 'Menlo', monospace;
|
|
182
|
+
font-size: 10px;
|
|
183
|
+
letter-spacing: 0.02em;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
.count span:first-child {
|
|
187
|
+
color: var(--check);
|
|
188
|
+
font-size: 17px;
|
|
189
|
+
font-weight: 650;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
.todos {
|
|
193
|
+
display: flex;
|
|
194
|
+
flex-direction: column;
|
|
195
|
+
gap: 0;
|
|
196
|
+
margin: 18px 0 16px;
|
|
197
|
+
padding: 0;
|
|
198
|
+
list-style: none;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
.todos li {
|
|
202
|
+
min-width: 0;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
.todo-option {
|
|
206
|
+
display: grid;
|
|
207
|
+
grid-template-columns: 18px minmax(0, 1fr);
|
|
208
|
+
align-items: center;
|
|
209
|
+
gap: 9px;
|
|
210
|
+
min-height: 34px;
|
|
211
|
+
padding: 2px;
|
|
212
|
+
cursor: pointer;
|
|
213
|
+
user-select: none;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
input[type='checkbox'] {
|
|
217
|
+
appearance: none;
|
|
218
|
+
display: inline-grid;
|
|
219
|
+
place-content: center;
|
|
220
|
+
width: 1.125rem;
|
|
221
|
+
aspect-ratio: 1;
|
|
222
|
+
margin: 1px 0 0;
|
|
223
|
+
border: 1.5px solid var(--check);
|
|
224
|
+
border-radius: 5px;
|
|
225
|
+
background: rgb(255 252 223 / 0.45);
|
|
226
|
+
color: var(--check);
|
|
227
|
+
cursor: pointer;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
input[type='checkbox']::after {
|
|
231
|
+
content: '';
|
|
232
|
+
width: 4px;
|
|
233
|
+
height: 8px;
|
|
234
|
+
border-right: 2px solid currentColor;
|
|
235
|
+
border-bottom: 2px solid currentColor;
|
|
236
|
+
transform: translateY(-1px) rotate(45deg) scale(0);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
input[type='checkbox']:checked {
|
|
240
|
+
background: rgb(77 90 45 / 0.12);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
input[type='checkbox']:checked::after {
|
|
244
|
+
transform: translateY(-1px) rotate(45deg) scale(1);
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
input[type='checkbox']:focus-visible {
|
|
248
|
+
outline: 2px solid var(--ink);
|
|
249
|
+
outline-offset: 3px;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
input[type='checkbox']:disabled {
|
|
253
|
+
cursor: not-allowed;
|
|
254
|
+
opacity: 0.5;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
.todo-text {
|
|
258
|
+
color: var(--ink);
|
|
259
|
+
font-size: 14px;
|
|
260
|
+
font-weight: 600;
|
|
261
|
+
line-height: 1.28;
|
|
262
|
+
text-wrap: pretty;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
.is-done .todo-text {
|
|
266
|
+
color: var(--ink-soft);
|
|
267
|
+
text-decoration: line-through;
|
|
268
|
+
text-decoration-thickness: 1.5px;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
.visually-hidden {
|
|
272
|
+
position: absolute;
|
|
273
|
+
width: 1px;
|
|
274
|
+
height: 1px;
|
|
275
|
+
padding: 0;
|
|
276
|
+
margin: -1px;
|
|
277
|
+
overflow: hidden;
|
|
278
|
+
clip: rect(0 0 0 0);
|
|
279
|
+
white-space: nowrap;
|
|
280
|
+
border: 0;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
284
|
+
.note {
|
|
285
|
+
animation: note-in 220ms ease-out both;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
.todos li {
|
|
289
|
+
animation: item-in 240ms ease-out both;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
.todos li:nth-child(2) {
|
|
293
|
+
animation-delay: 35ms;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
.todos li:nth-child(3) {
|
|
297
|
+
animation-delay: 70ms;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
.todos li:nth-child(4) {
|
|
301
|
+
animation-delay: 105ms;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
input[type='checkbox']::after,
|
|
305
|
+
.todo-text {
|
|
306
|
+
transition:
|
|
307
|
+
transform 140ms ease,
|
|
308
|
+
color 140ms ease;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
@media (forced-colors: active) {
|
|
313
|
+
input[type='checkbox']::after {
|
|
314
|
+
border-color: CanvasText;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
@keyframes note-in {
|
|
319
|
+
from {
|
|
320
|
+
transform: translateY(4px) rotate(-0.35deg);
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
to {
|
|
324
|
+
transform: translateY(0) rotate(0);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
@keyframes item-in {
|
|
329
|
+
from {
|
|
330
|
+
transform: translateY(3px);
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
to {
|
|
334
|
+
transform: translateY(0);
|
|
335
|
+
}
|
|
336
|
+
}
|
package/README.md
DELETED