skill-forge-hub 0.3.0 → 0.5.0

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 (55) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/README.md +83 -27
  3. package/annual-report/SKILL.md +17 -10
  4. package/annual-report/resources/content-rules.md +11 -9
  5. package/annual-report/resources/data-collection.md +3 -3
  6. package/annual-report/resources/date-parsing.md +1 -1
  7. package/annual-report/resources/disk-and-html.md +10 -10
  8. package/annual-report/resources/industry-dictionary.md +3 -1
  9. package/annual-report/resources/reference.html +146 -52
  10. package/annual-report/resources/usage-guide.md +56 -15
  11. package/annual-report/user-config.md +3 -2
  12. package/article-to-html/SKILL.md +23 -0
  13. package/article-to-html/design-system.md +86 -21
  14. package/article-to-html/user-config.md +18 -0
  15. package/cli.js +72 -23
  16. package/daily-report/SKILL.md +16 -8
  17. package/daily-report/resources/content-rules.md +27 -23
  18. package/daily-report/resources/data-collection.md +5 -5
  19. package/daily-report/resources/date-parsing.md +1 -1
  20. package/daily-report/resources/disk-and-html.md +2 -2
  21. package/daily-report/resources/industry-dictionary.md +3 -1
  22. package/daily-report/resources/reference.html +175 -73
  23. package/daily-report/resources/usage-guide.md +4 -4
  24. package/daily-report/user-config.md +3 -2
  25. package/deck-stage/SKILL.md +80 -0
  26. package/deck-stage/package-lock.json +172 -0
  27. package/deck-stage/package.json +15 -0
  28. package/deck-stage/resources/cover-template.html +139 -0
  29. package/deck-stage/resources/data-schema.md +111 -0
  30. package/deck-stage/resources/pptx-builder.js +394 -0
  31. package/deck-stage/resources/usage-guide.md +20 -0
  32. package/deck-stage/user-config.md +26 -0
  33. package/magic-deck/SKILL.md +20 -11
  34. package/magic-deck/resources/deck-spec.md +412 -51
  35. package/magic-deck/resources/reference.html +2096 -112
  36. package/magic-deck/resources/usage-guide.md +42 -0
  37. package/magic-deck/user-config.md +10 -7
  38. package/meta-forge/SKILL.md +2 -0
  39. package/meta-forge/resources/forge-rules.md +1 -0
  40. package/meta-forge/resources/usage-guide.md +1 -1
  41. package/package.json +16 -4
  42. package/prompt-pouch/SKILL.md +77 -0
  43. package/prompt-pouch/resources/data-format.md +67 -0
  44. package/prompt-pouch/resources/reference.html +2038 -0
  45. package/prompt-pouch/resources/usage-guide.md +32 -0
  46. package/prompt-pouch/user-config.md +22 -0
  47. package/weekly-report/SKILL.md +16 -8
  48. package/weekly-report/resources/content-rules.md +38 -27
  49. package/weekly-report/resources/data-collection.md +5 -5
  50. package/weekly-report/resources/date-parsing.md +1 -1
  51. package/weekly-report/resources/disk-and-html.md +2 -2
  52. package/weekly-report/resources/industry-dictionary.md +5 -3
  53. package/weekly-report/resources/reference.html +226 -104
  54. package/weekly-report/resources/usage-guide.md +6 -6
  55. package/weekly-report/user-config.md +4 -3
@@ -5,11 +5,53 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>本周周报 - 20261102 ~ 20261106</title>
7
7
  <style>
8
- :root{
9
- --cyan:#0ea5e9; --bg:#0a1929; --card:#0b1e37; --border:rgba(14,165,233,.15);
10
- --text:#bae6fd; --muted:#5b7fa5; --green:#14b8a6; --orange:#f97316;
11
- --purple:#6366f1; --rose:#f43f5e; --glow:#0f3350;
12
- }
8
+ /* ═══ 四主题令牌:12 核心契约(与 magic-deck 一致)+ 报告扩展(发光/氛围/热力/语义色);html[data-theme] 运行时切换,THEME 生成时定默认 ═══ */
9
+ :root, [data-theme="tech"]{
10
+ --bg:#0a1929; --bg2:#071525; --panel:rgba(11,30,55,.9); --panel-solid:#0b1e37;
11
+ --card-shadow:0 1px 0 rgba(255,255,255,.05) inset, 0 12px 32px rgba(1,6,16,.5), 0 0 24px rgba(14,165,233,.15);
12
+ --text:#bae6fd; --muted:#5b7fa5; --accent:#0ea5e9; --accent2:#14b8a6;
13
+ --border:rgba(14,165,233,.18); --glow:rgba(14,165,233,.35); --glow-soft:rgba(14,165,233,.15);
14
+ --title-grad:linear-gradient(90deg,#7dd3fc,#0ea5e9 45%,#818cf8);
15
+ --tag-bg:rgba(14,165,233,.12);
16
+ --scan:rgba(0,240,255,.2); --scan-dim:rgba(0,240,255,.05);
17
+ --heat:rgba(14,165,233,.55);
18
+ --green:#14b8a6; --orange:#f97316; --rose:#f43f5e; --cp-a:rgba(186,230,253,.15); --cp-b:rgba(240,252,255,.92); --cp-tip:#fff; --cp-glow0:0 0 5px 2px rgba(186,230,253,.6); --cp-glow1:0 0 7px 2.5px rgba(224,254,255,.85); --cpd-a:rgba(224,254,255,.25); --cpd-b:rgba(255,255,255,.96); --cpd-tip:#fff; --cpd-glow0:0 0 6px 2.5px rgba(224,254,255,.7); --cpd-glow1:0 0 8px 3px rgba(255,255,255,.85); --cm-f0:drop-shadow(0 0 1.5px rgba(255,255,255,.9)) drop-shadow(0 0 7px rgba(255,255,255,.5)) drop-shadow(0 0 14px rgba(224,254,255,.35)) drop-shadow(0 0 22px rgba(224,254,255,.3)); --cm-f1:drop-shadow(0 0 3px rgba(255,255,255,1)) drop-shadow(0 0 9px rgba(255,255,255,.65)) drop-shadow(0 0 18px rgba(255,255,255,.35)) drop-shadow(0 0 28px rgba(224,254,255,.25)) drop-shadow(0 0 10px rgba(224,254,255,.45));
19
+ }
20
+ [data-theme="biz"]{
21
+ --bg:#e8ecf5; --bg2:#dde3ef; --panel:rgba(255,255,255,.97); --panel-solid:#ffffff;
22
+ --card-shadow:0 1px 2px rgba(15,23,42,.05), 0 10px 28px rgba(15,23,42,.12);
23
+ --text:#1e293b; --muted:#64748b; --accent:#2563eb; --accent2:#0891b2;
24
+ --border:rgba(37,99,235,.14); --glow:rgba(37,99,235,.18); --glow-soft:rgba(37,99,235,.12);
25
+ --title-grad:linear-gradient(90deg,#1e40af,#2563eb 55%,#0891b2);
26
+ --tag-bg:rgba(37,99,235,.08);
27
+ --scan:rgba(37,99,235,.14); --scan-dim:rgba(37,99,235,.04);
28
+ --heat:rgba(37,99,235,.55);
29
+ --green:#0d9488; --orange:#ea580c; --rose:#e11d48;
30
+ }
31
+ [data-theme="mono"]{
32
+ --bg:#f2f2f4; --bg2:#e4e4e8; --panel:rgba(255,255,255,.98); --panel-solid:#ffffff;
33
+ --card-shadow:0 1px 2px rgba(0,0,0,.06), 0 10px 28px rgba(0,0,0,.1);
34
+ --text:#16181d; --muted:#6b7280; --accent:#111111; --accent2:#4b5563;
35
+ --border:rgba(17,17,17,.14); --glow:rgba(17,17,17,.08); --glow-soft:rgba(17,17,17,.1);
36
+ --title-grad:linear-gradient(90deg,#111,#333 60%,#666);
37
+ --tag-bg:rgba(17,17,17,.06);
38
+ --scan:rgba(17,17,17,.1); --scan-dim:rgba(17,17,17,.04);
39
+ --heat:rgba(17,17,17,.55);
40
+ --green:#0f766e; --orange:#c2410c; --rose:#be123c;
41
+ }
42
+ [data-theme="warm"]{
43
+ --bg:#f7ebd9; --bg2:#efe0c8; --panel:rgba(255,250,243,.97); --panel-solid:#fffaf3;
44
+ --card-shadow:0 1px 2px rgba(120,72,24,.07), 0 10px 28px rgba(120,72,24,.13);
45
+ --text:#43301f; --muted:#8a7565; --accent:#d97706; --accent2:#ea580c;
46
+ --border:rgba(217,119,6,.18); --glow:rgba(217,119,6,.22); --glow-soft:rgba(217,119,6,.14);
47
+ --title-grad:linear-gradient(90deg,#b45309,#d97706 50%,#ea580c);
48
+ --tag-bg:rgba(217,119,6,.1);
49
+ --scan:rgba(217,119,6,.16); --scan-dim:rgba(217,119,6,.04);
50
+ --heat:rgba(217,119,6,.55);
51
+ --green:#0d9488; --orange:#c2410c; --rose:#be123c;
52
+ }
53
+ /* 浅色主题下星点氛围自然退隐 */
54
+ [data-theme="biz"] .stars, [data-theme="mono"] .stars, [data-theme="warm"] .stars{ opacity:.28; }
13
55
  *{margin:0;padding:0;box-sizing:border-box;}
14
56
  html,body{background:var(--bg);}
15
57
  body{
@@ -25,7 +67,7 @@ body::before{
25
67
  /* 网格底纹 */
26
68
  .grid-pattern{
27
69
  position:fixed; inset:0; z-index:0; pointer-events:none;
28
- background-image:linear-gradient(rgba(0,240,255,.03) 1px, transparent 1px),linear-gradient(90deg, rgba(0,240,255,.03) 1px, transparent 1px);
70
+ background-image:linear-gradient(var(--scan-dim) 1px, transparent 1px),linear-gradient(90deg, var(--scan-dim) 1px, transparent 1px);
29
71
  background-size:60px 60px;
30
72
  }
31
73
  /* 星点层 */
@@ -44,12 +86,12 @@ body::before{
44
86
  /* 扫描线 */
45
87
  .scanlines{
46
88
  position:fixed; inset:0; z-index:999; pointer-events:none;
47
- background:repeating-linear-gradient(0deg, transparent 0 2px, rgba(0,240,255,.015) 2px 4px);
89
+ background:repeating-linear-gradient(0deg, transparent 0 2px, var(--scan-dim) 2px 4px);
48
90
  }
49
91
  /* CRT 光带 */
50
92
  .scanband{
51
93
  position:fixed; left:0; right:0; height:150px; z-index:998; pointer-events:none;
52
- background:linear-gradient(180deg, transparent, rgba(0,240,255,.03) 50%, transparent);
94
+ background:linear-gradient(180deg, transparent, var(--scan-dim) 50%, transparent);
53
95
  animation:scanMove 11s linear infinite;
54
96
  }
55
97
  @keyframes scanMove{ from{top:-22%;} to{top:112%;} }
@@ -58,23 +100,23 @@ body::before{
58
100
  }
59
101
  /* ============ 头部卡片 ============ */
60
102
  .header-card{
61
- position:relative; background:var(--card);
103
+ position:relative; background:var(--panel-solid);
62
104
  background-image:repeating-linear-gradient(180deg, rgba(255,255,255,.012) 0 1px, transparent 1px 8px);
63
- border-top:1px solid var(--glow); border-bottom:1px solid var(--glow);
105
+ border-top:1px solid var(--border); border-bottom:1px solid var(--border);
64
106
  border-radius:6px; padding:38px 36px 26px; text-align:center; overflow:hidden;
65
- box-shadow:0 0 20px rgba(14,165,233,.08), inset 0 1px 24px rgba(14,165,233,.04);
107
+ box-shadow:var(--card-shadow);
66
108
  margin-bottom:18px;
67
109
  }
68
110
  .card-glow{
69
111
  position:absolute; inset:0; pointer-events:none; transform-origin:top center;
70
- background:radial-gradient(ellipse at 50% 10%, rgba(14,165,233,.25), transparent 70%);
112
+ background:radial-gradient(ellipse at 50% 10%, var(--glow), transparent 70%);
71
113
  opacity:.5; animation:cardGlow 3s ease-in-out infinite;
72
114
  }
73
115
  @keyframes cardGlow{ 0%,100%{opacity:.5; transform:scale(1);} 50%{opacity:1; transform:scale(1.6);} }
74
116
  /* 四边扫描线 */
75
117
  .scanline-el{ position:absolute; pointer-events:none; z-index:3; }
76
- .scan-x{ left:0; right:0; height:1px; background:linear-gradient(90deg, transparent, var(--cyan), transparent); }
77
- .scan-y{ top:0; bottom:0; width:1px; background:linear-gradient(180deg, transparent, var(--cyan), transparent); }
118
+ .scan-x{ left:0; right:0; height:1px; background:linear-gradient(90deg, transparent, var(--accent), transparent); }
119
+ .scan-y{ top:0; bottom:0; width:1px; background:linear-gradient(180deg, transparent, var(--accent), transparent); }
78
120
  .scan-top{ top:0; animation:scanX 3s linear infinite; }
79
121
  .scan-right{ right:0; animation:scanY 3s linear infinite; }
80
122
  .scan-bottom{ bottom:0; animation:scanXrev 3s linear infinite; }
@@ -85,29 +127,29 @@ body::before{
85
127
  @keyframes scanYrev{ from{transform:translateY(100%);} to{transform:translateY(-100%);} }
86
128
  h1{
87
129
  position:relative; z-index:2; font-size:30px; font-weight:900; letter-spacing:1px;
88
- background:linear-gradient(90deg, var(--cyan), var(--purple));
130
+ background:var(--title-grad);
89
131
  -webkit-background-clip:text; background-clip:text; -webkit-text-fill-color:transparent;
90
- text-shadow:0 0 20px rgba(14,165,233,.4), 0 0 60px rgba(14,165,233,.15);
132
+ text-shadow:0 0 20px var(--glow), 0 0 60px var(--glow-soft);
91
133
  animation:titleGlow 3s ease-in-out infinite;
92
134
  }
93
135
  @keyframes titleGlow{
94
- 0%,100%{ filter:drop-shadow(0 0 20px rgba(14,165,233,.4)) drop-shadow(0 0 60px rgba(14,165,233,.15)); }
95
- 50%{ filter:drop-shadow(0 0 30px rgba(14,165,233,.7)) drop-shadow(0 0 80px rgba(14,165,233,.3)); }
136
+ 0%,100%{ filter:drop-shadow(0 0 20px var(--glow)) drop-shadow(0 0 60px var(--glow-soft)); }
137
+ 50%{ filter:drop-shadow(0 0 30px var(--glow)) drop-shadow(0 0 80px var(--glow-soft)); }
96
138
  }
97
139
  .header-sub{ position:relative; z-index:2; font-size:13px; color:var(--muted); margin-top:10px; letter-spacing:2px; }
98
140
  .header-badge{
99
- position:relative; z-index:2; display:inline-block; margin-top:12px; font-size:11px; color:var(--cyan);
100
- border:1px solid rgba(14,165,233,.35); border-radius:999px; padding:3px 12px;
101
- background:rgba(14,165,233,.07); text-shadow:0 0 6px rgba(14,165,233,.6); letter-spacing:1px;
141
+ position:relative; z-index:2; display:inline-block; margin-top:12px; font-size:11px; color:var(--accent);
142
+ border:1px solid var(--border); border-radius:999px; padding:3px 12px;
143
+ background:var(--tag-bg); text-shadow:0 0 6px var(--glow); letter-spacing:1px;
102
144
  }
103
145
  .summary-line{
104
146
  position:relative; z-index:2; display:flex; gap:10px; max-width:540px; margin:18px auto 0;
105
147
  align-items:flex-start;
106
148
  }
107
149
  .summary-tag{
108
- flex:0 0 auto; font-size:10px; font-weight:700; color:var(--cyan); letter-spacing:1px;
109
- border:1px solid rgba(14,165,233,.35); border-radius:4px; padding:2px 6px;
110
- background:rgba(14,165,233,.07); text-shadow:0 0 6px rgba(14,165,233,.6); margin-top:2px;
150
+ flex:0 0 auto; font-size:10px; font-weight:700; color:var(--accent); letter-spacing:1px;
151
+ border:1px solid var(--border); border-radius:4px; padding:2px 6px;
152
+ background:var(--tag-bg); text-shadow:0 0 6px var(--glow); margin-top:2px;
111
153
  }
112
154
  .summary-text{ font-size:12.5px; color:var(--text); line-height:1.75; text-align:left; }
113
155
  /* 复制按钮 */
@@ -115,10 +157,10 @@ h1{
115
157
  .copy-btn{
116
158
  display:flex; align-items:center; gap:8px; cursor:pointer; border:none; border-radius:999px;
117
159
  padding:10px 28px; font-family:inherit; font-size:14px; color:#fff; letter-spacing:1px;
118
- background:linear-gradient(90deg, var(--cyan), #0284c7);
119
- box-shadow:0 0 30px rgba(14,165,233,.4); transition:box-shadow .25s, transform .15s;
160
+ background:linear-gradient(90deg, var(--accent), var(--accent2));
161
+ box-shadow:0 0 30px var(--glow); transition:box-shadow .25s, transform .15s;
120
162
  }
121
- .copy-btn:hover{ box-shadow:0 0 45px rgba(14,165,233,.6); transform:translateY(-1px); }
163
+ .copy-btn:hover{ box-shadow:0 0 45px var(--glow); transform:translateY(-1px); }
122
164
  .copy-btn:active{ transform:scale(.97); }
123
165
  .copy-btn svg{ width:16px; height:16px; flex:0 0 auto; }
124
166
  .copy-btn .check{ display:none; }
@@ -126,16 +168,16 @@ h1{
126
168
  .copy-btn.copied .check{ display:block; }
127
169
  /* ============ 概览 Bento ============ */
128
170
  .overview{
129
- position:relative; background:var(--card);
171
+ position:relative; background:var(--panel-solid);
130
172
  background-image:repeating-linear-gradient(180deg, rgba(255,255,255,.012) 0 1px, transparent 1px 8px);
131
- border-top:1px solid var(--glow); border-bottom:1px solid var(--glow);
173
+ border-top:1px solid var(--border); border-bottom:1px solid var(--border);
132
174
  border-radius:6px; overflow:hidden; margin-bottom:18px;
133
- box-shadow:0 0 20px rgba(14,165,233,.08), inset 0 1px 24px rgba(14,165,233,.04);
175
+ box-shadow:var(--card-shadow);
134
176
  }
135
177
  .overview::before{
136
178
  content:''; position:absolute; left:0; top:0; bottom:0; width:8px; z-index:2;
137
- background:linear-gradient(180deg,#38bdf8,#0ea5e9);
138
- box-shadow:0 0 12px rgba(14,165,233,.3);
179
+ background:linear-gradient(180deg,var(--accent2),var(--accent));
180
+ box-shadow:0 0 12px var(--glow);
139
181
  }
140
182
  .ov-bento{
141
183
  position:relative; z-index:1; display:grid; padding:20px 20px 16px 28px; gap:10px;
@@ -143,13 +185,13 @@ h1{
143
185
  }
144
186
  .ov-title{
145
187
  grid-column:1/4; display:flex; align-items:center; gap:10px;
146
- font-size:16px; font-weight:900; color:var(--cyan); letter-spacing:2px;
147
- text-shadow:0 0 14px rgba(14,165,233,.45), 0 0 40px rgba(14,165,233,.18);
188
+ font-size:16px; font-weight:900; color:var(--accent); letter-spacing:2px;
189
+ text-shadow:0 0 14px var(--glow), 0 0 40px var(--glow-soft);
148
190
  animation:secGlowCyan 3s ease-in-out infinite;
149
191
  }
150
192
  @keyframes secGlowCyan{
151
- 0%,100%{ text-shadow:0 0 14px rgba(14,165,233,.45), 0 0 40px rgba(14,165,233,.18); }
152
- 50%{ text-shadow:0 0 22px rgba(14,165,233,.75), 0 0 60px rgba(14,165,233,.3); }
193
+ 0%,100%{ text-shadow:0 0 14px var(--glow), 0 0 40px var(--glow-soft); }
194
+ 50%{ text-shadow:0 0 22px var(--glow), 0 0 60px var(--glow-soft); }
153
195
  }
154
196
  /* 圆环 */
155
197
  .ring-box{
@@ -158,36 +200,36 @@ h1{
158
200
  }
159
201
  .ring{ position:relative; width:88px; height:88px; }
160
202
  .ring svg{ transform:rotate(-90deg); }
161
- .ring .track{ fill:none; stroke:rgba(14,165,233,.12); stroke-width:7; }
203
+ .ring .track{ fill:none; stroke:var(--tag-bg); stroke-width:7; }
162
204
  .ring .val{
163
205
  fill:none; stroke:url(#ringGrad); stroke-width:7; stroke-linecap:round;
164
206
  stroke-dasharray:226.19; stroke-dashoffset:0;
165
- filter:drop-shadow(0 0 6px rgba(14,165,233,.5));
207
+ filter:drop-shadow(0 0 6px var(--glow));
166
208
  }
167
209
  .ring-num{
168
210
  position:absolute; inset:0; display:flex; align-items:center; justify-content:center;
169
- font-size:22px; font-weight:900; color:var(--cyan);
170
- text-shadow:0 0 12px rgba(14,165,233,.6);
211
+ font-size:22px; font-weight:900; color:var(--accent);
212
+ text-shadow:0 0 12px var(--glow);
171
213
  }
172
214
  .ring-label{ font-size:11px; color:var(--muted); text-align:center; line-height:1.5; }
173
215
  /* 热力图 */
174
216
  .heat-card{
175
217
  grid-column:2/4; grid-row:2; display:flex; align-items:center; gap:14px;
176
- border:1px solid rgba(14,165,233,.12); border-radius:6px; background:rgba(14,165,233,.03);
218
+ border:1px solid var(--border); border-radius:6px; background:var(--scan-dim);
177
219
  padding:12px 14px; flex-wrap:wrap;
178
220
  }
179
221
  .heat-title{ font-size:12px; font-weight:700; color:var(--text); letter-spacing:1px; white-space:nowrap; }
180
222
  .heat-grid{ display:grid; grid-template-columns:repeat(3, 14px); grid-auto-flow:column; grid-template-rows:repeat(5, 14px); gap:4px; }
181
223
  .hm{
182
224
  width:14px; height:14px; border-radius:3px; position:relative; cursor:default;
183
- background:rgba(14,165,233,.07);
225
+ background:var(--tag-bg);
184
226
  }
185
- .hm[data-v="1"]{ background:rgba(14,165,233,.3); }
186
- .hm[data-v="2"]{ background:rgba(14,165,233,.55); }
187
- .hm[data-v="3"]{ background:rgba(34,211,238,.8); box-shadow:0 0 8px rgba(34,211,238,.5); }
227
+ .hm[data-v="1"]{ background:var(--glow); }
228
+ .hm[data-v="2"]{ background:var(--heat); }
229
+ .hm[data-v="3"]{ background:var(--accent2); box-shadow:0 0 8px var(--glow); }
188
230
  .hm::after{
189
231
  content:attr(data-tip); position:absolute; bottom:calc(100% + 6px); left:50%; transform:translateX(-50%);
190
- background:var(--card); border:1px solid rgba(14,165,233,.35); border-radius:4px;
232
+ background:var(--panel-solid); border:1px solid var(--border); border-radius:4px;
191
233
  color:var(--text); font-size:10px; padding:3px 8px; white-space:nowrap; z-index:5;
192
234
  opacity:0; pointer-events:none; transition:opacity .15s;
193
235
  }
@@ -199,14 +241,14 @@ h1{
199
241
  /* 指标胶囊 */
200
242
  .ov-item{
201
243
  display:flex; align-items:center; gap:10px; padding:10px 14px;
202
- border:1px solid rgba(14,165,233,.12); border-radius:6px; background:rgba(14,165,233,.03);
244
+ border:1px solid var(--border); border-radius:6px; background:var(--scan-dim);
203
245
  }
204
246
  .ov-num{
205
- font-size:24px; font-weight:900; color:var(--cyan); letter-spacing:1px;
206
- text-shadow:0 0 12px rgba(14,165,233,.5);
247
+ font-size:24px; font-weight:900; color:var(--accent); letter-spacing:1px;
248
+ text-shadow:0 0 12px var(--glow);
207
249
  }
208
250
  .ov-num-static{ display:flex; flex-direction:column; line-height:1.2; }
209
- .ov-num-static .main{ font-size:22px; font-weight:900; color:var(--cyan); text-shadow:0 0 12px rgba(14,165,233,.5); }
251
+ .ov-num-static .main{ font-size:22px; font-weight:900; color:var(--accent); text-shadow:0 0 12px var(--glow); }
210
252
  .ov-num-static .small{ font-size:10px; color:var(--rose); }
211
253
  .ov-label{ font-size:11px; color:var(--muted); }
212
254
  .ov-item .ov-num.small-num{ font-size:20px; }
@@ -220,35 +262,35 @@ h1{
220
262
  /* 柱图 */
221
263
  .cb-row{
222
264
  grid-column:2/4; grid-row:6; display:flex; align-items:flex-end; justify-content:space-around;
223
- height:86px; padding:0 6px; border-top:1px dashed rgba(14,165,233,.12); padding-top:10px; position:relative;
265
+ height:86px; padding:0 6px; border-top:1px dashed var(--border); padding-top:10px; position:relative;
224
266
  }
225
267
  .cb-col{ position:relative; display:flex; flex-direction:column; align-items:center; gap:6px; height:100%; justify-content:flex-end; }
226
268
  .cb-bar{
227
269
  width:32px; border-radius:4px 4px 0 0;
228
- background:linear-gradient(180deg, #38bdf8, #0ea5e9 60%, #0369a1);
229
- box-shadow:0 0 10px rgba(14,165,233,.35);
270
+ background:linear-gradient(180deg, var(--accent2), var(--accent) 60%, var(--accent2));
271
+ box-shadow:0 0 10px var(--glow);
230
272
  min-height:3px; animation:cbGrow 1s ease-out both;
231
273
  }
232
274
  @keyframes cbGrow{ from{height:0;} }
233
275
  .cb-col .cb-day{ font-size:9.5px; color:var(--muted); }
234
276
  .cb-col .cb-tip{
235
277
  position:absolute; bottom:calc(100% + 8px); left:50%; transform:translateX(-50%);
236
- background:var(--card); border:1px solid rgba(14,165,233,.35); border-radius:4px;
278
+ background:var(--panel-solid); border:1px solid var(--border); border-radius:4px;
237
279
  color:var(--text); font-size:10px; padding:4px 8px; white-space:nowrap; z-index:5;
238
280
  opacity:0; pointer-events:none; transition:opacity .15s;
239
281
  }
240
282
  .cb-col:hover .cb-tip{ opacity:1; }
241
- .cb-count{ font-size:11px; font-weight:900; color:var(--cyan); text-shadow:0 0 8px rgba(14,165,233,.5); }
283
+ .cb-count{ font-size:11px; font-weight:900; color:var(--accent); text-shadow:0 0 8px var(--glow); }
242
284
  /* ============ 分节卡片 ============ */
243
285
  .section{
244
- position:relative; background:var(--card);
286
+ position:relative; background:var(--panel-solid);
245
287
  background-image:repeating-linear-gradient(180deg, rgba(255,255,255,.012) 0 1px, transparent 1px 8px);
246
- border-top:1px solid var(--glow); border-bottom:1px solid var(--glow);
288
+ border-top:1px solid var(--border); border-bottom:1px solid var(--border);
247
289
  border-radius:6px; overflow:hidden; margin-bottom:18px;
248
- box-shadow:0 0 20px rgba(14,165,233,.08), inset 0 1px 24px rgba(14,165,233,.04);
290
+ box-shadow:var(--card-shadow);
249
291
  transition:transform .2s, box-shadow .2s;
250
292
  }
251
- .section:hover{ transform:perspective(900px) translateY(-2px) rotateY(calc(var(--mx,0)*2.5deg)) rotateX(calc(var(--my,0)*-2.5deg)); box-shadow:0 0 28px rgba(14,165,233,.14), inset 0 1px 30px rgba(14,165,233,.07); }
293
+ .section:hover{ transform:perspective(900px) translateY(-2px) rotateY(calc(var(--mx,0)*2.5deg)) rotateX(calc(var(--my,0)*-2.5deg)); box-shadow:var(--card-shadow), 0 0 28px var(--glow-soft); }
252
294
  .header-card,.overview{transition:transform .18s ease-out}
253
295
  .header-card:hover,.overview:hover{transform:perspective(900px) rotateY(calc(var(--mx,0)*2.5deg)) rotateX(calc(var(--my,0)*-2.5deg))}
254
296
  .section::before{
@@ -257,6 +299,20 @@ h1{
257
299
  .sec-done::before{ background:linear-gradient(180deg,#5eead4,#14b8a6); box-shadow:0 0 12px rgba(20,184,166,.3); }
258
300
  .sec-plan::before{ background:linear-gradient(180deg,#fdba74,#f97316); box-shadow:0 0 12px rgba(249,115,22,.3); }
259
301
  .sec-risk::before{ background:linear-gradient(180deg,#fda4af,#e11d48); box-shadow:0 0 12px rgba(225,29,72,.3); }
302
+ .sec-concl::before{ background:linear-gradient(180deg,#a78bfa,#6366f1); box-shadow:0 0 12px rgba(99,102,241,.3); }
303
+ .sec-concl .sec-head h2{ color:#a78bfa; animation-name:secGlowPurple; }
304
+ @keyframes secGlowPurple{
305
+ 0%,100%{ text-shadow:0 0 14px rgba(167,139,250,.45), 0 0 40px rgba(99,102,241,.18); }
306
+ 50%{ text-shadow:0 0 22px rgba(167,139,250,.75), 0 0 60px rgba(99,102,241,.3); }
307
+ }
308
+ .concl-list{ display:flex; flex-direction:column; gap:10px; }
309
+ .concl-row{ display:flex; align-items:flex-start; gap:10px; padding:10px 12px; border:1px solid var(--border); border-radius:6px; background:var(--scan-dim); transition:background .2s; }
310
+ .concl-row:hover{ background:var(--tag-bg); }
311
+ .concl-tag{ flex:0 0 auto; font-size:10px; font-weight:900; letter-spacing:1px; padding:3px 8px; border-radius:4px; border:1px solid rgba(167,139,250,.35); background:rgba(167,139,250,.08); color:#a78bfa; text-shadow:0 0 8px rgba(167,139,250,.5); white-space:nowrap; }
312
+ .concl-tag.t2{ border-color:rgba(253,186,116,.35); background:rgba(253,186,116,.08); color:#fdba74; text-shadow:0 0 8px rgba(253,186,116,.5); }
313
+ .concl-tag.t3{ border-color:rgba(94,234,212,.35); background:rgba(94,234,212,.08); color:#5eead4; text-shadow:0 0 8px rgba(94,234,212,.5); }
314
+ .concl-text{ font-size:13px; color:var(--text); line-height:1.7; }
315
+ .concl-sub{ margin-left:auto; font-size:10px; color:var(--muted); letter-spacing:1px; white-space:nowrap; }
260
316
  .sec-inner{ position:relative; z-index:1; padding:24px 24px 22px 32px; }
261
317
  .sec-head{ display:flex; align-items:center; gap:10px; margin-bottom:16px; }
262
318
  .sec-head svg{ width:18px; height:18px; flex:0 0 auto; }
@@ -281,17 +337,17 @@ h1{
281
337
  }
282
338
  .sec-date{
283
339
  margin-left:auto; flex:0 0 auto; font-size:11px; color:var(--muted); padding:3px 10px;
284
- border-radius:999px; border:1px solid rgba(14,165,233,.18); background:rgba(14,165,233,.05);
340
+ border-radius:999px; border:1px solid var(--border); background:var(--tag-bg);
285
341
  letter-spacing:1px;
286
342
  }
287
343
  ol{ list-style:none; padding:0 12px; }
288
344
  li{
289
345
  display:flex; align-items:flex-start; gap:10px; padding:10px;
290
- border-bottom:1px dashed rgba(14,165,233,.15); border-radius:4px;
346
+ border-bottom:1px dashed var(--border); border-radius:4px;
291
347
  transition:background .15s;
292
348
  }
293
349
  li:last-child{ border-bottom:none; }
294
- li:hover{ background:rgba(14,165,233,.06); }
350
+ li:hover{ background:var(--tag-bg); }
295
351
  .idx{
296
352
  flex:0 0 auto; width:28px; height:28px; border-radius:50%; position:relative;
297
353
  display:flex; align-items:center; justify-content:center; color:#fff;
@@ -324,13 +380,15 @@ li:hover .idx{ transform:scale(1.18) rotate(-4deg); font-size:14px; }
324
380
  .desc{ font-size:15px; line-height:1.65; color:var(--text); }
325
381
  .meta{ font-size:12px; color:var(--muted); margin-top:5px; }
326
382
  .meta .qt{ color:#7fa8cc; }
327
- .meta b{ color:var(--cyan); font-weight:900; margin:0 2px; text-shadow:0 0 8px rgba(14,165,233,.5); }
328
- .advice{ font-size:12px; color:var(--cyan); margin-top:6px; }
383
+ .meta b{ color:var(--accent); font-weight:900; margin:0 2px; text-shadow:0 0 8px var(--glow); }
384
+ .advice{ font-size:12px; color:var(--accent); margin-top:6px; }
385
+ .owner{ font-size:12px; color:#a78bfa; margin-top:4px; }
386
+ .owner b{ font-weight:900; }
329
387
  .advice b{ font-weight:900; }
330
388
  /* 进度条 */
331
389
  .pbar-track{
332
390
  position:relative; margin-top:9px; height:5px; border-radius:999px;
333
- background:rgba(14,165,233,.12);
391
+ background:var(--tag-bg);
334
392
  }
335
393
  .pbar-fill{
336
394
  display:block; position:relative; height:100%; border-radius:999px;
@@ -352,8 +410,10 @@ li:hover .idx{ transform:scale(1.18) rotate(-4deg); font-size:14px; }
352
410
  background:radial-gradient(circle at 35% 30%, #fed7aa, #fdba74 55%, #fb923c 100%);
353
411
  box-shadow:0 0 8px rgba(249,115,22,.7);
354
412
  }
355
- .pbar-track.sheen-on .pbar-fill::before{ animation:dotPulse 1.1s; }
356
- @keyframes dotPulse{ 90%{ filter:brightness(2) drop-shadow(0 0 6px #fff); } }
413
+ .pbar-done .pbar-track.sheen-on .pbar-fill::before{ animation:dotPulseDone 1.1s; }
414
+ .pbar-plan .pbar-track.sheen-on .pbar-fill::before{ animation:dotPulsePlan 1.1s; }
415
+ @keyframes dotPulseDone{ 90%{ filter:brightness(2) drop-shadow(0 0 6px rgba(45,212,191,.85)); } }
416
+ @keyframes dotPulsePlan{ 90%{ filter:brightness(2) drop-shadow(0 0 6px rgba(249,115,22,.85)); } }
357
417
  .pbar-sweep{
358
418
  position:absolute; left:0; top:50%; transform:translateY(-50%); height:16px; width:0;
359
419
  z-index:1; pointer-events:none; opacity:0;
@@ -365,15 +425,15 @@ li:hover .idx{ transform:scale(1.18) rotate(-4deg); font-size:14px; }
365
425
  content:''; position:absolute; inset:0; z-index:2;
366
426
  clip-path:polygon(0% 50%, 3% 36%, 10% 18%, 24% 4%, 42% 0%, 60% 1%, 78% 6%, 92% 17%, 99% 33%, 100% 50%, 99% 67%, 92% 83%, 78% 94%, 60% 99%, 42% 100%, 24% 96%, 10% 82%, 3% 64%);
367
427
  background:
368
- linear-gradient(90deg,rgba(186,230,253,.7),rgba(224,254,255,.95) 30%,#fff 46%,rgba(244,255,255,1) 58%,rgba(224,254,255,.9) 72%,rgba(186,230,253,.65)),
369
- radial-gradient(circle 2px at 40% 50%,#fff,rgba(224,254,255,.92) 55%,rgba(125,211,252,.4) 85%,transparent);
370
- filter:drop-shadow(0 0 2px rgba(186,230,253,.7)) drop-shadow(0 0 5px rgba(45,212,191,.25));
428
+ linear-gradient(90deg,var(--cp-a),var(--cp-b) 30%,var(--cp-tip) 46%,var(--cp-tip) 58%,var(--cp-b) 72%,var(--cp-a)),
429
+ radial-gradient(circle 2px at 40% 50%,var(--cp-tip),var(--cp-b) 55%,var(--cp-a) 85%,transparent);
430
+ filter:var(--cm-f0);
371
431
  }
372
432
 
373
433
  .pbar-comet::after{
374
434
  content:'';position:absolute;right:40%;top:50%;width:68px; height:10px;
375
435
  transform:translateY(-50%);
376
- background:linear-gradient(90deg,rgba(45,212,191,0),rgba(45,212,191,.4) 15%,rgba(125,211,252,.8) 35%,rgba(224,254,255,.95) 55%,rgba(242,255,255,1) 75%,#fff 100%);
436
+ background:linear-gradient(90deg,transparent,var(--cp-b) 25%,var(--cp-tip) 60%,var(--cp-tip) 100%);
377
437
  clip-path:polygon(0 50%, 10% 30%, 100% 0, 100% 100%, 10% 70%);
378
438
  mask-image:linear-gradient(90deg, transparent 0%, #000 20%, #000 100%);
379
439
  -webkit-mask-image:linear-gradient(90deg, transparent 0%, #000 20%, #000 100%);
@@ -383,48 +443,52 @@ li:hover .idx{ transform:scale(1.18) rotate(-4deg); font-size:14px; }
383
443
  /* 流星剥落粒子:从光核中后部诞生、0~8% 快速渐显、沿水平线加速后飘、渐小渐隐(椭圆各异不规则、明灭发光,与主体 2.4s 呼吸不同频) */
384
444
  .pbar-comet .cp-deep{ animation:cpFlowDeep 1.4s linear infinite; }
385
445
  @keyframes cpFlowDeep{
386
- 0%{ opacity:0; transform:translate3d(0,0,0) scale(.3) rotate(var(--r,0deg)); box-shadow:0 0 6px 2.5px rgba(56,189,248,.9); }
446
+ 0%{ opacity:0; transform:translate3d(0,0,0) scale(.3) rotate(var(--r,0deg)); box-shadow:var(--cpd-glow0); }
387
447
  8%{ opacity:1; transform:translate3d(calc(var(--dx,-60px)*.01), calc(var(--dy,0)*.01), 0) scale(1) rotate(var(--r,0deg)); }
388
448
  35%{ transform:translate3d(calc(var(--dx,-60px)*.08), calc(var(--dy,0)*.30), 0) scale(.78) rotate(var(--r,0deg)); }
389
- 55%{ opacity:.85; transform:translate3d(calc(var(--dx,-60px)*.38), calc(var(--dy,0)*.10), 0) scale(.4) rotate(var(--r,0deg)); box-shadow:0 0 8px 3px rgba(56,189,248,1); }
390
- 100%{ opacity:0; transform:translate3d(var(--dx,-60px), calc(var(--dy,0)*.05), 0) scale(.06) rotate(var(--r,0deg)); box-shadow:0 0 1px 0 rgba(56,189,248,0); }
449
+ 55%{ opacity:.85; transform:translate3d(calc(var(--dx,-60px)*.38), calc(var(--dy,0)*.10), 0) scale(.4) rotate(var(--r,0deg)); box-shadow:var(--cpd-glow1); }
450
+ 100%{ opacity:0; transform:translate3d(var(--dx,-60px), calc(var(--dy,0)*.05), 0) scale(.06) rotate(var(--r,0deg)); box-shadow:0 0 1px 0 transparent; }
391
451
  }
392
452
  .cp{
393
453
  position:absolute; border-radius:50%; opacity:0; z-index:1; pointer-events:none;
394
- background:linear-gradient(90deg, rgba(125,211,252,.18), rgba(224,242,254,.9) 45%, #fff 86%);
395
- box-shadow:0 0 5px 2px rgba(125,211,252,.7);
454
+ background:linear-gradient(90deg, var(--cp-a), var(--cp-b) 45%, var(--cp-tip) 86%);
455
+ box-shadow:var(--cp-glow0);
396
456
  animation:cpFlow 1.4s linear infinite;
397
457
  }
458
+ .cp-deep{ /* 全白发光带 7 粒:与浅带同为白色系,光晕略强分层,跨主题统一 */
459
+ background:linear-gradient(90deg, var(--cpd-a), var(--cpd-b) 45%, var(--cpd-tip) 86%);
460
+ box-shadow:var(--cpd-glow0);
461
+ }
398
462
  @keyframes cpFlow{
399
- 0%{ opacity:0; transform:translate3d(0,0,0) scale(.3) rotate(var(--r,0deg)); box-shadow:0 0 5px 2px rgba(125,211,252,.7); }
463
+ 0%{ opacity:0; transform:translate3d(0,0,0) scale(.3) rotate(var(--r,0deg)); box-shadow:var(--cp-glow0); }
400
464
  8%{ opacity:1; transform:translate3d(calc(var(--dx,-60px)*.01), calc(var(--dy,0)*.01), 0) scale(1) rotate(var(--r,0deg)); }
401
465
  35%{ transform:translate3d(calc(var(--dx,-60px)*.08), calc(var(--dy,0)*.30), 0) scale(.78) rotate(var(--r,0deg)); }
402
- 52%{ opacity:.7; transform:translate3d(calc(var(--dx,-60px)*.35), calc(var(--dy,0)*.12), 0) scale(.4) rotate(var(--r,0deg)); box-shadow:0 0 7px 2.5px rgba(125,211,252,.95); }
403
- 100%{ opacity:0; transform:translate3d(var(--dx,-60px), calc(var(--dy,0)*.05), 0) scale(.06) rotate(var(--r,0deg)); box-shadow:0 0 1px 0 rgba(186,230,253,0); }
466
+ 52%{ opacity:.7; transform:translate3d(calc(var(--dx,-60px)*.35), calc(var(--dy,0)*.12), 0) scale(.4) rotate(var(--r,0deg)); box-shadow:var(--cp-glow1); }
467
+ 100%{ opacity:0; transform:translate3d(var(--dx,-60px), calc(var(--dy,0)*.05), 0) scale(.06) rotate(var(--r,0deg)); box-shadow:0 0 1px 0 transparent; }
404
468
  }
405
469
 
406
470
 
407
471
  @keyframes glowPulse{
408
- 0%,100%{filter:drop-shadow(0 0 2px rgba(186,230,253,.7)) drop-shadow(0 0 5px rgba(45,212,191,.25));}
409
- 50%{filter:drop-shadow(0 0 4px rgba(186,230,253,.95)) drop-shadow(0 0 8px rgba(45,212,191,.45));}
472
+ 0%,100%{filter:var(--cm-f0);}
473
+ 50%{filter:var(--cm-f1);}
410
474
  }
411
475
  @keyframes tailGlow{
412
476
  0%,100%{filter:blur(1px) brightness(1);}
413
477
  50%{filter:blur(1.5px) brightness(1.28);}
414
478
  }
415
479
  .pbar-track.sheen-on .pbar-sweep{ opacity:1; transition:width 1.1s cubic-bezier(.3,.8,.4,1); }
416
- .pbar-track.sheen-on .pbar-comet{ animation:cometFade 1.1s; }
480
+ .pbar-track.sheen-on .pbar-comet{ animation:cometFade 1.1s ease-out both; }
417
481
  .pbar-track.sheen-on .pbar-comet::after{ animation:tailGlow 2.4s ease-in-out infinite; }
418
- .pbar-track.sheen-on .pbar-comet::before{ animation:glowPulse 2.4s ease-in-out infinite; }
482
+ .pbar-track.sheen-on .pbar-comet::before{ animation:glowPulse 1.8s ease-in-out infinite; }
419
483
  @keyframes cometFade{ 0%{opacity:0;} 7%{opacity:1;} 86%{opacity:1;} 100%{opacity:0;} }
420
484
  /* 暂无 */
421
485
  .empty{
422
486
  font-size:14px; color:var(--muted); padding:16px 12px; letter-spacing:1px;
423
- border:1px dashed rgba(14,165,233,.15); border-radius:6px; text-align:center;
487
+ border:1px dashed var(--border); border-radius:6px; text-align:center;
424
488
  }
425
489
  /* 液态玻璃 */
426
490
  @supports((backdrop-filter:blur(1px)) or (-webkit-backdrop-filter:blur(1px))){
427
- .overview, .section{ backdrop-filter:blur(16px) saturate(1.35); background-color:rgba(11,30,55,.42); }
491
+ .overview, .section{ backdrop-filter:blur(16px) saturate(1.35); background-color:var(--panel); }
428
492
  }
429
493
  /* 入场 */
430
494
  .header-card{ animation:fadeDown .5s ease-out backwards; }
@@ -439,6 +503,26 @@ li:hover .idx{ transform:scale(1.18) rotate(-4deg); font-size:14px; }
439
503
  text-align:center; font-size:10px; color:var(--muted); letter-spacing:1.5px;
440
504
  padding:6px 0 2px; position:relative; z-index:1;
441
505
  }
506
+
507
+ /* 主题换肤坞:右下角四色点随点随换,记忆上次选择;打印与截图模式隐藏 */
508
+ .theme-dock{
509
+ position:fixed; right:18px; bottom:18px; z-index:1001;
510
+ display:flex; gap:8px; padding:8px 10px; border-radius:999px;
511
+ background:var(--panel-solid); border:1px solid var(--border);
512
+ box-shadow:0 4px 18px rgba(0,0,0,.3);
513
+ }
514
+ .theme-dock .th-dot{
515
+ width:22px; height:22px; border-radius:50%; cursor:pointer;
516
+ border:2px solid transparent; padding:0;
517
+ transition:transform .15s ease, border-color .15s ease;
518
+ }
519
+ .theme-dock .th-dot:hover{ transform:scale(1.18); }
520
+ .theme-dock .th-dot.on{ border-color:var(--text); }
521
+ .theme-dock .th-dot[data-theme="tech"]{ background:#0ea5e9; }
522
+ .theme-dock .th-dot[data-theme="biz"]{ background:#2563eb; }
523
+ .theme-dock .th-dot[data-theme="mono"]{ background:#111; }
524
+ .theme-dock .th-dot[data-theme="warm"]{ background:#d97706; }
525
+ @media print{ .theme-dock{ display:none; } }
442
526
  </style>
443
527
  </head>
444
528
  <body>
@@ -476,6 +560,23 @@ li:hover .idx{ transform:scale(1.18) rotate(-4deg); font-size:14px; }
476
560
  </div>
477
561
  </div>
478
562
 
563
+ <!-- 本周结论 -->
564
+ <div class="section sec-concl" id="conclCard">
565
+ <div class="card-glow"></div>
566
+ <div class="sec-inner">
567
+ <div class="sec-head">
568
+ <svg viewBox="0 0 18 18" fill="none"><defs><linearGradient id="conclGrad" x1="0" y1="0" x2="1" y2="1"><stop offset="0" stop-color="#a78bfa"/><stop offset="1" stop-color="#6366f1"/></linearGradient></defs><circle cx="9" cy="9" r="6.4" stroke="url(#conclGrad)" stroke-width="1.5"/><circle cx="9" cy="9" r="2.4" fill="url(#conclGrad)"/><path d="M9 1.2v2.6M9 14.2v2.6M1.2 9h2.6M14.2 9h2.6" stroke="url(#conclGrad)" stroke-width="1.3" stroke-linecap="round"/></svg>
569
+ <h2>本周结论</h2>
570
+ <span class="concl-sub">判断优先 · 先结论后流水</span>
571
+ </div>
572
+ <div class="concl-list">
573
+ <div class="concl-row"><span class="concl-tag">最重要的结果</span><span class="concl-text">八项功能全部交付并随 v1.2.2 收口,底部导航顽疾两轮修复后根治。</span></div>
574
+ <div class="concl-row"><span class="concl-tag t2">值得处理的变化</span><span class="concl-text">多端并行交付节奏加速,但需求拆解粒度偏粗,联调集中在周三单日完成。</span></div>
575
+ <div class="concl-row"><span class="concl-tag t3">下周优先的动作</span><span class="concl-text">聚焦配送链路打磨与直播体验优化,联调前移、避免单日集中交付。</span></div>
576
+ </div>
577
+ </div>
578
+ </div>
579
+
479
580
  <!-- 本周概览 -->
480
581
  <div class="overview" id="overviewCard">
481
582
  <div class="card-glow"></div>
@@ -486,8 +587,8 @@ li:hover .idx{ transform:scale(1.18) rotate(-4deg); font-size:14px; }
486
587
  <svg width="88" height="88" viewBox="0 0 88 88">
487
588
  <defs>
488
589
  <linearGradient id="ringGrad" x1="0%" y1="0%" x2="100%" y2="100%">
489
- <stop offset="0%" stop-color="#38bdf8"/>
490
- <stop offset="100%" stop-color="#0ea5e9"/>
590
+ <stop offset="0%" stop-color="var(--accent2)"/>
591
+ <stop offset="100%" stop-color="var(--accent)"/>
491
592
  </linearGradient>
492
593
  </defs>
493
594
  <circle class="track" cx="44" cy="44" r="36"/>
@@ -706,9 +807,17 @@ li:hover .idx{ transform:scale(1.18) rotate(-4deg); font-size:14px; }
706
807
  <div class="footer">GENERATED BY SPECCORE TEAM · 20261102 ~ 20261106</div>
707
808
  </div>
708
809
 
810
+ <!-- 主题换肤坞(四色点) -->
811
+ <div class="theme-dock" id="themeDock">
812
+ <button class="th-dot" type="button" data-theme="tech" title="深蓝科技"></button>
813
+ <button class="th-dot" type="button" data-theme="biz" title="浅色商务"></button>
814
+ <button class="th-dot" type="button" data-theme="mono" title="极简黑白"></button>
815
+ <button class="th-dot" type="button" data-theme="warm" title="温暖渐变"></button>
816
+ </div>
817
+
709
818
  <script>
710
819
  // 复制纯文本
711
- var TXT = "本周周报 - 20261102 ~ 20261106\n\n生成时间:2026-11-06 14:57:02\n\nTL;DR:本周 11 次提交覆盖客户端/服务端/网关三端,周三单日 8 次提交集中交付直播、礼物、登录、互动等多线功能;底部导航两轮修复后随 v1.2.2 收口。整体节奏紧凑、无阻塞风险,下周可聚焦配送链路打磨与直播体验优化。\n\n本周任务进度\n1、完成底部导航仿参考图重绘:白栏穹顶拱形与发布按钮凸出,两轮修复根治白条与三角缺口,并发布 v1.2.2(3 次提交、23 文件、+1741/-178 行)- 进度100% - 用时约1.5D\n2、完成订单配送能力深化:客户端配送费预估与骑手状态展示,服务端 DISPATCHING 状态机与骑手通道抽象(2 次提交、15 文件、+507/-35 行)- 进度100% - 用时约1.5D\n3、完成对外号正名为产品级主账号邻音号,我的页/账号中心/联系人/群聊全面去内部术语(1 次提交、4 文件、+25/-25 行)- 进度100% - 用时约0.5D\n4、完成萤火虚拟币礼物体系:钱包/充值/16 款四档礼物/原子扣款与 43001 拦截、WS 房间广播、模拟观众自动送礼(1 次提交、22 文件、+1246/-3 行)- 进度100% - 用时约1D\n5、完成帖子互动闭环与媒体上传:评论/点赞/收藏/分享四实体与互动快照、30MB 短视频上传接口(1 次提交、22 文件、+1311/-31 行)- 进度100% - 用时约1D\n6、完成登录安全加固与三方登录:短信验证码(回显+限流+签名)、微信/支付宝绑定、换绑手机号、APK 版本门禁(1 次提交、42 文件、+1792/-87 行)- 进度100% - 用时约1.5D\n7、完成网关 V2 二进制帧协议升级:Protobuf 上下行帧、JWT 握手鉴权与 HMAC 签名、房间索引、wsprobe 冒烟探针(1 次提交、10 文件、+1552/-59 行)- 进度100% - 用时约1D\n8、完成多线功能收束:直播推流与观众端、验证码/三方登录页、短视频录制播放、收藏互动、更新自检、SSL pinning(1 次提交、72 文件、+11.1k/-2.1k 行)- 进度100% - 用时约2D\n\n下周计划\n暂无\n\n风险阻塞点\n暂无";
820
+ var TXT = "本周周报 - 20261102 ~ 20261106\n\n生成时间:2026-11-06 14:57:02\n\nTL;DR:本周 11 次提交覆盖客户端/服务端/网关三端,周三单日 8 次提交集中交付直播、礼物、登录、互动等多线功能;底部导航两轮修复后随 v1.2.2 收口。整体节奏紧凑、无阻塞风险,下周可聚焦配送链路打磨与直播体验优化。\n\n本周结论\n1、最重要的结果:八项功能全部交付并随 v1.2.2 收口,底部导航顽疾两轮修复后根治\n2、值得处理的变化:多端并行交付节奏加速,需求拆解粒度偏粗、联调集中在周三单日\n3、下周优先的动作:聚焦配送链路打磨与直播体验优化,联调前移、避免单日集中交付\n\n本周任务进度\n1、完成底部导航仿参考图重绘:白栏穹顶拱形与发布按钮凸出,两轮修复根治白条与三角缺口,并发布 v1.2.2(3 次提交、23 文件、+1741/-178 行)- 进度100% - 用时约1.5D\n2、完成订单配送能力深化:客户端配送费预估与骑手状态展示,服务端 DISPATCHING 状态机与骑手通道抽象(2 次提交、15 文件、+507/-35 行)- 进度100% - 用时约1.5D\n3、完成对外号正名为产品级主账号邻音号,我的页/账号中心/联系人/群聊全面去内部术语(1 次提交、4 文件、+25/-25 行)- 进度100% - 用时约0.5D\n4、完成萤火虚拟币礼物体系:钱包/充值/16 款四档礼物/原子扣款与 43001 拦截、WS 房间广播、模拟观众自动送礼(1 次提交、22 文件、+1246/-3 行)- 进度100% - 用时约1D\n5、完成帖子互动闭环与媒体上传:评论/点赞/收藏/分享四实体与互动快照、30MB 短视频上传接口(1 次提交、22 文件、+1311/-31 行)- 进度100% - 用时约1D\n6、完成登录安全加固与三方登录:短信验证码(回显+限流+签名)、微信/支付宝绑定、换绑手机号、APK 版本门禁(1 次提交、42 文件、+1792/-87 行)- 进度100% - 用时约1.5D\n7、完成网关 V2 二进制帧协议升级:Protobuf 上下行帧、JWT 握手鉴权与 HMAC 签名、房间索引、wsprobe 冒烟探针(1 次提交、10 文件、+1552/-59 行)- 进度100% - 用时约1D\n8、完成多线功能收束:直播推流与观众端、验证码/三方登录页、短视频录制播放、收藏互动、更新自检、SSL pinning(1 次提交、72 文件、+11.1k/-2.1k 行)- 进度100% - 用时约2D\n\n下周计划\n暂无\n\n风险阻塞点\n暂无";
712
821
  (function(){
713
822
  var btn = document.getElementById('copyBtn');
714
823
  btn.addEventListener('click', function(){
@@ -732,10 +841,10 @@ var TXT = "本周周报 - 20261102 ~ 20261106\n\n生成时间:2026-11-06 14:57
732
841
  })();
733
842
 
734
843
  // 进度条流星
735
- /* 流星剥落粒子:JS 为每颗彗星注入 22 粒椭圆小块(从头部稍后诞生 → 加速后飘 → 渐小渐隐,y 向中心水平线收敛) */
844
+ /* 流星剥落粒子:JS 为每颗彗星注入 30 粒椭圆小块(从头部稍后诞生 → 加速后飘 → 渐小渐隐,y 向中心水平线收敛) */
736
845
  (function(){
737
846
  var CP = [
738
- // [bx, by, w, h, r, delay, dur, dx, dy] —— 30 粒前大后小剥落:bx 2~8 于光核中后部诞生(不贴尖头)、by -6~+9.5 上下连续散布、0~8% 快速渐显(scale .3→1 绽放淡入);dy 适中(上 -3.5~-7 / 中 +1.5~+3.5 / 深蓝 +5~+7)向后飞行中适度上下展开并向中线收敛(既非贴中线亦非过度发散);dx -72~-112 终点越过彗尾左端(用户要求比彗星尾部更远)
847
+ // [bx, by, w, h, r, delay, dur, dx, dy] —— 30 粒前大后小剥落:bx 2~8 于光核中后部诞生(不贴尖头)、by -6~+9.5 上下连续散布、0~8% 快速渐显(scale .3→1 绽放淡入);dy 适中(上 -3.5~-7 / 中 +1.5~+3.5 / 深色带 +5~+7)向后飞行中适度上下展开并向中线收敛(既非贴中线亦非过度发散);dx -72~-112 终点越过彗尾左端(用户要求比彗星尾部更远)
739
848
  // 上方飘散带 17 粒(by -6~-0.5,向上飘散,dy -3.5~-7 上飘展开——用户反馈上方粒子少且飘散不够远,13→17 再加密、dy 再扩大,下方相对合适不增)
740
849
  [ 7, -6.0, 5.2, 3.7, 6, -0.05, 1.08, -72, -7.0],
741
850
  [ 5, -5.8, 4.0, 2.9, -8, -0.10, 1.01, -76, -6.8],
@@ -759,16 +868,16 @@ var TXT = "本周周报 - 20261102 ~ 20261106\n\n生成时间:2026-11-06 14:57
759
868
  [ 6, 2.2, 4.0, 2.9, 6, -0.95, 0.96, -86, 2.2],
760
869
  [ 3, 3.6, 3.4, 2.4, 12, -0.10, 0.94, -82, 2.8],
761
870
  [ 7, 4.8, 2.8, 2.0, -5, -0.35, 0.92, -92, 3.2],
762
- [ 5, 5.6, 2.2, 1.6, 9, -0.50, 0.90, -94, 3.5],
871
+ [ 5, 5.2, 2.2, 1.6, 9, -0.50, 0.90, -94, 3.5],
763
872
  [ 8, 1.2, 2.0, 1.4, -7, -0.60, 0.92, -90, 1.5],
764
- // 深蓝带 7 粒(by +7~+9.5=光核下缘下 1~3.5px 贴缘出生,dy +5~+7 向后甩出下散展开,cp-deep 深蓝渐变+深蓝光晕,dur 1.06~1.25s 更久停留)
765
- [ 6, 7.0, 5.0, 3.6, -8, -0.15, 1.20, -90, 5.5],
766
- [ 3, 8.0, 4.4, 3.2, 6, -0.45, 1.25, -98, 6.2],
767
- [ 7, 9.0, 3.8, 2.7, 12, -0.70, 1.12, -94, 5.6],
768
- [ 4, 9.5, 3.3, 2.4, -5, -0.05, 1.18, -106, 6.8],
769
- [ 6, 7.8, 2.9, 2.1, 9, -0.25, 1.08, -102, 6.5],
770
- [ 3, 8.8, 2.5, 1.8, -10, -0.55, 1.10, -110, 6.8],
771
- [ 8, 7.4, 2.1, 1.5, 7, -0.80, 1.06, -112, 5.0]
873
+ // 深色带 7 粒(by +5.5~+8=光核下缘外 0.5~3px 贴缘出生(与上方贴缘距离一致),dy +5~+7 向后甩出下散展开,cp-deep 主题同色渐变+同色光晕(随 html[data-theme] 四令牌换色,白热尖端不变),dur 1.06~1.25s 更久停留)
874
+ [ 6, 5.5, 5.0, 3.6, -8, -0.15, 1.20, -90, 5.5],
875
+ [ 3, 6.5, 4.4, 3.2, 6, -0.45, 1.25, -98, 6.2],
876
+ [ 7, 7.5, 3.8, 2.7, 12, -0.70, 1.12, -94, 5.6],
877
+ [ 4, 8.0, 3.3, 2.4, -5, -0.05, 1.18, -106, 6.8],
878
+ [ 6, 6.3, 2.9, 2.1, 9, -0.25, 1.08, -102, 6.5],
879
+ [ 3, 7.3, 2.5, 1.8, -10, -0.55, 1.10, -110, 6.8],
880
+ [ 8, 5.9, 2.1, 1.5, 7, -0.80, 1.06, -112, 5.0]
772
881
  ];
773
882
  document.querySelectorAll('.pbar-comet').forEach(function(comet){
774
883
  for (var i = 0; i < CP.length; i++){
@@ -784,11 +893,7 @@ var TXT = "本周周报 - 20261102 ~ 20261106\n\n生成时间:2026-11-06 14:57
784
893
  p.style.animationDuration = c[6] + 's';
785
894
  p.style.setProperty('--dx', c[7] + 'px');
786
895
  p.style.setProperty('--dy', c[8] + 'px');
787
- if (c[1] >= 7){
788
- p.className = 'cp cp-deep';
789
- p.style.background = 'linear-gradient(90deg, rgba(2,132,199,.4), rgba(56,189,248,.95) 45%, #e0f2fe 86%)';
790
- p.style.boxShadow = '0 0 6px 2.5px rgba(56,189,248,.9)';
791
- }
896
+ if (c[1] >= 5.5) p.className = 'cp cp-deep'; // 深色带配色由 .cp-deep 类承接(四主题令牌驱动,勿内联写死)
792
897
  comet.appendChild(p);
793
898
  }
794
899
  });
@@ -861,6 +966,23 @@ function sheen(track, src){
861
966
  document.body.style.padding = '40px';
862
967
  }
863
968
  })();
969
+
970
+ // 主题换肤:四套配色随点随换;记忆上次选择(localStorage,失败静默);?shot 截图模式隐藏坞
971
+ (function(){
972
+ var THEMES = ['tech','biz','mono','warm'];
973
+ var dock = document.getElementById('themeDock');
974
+ if (!dock) return;
975
+ if (location.search.indexOf('shot=') !== -1){ dock.style.display = 'none'; }
976
+ function apply(t){ document.documentElement.setAttribute('data-theme', t);
977
+ dock.querySelectorAll('.th-dot').forEach(function(d){ d.classList.toggle('on', d.getAttribute('data-theme') === t); });
978
+ try{ localStorage.setItem('sf-report-theme', t); }catch(e){} }
979
+ var cur = document.documentElement.getAttribute('data-theme');
980
+ var saved = null; try{ saved = localStorage.getItem('sf-report-theme'); }catch(e){}
981
+ if (saved && THEMES.indexOf(saved) !== -1 && saved !== cur){ apply(saved); }
982
+ else{ dock.querySelectorAll('.th-dot').forEach(function(d){ d.classList.toggle('on', d.getAttribute('data-theme') === (cur || 'tech')); }); }
983
+ dock.querySelectorAll('.th-dot').forEach(function(d){ d.addEventListener('click', function(){ apply(d.getAttribute('data-theme')); }); });
984
+ })();
985
+
864
986
  </script>
865
987
  </body>
866
988
  </html>