edgepress 2026.9.6 → 2026.9.8

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.
Files changed (42) hide show
  1. package/README.md +2 -2
  2. package/config.yml +110 -63
  3. package/content/pages/home/en.md +9 -1
  4. package/content/pages/home/zh-cn.md +9 -1
  5. package/content/pages/plugin-development/en.md +5 -4
  6. package/content/pages/plugin-development/zh-cn.md +5 -4
  7. package/content/pages/privacy-policy/en.md +7 -4
  8. package/content/pages/privacy-policy/zh-cn.md +7 -4
  9. package/content/pages/theme-development/en.md +1 -0
  10. package/content/pages/theme-development/zh-cn.md +1 -0
  11. package/content/posts/2026-09-23-edgepress-on-the-edge/en.md +9 -1
  12. package/content/posts/2026-09-23-edgepress-on-the-edge/zh-cn.md +9 -1
  13. package/content/posts/2026-09-25-edgepress-release-2026-9-6/en.md +2 -2
  14. package/content/posts/2026-09-25-edgepress-release-2026-9-6/zh-cn.md +2 -2
  15. package/content/posts/2026-09-26-edgepress-release-2026-9-7/en.md +26 -0
  16. package/content/posts/2026-09-26-edgepress-release-2026-9-7/zh-cn.md +26 -0
  17. package/content/posts/2026-09-26-edgepress-release-2026-9-8/en.md +26 -0
  18. package/content/posts/2026-09-26-edgepress-release-2026-9-8/zh-cn.md +26 -0
  19. package/languages/base/en.json +7 -2
  20. package/languages/packs/zh-CN.json +7 -2
  21. package/package.json +2 -3
  22. package/plugins/consent/index.js +4 -2
  23. package/project-compatibility.json +19 -3
  24. package/src/build.js +5 -4
  25. package/src/cli.js +1 -11
  26. package/src/config.js +72 -14
  27. package/src/content.js +22 -1
  28. package/src/generators.js +25 -20
  29. package/src/i18n.js +6 -0
  30. package/src/markdown.js +88 -9
  31. package/src/page-blocks.js +61 -16
  32. package/src/page-check.js +73 -24
  33. package/src/report-visuals.js +111 -16
  34. package/static/edgepress/brand/mascot-209.webp +0 -0
  35. package/static/edgepress/brand/mascot-418.png +0 -0
  36. package/static/edgepress/brand/mascot-418.webp +0 -0
  37. package/static/edgepress/plugins/consent/manager.js +204 -71
  38. package/static/edgepress/plugins/statistics/cloudflare-web-analytics.js +1 -0
  39. package/themes/atelier/assets/style.css +50 -19
  40. package/themes/default/assets/style.css +50 -19
  41. package/themes/signal/assets/style.css +50 -19
  42. package/CHANGELOG.txt +0 -12
package/README.md CHANGED
@@ -67,6 +67,6 @@ The main navigation includes a Posts entry to the localized article archive. The
67
67
 
68
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`; the privacy policy still reports that its real operator name and working privacy contact must be added before publication.
69
69
 
70
- Version 2026.9.6 records the sixth requested release update for September 2026. It is available as the `edgepress` npm package. 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/), and [request 6 notes](content/posts/2026-09-25-edgepress-release-2026-9-6/).
70
+ Version 2026.9.8 records the eighth requested release update for September 2026. It is available as the `edgepress` npm package. 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/), and [request 8 notes](content/posts/2026-09-26-edgepress-release-2026-9-8/).
71
71
 
72
- The release also adds shared icons, EdgePress brand artwork, paginated homepage post lists, and article author bylines. See [CHANGELOG.txt](CHANGELOG.txt) for the complete entry.
72
+ This release adds Markdown video syntax for posts, locale-deduplicated chronological archives, Markdown-rendered post excerpts, date-based consent policy metadata, localized service disclosures, and separate consent-component layout checks. Optional services remain disabled until a visitor makes an explicit choice.
package/config.yml CHANGED
@@ -84,68 +84,115 @@ privacy:
84
84
  plugins:
85
85
  consent:
86
86
  enabled: true
87
- version: "1"
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
- tracking:
90
- enabled: true
91
- services: []
92
- # Example:
93
- # - id: tag-manager
94
- # provider: google-tag-manager
95
- # purpose: Load consented campaign tags.
96
- # retention: Set and disclose the applicable retention period.
97
- # containerId: GTM-ABCD123
98
- # - id: social-pixel
99
- # provider: meta-pixel
100
- # purpose: Measure consented campaign traffic.
101
- # retention: Set and disclose the provider's retention period.
102
- # pixelId: "123456789012345"
103
- statistics:
104
- enabled: true
105
- services: []
106
- # Examples use public provider IDs only.
107
- # - id: primary-analytics
108
- # provider: google-analytics
109
- # purpose: Measure consented site visits.
110
- # retention: Set and disclose the provider's retention period.
111
- # measurementId: G-ABC12345
112
- # - id: edge-analytics
113
- # provider: cloudflare-web-analytics
114
- # purpose: Measure consented site visits.
115
- # retention: Set and disclose the applicable retention period.
116
- # token: 01234567-89ab-cdef-0123-456789abcdef
117
- # - id: baidu-analytics
118
- # provider: baidu-tongji
119
- # purpose: Measure consented site visits.
120
- # retention: Set and disclose the provider's retention period.
121
- # siteId: abcdef0123456789abcdef01
122
- advertising:
123
- enabled: true
124
- services: []
125
- # Example:
126
- # - id: display-ads
127
- # provider: google-adsense
128
- # purpose: Display consented advertising.
129
- # retention: Set and disclose the provider's retention period.
130
- # clientId: ca-pub-1234567890123456
131
- captcha:
132
- enabled: true
133
- services: []
134
- # Choose a provider for each CAPTCHA block. Never add its secret key here.
135
- # - id: contact-form-check
136
- # provider: cloudflare-turnstile
137
- # purpose: Reduce automated contact form submissions.
138
- # retention: Configure and disclose the provider's retention period.
139
- # siteKey: 0x4AAAAAAABBBBBBBBCCCCCCDDDD
140
- # - id: signup-form-check
141
- # provider: google-recaptcha
142
- # purpose: Reduce automated signup submissions.
143
- # retention: Configure and disclose the provider's retention period.
144
- # siteKey: 6LcAbCdEfGhIjKlMnOpQrStUvWxYz0123456789a
145
- # - id: support-form-check
146
- # provider: hcaptcha
147
- # purpose: Reduce automated support requests.
148
- # retention: Configure and disclose the provider's retention period.
149
- # siteKey: 0123456789abcdefghijklmnopqrstuvwx
150
- # Add browser services under these groups after filling the real site operator details above.
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
+ # containerId: GTM-ABCD123
103
+ # - id: social-pixel
104
+ # provider: meta-pixel
105
+ # name: { en: Meta Pixel, zh-CN: Meta Pixel }
106
+ # purpose: { en: Measure campaign traffic after consent., zh-CN: 经同意后衡量营销流量。 }
107
+ # dataCategories: { en: Describe data sent by this pixel., zh-CN: 填写此像素发送的数据类别。 }
108
+ # recipient: { en: Meta Platforms, Inc., zh-CN: Meta Platforms, Inc. }
109
+ # retention: { en: Configure the provider's retention period., zh-CN: 填写供应商的数据保留期限。 }
110
+ # pixelId: "123456789012345"
111
+ statistics:
112
+ enabled: true
113
+ services:
114
+ - id: cloudflare-web-analytics
115
+ provider: cloudflare-web-analytics
116
+ name:
117
+ en: Cloudflare Web Analytics
118
+ zh-CN: Cloudflare 网站分析
119
+ purpose:
120
+ en: Measure page views and page-load performance after consent.
121
+ zh-CN: 经访客同意后衡量页面浏览量和页面加载性能。
122
+ dataCategories:
123
+ en: Performance timing and page-view metrics. Report dimensions can include page path, referrer, device type, browser, operating system, and country.
124
+ zh-CN: 性能计时和页面浏览指标。报告维度可能包括页面路径、来源页、设备类型、浏览器、操作系统和国家或地区。
125
+ recipient:
126
+ en: Cloudflare, Inc.
127
+ zh-CN: Cloudflare, Inc.
128
+ retention:
129
+ 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.
130
+ zh-CN: 未采样的信标数据保留 7 天,之后会汇总为约 10% 的长期数据。仪表板可查看最近 6 个月的历史记录。
131
+ token: "8347d72ba9f84e6783bf441e7832a80e"
132
+ # Examples use public provider IDs only.
133
+ # - id: primary-analytics
134
+ # provider: google-analytics
135
+ # name: { en: Google Analytics, zh-CN: Google Analytics }
136
+ # purpose: { en: Measure site visits after consent., zh-CN: 经访客同意后衡量网站访问情况。 }
137
+ # dataCategories: { en: Describe the data processed by this property., zh-CN: 填写此媒体资源处理的数据类别。 }
138
+ # recipient: { en: Google LLC, zh-CN: Google LLC }
139
+ # retention: { en: Configure the provider's retention period., zh-CN: 填写供应商的数据保留期限。 }
140
+ # measurementId: G-ABC12345
141
+ # - id: edge-analytics
142
+ # provider: cloudflare-web-analytics
143
+ # name: { en: Cloudflare Web Analytics, zh-CN: Cloudflare 网站分析 }
144
+ # purpose: { en: Measure site visits after consent., zh-CN: 经访客同意后衡量网站访问情况。 }
145
+ # dataCategories: { en: Describe the data processed by this site., zh-CN: 填写此站点处理的数据类别。 }
146
+ # recipient: { en: Cloudflare, Inc., zh-CN: Cloudflare, Inc. }
147
+ # retention: { en: Configure the retention period., zh-CN: 填写数据保留期限。 }
148
+ # token: 01234567-89ab-cdef-0123-456789abcdef
149
+ # - id: baidu-analytics
150
+ # provider: baidu-tongji
151
+ # name: { en: Baidu Tongji, zh-CN: 百度统计 }
152
+ # purpose: { en: Measure site visits after consent., zh-CN: 经访客同意后衡量网站访问情况。 }
153
+ # dataCategories: { en: Describe data sent to this site ID., zh-CN: 填写此站点编号接收的数据类别。 }
154
+ # recipient: { en: Baidu, Inc., zh-CN: 百度 }
155
+ # retention: { en: Configure the provider's retention period., zh-CN: 填写供应商的数据保留期限。 }
156
+ # siteId: abcdef0123456789abcdef01
157
+ advertising:
158
+ enabled: true
159
+ services: []
160
+ # Example:
161
+ # - id: display-ads
162
+ # provider: google-adsense
163
+ # name: { en: Google AdSense, zh-CN: Google AdSense }
164
+ # purpose: { en: Display ads after consent., zh-CN: 经访客同意后展示广告。 }
165
+ # dataCategories: { en: Describe the data processed for ad delivery., zh-CN: 填写广告投放处理的数据类别。 }
166
+ # recipient: { en: Google LLC, zh-CN: Google LLC }
167
+ # retention: { en: Configure the provider's retention period., zh-CN: 填写供应商的数据保留期限。 }
168
+ # clientId: ca-pub-1234567890123456
169
+ captcha:
170
+ enabled: true
171
+ services: []
172
+ # Choose a provider for each CAPTCHA block. Never add its secret key here.
173
+ # - id: contact-form-check
174
+ # provider: cloudflare-turnstile
175
+ # name: { en: Cloudflare Turnstile, zh-CN: Cloudflare Turnstile }
176
+ # purpose: { en: Reduce automated contact form submissions., zh-CN: 减少联系表单中的自动化提交。 }
177
+ # dataCategories: { en: Describe challenge and response data., zh-CN: 填写验证挑战和响应处理的数据类别。 }
178
+ # recipient: { en: Cloudflare, Inc., zh-CN: Cloudflare, Inc. }
179
+ # retention: { en: Configure the provider's retention period., zh-CN: 填写供应商的数据保留期限。 }
180
+ # siteKey: 0x4AAAAAAABBBBBBBBCCCCCCDDDD
181
+ # - id: signup-form-check
182
+ # provider: google-recaptcha
183
+ # name: { en: Google reCAPTCHA, zh-CN: Google reCAPTCHA }
184
+ # purpose: { en: Reduce automated signup submissions., zh-CN: 减少注册表单中的自动化提交。 }
185
+ # dataCategories: { en: Describe challenge and response data., zh-CN: 填写验证挑战和响应处理的数据类别。 }
186
+ # recipient: { en: Google LLC, zh-CN: Google LLC }
187
+ # retention: { en: Configure the provider's retention period., zh-CN: 填写供应商的数据保留期限。 }
188
+ # siteKey: 6LcAbCdEfGhIjKlMnOpQrStUvWxYz0123456789a
189
+ # - id: support-form-check
190
+ # provider: hcaptcha
191
+ # name: { en: hCaptcha, zh-CN: hCaptcha }
192
+ # purpose: { en: Reduce automated support requests., zh-CN: 减少自动化的支持请求。 }
193
+ # dataCategories: { en: Describe challenge and response data., zh-CN: 填写验证挑战和响应处理的数据类别。 }
194
+ # recipient: { en: Intuition Machines, Inc., zh-CN: Intuition Machines, Inc. }
195
+ # retention: { en: Configure the provider's retention period., zh-CN: 填写供应商的数据保留期限。 }
196
+ # siteKey: 0123456789abcdefghijklmnopqrstuvwx
197
+ # Add browser services under plugins.consent after filling the real site operator details above.
151
198
  # Every configured service waits for the visitor's explicit consent before its vendor code loads.
@@ -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,8 +17,16 @@ 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
32
  url: /quick-start/
@@ -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 entry needs a unique ID, purpose, retention description, and a public provider identifier.
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, and its public site identifier. 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
- - Provider code is imported only after the visitor accepts that integration. 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.
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: Consent guidelines from the EDPB
89
- url: https://www.edpb.europa.eu/sites/default/files/files/file1/edpb_guidelines_202005_consent_en.pdf
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 和公开站点标识。多语言字段需使用语言映射,覆盖已启用的每种语言,例如 en 与 zh-CN。
47
47
  - 可用供应商包括 Google Tag Manager 和 Meta Pixel;Cloudflare Web Analytics、Google Analytics 和百度统计;Google AdSense;以及 Cloudflare Turnstile、Google reCAPTCHA 和 hCaptcha。
48
- - 只有访客接受对应集成后才会导入供应商代码。不要把 CAPTCHA 密钥放入 config.yml 或客户端代码。服务器必须在接受表单前将每个 CAPTCHA 响应提交给供应商验证 API。
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/sites/default/files/files/file1/edpb_guidelines_202005_consent_en.pdf
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
  -
@@ -32,7 +32,7 @@ blocks:
32
32
  title: Optional browser services
33
33
  blocks:
34
34
  - type: text
35
- text: The current configuration has no tracking, statistics, advertising, or human-verification providers in its service lists. If the operator adds a service, the list below is generated from its configured provider, purpose, and retention description.
35
+ text: This list is regenerated on each build from enabled browser services in config.yml under plugins.consent. It shows each service name, provider category, purpose, data categories, recipient, and configured retention period.
36
36
  - type: privacy-services
37
37
  emptyText: No optional third-party browser services are configured in this source build.
38
38
  - columns: 1
@@ -44,12 +44,14 @@ blocks:
44
44
  blocks:
45
45
  - type: text
46
46
  paragraphs:
47
- - Browser integrations are loaded only after the visitor accepts a configured service. The consent interface stores a first-party preference in local browser storage when a choice can be saved. It is not a server-side audit log.
48
- - Visitors can reopen Privacy settings to change a choice. If they withdraw a previously active service, the page reloads so that the integration can stop running.
47
+ - Optional browser integrations stay off until a visitor actively accepts them. No service is selected on a first visit. Accept and reject are both available at the same level; visitors can also open the service details and save a granular choice.
48
+ - The interface stores the selected service IDs in first-party browser storage for the configured period. This preference record is stored on the visitor's device; it is not a server-side audit log.
49
+ - Visitors can reopen Privacy settings to change or withdraw a choice. If they withdraw a previously active service, the page reloads so the integration can stop running.
49
50
  - type: privacy-consent
50
51
  storageLabel: Browser storage key
51
52
  expiryLabel: Preference expiry
52
- versionLabel: Consent configuration version
53
+ proposedDateLabel: Notice proposed
54
+ effectiveDateLabel: Notice effective
53
55
  expiryText: "{days} days after saving"
54
56
  - columns: 1
55
57
  cells:
@@ -61,6 +63,7 @@ blocks:
61
63
  paragraphs:
62
64
  - Before enabling a provider, the operator must document the information it receives, purposes, recipients, applicable retention, and any cross-border transfers. Public site identifiers may be configured in the browser; CAPTCHA secret keys must stay on a trusted server, which must verify each response token.
63
65
  - This starter configuration cannot determine the operator's jurisdiction, legal bases, retention obligations, or the rights that apply to a particular deployment. Complete this policy for the actual site and seek qualified advice where needed.
66
+ - Review the current privacy information and terms for every provider listed above. Confirm that its actual data collection, recipients, retention, and transfer practices match this policy before publication and whenever the configuration changes.
64
67
  - type: link-list
65
68
  title: Primary legal references
66
69
  items:
@@ -32,7 +32,7 @@ blocks:
32
32
  title: 可选浏览器服务
33
33
  blocks:
34
34
  - type: text
35
- text: 当前配置的跟踪、统计、广告和人机验证服务列表均为空。运营者添加服务后,下方列表会根据所配置的供应商、用途和保留期限自动生成。
35
+ text: 下方列表会在每次构建时根据 config.yml 中 plugins.consent 下已启用的浏览器服务重新生成,显示服务名称、供应商类别、用途、数据类别、接收方和配置的保留期限。
36
36
  - type: privacy-services
37
37
  emptyText: 此源项目当前没有配置可选的第三方浏览器服务。
38
38
  - columns: 1
@@ -44,12 +44,14 @@ blocks:
44
44
  blocks:
45
45
  - type: text
46
46
  paragraphs:
47
- - 浏览器集成只有在访客接受已配置服务后才会加载。存在可保存的选择时,同意界面会将第一方偏好存储在本地浏览器中;它不是服务器端审计日志。
48
- - 访客可以重新打开“隐私设置”更改选择。撤回之前已启用的服务后,页面会重新载入,以停止该集成继续运行。
47
+ - 可选浏览器集成只有在访客主动接受后才会加载。首次访问时没有预先选中的服务;接受和拒绝选项处于同一层级,访客也可以展开服务详情并保存逐项选择。
48
+ - 同意界面会在第一方浏览器存储中保存访客选择的服务 ID,并遵循下方配置的有效期限。该偏好记录只保存在访客设备上,不是服务器端审计日志。
49
+ - 访客可以重新打开“隐私设置”更改或撤回选择。撤回之前已启用的服务后,页面会重新载入,以停止该集成继续运行。
49
50
  - type: privacy-consent
50
51
  storageLabel: 浏览器存储键
51
52
  expiryLabel: 偏好过期时间
52
- versionLabel: 同意配置版本
53
+ proposedDateLabel: 隐私告知拟定日期
54
+ effectiveDateLabel: 隐私告知生效日期
53
55
  expiryText: "保存后 {days} 天"
54
56
  - columns: 1
55
57
  cells:
@@ -61,6 +63,7 @@ blocks:
61
63
  paragraphs:
62
64
  - 启用供应商前,运营者应记录供应商接收的信息、处理目的、接收方、适用保留期限和跨境传输情况。浏览器配置中只能填写公开站点标识;CAPTCHA 密钥必须保存在可信服务器中,并由服务器验证每个响应令牌。
63
65
  - 此起始配置无法确定实际部署的运营者所在地、法律依据、数据保留义务或适用的个人权利。请根据实际网站完成政策,必要时咨询合格的专业人员。
66
+ - 请核对上方每个供应商当前的隐私说明和适用条款,确认其实际收集的数据、接收方、保留期限和传输方式与本政策一致。发布前以及配置变更后都应重新检查。
64
67
  - type: link-list
65
68
  title: 主要法律资料
66
69
  items:
@@ -66,6 +66,7 @@ blocks:
66
66
  - Each page and locale is a Markdown file, but the page body after front matter must stay empty. The editor data lives in its blocks YAML.
67
67
  - "Order the data from the outside inward: set each row's columns count first, provide one cells entry per column, select an element type inside a cell, then edit that element's fields. The validator rejects mismatched column counts and empty cells."
68
68
  - Pages do not use the post Markdown renderer. Posts remain Markdown articles and use the built-in sanitizing renderer.
69
+ - Hero blocks can use mascotWebpSrcset with ascending path-and-width candidates, mascotSizes matching the rendered width, and mascotWidth/mascotHeight matching the fallback image. mascotSrc remains the fallback for browsers without WebP support.
69
70
  - type: data-table
70
71
  title: Available element families
71
72
  headers:
@@ -66,6 +66,7 @@ blocks:
66
66
  - 每个页面和语言版本都是一个 Markdown 文件,但 front matter 之后必须保持空白。页面编辑数据放在 YAML blocks 中。
67
67
  - 数据从外向内排列:先设每行的 columns 栏数,再为每栏设置一个 cells 项,然后在栏内选择元素类型,最后编辑该元素字段。验证器会拒绝栏数不匹配或空白的栏。
68
68
  - 页面不使用文章 Markdown 渲染器。文章仍使用 Markdown 撰写,并由内置安全渲染器输出。
69
+ - hero 元素可用 mascotWebpSrcset 提供按宽度递增的路径候选项,并设置与显示宽度一致的 mascotSizes,以及匹配备用图片尺寸的 mascotWidth 和 mascotHeight。mascotSrc 会留作不支持 WebP 的浏览器备用图。
69
70
  - type: data-table
70
71
  title: 可用元素类别
71
72
  headers:
@@ -104,6 +104,14 @@ Images use the same shape as links, with an exclamation mark and useful alternat
104
104
 
105
105
  ![A diagram showing Markdown source passing through EdgePress rendering and HTML sanitization to a published post](/edgepress-markdown-guide.svg "The EdgePress post pipeline")
106
106
 
107
+ Posts also accept a direct video file in the same image-shaped syntax. The alt text describes the video for assistive technology, and the optional title becomes its caption:
108
+
109
+ ```markdown
110
+ ![A kite passing over a field](https://media.example.org/field-recording.mp4 "Wind test, early morning")
111
+ ```
112
+
113
+ MP4, WebM, OGV, and OGG files are rendered in a native video player with controls. Media uses `preload="none"` so the browser waits for playback before downloading the video. Embedded video players and arbitrary iframe markup are not supported.
114
+
107
115
  ## Lists, including nested combinations
108
116
 
109
117
  Start unordered items with `-`, `+`, or `*`; start ordered items with a number and a period. Indent child items by at least two spaces. Inline emphasis, code, and links work inside either level:
@@ -160,7 +168,7 @@ Small semantic HTML elements such as <kbd>Ctrl</kbd> can be useful inside Markdo
160
168
 
161
169
  <script>alert('unsafe');</script>
162
170
 
163
- Use a page's media-text element for video; embedded frames and arbitrary scripts are not allowed in posts.
171
+ Use the Markdown image-shaped syntax above for a direct video file; embedded frames and arbitrary scripts are not allowed in posts.
164
172
 
165
173
  This is the complete enabled post dialect: CommonMark block and inline syntax plus GFM tables, autolinks, task lists, and strikethrough. Extensions such as footnotes, math notation, Mermaid diagrams, underline syntax, and definition lists are not enabled by this project. They remain ordinary text unless you add a trusted renderer extension.
166
174
 
@@ -104,6 +104,14 @@ CommonMark 也支持每行缩进四个空格的代码块:
104
104
 
105
105
  ![Markdown 源文件依次经过 EdgePress 渲染与 HTML 清理,生成发布文章的流程图](/edgepress-markdown-guide.svg "EdgePress 文章生成流程")
106
106
 
107
+ 文章也支持使用图片形状的 Markdown 语法插入直接视频文件。替代文字用于向辅助技术描述视频,可选标题会显示为视频说明:
108
+
109
+ ```markdown
110
+ ![一只风筝掠过田野](https://media.example.org/field-recording.mp4 "清晨的风况测试")
111
+ ```
112
+
113
+ MP4、WebM、OGV 和 OGG 文件会渲染为带控制按钮的原生视频播放器,并设置 `preload="none"`,在访客播放前不预加载视频。文章不支持嵌入式播放器或任意 iframe 标记。
114
+
107
115
  ## 列表与嵌套组合
108
116
 
109
117
  无序列表项以 `-`、`+` 或 `*` 开头;有序列表项以数字和句点开头。子项目缩进至少两个空格。两种列表都可以包含强调、代码和链接:
@@ -160,7 +168,7 @@ GFM 也会把 `www.example.com` 与 `https://example.com` 转换成链接,并
160
168
 
161
169
  <script>alert('unsafe');</script>
162
170
 
163
- 视频请使用页面的「媒体与文字」元素;文章不允许嵌入框架或任意脚本。
171
+ 视频请使用上面的图片形状 Markdown 语法;文章不允许嵌入播放器框架或任意脚本。
164
172
 
165
173
  本项目启用的文章语法范围是:CommonMark 的块级和行内语法,加上 GFM 表格、自动链接、任务列表与删除线。脚注、数学公式、Mermaid 图表、下划线语法和定义列表等扩展没有启用;除非添加受信任的渲染扩展,否则它们会作为普通文字显示。
166
174
 
@@ -22,9 +22,9 @@ Generated code blocks now have an accessible copy button. Theme styles wrap long
22
22
 
23
23
  The project compatibility history is updated to version `2026.9.6`.
24
24
 
25
- ## Site identity and themes
25
+ ## Theme palettes
26
26
 
27
- The starter canonical URL is `https://edgepress.js.gripe` and the configured author is `toewpq`. The bundled themes have refreshed, higher-contrast palettes. The privacy policy continues to call for a real operator name and working privacy contact before publication.
27
+ The bundled themes have refreshed, higher-contrast palettes.
28
28
 
29
29
  ## A clearer visual identity and reading path
30
30
 
@@ -22,9 +22,9 @@ tags:
22
22
 
23
23
  项目兼容性历史已更新至 `2026.9.6`。
24
24
 
25
- ## 站点信息和主题配色
25
+ ## 主题配色
26
26
 
27
- 起始配置的规范网址为 `https://edgepress.js.gripe`,作者设为 `toewpq`。内置主题已换成对比度更清晰、视觉更鲜明的新配色。隐私政策仍会提示:发布前需要填写真实运营者名称和有效的隐私联系方式。
27
+ 内置主题已换成对比度更清晰、视觉更鲜明的新配色。
28
28
 
29
29
  ## 更清晰的视觉识别与阅读路径
30
30
 
@@ -0,0 +1,26 @@
1
+ ---
2
+ title: "EdgePress September 2026 update: request 7"
3
+ author: toewpq
4
+ date: 2026-09-26
5
+ lang: en
6
+ slug: edgepress-release-2026-9-7
7
+ tags:
8
+ - release
9
+ - performance
10
+ - privacy
11
+
12
+ ---
13
+
14
+ This is the seventh requested EdgePress update for September 2026.
15
+
16
+ ## Consent and privacy disclosures
17
+
18
+ Cloudflare Web Analytics is configured as a statistics service and remains behind the visitor's explicit consent. Browser service groups now live under `plugins.consent` in `config.yml`. The privacy policy lists each enabled service's provider, category, purpose, and retention period when the site is built.
19
+
20
+ ## Images and article lists
21
+
22
+ The homepage uses smaller responsive mascot images. Article archives are sorted newest-first across all available languages, while homepage latest-post lists stay in the current language. Post excerpts now remove Markdown syntax before display.
23
+
24
+ ## Mobile controls and maintenance
25
+
26
+ The consent panel has a responsive mobile layout, clearer service details, and larger touch targets. The unused integrations directory and obsolete cleanup paths for retired audit files have been removed.
@@ -0,0 +1,26 @@
1
+ ---
2
+ title: EdgePress 2026 年 9 月更新:第 7 次需求
3
+ author: toewpq
4
+ date: 2026-09-26
5
+ lang: zh-CN
6
+ slug: edgepress-release-2026-9-7
7
+ tags:
8
+ - 发布
9
+ - 性能
10
+ - 隐私
11
+
12
+ ---
13
+
14
+ 这是 EdgePress 在 2026 年 9 月针对第 7 次需求的更新。
15
+
16
+ ## 同意管理和隐私披露
17
+
18
+ Cloudflare Web Analytics 已作为统计服务接入,并继续等待访客明确同意后才会加载。`config.yml` 中的浏览器服务组现在统一放在 `plugins.consent` 下。每次构建时,隐私政策都会列出已启用服务的供应商、类别、用途和保留期限。
19
+
20
+ ## 图片和文章列表
21
+
22
+ 首页现在使用较小的自适应吉祥物图片。文章归档会跨语言按发布时间从新到旧排列;首页最新文章列表仍按当前语言显示。文章摘要在显示前会去除 Markdown 标记。
23
+
24
+ ## 移动端控件和维护
25
+
26
+ 同意面板改进了移动端布局和服务说明,并扩大了按钮触控区域。未使用的 integrations 空目录和已废弃审计文件清理路径也已移除。
@@ -0,0 +1,26 @@
1
+ ---
2
+ title: "EdgePress September 2026 update: request 8"
3
+ author: toewpq
4
+ date: 2026-09-26
5
+ lang: en
6
+ slug: edgepress-release-2026-9-8
7
+ tags:
8
+ - release
9
+ - privacy
10
+ - Markdown
11
+
12
+ ---
13
+
14
+ This is the eighth requested EdgePress update for September 2026.
15
+
16
+ ## Date-based consent and localized disclosures
17
+
18
+ Consent settings use a required `proposedDate` and an optional `effectiveDate` instead of a version counter. The generated privacy policy displays these dates and lists configured services with localized names, purposes, data categories, recipients, and retention details. Accept and reject controls have equal prominence, optional services start unchecked, and visitors can expand the panel to make a granular choice. The consent component has scoped theme styles and its own viewport checks and screenshots, separate from page-content layout checks.
19
+
20
+ ## Video in Markdown posts
21
+
22
+ Posts can insert direct MP4, WebM, OGV, and OGG files using image-shaped Markdown syntax. The renderer creates an accessible native player with controls and `preload="none"`.
23
+
24
+ ## Post lists and summaries
25
+
26
+ Archives now choose one language version per post and sort equal-date release notes by their numeric sequence. The homepage continues to show the latest posts in the current language. Archive, tag, and homepage cards render Markdown formatting in summaries.
@@ -0,0 +1,26 @@
1
+ ---
2
+ title: EdgePress 2026 年 9 月更新:第 8 次需求
3
+ author: toewpq
4
+ date: 2026-09-26
5
+ lang: zh-CN
6
+ slug: edgepress-release-2026-9-8
7
+ tags:
8
+ - 发布
9
+ - 隐私
10
+ - Markdown
11
+
12
+ ---
13
+
14
+ 这是 EdgePress 在 2026 年 9 月针对第 8 次需求的更新。
15
+
16
+ ## 日期化同意配置与多语言披露
17
+
18
+ 同意设置使用必填的 `proposedDate` 拟定日期和可选的 `effectiveDate` 生效日期,取代版本计数。生成的隐私政策会显示这两个日期,并列出已配置服务的多语言名称、用途、数据类别、接收方和保留期限。接受与拒绝按钮具有同等醒目程度,可选服务默认不勾选;访客可以展开面板逐项设置。组件样式限定在同意管理器内,其视口检查和截图也与页面内容布局检测分开。
19
+
20
+ ## Markdown 文章中的视频
21
+
22
+ 文章可使用图片形状的 Markdown 语法插入 MP4、WebM、OGV 和 OGG 直接视频文件。渲染器会生成带控制按钮的原生播放器,并设置 `preload="none"`。
23
+
24
+ ## 文章列表和摘要
25
+
26
+ 归档现在会为每篇文章选择一个语言版本,并在日期相同时按数字序号从新到旧排列发布记录。首页仍按当前语言显示最新文章。归档、标签和首页卡片的摘要都会渲染 Markdown 格式。
@@ -36,8 +36,8 @@
36
36
  "latestPosts": "Latest posts",
37
37
  "postAuthor": "By {author}",
38
38
  "privacySettings": "Privacy settings",
39
- "privacyNotice": "Optional services",
40
- "privacyIntro": "Choose which optional services may load. Nothing is enabled until you save or accept your choices.",
39
+ "privacyNotice": "Privacy choices",
40
+ "privacyIntro": "Optional services stay off until you choose. Accept or reject them now, or review each service before saving a custom choice.",
41
41
  "acceptOptional": "Accept all",
42
42
  "rejectOptional": "Reject optional",
43
43
  "savePreferences": "Save choices",
@@ -46,7 +46,12 @@
46
46
  "privacyPolicy": "Privacy policy",
47
47
  "privacyController": "Site operator",
48
48
  "servicePurpose": "Purpose",
49
+ "serviceDataCategories": "Data used",
50
+ "serviceRecipient": "Recipient",
49
51
  "serviceRetention": "Retention",
52
+ "reviewDetails": "Review data and service settings",
53
+ "managePrivacy": "Manage choices",
54
+ "essentialStorage": "Your choice is saved in this browser for up to {days} days. This preference storage is required to remember your choice.",
50
55
  "pluginTracking": "Tracking",
51
56
  "pluginStatistics": "Statistics",
52
57
  "pluginAdvertising": "Advertising",
@@ -36,8 +36,8 @@
36
36
  "latestPosts": "最新文章",
37
37
  "postAuthor": "作者:{author}",
38
38
  "privacySettings": "隐私设置",
39
- "privacyNotice": "可选服务",
40
- "privacyIntro": "请选择允许加载的可选服务。保存或接受之前,不会启用任何服务。",
39
+ "privacyNotice": "隐私选择",
40
+ "privacyIntro": "可选服务默认关闭。你可以立即全部接受或拒绝,也可以先查看各项服务并保存自定义选择。",
41
41
  "acceptOptional": "全部接受",
42
42
  "rejectOptional": "拒绝可选服务",
43
43
  "savePreferences": "保存选择",
@@ -46,7 +46,12 @@
46
46
  "privacyPolicy": "隐私政策",
47
47
  "privacyController": "网站运营者",
48
48
  "servicePurpose": "用途",
49
+ "serviceDataCategories": "涉及的数据",
50
+ "serviceRecipient": "接收方",
49
51
  "serviceRetention": "保留期限",
52
+ "reviewDetails": "查看数据详情并管理服务",
53
+ "managePrivacy": "管理选择",
54
+ "essentialStorage": "此浏览器会保存你的选择,最长 {days} 天。这项偏好存储用于记住你的选择。",
50
55
  "pluginTracking": "跟踪",
51
56
  "pluginStatistics": "统计",
52
57
  "pluginAdvertising": "广告",