@windrun-huaiin/diaomao 15.0.0 → 16.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,12 +1,30 @@
1
1
  {
2
2
  "i18n": {
3
- "locales": ["en", "zh"],
3
+ "locales": ["en"],
4
4
  "defaultLocale": "en",
5
5
  "messageRoot": "messages"
6
6
  },
7
7
  "scan": {
8
8
  "include": ["src/**/*.{tsx,ts,jsx,js}"],
9
- "exclude": ["src/**/*.test.ts", "src/**/*.test.tsx", "src/**/*.d.ts", "node_modules/**", ".claude/**", ".gemini/**", ".codex/**", ".vscode/**", ".clerk/**"]
9
+ "exclude": ["src/**/*.test.ts", "src/**/*.test.tsx", "src/**/*.d.ts", "node_modules/**", ".claude/**", ".gemini/**", ".codex/**", ".vscode/**", ".clerk/**"],
10
+ "includeWindrunPackages": false,
11
+ "whitelist": ["footer.title", "home.email", "home.banner"],
12
+ "namespaceWhitelist": [
13
+ "usage",
14
+ "credit",
15
+ "gallery",
16
+ "faq",
17
+ "moneyPrice",
18
+ "features",
19
+ "tips",
20
+ "seoContent",
21
+ "cta",
22
+ "languageDetection",
23
+ "footer",
24
+ "clerk",
25
+ "fuma",
26
+ "pricePlan"
27
+ ]
10
28
  },
11
29
  "blog": {
12
30
  "mdxDir": "src/mdx/blog",
package/messages/en.json CHANGED
@@ -377,8 +377,8 @@
377
377
  "sitemap": "Sitemap",
378
378
  "contactUs": "Contact Us",
379
379
  "email": "xyb5to0zcy@gmail.com",
380
- "clickToCopyText": "Click to copy",
381
- "copiedText": "Copied!",
380
+ "clickToCopy": "Click to copy",
381
+ "copied": "Copied!",
382
382
  "thanks": "Thanks to"
383
383
  },
384
384
  "clerk": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@windrun-huaiin/diaomao",
3
- "version": "15.0.0",
3
+ "version": "16.0.1",
4
4
  "private": false,
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -28,9 +28,9 @@
28
28
  "@tailwindcss/typography": "^0.5.19",
29
29
  "@types/mdx": "^2.0.13",
30
30
  "@windrun-huaiin/backend-core": "15.1.0",
31
- "@windrun-huaiin/base-ui": "15.1.0",
32
- "@windrun-huaiin/lib": "15.1.0",
33
- "@windrun-huaiin/third-ui": "15.1.0",
31
+ "@windrun-huaiin/base-ui": "15.1.1",
32
+ "@windrun-huaiin/lib": "15.1.1",
33
+ "@windrun-huaiin/third-ui": "15.1.1",
34
34
  "autoprefixer": "^10.4.27",
35
35
  "class-variance-authority": "^0.7.1",
36
36
  "clsx": "^2.1.1",
@@ -41,7 +41,7 @@
41
41
  "fumadocs-typescript": "4.0.13",
42
42
  "fumadocs-ui": "16.0.9",
43
43
  "katex": "^0.16.33",
44
- "lucide-react": "^0.575.0",
44
+ "lucide-react": "^0.577.0",
45
45
  "mermaid": "11.12.1",
46
46
  "next": "16.1.6",
47
47
  "next-intl": "^4.8.3",
@@ -75,7 +75,7 @@
75
75
  "@types/react": "^19.2.14",
76
76
  "@types/react-dom": "^19.2.3",
77
77
  "@typescript-eslint/parser": "^8.56.1",
78
- "@windrun-huaiin/dev-scripts": "^15.1.0",
78
+ "@windrun-huaiin/dev-scripts": "^15.3.0",
79
79
  "baseline-browser-mapping": "^2.10.0",
80
80
  "eslint": "^9.39.1",
81
81
  "eslint-config-next": "^16.1.6",
@@ -131,9 +131,7 @@
131
131
  "djv": "pnpm changeset version",
132
132
  "djvp": "pnpm changeset publish",
133
133
  "generate-blog-index": "dev-scripts generate-blog-index -v",
134
- "check-translations": "dev-scripts check-translations -v",
135
- "clean-translations": "dev-scripts clean-translations -v",
136
- "remove-translations": "dev-scripts clean-translations --remove -v",
134
+ "i18n": "dev-scripts check-translations -v",
137
135
  "core-list-route": "dev-scripts backend-core routes:list",
138
136
  "core-sync-route": "dev-scripts backend-core routes:sync",
139
137
  "core-sync-schema": "dev-scripts backend-core prisma:sync",
@@ -1,50 +1,45 @@
1
1
  import { getTranslations } from 'next-intl/server'
2
2
  import { globalLucideIcons as icons} from '@windrun-huaiin/base-ui/components/server'
3
- import { themeHeroEyesOnClass } from '@windrun-huaiin/base-ui/lib'
4
- import { cn } from "@windrun-huaiin/lib"
5
3
  import { GradientButton } from "@windrun-huaiin/third-ui/fuma/mdx"
6
- import { DelayedImg } from "@windrun-huaiin/third-ui/main"
4
+ import { HeroMedia, HeroSection } from "@windrun-huaiin/third-ui/main";
5
+ import { themeHeroEyesOnClass } from '@windrun-huaiin/base-ui/lib'
6
+ import { cn } from '@windrun-huaiin/lib/utils';
7
7
 
8
8
  export async function Hero({ locale }: { locale: string }) {
9
9
  const t = await getTranslations({ locale, namespace: 'hero' });
10
10
 
11
11
  return (
12
- <section className="mx-auto mt-12 flex max-w-6xl flex-col gap-10 px-6 py-8 md:min-w-[calc(100vw-22rem)] md:px-4 md:flex-row md:items-center md:gap-12">
13
- <div className="space-y-6 md:w-1/2">
14
- <h1 className="text-4xl md:text-6xl font-bold leading-tight">
15
- {t('mainTitle')}<br />{" "}
16
- <span className={cn("text-transparent bg-clip-text", themeHeroEyesOnClass)}>{t('mainEyesOn')}</span>
17
- </h1>
18
- <p className="text-lg text-gray-400 max-w-2xl">
19
- {t('description')}
20
- </p>
21
- <GradientButton
22
- title={t('button')}
23
- href="https://newspaper-template.org/"
24
- align="center"
25
- className="md:w-full"
26
- />
27
- <div className="flex items-center gap-2 text-sm text-gray-400">
28
- <icons.Zap className="h-4 w-4" />
29
- <span>{t('about')}</span>
30
- </div>
31
- </div>
32
- <div className="relative flex justify-center md:w-1/2 md:justify-end">
33
- <div className="w-full max-w-[500px]">
34
- <div className="group relative aspect-890/569 overflow-hidden rounded-lg shadow-purple-500/20">
35
- <DelayedImg
36
- src={t('heroImageUrl')}
37
- alt={t('heroImageAlt')}
38
- fill
39
- preload
40
- sizes="(max-width: 768px) 90vw, (max-width: 1200px) 45vw, 35vw"
41
- className="rounded-lg object-cover group-hover:scale-105"
42
- wrapperClassName="h-full w-full"
43
- placeholderClassName="rounded-lg"
44
- />
12
+ <HeroSection
13
+ content={
14
+ <>
15
+ <h1 className="text-4xl font-bold leading-tight md:text-6xl">
16
+ {t('mainTitle')}<br />{" "}
17
+ <span className={cn("bg-clip-text text-transparent", themeHeroEyesOnClass)}>{t('mainEyesOn')}</span>
18
+ </h1>
19
+ <p className="max-w-2xl text-lg text-gray-400">
20
+ {t('description')}
21
+ </p>
22
+ <GradientButton
23
+ title={t('button')}
24
+ href="https://d8ger.com/test/color"
25
+ align="center"
26
+ className="md:w-full"
27
+ />
28
+ <div className="flex items-center gap-2 text-sm text-gray-400">
29
+ <icons.Zap className="h-4 w-4" />
30
+ <span>{t('about')}</span>
45
31
  </div>
46
- </div>
47
- </div>
48
- </section>
32
+ </>
33
+ }
34
+ media={
35
+ <HeroMedia
36
+ src={t('heroImageUrl')}
37
+ alt={t('heroImageAlt')}
38
+ width={890}
39
+ height={569}
40
+ preload
41
+ />
42
+ }
43
+ />
49
44
  )
50
45
  }
package/src/i18n.ts CHANGED
@@ -1,5 +1,7 @@
1
1
  import { getRequestConfig } from 'next-intl/server';
2
+ import path from 'path';
2
3
  import { appConfig } from "@/lib/appConfig";
4
+ import { loadMergedLocaleMessages, type RuntimeMessageSource } from '@windrun-huaiin/lib/i18n-server';
3
5
  import type { I18nConfig } from 'fumadocs-core/i18n';
4
6
 
5
7
  export const i18n: I18nConfig = {
@@ -10,6 +12,11 @@ export const i18n: I18nConfig = {
10
12
 
11
13
  // Can be imported from a shared config
12
14
  const locales = appConfig.i18n.locales;
15
+ const messagesRoot = path.join(process.cwd(), 'messages');
16
+ const runtimeMessageSources: readonly RuntimeMessageSource[] = [
17
+ { type: 'file' },
18
+ { type: 'dir', path: 'biz' },
19
+ ];
13
20
 
14
21
  export default getRequestConfig(async ({ requestLocale }) => {
15
22
  let locale = await requestLocale;
@@ -20,6 +27,10 @@ export default getRequestConfig(async ({ requestLocale }) => {
20
27
 
21
28
  return {
22
29
  locale,
23
- messages: (await import(`../messages/${locale}.json`)).default
30
+ messages: await loadMergedLocaleMessages({
31
+ locale,
32
+ messagesRoot,
33
+ sources: runtimeMessageSources,
34
+ })
24
35
  };
25
36
  });
@@ -2,7 +2,7 @@ import { createCommonAppConfig, createI18nHelpers, LOCALE_PRESETS } from "@windr
2
2
 
3
3
  // create app config
4
4
  export const appConfig = {
5
- ...createCommonAppConfig(LOCALE_PRESETS.EN_ZH),
5
+ ...createCommonAppConfig(LOCALE_PRESETS.EN_ONLY),
6
6
  creditsConfig: {
7
7
  freeAmount: 1,
8
8
  freeRegisterAmount: 2,
@@ -2,7 +2,7 @@
2
2
  title: Blog
3
3
  description: Articles and thoughts about various topics.
4
4
  icon: Rss
5
- date: 2026-04-02
5
+ date: 2026-04-12
6
6
  ---
7
7
 
8
8
  ## Past List
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  title: Monthly Summary
3
3
  description: Index and Summary
4
- date: 2026-04-02
4
+ date: 2026-04-12
5
5
  ---
6
6
 
7
7
 
package/messages/zh.json DELETED
@@ -1,395 +0,0 @@
1
- {
2
- "home": {
3
- "title": "迪奥猫",
4
- "banner": "再思 | 再义 | 再构",
5
- "webTitle": "迪奥猫 AI 产品编排模板 | 定价·积分·文档·Stripe",
6
- "webDescription": "为 AI 时代提速:迪奥猫 集成 Next.js + Prisma + PostgreSQL + Stripe,内置定价、积分闸机、文档与导航,准备好真实支付与增长场景。",
7
- "keywords": "AI 产品模板, Next.js SaaS, Stripe 定价, 积分计费 UI, Fumadocs, Prisma PostgreSQL, 匿名指纹, 价格组件, 积分管理"
8
- },
9
- "hero": {
10
- "mainTitle": "用 迪奥猫 构建 AI 产品",
11
- "mainEyesOn": "迪奥猫",
12
- "description": "为 AI 时代编排的模板:懂用户态的定价,指引升级的积分引擎,同步的文档与导航,以及现成可用的 Stripe 流程。",
13
- "button": "开始使用",
14
- "about": "SSR 稳定、适配移动端,已内置指纹到 Clerk 的首访引导",
15
- "heroImageAlt": "迪奥猫 模板展示定价卡、积分总览与文档导航",
16
- "heroImageUrl": "https://r2.d8ger.com/default.webp"
17
- },
18
- "usage": {
19
- "title": "三步搞定",
20
- "eyesOn": "快速上线",
21
- "description": "AI + 产品编排的一站式底座,配置即可上线。",
22
- "steps": [
23
- {
24
- "title": "接通底座",
25
- "description": "填好 Stripe 密钥、PostgreSQL、Clerk,InitUserContext + Prisma schema 让 SSR 定价与积分即刻有数据。",
26
- "iconKey": "MousePointerClick"
27
- },
28
- {
29
- "title": "编排产品",
30
- "description": "在配置里调计费开关、积分桶、CTA 行为;Money Price 与 Credit Overview 自动随用户态和端别响应。",
31
- "iconKey": "Pencil"
32
- },
33
- {
34
- "title": "上线叙事",
35
- "description": "Fumadocs + Header Mega Menu 同步导航与内容,渐变与可访问性已校准到移动与桌面。",
36
- "iconKey": "Download"
37
- }
38
- ]
39
- },
40
- "faq": {
41
- "title": "常见问题",
42
- "description": "核心流程已预置,以下回答帮助你快速落地。",
43
- "items": [
44
- {
45
- "question": "迪奥猫 是什么?",
46
- "answer": "一套 AI 时代的产品模板:Next.js + Prisma + PostgreSQL + Stripe,内置 Money Price、Credit Overview、指纹到 Clerk 引导,以及 Fumadocs 导航/文档。"
47
- },
48
- {
49
- "question": "支持订阅和一次性积分包吗?",
50
- "answer": "支持。Money Price 同时覆盖订阅与一次性积分包,计费开关可配置,升级按钮有 Portal/Checkout 双路兜底。"
51
- },
52
- {
53
- "question": "匿名用户如何处理?",
54
- "answer": "首访生成指纹 ID、发放体验积分并建表;登录后沿用同一上下文,额度不丢失,SSR 避免首屏抖动。"
55
- },
56
- {
57
- "question": "导航和文档能自定义吗?",
58
- "answer": "可以。Header 支持 mega menu、移动端 pinned 行为与二级按钮;Fumadocs 用配置驱动卡片、Banner 与端上排序。"
59
- },
60
- {
61
- "question": "Stripe 覆盖哪些生命周期?",
62
- "answer": "Checkout/Portal、异步确认、续费、欠费、退款、周期末取消、升级/降级都映射到 Transactions/Subscriptions,event.id + order_id 防重复。"
63
- }
64
- ]
65
- },
66
- "moneyPrice": {
67
- "title": "选择你的方案",
68
- "subtitle": "按需选择最合适的套餐",
69
- "billingSwitch": {
70
- "options": [
71
- {
72
- "key": "monthly",
73
- "name": "月付",
74
- "unit": "/月",
75
- "discountText": "",
76
- "subTitle": "按月计费"
77
- },
78
- {
79
- "key": "yearly",
80
- "name": "年付",
81
- "unit": "/月",
82
- "discountText": "立省 {percent}%",
83
- "subTitle": "按年计费"
84
- },
85
- {
86
- "key": "onetime",
87
- "name": "一次性",
88
- "unit": "积分包",
89
- "discountText": "积分包",
90
- "subTitle": "一次支付"
91
- }
92
- ],
93
- "defaultKey": "yearly"
94
- },
95
- "subscription": {
96
- "plans": [
97
- {
98
- "key": "F1",
99
- "title": "Hobby",
100
- "showBillingSubTitle": false,
101
- "features": [
102
- { "description": "基础功能" },
103
- { "description": "社区支持" },
104
- { "description": "限量使用" },
105
- { "description": "无需信用卡" }
106
- ]
107
- },
108
- {
109
- "key": "P2",
110
- "title": "Pro",
111
- "showBillingSubTitle": true,
112
- "features": [
113
- { "description": "包含 Free 全部功能", "tag": "Hobby" },
114
- { "description": "优先支持" },
115
- { "description": "50 积分/月", "tooltip": "1 积分 = 1 次 AI 生成" },
116
- { "description": "高级分析" }
117
- ]
118
- },
119
- {
120
- "key": "U3",
121
- "title": "Ultra",
122
- "showBillingSubTitle": true,
123
- "titleTags": ["最受欢迎"],
124
- "features": [
125
- { "description": "包含 Pro 全部功能", "tag": "Pro" },
126
- { "description": "200 积分/月", "tooltip": "1 积分 = 1 次 AI 生成" },
127
- { "description": "新功能抢先体验" },
128
- { "description": "专属支持", "tooltip": "7x24 小时专属经理" },
129
- { "description": "定制化集成" }
130
- ]
131
- }
132
- ]
133
- },
134
- "credits": {
135
- "plans": [
136
- {
137
- "key": "F1",
138
- "title": "Starter",
139
- "subtitle": "25 积分",
140
- "showBillingSubTitle": true,
141
- "features": [
142
- { "description": "25 次 AI 生成" },
143
- { "description": "试用首选" },
144
- { "description": "无过期" },
145
- { "description": "即时生效" }
146
- ]
147
- },
148
- {
149
- "key": "P2",
150
- "title": "Popular",
151
- "subtitle": "150 积分",
152
- "showBillingSubTitle": true,
153
- "titleTags": ["推荐"],
154
- "features": [
155
- { "description": "150 次 AI 生成" },
156
- { "description": "常规使用" },
157
- { "description": "无过期" },
158
- { "description": "即时生效" },
159
- { "description": "支持批量" }
160
- ]
161
- },
162
- {
163
- "key": "U3",
164
- "title": "Power",
165
- "subtitle": "350 积分",
166
- "showBillingSubTitle": true,
167
- "features": [
168
- { "description": "350 次 AI 生成" },
169
- { "description": "重度使用" },
170
- { "description": "无过期" },
171
- { "description": "即时生效" }
172
- ]
173
- }
174
- ]
175
- },
176
- "buttonTexts": {
177
- "buyCredits": "购买积分",
178
- "getStarted": "开始使用",
179
- "getPro": "获取 Pro",
180
- "getUltra": "获取 Ultra",
181
- "currentPlan": "当前套餐",
182
- "upgrade": "升级"
183
- }
184
- },
185
- "credit": {
186
- "summary": {
187
- "description": "所有可用积分总和",
188
- "totalLabel": "总积分"
189
- },
190
- "buckets": {
191
- "title": "积分明细",
192
- "empty": "暂无积分",
193
- "expiredAtLabel": "到期",
194
- "expandDetail": "点击展开积分详情",
195
- "hiddenDetail": "点击收起积分详情",
196
- "labels": {
197
- "free": "体验积分",
198
- "subscription": "订阅积分",
199
- "onetime": "一次性积分"
200
- }
201
- },
202
- "subscription": {
203
- "periodLabel": "当前套餐",
204
- "manage": "管理订阅",
205
- "inactive": "免费",
206
- "pay": "立即订阅"
207
- },
208
- "onetime": {
209
- "buy": "购买一次性积分包"
210
- }
211
- },
212
- "features": {
213
- "title": "为什么选择",
214
- "eyesOn": "迪奥猫",
215
- "description": "AI + 产品编排的底盘:启动快,也能稳收款。",
216
- "items": [
217
- {
218
- "title": "Money Price 2.0",
219
- "description": "monthly/yearly/onetime 依用户态切换,折扣徽标、升级护栏与 SSR 默认值同步就绪。",
220
- "iconKey": "Sparkles"
221
- },
222
- {
223
- "title": "Credit Overview 体验",
224
- "description": "积分桶、到期提示与 CTA 矩阵,桌面弹窗与移动跳转各有最佳实践。",
225
- "iconKey": "Gift"
226
- },
227
- {
228
- "title": "指纹到 Clerk",
229
- "description": "匿名用户获指纹与体验积分;登录平滑升级,额度不丢、首屏不闪。",
230
- "iconKey": "MessageCircleMore"
231
- },
232
- {
233
- "title": "文档与导航体系",
234
- "description": "Fumadocs + Header Mega Menu 让营销与 Docs 统一视觉,移动端可 pin 关键行动。",
235
- "iconKey": "BookOpen"
236
- }
237
- ]
238
- },
239
- "gallery": {
240
- "titleL": "图库",
241
- "eyesOn": "迪奥猫",
242
- "titleR": "范例",
243
- "description": "一眼看懂内置的 UI 语言:渐变 CTA、计费胶囊、积分桶与文档英雄区。",
244
- "button": {
245
- "title": "预览模板",
246
- "href": "https://newspaper-template.org/",
247
- "align": "center"
248
- },
249
- "defaultImgUrl": "https://r2.d8ger.com/default.webp",
250
- "downloadPrefix": "迪奥猫",
251
- "prompts": [
252
- {
253
- "url": "https://r2.d8ger.com/Reve-Image/1.webp",
254
- "altMsg": "带渐变与折扣徽标的定价网格"
255
- },
256
- {
257
- "url": "https://r2.d8ger.com/Reve-Image/2.webp",
258
- "altMsg": "展示积分桶与 CTA 的积分下拉"
259
- },
260
- {
261
- "url": "https://r2.d8ger.com/Reve-Image/3.webp",
262
- "altMsg": "带 Banner 与卡片的 Fumadocs 英雄区"
263
- },
264
- {
265
- "url": "https://r2.d8ger.com/Reve-Image/4.webp",
266
- "altMsg": "含 pinned 行为与二级按钮的 Header mega menu"
267
- },
268
- {
269
- "url": "https://r2.d8ger.com/Reve-Image/5.webp",
270
- "altMsg": "概览匿名引导的指纹状态面板"
271
- },
272
- {
273
- "url": "https://r2.d8ger.com/Reve-Image/6.webp",
274
- "altMsg": "订阅与一次性支付的 Stripe 生命周期蓝图"
275
- }
276
- ]
277
- },
278
- "tips": {
279
- "title": "使用提示",
280
- "eyesOn": "迪奥猫",
281
- "sections": [
282
- {
283
- "title": "先配再改",
284
- "description": "定价、积分、导航、CTA 皆由配置/翻译驱动,先调参数再写代码。"
285
- },
286
- {
287
- "title": "保留计费切换",
288
- "description": "即便默认 onetime,也请保留 monthly/yearly 入口,避免锁死用户。"
289
- },
290
- {
291
- "title": "适配端别",
292
- "description": "移动端用跳转/鉴权再收起;桌面可弹窗,滚动与关闭时机遵循设计稿。"
293
- },
294
- {
295
- "title": "SSR 优先",
296
- "description": "用 InitUserContext 预注入用户态,消除首屏抖动,计费默认值贴合真实订阅。"
297
- },
298
- {
299
- "title": "按模型填数",
300
- "description": "遵循 Users/Subscriptions/Transactions/Credits 模型,order_id + event.id 保障 webhook 幂等。"
301
- },
302
- {
303
- "title": "用 Docs 讲故事",
304
- "description": "Fumadocs 卡片与 Banner 可直接复用,用它同步产品叙事与版本发布。"
305
- }
306
- ]
307
- },
308
- "seoContent": {
309
- "title": "AI 时代的产品底盘",
310
- "eyesOn": "迪奥猫",
311
- "description": "定价、积分、文档、导航与 Stripe 一体化编排",
312
- "intro": "迪奥猫 把 AI 产品最耗时的环节收拢到一套模板:Money Price 同时跑订阅/一次性,Credit Overview 管控积分与 CTA 矩阵,指纹到 Clerk 避免漏斗断层,Stripe 生命周期与表结构预先对齐,Fumadocs + Header 让叙事与导航保持一致。",
313
- "sections": [
314
- {
315
- "title": "可感知用户态的定价",
316
- "content": "计费胶囊切换 monthly/yearly/onetime,SSR 默认随订阅态调整,升级按钮遵守 enableSubscriptionUpgrade 并有 Portal 兜底。"
317
- },
318
- {
319
- "title": "清晰积分与 CTA 矩阵",
320
- "content": "积分分桶、到期提示、端别动作:桌面弹窗或鉴权到 Portal,移动端跳转或自定义 handler。"
321
- },
322
- {
323
- "title": "匿名优先的引导",
324
- "content": "指纹生成 `fp_xxx` 即送体验额度并建表;登录后同一上下文续用,额度与审计无损衔接。"
325
- },
326
- {
327
- "title": "内建 Stripe 生命周期",
328
- "content": "Checkout/Portal、异步确认、续费、欠费、退款、周期末取消、升降级全覆盖,order_id 元数据 + webhook 幂等守护。"
329
- },
330
- {
331
- "title": "可扩展的文档与导航",
332
- "content": "Header mega menu、pinned 行为与 actionOrders 让 Docs/定价/登录按钮各就其位;Fumadocs 卡片与 Banner 免样式即用。"
333
- },
334
- {
335
- "title": "Schema-first 稳定性",
336
- "content": "Users, Subscriptions, Credits, Transactions, CreditAuditLog 预布索引,指纹检索、订单路由、审计链路稳定。"
337
- }
338
- ],
339
- "conclusion": "接好密钥、调完配置、填入文案——一周交付可收款、能讲故事、能度量的 AI 产品站。"
340
- },
341
- "cta": {
342
- "title": "让你的 AI 产品落地,用",
343
- "eyesOn": "迪奥猫",
344
- "description1": "一套模板搞定定价、积分、文档、导航与 Stripe。",
345
- "description2": "渐变、可访问性、移动体验都已调好。",
346
- "button": "立即开始",
347
- "url": "https://newspaper-template.org/"
348
- },
349
- "languageDetection": {
350
- "title": "语言切换",
351
- "description": "是否切换到",
352
- "close": "不用了",
353
- "changeAction": "是的,切换"
354
- },
355
- "footer": {
356
- "company": "WindRun · Huaiin",
357
- "copyright": "Copyright © {year} {name} All rights reserved.",
358
- "privacy": "隐私政策",
359
- "terms": "服务条款",
360
- "dpa": "数据保护协议",
361
- "sitemap": "站点地图",
362
- "contactUs": "联系我们",
363
- "email": "xyb5to0zcy@gmail.com",
364
- "clickToCopyText": "点击复制",
365
- "copiedText": "已复制!",
366
- "thanks": "特别感谢"
367
- },
368
- "clerk": {
369
- "signIn": "登录",
370
- "signUp": "注册",
371
- "signUpBonus": "+2",
372
- "signUpBonusTooltip": "注册就送2个积分!"
373
- },
374
- "linkPreview": {
375
- "blog": "博客",
376
- "pricing": "定价",
377
- "legal": "法律",
378
- "docs": "文档"
379
- },
380
- "fuma": {
381
- "search": "搜索",
382
- "searchNoResult": "未找到结果",
383
- "toc": "目录",
384
- "tocNoHeadings": "暂无标题",
385
- "lastUpdate": "最后更新",
386
- "emptyLastUpdate": "无更新",
387
- "chooseLanguage": "选择语言",
388
- "nextPage": "下一页",
389
- "previousPage": "上一页",
390
- "chooseTheme": "主题",
391
- "copyMarkdown": "复制为Markdown",
392
- "copyMarkdownDone": "已复制!",
393
- "editOnGithub": "在GitHub上编辑此页"
394
- }
395
- }