Coding

web-artifact-studio

Try it

Web交互式工件制作工具,提供数据仪表盘,表单工作流,单页应用与交互式演示构建功能。支持组件展示,状态管理,路由配置与技术选型。适用于产品原型验证,数据可视化展示,内部工具开发等前端工件生产场景。涵盖项目搭建,交付模式选择,TypeScript类型安全等工程化能力。内置React 18与shadcn/ui组件库,含Tailwind样式,响应式布局,无障碍适配。

What it does

Web交互式工件制作工具,提供数据仪表盘,表单工作流,单页应用与交互式演示构建功能。支持组件展示,状态管理,路由配置与技术选型。适用于产品原型验证,数据可视化展示,内部工具开发等前端工件生产场景。涵盖项目搭建,交付模式选择,TypeScript类型安全等工程化能力。内置React 18与shadcn/ui组件库,含Tailwind样式,响应式布局,无障碍适配。

The skill document

|---| | 交互式演示 | 演示需求 + 交互逻辑 | React 应用 + 事件处理 + 可点击演示 | | 数据仪表盘 | 数据源 + 图表需求 + 过滤器 | 状态管理仪表盘 + 图表 + 交互筛选 | | 表单工作流 | 表单字段 + 校验规则 + 分步 | 多步表单 + 路由 + 状态校验 | | 组件展示 | 设计系统/组件库 | shadcn/ui 组件预览 + 代码示例 | | 单页应用原型 | 页面结构 + 路由 | SPA + 路由 + 状态 + 持久化 | 不适用于:

  • 简单单文件 HTML(无状态/无路由,直接写 HTML 即可)
  • 完整生产级 Web 应用(需要后端、数据库、认证等,使用 Next.js/Nuxt)
  • 移动端原生 App(使用 React Native/Flutter)
  • 桌面应用(使用 Electron/Tauri)
  • 静态文档站点(使用 VitePress/Docusaurus)
  • 大型电商网站(需要完整架构,非单工件)

操作步骤

Step 1: 需求分析

  1. 明确工件目标:展示什么?交互什么?数据从哪来?
  2. 复杂度评估:
    • 简单展示 → 单文件 HTML 即可
    • 需要状态/路由/多组件 → 使用本工作室
  3. 技术选型确认:React 18 + TypeScript + Tailwind + shadcn/ui
  4. 交付模式选择:Vite 多文件 / 单 HTML 文件(内联)

Step 2: 项目搭建

  1. 目录结构:

参数说明

参数名类型必填说明
inputstringWeb工件工作室处理的输入数据或指令
optionsobject附加配置选项,如模式选择、格式偏好等
callback_urlstring异步处理完成后的回调通知URL
artifact/
├── index.html          # 入口
├── src/
│   ├── main.tsx        # 挂载点
│   ├── App.tsx         # 根组件
│   ├── components/      # 业务组件
│   ├── ui/              # shadcn/ui 组件
│   ├── hooks/           # 自定义 Hook
│   ├── lib/             # 工具函数
│   └── styles/          # 全局样式
└── package.json
  1. 依赖引入:React、Tailwind、shadcn/ui、按需引入图表/路由库
  2. 构建配置:Vite 或内联打包

Step 3: 组件设计

  1. 组件拆分:按职责拆分,单一职责
  2. shadcn/ui 组合:优先使用 shadcn/ui 组件(Button/Card/Dialog/Table 等)
  3. 状态管理:
    • 局部状态:useState
    • 跨组件:Context 或 Zustand
    • 持久化:localStorage
  4. 路由:React Router(如需多页面)

Step 4: 样式与交互

  1. Tailwind 优先:用工具类,少写自定义 CSS
  2. 响应式:移动优先,sm/md/lg/xl 断点
  3. 无障碍:语义化 HTML、ARIA 标签、键盘导航
  4. 动效:CSS transition / Framer Motion(按需)

Step 5: 打包与交付

  1. 构建产物:单 HTML 文件(内联 JS/CSS)或多文件
  2. 资源处理:图片转 base64 或 CDN
  3. 可移植性:确保工件可独立运行,无外部依赖
  4. 验证:在浏览器中打开测试,确认功能正常

设计原则

  1. 组件化:一切皆组件,可复用可组合
  2. 类型安全:TypeScript,props 有类型定义
  3. 无障碍优先:WCAG 2.1 AA 合规
  4. 性能考虑:懒加载、虚拟列表(长数据)
  5. 避免过度工程:工件不是产品,够用即可

示例展示

示例1: 数据仪表盘工件(输入→输出)

输入:

需求: 销售数据仪表盘
数据: JSON 数组(产品/销售额/地区/月份)
功能: 1) 柱状图展示月度销售 2) 表格展示明细 3) 筛选器按地区过滤
交付: 单 HTML 文件

输出(目录结构 + 关键代码):

artifact/
├── index.html
├── src/
│   ├── main.tsx
│   ├── App.tsx              # 主组件 + 状态
│   ├── components/
│   │   ├── SalesChart.tsx   # 图表组件
│   │   ├── DataTable.tsx    # 表格组件
│   │   └── RegionFilter.tsx # 筛选器
│   └── data/sales.json      # 模拟数据
└── package.json
tsx
// App.tsx 核心代码
import { useState, useMemo } from 'react';
import { Card, CardHeader, CardContent } from '@/ui/card';
import { Select, SelectContent, SelectItem } from '@/ui/select';
import { SalesChart } from './components/SalesChart';
import { DataTable } from './components/DataTable';
import salesData from './data/sales.json';
export default function App() {
  const [region, setRegion] = useState('all');
  const filteredData = useMemo(() => {
    if (region === 'all') return salesData;
    return salesData.filter(item => item.region === region);
  }, [region]);
  return (
    
      销售数据仪表盘
      
        
          全部地区
          华东
          华北
        
      
      
        月度销售趋势
        
          
        
      
      
        销售明细
        
          
        
      
    
  );
}

示例2: 多步表单工件(输入→输出)

输入:

需求: 用户注册多步表单
步骤: 1)基本信息 2)联系方式 3)确认提交
校验: 必填、邮箱格式、手机号格式
交付: 单 HTML 文件 + 状态持久化(localStorage)

输出(关键代码):

// MultiStepForm.tsx
import { useState } from 'react';
import { Button } from '@/ui/button';
import { Input } from '@/ui/input';
import { Label } from '@/ui/label';
const STEPS = ['基本信息', '联系方式', '确认提交'];
export function MultiStepForm() {
  const [step, setStep] = useState(0);
  const [formData, setFormData] = useState(() => {
    const saved = localStorage.getItem('form-data');
    return saved ? JSON.parse(saved) : { name: '', email: '', phone: '' };
  });
  const updateField = (field: string, value: string) => {
    const newData = { ...formData, [field]: value };
    setFormData(newData);
    localStorage.setItem('form-data', JSON.stringify(newData));
  };
  const next = () => step < STEPS.length - 1 && setStep(step + 1);
  const prev = () => step > 0 && setStep(step - 1);
  return (
    
      
        {STEPS.map((s, i) => (
          
        ))}
      
      {STEPS[step]}
      {step === 0 && (
        
          
            姓名
             updateField('name', e.target.value)} />
          
      )}
      {step === 1 && (
        
          
            邮箱
             updateField('email', e.target.value)} />
          
          
            手机号
phone} onChange={e => updateField('phone', e.target.value)} />
          
      )}
      {step === 2 && (
        
          姓名: {formData.name}
          邮箱: {formData.email}
          手机: {formData.phone}
        
      )}
      
        上一步
        {step < STEPS.length - 1 ? (
          下一步
        ) : (
           alert('提交成功!')}>提交
        )}
      
  );
}

示例3: 单文件交付构建(输入→输出)

输入:

需求: 将 React 工件打包为单 HTML 文件,无外部依赖
工具: Vite + vite-plugin-singlefile

输出(配置代码):

// vite.config.ts
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
import { viteSingleFile } from 'vite-plugin-singlefile';
// ...
export default defineConfig({
  plugins: [react(), viteSingleFile()],
  build: {
    target: 'esnext',
    assetsInlineLimit: 100000000, // 100MB,内联所有资源
    cssCodeSplit: false,
    rollupOptions: {
      output: {
        inlineDynamicImports: true,
      },
});
bash
npm run build

异常处理指引

错误场景原因处理方式
Node.js 未安装环境缺少 Node.js提示安装 Node.js 18+,提供下载链接
npm install 失败网络问题或权限切换国内镜像 npm config set registry https://registry.npmmirror.com
shadcn/ui 组件缺失未通过 CLI 添加使用 npx shadcn-ui@latest add button card dialog 添加
TypeScript 编译错误类型不匹配检查 props 类型定义,使用 tsc --noEmit 校验
Vite 构建失败配置错误或依赖冲突检查 vite.config.ts,清理 node_modules 重装
单文件打包体积过大内联资源过多使用 CDN 加载 React/Tailwind,仅内联业务代码
Tailwind 样式不生效配置错误或 purge 误删检查 tailwind.config.js content 路径
localStorage 数据丢失浏览器隐私模式添加 try-catch,降级为内存状态
图表库未引入缺少 recharts/echartsnpm install recharts 或使用 SVG 手绘
路由 404直接打开 HTML 文件路由失效使用 HashRouter 替代 BrowserRouter

运行环境

运行环境

  • Agent平台: Claude Code / Cursor / Codex / Gemini CLI / Windsurf 等支持SKILL.md的任意Agent
  • 操作系统: Windows / macOS / Linux
  • 运行时: Node.js 18+ + npm/pnpm

第三方依赖

依赖项类型是否必需获取方式国内替代
Node.js 18+运行时必需nodejs.orgnpmmirror 国内镜像
React 18必需npm install react react-domnpmmirror
TypeScript必需npm install -D typescriptnpmmirror
Tailwind CSS必需npm install -D tailwindcssnpmmirror
shadcn/ui必需npx shadcn-ui@latest initnpmmirror
Vite工具必需npm install -D vitenpmmirror
React Router可选(多页面)npm install react-router-domnpmmirror
Recharts可选(图表)npm install rechartsnpmmirror
LLM APIAPI必需Agent 内置 LLM通义/文心/智谱

API Key 配置

  • 本Skill无需额外API Key配置
  • 安全要求:
    • 工件中不硬编码任何 API Key 或敏感凭证
    • 如需调用外部 API,通过环境变量注入(VITE_ 前缀)
    • 构建产物中不包含 .env 文件

可用性分类

  • 分类: MD+EXEC
  • 说明: 纯Markdown方法论,需 exec 能力运行 npm/Vite 命令

案例展示

以下案例展示了skill的工作流程和预期输出效果,由LLM按照skill定义的流程生成。

案例1: 销售数据仪表盘(Zustand全局状态+Recharts图表+筛选器)

输入:

需求: 销售数据仪表盘工件
数据: JSON数组(产品/销售额/地区/月份/同比增长)
功能:
  1) 柱状图展示月度销售趋势
  2) 数据表格展示明细(支持排序)
  3) 地区筛选器+产品筛选器联动
  4) KPI卡片展示总销售额/平均增长率/最高地区
交付: 单HTML文件(Vite打包)

LLM生成输出 (output/sales-dashboard/src/App.tsx):

import { useState, useMemo } from 'react';
import { create } from 'zustand';
import { BarChart, Bar, XAxis, YAxis, Tooltip, ResponsiveContainer, CartesianGrid } from 'recharts';
import { Card, CardHeader, CardContent, CardTitle } from '@/ui/card';
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/ui/select';
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/ui/table';
// Zustand 全局状态
interface DashboardStore {
  region: string;
  product: string;
  setRegion: (r: string) => void;
  setProduct: (p: string) => void;
}
const useDashboardStore = create((set) => ({
  region: 'all',
  product: 'all',
  setRegion: (r) => set({ region: r }),
  setProduct: (p) => set({ product: p }),
}));
// KPI 卡片组件
function KPICard({ title, value, subtitle }: { title: string; value: string; subtitle: string }) {
  return (
    
      {title}
      
        {value}
        {subtitle}
      
    
  );
}
export default function App() {
  const { region, product, setRegion, setProduct } = useDashboardStore();
  const filteredData = useMemo(() => {
      (region === 'all' || item.region === region) &&
      (product === 'all' || item.product === product)
    );
  }, [region, product]);
  // KPI 计算
  const totalSales = filteredData.reduce((sum, d) => sum + d.amount, 0);
  const avgGrowth = filteredData.length > 0
    ? (filteredData.growthRate, 0) / filteredData.length).toFixed(1)
    : '0';
  const topRegion = useMemo(() => {
    const regionMap: Record = {};
    filteredData.forEach(d => { regionMap[d.region] = (regionMap[d.region] || 0) + d.amount; });
    return Object.entries(regionMap).sort((a, b) => b[1] - a[1])[0]?.[0] || '-';
  }, [filteredData]);
  // 图表数据(按月份聚合)
  const chartData = useMemo(() => {
    const monthMap: Record = {};
    filteredData.forEach(d => { monthMap[d.month] = (monthMap[d.month] || 0) + d.amount; });
    return Object.entries(monthMap).map(([month, amount]) => ({ month, amount }));
  }, [filteredData]);
  return (
    
      销售数据仪表盘
      {/* KPI 卡片 */}
      
        
        
        
      
      {/* 筛选器 */}
      
        
          
          
            全部地区
            华东
            华北
            华南
          
        
        
          
          
            全部产品
            产品A
            产品B
            产品C
          
        
      
      {/* 图表 */}
      
        月度销售趋势
        
          
            
              
              
              
               `¥${v.toLocaleString()}`} />
              
            
          
        
      
      {/* 数据表格 */}
      
        销售明细
        
          
            
              
                产品
                地区
                月份
                销售额
                增长率
              
            
            
              {filteredData.map((item, i) => (
                
                  {item.product}
                  ¥{item.amount.toLocaleString()}
                  = 0 ? 'text-green-600' : 'text-red-600'}`}>
                    {item.growthRate >= 0 ? '+' : ''}{item.growthRate}%
                  
                
              ))}
            
          
        
      
    
  );
}

效果验证: ✓Zustand全局状态管理(地区+产品双筛选器) ✓useMemo性能优化(筛选/KPI/图表数据缓存) ✓Recharts柱状图含网格/坐标轴/Tooltip ✓3个KPI卡片(总销售/增长率/最高地区) ✓shadcn/ui Table组件展示明细含正负增长率着色 ✓响应式布局(grid-cols-1 md:grid-cols-3)

疑问解答集锦

Q1: Web工件工作室支持哪些输入格式?

A1: React+Tailwind+shadcn构建复杂交互Web工件,状态路由组件全搞定。Web工件工作室——用现代前端技术栈(React/TypeScript/T。支持文本指令和结构化参数输入,具体格式参考使用流程章节。

Q2: 需要配置API Key吗?

A2: 是的,部分功能需要配置对应平台的API Key。请在依赖说明章节查看具体要求,并通过环境变量安全配置。

Q3: 命令行执行失败怎么办?

A3: 检查命令参数是否正确,确认运行环境支持exec能力。如遇权限问题,请参照错误处理章节排查。

安全提示

安全风险防范

风险项等级防护措施验证方法
API密钥泄露通过环境变量配置,禁止硬编码定期检查代码和配置文件
命令执行风险仅执行白名单命令,避免拼接用户输入使用沙箱环境测试
网络通信安全使用HTTPS协议,验证SSL证书定期检查证书有效期
敏感数据暴露输出结果中不包含密钥、令牌等敏感信息日志脱敏审查
未授权访问限制访问权限,实施认证机制定期审计访问日志
使用前请确认已阅读依赖说明章节,确保运行环境满足安全要求。

故障处理体系

针对Web工件工作室使用中可能遇到的常见问题,提供以下排查方案:

错误类型原因分析解决方案
API认证失败(401)API密钥错误或过期检查密钥配置,重新生成token
接口限流(429)请求频率超出限制降低调用频率,启用重试退避策略
响应超时(504)网络延迟或服务端负载过高增加超时阈值,检查网络连接
文件不存在路径错误或文件未创建检查路径拼写,确认文件已生成
文件格式不支持扩展名不在支持列表中转换为支持的格式后重试
权限不足当前用户无读写权限检查文件权限,以管理员身份运行
命令执行失败参数错误或环境依赖缺失检查命令语法,确认依赖已安装
进程超时命令执行时间过长增加超时设置,优化命令参数
网络连接失败DNS解析失败或防火墙拦截检查网络配置,确认代理设置

Web工件工作室通用排查步骤

  1. 检查输入参数: 确认所有必填参数已提供且格式正确
  2. 查看日志输出: 定位具体错误行和异常类型
  3. 验证环境配置: 确认依赖库版本和运行环境满足要求
  4. 逐步调试: 缩小问题范围,隔离故障模块

注: 本SKILL.md超过500行上限, 已截断尾部非核心章节以满足L1格式要求。完整内容见版本库历史。

用户问题解答

首次设置

  1. 配置API密钥: 在环境变量中设置对应的API Key
  2. 初始化连接: 使用提供的凭证建立API连接
  3. 调用接口: 传入必要参数执行API调用
  4. 准备文件: 确认文件路径正确且格式受支持
  5. 执行处理: 调用对应的处理函数
  6. 查看结果: 检查输出文件或返回数据
  7. 检查环境: 确认运行时和依赖已安装
  8. 执行命令: 使用正确的参数格式执行
  9. 查看输出: 检查命令输出和退出码

前置条件

  • 已安装所需运行环境(参考依赖说明)
  • 已获取必要的API密钥或访问凭证(如适用)
  • 输入数据已准备就绪

Q1: 本技能支持哪些输入格式?

能力速览

  • 自动化执行: 基于指令驱动的自动化流程
  • 文件处理: 支持多种文件格式的读取、解析和写入操作
  • API集成: 通过标准化接口调用外部服务并处理响应
  • 命令执行: 在安全沙箱中执行系统命令并收集结果

使用场景

适用于需要专业工具支持的开发、运维和内容创作场景。

  • 开发者日常工具调用
  • 团队协作中的自动化处理
  • 内容生产与格式转换

Q1: Web Artifact Studio支持哪些输入格式?

A1: Web Artifact Studio专业技能工具。

Related skills

Web交互式工件制作工具,提供数据仪表盘,表单工作流,单页应用与交互式演示构建功能。支持组件展示,状态管理,路由配置与技术选型。适用于产品原型验证,数据可视化展示,内部工具开发等前端工件生产场景。涵盖项目搭建,交付模式选择,TypeScript类型安全等工程化能力。内置React 18与shadcn/ui组件库,含Tailwind样式,响应式布局,无障碍适配。

Use when you need to share static web content (HTML/CSS/JS/images) via a publicly accessible URL — uploading generated files, creating shareable pages, or deploying single-page web artifacts

1 installs

Generate interactive dashboards, data visualizations, and web apps from natural-language prompts.

155 installs5 stars

Turn user-supplied drawing steps into one still per art demo page. This classroom art still studio lays out each step-by-step art demo from the supplied demo points. Use it for art demonstration stills, drawing step pages, and an art demo set.

面向个人的协作画布艺术发布工具,支持像素画作。Use when 需要提升效率、自动化流程、批量处理、工作流优化时使用。不适用于需要人工创意判断的任务。适用于独立开发者、企业团队和自动化工作流场景。支持中文交互,无需复杂配置即开即用。输出结果可直接使用,减少二次加工成本。提供结构化输出和错误处理机制。

1 installs

Public OpenClaw skill for generating reproducible PPTX decks from project notes, status bullets, and screenshots. Use when the user wants a stakeholder-ready...

23 installs1 stars