### Initialize UI Style Selector Source: https://github.com/metastem/aidesigner/blob/main/index.html Populates the style selection dropdown with available design presets and handles preview updates when a style is selected. ```javascript const stylesData = [ { id: "business-pro", name: "商务专业", desc: "稳重深蓝色调,适中圆角,柔和阴影,适合企业级应用。使用 Lato 或 Open Sans 字体,强调专业性和可信度。" }, { id: "modern-saas", name: "现代 SaaS", desc: "通透的蓝紫渐变,大圆角设计,悬浮卡片效果。使用 Inter 字体,适合现代化 SaaS 产品,注重用户体验。" }, { id: "fintech-trust", name: "金融科技", desc: "深绿稳重配色,高端暗色背景,细节精致。使用 Montserrat 字体,传递安全感和专业性,适合金融类产品。" }, { id: "minimalist", name: "极致极简", desc: "纯粹的黑白灰,无多余装饰,极细边框。使用 Helvetica 字体,追求功能至上的设计理念。" }, { id: "cyberpunk", name: "赛博朋克", desc: "黑底霓虹光效,故障艺术风格,高对比度。使用 Orbitron 或 Rajdhani 字体,充满未来科技感。" }, { id: "neumorphism", name: "新拟态", desc: "柔和的内外阴影营造凸起质感,低对比度配色。使用 Nunito 字体,给人舒适温和的视觉体验。" }, { id: "glassmorphism", name: "玻璃拟态", desc: "背景模糊效果,半透明白色元素,磨砂玻璃质感。现代时尚,适合展示类页面。" }, { id: "playful-kids", name: "儿童趣味", desc: "糖果色系,超大圆角,粗边框设计。使用 Comic Sans 或圆体,充满童趣和活力。" }, { id: "dark-matter", name: "极客暗黑", desc: "深灰层级分明,代码编辑器风格。使用 Fira Code 或 JetBrains Mono 字体,适合开发者工具。" }, { id: "retro-80s", name: "复古80年代", desc: "像素风或合成器波风格,鲜艳的粉紫黄配色,粗黑边框。充满怀旧气息。" }, { id: "luxury-gold", name: "高端奢华", desc: "黑金配色,衬线字体,大量留白。传递高端品牌质感,适合奢侈品或高端服务。" }, { id: "industrial", name: "工业硬派", desc: "水泥灰主色,警示黄点缀,结构硬朗。适合工业、建筑类应用。" }, { id: "eco-nature", name: "生态自然", desc: "森系绿色,米色背景,圆润有机形状。传递环保、自然、健康的理念。" }, { id: "tech-blue", name: "科技蓝调", desc: "经典科技蓝,网格背景,数字化元素。适合科技公司、软件产品。" }, { id: "warm-coffee", name: "温暖咖啡", desc: "大地色系,舒适温暖,强调阅读体验。适合内容型网站、博客、电商。" }, { id: "aurora-gradient", name: "极光渐变", desc: "流动的青紫粉极光色彩,流体动画效果,半透明层叠。使用 Poppins 字体,营造梦幻科技感,适合创意类产品。" }, { id: "medical-clean", name: "医疗洁净", desc: "纯净的蓝白色系,大量留白,清晰的层级结构。使用 Roboto 字体,传递专业可靠的医疗形象。" }, { id: "neon-tokyo", name: "霓虹东京", desc: "深夜城市氛围,粉紫霓虹灯效,日式街头元素。使用 Noto Sans JP 字体,充满都市夜生活气息。" }, { id: "brutalism", name: "粗野主义", desc: "粗犷的几何形状,强烈的色块对比,原始混凝土质感。使用 Arial Black 字体,强调原始力量感。" }, { id: "pastel-dream", name: "马卡龙梦境", desc: "柔和的马卡龙配色,轻盈的阴影,圆润的气泡元素。使用 Quicksand 字体,营造甜美梦幻氛围。" }, { id: "swiss-design", name: "瑞士极简", desc: "网格系统主导,无衬线字体,黑白红经典配色。使用 Helvetica Neue 字体,追求理性与秩序。" }, { id: "vaporwave", name: "蒸汽波", desc: "粉紫青渐变,复古雕塑元素,故障艺术叠加。使用 Courier New 字体,充满网络怀旧美学。" }, { id: "organic-fluid", name: "有机流体", desc: "不规则曲线形状,流动的斑块效果,柔和的渐变。使用 Comfortaa 字体,展现自然生命力。" }, { id: "newspaper-classic", name: "报纸古典", desc: "黑白分栏布局,衬线字体为主,强调内容密度。使用 Georgia 或 Times 字体,传统媒体质感。" }, { id: "holographic", name: "全息投影", desc: "彩虹光谱渐变,镭射反光效果,未来感边框。使用 Exo 2 字体,科幻高级感,适合前沿科技产品。" }, { id: "scandinavian", name: "北欧简约", desc: "白色主导,淡蓝灰点缀,木纹质感元素。使用 Source Sans Pro 字体,宁静舒适的北欧风格。" }, { id: "graffiti-street", name: "街头涂鸦", desc: "大胆的色彩碰撞,手绘风格元素,倾斜动态排版。使用 Bangers 或手写字体,充满街头文化活力。" }, { id: "art-deco", name: "装饰艺术", desc: "几何对称图案,金色线条装饰,黑金配色。使用 Playfair Display 字体,复古奢华的20年代风格。" }, { id: "game-arcade", name: "街机游戏", desc: "像素风格图标,高饱和度配色,8-bit 音效视觉化。使用 Press Start 2P 字体,怀旧游戏厅氛围。" }, { id: "corporate-red", name: "企业正红", desc: "商务红为主色,深灰辅助色,强调权威感。使用 Roboto Condensed 字体,适合传统企业、政务系统。" }, { id: "sunset-gradient", name: "日落渐变", desc: "橙红黄紫的日落色彩,温暖的渐变过渡,柔和光晕。使用 Raleway 字体,浪漫温馨的氛围。" }, { id: "terminal-hacker", name: "终端黑客", desc: "黑底绿字,命令行风格,扫描线效果。使用 Source Code Pro 字体,极客与黑客文化风格。" }, { id: "watercolor-soft", name: "水彩柔和", desc: "水彩晕染效果,柔和的边缘,艺术感纹理。使用 Merriweather 字体,文艺清新,适合创意工作室。" }, { id: "neon-synthwave", name: "合成波浪", desc: "紫粉渐变背景,网格地平线,80年代未来主义。使用 Audiowide 字体,复古未来感,适合音乐类产品。" }, { id: "metro-modern", name: "都会现代", desc: "方块瓷砖布局,纯色色块,微软 Metro 风格。使用 Segoe UI 字体,简洁高效的现代界面。" }, { id: "cosmic-space", name: "宇宙星空", desc: "深邃星空背景,星云渐变,粒子光效。使用 Space Mono 字体,探索宇宙的神秘感。" }, { id: "paper-craft", name: "纸艺手工", desc: "分层纸张效果,柔和阴影,材质纹理。使用 Indie Flower 字体,温暖手工质感,适合教育类产品。" }, { id: "military-tactical", name: "军事战术", desc: "军绿迷彩色系,硬朗边框,功能性图标。使用 Teko 字体,强调实用性与力量感。" }, { id: "candy-pop", name: "糖果爆炸", desc: "高饱和度糖果色,波普艺术风格,圆点图案。使用 Fredoka One 字体,活力四射的年轻化设计。" }, { id: "zen-minimal", name: "禅意留白", desc: "极致留白,水墨元素,东方美学。使用宋体或明朝体,宁静致远的禅意空间。" } ]; let currentGeneratedCode = ""; let generationStartTime = 0; let generationHistory = []; let currentVersions = []; // 当前会话的版本管理 let currentVersionIndex = 0; let currentSessionId = null; let conversationMessages = []; // 会话消息历史 document.addEventListener('DOMContentLoaded', () => { loadSettings(); initStyleSelector(); loadHistory(); updateHistoryCount(); }); function initStyleSelector() { const select = document.getElementById('style-selector'); select.innerHTML = ''; stylesData.forEach(style => { const option = document.createElement('option'); option.value = style.id; option.textContent = style.name; select.appendChild(option); }); select.addEventListener('change', (e) => { const style = stylesData.find(s => s.id === e.target.value); if(style) { const box = document.getElementById('style-preview-box'); const desc = document.getElementById('style-desc'); box.classList.remove('hidden'); desc.textContent = style.desc; } }); } ``` -------------------------------- ### Configure and Persist API Settings Source: https://context7.com/metastem/aidesigner/llms.txt Defines the structure for API connection settings and demonstrates how to save or retrieve them using localStorage. ```javascript // API 配置对象结构 const config = { base: "https://api.openai.com/v1", // API 基础 URL key: "sk-your-api-key", // API 密钥 model: "gpt-4o-mini", // 模型名称,推荐: gpt-4o-mini, claude-3-5-sonnet maxTokens: 4000, // 最大生成长度 (500-16000) stream: true // 是否启用流式输出 }; // 保存配置到本地存储 localStorage.setItem('ui_gen_config', JSON.stringify(config)); // 读取配置 const savedConfig = JSON.parse(localStorage.getItem('ui_gen_config')); ``` -------------------------------- ### Manage UI Settings and Notifications Source: https://github.com/metastem/aidesigner/blob/main/index.html Functions to retrieve configuration from DOM elements, handle default values, and display styled toast notifications. ```javascript ent.getElementById('stream-mode').checked = config.stream || false; } catch (e) { console.error('Failed to load settings:', e); } } else { document.getElementById('api-base').value = "https://api.openai.com/v1"; document.getElementById('api-model').value = "gpt-4o-mini"; document.getElementById('api-max-tokens').value = 4000; document.getElementById('stream-mode').checked = false; } } function getSettings() { return { base: document.getElementById('api-base').value.trim() || "https://api.openai.com/v1", key: document.getElementById('api-key').value.trim(), model: document.getElementById('api-model').value.trim() || "gpt-4o-mini", maxTokens: parseInt(document.getElementById('api-max-tokens').value) || 4000, stream: document.getElementById('stream-mode').checked }; } function showToast(msg, type = 'success') { const toast = document.getElementById('toast'); const txt = document.getElementById('toast-msg'); const icon = document.getElementById('toast-icon'); txt.textContent = msg; toast.classList.remove('border-emerald-500/30', 'text-emerald-400', 'border-red-500/30', 'text-red-400', 'border-yellow-500/30', 'text-yellow-400'); if(type === 'error') { toast.classList.add('text-red-400', 'border-red-500/30'); icon.className = 'ri-error-warning-fill'; } else if(type === 'warning') { toast.classList.add('text-yellow-400', 'border-yellow-500/30'); icon.className = 'ri-alert-fill'; } else { toast.classList.add('text-emerald-400', 'border-emerald-500/30'); icon.className = 'ri-checkbox-circle-fill'; } toast.classList.remove('hidden'); setTimeout(() => toast.classList.add('hidden'), 3000); } ``` -------------------------------- ### Download Code as HTML File Source: https://context7.com/metastem/aidesigner/llms.txt Downloads the current generated code as an HTML file. Requires the `currentGeneratedCode` variable to be populated. Creates a Blob, generates a URL, and simulates a click on an anchor tag for download. Displays a success toast message. ```javascript function downloadCode() { if (!currentGeneratedCode) { showToast('暂无代码可下载', 'error'); return; } const blob = new Blob([currentGeneratedCode], { type: 'text/html' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = `ui-component-${Date.now()}.html`; document.body.appendChild(a); a.click(); document.body.removeChild(a); URL.revokeObjectURL(url); showToast('代码已下载', 'success'); } ``` -------------------------------- ### Generate UI Component Source: https://github.com/metastem/aidesigner/blob/main/index.html Validates user input, initializes session state, and triggers the generation process based on configuration. ```javascript async function generateUI() { const config = getSettings(); if (!config.key) { openSettings(); showToast('请先配置 API Key', 'error'); return; } const styleId = document.getElementById('style-selector').value; const userPrompt = document.getElementById('user-prompt').value.trim(); if (!styleId) { showToast('请选择一种 UI 风格', 'error'); return; } if (!userPrompt) { showToast('请输入需求描述', 'error'); return; } const selectedStyle = stylesData.find(s => s.id === styleId); generationStartTime = Date.now(); const btn = document.getElementById('generate-btn'); const btnText = btn.querySelector('.text-btn'); const loader = btn.querySelector('.loader'); const emptyState = document.getElementById('empty-state'); btn.disabled = true; btnText.textContent = config.stream ? "AI 实时生成中..." : "AI 正在设计中..."; loader.classList.remove('hidden'); emptyState.style.display = 'none'; // 创建新会话ID(如果是首次生成) if (!currentSessionId) { currentSessionId = Date.now(); currentVersions = []; currentVersionIndex = 0; conversationMessages = []; } const systemPrompt = `你是一个专业的前端 UI 工程师。你的任务是根据用户的描述和指定的 UI 风格,编写一个可以在浏览器中直接运行的完整 HTML 页面。 【设计规范】 风格名称: ${selectedStyle.name} 风格特征: ${selectedStyle.desc} 技术栈: - HTML5 - Tailwind CSS (CDN: https://cdn.tailwindcss.com) - Remix Icon (CDN: https://cdn.jsdelivr.net/npm/remixicon@3.5.0/fonts/remixicon.css) 【核心要求】 1. 输出完整的 HTML 文档结构(包含 , ,
, 等标签) 2. 必须在 中引入 Tailwind CSS 和 Remix Icon 的 CDN 3. 不要使用 markdown 代码块标记(如 \`\`\`html),直接返回纯 HTML 代码 4. 确保代码可以直接在浏览器中运行,无需额外依赖 5. 严格按照指定的风格特征进行设计(配色、圆角、阴影、字体等) 6. 组件必须居中显示(使用 flexbox 或 grid 布局) 7. 确保响应式设计,在移动端表现良好 8. 添加适当的交互效果(hover、focus 等状态) 9. 如果需要 JavaScript 交互,请在