hd-garden 0.3.11 → 0.3.13
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.
- package/app/admin/page.tsx +11 -15
- package/app/admin/ui/page.tsx +1 -1
- package/app/components/AdminDashboard.tsx +24 -34
- package/app/components/AdminUiPanels.tsx +5 -5
- package/app/components/AdminUiShell.tsx +7 -7
- package/app/components/GardenAdminGuide.tsx +38 -45
- package/app/components/GardenContentGuide.tsx +22 -106
- package/app/components/GardenMediaGuide.tsx +24 -45
- package/app/components/PageIntro.tsx +2 -2
- package/app/components/UiStudio.tsx +2 -2
- package/app/garden/page.tsx +85 -223
- package/app/globals.css +930 -76
- package/app/lib/fallback-site-config.ts +1 -1
- package/app/ui-parity/page.tsx +9 -6
- package/package.json +9 -9
- package/public/images/garden/admin-studio.png +0 -0
- package/site.config.yaml +1 -1
- package/templates/site/site.config.yaml +1 -1
- package/ui/README.md +70 -0
- package/ui/core/catalog.mjs +14 -0
- package/ui/core/static.mjs +2 -0
- package/ui/core/validate.mjs +11 -0
- package/ui/host.mjs +155 -0
- package/ui/index.mjs +80 -0
- package/ui/parity-fixtures.mjs +76 -0
- package/ui/preview/dist/garden-ui.css +54 -31
- package/ui/preview/dist/garden-ui.esm.js +172 -131
- package/ui/preview/dist/garden-ui.iife.js +172 -131
- package/ui/prompt/rules.md +1 -0
- package/ui/react/CatalogPage.tsx +37 -13
- package/ui/react/components/chart.tsx +1 -1
- package/ui/react/components/sandbox.tsx +68 -0
- package/ui/react/index.tsx +5 -3
- package/ui/react/parity.tsx +25 -0
- package/ui/react/runtime.tsx +22 -6
- package/ui/react/ui.css +54 -31
|
@@ -1,30 +1,19 @@
|
|
|
1
|
-
import {
|
|
2
|
-
Globe,
|
|
3
|
-
VideoCamera,
|
|
4
|
-
WechatLogo,
|
|
5
|
-
XLogo,
|
|
6
|
-
} from "@phosphor-icons/react/ssr";
|
|
7
|
-
|
|
8
1
|
const embedTypes = [
|
|
9
2
|
{
|
|
10
3
|
title: "YouTube / Bilibili",
|
|
11
|
-
description: "
|
|
12
|
-
Icon: VideoCamera,
|
|
4
|
+
description: "贴上分享链接,页面里就能播放,也能回到原站。",
|
|
13
5
|
},
|
|
14
6
|
{
|
|
15
7
|
title: "X / Twitter",
|
|
16
|
-
description: "
|
|
17
|
-
Icon: XLogo,
|
|
8
|
+
description: "显示成一张带出处的卡片,不依赖对方的脚本。",
|
|
18
9
|
},
|
|
19
10
|
{
|
|
20
11
|
title: "微信公众号",
|
|
21
|
-
description: "
|
|
22
|
-
Icon: WechatLogo,
|
|
12
|
+
description: "留下标题、摘要和原文链接。微信不允许嵌进页面时,卡片仍然能点开。",
|
|
23
13
|
},
|
|
24
14
|
{
|
|
25
15
|
title: "其他网站",
|
|
26
|
-
description: "
|
|
27
|
-
Icon: Globe,
|
|
16
|
+
description: "自己写标题、摘要和封面。不在构建时去抓那个网址。",
|
|
28
17
|
},
|
|
29
18
|
];
|
|
30
19
|
|
|
@@ -39,43 +28,33 @@ export function GardenMediaGuide() {
|
|
|
39
28
|
return (
|
|
40
29
|
<section className="garden-media" id="media" aria-labelledby="garden-media-title">
|
|
41
30
|
<header>
|
|
42
|
-
<
|
|
43
|
-
<h2 id="garden-media-title">文章不只能放文字。</h2>
|
|
31
|
+
<h2 id="garden-media-title">视频和链接</h2>
|
|
44
32
|
<p>
|
|
45
|
-
|
|
46
|
-
<code> embed </code
|
|
33
|
+
自己的图片、音频和视频用 Markdown。别人的页面用
|
|
34
|
+
<code> embed </code>
|
|
35
|
+
围栏。能播的直接播,不能播的显示成一张卡片。
|
|
47
36
|
</p>
|
|
48
37
|
</header>
|
|
49
38
|
|
|
50
|
-
<div className="garden-media-
|
|
51
|
-
<
|
|
52
|
-
|
|
53
|
-
<li key={title}>
|
|
54
|
-
<span>{String(index + 1).padStart(2, "0")}</span>
|
|
55
|
-
<Icon size={22} aria-hidden="true" />
|
|
56
|
-
<div>
|
|
57
|
-
<strong>{title}</strong>
|
|
58
|
-
<p>{description}</p>
|
|
59
|
-
</div>
|
|
60
|
-
</li>
|
|
61
|
-
))}
|
|
62
|
-
</ul>
|
|
63
|
-
|
|
64
|
-
<div className="garden-media-source">
|
|
65
|
-
<div>
|
|
66
|
-
<span>content/posts/example.md</span>
|
|
67
|
-
<small>Markdown</small>
|
|
68
|
-
</div>
|
|
69
|
-
<pre><code>{embedSource}</code></pre>
|
|
39
|
+
<div className="garden-media-source">
|
|
40
|
+
<div>
|
|
41
|
+
<span>content/posts/example.md</span>
|
|
70
42
|
</div>
|
|
43
|
+
<pre><code>{embedSource}</code></pre>
|
|
71
44
|
</div>
|
|
72
45
|
|
|
73
|
-
<
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
46
|
+
<ul className="garden-media-providers">
|
|
47
|
+
{embedTypes.map(({ title, description }) => (
|
|
48
|
+
<li key={title}>
|
|
49
|
+
<strong>{title}</strong>
|
|
50
|
+
<p>{description}</p>
|
|
51
|
+
</li>
|
|
52
|
+
))}
|
|
53
|
+
</ul>
|
|
54
|
+
|
|
55
|
+
<p className="garden-media-boundary">
|
|
56
|
+
摘要写在文章里。构建时不去抓任意网址。原站打不开,文章还在。需要时用 <code>make embed URL=...</code> 拉一次,看过再贴进去。
|
|
57
|
+
</p>
|
|
79
58
|
</section>
|
|
80
59
|
);
|
|
81
60
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { ReactNode } from "react";
|
|
2
2
|
|
|
3
3
|
type PageIntroProps = {
|
|
4
|
-
eyebrow
|
|
4
|
+
eyebrow?: string;
|
|
5
5
|
title: string;
|
|
6
6
|
subtitle?: string;
|
|
7
7
|
children?: ReactNode;
|
|
@@ -16,7 +16,7 @@ export function PageIntro({
|
|
|
16
16
|
}: PageIntroProps) {
|
|
17
17
|
return (
|
|
18
18
|
<header className="page-intro">
|
|
19
|
-
<p className="eyebrow">{eyebrow}</p>
|
|
19
|
+
{eyebrow ? <p className="eyebrow">{eyebrow}</p> : null}
|
|
20
20
|
<h1>
|
|
21
21
|
{title.split("\n").map((line, index) => (
|
|
22
22
|
<span key={`${line}-${index}`}>
|
|
@@ -71,7 +71,7 @@ type StudioProps = { configured: boolean; modelName: string | null; remaining: n
|
|
|
71
71
|
|
|
72
72
|
export function UiStudio(props: StudioProps) {
|
|
73
73
|
const mounted = useSyncExternalStore(subscribeNothing, () => true, () => false);
|
|
74
|
-
if (!mounted) return <section className="admin-panel ui-studio-loading"
|
|
74
|
+
if (!mounted) return <section className="admin-panel ui-studio-loading">正在打开写作台…</section>;
|
|
75
75
|
return <Studio {...props} />;
|
|
76
76
|
}
|
|
77
77
|
|
|
@@ -397,7 +397,7 @@ function Studio({ configured, modelName, remaining: initialRemaining, recipes }:
|
|
|
397
397
|
</figure>
|
|
398
398
|
)
|
|
399
399
|
) : (
|
|
400
|
-
<p className="ui-studio-empty"
|
|
400
|
+
<p className="ui-studio-empty">左边写你想让读者看到的东西,或从配方开始。</p>
|
|
401
401
|
)}
|
|
402
402
|
</div>
|
|
403
403
|
|
package/app/garden/page.tsx
CHANGED
|
@@ -3,92 +3,58 @@ import { GardenAdminGuide } from "../components/GardenAdminGuide";
|
|
|
3
3
|
import { GardenContentGuide } from "../components/GardenContentGuide";
|
|
4
4
|
import { GardenMediaGuide } from "../components/GardenMediaGuide";
|
|
5
5
|
import { PageIntro } from "../components/PageIntro";
|
|
6
|
-
import { TableOfContents } from "../components/TableOfContents";
|
|
7
6
|
import { siteConfig } from "../site.config";
|
|
8
7
|
|
|
9
8
|
export const metadata = {
|
|
10
9
|
title: "Garden",
|
|
11
|
-
description:
|
|
12
|
-
"一个以 Markdown 为内容源、通过 GitHub Pages 发布的个人博客框架,支持博文、随想、专栏、搜索、RSS 与多媒体。",
|
|
10
|
+
description: "用 Markdown 写文章。推送到 GitHub 之后,页面、搜索和 RSS 一起生成。",
|
|
13
11
|
};
|
|
14
12
|
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
title: "阅读与内容发现",
|
|
23
|
-
description:
|
|
24
|
-
"自动生成文章目录、阅读时长、字数、前后篇导航、主题归档和全文搜索,搜索结果会高亮命中内容。",
|
|
25
|
-
},
|
|
26
|
-
{
|
|
27
|
-
title: "发布与订阅",
|
|
28
|
-
description:
|
|
29
|
-
"推送到 main 后由 GitHub Actions 构建并发布到 GitHub Pages,同时生成 RSS、sitemap、robots 和 Open Graph 元数据。",
|
|
30
|
-
},
|
|
31
|
-
{
|
|
32
|
-
title: "开放集成",
|
|
33
|
-
description:
|
|
34
|
-
"需要时可以接入 Giscus 评论、Webmention、无 Cookie 统计和对象存储;不配置这些服务也能正常写作和发布。",
|
|
35
|
-
},
|
|
13
|
+
const jumps = [
|
|
14
|
+
["#write-post", "写文章"],
|
|
15
|
+
["#write-thought", "随想"],
|
|
16
|
+
["#make-column", "专栏"],
|
|
17
|
+
["#setup", "跑起来"],
|
|
18
|
+
["#media", "视频和链接"],
|
|
19
|
+
["#admin", "后台"],
|
|
36
20
|
];
|
|
37
21
|
|
|
38
|
-
const
|
|
22
|
+
const setupSteps = [
|
|
39
23
|
{
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
24
|
+
title: "创建站点",
|
|
25
|
+
body: (
|
|
26
|
+
<>
|
|
27
|
+
运行 <code>npx hd-garden init my-blog</code>。目录里留下 <code>content/</code> 和 <code>site.config.yaml</code>。仓库名叫 <code><owner>.github.io</code> 时,地址最直接。
|
|
28
|
+
</>
|
|
29
|
+
),
|
|
44
30
|
},
|
|
45
31
|
{
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
"文章、随想、专栏、配置和草稿的唯一真源。你直接编辑这里,管理后台也只向这里提交内容。",
|
|
32
|
+
title: "在本地看",
|
|
33
|
+
command: "make dev",
|
|
34
|
+
body: "第一次会安装依赖。然后打开终端里的地址。",
|
|
50
35
|
},
|
|
51
36
|
{
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
"
|
|
37
|
+
title: "换成你的内容",
|
|
38
|
+
files: [
|
|
39
|
+
["site.config.yaml", "站名、作者、各页标题"],
|
|
40
|
+
["content/posts/", "长文和附件"],
|
|
41
|
+
["content/thoughts/", "随想"],
|
|
42
|
+
["content/columns.yaml", "专栏和阅读顺序"],
|
|
43
|
+
],
|
|
56
44
|
},
|
|
57
45
|
{
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
"管理后台补充随想发布和媒体上传;Giscus 评论可以使用独立公开仓库。它们都不会替代源码仓库。",
|
|
46
|
+
title: "发布",
|
|
47
|
+
command: "make update",
|
|
48
|
+
body: "先检查,再提交并推送。main 更新后,网站、搜索和 RSS 会重新生成。",
|
|
62
49
|
},
|
|
63
50
|
];
|
|
64
51
|
|
|
65
|
-
const gardenHeadings = [
|
|
66
|
-
{ depth: 2, text: "仓库和服务怎么分工", id: "garden-responsibilities-title" },
|
|
67
|
-
{ depth: 2, text: "博文、随想和专栏", id: "garden-guide-title" },
|
|
68
|
-
{ depth: 3, text: "写一篇文章", id: "write-post" },
|
|
69
|
-
{ depth: 3, text: "发布一条随想", id: "write-thought" },
|
|
70
|
-
{ depth: 3, text: "创建一个专栏", id: "make-column" },
|
|
71
|
-
{ depth: 2, text: "高级嵌入", id: "garden-media-title" },
|
|
72
|
-
{ depth: 2, text: "系统能力", id: "garden-system-title" },
|
|
73
|
-
{ depth: 2, text: "管理后台", id: "garden-admin-title" },
|
|
74
|
-
{ depth: 2, text: "安装与配置", id: "garden-setup-title" },
|
|
75
|
-
];
|
|
76
|
-
|
|
77
52
|
export default function GardenPage() {
|
|
78
53
|
return (
|
|
79
54
|
<main className="page-shell garden-page">
|
|
80
|
-
<
|
|
81
|
-
<TableOfContents headings={gardenHeadings} label="本页目录" />
|
|
82
|
-
</div>
|
|
83
|
-
|
|
84
|
-
<PageIntro
|
|
85
|
-
eyebrow="GARDEN / 博客框架"
|
|
86
|
-
title={siteConfig.pages.garden.title}
|
|
87
|
-
subtitle={siteConfig.pages.garden.subtitle}
|
|
88
|
-
>
|
|
55
|
+
<PageIntro title={siteConfig.pages.garden.title} subtitle={siteConfig.pages.garden.subtitle}>
|
|
89
56
|
<p className="garden-lede">
|
|
90
|
-
|
|
91
|
-
Markdown;推送后,GitHub Actions 会把它生成并发布为公开博客。
|
|
57
|
+
文章放在你自己的仓库里。你改文件,GitHub 构建网站。
|
|
92
58
|
</p>
|
|
93
59
|
<div className="garden-actions">
|
|
94
60
|
<a
|
|
@@ -98,187 +64,83 @@ export default function GardenPage() {
|
|
|
98
64
|
rel="noreferrer"
|
|
99
65
|
>
|
|
100
66
|
<GithubLogo size={18} weight="fill" />
|
|
101
|
-
|
|
67
|
+
查看源码
|
|
102
68
|
<ArrowUpRight size={16} />
|
|
103
69
|
</a>
|
|
104
|
-
<a
|
|
105
|
-
|
|
106
|
-
href="#setup"
|
|
107
|
-
>
|
|
108
|
-
查看安装与配置
|
|
70
|
+
<a className="inline-cta" href="#setup">
|
|
71
|
+
在本地跑起来
|
|
109
72
|
<ArrowRight size={16} />
|
|
110
73
|
</a>
|
|
111
74
|
</div>
|
|
112
|
-
<ul className="garden-proof-list" aria-label="Garden 核心特点">
|
|
113
|
-
<li><strong>01</strong><span>Markdown 唯一真源</span></li>
|
|
114
|
-
<li><strong>02</strong><span>GitHub 自动发布</span></li>
|
|
115
|
-
<li><strong>03</strong><span>长文、随想与专栏</span></li>
|
|
116
|
-
</ul>
|
|
117
75
|
</PageIntro>
|
|
118
76
|
|
|
119
|
-
<
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
>
|
|
124
|
-
<header className="garden-section-heading">
|
|
125
|
-
<div>
|
|
126
|
-
<p className="eyebrow">FLOW / 职责划分</p>
|
|
127
|
-
<h2 id="garden-responsibilities-title">你只需要维护源码仓库</h2>
|
|
128
|
-
</div>
|
|
129
|
-
<p>
|
|
130
|
-
日常写作从源码仓库开始,也在源码仓库结束。框架提供能力,Actions 负责构建,Pages
|
|
131
|
-
只负责展示;管理后台和评论都是可选补充。
|
|
132
|
-
</p>
|
|
133
|
-
</header>
|
|
134
|
-
|
|
135
|
-
<div className="garden-responsibility-flow" aria-label="Garden 发布链路">
|
|
136
|
-
<strong>Garden 模板</strong>
|
|
137
|
-
<ArrowRight size={16} aria-hidden="true" />
|
|
138
|
-
<strong>你的源码仓库</strong>
|
|
139
|
-
<ArrowRight size={16} aria-hidden="true" />
|
|
140
|
-
<strong>GitHub Actions</strong>
|
|
141
|
-
<ArrowRight size={16} aria-hidden="true" />
|
|
142
|
-
<strong>公开博客</strong>
|
|
143
|
-
</div>
|
|
144
|
-
|
|
145
|
-
<div className="garden-responsibility-grid">
|
|
146
|
-
{responsibilityBoundaries.map((boundary) => (
|
|
147
|
-
<article key={boundary.number}>
|
|
148
|
-
<span>{boundary.number}</span>
|
|
149
|
-
<h3>{boundary.title}</h3>
|
|
150
|
-
<p>{boundary.description}</p>
|
|
151
|
-
</article>
|
|
152
|
-
))}
|
|
153
|
-
</div>
|
|
154
|
-
</section>
|
|
77
|
+
<nav className="garden-jumps" aria-label="本页">
|
|
78
|
+
{jumps.map(([href, label]) => (
|
|
79
|
+
<a key={href} href={href}>{label}</a>
|
|
80
|
+
))}
|
|
81
|
+
</nav>
|
|
155
82
|
|
|
156
83
|
<GardenContentGuide />
|
|
157
84
|
|
|
158
|
-
<GardenMediaGuide />
|
|
159
|
-
|
|
160
|
-
<section className="garden-system" aria-labelledby="garden-system-title">
|
|
161
|
-
<header>
|
|
162
|
-
<p className="eyebrow">SYSTEM / 系统能力</p>
|
|
163
|
-
<h2 id="garden-system-title">Markdown、搜索与自动发布</h2>
|
|
164
|
-
<p>
|
|
165
|
-
写作者只维护 Markdown、附件和专栏配置。页面生成、搜索索引和订阅文件由构建脚本统一处理。
|
|
166
|
-
</p>
|
|
167
|
-
</header>
|
|
168
|
-
<div className="garden-system-grid">
|
|
169
|
-
{systemCapabilities.map((capability, index) => (
|
|
170
|
-
<article key={capability.title}>
|
|
171
|
-
<span>{String(index + 1).padStart(2, "0")}</span>
|
|
172
|
-
<h3>{capability.title}</h3>
|
|
173
|
-
<p>{capability.description}</p>
|
|
174
|
-
</article>
|
|
175
|
-
))}
|
|
176
|
-
</div>
|
|
177
|
-
</section>
|
|
178
|
-
|
|
179
|
-
<GardenAdminGuide />
|
|
180
|
-
|
|
181
85
|
<section className="garden-setup" id="setup" aria-labelledby="garden-setup-title">
|
|
182
86
|
<header className="garden-section-heading">
|
|
183
|
-
<
|
|
184
|
-
|
|
185
|
-
<h2 id="garden-setup-title">从模板到公开博客</h2>
|
|
186
|
-
</div>
|
|
187
|
-
<p>
|
|
188
|
-
公开博客不需要数据库和服务器。创建仓库、替换配置与内容,再推送到 main,GitHub Actions 就会完成构建和发布。
|
|
189
|
-
</p>
|
|
87
|
+
<h2 id="garden-setup-title">跑起来</h2>
|
|
88
|
+
<p>不需要数据库。换上你的名字和第一篇文章,推送即可。</p>
|
|
190
89
|
</header>
|
|
191
90
|
|
|
192
|
-
<
|
|
193
|
-
|
|
194
|
-
<
|
|
195
|
-
|
|
196
|
-
<p>
|
|
197
|
-
运行 <code>npx hd-garden init my-blog</code>,站点里只保留
|
|
198
|
-
<code>content/</code> 和 <code>site.config.yaml</code>。也可以继续用 GitHub 的
|
|
199
|
-
<strong>Use this template</strong>。推荐将仓库命名为
|
|
200
|
-
<code> <owner>.github.io</code>。
|
|
201
|
-
</p>
|
|
202
|
-
</article>
|
|
203
|
-
<article>
|
|
204
|
-
<span>02</span>
|
|
205
|
-
<h3>在本地启动</h3>
|
|
206
|
-
<pre>
|
|
207
|
-
<code>make dev</code>
|
|
208
|
-
</pre>
|
|
209
|
-
<p>第一次运行会自动安装依赖并创建本地配置,随后启动预览。浏览器打开终端显示的地址即可。</p>
|
|
210
|
-
</article>
|
|
211
|
-
<article>
|
|
212
|
-
<span>03</span>
|
|
213
|
-
<h3>替换配置与内容</h3>
|
|
214
|
-
<dl>
|
|
215
|
-
<div>
|
|
216
|
-
<dt>site.config.yaml</dt>
|
|
217
|
-
<dd>站点名称、作者资料和各页面标题</dd>
|
|
218
|
-
</div>
|
|
219
|
-
<div>
|
|
220
|
-
<dt>content/posts/</dt>
|
|
221
|
-
<dd>长文章与附件</dd>
|
|
222
|
-
</div>
|
|
223
|
-
<div>
|
|
224
|
-
<dt>content/thoughts/</dt>
|
|
225
|
-
<dd>随想 Markdown</dd>
|
|
226
|
-
</div>
|
|
91
|
+
<ol className="garden-steps">
|
|
92
|
+
{setupSteps.map((step, index) => (
|
|
93
|
+
<li key={step.title}>
|
|
94
|
+
<span>{index + 1}</span>
|
|
227
95
|
<div>
|
|
228
|
-
<
|
|
229
|
-
<
|
|
96
|
+
<h3>{step.title}</h3>
|
|
97
|
+
{"command" in step && step.command ? <pre><code>{step.command}</code></pre> : null}
|
|
98
|
+
{"files" in step && step.files ? (
|
|
99
|
+
<dl>
|
|
100
|
+
{step.files.map(([name, note]) => (
|
|
101
|
+
<div key={name}>
|
|
102
|
+
<dt>{name}</dt>
|
|
103
|
+
<dd>{note}</dd>
|
|
104
|
+
</div>
|
|
105
|
+
))}
|
|
106
|
+
</dl>
|
|
107
|
+
) : null}
|
|
108
|
+
{"body" in step && step.body ? <p>{step.body}</p> : null}
|
|
230
109
|
</div>
|
|
231
|
-
</
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
<span>04</span>
|
|
235
|
-
<h3>提交并发布</h3>
|
|
236
|
-
<pre>
|
|
237
|
-
<code>make update</code>
|
|
238
|
-
</pre>
|
|
239
|
-
<p>
|
|
240
|
-
命令会先完成检查,再提交并推送源码仓库。main 分支更新后,Actions 自动生成页面、搜索索引、RSS 和 sitemap。
|
|
241
|
-
</p>
|
|
242
|
-
</article>
|
|
243
|
-
</div>
|
|
110
|
+
</li>
|
|
111
|
+
))}
|
|
112
|
+
</ol>
|
|
244
113
|
|
|
245
114
|
<div className="garden-setup-notes">
|
|
246
|
-
<
|
|
247
|
-
<strong
|
|
248
|
-
<
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
<
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
</div>
|
|
259
|
-
<div>
|
|
260
|
-
<strong>可选服务</strong>
|
|
261
|
-
<p>评论、Webmention、统计和管理后台按需配置;任何密钥都只放在部署平台的 Secret 中。</p>
|
|
262
|
-
</div>
|
|
115
|
+
<p>
|
|
116
|
+
<strong>仓库可以是私有的。</strong>
|
|
117
|
+
公开仓库一种就够。想把草稿留在私有仓库时,用 <code>PAGES_REPOSITORY</code> 指向公开的页面仓库。两种都是 <code>make update</code>。
|
|
118
|
+
</p>
|
|
119
|
+
<p>
|
|
120
|
+
<strong>先看草稿。</strong>
|
|
121
|
+
<code>CONTENT_INCLUDE_DRAFTS=1 make dev</code> 会把草稿和还没到时间的文章也显示出来。
|
|
122
|
+
</p>
|
|
123
|
+
<p>
|
|
124
|
+
<strong>密钥不进仓库。</strong>
|
|
125
|
+
评论、统计和后台的密钥放在部署平台。
|
|
126
|
+
</p>
|
|
263
127
|
</div>
|
|
128
|
+
</section>
|
|
264
129
|
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
>
|
|
276
|
-
<GithubLogo size={18} weight="fill" />
|
|
277
|
-
使用 Garden 模板
|
|
278
|
-
<ArrowUpRight size={16} />
|
|
279
|
-
</a>
|
|
130
|
+
<GardenMediaGuide />
|
|
131
|
+
|
|
132
|
+
<section className="garden-after" aria-labelledby="garden-after-title">
|
|
133
|
+
<header className="garden-section-heading">
|
|
134
|
+
<h2 id="garden-after-title">推送之后</h2>
|
|
135
|
+
</header>
|
|
136
|
+
<p className="garden-after-lead">你的仓库,到 GitHub 构建,再到公开网站。</p>
|
|
137
|
+
<div className="garden-after-copy">
|
|
138
|
+
<p>框架画页面。你的文章不放在框架仓库里,而在你自己的内容仓库。读者打开的是生成出来的静态页。</p>
|
|
139
|
+
<p>同一次构建会带上正文、目录、前后篇、搜索、RSS 和 sitemap。后台和评论都可以以后再加,不接也能发布。</p>
|
|
280
140
|
</div>
|
|
281
141
|
</section>
|
|
142
|
+
|
|
143
|
+
<GardenAdminGuide />
|
|
282
144
|
</main>
|
|
283
145
|
);
|
|
284
146
|
}
|