I designed the login screen as a 390×844 board named "Login – Brew & Co". It sits at x=1200 on Page 1, to the right of the board that was already there, which I left alone. I exported it and checked the image. All elements sit inside the board.
What's on it
- Logo and title: a 72px espresso-brown circle with a "B&" mark. Below it are "Brew & Co" at 36px bold and the subtitle "Sign in to order your coffee" at 16px.
- Form: "Email" and "Password" labels sit above white 52px fields with 12px corners and a 1px border. The placeholders are "[email protected]" and "Enter your password". The password field has a "Show" toggle.
- Forgot password?: an underlined, right-aligned link inside a 44px-tall touch area.
- Sign in: a filled 56px button in dark brown with white 18px bold text. It's the strongest element on the screen.
- Create account: an outlined 56px secondary button, set off by an "or" divider.
Design choices
- Colour: the palette is a cream background (#FAF6F1), espresso brown (#3E2723) and a caramel link colour (#8A4B1F). I estimated the contrast rather than measuring it. I expect the text to clear 4.5:1 and the field borders to clear 3:1.
- Spacing: the layout uses a 24px side margin and mostly 8px-grid spacing.
- Touch targets: the buttons are 56px tall and the fields 52px, which is above the 44px minimum.
Problems I noticed
- Layer order: my first render hid the text behind the rectangles.
insertChildat the end of the children list put new shapes at the bottom of the stack. I fixed it by sending the rectangles to the back, and the second export is correct. An earlier attempt had also failed on a bad property name (textAligninstead ofalign), so I deleted that partial board before rebuilding. - Not interactive or reusable: this is a static layout with no flex layout, components or prototype links. The "Show" toggle and the "Forgot password?" touch area are not wired to anything.
- Missing states: there are no focus, error, filled or loading states. The password field also shows a placeholder, not masked dots.
- Placeholder contrast: the placeholder text (#6F5F57) is only just above the 4.5:1 threshold.
- Logo: the mark is a simple "B&" in a circle, not a real brand asset.
- Layout: there are no status-bar or safe-area elements, and the bottom ~120px of the screen is empty. A "Continue as guest" or terms line could fill it, or the content could shift down a little.
- Fonts: I used Penpot's default font and didn't pick a typeface.
How this was tried: I cloned and started penpot-mcp on the local machine (with ports 4402 and 4403 bound to localhost only), and the reviewer loaded its plugin into a Penpot cloud file. During the run only this skill and Penpot's MCP tools were allowed. The model created a new board in an empty file. I compared the canvas screenshot with the model's description and they match, and I recomputed the contrast ratios myself. The weaknesses the model lists itself (no components, states or interactions) are real.
它做什么
指导模型借助 penpot-mcp 服务在 Penpot 里做 UI/UX 设计:先检查是否已有设计系统,再查看文件结构,创建画板、图形和文字,套用弹性布局,新增画面时避免重叠,最后导出图形来核对结果。内置默认的间距、字号和颜色令牌(只在你没有设计系统时才用)、常见的移动端和桌面端布局、组件清单、无障碍速查(对比度 4.5:1、触控目标 44px)以及 Penpot API 的注意事项。四份参考文档分别讲组件、无障碍、平台规范和 MCP 安装。
工作方式
- 模型先试着调用一个 Penpot MCP 工具;没连上时会先问你,再讲安装。
- 通过 Penpot 插件 API 读取文件,然后创建或修改画板和元素。
- 导出图形检查设计,也可以从选中内容提取 CSS。
适合什么场景
在 Penpot 里设计页面和设计系统,或对照无障碍规则审查设计。
中风险:它通过 Penpot MCP 服务在你打开的 Penpot 文件里执行 JavaScript,可以新建、修改或删除该文件里的图形,请先复制文件或在副本上操作。安装需要引入第三方代码(从 GitHub 克隆 `penpot-mcp`、`npm install`、`npm run bootstrap`,需要 Node 22+,本机开放 4400~4402 端口)并从 localhost 加载插件,运行前请先审查那个仓库。已试用:我在本机装好 penpot-mcp 并连上你的 Penpot 云端文件,模型用这个 Skill 做出一张登录页,导出后我对照画布确认与它的描述一致,对比度我复算过。须知:我读代码发现它默认把 4402、4403 端口开给整个局域网,别人能连上执行代码,试用时我改成了只绑本机,你自己装时请同样限制;它的导出和导入图片工具会读写你指定的任意绝对路径。模型自述的问题:没有组件、状态和交互,层级顺序一开始错了。