@ohos-cpf/3rdloop 0.0.3 → 0.0.5

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 (46) hide show
  1. package/README.md +124 -87
  2. package/lib/cli.js +25 -0
  3. package/lib/config-cmd.js +1 -1
  4. package/lib/serve.js +268 -0
  5. package/lib/update.js +46 -6
  6. package/lib/web-ext.js +454 -0
  7. package/lib/web.js +664 -0
  8. package/package.json +2 -1
  9. package/vendor/Server/Agent/SkillSelector/README.md +11 -11
  10. package/vendor/Server/Agent/SkillSelector/llm/llmClient.js +3 -3
  11. package/vendor/Server/Skills/arkts-code-use/SKILL.md +270 -0
  12. package/vendor/Server/Skills/arkts-code-use/assets/TEMPLATES.md +367 -0
  13. package/vendor/Server/Skills/arkts-code-use/references/API_VERIFICATION.md +144 -0
  14. package/vendor/Server/Skills/arkts-code-use/references/ARKTS_RULES.md +240 -0
  15. package/vendor/Server/Skills/arkts-code-use/references/CODE_PATTERNS.md +431 -0
  16. package/vendor/Server/Skills/arkts-code-use/references/SYNTAX_CHECK_GUIDE.md +164 -0
  17. package/vendor/Server/Skills/arkts-code-use/scripts/verify-arkts.cjs +428 -0
  18. package/vendor/Server/Skills/gitcode-repo-fork/SKILL.md +310 -0
  19. package/vendor/Server/Skills/gitcode-repo-fork/assets/FORK_REPORT_TEMPLATE.md +113 -0
  20. package/vendor/Server/Skills/gitcode-repo-fork/references/FORK_DECISION_GUIDE.md +124 -0
  21. package/vendor/Server/Skills/gitcode-repo-fork/references/GITCODE_FORK_API.md +95 -0
  22. package/vendor/Server/Skills/gitcode-repo-fork/scripts/gitcode-fork.cjs +285 -0
  23. package/vendor/VERSION +3 -3
  24. package/web/css/arktslibrarycheck.css +322 -0
  25. package/web/css/codecheck.css +464 -0
  26. package/web/css/flutterlibrarycheck.css +322 -0
  27. package/web/css/knowledge.css +332 -0
  28. package/web/css/loop.css +578 -0
  29. package/web/css/md-reader.css +240 -0
  30. package/web/css/rnlibrarycheck.css +322 -0
  31. package/web/css/theme.css +702 -0
  32. package/web/index.html +713 -0
  33. package/web/js/arktslibrarycheck.js +1413 -0
  34. package/web/js/codecheck.js +1039 -0
  35. package/web/js/flutterlibrarycheck.js +1364 -0
  36. package/web/js/health.js +69 -0
  37. package/web/js/knowledge.js +358 -0
  38. package/web/js/loop.js +1102 -0
  39. package/web/js/md-reader.js +435 -0
  40. package/web/js/navigation.js +238 -0
  41. package/web/js/rnlibrarycheck.js +1378 -0
  42. package/web/js/stats.js +110 -0
  43. package/web/js/theme.js +46 -0
  44. package/web/js/utils.js +228 -0
  45. package/web/knowledge.html +146 -0
  46. package/web/loop.html +219 -0
@@ -0,0 +1,322 @@
1
+ /* ════════════════════════════════════════════════════════════════════
2
+ * flutterlibrarycheck.css — Flutter 仓库检视面板专用样式
3
+ *
4
+ * 依赖:theme.css(CSS 变量)、codecheck.css(cc-* 通用卡片/徽章/按钮样式)
5
+ * ════════════════════════════════════════════════════════════════════ */
6
+
7
+ /* ─── 入参说明 ─────────────────────────────────────────────────────── */
8
+ .flc-param-intro {
9
+ background: var(--card);
10
+ border: 1px solid var(--border);
11
+ border-radius: 8px;
12
+ padding: 12px 14px;
13
+ }
14
+
15
+ .flc-param-title {
16
+ font-size: 12px;
17
+ font-weight: 600;
18
+ color: var(--text2);
19
+ margin-bottom: 10px;
20
+ }
21
+
22
+ .flc-param-grid {
23
+ display: grid;
24
+ grid-template-columns: repeat(2, 1fr);
25
+ gap: 8px;
26
+ }
27
+
28
+ @media (max-width: 900px) {
29
+ .flc-param-grid { grid-template-columns: 1fr; }
30
+ }
31
+
32
+ .flc-param-item {
33
+ display: flex;
34
+ flex-direction: column;
35
+ gap: 3px;
36
+ padding: 8px 10px;
37
+ background: var(--bg);
38
+ border: 1px solid var(--border-light);
39
+ border-radius: 6px;
40
+ }
41
+
42
+ .flc-param-name {
43
+ font-size: 11px;
44
+ font-weight: 600;
45
+ color: var(--blue);
46
+ }
47
+
48
+ .flc-param-code {
49
+ font-family: var(--mono);
50
+ font-size: 11px;
51
+ color: var(--text2);
52
+ background: var(--code-bg);
53
+ padding: 2px 6px;
54
+ border-radius: 4px;
55
+ word-break: break-all;
56
+ line-height: 1.5;
57
+ }
58
+
59
+ .flc-param-note {
60
+ font-size: 10px;
61
+ color: var(--text3);
62
+ }
63
+
64
+ .flc-param-tip {
65
+ margin-top: 10px;
66
+ font-size: 11px;
67
+ color: var(--text3);
68
+ padding-top: 8px;
69
+ border-top: 1px dashed var(--border-light);
70
+ }
71
+
72
+ /* ─── 评分概览面板 ─────────────────────────────────────────────────── */
73
+ .flc-score-panel {
74
+ background: var(--bg);
75
+ border: 1px solid var(--border);
76
+ border-radius: 8px;
77
+ padding: 14px 16px;
78
+ }
79
+
80
+ .flc-score-panel-title {
81
+ font-size: 13px;
82
+ font-weight: 600;
83
+ color: var(--text);
84
+ margin-bottom: 10px;
85
+ }
86
+
87
+ .flc-score-overall-row {
88
+ display: flex;
89
+ align-items: center;
90
+ gap: 10px;
91
+ padding: 8px 12px;
92
+ background: var(--card);
93
+ border-radius: 6px;
94
+ margin-bottom: 10px;
95
+ }
96
+
97
+ .flc-score-label {
98
+ font-size: 12px;
99
+ font-weight: 700;
100
+ color: var(--text);
101
+ width: 64px;
102
+ flex-shrink: 0;
103
+ }
104
+
105
+ .flc-score-value {
106
+ font-size: 18px;
107
+ font-weight: 700;
108
+ font-family: var(--mono);
109
+ padding: 3px 12px;
110
+ border-radius: 6px;
111
+ }
112
+
113
+ .flc-score-weights {
114
+ font-size: 10px;
115
+ color: var(--text3);
116
+ margin-left: auto;
117
+ text-align: right;
118
+ }
119
+
120
+ .flc-score-grid {
121
+ display: grid;
122
+ grid-template-columns: repeat(5, 1fr);
123
+ gap: 8px;
124
+ }
125
+
126
+ @media (max-width: 900px) {
127
+ .flc-score-grid { grid-template-columns: repeat(3, 1fr); }
128
+ }
129
+
130
+ .flc-score-item {
131
+ display: flex;
132
+ align-items: center;
133
+ gap: 6px;
134
+ padding: 7px 10px;
135
+ background: var(--card);
136
+ border: 1px solid var(--border-light);
137
+ border-radius: 6px;
138
+ }
139
+
140
+ .flc-score-item-label {
141
+ font-size: 11px;
142
+ color: var(--text2);
143
+ flex-shrink: 0;
144
+ }
145
+
146
+ .flc-score-item-value {
147
+ font-size: 13px;
148
+ font-weight: 700;
149
+ font-family: var(--mono);
150
+ padding: 2px 8px;
151
+ border-radius: 4px;
152
+ color: var(--text3);
153
+ }
154
+
155
+ /* ─── 步骤进度面板 ─────────────────────────────────────────────────── */
156
+ .flc-steps-panel {
157
+ background: var(--bg);
158
+ border: 1px solid var(--border);
159
+ border-radius: 8px;
160
+ padding: 14px 16px;
161
+ }
162
+
163
+ .flc-steps-title-row {
164
+ display: flex;
165
+ align-items: center;
166
+ justify-content: space-between;
167
+ gap: 10px;
168
+ margin-bottom: 10px;
169
+ flex-wrap: wrap;
170
+ }
171
+
172
+ .flc-steps-title {
173
+ font-size: 13px;
174
+ font-weight: 600;
175
+ color: var(--text);
176
+ margin-bottom: 0;
177
+ }
178
+
179
+ /* ─── 打包下载全部报告按钮 ─────────────────────────────────────────── */
180
+ .flc-archive-btn {
181
+ display: inline-flex;
182
+ align-items: center;
183
+ gap: 5px;
184
+ padding: 6px 14px;
185
+ border-radius: 6px;
186
+ font-size: 12px;
187
+ font-weight: 600;
188
+ background: rgba(52,199,89,0.12);
189
+ color: var(--green);
190
+ border: 1px solid rgba(52,199,89,0.3);
191
+ cursor: pointer;
192
+ white-space: nowrap;
193
+ flex-shrink: 0;
194
+ transition: all 0.15s;
195
+ }
196
+ .flc-archive-btn:hover:not(:disabled) {
197
+ background: rgba(52,199,89,0.2);
198
+ border-color: rgba(52,199,89,0.5);
199
+ }
200
+ .flc-archive-btn:disabled { opacity: 0.5; cursor: not-allowed; }
201
+
202
+ .flc-steps-list {
203
+ display: flex;
204
+ flex-direction: column;
205
+ }
206
+
207
+ .flc-step-row {
208
+ display: flex;
209
+ align-items: center;
210
+ gap: 12px;
211
+ padding: 9px 0;
212
+ border-bottom: 1px dashed var(--border-light);
213
+ }
214
+
215
+ .flc-step-row:last-child { border-bottom: none; }
216
+
217
+ .flc-step-icon {
218
+ width: 32px;
219
+ height: 32px;
220
+ font-size: 13px;
221
+ font-weight: 700;
222
+ border: 2px solid var(--border);
223
+ border-radius: 50%;
224
+ display: flex;
225
+ align-items: center;
226
+ justify-content: center;
227
+ background: var(--card);
228
+ color: var(--text2);
229
+ flex-shrink: 0;
230
+ transition: border-color 0.2s, background 0.2s, color 0.2s;
231
+ }
232
+
233
+ .flc-step-icon.running {
234
+ border-color: var(--blue);
235
+ background: rgba(0,113,227,0.08);
236
+ }
237
+ .flc-step-icon.completed {
238
+ border-color: var(--green);
239
+ background: rgba(52,199,89,0.1);
240
+ color: var(--green);
241
+ }
242
+ .flc-step-icon.failed {
243
+ border-color: var(--red);
244
+ background: rgba(255,59,48,0.1);
245
+ color: var(--red);
246
+ }
247
+ .flc-step-icon.skipped {
248
+ border-color: var(--gray);
249
+ background: rgba(142,142,147,0.08);
250
+ color: var(--gray);
251
+ }
252
+
253
+ .flc-step-info { flex: 1; min-width: 0; }
254
+
255
+ .flc-step-name {
256
+ font-size: 13px;
257
+ font-weight: 600;
258
+ color: var(--text);
259
+ margin-bottom: 1px;
260
+ }
261
+
262
+ .flc-step-weight {
263
+ font-size: 10px;
264
+ font-weight: 400;
265
+ color: var(--text3);
266
+ font-family: var(--mono);
267
+ }
268
+
269
+ .flc-step-desc {
270
+ font-size: 11px;
271
+ color: var(--text3);
272
+ font-family: var(--mono);
273
+ }
274
+
275
+ .flc-step-actions {
276
+ display: flex;
277
+ align-items: center;
278
+ gap: 6px;
279
+ flex-shrink: 0;
280
+ }
281
+
282
+ .flc-step-score {
283
+ font-size: 12px;
284
+ font-weight: 700;
285
+ font-family: var(--mono);
286
+ padding: 3px 9px;
287
+ border-radius: 5px;
288
+ }
289
+
290
+ /* ─── 步骤对话按钮 ─────────────────────────────────────────────────── */
291
+ .flc-session-btn {
292
+ display: inline-flex;
293
+ align-items: center;
294
+ justify-content: center;
295
+ width: 30px;
296
+ height: 26px;
297
+ padding: 0;
298
+ border-radius: 6px;
299
+ font-size: 12px;
300
+ background: rgba(175,82,222,0.1);
301
+ color: var(--purple);
302
+ border: 1px solid rgba(175,82,222,0.3);
303
+ cursor: pointer;
304
+ white-space: nowrap;
305
+ transition: all 0.15s;
306
+ }
307
+
308
+ .flc-session-btn:hover:not(:disabled) {
309
+ background: rgba(175,82,222,0.2);
310
+ border-color: rgba(175,82,222,0.5);
311
+ }
312
+
313
+ .flc-session-btn:disabled { opacity: 0.4; cursor: not-allowed; }
314
+
315
+ /* ─── 面板布局 ─────────────────────────────────────────────────────── */
316
+ #p-flutterlibrarycheck .panel-pad {
317
+ padding: 20px 24px;
318
+ overflow-y: auto;
319
+ display: flex;
320
+ flex-direction: column;
321
+ gap: 16px;
322
+ }
@@ -0,0 +1,332 @@
1
+ /* ════════════════════════════════════════════════════════════════════
2
+ * 知识管理 — 专用样式(作为独立视图面板 #p-knowledge,由顶栏视图切换器控制)
3
+ * 基础元素(按钮、表单、弹窗、Toast)复用 theme.css / loop.css
4
+ * ════════════════════════════════════════════════════════════════════ */
5
+
6
+ /* ─── 知识管理主体布局(sidebar + main 水平排列,撑满 tab-content) ── */
7
+ .kn-body {
8
+ flex: 1;
9
+ display: flex;
10
+ overflow: hidden;
11
+ }
12
+
13
+ /* ─── 左侧知识列表栏 ────────────────────────────────────────────────── */
14
+ .kn-sidebar {
15
+ width: 340px;
16
+ min-width: 340px;
17
+ background: var(--sidebar);
18
+ border-right: 1px solid var(--border);
19
+ display: flex;
20
+ flex-direction: column;
21
+ overflow: hidden;
22
+ }
23
+ .kn-sidebar-header {
24
+ padding: 12px 14px;
25
+ border-bottom: 1px solid var(--border-light);
26
+ flex-shrink: 0;
27
+ }
28
+ .kn-sidebar-header h2 {
29
+ font-size: 13px;
30
+ font-weight: 700;
31
+ margin-bottom: 8px;
32
+ display: flex;
33
+ align-items: center;
34
+ gap: 6px;
35
+ }
36
+ .kn-refresh-btn {
37
+ width: 100%;
38
+ margin-top: 8px;
39
+ }
40
+
41
+ .kn-list { flex: 1; overflow-y: auto; padding: 8px; }
42
+
43
+ /* 知识卡片 */
44
+ .kn-card {
45
+ padding: 12px;
46
+ border-radius: 8px;
47
+ background: var(--card);
48
+ border: 1px solid var(--border-light);
49
+ cursor: pointer;
50
+ transition: all 0.15s;
51
+ margin-bottom: 6px;
52
+ }
53
+ .kn-card:hover { border-color: var(--blue); box-shadow: var(--shadow); }
54
+ .kn-card.active {
55
+ background: var(--blue-light);
56
+ border-color: var(--blue);
57
+ }
58
+ .kn-card-id {
59
+ font-size: 10px;
60
+ font-family: "SF Mono", Monaco, monospace;
61
+ color: var(--text2);
62
+ margin-bottom: 4px;
63
+ }
64
+ .kn-card-desc {
65
+ font-size: 12px;
66
+ color: var(--text);
67
+ line-height: 1.5;
68
+ margin-bottom: 6px;
69
+ display: -webkit-box;
70
+ -webkit-line-clamp: 3;
71
+ -webkit-box-orient: vertical;
72
+ overflow: hidden;
73
+ }
74
+ .kn-card-meta {
75
+ display: flex;
76
+ align-items: center;
77
+ gap: 8px;
78
+ flex-wrap: wrap;
79
+ }
80
+ .kn-card-task {
81
+ font-size: 10px;
82
+ color: var(--blue);
83
+ font-family: "SF Mono", Monaco, monospace;
84
+ background: var(--blue-light);
85
+ padding: 1px 6px;
86
+ border-radius: 8px;
87
+ }
88
+ .kn-card-time {
89
+ font-size: 10px;
90
+ color: var(--text3);
91
+ }
92
+
93
+ /* ─── 右侧主区域 ────────────────────────────────────────────────────── */
94
+ .kn-main {
95
+ flex: 1;
96
+ display: flex;
97
+ flex-direction: column;
98
+ overflow-y: auto;
99
+ padding: 20px;
100
+ gap: 16px;
101
+ }
102
+
103
+ /* ─── 知识详情卡 ────────────────────────────────────────────────────── */
104
+ /* flex-shrink: 0 —— .kn-main 是纵向 flex 容器,若允许收缩,内容超出时卡片会被
105
+ 压扁(配合 overflow: hidden 直接裁剪内容),且容器 scrollHeight 不增长导致无法滚动 */
106
+ .kn-detail-card {
107
+ flex-shrink: 0;
108
+ background: var(--card);
109
+ border: 1px solid var(--border-light);
110
+ border-radius: 10px;
111
+ overflow: hidden;
112
+ }
113
+ .kn-detail-header {
114
+ display: flex;
115
+ align-items: flex-start;
116
+ justify-content: space-between;
117
+ gap: 12px;
118
+ padding: 16px 20px;
119
+ background: var(--code-bg);
120
+ border-bottom: 1px solid var(--border-light);
121
+ }
122
+ .kn-detail-title h2 {
123
+ font-size: 15px;
124
+ font-weight: 700;
125
+ line-height: 1.4;
126
+ margin-bottom: 4px;
127
+ }
128
+ .kn-id {
129
+ font-size: 11px;
130
+ font-family: "SF Mono", Monaco, monospace;
131
+ color: var(--text2);
132
+ }
133
+ .kn-detail-actions {
134
+ display: flex;
135
+ gap: 8px;
136
+ flex-shrink: 0;
137
+ }
138
+ .kn-detail-meta {
139
+ display: flex;
140
+ gap: 16px;
141
+ flex-wrap: wrap;
142
+ padding: 12px 20px;
143
+ border-bottom: 1px solid var(--border-light);
144
+ font-size: 11px;
145
+ }
146
+ .kn-detail-meta .meta-item {
147
+ display: flex;
148
+ flex-direction: column;
149
+ gap: 2px;
150
+ }
151
+ .kn-detail-meta .meta-label {
152
+ color: var(--text2);
153
+ font-size: 10px;
154
+ text-transform: uppercase;
155
+ letter-spacing: 0.5px;
156
+ }
157
+ .kn-detail-meta .meta-value {
158
+ color: var(--text);
159
+ font-weight: 500;
160
+ word-break: break-all;
161
+ }
162
+ .kn-detail-desc {
163
+ padding: 14px 20px;
164
+ font-size: 13px;
165
+ line-height: 1.7;
166
+ color: var(--text);
167
+ white-space: pre-wrap;
168
+ }
169
+
170
+ /* ─── 导入面板 ──────────────────────────────────────────────────────── */
171
+ .kn-import-panel {
172
+ flex-shrink: 0;
173
+ background: var(--card);
174
+ border: 1px solid var(--border-light);
175
+ border-radius: 10px;
176
+ overflow: hidden;
177
+ }
178
+ .kn-import-header {
179
+ display: flex;
180
+ align-items: center;
181
+ gap: 10px;
182
+ padding: 12px 20px;
183
+ background: var(--code-bg);
184
+ border-bottom: 1px solid var(--border-light);
185
+ }
186
+ .kn-import-header h3 { font-size: 14px; }
187
+ .kn-import-body {
188
+ padding: 16px 20px;
189
+ }
190
+
191
+ .kn-import-actions {
192
+ display: flex;
193
+ justify-content: flex-end;
194
+ gap: 8px;
195
+ margin-top: 16px;
196
+ padding-top: 12px;
197
+ border-top: 1px solid var(--border-light);
198
+ }
199
+
200
+ /* ─── 异步导入状态 ──────────────────────────────────────────────────── */
201
+ .kn-import-status {
202
+ flex-shrink: 0;
203
+ background: var(--card);
204
+ border: 1px solid var(--border-light);
205
+ border-radius: 10px;
206
+ overflow: hidden;
207
+ }
208
+ .kn-status-header {
209
+ display: flex;
210
+ align-items: center;
211
+ justify-content: space-between;
212
+ padding: 12px 20px;
213
+ background: var(--code-bg);
214
+ border-bottom: 1px solid var(--border-light);
215
+ }
216
+ .kn-status-header h3 { font-size: 14px; }
217
+ .kn-status-body { padding: 16px 20px; }
218
+
219
+ .kn-status-row {
220
+ display: grid;
221
+ grid-template-columns: 120px 1fr;
222
+ gap: 6px 12px;
223
+ font-size: 12px;
224
+ line-height: 1.6;
225
+ }
226
+ .kn-status-row .k { color: var(--text2); }
227
+ .kn-status-row .v {
228
+ font-family: "SF Mono", Monaco, monospace;
229
+ word-break: break-all;
230
+ }
231
+
232
+ /* 导入状态徽章 */
233
+ .kn-import-badge {
234
+ display: inline-flex;
235
+ align-items: center;
236
+ gap: 4px;
237
+ padding: 2px 10px;
238
+ border-radius: 10px;
239
+ font-size: 11px;
240
+ font-weight: 600;
241
+ }
242
+ .kn-import-badge.running { background: var(--orange-light); color: var(--orange); }
243
+ .kn-import-badge.completed { background: var(--green-light); color: var(--badge-green-text); }
244
+ .kn-import-badge.failed { background: var(--red-light); color: var(--badge-red-text); }
245
+ .kn-import-badge.error { background: var(--red-light); color: var(--red); }
246
+
247
+ /* 导入进度日志 */
248
+ .kn-log-box {
249
+ margin-top: 12px;
250
+ background: var(--code-bg);
251
+ border-radius: 8px;
252
+ padding: 10px 12px;
253
+ max-height: 240px;
254
+ overflow-y: auto;
255
+ font-family: "SF Mono", Monaco, monospace;
256
+ font-size: 11px;
257
+ line-height: 1.6;
258
+ }
259
+ .kn-log-line { color: var(--text2); }
260
+ .kn-log-line.info { color: var(--blue); }
261
+ .kn-log-line.warn { color: var(--orange); }
262
+ .kn-log-line.error { color: var(--red); }
263
+
264
+ /* ─── 空状态 ────────────────────────────────────────────────────────── */
265
+ .kn-empty {
266
+ display: flex;
267
+ flex-direction: column;
268
+ align-items: center;
269
+ justify-content: center;
270
+ flex: 1;
271
+ gap: 12px;
272
+ color: var(--text2);
273
+ }
274
+ .kn-empty-icon { font-size: 48px; }
275
+ .kn-empty-text { font-size: 14px; }
276
+
277
+ /* ─── 删除确认弹窗 ──────────────────────────────────────────────────── */
278
+ /* 复用 theme.css 的 .modal-overlay / .modal 骨架,此处补充删除场景专属样式 */
279
+ .kn-delete-overlay { z-index: 1100; }
280
+ .kn-delete-modal {
281
+ width: 420px;
282
+ max-width: 92vw;
283
+ padding: 24px;
284
+ text-align: center;
285
+ animation: knDeletePop 0.22s cubic-bezier(0.34, 1.56, 0.64, 1);
286
+ }
287
+ .kn-delete-icon {
288
+ font-size: 40px;
289
+ line-height: 1;
290
+ margin-bottom: 10px;
291
+ }
292
+ .kn-delete-title {
293
+ font-size: 16px;
294
+ font-weight: 700;
295
+ color: var(--text);
296
+ margin-bottom: 10px;
297
+ }
298
+ .kn-delete-desc {
299
+ font-size: 13px;
300
+ color: var(--text);
301
+ line-height: 1.5;
302
+ margin-bottom: 6px;
303
+ word-break: break-all;
304
+ }
305
+ .kn-delete-id {
306
+ font-size: 11px;
307
+ font-family: var(--mono);
308
+ color: var(--text3);
309
+ margin-bottom: 14px;
310
+ word-break: break-all;
311
+ }
312
+ .kn-delete-warning {
313
+ font-size: 12px;
314
+ line-height: 1.6;
315
+ color: var(--badge-red-text);
316
+ background: var(--red-light);
317
+ border-radius: 8px;
318
+ padding: 10px 12px;
319
+ text-align: left;
320
+ margin-bottom: 16px;
321
+ }
322
+ .kn-delete-warning strong { font-weight: 700; }
323
+ .kn-delete-actions {
324
+ display: flex;
325
+ justify-content: center;
326
+ gap: 10px;
327
+ }
328
+ .kn-delete-actions button { min-width: 110px; }
329
+ @keyframes knDeletePop {
330
+ from { transform: scale(0.85); opacity: 0; }
331
+ to { transform: scale(1); opacity: 1; }
332
+ }