<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>实战与调试 on 扎塔-Zata</title><link>https://www.zata.cc/tags/%E5%AE%9E%E6%88%98%E4%B8%8E%E8%B0%83%E8%AF%95/</link><description>Recent content in 实战与调试 on 扎塔-Zata</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><copyright>Example Person</copyright><lastBuildDate>Thu, 24 Sep 2026 17:09:06 +0800</lastBuildDate><atom:link href="https://www.zata.cc/tags/%E5%AE%9E%E6%88%98%E4%B8%8E%E8%B0%83%E8%AF%95/index.xml" rel="self" type="application/rss+xml"/><item><title>下拉框里显示 _all：Base UI 与 Radix Select 的一个行为差异</title><link>https://www.zata.cc/p/%E4%B8%8B%E6%8B%89%E6%A1%86%E9%87%8C%E6%98%BE%E7%A4%BA-_allbase-ui-%E4%B8%8E-radix-select-%E7%9A%84%E4%B8%80%E4%B8%AA%E8%A1%8C%E4%B8%BA%E5%B7%AE%E5%BC%82/</link><pubDate>Thu, 06 Aug 2026 09:30:34 +0800</pubDate><guid>https://www.zata.cc/p/%E4%B8%8B%E6%8B%89%E6%A1%86%E9%87%8C%E6%98%BE%E7%A4%BA-_allbase-ui-%E4%B8%8E-radix-select-%E7%9A%84%E4%B8%80%E4%B8%AA%E8%A1%8C%E4%B8%BA%E5%B7%AE%E5%BC%82/</guid><description>&lt;img src="https://www.zata.cc/p/%E4%B8%8B%E6%8B%89%E6%A1%86%E9%87%8C%E6%98%BE%E7%A4%BA-_allbase-ui-%E4%B8%8E-radix-select-%E7%9A%84%E4%B8%80%E4%B8%AA%E8%A1%8C%E4%B8%BA%E5%B7%AE%E5%BC%82/images/index/index.svg" alt="Featured image of post 下拉框里显示 _all：Base UI 与 Radix Select 的一个行为差异" />&lt;h2 id="一个看起来像文案错误的-bug">一个看起来像文案错误的 bug
&lt;/h2>&lt;p>前几天看智能体市场页面，发现一个奇怪的现象：页面上四个筛选下拉框——来源、价格、分类、标签——触发器里齐刷刷地显示着 &lt;code>_all&lt;/code>。&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/%E4%B8%8B%E6%8B%89%E6%A1%86%E9%87%8C%E6%98%BE%E7%A4%BA-_allbase-ui-%E4%B8%8E-radix-select-%E7%9A%84%E4%B8%80%E4%B8%AA%E8%A1%8C%E4%B8%BA%E5%B7%AE%E5%BC%82/images/index/before.png"
width="1996"
height="1384"
srcset="https://www.zata.cc/p/%E4%B8%8B%E6%8B%89%E6%A1%86%E9%87%8C%E6%98%BE%E7%A4%BA-_allbase-ui-%E4%B8%8E-radix-select-%E7%9A%84%E4%B8%80%E4%B8%AA%E8%A1%8C%E4%B8%BA%E5%B7%AE%E5%BC%82/images/index/before_hu14079163804115354218.png 480w, https://www.zata.cc/p/%E4%B8%8B%E6%8B%89%E6%A1%86%E9%87%8C%E6%98%BE%E7%A4%BA-_allbase-ui-%E4%B8%8E-radix-select-%E7%9A%84%E4%B8%80%E4%B8%AA%E8%A1%8C%E4%B8%BA%E5%B7%AE%E5%BC%82/images/index/before_hu2059617218502835573.png 1024w"
loading="lazy"
alt="修复前：四个筛选器都显示 _all"
class="gallery-image"
data-flex-grow="144"
data-flex-basis="346px"
>&lt;/p>
&lt;p>第一反应：文案写错了，或者翻译 key 没配。这种问题见多了，大概率是 &lt;code>t(&amp;quot;xxx&amp;quot;)&lt;/code> 的 key 在语言包里不存在，框架把 key 原样吐了出来。&lt;/p>
&lt;p>打开代码一看，不对劲。每个选项明明都写了翻译文案：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-tsx" data-lang="tsx">&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">SelectItem&lt;/span> &lt;span class="na">value&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;_all&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;{&lt;/span>&lt;span class="nx">t&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;sourceAll&amp;#34;&lt;/span>&lt;span class="p">)}&amp;lt;/&lt;/span>&lt;span class="nt">SelectItem&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">SelectItem&lt;/span> &lt;span class="na">value&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;official_template&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;{&lt;/span>&lt;span class="nx">t&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;sourceOfficialTemplate&amp;#34;&lt;/span>&lt;span class="p">)}&amp;lt;/&lt;/span>&lt;span class="nt">SelectItem&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>语言包里 key 也都在。那 &lt;code>_all&lt;/code> 到底是从哪冒出来的？&lt;/p>
&lt;h2 id="真相组件库不是你以为的那个">真相：组件库不是你以为的那个
&lt;/h2>&lt;p>线索藏在项目的 &lt;code>components/ui/select.tsx&lt;/code> 里。这个文件的位置和命名，一看就是 shadcn/ui 的风格——而 shadcn 的 Select 底层是 Radix。但如果你真的打开它看 import：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-tsx" data-lang="tsx">&lt;span class="line">&lt;span class="cl">&lt;span class="kr">import&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">Select&lt;/span> &lt;span class="kr">as&lt;/span> &lt;span class="nx">SelectPrimitive&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="kr">from&lt;/span> &lt;span class="s2">&amp;#34;@base-ui/react/select&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">const&lt;/span> &lt;span class="nx">SelectValue&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">SelectPrimitive&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">Value&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>是 &lt;strong>Base UI&lt;/strong>，不是 Radix。项目不知道什么时候做过组件库迁移，目录结构原封不动地保留了下来。&lt;/p>
&lt;p>这两个库的 &lt;code>Select.Value&lt;/code> 看着是同一个东西，行为却完全不同：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Radix&lt;/strong> 的 &lt;code>SelectValue&lt;/code> 很&amp;quot;贴心&amp;quot;：它会自动找到当前选中的 &lt;code>SelectItem&lt;/code>，把它的子节点文本拿来显示。所以你只管写选项，显示的事它帮你办了。&lt;/li>
&lt;li>&lt;strong>Base UI&lt;/strong> 的 &lt;code>Select.Value&lt;/code> 很&amp;quot;实诚&amp;quot;：默认把当前 value 原样渲染出来。value 是什么就显示什么——在这个项目里，就是哨兵值 &lt;code>_all&lt;/code>。&lt;/li>
&lt;/ul>
&lt;p>翻一下它的类型定义，官方用法写得明明白白，想显示文案？自己传个函数来格式化：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-tsx" data-lang="tsx">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// node_modules/@base-ui/react/select/value/SelectValue.d.ts
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">Select.Value&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{(&lt;/span>&lt;span class="nx">value&lt;/span>: &lt;span class="kt">string&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="kc">null&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">=&amp;gt;&lt;/span> &lt;span class="nx">value&lt;/span> &lt;span class="o">?&lt;/span> &lt;span class="nx">labels&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;No value&amp;#39;&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">Select.Value&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>所以根本不存在什么文案错误。&lt;code>_all&lt;/code> 是筛选状态的哨兵值，被 Base UI 原封不动地端上了桌。至于 &lt;code>placeholder&lt;/code>，它只在&amp;quot;无值&amp;quot;时生效，而 &lt;code>_all&lt;/code> 是一个货真价实的值，盖不住。&lt;/p>
&lt;h2 id="修复把-value-翻译回人话">修复：把 value 翻译回人话
&lt;/h2>&lt;p>知道了根因，修法就很直接：给每个 &lt;code>SelectValue&lt;/code> 传函数 children，显式地做一层 value → 文案的映射。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-tsx" data-lang="tsx">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// 修复前：placeholder 只管无值状态，_all 会被原样渲染
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">SelectValue&lt;/span> &lt;span class="na">placeholder&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="nx">t&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;sourceAll&amp;#34;&lt;/span>&lt;span class="p">)}&lt;/span> &lt;span class="p">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// 修复后：显式映射
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">SelectValue&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{(&lt;/span>&lt;span class="nx">value&lt;/span>: &lt;span class="kt">SourceFilter&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">=&amp;gt;&lt;/span> &lt;span class="nx">sourceFilterLabels&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">]}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">SelectValue&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>映射表复用已有的翻译 key，不新增任何文案：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-tsx" data-lang="tsx">&lt;span class="line">&lt;span class="cl">&lt;span class="kr">const&lt;/span> &lt;span class="nx">sourceFilterLabels&lt;/span>: &lt;span class="kt">Record&lt;/span>&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">SourceFilter&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="na">string&lt;/span>&lt;span class="p">&amp;gt;&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">_all&lt;/span>: &lt;span class="kt">t&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;sourceAll&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">official_template&lt;/span>: &lt;span class="kt">t&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;sourceOfficialTemplate&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">official_agent&lt;/span>: &lt;span class="kt">t&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;sourceOfficialAgent&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">community_agent&lt;/span>: &lt;span class="kt">t&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;sourceCommunityAgent&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>分类、标签这种选项值是动态数据的，更简单，只需要特判哨兵值：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-tsx" data-lang="tsx">&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">SelectValue&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{(&lt;/span>&lt;span class="nx">value&lt;/span>: &lt;span class="kt">string&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">=&amp;gt;&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nx">value&lt;/span> &lt;span class="o">===&lt;/span> &lt;span class="s2">&amp;#34;_all&amp;#34;&lt;/span> &lt;span class="o">?&lt;/span> &lt;span class="nx">t&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;allCategories&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">:&lt;/span> &lt;span class="nx">value&lt;/span>&lt;span class="p">)}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">SelectValue&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="顺手扫一遍全仓果然不止这一处">顺手扫一遍全仓：果然不止这一处
&lt;/h2>&lt;p>这类&amp;quot;库级行为差异&amp;quot;导致的 bug 有个特点：&lt;strong>它不可能只出现在一个地方&lt;/strong>。凡是「value 和展示文案不一样」的 Select，都会露底。&lt;/p>
&lt;p>按这个模式扫了一遍整个前端仓库，果然收获不小——一共改了 7 个文件、13 处。项目里的哨兵值花样还不少：&lt;/p>
&lt;ul>
&lt;li>&lt;code>_all&lt;/code>：筛选器的&amp;quot;全部&amp;quot;占位；&lt;/li>
&lt;li>&lt;code>__custom__&lt;/code> / &lt;code>__unlimited__&lt;/code>：分享表单里的&amp;quot;自定义/不限&amp;quot;；&lt;/li>
&lt;li>&lt;code>__agent_default__&lt;/code>、&lt;code>model:{id}&lt;/code>：模型选择器的特殊值；&lt;/li>
&lt;li>&lt;code>daily&lt;/code> / &lt;code>weekly&lt;/code>：定时任务里的英文枚举，展示时应该是&amp;quot;每天/每周&amp;quot;。&lt;/li>
&lt;/ul>
&lt;p>也有两处不用动：value 和文案本来就相同的（比如协议选择器），以及本来就传了 children 的封装组件。扫的时候分清这两种情况，别误伤。&lt;/p>
&lt;h2 id="验证走真实入口看一眼">验证：走真实入口看一眼
&lt;/h2>&lt;p>改完先过静态检查（&lt;code>tsc --noEmit&lt;/code>、eslint），然后写了个 Playwright 脚本走真实入口验证：起真实后端、注册真实用户、打开 &lt;code>/app/market&lt;/code>，直接断言四个触发器的渲染文本。&lt;/p>
&lt;p>默认状态，四个筛选器都显示中文文案：&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/%E4%B8%8B%E6%8B%89%E6%A1%86%E9%87%8C%E6%98%BE%E7%A4%BA-_allbase-ui-%E4%B8%8E-radix-select-%E7%9A%84%E4%B8%80%E4%B8%AA%E8%A1%8C%E4%B8%BA%E5%B7%AE%E5%BC%82/images/index/after-default.png"
width="1440"
height="900"
srcset="https://www.zata.cc/p/%E4%B8%8B%E6%8B%89%E6%A1%86%E9%87%8C%E6%98%BE%E7%A4%BA-_allbase-ui-%E4%B8%8E-radix-select-%E7%9A%84%E4%B8%80%E4%B8%AA%E8%A1%8C%E4%B8%BA%E5%B7%AE%E5%BC%82/images/index/after-default_hu688350631553042895.png 480w, https://www.zata.cc/p/%E4%B8%8B%E6%8B%89%E6%A1%86%E9%87%8C%E6%98%BE%E7%A4%BA-_allbase-ui-%E4%B8%8E-radix-select-%E7%9A%84%E4%B8%80%E4%B8%AA%E8%A1%8C%E4%B8%BA%E5%B7%AE%E5%BC%82/images/index/after-default_hu5516568811642967097.png 1024w"
loading="lazy"
alt="修复后：默认状态显示全部来源/全部价格/全部分类/全部标签"
class="gallery-image"
data-flex-grow="160"
data-flex-basis="384px"
>&lt;/p>
&lt;p>再点开来源筛选选中「官方 Agent」，触发器显示对应文案，列表也真实地收窄到了 2 条官方 Agent：&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/%E4%B8%8B%E6%8B%89%E6%A1%86%E9%87%8C%E6%98%BE%E7%A4%BA-_allbase-ui-%E4%B8%8E-radix-select-%E7%9A%84%E4%B8%80%E4%B8%AA%E8%A1%8C%E4%B8%BA%E5%B7%AE%E5%BC%82/images/index/after-selected.png"
width="1440"
height="900"
srcset="https://www.zata.cc/p/%E4%B8%8B%E6%8B%89%E6%A1%86%E9%87%8C%E6%98%BE%E7%A4%BA-_allbase-ui-%E4%B8%8E-radix-select-%E7%9A%84%E4%B8%80%E4%B8%AA%E8%A1%8C%E4%B8%BA%E5%B7%AE%E5%BC%82/images/index/after-selected_hu8355955918967259026.png 480w, https://www.zata.cc/p/%E4%B8%8B%E6%8B%89%E6%A1%86%E9%87%8C%E6%98%BE%E7%A4%BA-_allbase-ui-%E4%B8%8E-radix-select-%E7%9A%84%E4%B8%80%E4%B8%AA%E8%A1%8C%E4%B8%BA%E5%B7%AE%E5%BC%82/images/index/after-selected_hu5664872224660331418.png 1024w"
loading="lazy"
alt="修复后：选中官方 Agent 后显示文案并生效"
class="gallery-image"
data-flex-grow="160"
data-flex-basis="384px"
>&lt;/p>
&lt;h2 id="几点收获">几点收获
&lt;/h2>&lt;p>这个 bug 本身不大，但排查过程里有几个值得记住的点：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>目录结构会骗人。&lt;/strong> &lt;code>components/ui/select.tsx&lt;/code> 长得和 shadcn/Radix 一模一样，实际却是 Base UI。迁移过组件库的项目里，API 表面相似不代表行为一致。遇到&amp;quot;诡异渲染&amp;quot;，直接去 &lt;code>node_modules&lt;/code> 里读类型定义和实现，比对着代码猜快得多。&lt;/li>
&lt;li>&lt;strong>哨兵值要就地翻译。&lt;/strong> &lt;code>_all&lt;/code>、&lt;code>__custom__&lt;/code> 这类哨兵值是很好的状态设计，但必须配一层显式的 value → 文案映射，不能指望组件库帮你回取选中项文本——它可能根本没这个功能。&lt;/li>
&lt;li>&lt;strong>修一处，扫全仓。&lt;/strong> 库级行为差异是&amp;quot;批发生产&amp;quot;bug 的，按「value ≠ 展示文案」的模式全仓扫一遍，一次清干净，比等用户一个个报上来体面得多。&lt;/li>
&lt;/ol></description></item><item><title>AI 前端调试技巧：把被遮挡翻译成尺寸约束</title><link>https://www.zata.cc/p/ai-%E5%89%8D%E7%AB%AF%E8%B0%83%E8%AF%95%E6%8A%80%E5%B7%A7%E6%8A%8A%E8%A2%AB%E9%81%AE%E6%8C%A1%E7%BF%BB%E8%AF%91%E6%88%90%E5%B0%BA%E5%AF%B8%E7%BA%A6%E6%9D%9F/</link><pubDate>Thu, 25 Jun 2026 11:34:35 +0800</pubDate><guid>https://www.zata.cc/p/ai-%E5%89%8D%E7%AB%AF%E8%B0%83%E8%AF%95%E6%8A%80%E5%B7%A7%E6%8A%8A%E8%A2%AB%E9%81%AE%E6%8C%A1%E7%BF%BB%E8%AF%91%E6%88%90%E5%B0%BA%E5%AF%B8%E7%BA%A6%E6%9D%9F/</guid><description>&lt;img src="https://www.zata.cc/p/ai-%E5%89%8D%E7%AB%AF%E8%B0%83%E8%AF%95%E6%8A%80%E5%B7%A7%E6%8A%8A%E8%A2%AB%E9%81%AE%E6%8C%A1%E7%BF%BB%E8%AF%91%E6%88%90%E5%B0%BA%E5%AF%B8%E7%BA%A6%E6%9D%9F/images/index/index.svg" alt="Featured image of post AI 前端调试技巧：把被遮挡翻译成尺寸约束" />&lt;h2 id="问题场景">问题场景
&lt;/h2>&lt;p>用 AI 写前端时，经常遇到这样一种情况：&lt;/p>
&lt;blockquote>
&lt;p>页面上有一个大块（比如卡片、弹窗、侧边栏），它的一部分被上层元素遮挡了，显示不完整。&lt;/p>
&lt;/blockquote>
&lt;p>你告诉 AI：&amp;ldquo;这个块被上层遮挡了，你修复一下。&amp;rdquo; 结果 AI 开始一顿操作：加 &lt;code>z-index&lt;/code>、改 &lt;code>position&lt;/code>、调 &lt;code>overflow&lt;/code>、甚至重构整个布局。改完之后，问题可能还在，或者引入了新的样式问题。&lt;/p>
&lt;h2 id="一个更有效的说法">一个更有效的说法
&lt;/h2>&lt;p>后来我换了一种说法，效果立刻变好了：&lt;/p>
&lt;blockquote>
&lt;p>你先固定这个块的宽度，然后把这个块里面的 A 元素和 B 元素的宽度变小。&lt;/p>
&lt;/blockquote>
&lt;p>AI 听到这句话后，不再需要猜测&amp;quot;被遮挡&amp;quot;到底意味着什么，它只需要做两件非常具体的事：&lt;/p>
&lt;ol>
&lt;li>给外层块一个固定的宽度；&lt;/li>
&lt;li>把内部 A、B 两个元素的宽度调小。&lt;/li>
&lt;/ol>
&lt;p>问题就这样被稳定地修复了。&lt;/p>
&lt;h2 id="为什么这个方法有效">为什么这个方法有效
&lt;/h2>&lt;p>AI 处理视觉描述时，对抽象词（&amp;ldquo;遮挡&amp;rdquo;、&amp;ldquo;错位&amp;rdquo;、&amp;ldquo;不好看&amp;rdquo;）的解读空间很大，容易走偏。但如果你把问题翻译成&lt;strong>可执行的尺寸约束&lt;/strong>，AI 的修改范围就被限定了：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>固定外层宽度&lt;/strong>：先消除一个变量，避免 AI 盲目地改来改去。&lt;/li>
&lt;li>&lt;strong>缩小内部元素宽度&lt;/strong>：给出明确的调整方向，让内容在有限空间内重新排布。&lt;/li>
&lt;/ul>
&lt;p>这其实是把视觉问题变成了一个&lt;strong>约束优化问题&lt;/strong>，而不是自由发挥的布局重构。&lt;/p>
&lt;h2 id="可复用的提示词模板">可复用的提示词模板
&lt;/h2>&lt;p>把这个思路抽象一下，可以得到一个通用模板：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">请修复以下问题：
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">1. 先固定 [外层元素] 的宽度为 [具体值或百分比]；
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">2. 然后减小 [内部元素A] 和 [内部元素B] 的宽度，使它们不被遮挡。
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">不要修改 z-index、position 或 overflow，只调整宽度相关的样式。
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="更多适用场景">更多适用场景
&lt;/h2>&lt;p>这个思路不只适用于&amp;quot;被遮挡&amp;quot;，还可以推广到其他前端微调场景：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>你原本可能说的&lt;/th>
&lt;th>更有效的说法&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>这行文字换行了&lt;/td>
&lt;td>容器宽度固定为 200px，字体大小减小 1px&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>这个图标没对齐&lt;/td>
&lt;td>把 A 的 &lt;code>margin-left&lt;/code> 设为和 B 相同&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>滚动条太丑&lt;/td>
&lt;td>外层固定高度，内部子元素高度减小 10px&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>按钮被挤下去了&lt;/td>
&lt;td>容器宽度固定，按钮之间的 &lt;code>gap&lt;/code> 减小 4px&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>表格列太宽&lt;/td>
&lt;td>给表格容器固定宽度，指定每列的 &lt;code>min-width&lt;/code> 和 &lt;code>max-width&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>核心原则是一致的：&lt;strong>把感受翻译成数值，把现象翻译成约束&lt;/strong>。&lt;/p>
&lt;h2 id="总结">总结
&lt;/h2>&lt;p>和 AI 协作写前端时，&amp;ldquo;被遮挡&amp;quot;这类描述对它来说太模糊。把它翻译成：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>先固定外层宽度，再缩小内部元素宽度&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>AI 就能在清晰的约束下给出稳定的修复。这个技巧很小，但非常实用，值得写进你的 Vibe Coding 工具箱里。&lt;/p></description></item><item><title>用 AI 打造惊艳前端：从 Vibe Coding 到实战的艺术指南</title><link>https://www.zata.cc/p/%E7%94%A8-ai-%E6%89%93%E9%80%A0%E6%83%8A%E8%89%B3%E5%89%8D%E7%AB%AF%E4%BB%8E-vibe-coding-%E5%88%B0%E5%AE%9E%E6%88%98%E7%9A%84%E8%89%BA%E6%9C%AF%E6%8C%87%E5%8D%97/</link><pubDate>Wed, 11 Jun 2025 18:30:00 +0800</pubDate><guid>https://www.zata.cc/p/%E7%94%A8-ai-%E6%89%93%E9%80%A0%E6%83%8A%E8%89%B3%E5%89%8D%E7%AB%AF%E4%BB%8E-vibe-coding-%E5%88%B0%E5%AE%9E%E6%88%98%E7%9A%84%E8%89%BA%E6%9C%AF%E6%8C%87%E5%8D%97/</guid><description>&lt;img src="https://www.zata.cc/p/%E7%94%A8-ai-%E6%89%93%E9%80%A0%E6%83%8A%E8%89%B3%E5%89%8D%E7%AB%AF%E4%BB%8E-vibe-coding-%E5%88%B0%E5%AE%9E%E6%88%98%E7%9A%84%E8%89%BA%E6%9C%AF%E6%8C%87%E5%8D%97/images/index/index.png" alt="Featured image of post 用 AI 打造惊艳前端：从 Vibe Coding 到实战的艺术指南" />&lt;h2 id="-引言当创意遇见-ai">🎨 引言：当创意遇见 AI
&lt;/h2>&lt;p>还记得那些深夜对着空白编辑器发愁的日子吗？你脑海中有一个绝妙的界面设计，但从想法到实现，往往需要数小时甚至数天的编码工作。&lt;/p>
&lt;p>&lt;strong>Vibe Coding&lt;/strong> 正在改变这一切。&lt;/p>
&lt;p>这不是传统意义上的&amp;quot;写代码&amp;quot;，而是一种全新的创作方式：&lt;strong>你描述想法，AI 生成代码，你负责审美和创意把控&lt;/strong>。就像指挥家指挥乐团，你不需要会演奏每一种乐器，但你能创造出美妙的音乐。&lt;/p>
&lt;p>本文将带你深入探索 AI 辅助前端开发的世界，从工具选择到实战技巧，从开源项目学习到最佳实践，让你掌握这门新兴的艺术。&lt;/p>
&lt;hr>
&lt;h2 id="-github-上的宝藏项目">🔍 GitHub 上的宝藏项目
&lt;/h2>&lt;p>在开始之前，让我们先看看 GitHub 上那些闪耀的明星项目，它们代表了 AI 前端开发的最高水平。&lt;/p>
&lt;h3 id="-顶级开源项目一览">📊 顶级开源项目一览
&lt;/h3>&lt;table>
&lt;thead>
&lt;tr>
&lt;th>项目名称&lt;/th>
&lt;th>⭐ Stars&lt;/th>
&lt;th>核心功能&lt;/th>
&lt;th>适用场景&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>&lt;a class="link" href="https://github.com/abi/screenshot-to-code" target="_blank" rel="noopener"
>screenshot-to-code&lt;/a>&lt;/strong>&lt;/td>
&lt;td>72.8k&lt;/td>
&lt;td>截图转代码&lt;/td>
&lt;td>快速复刻设计稿&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>&lt;a class="link" href="https://github.com/shanraisshan/claude-code-best-practice" target="_blank" rel="noopener"
>claude-code-best-practice&lt;/a>&lt;/strong>&lt;/td>
&lt;td>57.4k&lt;/td>
&lt;td>Claude Code 最佳实践&lt;/td>
&lt;td>Vibe Coding 入门到精通&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>&lt;a class="link" href="https://github.com/2025Emma/vibe-coding-cn" target="_blank" rel="noopener"
>vibe-coding-cn&lt;/a>&lt;/strong>&lt;/td>
&lt;td>21.6k&lt;/td>
&lt;td>中文 Vibe Coding 教程&lt;/td>
&lt;td>零基础学习&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>&lt;a class="link" href="https://github.com/datawhalechina/easy-vibe" target="_blank" rel="noopener"
>easy-vibe&lt;/a>&lt;/strong>&lt;/td>
&lt;td>16.8k&lt;/td>
&lt;td>系统化教程&lt;/td>
&lt;td>从零到全栈&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>&lt;a class="link" href="https://github.com/coleam00/context-engineering-intro" target="_blank" rel="noopener"
>context-engineering-intro&lt;/a>&lt;/strong>&lt;/td>
&lt;td>13.4k&lt;/td>
&lt;td>上下文工程&lt;/td>
&lt;td>AI 编程的核心技巧&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>这些项目不仅是工具，更是学习 Vibe Coding 思维的绝佳教材。让我们深入分析几个关键项目。&lt;/p>
&lt;h3 id="-screenshot-to-code视觉到代码的魔法">🌟 screenshot-to-code：视觉到代码的魔法
&lt;/h3>&lt;p>&lt;strong>项目地址&lt;/strong>：https://github.com/abi/screenshot-to-code&lt;/p>
&lt;p>这是目前最火的 AI 前端工具之一，&lt;strong>72.8k stars&lt;/strong> 足以说明它的价值。&lt;/p>
&lt;h4 id="工作原理">工作原理
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">截图 → GPT-4 Vision 分析 → 生成 HTML/Tailwind/React/Vue 代码 → 实时预览
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="支持的技术栈">支持的技术栈
&lt;/h4>&lt;ul>
&lt;li>&lt;strong>HTML + Tailwind CSS&lt;/strong>（默认）&lt;/li>
&lt;li>&lt;strong>React + Tailwind CSS&lt;/strong>&lt;/li>
&lt;li>&lt;strong>Vue + Tailwind CSS&lt;/strong>&lt;/li>
&lt;li>&lt;strong>Bootstrap&lt;/strong>&lt;/li>
&lt;li>&lt;strong>Windi CSS&lt;/strong>&lt;/li>
&lt;/ul>
&lt;h4 id="实战价值">实战价值
&lt;/h4>&lt;p>想象一下这个场景：&lt;/p>
&lt;ul>
&lt;li>你在 Dribbble 上看到一个惊艳的着陆页设计&lt;/li>
&lt;li>截图上传到 screenshot-to-code&lt;/li>
&lt;li>30秒后，你得到了可运行的代码&lt;/li>
&lt;li>再用 Claude Code 调整细节&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>这不再是未来，而是现在就能实现的开发流程。&lt;/strong>&lt;/p>
&lt;h3 id="-claude-code-best-practicevibe-coding-的圣经">🚀 claude-code-best-practice：Vibe Coding 的圣经
&lt;/h3>&lt;p>&lt;strong>项目地址&lt;/strong>：https://github.com/shanraisshan/claude-code-best-practice&lt;/p>
&lt;p>&lt;strong>57.4k stars&lt;/strong>，这个项目的副标题完美诠释了 Vibe Coding 的精髓：&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;from vibe coding to agentic engineering - practice makes claude perfect&amp;rdquo;&lt;/p>
&lt;/blockquote>
&lt;h4 id="核心理念">核心理念
&lt;/h4>&lt;ol>
&lt;li>&lt;strong>Vibe Coding&lt;/strong>：凭感觉写代码，让 AI 处理细节&lt;/li>
&lt;li>&lt;strong>Agentic Engineering&lt;/strong>：从单次生成到系统性工程&lt;/li>
&lt;li>&lt;strong>Practice Makes Perfect&lt;/strong>：持续迭代，越用越强&lt;/li>
&lt;/ol>
&lt;h4 id="关键技巧">关键技巧
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-markdown" data-lang="markdown">&lt;span class="line">&lt;span class="cl">&lt;span class="gh"># ❌ 错误的 Prompt
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gh">&lt;/span>&amp;#34;帮我做一个好看的页面&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gh"># ✅ 好的 Prompt
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gh">&lt;/span>&amp;#34;创建一个现代化的 SaaS 着陆页，使用：
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> 深色主题，主色调 &lt;span class="ni">#667eea&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> Hero 区域包含渐变背景、CTA 按钮
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> 特性展示区使用 3 列卡片布局
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> 技术栈：Next.js 14 + Tailwind CSS + Framer Motion
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> 参考 Vercel 官网的设计风格&amp;#34;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="-工具链打造你的-ai-前端工作流">🛠️ 工具链：打造你的 AI 前端工作流
&lt;/h2>&lt;h3 id="1-核心工具选择">1️⃣ 核心工具选择
&lt;/h3>&lt;h4 id="claude-code---最强编程助手">&lt;strong>Claude Code&lt;/strong> - 最强编程助手
&lt;/h4>&lt;p>&lt;strong>优势&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>✅ 超长上下文（200K tokens）&lt;/li>
&lt;li>✅ 理解复杂项目结构&lt;/li>
&lt;li>✅ 直接操作文件系统&lt;/li>
&lt;li>✅ 支持增量修改&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>适用场景&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>从零开始构建项目&lt;/li>
&lt;li>重构现有代码&lt;/li>
&lt;li>复杂组件开发&lt;/li>
&lt;li>设计系统实现&lt;/li>
&lt;/ul>
&lt;h4 id="cursor---ai-原生编辑器">&lt;strong>Cursor&lt;/strong> - AI 原生编辑器
&lt;/h4>&lt;p>&lt;strong>优势&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>✅ VS Code 的完美替代&lt;/li>
&lt;li>✅ 内置 AI 对话&lt;/li>
&lt;li>✅ 多文件编辑&lt;/li>
&lt;li>✅ 代码补全&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>适用场景&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>日常开发工作&lt;/li>
&lt;li>快速原型迭代&lt;/li>
&lt;li>团队协作&lt;/li>
&lt;/ul>
&lt;h4 id="v0dev---vercel-的-ai-ui-生成器">&lt;strong>v0.dev&lt;/strong> - Vercel 的 AI UI 生成器
&lt;/h4>&lt;p>&lt;strong>优势&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>✅ 文字描述生成 UI&lt;/li>
&lt;li>✅ 实时预览&lt;/li>
&lt;li>✅ 直接部署到 Vercel&lt;/li>
&lt;li>✅ 集成 shadcn/ui&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>适用场景&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>快速原型设计&lt;/li>
&lt;li>组件库探索&lt;/li>
&lt;li>着陆页生成&lt;/li>
&lt;/ul>
&lt;h4 id="screenshot-to-code---设计稿转代码">&lt;strong>screenshot-to-code&lt;/strong> - 设计稿转代码
&lt;/h4>&lt;p>&lt;strong>优势&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>✅ 支持多种框架&lt;/li>
&lt;li>✅ 高度还原设计&lt;/li>
&lt;li>✅ 可定制性强&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>适用场景&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>复刻设计灵感&lt;/li>
&lt;li>快速启动项目&lt;/li>
&lt;li>设计师协作&lt;/li>
&lt;/ul>
&lt;h3 id="2-推荐工作流">2️⃣ 推荐工作流
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">设计灵感 → v0.dev/screenshot-to-code → 生成基础代码
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Claude Code 优化
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Cursor 精细调整
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 本地预览 &amp;amp; 部署
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="-实战案例30分钟打造惊艳的着陆页">💡 实战案例：30分钟打造惊艳的着陆页
&lt;/h2>&lt;p>让我们用一个实际案例来演示完整流程。&lt;/p>
&lt;h3 id="step-1明确需求2分钟">Step 1：明确需求（2分钟）
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-markdown" data-lang="markdown">&lt;span class="line">&lt;span class="cl">项目：AI 写作助手着陆页
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">风格：现代、简洁、科技感
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">颜色：渐变紫色系 (&lt;span class="ni">#667eea&lt;/span> → &lt;span class="ni">#764ba2&lt;/span>)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">必需元素：
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> Hero 区：标题 + 副标题 + CTA 按钮
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> 特性展示：3 个核心功能卡片
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> 社会证明：用户评价
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> 定价方案：3 个档位
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">技术栈：Next.js 14 + Tailwind CSS + Framer Motion
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="step-2快速生成5分钟">Step 2：快速生成（5分钟）
&lt;/h3>&lt;h4 id="方案-a使用-v0dev">方案 A：使用 v0.dev
&lt;/h4>&lt;p>访问 &lt;a class="link" href="https://v0.dev" target="_blank" rel="noopener"
>v0.dev&lt;/a>，输入：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">Create a modern SaaS landing page for an AI writing assistant.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Design requirements:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- Gradient background from purple #667eea to #764ba2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- Dark theme
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- Hero section with animated gradient text
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- Features section with 3 cards using glassmorphism effect
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- Testimonials carousel
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- Pricing table with 3 tiers
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- Footer with social links
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Tech stack: Next.js 14, Tailwind CSS, Framer Motion
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Style reference: Linear.app, Vercel.com
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="方案-b使用-claude-code">方案 B：使用 Claude Code
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 创建项目&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npx create-next-app@latest ai-writer-landing --typescript --tailwind --app
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 进入项目&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ai-writer-landing
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 启动 Claude Code&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">claude
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>输入详细 Prompt：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">创建一个 AI 写作助手的着陆页，包含以下部分：
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">1. **Hero 区域**：
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - 渐变背景（#667eea → #764ba2）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - 大标题：&amp;#34;用 AI 释放你的写作潜能&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - 副标题：&amp;#34;智能改写、续写、润色，让每一篇文章都成为杰作&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - 两个 CTA 按钮：&amp;#34;免费试用&amp;#34;（主按钮）和&amp;#34;了解更多&amp;#34;（次按钮）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - 产品截图占位区域
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">2. **特性展示区**：
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - 3 列网格布局
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - 每个卡片使用 glassmorphism 效果
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - 图标使用 Lucide React
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - 特性：智能改写、多种风格、实时预览
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">3. **社会证明区**：
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - 用户头像 + 名字 + 职位
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - 评价内容（3 条）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - 使用卡片轮播布局
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">4. **定价区**：
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - 3 个定价卡片
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - 中间卡片突出显示（推荐）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - 包含：免费版、专业版、企业版
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">5. **Footer**：
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Logo + 版权信息
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - 社交媒体链接
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - 快速链接
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">技术要求：
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- 使用 Next.js 14 App Router
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- Tailwind CSS 样式
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- Framer Motion 动画
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- Lucide React 图标
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- 响应式设计（移动端优先）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- 添加滚动动画效果
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- 深色主题
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="step-3优化细节15分钟">Step 3：优化细节（15分钟）
&lt;/h3>&lt;h4 id="添加动画效果">添加动画效果
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-typescript" data-lang="typescript">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// components/hero.tsx
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="s2">&amp;#34;use client&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">import&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">motion&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="kr">from&lt;/span> &lt;span class="s2">&amp;#34;framer-motion&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">export&lt;/span> &lt;span class="kd">function&lt;/span> &lt;span class="nx">Hero() {&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">section&lt;/span> &lt;span class="na">className&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;relative min-h-screen flex items-center justify-center overflow-hidden&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>&lt;span class="cm">/* 渐变背景 */&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">div&lt;/span> &lt;span class="na">className&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;absolute inset-0 bg-gradient-to-br from-purple-600 via-purple-700 to-indigo-800&amp;#34;&lt;/span> &lt;span class="p">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>&lt;span class="cm">/* 动画粒子效果 */&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">div&lt;/span> &lt;span class="na">className&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;absolute inset-0&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{[...&lt;/span>&lt;span class="nb">Array&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">20&lt;/span>&lt;span class="p">)].&lt;/span>&lt;span class="nx">map&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="nx">_&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">i&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">=&amp;gt;&lt;/span> &lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">motion.div&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">key&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="nx">i&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">className&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;absolute w-2 h-2 bg-white rounded-full opacity-20&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">initial&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">{{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">x&lt;/span>: &lt;span class="kt">Math.random&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="mi">100&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;%&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">y&lt;/span>: &lt;span class="kt">Math.random&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="mi">100&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;%&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">animate&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">{{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">y&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="kc">null&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nb">Math&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">random&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="mi">100&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;%&amp;#34;&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">opacity&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="mf">0.2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mf">0.8&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mf">0.2&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">transition&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">{{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">duration&lt;/span>: &lt;span class="kt">Math.random&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="mi">3&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">repeat&lt;/span>: &lt;span class="kt">Infinity&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">ease&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;linear&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">))}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">div&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">div&lt;/span> &lt;span class="na">className&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;relative z-10 text-center px-4&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">motion.h1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">initial&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">{{&lt;/span> &lt;span class="nx">opacity&lt;/span>: &lt;span class="kt">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">y&lt;/span>: &lt;span class="kt">20&lt;/span> &lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">animate&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">{{&lt;/span> &lt;span class="nx">opacity&lt;/span>: &lt;span class="kt">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">y&lt;/span>: &lt;span class="kt">0&lt;/span> &lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">transition&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">{{&lt;/span> &lt;span class="nx">duration&lt;/span>: &lt;span class="kt">0.8&lt;/span> &lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">className&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;text-5xl md:text-7xl font-bold text-white mb-6&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="err">用&lt;/span> &lt;span class="nx">AI&lt;/span> &lt;span class="err">释放你的&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">span&lt;/span> &lt;span class="na">className&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;bg-clip-text text-transparent bg-gradient-to-r from-pink-300 to-purple-200&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="err">写作潜能&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">span&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">motion.h1&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">motion.p&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">initial&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">{{&lt;/span> &lt;span class="nx">opacity&lt;/span>: &lt;span class="kt">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">y&lt;/span>: &lt;span class="kt">20&lt;/span> &lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">animate&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">{{&lt;/span> &lt;span class="nx">opacity&lt;/span>: &lt;span class="kt">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">y&lt;/span>: &lt;span class="kt">0&lt;/span> &lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">transition&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">{{&lt;/span> &lt;span class="nx">duration&lt;/span>: &lt;span class="kt">0.8&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">delay&lt;/span>: &lt;span class="kt">0.2&lt;/span> &lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">className&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;text-xl text-purple-100 mb-8&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="err">智能改写、续写、润色，让每一篇文章都成为杰作&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">motion.p&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">motion.div&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">initial&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">{{&lt;/span> &lt;span class="nx">opacity&lt;/span>: &lt;span class="kt">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">y&lt;/span>: &lt;span class="kt">20&lt;/span> &lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">animate&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">{{&lt;/span> &lt;span class="nx">opacity&lt;/span>: &lt;span class="kt">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">y&lt;/span>: &lt;span class="kt">0&lt;/span> &lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">transition&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">{{&lt;/span> &lt;span class="nx">duration&lt;/span>: &lt;span class="kt">0.8&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">delay&lt;/span>: &lt;span class="kt">0.4&lt;/span> &lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">className&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;flex gap-4 justify-center&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">button&lt;/span> &lt;span class="na">className&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;px-8 py-3 bg-white text-purple-700 rounded-full font-semibold hover:bg-opacity-90 transition-all hover:scale-105&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="err">免费试用&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">button&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">button&lt;/span> &lt;span class="na">className&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;px-8 py-3 border border-white text-white rounded-full font-semibold hover:bg-white hover:bg-opacity-10 transition-all&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="err">了解更多&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">button&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">motion.div&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">div&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">section&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="添加-glassmorphism-卡片">添加 Glassmorphism 卡片
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-typescript" data-lang="typescript">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// components/feature-card.tsx
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="kr">import&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">motion&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="kr">from&lt;/span> &lt;span class="s2">&amp;#34;framer-motion&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">import&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">LucideIcon&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="kr">from&lt;/span> &lt;span class="s2">&amp;#34;lucide-react&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">interface&lt;/span> &lt;span class="nx">FeatureCardProps&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">icon&lt;/span>: &lt;span class="kt">LucideIcon&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">title&lt;/span>: &lt;span class="kt">string&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">description&lt;/span>: &lt;span class="kt">string&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">delay&lt;/span>: &lt;span class="kt">number&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">export&lt;/span> &lt;span class="kd">function&lt;/span> &lt;span class="nx">FeatureCard&lt;/span>&lt;span class="p">({&lt;/span> &lt;span class="nx">icon&lt;/span>: &lt;span class="kt">Icon&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">title&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">description&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">delay&lt;/span> &lt;span class="p">}&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="nx">FeatureCardProps&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">motion.div&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">initial&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">{{&lt;/span> &lt;span class="nx">opacity&lt;/span>: &lt;span class="kt">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">y&lt;/span>: &lt;span class="kt">20&lt;/span> &lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">whileInView&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">{{&lt;/span> &lt;span class="nx">opacity&lt;/span>: &lt;span class="kt">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">y&lt;/span>: &lt;span class="kt">0&lt;/span> &lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">transition&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">{{&lt;/span> &lt;span class="nx">duration&lt;/span>: &lt;span class="kt">0.5&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">delay&lt;/span> &lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">viewport&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">{{&lt;/span> &lt;span class="nx">once&lt;/span>: &lt;span class="kt">true&lt;/span> &lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">className&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;relative group&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">div&lt;/span> &lt;span class="na">className&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;absolute inset-0 bg-gradient-to-r from-purple-400 to-pink-400 rounded-2xl blur-xl opacity-20 group-hover:opacity-30 transition-opacity&amp;#34;&lt;/span> &lt;span class="p">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">div&lt;/span> &lt;span class="na">className&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;relative backdrop-blur-xl bg-white/10 rounded-2xl p-8 border border-white/20 hover:border-white/30 transition-all&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">div&lt;/span> &lt;span class="na">className&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;w-12 h-12 bg-gradient-to-br from-purple-400 to-pink-400 rounded-xl flex items-center justify-center mb-4&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">Icon&lt;/span> &lt;span class="na">className&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;w-6 h-6 text-white&amp;#34;&lt;/span> &lt;span class="p">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">div&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">h3&lt;/span> &lt;span class="na">className&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;text-xl font-semibold text-white mb-2&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;{&lt;/span>&lt;span class="nx">title&lt;/span>&lt;span class="p">}&amp;lt;/&lt;/span>&lt;span class="nt">h3&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">p&lt;/span> &lt;span class="na">className&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;text-purple-100&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;{&lt;/span>&lt;span class="nx">description&lt;/span>&lt;span class="p">}&amp;lt;/&lt;/span>&lt;span class="nt">p&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">div&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">motion.div&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="step-4性能优化5分钟">Step 4：性能优化（5分钟）
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-typescript" data-lang="typescript">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// 添加懒加载
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="kr">import&lt;/span> &lt;span class="nx">dynamic&lt;/span> &lt;span class="kr">from&lt;/span> &lt;span class="s2">&amp;#34;next/dynamic&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">const&lt;/span> &lt;span class="nx">Testimonials&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">dynamic&lt;/span>&lt;span class="p">(()&lt;/span> &lt;span class="o">=&amp;gt;&lt;/span> &lt;span class="kr">import&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;@/components/testimonials&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">loading&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">()&lt;/span> &lt;span class="o">=&amp;gt;&lt;/span> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">div&lt;/span> &lt;span class="na">className&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;h-96 animate-pulse bg-purple-900/50 rounded-2xl&amp;#34;&lt;/span> &lt;span class="p">/&amp;gt;,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">ssr&lt;/span>: &lt;span class="kt">false&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// 图片优化
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="kr">import&lt;/span> &lt;span class="nx">Image&lt;/span> &lt;span class="kr">from&lt;/span> &lt;span class="s2">&amp;#34;next/image&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">Image&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">src&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;/hero-screenshot.png&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">alt&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;AI Writer Interface&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">width&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="mi">800&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">height&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="mi">600&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">priority&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">className&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;rounded-xl shadow-2xl&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// 字体优化
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="kr">import&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">Inter&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="kr">from&lt;/span> &lt;span class="s2">&amp;#34;next/font/google&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">const&lt;/span> &lt;span class="nx">inter&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">Inter&lt;/span>&lt;span class="p">({&lt;/span> &lt;span class="nx">subsets&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;latin&amp;#34;&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="nx">variable&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;--font-inter&amp;#34;&lt;/span> &lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="step-5部署上线3分钟">Step 5：部署上线（3分钟）
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 部署到 Vercel&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npx vercel
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 或者推送到 GitHub 后自动部署&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git add .
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git commit -feat: add AI writer landing page
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git push origin main
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="-进阶技巧让-ai-理解你的设计意图">🎓 进阶技巧：让 AI 理解你的设计意图
&lt;/h2>&lt;h3 id="技巧-1建立设计系统文档">技巧 1：建立设计系统文档
&lt;/h3>&lt;p>创建 &lt;code>DESIGN.md&lt;/code> 文件，让 AI 理解你的设计规范：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-markdown" data-lang="markdown">&lt;span class="line">&lt;span class="cl">&lt;span class="gh"># 设计系统规范
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gh">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">## 颜色系统
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">&lt;/span>&lt;span class="k">-&lt;/span> 主色：&lt;span class="ni">#667eea&lt;/span>（渐变紫）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> 次色：&lt;span class="ni">#764ba2&lt;/span>（深紫）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> 强调色：&lt;span class="ni">#f093fb&lt;/span>（粉色）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> 背景：&lt;span class="ni">#0f0f23&lt;/span>（深色）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> 文字：&lt;span class="ni">#ffffff&lt;/span> / &lt;span class="ni">#e0e0e0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">## 排版
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">&lt;/span>&lt;span class="k">-&lt;/span> 标题：Plus Jakarta Sans
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> 正文：Inter
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> 代码：JetBrains Mono
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">## 间距系统
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">&lt;/span>&lt;span class="k">-&lt;/span> 使用 Tailwind 默认间距
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> 卡片 padding: p-8
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> 区块间距：py-20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">## 组件风格
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">&lt;/span>&lt;span class="k">-&lt;/span> 卡片：glassmorphism + 渐变边框
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> 按钮：圆角全圆 (rounded-full)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> 输入框：半透明背景 + 白色边框
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">## 动画
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">&lt;/span>&lt;span class="k">-&lt;/span> 持续时间：0.3s - 0.8s
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> 缓动函数：ease-out
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> 进入动画：fade-in + slide-up
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="技巧-2使用参考链接">技巧 2：使用参考链接
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">创建一个特性展示区，风格参考：
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- Linear.app 的特性卡片
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- 使用 glassmorphism 效果
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- 添加 hover 时的光晕效果
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- 图标使用 Lucide React
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">参考网址：https://linear.app
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="技巧-3迭代式优化">技巧 3：迭代式优化
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 第一轮&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">&amp;#34;创建一个基础的着陆页&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 第二轮&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">&amp;#34;给 Hero 区域添加渐变背景和动画效果&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 第三轮&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">&amp;#34;特性卡片使用 glassmorphism 风格，添加悬停效果&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 第四轮&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">&amp;#34;优化移动端显示，确保响应式布局&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="-学习资源推荐">📚 学习资源推荐
&lt;/h2>&lt;h3 id="github-项目">GitHub 项目
&lt;/h3>&lt;ol>
&lt;li>
&lt;p>&lt;strong>&lt;a class="link" href="https://github.com/filipecalegario/awesome-vibe-coding" target="_blank" rel="noopener"
>awesome-vibe-coding&lt;/a>&lt;/strong> (4.7k ⭐)&lt;/p>
&lt;ul>
&lt;li>Vibe Coding 精选资源列表&lt;/li>
&lt;li>包含工具、教程、案例&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a class="link" href="https://github.com/cloudflare/vibesdk" target="_blank" rel="noopener"
>vibesdk&lt;/a>&lt;/strong> (5.1k ⭐)&lt;/p>
&lt;ul>
&lt;li>Cloudflare 开源的 Vibe Coding 平台&lt;/li>
&lt;li>可自托管&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a class="link" href="https://github.com/zarazhangrui/codebase-to-course" target="_blank" rel="noopener"
>codebase-to-course&lt;/a>&lt;/strong> (4.6k ⭐)&lt;/p>
&lt;ul>
&lt;li>将代码库转换为交互式教程&lt;/li>
&lt;li>适合非技术背景的 Vibe Coders&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a class="link" href="https://github.com/liyupi/ai-guide" target="_blank" rel="noopener"
>ai-guide&lt;/a>&lt;/strong> (15.6k ⭐)&lt;/p>
&lt;ul>
&lt;li>程序员鱼皮的 AI 资源大全&lt;/li>
&lt;li>包含 Cursor / Claude Code 教程&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;h3 id="在线教程">在线教程
&lt;/h3>&lt;ul>
&lt;li>&lt;strong>&lt;a class="link" href="https://www.vibevibe.cn" target="_blank" rel="noopener"
>Vibe Vibe&lt;/a>&lt;/strong> - 首个系统化 Vibe Coding 开源教程&lt;/li>
&lt;li>&lt;strong>&lt;a class="link" href="https://github.com/datawhalechina/easy-vibe" target="_blank" rel="noopener"
>easy-vibe&lt;/a>&lt;/strong> - 零基础到全栈实战&lt;/li>
&lt;/ul>
&lt;h3 id="设计灵感网站">设计灵感网站
&lt;/h3>&lt;ul>
&lt;li>&lt;strong>&lt;a class="link" href="https://dribbble.com" target="_blank" rel="noopener"
>Dribbble&lt;/a>&lt;/strong> - 设计师作品展示&lt;/li>
&lt;li>&lt;strong>&lt;a class="link" href="https://mobbin.design" target="_blank" rel="noopener"
>Mobbin&lt;/a>&lt;/strong> - 移动端 UI 参考&lt;/li>
&lt;li>&lt;strong>&lt;a class="link" href="https://land-book.com" target="_blank" rel="noopener"
>Land-book&lt;/a>&lt;/strong> - 着陆页设计灵感&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="-关键要点总结">🎯 关键要点总结
&lt;/h2>&lt;h3 id="vibe-coding-的核心原则">Vibe Coding 的核心原则
&lt;/h3>&lt;table>
&lt;thead>
&lt;tr>
&lt;th>原则&lt;/th>
&lt;th>说明&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>描述清晰&lt;/strong>&lt;/td>
&lt;td>用自然语言详细描述你的需求&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>迭代优化&lt;/strong>&lt;/td>
&lt;td>不要期望一次完美，逐步改进&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>建立系统&lt;/strong>&lt;/td>
&lt;td>创建设计规范文档，让 AI 学习你的风格&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>善用参考&lt;/strong>&lt;/td>
&lt;td>提供设计参考链接和示例&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>快速验证&lt;/strong>&lt;/td>
&lt;td>先生成原型，再优化细节&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="工具选择指南">工具选择指南
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">快速原型 → v0.dev / screenshot-to-code
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">复杂项目 → Claude Code
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">日常开发 → Cursor
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">团队协作 → Cursor + Claude Code
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="避坑指南">避坑指南
&lt;/h3>&lt;p>❌ &lt;strong>不要做的&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>提供模糊的需求（&amp;ldquo;做一个好看的页面&amp;rdquo;）&lt;/li>
&lt;li>忽略技术栈限制&lt;/li>
&lt;li>不建立设计规范&lt;/li>
&lt;li>期望 AI 一次生成完美代码&lt;/li>
&lt;/ul>
&lt;p>✅ &lt;strong>应该做的&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>提供详细的设计要求&lt;/li>
&lt;li>明确技术栈和限制&lt;/li>
&lt;li>建立设计系统文档&lt;/li>
&lt;li>迭代式优化&lt;/li>
&lt;li>学习优秀开源项目&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="-结语从今天开始你的-vibe-coding-之旅">🚀 结语：从今天开始你的 Vibe Coding 之旅
&lt;/h2>&lt;p>Vibe Coding 不是要取代程序员，而是&lt;strong>让每个人都能成为创造者&lt;/strong>。&lt;/p>
&lt;ul>
&lt;li>设计师可以快速实现想法&lt;/li>
&lt;li>产品经理可以独立构建原型&lt;/li>
&lt;li>创业者可以快速验证 MVP&lt;/li>
&lt;li>开发者可以提升 10 倍效率&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>核心不在于你是否精通编程，而在于你是否有想法。&lt;/strong>&lt;/p>
&lt;p>现在，打开你的 Claude Code 或 Cursor，开始你的第一次 Vibe Coding 吧！&lt;/p>
&lt;hr>
&lt;h2 id="-延伸阅读">📖 延伸阅读
&lt;/h2>&lt;ul>
&lt;li>&lt;a class="link" href="https://docs.anthropic.com/claude/docs" target="_blank" rel="noopener"
>Claude Code 官方文档&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://cursor.sh/docs" target="_blank" rel="noopener"
>Cursor 使用指南&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://v0.dev/docs" target="_blank" rel="noopener"
>v0.dev 快速开始&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://tailwindcss.com/docs" target="_blank" rel="noopener"
>Tailwind CSS 文档&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://www.framer.com/motion" target="_blank" rel="noopener"
>Framer Motion 动画库&lt;/a>&lt;/li>
&lt;/ul>
&lt;hr>
&lt;p>&lt;strong>Happy Vibe Coding! 🎨✨&lt;/strong>&lt;/p>
&lt;blockquote>
&lt;p>如果这篇文章对你有帮助，欢迎分享给更多朋友。有问题欢迎在评论区讨论！&lt;/p>
&lt;/blockquote></description></item></channel></rss>