skill-forge-hub 0.2.0 → 0.4.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 (42) hide show
  1. package/README.md +28 -6
  2. package/annual-report/SKILL.md +24 -9
  3. package/annual-report/resources/content-rules.md +11 -9
  4. package/annual-report/resources/data-collection.md +3 -3
  5. package/annual-report/resources/date-parsing.md +1 -1
  6. package/annual-report/resources/disk-and-html.md +8 -6
  7. package/annual-report/resources/industry-dictionary.md +3 -1
  8. package/annual-report/resources/reference.html +360 -0
  9. package/annual-report/resources/usage-guide.md +56 -15
  10. package/annual-report/user-config.md +4 -1
  11. package/cli.js +176 -36
  12. package/daily-report/SKILL.md +24 -8
  13. package/daily-report/resources/content-rules.md +34 -30
  14. package/daily-report/resources/data-collection.md +5 -5
  15. package/daily-report/resources/date-parsing.md +1 -1
  16. package/daily-report/resources/disk-and-html.md +4 -2
  17. package/daily-report/resources/industry-dictionary.md +3 -1
  18. package/daily-report/resources/reference.html +617 -0
  19. package/daily-report/resources/usage-guide.md +14 -14
  20. package/daily-report/user-config.md +6 -3
  21. package/magic-deck/SKILL.md +52 -0
  22. package/magic-deck/resources/deck-spec.md +259 -0
  23. package/magic-deck/resources/reference.html +973 -0
  24. package/magic-deck/user-config.md +37 -0
  25. package/meta-forge/SKILL.md +46 -0
  26. package/meta-forge/resources/forge-rules.md +74 -0
  27. package/meta-forge/resources/usage-guide.md +41 -0
  28. package/meta-forge/user-config.md +19 -0
  29. package/package.json +3 -1
  30. package/spec-doc2spec/SKILL.md +17 -8
  31. package/spec-doc2spec/user-config.md +22 -0
  32. package/spec-spec2doc/SKILL.md +17 -8
  33. package/spec-spec2doc/user-config.md +22 -0
  34. package/weekly-report/SKILL.md +24 -8
  35. package/weekly-report/resources/content-rules.md +43 -32
  36. package/weekly-report/resources/data-collection.md +5 -5
  37. package/weekly-report/resources/date-parsing.md +1 -1
  38. package/weekly-report/resources/disk-and-html.md +4 -2
  39. package/weekly-report/resources/industry-dictionary.md +5 -3
  40. package/weekly-report/resources/reference.html +899 -0
  41. package/weekly-report/resources/usage-guide.md +15 -15
  42. package/weekly-report/user-config.md +6 -3
@@ -0,0 +1,617 @@
1
+ <!DOCTYPE html>
2
+ <html lang="zh-CN">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>今日日报 - 20261106</title>
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
+ }
13
+ *{margin:0;padding:0;box-sizing:border-box;}
14
+ html,body{background:var(--bg);}
15
+ body{
16
+ font-family:ui-monospace,'SF Mono',SFMono-Regular,Menlo,Consolas,'Microsoft YaHei',monospace;
17
+ color:var(--text); font-weight:400; padding:40px 20px 40px;
18
+ perspective:900px; min-height:100vh; position:relative; overflow-x:hidden;
19
+ }
20
+ body::before{
21
+ content:''; position:fixed; inset:0; z-index:0; pointer-events:none; opacity:.04;
22
+ background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='240' height='240'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
23
+ }
24
+ .grid-pattern{
25
+ position:fixed; inset:0; z-index:0; pointer-events:none;
26
+ background-image:linear-gradient(rgba(0,240,255,.03) 1px, transparent 1px),linear-gradient(90deg, rgba(0,240,255,.03) 1px, transparent 1px);
27
+ background-size:60px 60px;
28
+ }
29
+ .stars{
30
+ position:fixed; inset:0; z-index:0; pointer-events:none;
31
+ background-image:
32
+ radial-gradient(1px 1px at 12% 18%, rgba(255,255,255,.38), transparent),
33
+ radial-gradient(1px 1px at 28% 64%, rgba(0,240,255,.48), transparent),
34
+ radial-gradient(1.5px 1.5px at 41% 32%, rgba(255,255,255,.3), transparent),
35
+ radial-gradient(1px 1px at 56% 78%, rgba(168,85,247,.4), transparent),
36
+ radial-gradient(1px 1px at 67% 12%, rgba(0,255,136,.4), transparent),
37
+ radial-gradient(1.5px 1.5px at 79% 52%, rgba(0,240,255,.45), transparent),
38
+ radial-gradient(1px 1px at 88% 86%, rgba(255,255,255,.34), transparent),
39
+ radial-gradient(1px 1px at 93% 24%, rgba(0,240,255,.5), transparent);
40
+ }
41
+ .scanlines{
42
+ position:fixed; inset:0; z-index:999; pointer-events:none;
43
+ background:repeating-linear-gradient(0deg, transparent 0 2px, rgba(0,240,255,.015) 2px 4px);
44
+ }
45
+ .scanband{
46
+ position:fixed; left:0; right:0; height:150px; z-index:998; pointer-events:none;
47
+ background:linear-gradient(180deg, transparent, rgba(0,240,255,.03) 50%, transparent);
48
+ animation:scanMove 11s linear infinite;
49
+ }
50
+ @keyframes scanMove{ from{top:-22%;} to{top:112%;} }
51
+ .wrap{
52
+ width:clamp(640px, 60%, 1200px); margin:0 auto; position:relative; z-index:1;
53
+ }
54
+ .header-card{
55
+ position:relative; background:var(--card);
56
+ background-image:repeating-linear-gradient(180deg, rgba(255,255,255,.012) 0 1px, transparent 1px 8px);
57
+ border-top:1px solid var(--glow); border-bottom:1px solid var(--glow);
58
+ border-radius:6px; padding:38px 36px 26px; text-align:center; overflow:hidden;
59
+ box-shadow:0 0 20px rgba(14,165,233,.08), inset 0 1px 24px rgba(14,165,233,.04);
60
+ margin-bottom:18px;
61
+ }
62
+ .card-glow{
63
+ position:absolute; inset:0; pointer-events:none; transform-origin:top center;
64
+ background:radial-gradient(ellipse at 50% 10%, rgba(14,165,233,.25), transparent 70%);
65
+ opacity:.5; animation:cardGlow 3s ease-in-out infinite;
66
+ }
67
+ @keyframes cardGlow{ 0%,100%{opacity:.5; transform:scale(1);} 50%{opacity:1; transform:scale(1.6);} }
68
+ .scanline-el{ position:absolute; pointer-events:none; z-index:3; }
69
+ .scan-x{ left:0; right:0; height:1px; background:linear-gradient(90deg, transparent, var(--cyan), transparent); }
70
+ .scan-y{ top:0; bottom:0; width:1px; background:linear-gradient(180deg, transparent, var(--cyan), transparent); }
71
+ .scan-top{ top:0; animation:scanX 3s linear infinite; }
72
+ .scan-right{ right:0; animation:scanY 3s linear infinite; }
73
+ .scan-bottom{ bottom:0; animation:scanXrev 3s linear infinite; }
74
+ .scan-left{ left:0; animation:scanYrev 3s linear infinite; }
75
+ @keyframes scanX{ from{transform:translateX(-100%);} to{transform:translateX(100%);} }
76
+ @keyframes scanXrev{ from{transform:translateX(100%);} to{transform:translateX(-100%);} }
77
+ @keyframes scanY{ from{transform:translateY(-100%);} to{transform:translateY(100%);} }
78
+ @keyframes scanYrev{ from{transform:translateY(100%);} to{transform:translateY(-100%);} }
79
+ h1{
80
+ position:relative; z-index:2; font-size:30px; font-weight:900; letter-spacing:1px;
81
+ background:linear-gradient(90deg, var(--cyan), var(--purple));
82
+ -webkit-background-clip:text; background-clip:text; -webkit-text-fill-color:transparent;
83
+ text-shadow:0 0 20px rgba(14,165,233,.4), 0 0 60px rgba(14,165,233,.15);
84
+ animation:titleGlow 3s ease-in-out infinite;
85
+ }
86
+ @keyframes titleGlow{
87
+ 0%,100%{ filter:drop-shadow(0 0 20px rgba(14,165,233,.4)) drop-shadow(0 0 60px rgba(14,165,233,.15)); }
88
+ 50%{ filter:drop-shadow(0 0 30px rgba(14,165,233,.7)) drop-shadow(0 0 80px rgba(14,165,233,.3)); }
89
+ }
90
+ .header-sub{ position:relative; z-index:2; font-size:13px; color:var(--muted); margin-top:10px; letter-spacing:2px; }
91
+ .header-badge{
92
+ position:relative; z-index:2; display:inline-block; margin-top:12px; font-size:11px; color:var(--cyan);
93
+ border:1px solid rgba(14,165,233,.35); border-radius:999px; padding:3px 12px;
94
+ background:rgba(14,165,233,.07); text-shadow:0 0 6px rgba(14,165,233,.6); letter-spacing:1px;
95
+ }
96
+ .summary-line{
97
+ position:relative; z-index:2; display:flex; gap:10px; max-width:540px; margin:18px auto 0;
98
+ align-items:flex-start;
99
+ }
100
+ .summary-tag{
101
+ flex:0 0 auto; font-size:10px; font-weight:700; color:var(--cyan); letter-spacing:1px;
102
+ border:1px solid rgba(14,165,233,.35); border-radius:4px; padding:2px 6px;
103
+ background:rgba(14,165,233,.07); text-shadow:0 0 6px rgba(14,165,233,.6); margin-top:2px;
104
+ }
105
+ .summary-text{ font-size:12.5px; color:var(--text); line-height:1.75; text-align:left; }
106
+ .copy-wrap{ position:relative; z-index:2; margin-top:20px; display:flex; justify-content:center; }
107
+ .copy-btn{
108
+ display:flex; align-items:center; gap:8px; cursor:pointer; border:none; border-radius:999px;
109
+ padding:10px 28px; font-family:inherit; font-size:14px; color:#fff; letter-spacing:1px;
110
+ background:linear-gradient(90deg, var(--cyan), #0284c7);
111
+ box-shadow:0 0 30px rgba(14,165,233,.4); transition:box-shadow .25s, transform .15s;
112
+ }
113
+ .copy-btn:hover{ box-shadow:0 0 45px rgba(14,165,233,.6); transform:translateY(-1px); }
114
+ .copy-btn:active{ transform:scale(.97); }
115
+ .copy-btn svg{ width:16px; height:16px; flex:0 0 auto; }
116
+ .copy-btn .check{ display:none; }
117
+ .copy-btn.copied .copy{ display:none; }
118
+ .copy-btn.copied .check{ display:block; }
119
+ .section{
120
+ position:relative; background:var(--card);
121
+ background-image:repeating-linear-gradient(180deg, rgba(255,255,255,.012) 0 1px, transparent 1px 8px);
122
+ border-top:1px solid var(--glow); border-bottom:1px solid var(--glow);
123
+ border-radius:6px; overflow:hidden; margin-bottom:18px;
124
+ box-shadow:0 0 20px rgba(14,165,233,.08), inset 0 1px 24px rgba(14,165,233,.04);
125
+ transition:transform .2s, box-shadow .2s;
126
+ }
127
+ .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); }
128
+ .section::before{
129
+ content:''; position:absolute; left:0; top:0; bottom:0; width:8px; z-index:2;
130
+ }
131
+ .sec-done::before{ background:linear-gradient(180deg,#5eead4,#14b8a6); box-shadow:0 0 12px rgba(20,184,166,.3); }
132
+ .sec-plan::before{ background:linear-gradient(180deg,#fdba74,#f97316); box-shadow:0 0 12px rgba(249,115,22,.3); }
133
+ .sec-risk::before{ background:linear-gradient(180deg,#fda4af,#e11d48); box-shadow:0 0 12px rgba(225,29,72,.3); }
134
+ .sec-inner{ position:relative; z-index:1; padding:24px 24px 22px 32px; }
135
+ .sec-head{ display:flex; align-items:center; gap:10px; margin-bottom:16px; }
136
+ .sec-head svg{ width:18px; height:18px; flex:0 0 auto; }
137
+ .sec-head h2{ font-size:18px; font-weight:900; letter-spacing:1px; }
138
+ .sec-done .sec-head h2{ color:#5eead4; animation:secGlowDone 3s ease-in-out infinite; }
139
+ .sec-plan .sec-head h2{ color:#fdba74; animation:secGlowPlan 3s ease-in-out infinite; }
140
+ .sec-risk .sec-head h2{ color:#fda4af; animation:secGlowRisk 3s ease-in-out infinite; }
141
+ @keyframes secGlowDone{
142
+ 0%,100%{ text-shadow:0 0 14px rgba(94,234,212,.45), 0 0 40px rgba(94,234,212,.18); }
143
+ 50%{ text-shadow:0 0 22px rgba(94,234,212,.75), 0 0 60px rgba(94,234,212,.3); }
144
+ }
145
+ @keyframes secGlowPlan{
146
+ 0%,100%{ text-shadow:0 0 14px rgba(253,186,116,.45), 0 0 40px rgba(253,186,116,.18); }
147
+ 50%{ text-shadow:0 0 22px rgba(253,186,116,.75), 0 0 60px rgba(253,186,116,.3); }
148
+ }
149
+ @keyframes secGlowRisk{
150
+ 0%,100%{ text-shadow:0 0 14px rgba(253,164,175,.45), 0 0 40px rgba(253,164,175,.18); }
151
+ 50%{ text-shadow:0 0 22px rgba(253,164,175,.75), 0 0 60px rgba(253,164,175,.3); }
152
+ }
153
+ .sec-date{
154
+ margin-left:auto; flex:0 0 auto; font-size:11px; color:var(--muted); padding:3px 10px;
155
+ border-radius:999px; border:1px solid rgba(14,165,233,.18); background:rgba(14,165,233,.05);
156
+ letter-spacing:1px;
157
+ }
158
+ ol{ list-style:none; padding:0 12px; }
159
+ li{
160
+ display:flex; align-items:flex-start; gap:10px; padding:10px;
161
+ border-bottom:1px dashed rgba(14,165,233,.15); border-radius:4px;
162
+ transition:background .15s;
163
+ }
164
+ li:last-child{ border-bottom:none; }
165
+ li:hover{ background:rgba(14,165,233,.06); }
166
+ .idx{
167
+ flex:0 0 auto; width:28px; height:28px; border-radius:50%; position:relative;
168
+ display:flex; align-items:center; justify-content:center; color:#fff;
169
+ font-size:12px; font-weight:900; margin-top:2px; transition:transform .2s ease, font-size .2s ease;
170
+ text-shadow:0 1px 1px rgba(0,0,0,.25);
171
+ transition:transform .2s;
172
+ }
173
+ li:hover .idx{ transform:scale(1.18) rotate(-4deg); font-size:14px; }
174
+ .idx b{ display:inline-block; transition:transform .2s ease; }
175
+ li:hover .idx b{ transform:rotate(-6deg); }
176
+ .idx.done{
177
+ background:radial-gradient(circle at 30% 28%, #7dd9cf, #14b8a6 55%, #0d9488);
178
+ box-shadow:0 2px 4px rgba(0,0,0,.25), 0 0 8px rgba(20,184,166,.4), inset -3px -4px 6px rgba(0,0,0,.3), inset 1px 2px 3px rgba(255,255,255,.2);
179
+ }
180
+ .idx.plan{
181
+ background:radial-gradient(circle at 30% 28%, #fdc69a, #f97316 55%, #ea580c);
182
+ box-shadow:0 2px 4px rgba(0,0,0,.25), 0 0 8px rgba(249,115,22,.4), inset -3px -4px 6px rgba(0,0,0,.3), inset 1px 2px 3px rgba(255,255,255,.2);
183
+ }
184
+ .idx.risk{
185
+ background:radial-gradient(circle at 30% 28%, #fdaab4, #f43f5e 55%, #e11d48);
186
+ box-shadow:0 2px 4px rgba(0,0,0,.25), 0 0 8px rgba(244,63,94,.4), inset -3px -4px 6px rgba(0,0,0,.3), inset 1px 2px 3px rgba(255,255,255,.2);
187
+ }
188
+ .idx::before{
189
+ content:''; position:absolute; top:5px; left:7px; width:8px; height:6px; border-radius:50%;
190
+ background:radial-gradient(circle, rgba(255,255,255,.7), rgba(255,255,255,0));
191
+ transform:rotate(-28deg); pointer-events:none;
192
+ }
193
+ .entry{ flex:1; min-width:0; }
194
+ .desc{ font-size:15px; line-height:1.65; color:var(--text); }
195
+ .meta{ font-size:12px; color:var(--muted); margin-top:5px; }
196
+ .meta .qt{ color:#7fa8cc; }
197
+ .meta b{ color:var(--cyan); font-weight:900; margin:0 2px; text-shadow:0 0 8px rgba(14,165,233,.5); }
198
+ .advice{ font-size:12px; color:var(--cyan); margin-top:6px; }
199
+ .advice b{ font-weight:900; }
200
+ .owner{ font-size:12px; color:#a78bfa; margin-top:4px; }
201
+ .owner b{ font-weight:900; }
202
+ .pbar-track{ position:relative; margin-top:9px; height:5px; border-radius:999px; background:rgba(14,165,233,.12); }
203
+ .pbar-fill{
204
+ display:block; position:relative; height:100%; border-radius:999px; width:0;
205
+ transition:width 1.1s cubic-bezier(.3,.8,.4,1); /* 与流星扫过同参数:首次加载进度与流星同步增长 */
206
+ }
207
+ .pbar-done .pbar-fill{ background:linear-gradient(90deg,#0d9488,#14b8a6 45%,#2dd4bf 82%,#a7f3d0); box-shadow:0 0 10px rgba(45,212,191,.35); }
208
+ .pbar-plan .pbar-fill{ background:linear-gradient(90deg,#c2410c,#f97316 45%,#fb923c 82%,#fdba74); box-shadow:0 0 10px rgba(249,115,22,.35); }
209
+ .pbar-fill::before{
210
+ content:''; position:absolute; right:0; top:50%; width:7px; height:7px; border-radius:50%;
211
+ transform:translate(50%,-50%); z-index:2;
212
+ }
213
+ .pbar-done .pbar-fill::before{
214
+ background:radial-gradient(circle at 35% 30%, #a7f3d0, #5eead4 55%, #2dd4bf 100%);
215
+ box-shadow:0 0 8px rgba(45,212,191,.7);
216
+ }
217
+ .pbar-plan .pbar-fill::before{
218
+ background:radial-gradient(circle at 35% 30%, #fed7aa, #fdba74 55%, #fb923c 100%);
219
+ box-shadow:0 0 8px rgba(249,115,22,.7);
220
+ }
221
+ .pbar-done .pbar-track.sheen-on .pbar-fill::before,
222
+ .pbar-plan .pbar-track.sheen-on .pbar-fill::before{ animation:dotPulse 1.1s; }
223
+ @keyframes dotPulse{ 90%{ filter:brightness(2) drop-shadow(0 0 6px #fff); } }
224
+ .pbar-sweep{
225
+ position:absolute; left:0; top:50%; transform:translateY(-50%); height:16px; width:0;
226
+ z-index:1; pointer-events:none; opacity:0;
227
+ }.pbar-comet{
228
+ position:absolute; left:100%; top:50%; transform:translateY(-50%);
229
+ width:14px; height:10px;
230
+ }
231
+ .pbar-comet::before{
232
+ content:''; position:absolute; inset:0; z-index:2;
233
+ 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%);
234
+ background:
235
+ 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)),
236
+ radial-gradient(circle 2px at 40% 50%,#fff,rgba(224,254,255,.92) 55%,rgba(125,211,252,.4) 85%,transparent);
237
+ filter: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(125,211,252,.2));
238
+ }
239
+
240
+ .pbar-comet::after{
241
+ content:''; position:absolute; right:40%; top:50%; transform:translateY(-50%);
242
+ width:68px; height:10px; z-index:0;
243
+ 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%);
244
+ clip-path:polygon(0 50%, 10% 30%, 100% 0, 100% 100%, 10% 70%);
245
+ mask-image:linear-gradient(90deg, transparent 0%, #000 20%, #000 100%);
246
+ -webkit-mask-image:linear-gradient(90deg, transparent 0%, #000 20%, #000 100%);
247
+ filter:blur(1px);
248
+ }
249
+ /* 流星剥落粒子:从光核中后部诞生、0~8% 快速渐显、沿水平线加速后飘、渐小渐隐(椭圆各异不规则、明灭发光,与主体 2.4s 呼吸不同频) */
250
+ .pbar-comet .cp-deep{ animation:cpFlowDeep 1.4s linear infinite; }
251
+ @keyframes cpFlowDeep{
252
+ 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); }
253
+ 8%{ opacity:1; transform:translate3d(calc(var(--dx,-60px)*.01), calc(var(--dy,0)*.01), 0) scale(1) rotate(var(--r,0deg)); }
254
+ 35%{ transform:translate3d(calc(var(--dx,-60px)*.08), calc(var(--dy,0)*.30), 0) scale(.78) rotate(var(--r,0deg)); }
255
+ 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); }
256
+ 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); }
257
+ }
258
+ .cp{
259
+ position:absolute; border-radius:50%; opacity:0; z-index:1; pointer-events:none;
260
+ background:linear-gradient(90deg, rgba(125,211,252,.18), rgba(224,242,254,.9) 45%, #fff 86%);
261
+ box-shadow:0 0 5px 2px rgba(125,211,252,.7);
262
+ animation:cpFlow 1.4s linear infinite;
263
+ }
264
+ @keyframes cpFlow{
265
+ 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); }
266
+ 8%{ opacity:1; transform:translate3d(calc(var(--dx,-60px)*.01), calc(var(--dy,0)*.01), 0) scale(1) rotate(var(--r,0deg)); }
267
+ 35%{ transform:translate3d(calc(var(--dx,-60px)*.08), calc(var(--dy,0)*.30), 0) scale(.78) rotate(var(--r,0deg)); }
268
+ 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); }
269
+ 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); }
270
+ }
271
+
272
+
273
+ .pbar-track.sheen-on .pbar-sweep{ opacity:1; transition:width 1.1s cubic-bezier(.3,.8,.4,1); }
274
+ .pbar-track.sheen-on .pbar-comet{
275
+ animation:cometFade 1.1s ease-out both;
276
+ }
277
+ .pbar-track.sheen-on .pbar-comet::after{ animation:tailGlow 2.4s ease-in-out infinite; }
278
+ .pbar-track.sheen-on .pbar-comet::before{ animation:glowPulse 1.8s ease-in-out infinite; }
279
+ @keyframes cometFade{ 0%{opacity:0;} 7%{opacity:1;} 86%{opacity:1;} 100%{opacity:0;} }
280
+ @keyframes glowPulse{
281
+ 0%,100%{ filter: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(125,211,252,.2)); }
282
+ 50%{ filter: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(45,212,191,.35)); }
283
+ }
284
+ @keyframes tailGlow{
285
+ 0%,100%{ filter:blur(1px) brightness(1); }
286
+ 50%{ filter:blur(1.5px) brightness(1.28); }
287
+ }
288
+ .empty{
289
+ font-size:14px; color:var(--muted); padding:16px 12px; letter-spacing:1px;
290
+ border:1px dashed rgba(14,165,233,.15); border-radius:6px; text-align:center;
291
+ }
292
+ @supports((backdrop-filter:blur(1px)) or (-webkit-backdrop-filter:blur(1px))){
293
+ .header-card, .section{ backdrop-filter:blur(16px) saturate(1.35); background-color:rgba(11,30,55,.42); }
294
+ }
295
+ .header-card{ animation:fadeDown .5s ease-out backwards; transition:transform .18s ease-out; }
296
+ .header-card:hover{ transform:perspective(900px) rotateY(calc(var(--mx,0)*2.5deg)) rotateX(calc(var(--my,0)*-2.5deg)); }
297
+ .section{ animation:riseIn .5s ease-out backwards; }
298
+ .section:nth-of-type(1){ animation-delay:.26s; }
299
+ .section:nth-of-type(2){ animation-delay:.4s; }
300
+ .section:nth-of-type(3){ animation-delay:.54s; }
301
+ @keyframes fadeDown{ from{opacity:0; transform:translateY(-12px);} to{opacity:1; transform:none;} }
302
+ @keyframes riseIn{ from{opacity:0; transform:translateY(14px);} to{opacity:1; transform:none;} }
303
+ .footer{
304
+ text-align:center; font-size:10px; color:var(--muted); letter-spacing:1.5px;
305
+ padding:6px 0 2px; position:relative; z-index:1;
306
+ }
307
+ </style>
308
+ </head>
309
+ <body>
310
+ <div class="grid-pattern"></div>
311
+ <div class="stars"></div>
312
+ <div class="scanband"></div>
313
+ <div class="scanlines"></div>
314
+
315
+ <div class="wrap">
316
+ <div class="header-card" id="headerCard">
317
+ <div class="card-glow"></div>
318
+ <span class="scanline-el scan-x scan-top"></span>
319
+ <span class="scanline-el scan-y scan-right"></span>
320
+ <span class="scanline-el scan-x scan-bottom"></span>
321
+ <span class="scanline-el scan-y scan-left"></span>
322
+ <h1>今日日报</h1>
323
+ <div class="header-sub">20261106</div>
324
+ <span class="header-badge">生成时间 2026-11-06 17:30:39</span>
325
+ <div class="summary-line">
326
+ <span class="summary-tag">TL;DR</span>
327
+ <span class="summary-text">三端账单状态色统一与充值切换学生功能双线交付,四项完成;明日聚焦边界场景、暗色适配与多机型回归,风险暂无。</span>
328
+ </div>
329
+ <div class="copy-wrap">
330
+ <button class="copy-btn" id="copyBtn" type="button">
331
+ <svg class="copy" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.4">
332
+ <rect x="5.5" y="5.5" width="8.5" height="8.5" rx="1.5"/>
333
+ <path d="M10.5 5.5V4a1.5 1.5 0 0 0-1.5-1.5H4A1.5 1.5 0 0 0 2.5 4v5A1.5 1.5 0 0 0 4 10.5h1.5"/>
334
+ </svg>
335
+ <svg class="check" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.6">
336
+ <path d="M2.5 8.5l3.5 3.5 7.5-8"/>
337
+ </svg>
338
+ <span class="btn-text">一键复制</span>
339
+ </button>
340
+ </div>
341
+ </div>
342
+
343
+ <div class="section sec-done">
344
+ <div class="card-glow"></div>
345
+ <div class="sec-inner">
346
+ <div class="sec-head">
347
+ <svg viewBox="0 0 24 24" fill="none" stroke="url(#doneGrad)" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" style="filter:drop-shadow(0 0 6px rgba(94,234,212,.4));">
348
+ <defs>
349
+ <linearGradient id="doneGrad" x1="0%" y1="0%" x2="100%" y2="100%">
350
+ <stop offset="0%" stop-color="#5eead4"/><stop offset="100%" stop-color="#14b8a6"/>
351
+ </linearGradient>
352
+ </defs>
353
+ <circle cx="12" cy="12" r="9"/>
354
+ <path d="M8.5 12.5l2.5 2.5 4.5-5"/>
355
+ </svg>
356
+ <h2>今日任务进度</h2>
357
+ <span class="sec-date">2026-11-06</span>
358
+ </div>
359
+ <ol>
360
+ <li class="pbar-done">
361
+ <span class="idx done"><b>1</b></span>
362
+ <div class="entry">
363
+ <div class="desc">完成账单状态颜色优化,在 srf-web-user/srf-web-wx/srf-web-h5-teacher 三端统一区分待扣款/处理中/成功/失败/已取消五种状态色</div>
364
+ <div class="meta"><span class="qt">3 文件 +54 行</span> - <b>100%</b> - 用时约2H</div>
365
+ <div class="pbar-track"><div class="pbar-sweep"><div class="pbar-comet"></div></div><div class="pbar-fill" data-w="100"></div></div>
366
+ </div>
367
+ </li>
368
+ <li class="pbar-done">
369
+ <span class="idx done"><b>2</b></span>
370
+ <div class="entry">
371
+ <div class="desc">实现充值页面切换学生与不可充值学生拦截功能,含 API 对接、组件改造及页面逻辑优化</div>
372
+ <div class="meta"><span class="qt">3 文件 +94 行</span> - <b>100%</b> - 用时约3H</div>
373
+ <div class="pbar-track"><div class="pbar-sweep"><div class="pbar-comet"></div></div><div class="pbar-fill" data-w="100"></div></div>
374
+ </div>
375
+ </li>
376
+ <li class="pbar-done">
377
+ <span class="idx done"><b>3</b></span>
378
+ <div class="entry">
379
+ <div class="desc">修复首页组件样式问题,调整 MyServiceMenu/PaymentZone/ServiceMenuGrid 布局适配</div>
380
+ <div class="meta"><span class="qt">3 文件 +4 行</span> - <b>100%</b> - 用时约0.5H</div>
381
+ <div class="pbar-track"><div class="pbar-sweep"><div class="pbar-comet"></div></div><div class="pbar-fill" data-w="100"></div></div>
382
+ </div>
383
+ </li>
384
+ <li class="pbar-done">
385
+ <span class="idx done"><b>4</b></span>
386
+ <div class="entry">
387
+ <div class="desc">完成健康指南图片 2 列 grid 布局改造,优化 MoreServicesSection/StudentProfileCard 等首页样式</div>
388
+ <div class="meta"><span class="qt">4 文件 +22 行</span> - <b>100%</b> - 用时约1.5H</div>
389
+ <div class="pbar-track"><div class="pbar-sweep"><div class="pbar-comet"></div></div><div class="pbar-fill" data-w="100"></div></div>
390
+ </div>
391
+ </li>
392
+ </ol>
393
+ </div>
394
+ </div>
395
+
396
+ <div class="section sec-plan">
397
+ <div class="card-glow"></div>
398
+ <div class="sec-inner">
399
+ <div class="sec-head">
400
+ <svg viewBox="0 0 24 24" fill="none" stroke="url(#planGrad)" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="filter:drop-shadow(0 0 6px rgba(253,186,116,.4));">
401
+ <defs>
402
+ <linearGradient id="planGrad" x1="0%" y1="0%" x2="100%" y2="100%">
403
+ <stop offset="0%" stop-color="#fdba74"/><stop offset="100%" stop-color="#f97316"/>
404
+ </linearGradient>
405
+ </defs>
406
+ <rect x="3.5" y="5" width="17" height="15.5" rx="2.5"/>
407
+ <path d="M3.5 9.5h17M8 2.8v3.4M16 2.8v3.4"/>
408
+ </svg>
409
+ <h2>明日计划</h2>
410
+ </div>
411
+ <ol>
412
+ <li class="pbar-plan">
413
+ <span class="idx plan"><b>1</b></span>
414
+ <div class="entry">
415
+ <div class="desc">继续完善充值切换学生功能的边界场景处理与异常提示</div>
416
+ <div class="meta"><b>0%</b> - 预估用时2H</div>
417
+ <div class="pbar-track"><div class="pbar-sweep"><div class="pbar-comet"></div></div><div class="pbar-fill" data-w="0"></div></div>
418
+ </div>
419
+ </li>
420
+ <li class="pbar-plan">
421
+ <span class="idx plan"><b>2</b></span>
422
+ <div class="entry">
423
+ <div class="desc">推进账单状态颜色优化的暗色模式适配</div>
424
+ <div class="meta"><b>0%</b> - 预估用时2H</div>
425
+ <div class="pbar-track"><div class="pbar-sweep"><div class="pbar-comet"></div></div><div class="pbar-fill" data-w="0"></div></div>
426
+ </div>
427
+ </li>
428
+ <li class="pbar-plan">
429
+ <span class="idx plan"><b>3</b></span>
430
+ <div class="entry">
431
+ <div class="desc">开展首页样式优化回归测试,验证各组件在不同机型下的显示效果</div>
432
+ <div class="meta"><b>0%</b> - 预估用时2H</div>
433
+ <div class="pbar-track"><div class="pbar-sweep"><div class="pbar-comet"></div></div><div class="pbar-fill" data-w="0"></div></div>
434
+ </div>
435
+ </li>
436
+ </ol>
437
+ </div>
438
+ </div>
439
+
440
+ <div class="section sec-risk">
441
+ <div class="card-glow"></div>
442
+ <div class="sec-inner">
443
+ <div class="sec-head">
444
+ <svg viewBox="0 0 24 24" fill="none" stroke="url(#riskGrad)" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="filter:drop-shadow(0 0 6px rgba(253,164,175,.4));">
445
+ <defs>
446
+ <linearGradient id="riskGrad" x1="0%" y1="0%" x2="100%" y2="100%">
447
+ <stop offset="0%" stop-color="#fda4af"/><stop offset="100%" stop-color="#e11d48"/>
448
+ </linearGradient>
449
+ </defs>
450
+ <path d="M12 3.5L21 19.5H3z"/>
451
+ <path d="M12 10v4.5M12 17.2v.2"/>
452
+ </svg>
453
+ <h2>风险阻塞点</h2>
454
+ </div>
455
+ <div class="empty">暂无</div>
456
+ </div>
457
+ </div>
458
+
459
+ <div class="footer">GENERATED BY SPECCORE TEAM · 20261106</div>
460
+ </div>
461
+
462
+ <script>
463
+ var TXT = "今日日报 - 20261106\n\n生成时间:2026-11-06 17:30:39\n\nTL;DR:三端账单状态色统一与充值切换学生功能双线交付,四项完成;明日聚焦边界场景、暗色适配与多机型回归,风险暂无。\n\n今日任务进度\n1、完成账单状态颜色优化,在 srf-web-user/srf-web-wx/srf-web-h5-teacher 三端统一区分待扣款/处理中/成功/失败/已取消五种状态色(3 文件 +54 行)- 进度100% - 用时约2H\n2、实现充值页面切换学生与不可充值学生拦截功能,含 API 对接、组件改造及页面逻辑优化(3 文件 +94 行)- 进度100% - 用时约3H\n3、修复首页组件样式问题,调整 MyServiceMenu/PaymentZone/ServiceMenuGrid 布局适配(3 文件 +4 行)- 进度100% - 用时约0.5H\n4、完成健康指南图片 2 列 grid 布局改造,优化 MoreServicesSection/StudentProfileCard 等首页样式(4 文件 +22 行)- 进度100% - 用时约1.5H\n\n明日计划\n1、继续完善充值切换学生功能的边界场景处理与异常提示 - 进度0% - 预估用时2H\n2、推进账单状态颜色优化的暗色模式适配 - 进度0% - 预估用时2H\n3、开展首页样式优化回归测试,验证各组件在不同机型下的显示效果 - 进度0% - 预估用时2H\n\n风险阻塞点\n暂无";
464
+ (function(){
465
+ var btn = document.getElementById('copyBtn');
466
+ btn.addEventListener('click', function(){
467
+ function done(){
468
+ btn.classList.add('copied');
469
+ var t = btn.querySelector('.btn-text');
470
+ var old = t.textContent; t.textContent = '已复制';
471
+ setTimeout(function(){ btn.classList.remove('copied'); t.textContent = old; }, 1600);
472
+ }
473
+ function fallback(){
474
+ var ta = document.createElement('textarea');
475
+ ta.value = TXT; ta.style.position = 'fixed'; ta.style.opacity = '0';
476
+ document.body.appendChild(ta); ta.select();
477
+ try{ document.execCommand('copy'); }catch(e){}
478
+ document.body.removeChild(ta); done();
479
+ }
480
+ if (navigator.clipboard && navigator.clipboard.writeText){
481
+ navigator.clipboard.writeText(TXT).then(done, fallback);
482
+ } else { fallback(); }
483
+ });
484
+ })();
485
+
486
+ /* 流星剥落粒子:JS 为每颗彗星注入 22 粒椭圆小块(从头部稍后诞生 → 加速后飘 → 渐小渐隐,y 向中心水平线收敛) */
487
+ (function(){
488
+ var CP = [
489
+ // [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 终点越过彗尾左端(用户要求比彗星尾部更远)
490
+ // 上方飘散带 17 粒(by -6~-0.5,向上飘散,dy -3.5~-7 上飘展开——用户反馈上方粒子少且飘散不够远,13→17 再加密、dy 再扩大,下方相对合适不增)
491
+ [ 7, -6.0, 5.2, 3.7, 6, -0.05, 1.08, -72, -7.0],
492
+ [ 5, -5.8, 4.0, 2.9, -8, -0.10, 1.01, -76, -6.8],
493
+ [ 6, -5.0, 4.4, 3.2, -9, -0.18, 1.03, -80, -6.7],
494
+ [ 7, -5.4, 3.6, 2.6, -10, -0.40, 0.96, -86, -6.5],
495
+ [ 5, -4.8, 4.6, 3.3, -8, -0.30, 1.05, -78, -6.3],
496
+ [ 3, -4.2, 3.0, 2.1, -7, -0.62, 0.95, -90, -6.1],
497
+ [ 2, -4.6, 2.3, 1.6, -10, -0.52, 0.89, -96, -6.0],
498
+ [ 2, -3.8, 3.2, 2.3, 7, -0.65, 0.94, -82, -5.5],
499
+ [ 4, -2.4, 3.4, 2.4, 8, -0.50, 0.97, -86, -5.3],
500
+ [ 3, -3.4, 4.1, 2.9, 12, -0.55, 1.00, -74, -4.9],
501
+ [ 4, -3.0, 3.1, 2.2, 9, -0.38, 0.93, -88, -4.9],
502
+ [ 3, -2.6, 2.4, 1.7, 11, -0.20, 0.90, -88, -4.7],
503
+ [ 6, -2.0, 3.7, 2.6, -5, -0.80, 1.06, -84, -4.3],
504
+ [ 6, -1.6, 2.6, 1.9, -7, -0.72, 0.90, -92, -3.9],
505
+ [ 5, -1.4, 2.8, 2.0, -6, -0.90, 0.92, -90, -3.7],
506
+ [ 2, -1.0, 2.2, 1.6, 10, -0.85, 0.91, -94, -3.7],
507
+ [ 4, -0.8, 4.0, 2.9, 9, -0.15, 0.98, -80, -3.5],
508
+ // 中部渗漏带 6 粒(by +0.5~+5.5,向下渗漏至光核下缘,dy +1.5~+3.5)
509
+ [ 4, 0.6, 4.6, 3.3, -8, -0.70, 1.00, -78, 1.5],
510
+ [ 6, 2.2, 4.0, 2.9, 6, -0.95, 0.96, -86, 2.2],
511
+ [ 3, 3.6, 3.4, 2.4, 12, -0.10, 0.94, -82, 2.8],
512
+ [ 7, 4.8, 2.8, 2.0, -5, -0.35, 0.92, -92, 3.2],
513
+ [ 5, 5.2, 2.2, 1.6, 9, -0.50, 0.90, -94, 3.5],
514
+ [ 8, 1.2, 2.0, 1.4, -7, -0.60, 0.92, -90, 1.5],
515
+ // 深蓝带 7 粒(by +5.5~+8=光核下缘外 0.5~3px 贴缘出生(与上方贴缘距离一致),dy +5~+7 向后甩出下散展开,cp-deep 深蓝渐变+深蓝光晕,dur 1.06~1.25s 更久停留)
516
+ [ 6, 5.5, 5.0, 3.6, -8, -0.15, 1.20, -90, 5.5],
517
+ [ 3, 6.5, 4.4, 3.2, 6, -0.45, 1.25, -98, 6.2],
518
+ [ 7, 7.5, 3.8, 2.7, 12, -0.70, 1.12, -94, 5.6],
519
+ [ 4, 8.0, 3.3, 2.4, -5, -0.05, 1.18, -106, 6.8],
520
+ [ 6, 6.3, 2.9, 2.1, 9, -0.25, 1.08, -102, 6.5],
521
+ [ 3, 7.3, 2.5, 1.8, -10, -0.55, 1.10, -110, 6.8],
522
+ [ 8, 5.9, 2.1, 1.5, 7, -0.80, 1.06, -112, 5.0]
523
+ ];
524
+ document.querySelectorAll('.pbar-comet').forEach(function(comet){
525
+ for (var i = 0; i < CP.length; i++){
526
+ var c = CP[i];
527
+ var p = document.createElement('span');
528
+ p.className = 'cp';
529
+ p.style.left = c[0] + 'px';
530
+ p.style.top = (5 + c[1]) + 'px';
531
+ p.style.width = c[2] + 'px';
532
+ p.style.height = c[3] + 'px';
533
+ p.style.setProperty('--r', c[4] + 'deg');
534
+ p.style.animationDelay = c[5] + 's';
535
+ p.style.animationDuration = c[6] + 's';
536
+ p.style.setProperty('--dx', c[7] + 'px');
537
+ p.style.setProperty('--dy', c[8] + 'px');
538
+ if (c[1] >= 5.5){
539
+ p.className = 'cp cp-deep';
540
+ p.style.background = 'linear-gradient(90deg, rgba(2,132,199,.4), rgba(56,189,248,.95) 45%, #e0f2fe 86%)';
541
+ p.style.boxShadow = '0 0 6px 2.5px rgba(56,189,248,.9)';
542
+ }
543
+ comet.appendChild(p);
544
+ }
545
+ });
546
+ })();
547
+
548
+
549
+ function sheen(track, src){
550
+ var now = Date.now();
551
+ var key = '_t' + src;
552
+ if (track[key] && now - track[key] < (src === 'wave' ? 1000 : 300)) return;
553
+ track[key] = now;
554
+ var fill = track.querySelector('.pbar-fill');
555
+ var sweep = track.querySelector('.pbar-sweep');
556
+ var w = fill.getAttribute('data-w');
557
+ track.classList.remove('sheen-on');
558
+ sweep.style.transition = 'none';
559
+ sweep.style.width = '0';
560
+ if (src === 'wave'){ fill.style.transition = 'none'; fill.style.width = '0'; }
561
+ void track.offsetWidth;
562
+ track.classList.add('sheen-on');
563
+ sweep.style.transition = '';
564
+ sweep.style.width = w + '%';
565
+ if (src === 'wave'){ fill.style.transition = ''; fill.style.width = w + '%'; }
566
+ }
567
+ (function(){
568
+ var tracks = document.querySelectorAll('.pbar-track');
569
+ var i = 0;
570
+ tracks.forEach(function(t){
571
+ var li = t.closest('li');
572
+ var isPlan = li && li.classList.contains('pbar-plan');
573
+ var w = parseInt(t.querySelector('.pbar-fill').getAttribute('data-w'), 10);
574
+ if (isPlan && w <= 0) return;
575
+ (function(tr){
576
+ setTimeout(function(){ sheen(tr, 'wave'); }, 1500 + i * 420);
577
+ })(t);
578
+ i++;
579
+ });
580
+ document.querySelectorAll('ol li').forEach(function(li){
581
+ var t = li.querySelector('.pbar-track');
582
+ if (!t) return;
583
+ var isPlan = li.classList.contains('pbar-plan');
584
+ var w = parseInt(t.querySelector('.pbar-fill').getAttribute('data-w'), 10);
585
+ if (isPlan && w <= 0) return;
586
+ function hover(){ sheen(t, 'hover'); }
587
+ li.addEventListener('mouseenter', hover);
588
+ li.addEventListener('pointerenter', hover);
589
+ });
590
+ })();
591
+
592
+ // 3D 微倾斜(卡片级:仅 hover 的卡片偏转,±1.25°)
593
+ (function(){
594
+ document.querySelectorAll('.header-card, .section').forEach(function(card){
595
+ card.addEventListener('mousemove', function(e){
596
+ var r = card.getBoundingClientRect();
597
+ var mx = ((e.clientX - r.left) / r.width) * 2 - 1;
598
+ var my = ((e.clientY - r.top) / r.height) * 2 - 1;
599
+ card.style.setProperty('--mx', mx.toFixed(3));
600
+ card.style.setProperty('--my', my.toFixed(3));
601
+ });
602
+ card.addEventListener('mouseleave', function(){
603
+ card.style.setProperty('--mx', '0');
604
+ card.style.setProperty('--my', '0');
605
+ });
606
+ });
607
+ })();
608
+
609
+ (function(){
610
+ // ?shot=content 整页内容区截图模式:含头部标题卡,只统一留白不隐藏任何元素
611
+ if (location.search.indexOf('shot=content') !== -1){
612
+ document.body.style.padding = '40px';
613
+ }
614
+ })();
615
+ </script>
616
+ </body>
617
+ </html>