local-kanban 1.6.3

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.
Files changed (64) hide show
  1. package/CHANGELOG.md +381 -0
  2. package/LICENSE +21 -0
  3. package/README.md +144 -0
  4. package/README.ru.md +144 -0
  5. package/bin/kb +306 -0
  6. package/bin/local-kanban +217 -0
  7. package/ecosystem.example.cjs +25 -0
  8. package/package.json +52 -0
  9. package/public/app.js +18 -0
  10. package/public/boot-fallback.js +3 -0
  11. package/public/drawer-sync.js +14 -0
  12. package/public/favicon-180.png +0 -0
  13. package/public/favicon-32.png +0 -0
  14. package/public/favicon-64.png +0 -0
  15. package/public/favicon.ico +0 -0
  16. package/public/favicon.svg +6 -0
  17. package/public/icon-192.png +0 -0
  18. package/public/icon-512.png +0 -0
  19. package/public/icon-maskable-192.png +0 -0
  20. package/public/icon-maskable-512.png +0 -0
  21. package/public/index.html +138 -0
  22. package/public/js/board.js +698 -0
  23. package/public/js/chaos.js +247 -0
  24. package/public/js/core.js +821 -0
  25. package/public/js/dash.js +114 -0
  26. package/public/js/drawer.js +919 -0
  27. package/public/js/horizon.js +140 -0
  28. package/public/js/init.js +208 -0
  29. package/public/js/project.js +338 -0
  30. package/public/js/settings.js +905 -0
  31. package/public/js/sidebar.js +640 -0
  32. package/public/js/sse.js +386 -0
  33. package/public/manifest.webmanifest +32 -0
  34. package/public/offline.html +39 -0
  35. package/public/style.css +1247 -0
  36. package/public/sw.js +31 -0
  37. package/scripts/raycast/open-kanban.sh +18 -0
  38. package/scripts/update.js +43 -0
  39. package/skills/deploy/SKILL.md +70 -0
  40. package/skills/kanban/SKILL.md +217 -0
  41. package/src/backup.js +111 -0
  42. package/src/bus.js +10 -0
  43. package/src/config.js +40 -0
  44. package/src/db.js +321 -0
  45. package/src/error-handler.js +11 -0
  46. package/src/file-snapshot.js +22 -0
  47. package/src/origin-guard.js +32 -0
  48. package/src/pm2-services.js +31 -0
  49. package/src/query-params.js +17 -0
  50. package/src/repo-base.js +23 -0
  51. package/src/restore.js +153 -0
  52. package/src/routes/dashboard.js +132 -0
  53. package/src/routes/events.js +30 -0
  54. package/src/routes/horizons.js +66 -0
  55. package/src/routes/projects.js +532 -0
  56. package/src/routes/skills.js +116 -0
  57. package/src/routes/system.js +285 -0
  58. package/src/routes/tasks.js +477 -0
  59. package/src/schema.sql +135 -0
  60. package/src/server.js +100 -0
  61. package/src/skills.js +119 -0
  62. package/src/sync/github.js +265 -0
  63. package/src/sync/worker.js +136 -0
  64. package/src/task-shape.js +29 -0
@@ -0,0 +1,1247 @@
1
+ * { box-sizing: border-box; margin: 0; }
2
+
3
+ * { scrollbar-width: none; -ms-overflow-style: none; }
4
+ *::-webkit-scrollbar { width: 0; height: 0; }
5
+
6
+ :root {
7
+ color-scheme: light;
8
+ --bg: #fbfbfa;
9
+ --panel: #ffffff;
10
+ --border: #e8e8e6;
11
+ --border-soft: #f0f0ee;
12
+ --text: #18181b;
13
+ --muted: #8b8b86;
14
+ --accent: #e8704e;
15
+ --accent-soft: #fdf1ed;
16
+ --backlog: #d4a5c0;
17
+ --todo: #9ca3af;
18
+ --prep: #a855f7;
19
+ --doing: #eab308;
20
+ --deploy: #3b82f6;
21
+ --review: #f97316;
22
+ --done: #22c55e;
23
+ --cancelled: #ef4444;
24
+ --danger: #dc2626;
25
+ --hover: #f5f5f4;
26
+ --hover-strong: #f4f4f2;
27
+ --chip-bg: #fafaf9;
28
+ --border-hover: #d6d3d1;
29
+ --field-text: #57534e;
30
+ --warn-bg: #fef9c3; --warn-border: #fde68a; --warn-text: #a16207;
31
+ --danger-soft: #fef2f2;
32
+ --tl-created: #cbd5e1;
33
+ --on-accent: #ffffff;
34
+ --shadow: rgba(0, 0, 0, .12);
35
+ --input-bg: #ffffff;
36
+ --pri-med: #d97706;
37
+ --accent-border: #f6c6b8;
38
+ }
39
+
40
+ body {
41
+ font: 13px/1.45 -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
42
+ color: var(--text);
43
+ background: var(--bg);
44
+ height: 100vh;
45
+ overflow: hidden;
46
+ }
47
+
48
+ .layout { display: flex; height: 100vh; }
49
+ .hidden { display: none !important; }
50
+ .muted { color: var(--muted); font-size: 12px; }
51
+
52
+ .sidebar {
53
+ width: 220px; flex-shrink: 0;
54
+ background: var(--panel);
55
+ border-right: 1px solid var(--border);
56
+ overflow-y: auto;
57
+ padding: 12px 8px;
58
+ }
59
+ .sidebar-head {
60
+ font-size: 11px; text-transform: uppercase; letter-spacing: .06em;
61
+ color: var(--muted); padding: 4px 10px 8px;
62
+ }
63
+ .cat-head {
64
+ font-size: 11px; color: var(--muted); padding: 12px 10px 4px;
65
+ text-transform: uppercase; letter-spacing: .04em;
66
+ display: flex; align-items: center; justify-content: space-between;
67
+ }
68
+ .cat-add { font-size: 14px; padding: 0 4px; line-height: 1; }
69
+ .proj-missing { color: var(--danger); flex-shrink: 0; cursor: pointer; font-size: 12px; }
70
+ .proj-ghost { opacity: .7; }
71
+ .proj-ghost .proj-name { font-style: italic; }
72
+ .ghost-add { font-size: 10.5px; color: var(--accent); flex-shrink: 0; cursor: pointer; white-space: nowrap; }
73
+ .ghost-add:hover { text-decoration: underline; }
74
+ .proj {
75
+ display: flex; align-items: center; gap: 8px;
76
+ padding: 5px 10px; border-radius: 6px; cursor: pointer;
77
+ }
78
+ .proj:hover { background: var(--hover); }
79
+ .proj.active { background: var(--accent-soft); }
80
+ .proj-dragging { opacity: .4; }
81
+ .proj-drop-before { box-shadow: inset 0 2px 0 var(--accent); }
82
+ .proj-drop-after { box-shadow: inset 0 -2px 0 var(--accent); }
83
+ .proj-name { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
84
+ .proj-counts { font-size: 11px; color: var(--muted); flex-shrink: 0; }
85
+ .proj-review { flex-shrink: 0; width: 7px; height: 7px; border-radius: 50%; background: var(--accent); animation: dot-pulse 1.6s ease-in-out infinite; }
86
+ .proj-pin { flex-shrink: 0; cursor: pointer; line-height: 0; color: var(--muted); opacity: 0; transition: opacity .12s, color .12s; }
87
+ .proj-pin svg { display: block; }
88
+ .proj:hover .proj-pin { opacity: .5; }
89
+ .proj-pin:hover { opacity: 1; color: var(--text); }
90
+ .proj-pin.on { opacity: 1; color: var(--text); }
91
+ .proj-all { font-weight: 600; margin-bottom: 6px; border-bottom: 1px solid var(--border-soft); border-radius: 6px 6px 0 0; padding-bottom: 8px; }
92
+ .card-proj { color: var(--muted); font-weight: 400; }
93
+
94
+ .main { flex: 1; display: flex; flex-direction: column; min-width: 0; position: relative; }
95
+
96
+ .link-lines { position: absolute; pointer-events: none; overflow: hidden; z-index: 5; }
97
+ .link-line {
98
+ fill: none; stroke: var(--accent); stroke-width: 1.6; stroke-linecap: round;
99
+ animation: link-pulse 2.6s ease-in-out infinite;
100
+ }
101
+ @keyframes link-pulse { 0%,100% { opacity: .22; } 50% { opacity: .55; } }
102
+ .topbar {
103
+ display: flex; align-items: center; justify-content: space-between;
104
+ padding: 14px 20px 6px; background: var(--panel);
105
+ }
106
+ .topbar-left { display: flex; align-items: baseline; gap: 8px; min-width: 0; }
107
+ .topbar h1 { font-size: 18px; font-weight: 650; white-space: nowrap; }
108
+ .sync-badge { font-size: 11.5px; color: var(--muted); }
109
+ .sound-badge {
110
+ font-size: 11.5px; color: var(--accent); background: none; border: 1px solid var(--border);
111
+ border-radius: 7px; padding: 3px 8px; cursor: pointer; font-family: inherit;
112
+ }
113
+ .sound-badge:hover { border-color: var(--accent); }
114
+ .offline-badge {
115
+ font-size: 11.5px; color: var(--danger); background: none; border: 1px solid var(--border);
116
+ border-radius: 7px; padding: 3px 8px; cursor: pointer; font-family: inherit;
117
+ }
118
+ .offline-badge:hover { border-color: var(--danger); }
119
+ .sync-badge.busy { color: var(--accent); }
120
+ .sync-badge.error { color: var(--danger); }
121
+
122
+ .toolbar {
123
+ display: flex; align-items: center; gap: 12px;
124
+ padding: 8px 20px 12px; background: var(--panel);
125
+ border-bottom: 1px solid var(--border);
126
+ }
127
+ .search {
128
+ flex: 0 1 260px; padding: 6px 10px; border: 1px solid var(--border); border-radius: 7px;
129
+ font: inherit; outline: none; background: var(--input-bg); color: var(--text);
130
+ }
131
+ .search:focus { border-color: var(--border-hover); }
132
+ .btn-primary {
133
+ background: var(--accent); color: #fff; border: none;
134
+ padding: 7px 14px; border-radius: 7px; font-size: 13px; font-weight: 550;
135
+ cursor: pointer; margin-left: auto;
136
+ }
137
+ .btn-primary:hover { filter: brightness(1.06); }
138
+ .btn-ghost {
139
+ background: none; border: 1px solid var(--border); border-radius: 7px;
140
+ padding: 7px 12px; cursor: pointer; color: var(--muted); font: inherit;
141
+ }
142
+ .btn-ghost:hover { color: var(--text); }
143
+ a.btn-ghost { text-decoration: none; }
144
+ .btn-danger {
145
+ background: none; border: 1px solid var(--border); border-radius: 7px;
146
+ padding: 7px 10px; cursor: pointer; color: var(--danger);
147
+ }
148
+ .btn-icon { display: inline-flex; align-items: center; justify-content: center; line-height: 1; background: none; border: none; cursor: pointer; color: var(--muted); font-size: 15px; padding: 2px 6px; }
149
+ .btn-icon:hover { color: var(--text); }
150
+ #project-menu.on { color: var(--accent); }
151
+
152
+ body {
153
+ -webkit-user-select: none;
154
+ user-select: none;
155
+ }
156
+ input, textarea, [contenteditable],
157
+ .comment-body, .timeline, .lp-title, .d-desc, .d-title {
158
+ -webkit-user-select: text;
159
+ user-select: text;
160
+ }
161
+ html.booting #board, html.booting #dashboard, html.booting #settings,
162
+ html.booting #horizon, html.booting #calendar, html.booting #chaos,
163
+ html.booting #projset { display: none !important; }
164
+ html:not(.booting) #boot, html:not(.booting) .boot-side { display: none; }
165
+ html.booting .topbar-left { visibility: hidden; }
166
+
167
+ .boot { flex: 1; display: flex; overflow: hidden; background: var(--bg); pointer-events: none; }
168
+ .boot, .boot-side { animation: boot-in .22s ease .18s both; }
169
+ html.booted #projects, html.booted #board, html.booted #dashboard,
170
+ html.booted #horizon, html.booted #calendar, html.booted #chaos { animation: boot-in .2s ease both; }
171
+ @keyframes boot-in { from { opacity: 0; } to { opacity: 1; } }
172
+
173
+ .boot-col {
174
+ flex: 1; min-width: 230px; max-width: 360px; display: flex; flex-direction: column;
175
+ gap: 8px; padding: 11px 10px 0; border-right: 1px solid var(--border-soft);
176
+ }
177
+ .boot-head { height: 9px; width: 86px; border-radius: 5px; background: var(--border); margin: 2px 4px 4px; }
178
+ .boot-card {
179
+ background: var(--panel); border: 1px solid var(--border); border-radius: 9px;
180
+ padding: 12px; display: flex; flex-direction: column; gap: 8px;
181
+ }
182
+ .boot-line { height: 8px; border-radius: 4px; background: var(--border-soft); }
183
+ .boot-line.short { width: 55%; }
184
+ .boot-side { padding: 6px 10px; display: flex; flex-direction: column; gap: 11px; }
185
+ .boot-side .boot-line { height: 9px; }
186
+
187
+ .boot-head, .boot-line { animation: boot-pulse 1.5s ease-in-out infinite; }
188
+ @keyframes boot-pulse { 0%, 100% { opacity: .5; } 50% { opacity: 1; } }
189
+ @media (prefers-reduced-motion: reduce) {
190
+ .boot, .boot-side, .boot-head, .boot-line { animation: none; }
191
+ html.booted #projects, html.booted #board, html.booted #dashboard,
192
+ html.booted #horizon, html.booted #calendar, html.booted #chaos { animation: none; }
193
+ }
194
+
195
+ .board { flex: 1; display: flex; overflow-x: auto; background: var(--bg); scroll-padding-right: 24px; scroll-padding-left: 4px; }
196
+ .board-spacer { flex: 0 0 18px; }
197
+ .col {
198
+ flex: 1; min-width: 230px; max-width: 360px; display: flex; flex-direction: column;
199
+ border-right: 1px solid var(--border-soft);
200
+ }
201
+ .col-head {
202
+ display: flex; align-items: center; gap: 7px;
203
+ padding: 11px 14px 9px; font-weight: 600; font-size: 12.5px;
204
+ }
205
+ .col-head .dot { width: 9px; height: 9px; border-radius: 50%; flex-shrink: 0; }
206
+ .col-head .n { color: var(--muted); font-weight: 400; }
207
+ .col-add { margin-left: auto; }
208
+ .col-copy { font-size: 12px; opacity: .65; }
209
+ .col-copy:hover { opacity: 1; }
210
+ .col-copy.copied { opacity: 1; color: var(--done); font-size: 14px; }
211
+ .col-body { flex: 1; overflow-y: auto; padding: 2px 10px 20px; }
212
+ .col-body.dragover { background: var(--hover-strong); }
213
+ .col-add-ghost {
214
+ margin-top: 4px; padding: 7px 10px; border-radius: 9px; border: 1px dashed transparent;
215
+ color: transparent; font-size: 12.5px; cursor: pointer; user-select: none;
216
+ transition: color .12s, border-color .12s, background .12s;
217
+ }
218
+ .col-body:hover .col-add-ghost { color: var(--muted); border-color: var(--border-soft); }
219
+ .col-add-ghost:hover { color: var(--accent); border-color: var(--accent); background: var(--accent-soft); }
220
+ body.dragging-board .col-add-ghost { display: none; }
221
+
222
+ .horizon-view { flex: 1; overflow: hidden; display: flex; }
223
+ .hz-wrap { flex: 1; display: flex; flex-direction: column; min-width: 0; }
224
+ .hz-scales { display: flex; gap: 4px; padding: 12px 16px; border-bottom: 1px solid var(--border-soft); }
225
+ .hz-scale { padding: 5px 12px; border: 1px solid var(--border); border-radius: 7px; background: var(--chip-bg); color: var(--text); font: inherit; font-size: 12.5px; cursor: pointer; }
226
+ .hz-scale.active { background: var(--accent-soft); border-color: var(--accent); color: var(--accent); }
227
+ .hz-cols { flex: 1; display: flex; overflow-x: auto; }
228
+ .hz-col { flex: 0 0 280px; border-right: 1px solid var(--border-soft); padding: 14px 16px; overflow-y: auto; }
229
+ .hz-col.cur .hz-col-h { color: var(--accent); }
230
+ .hz-col-h { font-size: 17px; font-weight: 700; margin-bottom: 12px; }
231
+ .hz-col-h small { display: block; font-size: 12px; font-weight: 400; color: var(--muted); }
232
+ .hz-goals { display: flex; flex-direction: column; gap: 2px; }
233
+ .hz-goal { display: flex; align-items: center; gap: 8px; padding: 3px 2px; }
234
+ .hz-check { flex-shrink: 0; width: 17px; height: 17px; padding: 0; border: 1.5px solid var(--border-hover); border-radius: 5px; background: var(--input-bg); color: var(--on-accent); font-size: 11px; line-height: 1; cursor: pointer; display: flex; align-items: center; justify-content: center; }
235
+ .hz-goal.done .hz-check { background: var(--accent); border-color: var(--accent); }
236
+ .hz-text { flex: 1; min-width: 0; border: none; background: transparent; outline: none; font: inherit; color: var(--text); padding: 1px 0; }
237
+ .hz-goal.done .hz-text { color: var(--muted); text-decoration: line-through; }
238
+ .hz-del { flex-shrink: 0; display: flex; align-items: center; padding: 1px 2px; border: none; background: none; color: var(--muted); cursor: pointer; opacity: 0; transition: opacity .12s, color .12s; }
239
+ .hz-goal:hover .hz-del, .hz-goal:focus-within .hz-del { opacity: 1; }
240
+ .hz-del:hover { color: var(--danger); }
241
+ .hz-add-input { width: 100%; border: none; background: transparent; outline: none; font: inherit; color: var(--text); padding: 4px 0 4px 25px; }
242
+ .hz-add-input::placeholder { color: var(--muted); }
243
+
244
+ .chaos-view { flex: 1; overflow-y: auto; display: flex; flex-direction: column; align-items: center; justify-content: flex-start; padding: 9vh 20px 48px; }
245
+ .chaos-wrap { width: 100%; max-width: 720px; }
246
+ .chaos-head { display: flex; align-items: center; gap: 14px; }
247
+ .chaos-spark { color: var(--accent); display: flex; flex: 0 0 auto; }
248
+ .chaos-title {
249
+ margin: 0; color: var(--text); font-weight: 600; font-size: 40px; line-height: 1.08; letter-spacing: -.015em;
250
+ font-family: Georgia, 'Iowan Old Style', 'Times New Roman', 'PT Serif', serif;
251
+ }
252
+ .chaos-sub { margin: 12px 2px 24px; font-size: 14px; color: var(--muted); }
253
+ .chaos-card {
254
+ display: flex; flex-direction: column; gap: 10px;
255
+ background: var(--panel); border: 1px solid var(--border); border-radius: 20px; padding: 15px 17px;
256
+ transition: border-color .12s, box-shadow .12s;
257
+ }
258
+ .chaos-card:focus-within { border-color: var(--border-hover); box-shadow: none; }
259
+ .chaos-input {
260
+ width: 100%; min-height: 92px; resize: none; border: none; background: transparent;
261
+ padding: 4px 2px; font: inherit; font-size: 17px; line-height: 1.45; color: var(--text); outline: none;
262
+ }
263
+ .chaos-input::placeholder { color: var(--muted); }
264
+ .chaos-pending { display: flex; flex-wrap: wrap; gap: 7px; }
265
+ .chaos-card-foot { display: flex; align-items: center; gap: 6px; }
266
+ .chaos-foot-gap { flex: 1; }
267
+ .chaos-bar { display: flex; align-items: center; gap: 4px; margin-top: 12px; flex-wrap: wrap; }
268
+ .chaos-proj { flex: 0 1 auto; max-width: 260px; }
269
+ .chaos-proj .kbsel-btn { border-color: transparent; background: transparent; color: var(--muted); padding: 6px 8px; }
270
+ .chaos-proj .kbsel-btn:hover { border-color: transparent; background: var(--hover); color: var(--text); }
271
+ .chaos-proj.open .kbsel-btn { border-color: transparent; background: var(--hover); }
272
+ .chaos-ic {
273
+ display: flex; align-items: center; justify-content: center; gap: 3px;
274
+ width: 34px; height: 34px; padding: 0; border: 1px solid transparent; border-radius: 9px;
275
+ background: transparent; color: var(--muted); cursor: pointer;
276
+ transition: color .12s, border-color .12s, background .12s;
277
+ }
278
+ .chaos-ic:hover { color: var(--text); background: var(--hover); border-color: transparent; }
279
+ .chaos-ic.set, .chaos-ic.on { color: var(--accent); border-color: transparent; background: transparent; }
280
+ .chaos-ic .dot { width: 11px; height: 11px; }
281
+ .chaos-ic .pri { font-size: 13px; }
282
+ .chaos-ic .lbl-dot { width: 8px; height: 8px; border-radius: 50%; }
283
+ .chaos-go { width: 38px; height: 38px; border-radius: 11px; color: #fff; background: var(--accent); border-color: var(--accent); }
284
+ .chaos-go:hover { color: #fff; filter: brightness(1.05); border-color: var(--accent); background: var(--accent); }
285
+ .chaos-go:disabled { opacity: .55; cursor: default; }
286
+ .chaos-pop {
287
+ position: fixed; z-index: 80; min-width: 150px; padding: 5px; overflow-y: auto;
288
+ background: var(--panel); border: 1px solid var(--border); border-radius: 10px; box-shadow: var(--shadow, 0 8px 28px rgba(0,0,0,.16));
289
+ }
290
+ .chaos-pop-opt { display: flex; align-items: center; gap: 8px; padding: 7px 9px; border-radius: 7px; font-size: 13px; cursor: pointer; }
291
+ .chaos-pop-opt:hover { background: var(--hover); }
292
+ .chaos-pop-opt.active { color: var(--accent); }
293
+ .chaos-hint { font-size: 12.5px; color: var(--muted); min-height: 16px; }
294
+ .chaos-hint.ok { color: var(--accent); }
295
+ .chaos-hint.err { color: var(--danger); }
296
+ .chaos-list { width: 100%; max-width: 720px; margin-top: 30px; }
297
+ .chaos-nc-list { display: flex; flex-direction: column; }
298
+ .chaos-nc-row { display: flex; align-items: center; gap: 8px; padding: 6px 4px; border-bottom: 1px solid var(--border-soft); cursor: pointer; font-size: 13px; }
299
+ .chaos-nc-row:last-child { border-bottom: none; }
300
+ .chaos-nc-row:hover { background: var(--hover); }
301
+ .cnc-key { color: var(--muted); font-size: 11px; flex: 0 0 auto; }
302
+ .cnc-title { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
303
+ .cnc-proj { color: var(--muted); font-size: 11px; flex: 0 0 auto; }
304
+
305
+ .calendar-view { flex: 1; overflow-y: auto; padding: 14px 20px; }
306
+ .cal-wrap { max-width: 1080px; margin: 0 auto; display: flex; flex-direction: column; gap: 12px; }
307
+ .cal-horizons { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; }
308
+ .cal-hz { border: 1px solid var(--border); border-radius: 10px; background: var(--panel); padding: 10px 12px; }
309
+ .cal-hz-h { font-size: 13px; font-weight: 700; margin-bottom: 6px; }
310
+ .cal-head { display: flex; align-items: center; gap: 10px; }
311
+ .cal-nav, .cal-today { padding: 4px 10px; border: 1px solid var(--border); border-radius: 7px; background: var(--chip-bg); color: var(--text); font: inherit; cursor: pointer; }
312
+ .cal-title { font-size: 16px; font-weight: 700; min-width: 160px; }
313
+ .cal-grid { border: 1px solid var(--border); border-radius: 10px; overflow: hidden; }
314
+ .cal-row { display: grid; grid-template-columns: 40px repeat(7, 1fr); }
315
+ .cal-row + .cal-row { border-top: 1px solid var(--border-soft); }
316
+ .cal-wdh { background: var(--chip-bg); }
317
+ .cal-wd, .cal-wk { padding: 6px; font-size: 11px; color: var(--muted); text-align: center; }
318
+ .cal-wk { display: flex; align-items: center; justify-content: center; border-right: 1px solid var(--border-soft); }
319
+ .cal-day { min-height: 84px; padding: 5px 6px; border-right: 1px solid var(--border-soft); cursor: pointer; }
320
+ .cal-day:last-child { border-right: none; }
321
+ .cal-day.off { background: var(--chip-bg); color: var(--muted); }
322
+ .cal-day.off .cal-day-n { color: var(--muted); }
323
+ .cal-day.today .cal-day-n { background: var(--accent); color: var(--on-accent); border-radius: 50%; width: 20px; height: 20px; display: inline-flex; align-items: center; justify-content: center; }
324
+ .cal-day-n { font-size: 12px; font-weight: 600; }
325
+ .cal-day-goals { display: flex; flex-direction: column; gap: 2px; margin-top: 3px; }
326
+ .cal-chip { font-size: 11px; padding: 1px 5px; border-radius: 4px; background: var(--accent-soft); color: var(--accent); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
327
+ .cal-chip.done { background: var(--chip-bg); color: var(--muted); text-decoration: line-through; }
328
+
329
+ .dot.s-backlog { background: var(--backlog); }
330
+ .dot.s-todo { background: var(--todo); }
331
+ .dot.s-prep { background: var(--prep); }
332
+ .dot.s-doing { background: var(--doing); }
333
+ .dot.s-deploy { background: var(--deploy); }
334
+ .dot.s-review { background: var(--review); }
335
+ .dot.s-done { background: var(--done); }
336
+ .dot.s-cancelled { background: var(--cancelled); }
337
+
338
+ .dot.s-todo, .dot.s-prep { background: var(--accent); animation: dot-pulse 1.6s ease-in-out infinite; }
339
+ .col-head .dot.s-todo { background: var(--todo); animation: none; }
340
+ .col-head .dot.s-prep { background: var(--prep); animation: none; }
341
+ @keyframes dot-pulse {
342
+ 0%, 100% { box-shadow: 0 0 0 0 rgba(232, 112, 78, .5); }
343
+ 50% { box-shadow: 0 0 0 3px rgba(232, 112, 78, 0); }
344
+ }
345
+
346
+ .card {
347
+ background: var(--panel); border: 1px solid var(--border); border-radius: 9px;
348
+ padding: 10px 12px; margin-bottom: 8px; cursor: pointer;
349
+ box-shadow: 0 1px 2px rgba(0,0,0,.03);
350
+ transition: box-shadow .15s ease, border-color .15s ease;
351
+ }
352
+ .card:hover { border-color: var(--border-hover); }
353
+
354
+ .card.dragging { display: none; }
355
+ .drag-ghost {
356
+ position: fixed; top: -2000px; left: -2000px; margin: 0; pointer-events: none;
357
+ box-shadow: 0 14px 30px rgba(0, 0, 0, .22); transform: rotate(2.5deg);
358
+ }
359
+ .drop-ph {
360
+ margin-bottom: 8px; border-radius: 9px;
361
+ border: 2px dashed var(--accent); background: var(--accent-soft);
362
+ }
363
+ .card.just-dropped { animation: drop-in .2s ease-out; }
364
+ @keyframes drop-in { from { opacity: .4; } to { opacity: 1; } }
365
+
366
+ #card-fx { position: fixed; inset: 0; pointer-events: none; z-index: 40; }
367
+ .card.card-enter { animation: card-enter .22s ease-out; }
368
+ @keyframes card-enter { from { opacity: 0; transform: translateY(-6px); } to { opacity: 1; transform: none; } }
369
+ .card.card-exit { animation: card-exit .24s ease-in forwards; box-shadow: 0 6px 18px rgba(0,0,0,.12); }
370
+ @keyframes card-exit { from { opacity: 1; transform: scale(1); } to { opacity: 0; transform: scale(.96); } }
371
+
372
+ .marquee {
373
+ position: fixed; z-index: 50; pointer-events: none;
374
+ border: 1px solid var(--accent); background: var(--accent-soft); opacity: .55;
375
+ border-radius: 3px;
376
+ }
377
+ .card.multi-selected { border-color: var(--accent); box-shadow: 0 0 0 1px var(--accent) inset; background: var(--accent-soft); }
378
+ .drag-count {
379
+ position: absolute; top: -8px; right: -8px; min-width: 20px; height: 20px;
380
+ display: flex; align-items: center; justify-content: center; padding: 0 5px;
381
+ border-radius: 999px; background: var(--accent); color: #fff; font-size: 12px; font-weight: 700;
382
+ }
383
+
384
+ @property --kb-angle {
385
+ syntax: '<angle>';
386
+ initial-value: 0deg;
387
+ inherits: false;
388
+ }
389
+ .card.working {
390
+ border: 1px solid transparent;
391
+ background:
392
+ linear-gradient(var(--panel), var(--panel)) padding-box,
393
+ conic-gradient(from var(--kb-angle),
394
+ var(--accent) 0deg, rgba(232, 112, 78,.12) 90deg,
395
+ var(--accent) 180deg, rgba(232, 112, 78,.12) 270deg,
396
+ var(--accent) 360deg) border-box;
397
+ animation: kb-spin 2.5s linear infinite;
398
+ }
399
+ @keyframes kb-spin { to { --kb-angle: 360deg; } }
400
+ .card[draggable="false"] { cursor: default; }
401
+
402
+ .card.selected { animation: card-selected 1.5s ease-in-out infinite; }
403
+ @keyframes card-selected {
404
+ 0%, 100% { box-shadow: 0 0 0 1.5px var(--accent); }
405
+ 50% { box-shadow: 0 0 0 1.5px var(--accent), 0 0 9px 2px rgba(232, 112, 78,.5); }
406
+ }
407
+ .card.kb-cursor { outline: 2px solid var(--accent); outline-offset: 1px; }
408
+ .card.selected.kb-cursor { outline: none; }
409
+
410
+ .timer {
411
+ font-size: 11px; color: var(--muted);
412
+ font-variant-numeric: tabular-nums;
413
+ }
414
+ .timer.running { color: var(--accent); font-weight: 600; }
415
+
416
+ .card.stale { border: 1px dashed var(--border-hover); }
417
+ .chip-stale {
418
+ font-size: 10.5px; font-weight: 600; color: var(--warn-text);
419
+ background: var(--warn-bg); border-radius: 4px; padding: 1px 6px;
420
+ }
421
+ .card-key { font-size: 11px; color: var(--muted); letter-spacing: .02em; }
422
+ .card-title { margin-top: 3px; font-size: 13px; font-weight: 550; overflow-wrap: anywhere; }
423
+ .card-preview {
424
+ margin-top: 3px; font-size: 12px; color: var(--muted); overflow-wrap: anywhere;
425
+ display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden;
426
+ }
427
+ .card-foot { display: flex; align-items: center; gap: 6px; margin-top: 8px; flex-wrap: wrap; min-height: 16px; }
428
+ .pri { font-size: 12px; font-weight: 700; line-height: 1; }
429
+ .pri.p1 { color: var(--muted); }
430
+ .pri.p2 { color: var(--pri-med); }
431
+ .pri.p3 { color: var(--accent); }
432
+ .lbl {
433
+ display: inline-flex; align-items: center; gap: 5px;
434
+ font-size: 11px; color: var(--field-text); border: 1px solid var(--border); border-radius: 999px;
435
+ padding: 1px 8px 1px 6px; background: var(--panel);
436
+ }
437
+ .lbl .lbl-dot { width: 8px; height: 8px; border-radius: 50%; }
438
+ .card-comments { font-size: 11px; color: var(--muted); margin-left: auto; }
439
+ .card-link { font-size: 10.5px; color: var(--accent); font-weight: 600; }
440
+ .card-attach { font-size: 11px; color: var(--muted); }
441
+ .card-title-empty { color: var(--muted); font-style: italic; font-weight: 400; }
442
+ .row-untitled { color: var(--muted); font-style: italic; }
443
+
444
+ /* ── Drawer ── */
445
+ .drawer {
446
+ width: 360px; flex-shrink: 0;
447
+ background: var(--panel); border-left: 1px solid var(--border);
448
+ padding: 14px 16px; display: flex; flex-direction: column; gap: 10px;
449
+ overflow-y: auto;
450
+ }
451
+ .drawer-head { display: flex; justify-content: space-between; align-items: center; }
452
+ .drawer-key { font-family: ui-monospace, monospace; font-size: 12.5px; color: var(--muted); }
453
+ .drawer-proj { cursor: pointer; }
454
+ .drawer-proj:hover { color: var(--accent); }
455
+ .lock-note {
456
+ font-size: 12px; color: var(--warn-text); background: var(--warn-bg);
457
+ border: 1px solid var(--warn-border); border-radius: 7px; padding: 6px 10px;
458
+ }
459
+ .drawer :disabled { opacity: .55; cursor: not-allowed; }
460
+ .return-block { display: flex; flex-direction: column; gap: 6px; }
461
+ .return-pop {
462
+ position: fixed; z-index: 60; width: 250px;
463
+ background: var(--panel); border: 1px solid var(--border); border-radius: 9px;
464
+ box-shadow: 0 10px 28px rgba(0, 0, 0, .14); padding: 8px;
465
+ display: flex; flex-direction: column; gap: 6px;
466
+ opacity: 0; transform: translateY(-6px) scale(.97); transform-origin: top right;
467
+ transition: opacity .14s ease, transform .14s ease;
468
+ }
469
+ .return-pop.open { opacity: 1; transform: none; }
470
+ .return-pop-input {
471
+ padding: 6px 9px; border: 1px solid var(--border); border-radius: 7px; font: inherit; outline: none;
472
+ background: var(--input-bg); color: var(--text);
473
+ }
474
+ .return-pop-btn { white-space: nowrap; color: var(--accent); border-color: var(--accent-border); }
475
+ .btn-accept {
476
+ width: 100%; padding: 8px; border: none; border-radius: 8px;
477
+ background: var(--done); color: #fff; font: inherit; font-weight: 600; cursor: pointer;
478
+ }
479
+ .btn-accept:hover { filter: brightness(.95); }
480
+ .chip-row { display: flex; gap: 6px; flex-wrap: wrap; }
481
+ .chip {
482
+ display: inline-flex; align-items: center; gap: 6px;
483
+ border: 1px solid var(--border); border-radius: 8px; padding: 3px 8px;
484
+ background: var(--chip-bg); height: 27px;
485
+ }
486
+ .chip select { border: none; background: none; font: inherit; font-size: 12.5px; outline: none; cursor: pointer; }
487
+ .chip .dot { width: 9px; height: 9px; border-radius: 50%; }
488
+
489
+ .meta-row { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; margin-top: -3px; }
490
+ .labels-row { display: flex; gap: 6px; flex-wrap: wrap; align-items: center; }
491
+ .links-row { display: flex; gap: 6px; flex-wrap: wrap; align-items: center; }
492
+ .lbl-add { cursor: pointer; color: var(--accent); border-style: dashed; }
493
+ .link-chip {
494
+ display: inline-flex; align-items: center; gap: 5px; font-size: 11.5px;
495
+ border: 1px solid var(--border); border-radius: 999px; padding: 2px 8px; background: var(--chip-bg);
496
+ }
497
+ .link-chip .dot { width: 8px; height: 8px; border-radius: 50%; }
498
+ .link-add { cursor: pointer; color: var(--accent); border-style: dashed; }
499
+ .lbl-ask.on { border-style: solid; border-color: var(--accent); background: var(--accent-soft); }
500
+ .link-x { cursor: pointer; color: var(--muted); font-weight: 700; }
501
+ .link-x:hover { color: var(--danger); }
502
+ .lbl-picker {
503
+ position: absolute; z-index: 10; background: var(--panel); border: 1px solid var(--border);
504
+ border-radius: 9px; box-shadow: 0 8px 24px rgba(0,0,0,.1); padding: 6px;
505
+ max-height: 280px; overflow-y: auto; width: 220px;
506
+ }
507
+ .lbl-opt {
508
+ display: flex; align-items: center; gap: 8px; padding: 5px 8px;
509
+ border-radius: 6px; cursor: pointer; font-size: 12.5px;
510
+ }
511
+ .lbl-opt:hover { background: var(--hover); }
512
+ .lbl-opt input { pointer-events: none; }
513
+
514
+ .proj-panel {
515
+ position: absolute; z-index: 20; background: var(--panel); border: 1px solid var(--border);
516
+ border-radius: 10px; box-shadow: 0 10px 30px rgba(0,0,0,.12); padding: 12px; width: 250px;
517
+ display: flex; flex-direction: column; gap: 8px;
518
+ max-height: calc(100vh - 16px); overflow-y: auto;
519
+ }
520
+ .proj-panel > * { flex-shrink: 0; }
521
+ .pp-head { font-size: 12px; font-weight: 600; color: var(--muted); }
522
+ .pp-field { display: flex; flex-direction: column; gap: 3px; font-size: 11px; color: var(--muted); }
523
+ .pp-field input, .pp-field textarea, .pp-field select {
524
+ padding: 6px 8px; border: 1px solid var(--border); border-radius: 7px;
525
+ font: inherit; font-size: 13px; color: var(--text); outline: none; background: var(--input-bg);
526
+ }
527
+ .pp-field textarea { resize: vertical; min-height: 48px; }
528
+ .pp-field select { cursor: pointer; background: var(--panel); }
529
+ .pp-field input:focus, .pp-field textarea:focus, .pp-field select:focus { border-color: var(--accent); }
530
+ .pp-select { position: relative; }
531
+ .pp-sel-btn {
532
+ width: 100%; display: flex; align-items: center; justify-content: space-between; gap: 8px;
533
+ padding: 6px 9px; border: 1px solid var(--border); border-radius: 7px;
534
+ background: var(--panel); color: var(--text); font: inherit; font-size: 13px; cursor: pointer;
535
+ }
536
+ .pp-sel-btn:hover { border-color: var(--accent); }
537
+ .pp-sel-chev { color: var(--muted); font-size: 11px; }
538
+ .pp-sel-list {
539
+ display: none; position: absolute; left: 0; right: 0; top: calc(100% + 4px); z-index: 30;
540
+ background: var(--panel); border: 1px solid var(--border); border-radius: 8px;
541
+ box-shadow: 0 8px 24px rgba(0, 0, 0, .12); padding: 4px; max-height: 220px; overflow-y: auto;
542
+ }
543
+ .pp-select.open .pp-sel-list { display: block; }
544
+ .pp-select.open .pp-sel-chev { transform: rotate(180deg); }
545
+ .pp-sel-opt { padding: 6px 9px; border-radius: 6px; cursor: pointer; font-size: 13px; }
546
+ .pp-sel-opt:hover { background: var(--hover); }
547
+ .pp-sel-opt.active { color: var(--accent); font-weight: 600; }
548
+ .pp-toggle { flex-direction: row; align-items: center; gap: 7px; cursor: pointer; color: var(--text); font-size: 13px; }
549
+ .pp-toggle input { width: auto; margin: 0; accent-color: var(--accent); cursor: pointer; }
550
+ .demo-cta { display: flex; flex-direction: column; gap: 10px; max-width: 460px; margin: 48px auto; padding: 20px; }
551
+ .demo-cta-title { font-weight: 600; font-size: 15px; }
552
+ .demo-cta .btn-primary { margin-left: 0; }
553
+ .pp-demo-del { color: var(--danger); border-color: var(--danger-soft, var(--border)); }
554
+
555
+ .modal.wiz.onb { width: 480px; }
556
+ .onb-steps { display: flex; gap: 6px; }
557
+ .onb-dot { width: 7px; height: 7px; border-radius: 50%; background: var(--border); }
558
+ .onb-dot.on { background: var(--accent); }
559
+ .onb-langs { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; }
560
+ .onb-langs .wiz-type { align-items: center; }
561
+ .onb-langs .wiz-type.active { border-color: var(--accent); }
562
+ .onb-code {
563
+ margin: 0; padding: 8px 10px; font-size: 12px; overflow-x: auto;
564
+ background: var(--input-bg, var(--panel)); border: 1px solid var(--border); border-radius: 8px;
565
+ }
566
+
567
+ .pp-more {
568
+ background: none; border: none; padding: 2px 0; font: inherit; font-size: 12px;
569
+ color: var(--muted); cursor: pointer; text-align: left;
570
+ }
571
+ .pp-more:hover { color: var(--accent); }
572
+ .pp-extra { display: flex; flex-direction: column; gap: 8px; max-height: 40vh; overflow-y: auto; }
573
+
574
+ .pp-actions { display: flex; gap: 8px; margin-top: 4px; }
575
+ .pp-actions .btn-primary { flex: 1; margin-left: 0; }
576
+
577
+ .modal-overlay {
578
+ position: fixed; inset: 0; background: rgba(0,0,0,.28);
579
+ display: flex; align-items: center; justify-content: center; z-index: 50;
580
+ }
581
+ .modal {
582
+ background: var(--panel); border: 1px solid var(--border); border-radius: 12px;
583
+ box-shadow: 0 16px 48px rgba(0,0,0,.18); padding: 16px; width: 320px;
584
+ display: flex; flex-direction: column; gap: 10px;
585
+ }
586
+ .modal-title { font-weight: 600; font-size: 14px; }
587
+ .modal-input {
588
+ padding: 8px 10px; border: 1px solid var(--border); border-radius: 8px;
589
+ font: inherit; font-size: 13px; outline: none; background: var(--input-bg); color: var(--text);
590
+ }
591
+ .modal-input:focus { border-color: var(--accent); }
592
+ .modal-err { font-size: 12px; color: var(--danger); }
593
+ .modal-actions { display: flex; gap: 8px; }
594
+
595
+ .modal.wiz { width: 400px; max-width: calc(100vw - 32px); }
596
+ .wiz-body { display: flex; flex-direction: column; gap: 9px; max-height: 62vh; overflow-y: auto; }
597
+ .wiz-type {
598
+ display: flex; flex-direction: column; gap: 3px; text-align: left; padding: 10px 12px;
599
+ border: 1px solid var(--border); border-radius: 9px; background: var(--panel); cursor: pointer; font: inherit; color: var(--text);
600
+ }
601
+ .wiz-type:hover { border-color: var(--accent); }
602
+ .wiz-type small { color: var(--muted); font-size: 11.5px; }
603
+ .wiz-select, .wiz-body input[type="text"] {
604
+ width: 100%; padding: 6px 9px; font: inherit; font-size: 12.5px; color: var(--field-text, var(--text));
605
+ background: var(--input-bg, var(--panel)); border: 1px solid var(--border); border-radius: 8px;
606
+ }
607
+ .wiz-body input[type="text"]:focus, .wiz-select:focus { outline: none; border-color: var(--accent); }
608
+ .proj-add .proj-name { color: var(--muted); font-size: 12px; }
609
+ .proj-add:hover .proj-name { color: var(--accent); }
610
+ .modal-actions .btn-primary { flex: 1; margin-left: 0; }
611
+ .btn-primary.danger { background: var(--danger); }
612
+
613
+ .d-title {
614
+ font-size: 15px; font-weight: 600; border: none; outline: none;
615
+ border-bottom: 1px solid transparent; padding: 4px 0;
616
+ font-family: inherit; line-height: 1.35; width: 100%; box-sizing: border-box;
617
+ resize: none; overflow: hidden; white-space: pre-wrap; overflow-wrap: anywhere;
618
+ flex-shrink: 0;
619
+ background: transparent; color: var(--text);
620
+ }
621
+ .d-title:focus { border-bottom-color: var(--border); }
622
+ .d-desc {
623
+ min-height: 110px; resize: vertical; border: 1px solid var(--border);
624
+ border-radius: 7px; padding: 8px; font: inherit; outline: none;
625
+ background: var(--input-bg); color: var(--text);
626
+ }
627
+ .d-desc:focus { border-color: var(--accent); }
628
+
629
+ .checklist { display: flex; flex-direction: column; gap: 1px; }
630
+ .cl-item {
631
+ display: flex; align-items: flex-start; gap: 8px;
632
+ padding: 5px 4px; border-bottom: 1px solid var(--border-soft);
633
+ }
634
+ .cl-item:last-child { border-bottom: none; }
635
+ .cl-check {
636
+ flex-shrink: 0; width: 18px; height: 18px; margin-top: 1px; padding: 0;
637
+ border: 1.5px solid var(--border-hover); border-radius: 5px; background: var(--input-bg);
638
+ color: var(--on-accent); font-size: 12px; line-height: 1; cursor: pointer;
639
+ display: flex; align-items: center; justify-content: center; transition: background .12s, border-color .12s;
640
+ }
641
+ .cl-check:hover { border-color: var(--accent); }
642
+ .cl-item.done .cl-check { background: var(--accent); border-color: var(--accent); }
643
+ .cl-text {
644
+ flex: 1; min-width: 0; resize: none; overflow: hidden;
645
+ border: none; background: transparent; outline: none;
646
+ font: inherit; color: var(--text); padding: 1px 0; line-height: 1.4;
647
+ }
648
+ .cl-item.done .cl-text { color: var(--muted); text-decoration: line-through; }
649
+ .cl-del {
650
+ flex-shrink: 0; display: flex; align-items: center; padding: 1px 2px; border: none; background: none; cursor: pointer;
651
+ color: var(--muted); line-height: 1; opacity: 0; transition: opacity .12s, color .12s;
652
+ }
653
+ .cl-item:hover .cl-del, .cl-item:focus-within .cl-del { opacity: 1; }
654
+ .cl-del:hover { color: var(--danger); }
655
+ .desc-wrap { position: relative; display: flex; }
656
+ .desc-wrap .d-desc { flex: 1; padding-right: 34px; }
657
+ .desc-menu-btn {
658
+ position: absolute; top: 7px; right: 7px; display: flex; align-items: center; justify-content: center;
659
+ width: 24px; height: 24px; padding: 0; border: none; border-radius: 6px;
660
+ background: transparent; color: var(--muted); cursor: pointer; transition: background .12s, color .12s;
661
+ }
662
+ .desc-menu-btn:hover { background: var(--hover); color: var(--accent); }
663
+ .desc-menu-btn.hidden { display: none; }
664
+
665
+ .attachments { display: flex; flex-wrap: wrap; gap: 7px; }
666
+ .attach { position: relative; }
667
+ .attach img {
668
+ width: 74px; height: 74px; object-fit: cover; display: block;
669
+ border-radius: 8px; border: 1px solid var(--border); cursor: zoom-in;
670
+ }
671
+ .lightbox {
672
+ position: fixed; inset: 0; background: rgba(0,0,0,.8); z-index: 100; cursor: zoom-out;
673
+ display: flex; align-items: center; justify-content: center;
674
+ }
675
+ .lightbox img { max-width: 92vw; max-height: 92vh; border-radius: 8px; box-shadow: 0 10px 40px rgba(0,0,0,.5); }
676
+ .attach-x {
677
+ position: absolute; top: -6px; right: -6px; width: 18px; height: 18px;
678
+ border-radius: 50%; background: var(--danger); color: #fff;
679
+ font-size: 12px; line-height: 18px; text-align: center; cursor: pointer;
680
+ opacity: 0; transition: opacity .12s;
681
+ }
682
+ .attach:hover .attach-x { opacity: 1; }
683
+ .d-row { display: flex; align-items: center; gap: 10px; font-size: 12.5px; }
684
+ .d-row label { color: var(--muted); }
685
+ .drawer-head-actions { display: flex; align-items: center; gap: 2px; }
686
+ .drawer-menu-pop {
687
+ position: fixed; z-index: 60; min-width: 168px;
688
+ background: var(--panel); border: 1px solid var(--border); border-radius: 9px;
689
+ box-shadow: 0 10px 28px rgba(0, 0, 0, .14); padding: 5px;
690
+ opacity: 0; transform: translateY(-6px) scale(.97); transform-origin: top right;
691
+ transition: opacity .14s ease, transform .14s ease;
692
+ }
693
+ .drawer-menu-pop.open { opacity: 1; transform: none; }
694
+ .dm-item { padding: 8px 10px; border-radius: 6px; cursor: pointer; font-size: 13px; display: flex; align-items: center; justify-content: space-between; gap: 16px; }
695
+ .dm-item:hover { background: var(--hover); }
696
+ .dm-danger { color: var(--danger); }
697
+ .dm-danger:hover { background: var(--danger-soft); }
698
+ .dm-chev { color: var(--muted); font-size: 14px; }
699
+ .card-menu { transform-origin: top left; min-width: 184px; }
700
+ .cm-opt { display: flex; align-items: center; gap: 8px; padding: 8px 10px; border-radius: 6px; cursor: pointer; font-size: 13px; }
701
+ .cm-opt:hover { background: var(--hover); }
702
+ .cm-opt.active { font-weight: 600; }
703
+ .cm-opt.disabled { opacity: .4; cursor: not-allowed; }
704
+ .cm-opt .dot, .cm-opt .lbl-dot { width: 9px; height: 9px; border-radius: 50%; flex-shrink: 0; }
705
+ .cm-opt .dm-chev { margin-left: auto; color: var(--accent); }
706
+ .dm-back { color: var(--muted); cursor: pointer; }
707
+ .issue-link { color: var(--muted); font-size: 12px; font-weight: 500; text-decoration: none; }
708
+ .issue-link:hover { color: var(--accent); }
709
+ .commit-link { margin-left: auto; }
710
+
711
+ .timeline {
712
+ display: flex; flex-direction: column; gap: 3px; font-size: 12px;
713
+ padding: 9px 0; border-top: 1px solid var(--border-soft);
714
+ }
715
+ .tl-item { display: flex; gap: 8px; align-items: baseline; }
716
+ .tl-when { color: var(--muted); font-variant-numeric: tabular-nums; min-width: 96px; flex-shrink: 0; }
717
+ .tl-dot { width: 7px; height: 7px; border-radius: 50%; flex-shrink: 0; align-self: center; }
718
+ .tl-what { display: inline-flex; align-items: center; gap: 6px; }
719
+ .tl-cycle { color: var(--muted); font-size: 11px; margin-top: 3px; }
720
+ .timeline.tl-collapsed .tl-item.tl-old { display: none; }
721
+ .tl-toggle {
722
+ display: flex; align-items: center; gap: 6px; width: 100%; margin-bottom: 2px;
723
+ background: none; border: none; padding: 2px 0; font: inherit; font-size: 11.5px;
724
+ color: var(--muted); cursor: pointer; text-align: left;
725
+ }
726
+ .tl-toggle:hover { color: var(--text); }
727
+ .tl-toggle .ic { margin-left: auto; transition: transform .15s; }
728
+ .timeline:not(.tl-collapsed) .tl-toggle .ic { transform: rotate(180deg); }
729
+
730
+ .comments { border-top: 1px solid var(--border-soft); padding-top: 10px; display: flex; flex-direction: column; gap: 8px; }
731
+ .comments-head { font-size: 12px; font-weight: 600; color: var(--muted); }
732
+ .comment { font-size: 12.5px; }
733
+ .comment-meta { display: flex; align-items: center; justify-content: space-between; gap: 8px; color: var(--muted); font-size: 11px; margin-bottom: 1px; }
734
+ .comment-del { cursor: pointer; font-weight: 700; color: var(--muted); padding: 0 3px; opacity: 0; transition: opacity .12s, color .12s; flex-shrink: 0; }
735
+ .comment:hover .comment-del { opacity: .55; }
736
+ .comment-del:hover { opacity: 1; color: var(--danger); }
737
+ .comment-body { white-space: pre-wrap; }
738
+ .comment-img { width: 74px; height: 74px; object-fit: cover; margin-top: 5px; border: 1px solid var(--border); border-radius: 8px; cursor: zoom-in; display: block; }
739
+ .comment-form { display: flex; gap: 6px; align-items: flex-end; }
740
+ .comment-form textarea {
741
+ flex: 1; padding: 7px 10px; border: 1px solid var(--border); border-radius: 7px;
742
+ font: inherit; outline: none; background: var(--input-bg); color: var(--text);
743
+ resize: none; overflow-y: auto; line-height: 1.4; max-height: 180px;
744
+ min-height: calc(1.4em + 16px);
745
+ }
746
+ .comment-form .btn-primary { margin-left: 0; padding: 6px 12px; }
747
+
748
+ .board.compact .card-preview { display: none; }
749
+
750
+ .proj-dash .proj-name { font-weight: 500; }
751
+ .dashboard { flex: 1; overflow-y: auto; padding: 16px 20px; }
752
+ .dash-wrap { max-width: 1080px; margin: 0 auto; display: flex; flex-direction: column; gap: 14px; }
753
+ .panel { background: var(--panel); border: 1px solid var(--border); border-radius: 10px; padding: 13px 16px; }
754
+ .panel-h {
755
+ font-size: 11px; text-transform: uppercase; letter-spacing: .04em; color: var(--muted);
756
+ margin-bottom: 10px; display: flex; justify-content: space-between; align-items: center; gap: 8px;
757
+ }
758
+ .dash-top { display: flex; justify-content: flex-end; }
759
+ .dash-range { display: inline-flex; gap: 2px; background: var(--panel); border: 1px solid var(--border); border-radius: 9px; padding: 3px; }
760
+ .dr-btn { border: none; background: none; color: var(--muted); font: inherit; font-size: 12px; padding: 4px 11px; border-radius: 6px; cursor: pointer; }
761
+ .dr-btn:hover { color: var(--text); }
762
+ .dr-btn.active { background: var(--accent); color: #fff; }
763
+
764
+ .dash-2col { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; }
765
+ .dash-2col > * { min-width: 0; }
766
+ @media (max-width: 860px) { .dash-2col { grid-template-columns: 1fr; } }
767
+
768
+ .dcards { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 12px; }
769
+ .dcard { background: var(--panel); border: 1px solid var(--border); border-radius: 10px; padding: 11px 14px; }
770
+ .dc-label { font-size: 12px; color: var(--muted); }
771
+ .dc-value { font-size: 23px; font-weight: 600; margin-top: 2px; line-height: 1.1; }
772
+ .dc-sub { font-size: 11px; color: var(--muted); margin-top: 3px; }
773
+
774
+ .queue-strip {
775
+ display: flex; flex-direction: column; gap: 6px;
776
+ background: var(--panel); border: 1px solid var(--border); border-radius: 10px; padding: 10px 14px; font-size: 13px;
777
+ }
778
+ .qs-main { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
779
+ .queue-strip b { font-size: 15px; }
780
+ .queue-strip.low { border-color: var(--review); background: var(--accent-soft); }
781
+ .queue-warn { color: var(--review); margin-left: auto; font-weight: 500; }
782
+ .qs-item { cursor: pointer; border-radius: 6px; padding: 1px 5px; transition: background .12s ease, color .12s ease; }
783
+ .qs-item:hover { background: var(--accent-soft); color: var(--accent); }
784
+ .qs-note { font-size: 11.5px; color: var(--muted); }
785
+
786
+ .wait-sec-h { font-size: 11px; color: var(--muted); margin: 8px 0 3px; }
787
+ .wait-sec-h:first-child { margin-top: 0; }
788
+ .wait-row, .feed-row {
789
+ display: flex; align-items: center; gap: 8px; padding: 5px 6px; border-radius: 6px; cursor: pointer; font-size: 13px;
790
+ }
791
+ .wait-row:hover, .feed-row:hover { background: var(--hover); }
792
+ .wait-row .dot, .feed-row .dot { width: 9px; height: 9px; border-radius: 50%; flex-shrink: 0; }
793
+ .wr-key, .fr-key { color: var(--muted); font-size: 12px; flex-shrink: 0; font-variant-numeric: tabular-nums; }
794
+ .fr-proj { max-width: 150px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
795
+ .wr-title, .fr-title { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
796
+ .wr-proj { color: var(--muted); font-size: 11px; flex-shrink: 0; }
797
+ .wr-meta { color: var(--review); font-size: 11px; flex-shrink: 0; }
798
+ .wait-row-wrap { flex-wrap: wrap; row-gap: 2px; }
799
+ .wr-reason { flex-basis: 100%; margin-left: 20px; color: var(--review); font-size: 11px; white-space: normal; line-height: 1.35; }
800
+ .wait-empty { color: var(--done); font-size: 13px; padding: 2px; }
801
+
802
+ .eisen-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
803
+ @media (max-width: 720px) { .eisen-grid { grid-template-columns: 1fr; } }
804
+ .eisen-q { min-width: 0; border: 1px solid var(--border); border-radius: 9px; padding: 10px 12px; }
805
+ .eisen-q.q-do { border-color: var(--accent); background: var(--accent-soft); }
806
+ .eisen-h { display: flex; align-items: baseline; gap: 8px; margin-bottom: 7px; min-width: 0; }
807
+ .eisen-title { font-weight: 600; font-size: 12.5px; }
808
+ .q-do .eisen-title { color: var(--accent); }
809
+ .eisen-hint { color: var(--muted); font-size: 11px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
810
+ .eisen-n { margin-left: auto; color: var(--muted); font-size: 12px; font-variant-numeric: tabular-nums; flex-shrink: 0; }
811
+ .eisen-list { display: flex; flex-direction: column; gap: 1px; }
812
+ .eisen-row { display: flex; align-items: center; gap: 7px; padding: 4px 6px; border-radius: 6px; cursor: pointer; font-size: 12.5px; min-width: 0; }
813
+ .eisen-row:hover { background: var(--hover); }
814
+ .eisen-row .dot { width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0; }
815
+ .eisen-row .pri { font-size: 11px; font-weight: 700; flex-shrink: 0; }
816
+ .eisen-rtitle { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
817
+ .eisen-rproj { color: var(--muted); font-size: 11px; flex-shrink: 0; max-width: 90px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
818
+ .eisen-rkey { color: var(--muted); font-size: 11px; flex-shrink: 0; font-variant-numeric: tabular-nums; }
819
+ .eisen-rmeta { color: var(--muted); font-size: 11px; flex-shrink: 0; white-space: nowrap; }
820
+ .eisen-empty { color: var(--muted); font-size: 12px; padding: 3px 6px; }
821
+
822
+ .plan-sub-h { font-size: 11px; text-transform: uppercase; letter-spacing: .04em; color: var(--muted); font-weight: 600; margin: 16px 0 7px; }
823
+ .plan-sub-h:first-child { margin-top: 0; }
824
+ .funnel { display: flex; flex-wrap: wrap; align-items: center; gap: 7px; font-size: 12.5px; }
825
+ .funnel-stage { display: inline-flex; align-items: center; gap: 5px; color: var(--muted); }
826
+ .funnel-stage .dot { width: 8px; height: 8px; border-radius: 50%; }
827
+ .funnel-stage b { color: var(--text); font-variant-numeric: tabular-nums; font-weight: 600; }
828
+ .funnel-stage.peak { color: var(--accent); }
829
+ .funnel-stage.peak b { color: var(--accent); }
830
+ .funnel-sep { color: var(--muted); opacity: .45; }
831
+
832
+ .hcell { width: 12px; height: 12px; border-radius: 2px; border: 1px solid rgba(0, 0, 0, .04); }
833
+ .hcell-off { background: transparent; border-color: transparent; }
834
+ .cal { display: grid; grid-template-rows: repeat(7, 12px); grid-auto-flow: column; grid-auto-columns: 12px; gap: 3px; }
835
+ .thm { display: grid; grid-template-columns: 30px repeat(24, 1fr); gap: 3px; align-items: center; }
836
+ .thm-day { font-size: 11px; color: var(--muted); }
837
+ .thm .hcell { width: 100%; }
838
+ .thm-axis { display: flex; justify-content: space-between; padding-left: 33px; font-size: 10px; color: var(--muted); margin-top: 4px; }
839
+ .heat-legend { display: flex; align-items: center; gap: 4px; font-size: 11px; text-transform: none; letter-spacing: 0; }
840
+ .heat-legend .hcell { width: 11px; height: 11px; }
841
+ .heat-note { font-size: 11px; color: var(--muted); margin-top: 9px; }
842
+
843
+ .bars { display: flex; align-items: flex-end; gap: 4px; height: 92px; }
844
+ .bar-col { flex: 1; min-width: 8px; display: flex; flex-direction: column; align-items: center; height: 100%; justify-content: flex-end; }
845
+ .bar { width: 100%; max-width: 20px; background: var(--accent); border-radius: 3px 3px 0 0; min-height: 2px; }
846
+ .bar-x { font-size: 10px; color: var(--muted); margin-top: 3px; }
847
+ .hscroll { overflow-x: auto; max-width: 100%; padding-bottom: 2px; }
848
+ .ph-sub { text-transform: none; letter-spacing: 0; font-size: 11px; font-weight: 400; color: var(--muted); }
849
+
850
+ .tp-row { display: flex; align-items: center; gap: 8px; font-size: 13px; padding: 3px 0; }
851
+ .tp-name { width: 140px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; flex-shrink: 0; }
852
+ .tp-bar-wrap { flex: 1; background: var(--border-soft); border-radius: 4px; height: 8px; overflow: hidden; }
853
+ .tp-bar { display: block; height: 100%; background: var(--accent); border-radius: 4px; }
854
+ .tp-n { width: 28px; text-align: right; color: var(--muted); flex-shrink: 0; }
855
+
856
+ .feed-day { font-size: 12px; color: var(--muted); margin: 12px 0 3px; }
857
+ .feed-day:first-child { margin-top: 0; }
858
+ .feed-day-n { font-size: 11px; }
859
+ .fr-arrow { color: var(--muted); font-size: 12px; flex-shrink: 0; }
860
+ .fr-time { color: var(--muted); font-size: 11px; flex-shrink: 0; width: 70px; text-align: right; }
861
+
862
+ .fun-line { text-align: center; color: var(--muted); font-size: 12.5px; padding: 2px 4px 6px; }
863
+
864
+ .wait-row .wr-dot { width: 12px; height: 12px; }
865
+ .wr-dot { position: relative; cursor: pointer; transition: box-shadow .12s ease; }
866
+ .wr-dot::after { content: ''; position: absolute; inset: -8px; border-radius: 50%; }
867
+ .wr-dot:hover { box-shadow: 0 0 0 3px rgba(232, 112, 78, .3); }
868
+ .status-picker {
869
+ position: fixed; z-index: 60; background: var(--panel); border: 1px solid var(--border);
870
+ border-radius: 9px; box-shadow: 0 8px 24px rgba(0, 0, 0, .12); padding: 5px; min-width: 152px;
871
+ }
872
+ .sp-opt {
873
+ display: flex; align-items: center; gap: 8px; padding: 5px 9px;
874
+ border-radius: 6px; cursor: pointer; font-size: 13px;
875
+ }
876
+ .sp-opt:hover { background: var(--hover); }
877
+ .sp-opt.active { font-weight: 600; }
878
+ .sp-opt.disabled { opacity: .4; cursor: not-allowed; }
879
+ .sp-opt .dot { width: 9px; height: 9px; border-radius: 50%; }
880
+
881
+ .dash-tip {
882
+ position: fixed; z-index: 50; pointer-events: none;
883
+ background: var(--panel); border: 1px solid var(--border); border-radius: 8px;
884
+ box-shadow: 0 4px 16px rgba(0, 0, 0, .13); padding: 6px 10px;
885
+ display: flex; flex-direction: column; gap: 1px; max-width: 220px;
886
+ }
887
+ .dash-tip .dt-n { font-size: 13px; font-weight: 600; color: var(--text); }
888
+ .dash-tip .dt-d { font-size: 11px; color: var(--muted); }
889
+ .bar-col { cursor: default; }
890
+
891
+ .settings { flex: 1; overflow-y: auto; padding: 16px 20px; }
892
+ .settings-wrap { max-width: 640px; margin: 0 auto; display: flex; flex-direction: column; gap: 14px; }
893
+ .set-row {
894
+ display: flex; align-items: center; justify-content: space-between; gap: 14px;
895
+ padding: 9px 0; border-top: 1px solid var(--border-soft);
896
+ }
897
+ .set-row:first-of-type { border-top: none; padding-top: 0; }
898
+ .set-lab { display: flex; flex-direction: column; gap: 2px; font-size: 13px; }
899
+ .set-lab small { color: var(--muted); font-size: 11.5px; }
900
+ .set-select {
901
+ border: 1px solid var(--border); border-radius: 7px; padding: 5px 8px;
902
+ background: var(--chip-bg); font: inherit; font-size: 12.5px; cursor: pointer; outline: none;
903
+ }
904
+ .set-toggle {
905
+ width: 38px; height: 22px; flex-shrink: 0; appearance: none; -webkit-appearance: none;
906
+ background: var(--border); border-radius: 999px; position: relative; cursor: pointer;
907
+ transition: background .15s ease;
908
+ }
909
+ .set-toggle:checked { background: var(--accent); }
910
+ .set-toggle::after {
911
+ content: ''; position: absolute; top: 2px; left: 2px; width: 18px; height: 18px;
912
+ border-radius: 50%; background: #fff; transition: transform .15s ease;
913
+ }
914
+ .set-toggle:checked::after { transform: translateX(16px); }
915
+ .sound-pick { display: inline-flex; align-items: center; gap: 6px; flex-shrink: 0; }
916
+ .snd-test { padding: 5px 11px; font-size: 12px; line-height: 1; }
917
+ .kb-help { display: flex; flex-direction: column; gap: 7px; }
918
+ .kbh-row { display: flex; align-items: center; gap: 12px; font-size: 12.5px; }
919
+ .kbh-row kbd {
920
+ flex-shrink: 0; min-width: 132px; text-align: center; font: inherit; font-size: 11.5px;
921
+ background: var(--chip-bg); border: 1px solid var(--border); border-radius: 6px; padding: 3px 7px; color: var(--text);
922
+ }
923
+ .kbh-row span { color: var(--muted); }
924
+ .kbh-remap { cursor: pointer; }
925
+ .kbh-remap:hover kbd { border-color: var(--accent); }
926
+ .kbh-remap.listening kbd { border-color: var(--accent); color: var(--accent); }
927
+ .kbh-note { font-size: 11.5px; margin-top: 10px; }
928
+ .about-fresh { font-size: 12px; color: var(--muted); flex-shrink: 0; }
929
+ .about-fresh.stale-ver { color: var(--accent); }
930
+ #about-diag .bk-row span:first-child { white-space: nowrap; }
931
+ #about-diag .bk-row .muted { word-break: break-all; text-align: right; }
932
+ .proj-settings .proj-name { color: var(--muted); }
933
+
934
+ .card { position: relative; }
935
+ .card-pin { position: absolute; top: 7px; right: 9px; font-size: 12px; line-height: 1; filter: grayscale(1); }
936
+ .dm-sep { height: 1px; background: var(--border-soft); margin: 5px 4px; }
937
+ .link-chip.rel-child, .link-chip.rel-parent { border-color: var(--accent-border); color: var(--accent); }
938
+ .lp-modal { width: 460px; max-width: 92vw; }
939
+ .lp-results { margin-top: 8px; max-height: 320px; overflow-y: auto; display: flex; flex-direction: column; gap: 2px; }
940
+ .lp-opt { display: flex; align-items: center; gap: 8px; padding: 7px 9px; border-radius: 7px; cursor: pointer; font-size: 13px; }
941
+ .lp-opt:hover { background: var(--hover); }
942
+ .lp-opt.active { animation: lp-pulse 1.4s ease-in-out infinite; }
943
+ @keyframes lp-pulse {
944
+ 0%, 100% { box-shadow: inset 0 0 0 1px var(--accent); }
945
+ 50% { box-shadow: inset 0 0 0 1px var(--accent), 0 0 8px 1px rgba(232, 112, 78, .45); }
946
+ }
947
+ .lp-opt .dot { width: 9px; height: 9px; border-radius: 50%; flex-shrink: 0; }
948
+ .lp-key { font-family: ui-monospace, monospace; font-size: 11.5px; color: var(--muted); flex-shrink: 0; }
949
+ .lp-title { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
950
+ .lp-create { color: var(--accent); font-weight: 550; }
951
+ .lp-empty { padding: 10px; color: var(--muted); font-size: 12.5px; }
952
+
953
+ .settings-modal {
954
+ display: flex; width: 720px; max-width: 94vw; height: 520px; max-height: 88vh;
955
+ background: var(--panel); border: 1px solid var(--border); border-radius: 14px;
956
+ overflow: hidden; box-shadow: 0 20px 60px rgba(0, 0, 0, .25);
957
+ }
958
+ .sm-nav { width: 190px; flex-shrink: 0; background: var(--bg); border-right: 1px solid var(--border); padding: 14px 10px; overflow-y: auto; }
959
+ .sm-nav-head { font-size: 11px; text-transform: uppercase; letter-spacing: .06em; color: var(--muted); padding: 4px 10px 10px; }
960
+ .sm-nav-item { padding: 8px 10px; border-radius: 7px; cursor: pointer; font-size: 13px; margin-bottom: 3px; }
961
+ .sm-nav-item:hover { background: var(--border-soft); }
962
+ .sm-nav-item.active { background: var(--accent-soft); color: var(--accent); font-weight: 550; }
963
+ .sm-main { flex: 1; position: relative; overflow-y: auto; }
964
+ .sm-close { position: absolute; top: 12px; right: 12px; }
965
+ .sm-body { padding: 20px 22px; display: flex; flex-direction: column; gap: 2px; max-width: 470px; }
966
+ .sm-h { font-size: 15px; font-weight: 600; margin-bottom: 10px; display: flex; justify-content: space-between; align-items: center; gap: 12px; }
967
+ .theme-seg { display: inline-flex; border: 1px solid var(--border); border-radius: 8px; overflow: hidden; flex-shrink: 0; }
968
+ .theme-opt { border: none; background: var(--panel); color: var(--muted); font: inherit; font-size: 12.5px; padding: 6px 12px; cursor: pointer; }
969
+ .theme-opt + .theme-opt { border-left: 1px solid var(--border); }
970
+ .theme-opt.active { background: var(--accent); color: #fff; }
971
+ .bk-list { display: flex; flex-direction: column; gap: 0; margin-top: 6px; }
972
+ .bk-row { display: flex; justify-content: space-between; gap: 12px; font-size: 12.5px; padding: 7px 0; border-top: 1px solid var(--border-soft); }
973
+ .bk-row:first-child { border-top: none; }
974
+
975
+ .err-row { display: grid; grid-template-columns: 74px minmax(120px, 32%) 1fr; align-items: baseline; }
976
+ .err-row > span { min-width: 0; overflow-wrap: anywhere; }
977
+ .err-when { white-space: nowrap; }
978
+ .err-src { color: var(--muted); }
979
+ .err-msg { color: var(--text); }
980
+
981
+ .cat-list { display: flex; flex-direction: column; gap: 2px; margin-top: 8px; }
982
+ .cat-block { padding: 8px 0; border-top: 1px solid var(--border-soft); }
983
+ .cat-block:first-child { border-top: none; }
984
+ .cat-row { display: flex; align-items: center; gap: 10px; }
985
+ .cat-name {
986
+ flex: 1; min-width: 0; font: inherit; font-size: 13px; padding: 6px 9px;
987
+ background: var(--input-bg); color: var(--field-text);
988
+ border: 1px solid var(--border); border-radius: 7px;
989
+ }
990
+ .cat-name:disabled { opacity: .55; }
991
+ .cat-count { font-size: 12px; flex-shrink: 0; }
992
+ .cat-del { flex-shrink: 0; }
993
+ .cat-del:disabled { opacity: .4; cursor: not-allowed; }
994
+ .cat-projs { display: flex; flex-direction: column; gap: 4px; margin: 6px 0 0 10px; }
995
+ .cat-proj { display: flex; align-items: center; justify-content: space-between; gap: 10px; font-size: 12.5px; }
996
+ .cat-proj-name { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--muted); }
997
+ .cat-sel { min-width: 172px; flex-shrink: 0; }
998
+ .cat-sel .kbsel-list { left: auto; right: 0; }
999
+ .cat-err { font-size: 12px; color: var(--danger); padding-bottom: 6px; }
1000
+
1001
+ .kbsel { position: relative; }
1002
+ .kbsel-btn {
1003
+ width: 100%; display: flex; align-items: center; justify-content: space-between; gap: 8px;
1004
+ padding: 6px 10px; border: 1px solid var(--border); border-radius: 8px;
1005
+ background: var(--chip-bg); color: var(--text); font: inherit; font-size: 13px; cursor: pointer;
1006
+ }
1007
+ .kbsel-btn:hover { border-color: var(--border-hover); }
1008
+ .kbsel.open .kbsel-btn { border-color: var(--accent); }
1009
+ .kbsel-val { display: inline-flex; align-items: center; gap: 7px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1010
+ .kbsel-val .dot { width: 9px; height: 9px; border-radius: 50%; flex-shrink: 0; }
1011
+ .kbsel-chev { color: var(--muted); font-size: 11px; flex-shrink: 0; transition: transform .15s ease; }
1012
+ .kbsel.open .kbsel-chev { transform: rotate(180deg); }
1013
+ .kbsel-list {
1014
+ display: none; position: absolute; left: 0; top: calc(100% + 4px); z-index: 70; min-width: 100%;
1015
+ background: var(--panel); border: 1px solid var(--border); border-radius: 9px;
1016
+ box-shadow: 0 10px 28px var(--shadow); padding: 4px; max-height: 280px; overflow-y: auto;
1017
+ }
1018
+ .kbsel.open .kbsel-list { display: block; }
1019
+ .kbsel-search { position: sticky; top: -4px; background: var(--panel); padding: 2px 2px 5px; margin: -4px -4px 2px; z-index: 1; }
1020
+ .kbsel-search-input {
1021
+ width: 100%; box-sizing: border-box; padding: 6px 9px; font: inherit; font-size: 12.5px;
1022
+ color: var(--text); background: var(--input-bg); border: 1px solid var(--border); border-radius: 7px; outline: none;
1023
+ }
1024
+ .kbsel-search-input:focus { border-color: var(--accent); }
1025
+ .kbsel-opt { display: flex; align-items: center; gap: 8px; padding: 7px 10px; border-radius: 6px; cursor: pointer; font-size: 13px; color: var(--text); white-space: nowrap; }
1026
+ .kbsel-opt:hover { background: var(--hover); }
1027
+ .kbsel-opt.active { font-weight: 600; }
1028
+ .kbsel-opt.disabled { opacity: .4; cursor: not-allowed; }
1029
+ .kbsel-opt .dot { width: 9px; height: 9px; border-radius: 50%; flex-shrink: 0; }
1030
+ .kbsel-opt-r { margin-left: auto; display: inline-flex; align-items: center; flex-shrink: 0; }
1031
+ .kbsel-pin { display: inline-flex; color: var(--accent); }
1032
+ .kbsel-locked { pointer-events: none; opacity: .55; }
1033
+ .chip-sel { flex: 0 0 auto; }
1034
+ .chip-sel .kbsel-btn { width: auto; height: 30px; }
1035
+ .set-sel { min-width: 172px; flex-shrink: 0; }
1036
+ .set-sel .kbsel-list { left: auto; right: 0; }
1037
+
1038
+ #drawer-content { display: flex; flex-direction: column; gap: 10px; }
1039
+ .drawer-empty { display: none; }
1040
+ .drawer.is-empty #drawer-content { display: none; }
1041
+ .drawer.is-empty .drawer-head-actions { display: none; }
1042
+ .drawer.is-empty #drawer-empty {
1043
+ display: flex; flex: 1; align-items: center; justify-content: center;
1044
+ text-align: center; color: var(--muted); font-size: 13px; padding: 0 26px;
1045
+ }
1046
+
1047
+ .drawer-multi { display: none; }
1048
+ .drawer.is-multi #drawer-content,
1049
+ .drawer.is-multi #drawer-empty,
1050
+ .drawer.is-multi .drawer-head-actions { display: none; }
1051
+ .drawer.is-multi .drawer-multi { display: flex; flex-direction: column; gap: 12px; }
1052
+ .multi-head { font-size: 13px; color: var(--muted); display: flex; align-items: center; gap: 8px; }
1053
+ .multi-head b { color: var(--text); }
1054
+ .multi-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 8px; }
1055
+ .multi-tile {
1056
+ display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 6px;
1057
+ padding: 14px 8px; border: 1px solid var(--border); border-radius: 9px;
1058
+ background: var(--chip-bg); color: var(--text); font: inherit; font-size: 12.5px; cursor: pointer;
1059
+ transition: border-color .12s, background .12s;
1060
+ }
1061
+ .multi-tile:hover { border-color: var(--accent); background: var(--accent-soft); }
1062
+ .multi-tile .mt-ico { font-size: 18px; line-height: 1; }
1063
+ .multi-tile.danger:hover { border-color: var(--danger); background: var(--danger-soft); color: var(--danger); }
1064
+ .multi-clear {
1065
+ align-self: stretch; padding: 8px; border: 1px solid var(--border); border-radius: 8px;
1066
+ background: none; color: var(--muted); font: inherit; font-size: 12.5px; cursor: pointer; transition: background .12s;
1067
+ }
1068
+ .multi-clear:hover { background: var(--hover); }
1069
+ .multi-back { background: none; border: none; color: var(--accent); font: inherit; cursor: pointer; padding: 0; margin-right: 4px; }
1070
+ .multi-sub { display: flex; flex-direction: column; gap: 1px; }
1071
+
1072
+ .sync-cfg-row { display: flex; gap: 8px; }
1073
+ .sync-cfg-row input {
1074
+ flex: 1; min-width: 0; padding: 6px 9px; font: inherit; font-size: 12.5px; color: var(--field-text, var(--text));
1075
+ background: var(--input-bg, var(--panel)); border: 1px solid var(--border); border-radius: 8px;
1076
+ }
1077
+ .sync-cfg-row input:focus { outline: none; border-color: var(--accent); }
1078
+
1079
+ .set-col { display: flex; flex-direction: column; gap: 11px; padding: 9px 0; border-top: 1px solid var(--border-soft); }
1080
+ .set-col:first-of-type { border-top: none; padding-top: 0; }
1081
+ .theme-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 8px; }
1082
+ @media (max-width: 560px) { .theme-grid { grid-template-columns: repeat(2, 1fr); } }
1083
+ .theme-card {
1084
+ display: flex; flex-direction: column; align-items: center; gap: 8px; padding: 11px 8px;
1085
+ border: 1px solid var(--border); border-radius: 10px; background: var(--panel); cursor: pointer; font: inherit;
1086
+ }
1087
+ .theme-card:hover { border-color: var(--border-hover); }
1088
+ .theme-card.active { border-color: var(--accent); box-shadow: 0 0 0 1px var(--accent); }
1089
+ .theme-sw { display: flex; border-radius: 6px; overflow: hidden; border: 1px solid var(--border); }
1090
+ .theme-sw span { width: 17px; height: 26px; display: block; }
1091
+ .theme-card-lab { font-size: 12px; color: var(--text); }
1092
+
1093
+ [data-theme="dark"] {
1094
+ color-scheme: dark;
1095
+ --bg: #1c1b19;
1096
+ --panel: #262522;
1097
+ --border: #393631;
1098
+ --border-soft: #2f2d29;
1099
+ --text: #ece8e1;
1100
+ --muted: #a39d92;
1101
+ --accent: #d27a45;
1102
+ --accent-soft: #3a2a1c;
1103
+ --hover: #322f2b;
1104
+ --hover-strong: #35322d;
1105
+ --chip-bg: #2e2c28;
1106
+ --border-hover: #4d4940;
1107
+ --field-text: #c7c0b3;
1108
+ --warn-bg: #3a3320; --warn-border: #5a4d22; --warn-text: #e6c46e;
1109
+ --danger: #f0716b;
1110
+ --danger-soft: #3a2222;
1111
+ --tl-created: #4d4940;
1112
+ --shadow: rgba(0, 0, 0, .55);
1113
+ --input-bg: #201f1c;
1114
+ --pri-med: #e0a94a;
1115
+ --accent-border: #6b4a30;
1116
+ --backlog: #c79ab5; --todo: #8b9099; --doing: #d6a534; --done: #36b85f;
1117
+ }
1118
+ [data-theme="dark"] .card { box-shadow: 0 1px 3px rgba(0, 0, 0, .35); }
1119
+
1120
+ [data-theme="claude"] {
1121
+ color-scheme: dark;
1122
+ --bg: #1f1f1e;
1123
+ --panel: #262626;
1124
+ --border: #3a3a38;
1125
+ --border-soft: #2c2c2b;
1126
+ --text: #e2e1db;
1127
+ --muted: #9b988e;
1128
+ --accent: #d97757;
1129
+ --accent-soft: #36291f;
1130
+ --hover: #2c2c2b;
1131
+ --hover-strong: #302f2d;
1132
+ --chip-bg: #2c2c2b;
1133
+ --border-hover: #4a4946;
1134
+ --field-text: #c7c4ba;
1135
+ --warn-bg: #3a3320; --warn-border: #5a4d22; --warn-text: #e6c46e;
1136
+ --danger: #e8706a; --danger-soft: #3a2222;
1137
+ --tl-created: #4a4946;
1138
+ --shadow: rgba(0, 0, 0, .55);
1139
+ --input-bg: #1d1d1c;
1140
+ --pri-med: #e0a94a;
1141
+ --accent-border: #6e4f3b;
1142
+ --backlog: #c79ab5; --todo: #8b9099; --doing: #d6a534; --done: #36b85f;
1143
+ }
1144
+ [data-theme="claude"] .card { box-shadow: 0 1px 3px rgba(0, 0, 0, .35); }
1145
+
1146
+ .ic { vertical-align: -.14em; flex: none; }
1147
+
1148
+ .bk-row .bk-dl { display: inline-flex; align-items: center; color: var(--muted); margin-left: 10px; }
1149
+ .bk-row .bk-dl:hover { color: var(--accent); }
1150
+
1151
+ .err-row.err-fixed { opacity: .55; }
1152
+ .err-fixed-tag { margin-left: 8px; font-size: 10.5px; color: var(--muted); white-space: nowrap; }
1153
+ .err-count { margin-left: auto; margin-right: 10px; font-size: 11.5px; }
1154
+
1155
+ .bk-restore { margin: 10px 0 4px; padding: 11px 13px; border: 1px solid var(--border); border-radius: 9px; background: var(--accent-soft); }
1156
+ .bkr-head { font-size: 13px; font-weight: 600; display: flex; align-items: center; gap: 7px; }
1157
+ .bkr-head.bkr-bad { color: var(--danger, #c0392b); }
1158
+ .bkr-sub { font-size: 12px; margin-top: 4px; }
1159
+ .bkr-act { display: flex; gap: 8px; align-items: center; margin-top: 10px; flex-wrap: wrap; }
1160
+ .bkr-act .btn-primary { text-decoration: none; }
1161
+
1162
+ .setup-prompt { display: flex; flex-direction: column; gap: 8px; }
1163
+ .setup-prompt-text { max-height: 190px; overflow: auto; white-space: pre-wrap; line-height: 1.45; }
1164
+ .setup-prompt-copy { width: 100%; display: flex; align-items: center; justify-content: center; gap: 7px; }
1165
+ .onb-manual-h { margin-top: 14px; padding-top: 12px; border-top: 1px solid var(--border-soft); }
1166
+
1167
+ .projset-view { flex: 1; overflow-y: auto; padding: 16px 20px 48px; }
1168
+ .ps-wrap { max-width: 720px; margin: 0 auto; display: flex; flex-direction: column; gap: 14px; }
1169
+ .ps-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; }
1170
+ .ps-title { font-size: 17px; font-weight: 600; }
1171
+ .ps-sub { font-size: 12px; margin-top: 2px; }
1172
+ .ps-block { display: flex; flex-direction: column; gap: 10px; }
1173
+ .ps-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 10px; }
1174
+ .ps-grid > * { min-width: 0; }
1175
+ .ps-actions { display: flex; align-items: center; gap: 8px; }
1176
+ .ps-actions .btn-primary { margin-left: 0; }
1177
+ .ps-saved { font-size: 12px; }
1178
+ .ps-docs { display: flex; flex-direction: column; gap: 0; }
1179
+ .ps-doc {
1180
+ display: flex; align-items: center; gap: 10px; padding: 8px 0;
1181
+ border-top: 1px solid var(--border-soft); font-size: 12.5px;
1182
+ }
1183
+ .ps-doc:first-child { border-top: none; }
1184
+ .ps-doc-ic { color: var(--muted); display: flex; flex: none; }
1185
+ .ps-doc-name { display: flex; align-items: center; gap: 6px; flex: none; }
1186
+ .ps-doc-tag {
1187
+ font-size: 10.5px; color: var(--muted); border: 1px solid var(--border);
1188
+ border-radius: 5px; padding: 1px 5px; white-space: nowrap;
1189
+ }
1190
+ .ps-doc-path {
1191
+ flex: 1; min-width: 0; color: var(--muted); font-size: 11.5px;
1192
+ overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
1193
+ }
1194
+ .ps-doc-act { display: flex; gap: 2px; flex: none; }
1195
+ .ps-doc-missing .ps-doc-name { color: var(--muted); }
1196
+ .ps-hint { color: var(--muted); font-size: 11px; line-height: 1.4; }
1197
+ .sk-group-h {
1198
+ font-size: 10.5px; text-transform: uppercase; letter-spacing: .04em; color: var(--muted);
1199
+ padding: 12px 0 4px; border-top: 1px solid var(--border-soft);
1200
+ }
1201
+ .sk-list > .sk-group-h:first-child, #sk-list > .sk-group-h:first-child { border-top: none; padding-top: 2px; }
1202
+ .sk-more { cursor: pointer; display: flex; align-items: center; gap: 6px; }
1203
+ .sk-more:hover { color: var(--accent); }
1204
+ .sk-more .pp-sel-chev { transition: transform .15s; }
1205
+ .sk-more.open .pp-sel-chev { transform: rotate(180deg); }
1206
+ .fv-modal { width: min(860px, 92vw); max-height: 84vh; }
1207
+ .fv-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; }
1208
+ .fv-title { font-weight: 600; font-size: 14px; }
1209
+ .fv-path { font-size: 11.5px; word-break: break-all; }
1210
+ .fv-body {
1211
+ margin: 0; padding: 10px 12px; overflow: auto; white-space: pre-wrap; word-break: break-word;
1212
+ background: var(--input-bg, var(--panel)); border: 1px solid var(--border); border-radius: 8px;
1213
+ font-size: 12px; line-height: 1.5; user-select: text;
1214
+ }
1215
+ .fv-edit {
1216
+ min-height: 52vh; resize: vertical; color: var(--text); outline: none;
1217
+ font-family: ui-monospace, monospace; white-space: pre; overflow-wrap: normal;
1218
+ }
1219
+ .fv-edit:focus { border-color: var(--accent); }
1220
+ .fv-actions { display: flex; align-items: center; gap: 10px; }
1221
+ .fv-actions .btn-primary { margin-left: 0; }
1222
+ .fv-note { font-size: 11.5px; }
1223
+
1224
+ #sk-list { max-height: 190px; overflow-y: auto; }
1225
+ .sk-row { cursor: pointer; align-items: center; }
1226
+ .sk-row:hover { color: var(--accent); }
1227
+ .sk-row.active .sk-name { color: var(--accent); font-weight: 600; }
1228
+ .sk-name { display: flex; align-items: center; gap: 6px; flex: 1; min-width: 0; overflow: hidden; }
1229
+ .sk-name > .sk-title { white-space: nowrap; flex: none; }
1230
+ .sk-name .ps-doc-tag { overflow: hidden; text-overflow: ellipsis; }
1231
+ .sk-meta { white-space: nowrap; flex: none; }
1232
+ .sk-edit { gap: 8px; }
1233
+ .sk-path { word-break: break-all; }
1234
+ .sk-text {
1235
+ width: 100%; min-height: 260px; resize: vertical; padding: 10px 12px;
1236
+ border: 1px solid var(--border); border-radius: 8px; background: var(--input-bg);
1237
+ color: var(--text); outline: none; font-family: ui-monospace, monospace; font-size: 12px; line-height: 1.5;
1238
+ }
1239
+ .sk-text:focus { border-color: var(--accent); }
1240
+ .sk-actions { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
1241
+ .sk-actions .btn-primary { margin-left: 0; }
1242
+ .sk-note { font-size: 11.5px; }
1243
+ .sk-del { color: var(--danger); border-color: var(--danger-soft, var(--border)); margin-left: auto; }
1244
+ .kbh-note.warn {
1245
+ color: var(--warn-text); background: var(--warn-bg);
1246
+ border: 1px solid var(--warn-border); border-radius: 7px; padding: 6px 10px;
1247
+ }