Skip to content

Commit 3b35efc

Browse files
fix(deps): update vulnerable dependencies and pin Docker image (#218)
Addresses OpenSSF Scorecard vulnerabilities and pinned-dependencies findings: - **postcss** updated to >=8.5.10 in frontend (fixes GHSA-qx2v-qp2m-jg93 — XSS via unescaped style tags) - **Astro** updated to 6.1.9 and **Starlight** to 0.38.4 in site (fixes GHSA-j687-52p2-xcff — XSS in defineScriptVars) - **yaml** overridden to >=2.8.3 in site (fixes GHSA-48c2-rrv3-qjmp — stack overflow DoS) - Removed stale @astrojs/sitemap 3.6.0 override that was incompatible with Astro 6 - Pinned Docker image hash in ClusterFuzzLite Dockerfile All three subprojects now pass \ pm audit\ with 0 vulnerabilities. Site builds successfully with the updated deps. Closes #217 --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent e9df9be commit 3b35efc

160 files changed

Lines changed: 47090 additions & 999 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
Huashu Design · Personal Use License
2+
Copyright (c) 2026 alchaincyf (花叔 · 花生)
3+
4+
本 skill(以下简称「本作品」)包含 SKILL.md、scripts、references、assets、demos 及其全部派生内容。使用本作品视为同意以下条款:
5+
6+
---
7+
8+
## 1. 允许的使用(个人免费)
9+
10+
以下场景无需授权、无需打招呼:
11+
12+
- **学习与研究**:阅读代码、修改、二次开发用于自己理解
13+
- **个人创作**:为自己的文章、视频、副业项目、小红书/公众号/B站等内容创作使用
14+
- **非营利分享**:基于本作品做 demo、教程,发布到社交平台、博客、播客
15+
- **派生作品**:在自己名下的个人仓库里基于本作品做派生 skill,需在 README 显著位置注明来源(`Derived from alchaincyf/huashu-design`)
16+
17+
## 2. 禁止的使用(必须事先授权)
18+
19+
以下场景**必须联系花生获得书面授权后方可使用**:
20+
21+
- 任何**公司、团队、工作室、机构**将本作品集成到其内部工具链或对外产品
22+
- 将本作品或其派生物作为**面向付费客户的交付手段**(包括设计外包、品牌咨询、B 端 SaaS 等)
23+
- 基于本作品做**商业软件产品**、付费模板、付费订阅服务
24+
- 以**营利为目的**的培训课程、商业工作坊、闭门付费社群
25+
- 在**商单创作**(乙方向甲方交付物)中使用本作品生成的内容
26+
27+
## 3. 授权联系方式
28+
29+
商用授权请通过以下任一平台联系花生:
30+
31+
- X / Twitter:https://x.com/AlchainHust
32+
- 公众号:微信搜索「花叔」
33+
- B 站:https://space.bilibili.com/14097567
34+
- YouTube:https://www.youtube.com/@Alchain
35+
- 小红书:https://www.xiaohongshu.com/user/profile/5abc6f17e8ac2b109179dfdf
36+
- 官网:https://www.huasheng.ai/
37+
38+
## 4. 免责声明
39+
40+
本作品按「现状」提供,不提供任何明示或默示的担保。作者不对因使用本作品导致的任何损失承担责任。
41+
42+
---
43+
44+
简而言之:**个人随便用,企业要打招呼。**

.agents/skills/huashu-design/README.en.md

Lines changed: 312 additions & 0 deletions
Large diffs are not rendered by default.

.agents/skills/huashu-design/README.md

Lines changed: 326 additions & 0 deletions
Large diffs are not rendered by default.

.agents/skills/huashu-design/SKILL.md

Lines changed: 846 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 175 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,175 @@
1+
/**
2+
* AndroidFrame — Android设备边框(参考Pixel 8系列)
3+
*
4+
* 含:punch-hole相机 + 状态栏 + 导航栏 + 圆角
5+
*
6+
* 用法:
7+
* <AndroidFrame time="9:41" battery={85}>
8+
* <YourAppContent />
9+
* </AndroidFrame>
10+
*/
11+
12+
const androidFrameStyles = {
13+
wrapper: {
14+
display: 'inline-block',
15+
padding: 10,
16+
background: '#1a1a1a',
17+
borderRadius: 44,
18+
boxShadow: '0 0 0 2px #2a2a2a, 0 20px 60px rgba(0,0,0,0.3)',
19+
position: 'relative',
20+
},
21+
screen: {
22+
position: 'relative',
23+
borderRadius: 36,
24+
overflow: 'hidden',
25+
background: '#fff',
26+
},
27+
statusBar: {
28+
position: 'absolute',
29+
top: 0,
30+
left: 0,
31+
right: 0,
32+
height: 32,
33+
display: 'flex',
34+
alignItems: 'center',
35+
justifyContent: 'space-between',
36+
padding: '0 24px',
37+
fontSize: 14,
38+
fontWeight: 500,
39+
fontFamily: 'Roboto, -apple-system, sans-serif',
40+
zIndex: 20,
41+
pointerEvents: 'none',
42+
},
43+
punchHole: {
44+
position: 'absolute',
45+
top: 10,
46+
left: '50%',
47+
transform: 'translateX(-50%)',
48+
width: 14,
49+
height: 14,
50+
background: '#000',
51+
borderRadius: '50%',
52+
zIndex: 30,
53+
},
54+
statusIcons: {
55+
display: 'flex',
56+
alignItems: 'center',
57+
gap: 6,
58+
},
59+
batteryText: {
60+
fontSize: 11,
61+
fontWeight: 600,
62+
marginLeft: 2,
63+
},
64+
content: {
65+
position: 'absolute',
66+
top: 32,
67+
left: 0,
68+
right: 0,
69+
bottom: 24,
70+
overflow: 'auto',
71+
},
72+
navBar: {
73+
position: 'absolute',
74+
bottom: 0,
75+
left: 0,
76+
right: 0,
77+
height: 24,
78+
display: 'flex',
79+
alignItems: 'center',
80+
justifyContent: 'center',
81+
gap: 60,
82+
zIndex: 10,
83+
},
84+
navButton: {
85+
width: 36,
86+
height: 4,
87+
background: 'rgba(0,0,0,0.3)',
88+
borderRadius: 999,
89+
},
90+
};
91+
92+
function AndroidFrame({
93+
children,
94+
width = 412,
95+
height = 892,
96+
time = '9:41',
97+
battery = 100,
98+
darkMode = false,
99+
navStyle = 'gesture',
100+
}) {
101+
const textColor = darkMode ? '#fff' : '#1a1a1a';
102+
103+
return (
104+
<div style={androidFrameStyles.wrapper}>
105+
<div style={{
106+
...androidFrameStyles.screen,
107+
width,
108+
height,
109+
background: darkMode ? '#000' : '#fff',
110+
}}>
111+
<div style={{ ...androidFrameStyles.statusBar, color: textColor }}>
112+
<span>{time}</span>
113+
<div style={androidFrameStyles.statusIcons}>
114+
<svg width="14" height="10" viewBox="0 0 14 10" fill="currentColor">
115+
<rect x="0" y="6" width="2" height="4" rx="0.5" />
116+
<rect x="4" y="4" width="2" height="6" rx="0.5" />
117+
<rect x="8" y="2" width="2" height="8" rx="0.5" />
118+
<rect x="12" y="0" width="2" height="10" rx="0.5" />
119+
</svg>
120+
<svg width="14" height="10" viewBox="0 0 14 10" fill="none">
121+
<path d="M7 9a1 1 0 100-2 1 1 0 000 2z" fill="currentColor" />
122+
<path d="M3 6a5 5 0 018 0" stroke="currentColor" strokeWidth="1.2" />
123+
<path d="M0.5 3.5a11 11 0 0113 0" stroke="currentColor" strokeWidth="1.2" opacity="0.6" />
124+
</svg>
125+
<div style={{
126+
width: 22,
127+
height: 10,
128+
border: '1.5px solid currentColor',
129+
borderRadius: 2,
130+
padding: 1,
131+
position: 'relative',
132+
}}>
133+
<div style={{
134+
width: `${battery}%`,
135+
height: '100%',
136+
background: 'currentColor',
137+
borderRadius: 1,
138+
}} />
139+
</div>
140+
<span style={androidFrameStyles.batteryText}>{battery}%</span>
141+
</div>
142+
</div>
143+
144+
<div style={androidFrameStyles.punchHole} />
145+
146+
<div style={androidFrameStyles.content}>
147+
{children}
148+
</div>
149+
150+
{navStyle === 'gesture' && (
151+
<div style={androidFrameStyles.navBar}>
152+
<div style={{
153+
...androidFrameStyles.navButton,
154+
width: 100,
155+
height: 4,
156+
background: darkMode ? 'rgba(255,255,255,0.5)' : 'rgba(0,0,0,0.4)',
157+
}} />
158+
</div>
159+
)}
160+
161+
{navStyle === 'buttons' && (
162+
<div style={androidFrameStyles.navBar}>
163+
<span style={{ color: textColor, fontSize: 20 }}></span>
164+
<span style={{ color: textColor, fontSize: 16 }}></span>
165+
<span style={{ color: textColor, fontSize: 16 }}></span>
166+
</div>
167+
)}
168+
</div>
169+
</div>
170+
);
171+
}
172+
173+
if (typeof window !== 'undefined') {
174+
window.AndroidFrame = AndroidFrame;
175+
}

0 commit comments

Comments
 (0)