edgepress 2026.9.6 → 2026.9.10
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/README.md +4 -4
- package/config.yml +122 -64
- package/content/pages/home/en.md +9 -1
- package/content/pages/home/zh-cn.md +18 -10
- package/content/pages/plugin-development/en.md +5 -4
- package/content/pages/plugin-development/zh-cn.md +5 -4
- package/content/pages/privacy-policy/en.md +47 -27
- package/content/pages/privacy-policy/zh-cn.md +50 -30
- package/content/pages/project-introduction/en.md +1 -1
- package/content/pages/project-introduction/zh-cn.md +1 -1
- package/content/pages/theme-development/en.md +2 -0
- package/content/pages/theme-development/zh-cn.md +2 -0
- package/content/posts/2026-09-23-edgepress-on-the-edge/en.md +9 -1
- package/content/posts/2026-09-23-edgepress-on-the-edge/zh-cn.md +9 -1
- package/content/posts/2026-09-25-edgepress-release-2026-9-6/en.md +2 -2
- package/content/posts/2026-09-25-edgepress-release-2026-9-6/zh-cn.md +2 -2
- package/content/posts/2026-09-26-edgepress-release-2026-9-7/en.md +26 -0
- package/content/posts/2026-09-26-edgepress-release-2026-9-7/zh-cn.md +26 -0
- package/content/posts/2026-09-26-edgepress-release-2026-9-8/en.md +26 -0
- package/content/posts/2026-09-26-edgepress-release-2026-9-8/zh-cn.md +26 -0
- package/content/posts/2026-09-26-edgepress-release-2026-9-9/en.md +30 -0
- package/content/posts/2026-09-26-edgepress-release-2026-9-9/zh-cn.md +30 -0
- package/content/posts/2026-09-27-edgepress-release-2026-9-10/en.md +31 -0
- package/content/posts/2026-09-27-edgepress-release-2026-9-10/zh-cn.md +31 -0
- package/languages/base/en.json +16 -7
- package/languages/packs/zh-CN.json +15 -6
- package/package.json +2 -3
- package/plugins/consent/index.js +19 -3
- package/project-compatibility.json +33 -3
- package/src/build.js +5 -4
- package/src/cli.js +1 -11
- package/src/config.js +81 -14
- package/src/content.js +22 -1
- package/src/generators.js +38 -26
- package/src/i18n.js +6 -0
- package/src/markdown.js +88 -9
- package/src/page-blocks.js +89 -26
- package/src/page-check.js +75 -24
- package/src/report-visuals.js +111 -16
- package/src/theme.js +12 -4
- package/static/edgepress/brand/mascot-209.webp +0 -0
- package/static/edgepress/brand/mascot-418.png +0 -0
- package/static/edgepress/brand/mascot-418.webp +0 -0
- package/static/edgepress/icons.svg +2 -2
- package/static/edgepress/plugins/consent/manager.js +229 -76
- package/static/edgepress/plugins/statistics/cloudflare-web-analytics.js +1 -0
- package/static/edgepress/post-toc.js +37 -0
- package/themes/atelier/assets/style.css +77 -26
- package/themes/default/assets/style.css +77 -26
- package/themes/signal/assets/style.css +77 -26
- package/CHANGELOG.txt +0 -12
package/README.md
CHANGED
|
@@ -63,10 +63,10 @@ Posts under content/posts/ use the Markdown renderer. Themes own shared head, na
|
|
|
63
63
|
|
|
64
64
|
The only persisted page-audit report is the accessible PDF at tools/page-check.pdf. Desktop and mobile screenshots are embedded in the PDF and removed from temporary storage afterward. Automated checks do not replace manual accessibility or legal review.
|
|
65
65
|
|
|
66
|
-
The main navigation includes a Posts entry to the localized article archive. The header search page filters Markdown posts from the generated local search index; it does not send search queries to an external service.
|
|
66
|
+
The main navigation includes a Posts entry to the localized article archive. The header search page filters Markdown posts from the generated local search index; it does not send search queries to an external service. Long articles show a floating, scroll-aware table of contents, and code blocks have accessible copy buttons. The first post, “EdgePress and Markdown: a complete writing guide,” documents and verifies the supported Markdown syntax in English and Chinese.
|
|
67
67
|
|
|
68
|
-
Project guides are published from content/pages/: project introduction, quick start, theme development, plugin development, and privacy policy. The starter config uses `https://edgepress.js.gripe` and credits `toewpq
|
|
68
|
+
Project guides are published from content/pages/: project introduction, quick start, theme development, plugin development, and privacy policy. The starter config uses `https://edgepress.js.gripe` and credits `toewpq`. Before production use, confirm that the configured operator name identifies the responsible person or organization and complete any applicable representative or data protection officer details.
|
|
69
69
|
|
|
70
|
-
Version 2026.9.
|
|
70
|
+
Version 2026.9.10 records the tenth requested release update for September 2026. See the [request 1 notes](content/posts/2026-09-24-edgepress-release-2026-9-1/), [request 2 notes](content/posts/2026-09-25-edgepress-release-2026-9-2/), [request 3 notes](content/posts/2026-09-25-edgepress-release-2026-9-3/), [request 4 notes](content/posts/2026-09-25-edgepress-release-2026-9-4/), [request 5 notes](content/posts/2026-09-25-edgepress-release-2026-9-5/), [request 6 notes](content/posts/2026-09-25-edgepress-release-2026-9-6/), [request 7 notes](content/posts/2026-09-26-edgepress-release-2026-9-7/), [request 8 notes](content/posts/2026-09-26-edgepress-release-2026-9-8/), [request 9 notes](content/posts/2026-09-26-edgepress-release-2026-9-9/), and [request 10 notes](content/posts/2026-09-27-edgepress-release-2026-9-10/).
|
|
71
71
|
|
|
72
|
-
|
|
72
|
+
This release keeps privacy choices across locale changes, adds localized page-block links, improves article tag links, loads search code only on search pages, redraws two SVG icons, and simplifies privacy wording. Optional services remain disabled until a visitor makes an explicit choice.
|
package/config.yml
CHANGED
|
@@ -84,68 +84,126 @@ privacy:
|
|
|
84
84
|
plugins:
|
|
85
85
|
consent:
|
|
86
86
|
enabled: true
|
|
87
|
-
|
|
87
|
+
# Drafting date; set effectiveDate when a revised notice takes effect.
|
|
88
|
+
proposedDate: "2026-09-26"
|
|
89
|
+
effectiveDate: "2026-09-26"
|
|
88
90
|
expiresDays: 180
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
#
|
|
151
|
-
#
|
|
91
|
+
tracking:
|
|
92
|
+
enabled: true
|
|
93
|
+
services: []
|
|
94
|
+
# Example:
|
|
95
|
+
# - id: tag-manager
|
|
96
|
+
# provider: google-tag-manager
|
|
97
|
+
# name: { en: Google Tag Manager, zh-CN: Google 跟踪代码管理器 }
|
|
98
|
+
# purpose: { en: Load campaign tags after consent., zh-CN: 经同意后加载营销标签。 }
|
|
99
|
+
# dataCategories: { en: Describe data sent by this container., zh-CN: 填写此容器发送的数据类别。 }
|
|
100
|
+
# recipient: { en: Google LLC, zh-CN: Google LLC }
|
|
101
|
+
# retention: { en: Configure the retention period., zh-CN: 填写适用的数据保留期限。 }
|
|
102
|
+
# privacyUrl: https://policies.google.com/privacy
|
|
103
|
+
# containerId: GTM-ABCD123
|
|
104
|
+
# - id: social-pixel
|
|
105
|
+
# provider: meta-pixel
|
|
106
|
+
# name: { en: Meta Pixel, zh-CN: Meta Pixel }
|
|
107
|
+
# purpose: { en: Measure campaign traffic after consent., zh-CN: 经同意后衡量营销流量。 }
|
|
108
|
+
# dataCategories: { en: Describe data sent by this pixel., zh-CN: 填写此像素发送的数据类别。 }
|
|
109
|
+
# recipient: { en: Meta Platforms, Inc., zh-CN: Meta Platforms, Inc. }
|
|
110
|
+
# retention: { en: Configure the provider's retention period., zh-CN: 填写供应商的数据保留期限。 }
|
|
111
|
+
# privacyUrl: https://www.facebook.com/privacy/policy/
|
|
112
|
+
# pixelId: "123456789012345"
|
|
113
|
+
statistics:
|
|
114
|
+
enabled: true
|
|
115
|
+
services:
|
|
116
|
+
- id: cloudflare-web-analytics
|
|
117
|
+
provider: cloudflare-web-analytics
|
|
118
|
+
name:
|
|
119
|
+
en: Cloudflare Web Analytics
|
|
120
|
+
zh-CN: Cloudflare 网站分析
|
|
121
|
+
purpose:
|
|
122
|
+
en: Measure page views and page-load performance after consent.
|
|
123
|
+
zh-CN: 经访客同意后衡量页面浏览量和页面加载性能。
|
|
124
|
+
dataCategories:
|
|
125
|
+
en: Performance timing and page-view metrics; dimensions can include path, referrer, device, browser, operating system, and country. Cloudflare receives the beacon request's source IP and says it discards it at the nearest data center without storing it in core databases or logs.
|
|
126
|
+
zh-CN: 性能计时和页面浏览指标,维度可能包括页面路径、来源页、设备、浏览器、操作系统和国家或地区。Cloudflare 会在信标请求中接收来源 IP,并表示会在最近的数据中心将其丢弃,不保存到核心数据库或日志中。
|
|
127
|
+
recipient:
|
|
128
|
+
en: Cloudflare, Inc.
|
|
129
|
+
zh-CN: Cloudflare, Inc.
|
|
130
|
+
retention:
|
|
131
|
+
en: Unsampled beacon data is kept for 7 days, then aggregated to about 10% for long-term storage. Dashboard history is available for 6 months.
|
|
132
|
+
zh-CN: 未采样的信标数据保留 7 天,之后会汇总为约 10% 的长期数据。仪表板可查看最近 6 个月的历史记录。
|
|
133
|
+
privacyUrl: https://developers.cloudflare.com/speed/observatory/rum-beacon/
|
|
134
|
+
token: "8347d72ba9f84e6783bf441e7832a80e"
|
|
135
|
+
# Examples use public provider IDs only.
|
|
136
|
+
# - id: primary-analytics
|
|
137
|
+
# provider: google-analytics
|
|
138
|
+
# name: { en: Google Analytics, zh-CN: Google Analytics }
|
|
139
|
+
# purpose: { en: Measure site visits after consent., zh-CN: 经访客同意后衡量网站访问情况。 }
|
|
140
|
+
# dataCategories: { en: Describe the data processed by this property., zh-CN: 填写此媒体资源处理的数据类别。 }
|
|
141
|
+
# recipient: { en: Google LLC, zh-CN: Google LLC }
|
|
142
|
+
# retention: { en: Configure the provider's retention period., zh-CN: 填写供应商的数据保留期限。 }
|
|
143
|
+
# privacyUrl: https://policies.google.com/privacy
|
|
144
|
+
# measurementId: G-ABC12345
|
|
145
|
+
# - id: edge-analytics
|
|
146
|
+
# provider: cloudflare-web-analytics
|
|
147
|
+
# name: { en: Cloudflare Web Analytics, zh-CN: Cloudflare 网站分析 }
|
|
148
|
+
# purpose: { en: Measure site visits after consent., zh-CN: 经访客同意后衡量网站访问情况。 }
|
|
149
|
+
# dataCategories: { en: Describe the data processed by this site., zh-CN: 填写此站点处理的数据类别。 }
|
|
150
|
+
# recipient: { en: Cloudflare, Inc., zh-CN: Cloudflare, Inc. }
|
|
151
|
+
# retention: { en: Configure the retention period., zh-CN: 填写数据保留期限。 }
|
|
152
|
+
# privacyUrl: https://developers.cloudflare.com/speed/observatory/rum-beacon/
|
|
153
|
+
# token: 01234567-89ab-cdef-0123-456789abcdef
|
|
154
|
+
# - id: baidu-analytics
|
|
155
|
+
# provider: baidu-tongji
|
|
156
|
+
# name: { en: Baidu Tongji, zh-CN: 百度统计 }
|
|
157
|
+
# purpose: { en: Measure site visits after consent., zh-CN: 经访客同意后衡量网站访问情况。 }
|
|
158
|
+
# dataCategories: { en: Describe data sent to this site ID., zh-CN: 填写此站点编号接收的数据类别。 }
|
|
159
|
+
# recipient: { en: Baidu, Inc., zh-CN: 百度 }
|
|
160
|
+
# retention: { en: Configure the provider's retention period., zh-CN: 填写供应商的数据保留期限。 }
|
|
161
|
+
# privacyUrl: https://privacy.baidu.com/policy.html
|
|
162
|
+
# siteId: abcdef0123456789abcdef01
|
|
163
|
+
advertising:
|
|
164
|
+
enabled: true
|
|
165
|
+
services: []
|
|
166
|
+
# Example:
|
|
167
|
+
# - id: display-ads
|
|
168
|
+
# provider: google-adsense
|
|
169
|
+
# name: { en: Google AdSense, zh-CN: Google AdSense }
|
|
170
|
+
# purpose: { en: Display ads after consent., zh-CN: 经访客同意后展示广告。 }
|
|
171
|
+
# dataCategories: { en: Describe the data processed for ad delivery., zh-CN: 填写广告投放处理的数据类别。 }
|
|
172
|
+
# recipient: { en: Google LLC, zh-CN: Google LLC }
|
|
173
|
+
# retention: { en: Configure the provider's retention period., zh-CN: 填写供应商的数据保留期限。 }
|
|
174
|
+
# privacyUrl: https://policies.google.com/privacy
|
|
175
|
+
# clientId: ca-pub-1234567890123456
|
|
176
|
+
captcha:
|
|
177
|
+
enabled: true
|
|
178
|
+
services: []
|
|
179
|
+
# Choose a provider for each CAPTCHA block. Never add its secret key here.
|
|
180
|
+
# - id: contact-form-check
|
|
181
|
+
# provider: cloudflare-turnstile
|
|
182
|
+
# name: { en: Cloudflare Turnstile, zh-CN: Cloudflare Turnstile }
|
|
183
|
+
# purpose: { en: Reduce automated contact form submissions., zh-CN: 减少联系表单中的自动化提交。 }
|
|
184
|
+
# dataCategories: { en: Describe challenge and response data., zh-CN: 填写验证挑战和响应处理的数据类别。 }
|
|
185
|
+
# recipient: { en: Cloudflare, Inc., zh-CN: Cloudflare, Inc. }
|
|
186
|
+
# retention: { en: Configure the provider's retention period., zh-CN: 填写供应商的数据保留期限。 }
|
|
187
|
+
# privacyUrl: https://www.cloudflare.com/privacypolicy/
|
|
188
|
+
# siteKey: 0x4AAAAAAABBBBBBBBCCCCCCDDDD
|
|
189
|
+
# - id: signup-form-check
|
|
190
|
+
# provider: google-recaptcha
|
|
191
|
+
# name: { en: Google reCAPTCHA, zh-CN: Google reCAPTCHA }
|
|
192
|
+
# purpose: { en: Reduce automated signup submissions., zh-CN: 减少注册表单中的自动化提交。 }
|
|
193
|
+
# dataCategories: { en: Describe challenge and response data., zh-CN: 填写验证挑战和响应处理的数据类别。 }
|
|
194
|
+
# recipient: { en: Google LLC, zh-CN: Google LLC }
|
|
195
|
+
# retention: { en: Configure the provider's retention period., zh-CN: 填写供应商的数据保留期限。 }
|
|
196
|
+
# privacyUrl: https://policies.google.com/privacy
|
|
197
|
+
# siteKey: 6LcAbCdEfGhIjKlMnOpQrStUvWxYz0123456789a
|
|
198
|
+
# - id: support-form-check
|
|
199
|
+
# provider: hcaptcha
|
|
200
|
+
# name: { en: hCaptcha, zh-CN: hCaptcha }
|
|
201
|
+
# purpose: { en: Reduce automated support requests., zh-CN: 减少自动化的支持请求。 }
|
|
202
|
+
# dataCategories: { en: Describe challenge and response data., zh-CN: 填写验证挑战和响应处理的数据类别。 }
|
|
203
|
+
# recipient: { en: Intuition Machines, Inc., zh-CN: Intuition Machines, Inc. }
|
|
204
|
+
# retention: { en: Configure the provider's retention period., zh-CN: 填写供应商的数据保留期限。 }
|
|
205
|
+
# privacyUrl: https://www.hcaptcha.com/privacy
|
|
206
|
+
# siteKey: 0123456789abcdefghijklmnopqrstuvwx
|
|
207
|
+
# Add browser services under plugins.consent after filling the real site operator details above.
|
|
208
|
+
# Every configured service needs a privacyUrl linking to the provider's current privacy information.
|
|
209
|
+
# Each service waits for explicit visitor consent before its vendor code loads.
|
package/content/pages/home/en.md
CHANGED
|
@@ -17,8 +17,16 @@ blocks:
|
|
|
17
17
|
eyebrow: A project built for the edge
|
|
18
18
|
title: Build a fast website from clear, editable source files.
|
|
19
19
|
text: EdgePress turns Markdown posts, page layouts, themes, and consent-aware integrations into a static site served by Cloudflare Workers.
|
|
20
|
-
mascotSrc: /edgepress/brand/mascot.png
|
|
20
|
+
mascotSrc: /edgepress/brand/mascot-418.png
|
|
21
21
|
mascotAlt: A curious sparrow folded from layered paper pages, EdgePress's project mascot.
|
|
22
|
+
mascotWidth: 418
|
|
23
|
+
mascotHeight: 440
|
|
24
|
+
mascotSizes: 209px
|
|
25
|
+
mascotWebpSrcset:
|
|
26
|
+
- src: /edgepress/brand/mascot-209.webp
|
|
27
|
+
width: 209
|
|
28
|
+
- src: /edgepress/brand/mascot-418.webp
|
|
29
|
+
width: 418
|
|
22
30
|
cta:
|
|
23
31
|
label: Start with the quick guide
|
|
24
32
|
url: /quick-start/
|
|
@@ -17,11 +17,19 @@ blocks:
|
|
|
17
17
|
eyebrow: 为边缘网络构建
|
|
18
18
|
title: 用清晰、可编辑的源文件构建快速网站。
|
|
19
19
|
text: EdgePress 将 Markdown 文章、页面布局、主题和遵循同意状态的集成构建为由 Cloudflare Workers 提供服务的静态网站。
|
|
20
|
-
mascotSrc: /edgepress/brand/mascot.png
|
|
20
|
+
mascotSrc: /edgepress/brand/mascot-418.png
|
|
21
21
|
mascotAlt: EdgePress 吉祥物,一只由层叠折页构成、神情好奇的小鸟。
|
|
22
|
+
mascotWidth: 418
|
|
23
|
+
mascotHeight: 440
|
|
24
|
+
mascotSizes: 209px
|
|
25
|
+
mascotWebpSrcset:
|
|
26
|
+
- src: /edgepress/brand/mascot-209.webp
|
|
27
|
+
width: 209
|
|
28
|
+
- src: /edgepress/brand/mascot-418.webp
|
|
29
|
+
width: 418
|
|
22
30
|
cta:
|
|
23
31
|
label: 从快速入门开始
|
|
24
|
-
url: /quick-start/
|
|
32
|
+
url: /[launge]/quick-start/
|
|
25
33
|
highlights:
|
|
26
34
|
- 在本地化 Markdown 前置数据中编辑页面
|
|
27
35
|
- 使用 Markdown 撰写文章
|
|
@@ -35,19 +43,19 @@ blocks:
|
|
|
35
43
|
- title: 页面使用可编辑元素
|
|
36
44
|
icon: layout-grid
|
|
37
45
|
text: 先设置栏数,再选择元素类型,并在各页面文件中编辑对应内容。
|
|
38
|
-
url: /theme-development/
|
|
46
|
+
url: /[launge]/theme-development/
|
|
39
47
|
- title: 文章使用 Markdown
|
|
40
48
|
icon: file-text
|
|
41
49
|
text: 使用 Markdown 撰写长文,由内置渲染器进行清理和排版。
|
|
42
|
-
url: /project-introduction/
|
|
50
|
+
url: /[launge]/project-introduction/
|
|
43
51
|
- title: 主题负责视觉设计
|
|
44
52
|
icon: palette
|
|
45
53
|
text: 使用 HTML 局部模板构建布局,并将各主题的配色保留在样式表中。
|
|
46
|
-
url: /theme-development/
|
|
54
|
+
url: /[launge]/theme-development/
|
|
47
55
|
- title: 集成遵循用户同意
|
|
48
56
|
icon: shield-check
|
|
49
57
|
text: 配置跟踪、统计、广告或人机验证服务及其供应商信息。
|
|
50
|
-
url: /plugin-development/
|
|
58
|
+
url: /[launge]/plugin-development/
|
|
51
59
|
- columns: 2
|
|
52
60
|
cells:
|
|
53
61
|
-
|
|
@@ -62,9 +70,9 @@ blocks:
|
|
|
62
70
|
title: 项目指南
|
|
63
71
|
items:
|
|
64
72
|
- label: 项目介绍
|
|
65
|
-
url: /project-introduction/
|
|
73
|
+
url: /[launge]/project-introduction/
|
|
66
74
|
- label: 快速入门
|
|
67
|
-
url: /quick-start/
|
|
75
|
+
url: /[launge]/quick-start/
|
|
68
76
|
-
|
|
69
77
|
- type: section
|
|
70
78
|
title: 扩展项目
|
|
@@ -78,9 +86,9 @@ blocks:
|
|
|
78
86
|
title: 开发指南
|
|
79
87
|
items:
|
|
80
88
|
- label: 主题开发
|
|
81
|
-
url: /theme-development/
|
|
89
|
+
url: /[launge]/theme-development/
|
|
82
90
|
- label: 插件开发
|
|
83
|
-
url: /plugin-development/
|
|
91
|
+
url: /[launge]/plugin-development/
|
|
84
92
|
- columns: 1
|
|
85
93
|
cells:
|
|
86
94
|
-
|
|
@@ -43,9 +43,10 @@ blocks:
|
|
|
43
43
|
blocks:
|
|
44
44
|
- type: text
|
|
45
45
|
paragraphs:
|
|
46
|
-
- Add browser providers in config.yml under plugins.tracking, plugins.statistics, plugins.advertising, or plugins.captcha. Each
|
|
46
|
+
- Add browser providers in config.yml under plugins.consent.tracking, plugins.consent.statistics, plugins.consent.advertising, or plugins.consent.captcha. Each service needs a unique ID, provider, purpose, dataCategories, recipient, retention, a privacyUrl pointing to the provider's current privacy information, and its public site identifier. privacyUrl must be an HTTPS URL. Localized fields are maps keyed by every enabled locale, such as en and zh-CN.
|
|
47
47
|
- Available providers include Google Tag Manager and Meta Pixel; Cloudflare Web Analytics, Google Analytics, and Baidu Tongji; Google AdSense; and Cloudflare Turnstile, Google reCAPTCHA, and hCaptcha.
|
|
48
|
-
-
|
|
48
|
+
- Set plugins.consent.proposedDate to the YYYY-MM-DD date the notice was drafted. Set effectiveDate when the notice takes effect; omit it while no effective date has been set. Updating either date makes saved consent stale, so visitors are asked again.
|
|
49
|
+
- Provider code is imported only after the visitor accepts that integration. The first layer offers accept and reject together; service data and individual switches are available in its details. Keep CAPTCHA secret keys out of config.yml and client code. The server must submit each CAPTCHA response to the provider verification API before accepting a form.
|
|
49
50
|
- type: notice
|
|
50
51
|
title: Operator details
|
|
51
52
|
text: Fill privacy.controller.name, privacy.controller.contact, and privacy.policyUrl before configuring any browser provider. The build rejects provider services when the controller name or contact is blank.
|
|
@@ -85,8 +86,8 @@ blocks:
|
|
|
85
86
|
items:
|
|
86
87
|
- label: Cloudflare Turnstile Siteverify
|
|
87
88
|
url: https://developers.cloudflare.com/turnstile/get-started/server-side-validation/
|
|
88
|
-
- label:
|
|
89
|
-
url: https://www.edpb.europa.eu/
|
|
89
|
+
- label: EDPB consent summary
|
|
90
|
+
url: https://www.edpb.europa.eu/system/files/2026-04/edpb-summary-consent_en.pdf
|
|
90
91
|
- columns: 1
|
|
91
92
|
cells:
|
|
92
93
|
-
|
|
@@ -43,9 +43,10 @@ blocks:
|
|
|
43
43
|
blocks:
|
|
44
44
|
- type: text
|
|
45
45
|
paragraphs:
|
|
46
|
-
- 在 config.yml 的 plugins.tracking、plugins.statistics、plugins.advertising 或 plugins.captcha 下添加浏览器供应商。每项需要唯一 ID
|
|
46
|
+
- 在 config.yml 的 plugins.consent.tracking、plugins.consent.statistics、plugins.consent.advertising 或 plugins.consent.captcha 下添加浏览器供应商。每项需要唯一 ID、provider、purpose、dataCategories、recipient、retention、指向供应商当前隐私说明的 privacyUrl,以及公开站点标识。privacyUrl 必须是 HTTPS 地址。多语言字段需使用语言映射,覆盖已启用的每种语言,例如 en 与 zh-CN。
|
|
47
47
|
- 可用供应商包括 Google Tag Manager 和 Meta Pixel;Cloudflare Web Analytics、Google Analytics 和百度统计;Google AdSense;以及 Cloudflare Turnstile、Google reCAPTCHA 和 hCaptcha。
|
|
48
|
-
-
|
|
48
|
+
- plugins.consent.proposedDate 必须设置为 YYYY-MM-DD 格式的告知拟定日期。告知生效后再设置 effectiveDate;尚未生效时可以省略。修改任一日期都会使旧的同意记录失效,并重新询问访客。
|
|
49
|
+
- 只有访客接受对应集成后才会导入供应商代码。首层同时提供接受和拒绝,数据详情与逐项开关位于展开内容中。不要把 CAPTCHA 密钥放入 config.yml 或客户端代码。服务器必须在接受表单前将每个 CAPTCHA 响应提交给供应商验证 API。
|
|
49
50
|
- type: notice
|
|
50
51
|
title: 运营者信息
|
|
51
52
|
text: 配置浏览器供应商前,请填写 privacy.controller.name、privacy.controller.contact 和 privacy.policyUrl。控制者名称或联系方式为空时,构建器会拒绝启用供应商服务。
|
|
@@ -85,8 +86,8 @@ blocks:
|
|
|
85
86
|
items:
|
|
86
87
|
- label: Cloudflare Turnstile Siteverify
|
|
87
88
|
url: https://developers.cloudflare.com/turnstile/get-started/server-side-validation/
|
|
88
|
-
- label: EDPB
|
|
89
|
-
url: https://www.edpb.europa.eu/
|
|
89
|
+
- label: EDPB 同意摘要
|
|
90
|
+
url: https://www.edpb.europa.eu/system/files/2026-04/edpb-summary-consent_en.pdf
|
|
90
91
|
- columns: 1
|
|
91
92
|
cells:
|
|
92
93
|
-
|
|
@@ -2,72 +2,92 @@
|
|
|
2
2
|
title: Privacy policy
|
|
3
3
|
lang: en
|
|
4
4
|
slug: privacy-policy
|
|
5
|
-
description:
|
|
5
|
+
description: How this site handles request data, consent choices, optional analytics, data rights, and supplier disclosures.
|
|
6
6
|
blocks:
|
|
7
7
|
- columns: 1
|
|
8
8
|
cells:
|
|
9
9
|
-
|
|
10
10
|
- type: section
|
|
11
|
-
title:
|
|
11
|
+
title: Controller and contact
|
|
12
12
|
tone: soft
|
|
13
13
|
blocks:
|
|
14
14
|
- type: privacy-controller
|
|
15
15
|
nameLabel: Controller
|
|
16
16
|
contactLabel: Privacy contact
|
|
17
17
|
missingTitle: Publication setup required
|
|
18
|
-
missingText:
|
|
18
|
+
missingText: Add the responsible person's or organization's real name and a working privacy contact in config.yml before publishing.
|
|
19
|
+
- type: text
|
|
20
|
+
text: Confirm that the configured name identifies the responsible person or legal entity. Add a postal address, EU representative, or data protection officer contact here when applicable to the operator.
|
|
19
21
|
- columns: 2
|
|
20
22
|
cells:
|
|
21
23
|
-
|
|
22
24
|
- type: section
|
|
23
|
-
title:
|
|
25
|
+
title: Site requests and legal bases
|
|
24
26
|
blocks:
|
|
25
27
|
- type: text
|
|
26
28
|
paragraphs:
|
|
27
|
-
- This
|
|
28
|
-
-
|
|
29
|
-
-
|
|
29
|
+
- This site publishes pages and posts and provides client-side search. It has no visitor accounts, comments, or contact form in this build.
|
|
30
|
+
- To deliver and protect the site, the hosting and network providers receive request data such as IP address, requested path, request time, and browser or device headers. Where GDPR applies, the operator relies on legitimate interests in serving a secure and reliable site (Article 6(1)(f)); the operator must document the balancing assessment and confirm actual hosting logs and retention in the deployment account.
|
|
31
|
+
- Optional browser services listed below load only after an affirmative choice. Where their processing includes personal data and consent is the chosen legal basis, it is based on consent (Article 6(1)(a)). Refusing optional services does not prevent access to the site's basic pages.
|
|
30
32
|
-
|
|
31
33
|
- type: section
|
|
32
34
|
title: Optional browser services
|
|
33
35
|
blocks:
|
|
34
36
|
- type: text
|
|
35
|
-
text:
|
|
37
|
+
text: This list is generated from enabled services in config.yml. It identifies each purpose, data category, recipient, retention period, and the supplier's own privacy information.
|
|
36
38
|
- type: privacy-services
|
|
37
|
-
emptyText: No optional third-party browser services are configured
|
|
39
|
+
emptyText: No optional third-party browser services are configured.
|
|
38
40
|
- columns: 1
|
|
39
41
|
cells:
|
|
40
42
|
-
|
|
41
43
|
- type: section
|
|
42
|
-
title:
|
|
44
|
+
title: Cloudflare Web Analytics
|
|
45
|
+
blocks:
|
|
46
|
+
- type: text
|
|
47
|
+
paragraphs:
|
|
48
|
+
- When accepted, the Cloudflare beacon reports page-view and browser performance metrics. Its published dimensions include page path, referrer, device, browser, operating system, and country. Cloudflare says its beacon receives the source IP as part of the HTTP request, discards it at the nearest data center, and does not store it in its core databases or logs; Cloudflare also says the beacon does not use browser storage.
|
|
49
|
+
- Cloudflare states that unsampled beacon data is retained for 7 days and then aggregated to about 10% for longer-term storage; dashboard history is available for 6 months. The beacon may be processed in a different country or region from the visitor. The operator must check the actual Cloudflare account, plan, and applicable data processing terms before publication.
|
|
50
|
+
- columns: 2
|
|
51
|
+
cells:
|
|
52
|
+
-
|
|
53
|
+
- type: section
|
|
54
|
+
title: Consent, retention, and transfers
|
|
43
55
|
tone: accent
|
|
44
56
|
blocks:
|
|
45
57
|
- type: text
|
|
46
58
|
paragraphs:
|
|
47
|
-
-
|
|
48
|
-
-
|
|
59
|
+
- The privacy choice is saved in the visitor's browser on that device for the configured period. This site does not send the choice to the operator or keep a server-side receipt. A visitor can reopen Privacy settings to change or withdraw it; withdrawal stops an active integration after the page reloads. If the operator relies on consent to process personal data, the operator must ensure it can demonstrate consent as required by GDPR Article 7.
|
|
60
|
+
- Hosting and security log retention depends on the deployed provider account and is not set by this source configuration. Cloudflare's data processing addendum describes transfer safeguards, including standard contractual clauses for restricted transfers; the operator must confirm the applicable agreement and safeguards for this deployment.
|
|
49
61
|
- type: privacy-consent
|
|
50
|
-
storageLabel:
|
|
62
|
+
storageLabel: Saved on
|
|
51
63
|
expiryLabel: Preference expiry
|
|
52
|
-
|
|
64
|
+
proposedDateLabel: Notice proposed
|
|
65
|
+
effectiveDateLabel: Notice effective
|
|
53
66
|
expiryText: "{days} days after saving"
|
|
54
|
-
- columns: 1
|
|
55
|
-
cells:
|
|
56
67
|
-
|
|
57
68
|
- type: section
|
|
58
|
-
title:
|
|
69
|
+
title: Your rights
|
|
59
70
|
blocks:
|
|
60
71
|
- type: text
|
|
61
72
|
paragraphs:
|
|
62
|
-
-
|
|
63
|
-
-
|
|
73
|
+
- Where GDPR applies, you may request access, rectification, erasure, restriction, or object to processing. You may request data portability where the legal conditions apply, and withdraw consent at any time without affecting processing that was lawful before withdrawal.
|
|
74
|
+
- Contact the controller using the details above to exercise a right or ask a question. You may also complain to the competent data protection supervisory authority, including in the EU country where you live, work, or believe an infringement occurred.
|
|
75
|
+
- This site does not configure solely automated decisions that produce legal or similarly significant effects. The operator should update this notice if that changes or if the site adds accounts, forms, or other data uses.
|
|
76
|
+
- columns: 1
|
|
77
|
+
cells:
|
|
78
|
+
-
|
|
79
|
+
- type: section
|
|
80
|
+
title: Legal reference
|
|
81
|
+
blocks:
|
|
64
82
|
- type: link-list
|
|
65
|
-
title:
|
|
83
|
+
title: Official documents
|
|
66
84
|
items:
|
|
67
|
-
- label:
|
|
68
|
-
url: https://eur-lex.europa.eu/eli/reg/2016/679
|
|
69
|
-
- label:
|
|
70
|
-
url: https://
|
|
71
|
-
- label:
|
|
72
|
-
url: https://
|
|
73
|
-
|
|
85
|
+
- label: General Data Protection Regulation (EUR-Lex)
|
|
86
|
+
url: https://eur-lex.europa.eu/eli/reg/2016/679/oj/eng
|
|
87
|
+
- label: Cloudflare RUM beacon privacy details
|
|
88
|
+
url: https://developers.cloudflare.com/speed/observatory/rum-beacon/
|
|
89
|
+
- label: Cloudflare Web Analytics retention and FAQ
|
|
90
|
+
url: https://developers.cloudflare.com/web-analytics/faq/
|
|
91
|
+
- label: Cloudflare Data Processing Addendum
|
|
92
|
+
url: https://www.cloudflare.com/cloudflare-customer-dpa/
|
|
93
|
+
---
|