mcpField
P
product-mockup

product-mockup

github.com/arnavpuri设计与 UI17130 次安装4 周前更新
代码仓库

关于 product-mockup

为实体产品和应用界面制作产品展示图的设计技能,适用于设计与营销素材制作。它结合 Gemini 图像生成和 HTML/CSS 设备框架,并强调保留真实截图内容。

主要功能

  1. 01通过 Gemini 生成产品场景图
  2. 02用 CSS 构建设备外框
  3. 03制作透视与多设备展示
  4. 04设计前后对比和功能标注
  5. 05为截图添加窗口框架

适用场景

  1. 01为实体商品制作场景或包装图
  2. 02将真实应用截图放入设备模型
  3. 03展示产品改版前后差异

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/arnavpuri/designskills --skill product-mockup

安装后在 Claude Code 中输入/product-mockup确认已加载。

详细介绍

产品样机设计

创建专业的产品样机和展示图。提供两种方式:

  • Gemini(实体产品的默认方式): 产品照片 + 提示词 -> 生成照片级真实感的布景、包装和生活方式照片
  • HTML/CSS(应用/网页截图的默认方式): Gemini 会重新绘制 UI,并更改文字、图标和布局,因此请使用 CSS 设备边框包裹真实截图(步骤 3-9),并渲染为 PNG。若要呈现照片级真实感的设备场景,先生成屏幕为空白的场景,再用代码合成截图

步骤 1:加载设计背景信息

  1. 首先读取 .agents/design-context.md——品牌颜色(十六进制)、字体、风格类型
  2. 如果文件缺失,请使用 design-context 默认回退项,并告知用户已使用默认值
  3. 产品样机应符合品牌的设计风格(极简、大胆、奢华等)

Gemini 图像生成方式

流程/命令行:image-generation。提示词撰写、裁剪和文字叠加回退方案:graphic-design 步骤 3。

  1. 使用 --image product.png 传入产品照片,并注明“保持产品的形状、颜色、标签文字和徽标与参考图完全一致”
  2. 比例:电商和社交媒体图片使用 1:1 或 4:5,网页主视觉使用 16:9 或 3:2;使用 --resize WxH 裁剪到精确像素尺寸
  3. 读取输出 PNG,并与源照片对比:标签文字、徽标、比例、颜色和部件数量必须一致。AI 对产品所做的“改进”都属于缺陷。每轮后续修改只修复一个问题
  4. 电商平台主图(如 Amazon)通常要求纯白色 #FFFFFF 背景、产品占画面约 85%,且最长边至少为 1000px(支持缩放的图片需达到 1600px 以上)——请确认平台的最新规则
提示词示例
  • 产品照片:“将此[产品]放置在[背景描述]上。采用专业产品摄影风格。[光线]。[其他元素]。”
  • 设备样机:“创建一个[设备类型]样机,展示[应用/网站截图]。从[角度/视角]展示设备,置于[表面/背景]上。柔和阴影,[光线风格]。呈现简洁、逼真的效果。”
  • 包装样机:“为[品牌]创建产品包装样机。[盒子/瓶子/袋子]上带有[标签设计描述],置于[背景]上。棚拍灯光,[其他道具]。呈现高端、适合上架展示的效果。”

步骤 2:确定样机类型

类型最适合关键技术
设备边框应用/网页截图CSS 设备外壳
生活方式/场景环境中的产品背景 + 阴影
3D 透视动态展示CSS 透视/变换
前后对比展示变化分屏对比
功能标注突出功能连线 + 标签
包装实体产品盒使用 CSS 创建 3D 盒子
多设备响应式展示多个设备边框
截图边框简洁展示截图窗口装饰 + 阴影

步骤 3:设备样机边框

iPhone / 智能手机边框
.phone-mockup {
  position: relative; width: 280px; height: 572px; background: #1a1a1a;
  border-radius: 40px; padding: 12px;
  box-shadow: 0 0 0 2px #333, 0 0 0 4px #1a1a1a, 0 20px 60px rgba(0,0,0,0.4);
}
.phone-mockup .screen { width: 100%; height: 100%; border-radius: 30px; overflow: hidden; background: #fff; position: relative; }
.phone-mockup .dynamic-island {
  position: absolute; top: 10px; left: 50%; transform: translateX(-50%);
  width: 100px; height: 28px; background: #000; border-radius: 20px; z-index: 10;
}
.phone-mockup .screen img { width: 100%; height: 100%; object-fit: cover; border-radius: 30px; }
笔记本电脑 / MacBook 边框
.laptop-mockup { position: relative; width: 680px; }
.laptop-screen { background: #222; border-radius: 12px 12px 0 0; padding: 16px 16px 0; position: relative; }
.laptop-screen .screen { width: 100%; aspect-ratio: 16/10; background: #fff; border-radius: 4px 4px 0 0; overflow: hidden; }
.laptop-screen::before { content: ''; position: absolute; top: 6px; left: 50%; transform: translateX(-50%); width: 6px; height: 6px; background: #444; border-radius: 50%; }
.laptop-base { height: 14px; background: linear-gradient(180deg, #ccc 0%, #aaa 100%); border-radius: 0 0 8px 8px; }
浏览器窗口边框
.browser-mockup { width: 800px; border-radius: 8px; overflow: hidden; box-shadow: 0 20px 60px rgba(0,0,0,0.3); }
.browser-chrome { background: #E5E7EB; padding: 10px 16px; display: flex; align-items: center; gap: 8px; }
.browser-dots { display: flex; gap: 6px; }
.browser-dots span { width: 10px; height: 10px; border-radius: 50%; }
.browser-dots span:nth-child(1) { background: #EF4444; }
.browser-dots span:nth-child(2) { background: #F59E0B; }
.browser-dots span:nth-child(3) { background: #22C55E; }
.browser-url { flex: 1; background: #fff; border-radius: 4px; padding: 4px 12px; font-size: 12px; color: #666; }
.browser-content { background: #fff; width: 100%; aspect-ratio: 16/10; overflow: hidden; }

步骤 4:3D 透视变换

等距视图
.isometric-container { perspective: 1200px; display: flex; justify-content: center; align-items: center; padding: 80px; }
.isometric-device { transform: rotateX(12deg) rotateY(-8deg) rotateZ(2deg); transform-style: preserve-3d; transition: transform 0.4s ease; }
.isometric-device:hover { transform: rotateX(5deg) rotateY(-3deg) rotateZ(0deg); }
浮动透视
.float-device {
  transform: rotateY(-15deg) rotateX(5deg) translateZ(20px);
  transform-style: preserve-3d; animation: gentleFloat 6s ease-in-out infinite;
}
@keyframes gentleFloat {
  0%, 100% { transform: rotateY(-15deg) rotateX(5deg) translateZ(20px) translateY(0); }
  50% { transform: rotateY(-15deg) rotateX(5deg) translateZ(20px) translateY(-12px); }
}
多设备堆叠
.device-stack { position: relative; perspective: 1200px; width: 800px; height: 600px; }
.device-stack .phone  { position: absolute; right: 10%; bottom: 5%; z-index: 3; transform: rotateY(-5deg) translateZ(40px); }
.device-stack .laptop { position: absolute; left: 5%; top: 10%; z-index: 1; transform: rotateY(5deg); }
.device-stack .tablet { position: absolute; right: 25%; top: 5%; z-index: 2; transform: rotateY(-3deg) translateZ(20px) scale(0.8); }
扇形布局
.fan-layout { display: flex; align-items: flex-end; justify-content: center; perspective: 1500px; }
.fan-layout .screen:nth-child(1) { transform: rotateY(25deg) translateX(-30px); }
.fan-layout .screen:nth-child(2) { transform: rotateY(0deg) translateZ(30px); z-index: 2; }
.fan-layout .screen:nth-child(3) { transform: rotateY(-25deg) translateX(30px); }

步骤 5:生活方式背景展示

渐变舞台
.product-stage {
  display: flex; align-items: center; justify-content: center; min-height: 600px; padding: 80px;
  background: radial-gradient(ellipse at 50% 120%, rgba(var(--primary-rgb), 0.15) 0%, transparent 60%),
              linear-gradient(180deg, #0F172A 0%, #1E293B 100%);
}
桌面/表面场景
.desk-scene {
  position: relative; background: linear-gradient(180deg, #F8FAFC 0%, #E2E8F0 100%);
  min-height: 600px; display: flex; align-items: flex-end; justify-content: center; padding-bottom: 40px;
}
.desk-scene::before {
  content: ''; position: absolute; bottom: 0; left: 0; right: 0; height: 40%;
  background: linear-gradient(180deg, #E2E8F0, #CBD5E1);
}
.desk-scene .device { position: relative; z-index: 2; filter: drop-shadow(0 20px 40px rgba(0,0,0,0.15)); }

步骤 6:前后对比

滑块样式
.comparison { position: relative; width: 800px; aspect-ratio: 16/9; overflow: hidden; border-radius: 12px; box-shadow: 0 20px 60px rgba(0,0,0,0.2); }
.comparison .before, .comparison .after { position: absolute; inset: 0; }
.comparison .before { z-index: 1; filter: grayscale(50%) brightness(0.9); }
.comparison .after  { z-index: 2; clip-path: inset(0 50% 0 0); }
.comparison .divider { position: absolute; left: 50%; top: 0; bottom: 0; width: 3px; background: #fff; z-index: 3; }
并排对比
.side-by-side { display: grid; grid-template-columns: 1fr 1fr; gap: 24px; align-items: start; }
.side-by-side .label { font-size: 14px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.08em; margin-bottom: 12px; }

步骤 7:功能亮点标注

连线标注
.feature-showcase { position: relative; display: flex; align-items: center; justify-content: center; padding: 80px; }
.callout { position: absolute; display: flex; align-items: center; gap: 8px; }
.callout .dot { width: 12px; height: 12px; border-radius: 50%; background: var(--accent); box-shadow: 0 0 0 4px rgba(var(--accent-rgb), 0.2); flex-shrink: 0; }
.callout .line { width: 60px; height: 1px; background: rgba(255,255,255,0.3); flex-shrink: 0; }
.callout .text { font-size: 13px; font-weight: 500; background: rgba(0,0,0,0.4); backdrop-filter: blur(8px); padding: 6px 12px; border-radius: 6px; border: 1px solid rgba(255,255,255,0.1); white-space: nowrap; }
编号功能列表
.feature-list { display: flex; flex-direction: column; gap: 20px; }
.feature-item { display: flex; align-items: flex-start; gap: 16px; }
.feature-number { width: 32px; height: 32px; border-radius: 50%; background: var(--primary); color: #fff; display: flex; align-items: center; justify-content: center; font-size: 14px; font-weight: 700; flex-shrink: 0; }

步骤 8:包装可视化(3D 盒子)

.product-box { width: 200px; height: 280px; position: relative; transform-style: preserve-3d; transform: rotateX(-12deg) rotateY(-25deg); /* negative X tilt shows the top face */ }
.box-front { position: absolute; width: 200px; height: 280px; background: var(--primary); transform: translateZ(30px); display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 24px; border-radius: 4px; }
/* Box is 200w x 280h x 60d, centered on z=0: front at +30, side at x=200, top at y=0 */
.box-side { position: absolute; left: 0; top: 0; width: 60px; height: 280px; background: color-mix(in srgb, var(--primary) 80%, black); transform: rotateY(90deg) translateZ(170px); /* 170 = width - depth/2 */ }
.box-top { position: absolute; left: 0; top: 0; width: 200px; height: 60px; background: color-mix(in srgb, var(--primary) 90%, white); transform: rotateX(90deg) translateZ(30px); /* 30 = depth/2 */ }
/* Wrap .product-box in a parent with `perspective: 1000px` */

步骤 9:截图展示

简洁窗口边框
.screenshot-frame { border-radius: 12px; overflow: hidden; box-shadow: 0 4px 6px rgba(0,0,0,0.05), 0 20px 60px rgba(0,0,0,0.15); background: #fff; }
.screenshot-frame .chrome { height: 36px; background: linear-gradient(180deg, #F9FAFB, #F3F4F6); display: flex; align-items: center; padding: 0 12px; gap: 6px; border-bottom: 1px solid #E5E7EB; }
.screenshot-frame .chrome .dot { width: 10px; height: 10px; border-radius: 50%; background: #D1D5DB; }
.screenshot-frame img { width: 100%; display: block; }
旋转截图拼贴
.screenshot-collage { display: flex; padding: 40px; justify-content: center; }
.screenshot-collage .shot:nth-child(1) { transform: rotate(-5deg); z-index: 1; }
.screenshot-collage .shot:nth-child(2) { transform: rotate(0deg) translateY(-10px); z-index: 2; }
.screenshot-collage .shot:nth-child(3) { transform: rotate(5deg); z-index: 1; }
.screenshot-collage .shot { border-radius: 8px; overflow: hidden; box-shadow: 0 10px 30px rgba(0,0,0,0.2); border: 4px solid #fff; }

质量检查清单

  • 设备边框看起来逼真(比例、阴影和细节恰当)
  • 阴影自然(柔和、有方向性,而非均匀分布)
  • 3D 变换具有恰当的透视深度
  • 截图内容清晰可见,且没有失真
  • 使用 design-context 中的品牌颜色作为舞台/背景
  • 多台设备之间的缩放比例恰当
  • 整体构图能够吸引人们关注产品
  • 已阅读 Gemini 输出,并与产品原图进行对比(标签、徽标、形状未改变)
  • 设备边框中的截图是真实、未经修改的 UI,没有拉伸(符合屏幕的宽高比)
  • 代码输出已渲染为 PNG(node <graphic-design>/scripts/render.mjs mockup.html --size WxH --out mockup.png),并在交付前阅读了 PNG
  • 代码是自包含的 HTML/CSS

评论

支持 Markdown