edgepress 2026.10.1 → 2026.10.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.
Files changed (485) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +216 -16
  3. package/config.yml +99 -127
  4. package/content/assets/edgepress/brand/avatar.png +0 -0
  5. package/content/assets/edgepress/brand/deploy-esa.svg +1 -0
  6. package/content/assets/edgepress/brand/home-hero-768.webp +0 -0
  7. package/content/assets/edgepress/brand/home-hero.png +0 -0
  8. package/content/assets/edgepress/brand/home-hero.webp +0 -0
  9. package/content/assets/edgepress/brand/mascot.png +0 -0
  10. package/content/assets/edgepress/brand/mascot.webp +0 -0
  11. package/content/assets/edgepress/brand/og-image.png +0 -0
  12. package/content/assets/edgepress/brand/og-image.webp +0 -0
  13. package/content/assets/edgepress/brand/sources/edgepress-avatar-master.png +0 -0
  14. package/content/assets/edgepress/brand/sources/export-manifest.json +181 -0
  15. package/content/assets/edgepress/brand/sources/prompts.json +12 -0
  16. package/content/assets/edgepress/favicon/apple-touch-icon.png +0 -0
  17. package/content/assets/edgepress/favicon/favicon-16.png +0 -0
  18. package/content/assets/edgepress/favicon/favicon-32.png +0 -0
  19. package/content/assets/edgepress/favicon/favicon-48.png +0 -0
  20. package/content/assets/edgepress/favicon/favicon-64.png +0 -0
  21. package/content/assets/edgepress/favicon/favicon.ico +0 -0
  22. package/content/assets/edgepress/icons/LICENSE.txt +43 -0
  23. package/content/assets/edgepress/icons/arrow-right.svg +16 -0
  24. package/content/assets/edgepress/icons/arrow-up-right.svg +16 -0
  25. package/content/assets/edgepress/icons/book-open.svg +16 -0
  26. package/content/assets/edgepress/icons/check-circle.svg +16 -0
  27. package/content/assets/edgepress/icons/check.svg +15 -0
  28. package/content/assets/edgepress/icons/cloud.svg +15 -0
  29. package/content/assets/edgepress/icons/code.svg +16 -0
  30. package/content/assets/edgepress/icons/cpu.svg +28 -0
  31. package/content/assets/edgepress/icons/file-text.svg +19 -0
  32. package/content/assets/edgepress/icons/github.svg +17 -0
  33. package/content/assets/edgepress/icons/globe.svg +17 -0
  34. package/content/assets/edgepress/icons/help-circle.svg +17 -0
  35. package/content/assets/edgepress/icons/home.svg +16 -0
  36. package/content/assets/edgepress/icons/layers.svg +17 -0
  37. package/content/assets/edgepress/icons/layout-grid.svg +18 -0
  38. package/content/assets/edgepress/icons/mail.svg +16 -0
  39. package/content/assets/edgepress/icons/newspaper.svg +18 -0
  40. package/content/assets/edgepress/icons/palette.svg +19 -0
  41. package/content/assets/edgepress/icons/plug.svg +18 -0
  42. package/content/assets/edgepress/icons/provenance.json +8 -0
  43. package/content/assets/edgepress/icons/puzzle.svg +15 -0
  44. package/content/assets/edgepress/icons/rocket.svg +18 -0
  45. package/content/assets/edgepress/icons/rss.svg +17 -0
  46. package/content/assets/edgepress/icons/search.svg +16 -0
  47. package/content/assets/edgepress/icons/settings.svg +16 -0
  48. package/content/assets/edgepress/icons/shield-check.svg +16 -0
  49. package/content/assets/edgepress/icons/sparkles.svg +18 -0
  50. package/content/assets/edgepress/icons/terminal.svg +16 -0
  51. package/content/assets/edgepress/icons/x.svg +16 -0
  52. package/{static → content/assets}/edgepress-markdown-guide.svg +1 -1
  53. package/content/assets/images/previews/edgepress-en.webp +0 -0
  54. package/content/assets/images/previews/edgepress-revisions-en.png +0 -0
  55. package/content/assets/images/previews/edgepress-workflow-en.90f4650b21013786.gif +0 -0
  56. package/content/assets/images/previews/edgepress-workflow-zh.41f1e0a685f47267.gif +0 -0
  57. package/content/assets/images/previews/edgepress-zh.webp +0 -0
  58. package/content/assets/images/previews/provenance.json +49 -0
  59. package/content/guides/markdown-media.md +38 -0
  60. package/content/guides/platforms.md +15 -0
  61. package/content/guides/product-demos.md +37 -0
  62. package/content/guides/zh-cn.md +62 -0
  63. package/content/pages/deployment/en.json +74 -0
  64. package/content/pages/deployment/zh-cn.json +74 -0
  65. package/content/pages/home/en.json +248 -0
  66. package/content/pages/home/zh-cn.json +248 -0
  67. package/content/pages/local-tools/en.json +14 -0
  68. package/content/pages/local-tools/zh-cn.json +14 -0
  69. package/content/pages/page-authoring/en.json +107 -0
  70. package/content/pages/page-authoring/zh-cn.json +107 -0
  71. package/content/pages/plugin-development/en.json +202 -0
  72. package/content/pages/plugin-development/zh-cn.json +202 -0
  73. package/content/pages/privacy-policy/en.json +171 -0
  74. package/content/pages/privacy-policy/zh-cn.json +171 -0
  75. package/content/pages/project-introduction/en.json +158 -0
  76. package/content/pages/project-introduction/zh-cn.json +158 -0
  77. package/content/pages/quick-start/en.json +325 -0
  78. package/content/pages/quick-start/zh-cn.json +325 -0
  79. package/content/pages/theme-development/en.json +353 -0
  80. package/content/pages/theme-development/zh-cn.json +349 -0
  81. package/content/posts/2026-09-24-edgepress-release-2026-9-1/en.md +1 -1
  82. package/content/posts/2026-09-24-edgepress-release-2026-9-1/zh-cn.md +1 -1
  83. package/content/posts/2026-10-03-edgepress-release-2026-10-3/en.md +16 -0
  84. package/content/posts/2026-10-03-edgepress-release-2026-10-3/zh-cn.md +16 -0
  85. package/content/posts/2026-10-03-edgepress-release-202610-4/en.md +22 -0
  86. package/content/posts/2026-10-03-edgepress-release-202610-4/zh-cn.md +20 -0
  87. package/content/posts/2026-10-03-edgepress-release-202610-5/en.md +15 -0
  88. package/content/posts/2026-10-03-edgepress-release-202610-5/zh-cn.md +15 -0
  89. package/edgeone.json +43 -0
  90. package/esa.jsonc +9 -0
  91. package/languages/base/en.json +75 -10
  92. package/languages/packs/zh-CN.json +74 -9
  93. package/netlify.toml +6 -0
  94. package/package.json +37 -6
  95. package/plugins/consent/index.js +10 -17
  96. package/project-compatibility.json +142 -25
  97. package/schemas/pages.schema.json +74 -0
  98. package/src/assets.js +146 -18
  99. package/src/browser-audit.js +158 -0
  100. package/src/build.js +34 -9
  101. package/src/cli.js +46 -41
  102. package/src/config.js +114 -63
  103. package/src/consent-csp.js +137 -0
  104. package/src/content.js +55 -30
  105. package/src/data-saver.js +194 -0
  106. package/src/deploy.js +28 -0
  107. package/src/document.js +44 -0
  108. package/src/embed.js +60 -0
  109. package/src/generators.js +101 -59
  110. package/src/i18n.js +19 -3
  111. package/src/icons.js +5 -4
  112. package/src/image-dimensions.js +17 -0
  113. package/src/local-tool.js +29 -0
  114. package/src/maintenance.js +25 -8
  115. package/src/markdown-fixture.js +20 -0
  116. package/src/markdown.js +80 -16
  117. package/src/media-assets.js +19 -0
  118. package/src/media-viewer.js +47 -0
  119. package/src/oembed.js +53 -0
  120. package/src/page-blocks.js +124 -54
  121. package/src/page-check.js +29 -39
  122. package/src/plugin-api.js +7 -1
  123. package/src/post-details.js +60 -0
  124. package/src/post-template.js +5 -0
  125. package/src/publication-time.js +47 -0
  126. package/src/report-path.js +19 -0
  127. package/src/report-visuals.js +91 -18
  128. package/src/revision-cards.js +30 -0
  129. package/src/revision-images.js +44 -0
  130. package/src/revisions.js +77 -0
  131. package/src/rss.js +100 -0
  132. package/src/service-block.js +18 -0
  133. package/src/theme.js +59 -9
  134. package/src/video-metadata.js +36 -0
  135. package/static/edgepress/data-saver.css +12 -0
  136. package/static/edgepress/data-saver.js +333 -0
  137. package/static/edgepress/document-viewer.js +35 -0
  138. package/static/edgepress/external-links-policy.js +14 -0
  139. package/static/edgepress/external-links.css +13 -0
  140. package/static/edgepress/external-links.js +120 -0
  141. package/static/edgepress/fonts/faces.css +2217 -0
  142. package/static/edgepress/fonts/noto-sans-OFL.txt +93 -0
  143. package/static/edgepress/fonts/noto-sans-cyrillic-ext-wght-normal.82ff72b28e6610f2.woff2 +0 -0
  144. package/static/edgepress/fonts/noto-sans-cyrillic-wght-normal.6ab64433de6077ca.woff2 +0 -0
  145. package/static/edgepress/fonts/noto-sans-devanagari-wght-normal.ea6a530b75d93de7.woff2 +0 -0
  146. package/static/edgepress/fonts/noto-sans-greek-ext-wght-normal.790b255c10c32e0b.woff2 +0 -0
  147. package/static/edgepress/fonts/noto-sans-greek-wght-normal.7f655207c2f6c140.woff2 +0 -0
  148. package/static/edgepress/fonts/noto-sans-latin-ext-wght-normal.6d5a79315528df19.woff2 +0 -0
  149. package/static/edgepress/fonts/noto-sans-latin-wght-normal.51ca196f49a33e79.woff2 +0 -0
  150. package/static/edgepress/fonts/noto-sans-sc-100-wght-normal.ad5f29028d5699a5.woff2 +0 -0
  151. package/static/edgepress/fonts/noto-sans-sc-101-wght-normal.e189b81fc22ca6af.woff2 +0 -0
  152. package/static/edgepress/fonts/noto-sans-sc-102-wght-normal.941c0c2971fc1d6d.woff2 +0 -0
  153. package/static/edgepress/fonts/noto-sans-sc-103-wght-normal.bafbd591af6493ff.woff2 +0 -0
  154. package/static/edgepress/fonts/noto-sans-sc-104-wght-normal.b0bf80ced89dd61b.woff2 +0 -0
  155. package/static/edgepress/fonts/noto-sans-sc-105-wght-normal.8d8b4e6f4a00621d.woff2 +0 -0
  156. package/static/edgepress/fonts/noto-sans-sc-106-wght-normal.bae74acc629d2e74.woff2 +0 -0
  157. package/static/edgepress/fonts/noto-sans-sc-107-wght-normal.a42eff5010de7b0d.woff2 +0 -0
  158. package/static/edgepress/fonts/noto-sans-sc-108-wght-normal.91882203459867be.woff2 +0 -0
  159. package/static/edgepress/fonts/noto-sans-sc-109-wght-normal.a91f8b038e5ce108.woff2 +0 -0
  160. package/static/edgepress/fonts/noto-sans-sc-110-wght-normal.bbca9081655c4523.woff2 +0 -0
  161. package/static/edgepress/fonts/noto-sans-sc-111-wght-normal.372be010ac0e87cb.woff2 +0 -0
  162. package/static/edgepress/fonts/noto-sans-sc-112-wght-normal.34a4580239eae8dc.woff2 +0 -0
  163. package/static/edgepress/fonts/noto-sans-sc-113-wght-normal.614ab8f616352583.woff2 +0 -0
  164. package/static/edgepress/fonts/noto-sans-sc-114-wght-normal.cf7b8344807a316e.woff2 +0 -0
  165. package/static/edgepress/fonts/noto-sans-sc-115-wght-normal.fb29957c7adccb9a.woff2 +0 -0
  166. package/static/edgepress/fonts/noto-sans-sc-116-wght-normal.a98dc5a726f82141.woff2 +0 -0
  167. package/static/edgepress/fonts/noto-sans-sc-117-wght-normal.d94b5af0c14838af.woff2 +0 -0
  168. package/static/edgepress/fonts/noto-sans-sc-118-wght-normal.76c9ddb85ae4578c.woff2 +0 -0
  169. package/static/edgepress/fonts/noto-sans-sc-119-wght-normal.b3b2374881f4cd93.woff2 +0 -0
  170. package/static/edgepress/fonts/noto-sans-sc-21-wght-normal.c1409c43e55ecff2.woff2 +0 -0
  171. package/static/edgepress/fonts/noto-sans-sc-22-wght-normal.77037ed42ff4e7b0.woff2 +0 -0
  172. package/static/edgepress/fonts/noto-sans-sc-23-wght-normal.38d0df21ac374e93.woff2 +0 -0
  173. package/static/edgepress/fonts/noto-sans-sc-24-wght-normal.8fa21e7e457acf3e.woff2 +0 -0
  174. package/static/edgepress/fonts/noto-sans-sc-25-wght-normal.f760b7a3871d214d.woff2 +0 -0
  175. package/static/edgepress/fonts/noto-sans-sc-26-wght-normal.be8386e7bd7facfe.woff2 +0 -0
  176. package/static/edgepress/fonts/noto-sans-sc-27-wght-normal.4895abcaddbd162e.woff2 +0 -0
  177. package/static/edgepress/fonts/noto-sans-sc-28-wght-normal.82540b6201a9b9ad.woff2 +0 -0
  178. package/static/edgepress/fonts/noto-sans-sc-29-wght-normal.ff21d8fcc60ce391.woff2 +0 -0
  179. package/static/edgepress/fonts/noto-sans-sc-30-wght-normal.1f76f6ffded00b9e.woff2 +0 -0
  180. package/static/edgepress/fonts/noto-sans-sc-31-wght-normal.e6c25be1bb08a63a.woff2 +0 -0
  181. package/static/edgepress/fonts/noto-sans-sc-32-wght-normal.0cda750d7d04a4e1.woff2 +0 -0
  182. package/static/edgepress/fonts/noto-sans-sc-33-wght-normal.b9732b5606bd87c5.woff2 +0 -0
  183. package/static/edgepress/fonts/noto-sans-sc-34-wght-normal.38aa326b4c84902a.woff2 +0 -0
  184. package/static/edgepress/fonts/noto-sans-sc-35-wght-normal.bd98226c8e0aa808.woff2 +0 -0
  185. package/static/edgepress/fonts/noto-sans-sc-36-wght-normal.0db1ca695a491d37.woff2 +0 -0
  186. package/static/edgepress/fonts/noto-sans-sc-37-wght-normal.8df409a4e0a237c2.woff2 +0 -0
  187. package/static/edgepress/fonts/noto-sans-sc-38-wght-normal.672d2d994994a3c3.woff2 +0 -0
  188. package/static/edgepress/fonts/noto-sans-sc-39-wght-normal.272d6d0e153f56e8.woff2 +0 -0
  189. package/static/edgepress/fonts/noto-sans-sc-4-wght-normal.9fafd93ac77b81ff.woff2 +0 -0
  190. package/static/edgepress/fonts/noto-sans-sc-40-wght-normal.5b9ef1ed48420aa7.woff2 +0 -0
  191. package/static/edgepress/fonts/noto-sans-sc-41-wght-normal.30aee47f660fd88a.woff2 +0 -0
  192. package/static/edgepress/fonts/noto-sans-sc-42-wght-normal.ec0014830db682b6.woff2 +0 -0
  193. package/static/edgepress/fonts/noto-sans-sc-43-wght-normal.43df2b5dad9bb835.woff2 +0 -0
  194. package/static/edgepress/fonts/noto-sans-sc-44-wght-normal.acaa6195041b1a92.woff2 +0 -0
  195. package/static/edgepress/fonts/noto-sans-sc-45-wght-normal.8cdb9903f770db21.woff2 +0 -0
  196. package/static/edgepress/fonts/noto-sans-sc-46-wght-normal.6590d0a6fe94571c.woff2 +0 -0
  197. package/static/edgepress/fonts/noto-sans-sc-47-wght-normal.b05afdd32b3bf722.woff2 +0 -0
  198. package/static/edgepress/fonts/noto-sans-sc-48-wght-normal.c9585f7d070700be.woff2 +0 -0
  199. package/static/edgepress/fonts/noto-sans-sc-49-wght-normal.4943895a4dfa5dcf.woff2 +0 -0
  200. package/static/edgepress/fonts/noto-sans-sc-5-wght-normal.e64f57937e3ae4fe.woff2 +0 -0
  201. package/static/edgepress/fonts/noto-sans-sc-50-wght-normal.13e51063d7743cfe.woff2 +0 -0
  202. package/static/edgepress/fonts/noto-sans-sc-51-wght-normal.fd4df1f02c2cb4d7.woff2 +0 -0
  203. package/static/edgepress/fonts/noto-sans-sc-52-wght-normal.06999a39c4c3a7ea.woff2 +0 -0
  204. package/static/edgepress/fonts/noto-sans-sc-53-wght-normal.767b7b9864658d91.woff2 +0 -0
  205. package/static/edgepress/fonts/noto-sans-sc-54-wght-normal.4cd00537a46f6f1a.woff2 +0 -0
  206. package/static/edgepress/fonts/noto-sans-sc-55-wght-normal.0118ec5d8c30b197.woff2 +0 -0
  207. package/static/edgepress/fonts/noto-sans-sc-56-wght-normal.a3e4a78929826930.woff2 +0 -0
  208. package/static/edgepress/fonts/noto-sans-sc-57-wght-normal.7623501009e4a6db.woff2 +0 -0
  209. package/static/edgepress/fonts/noto-sans-sc-58-wght-normal.56ae1a59a32e4a25.woff2 +0 -0
  210. package/static/edgepress/fonts/noto-sans-sc-59-wght-normal.7a377a40e99fd9bc.woff2 +0 -0
  211. package/static/edgepress/fonts/noto-sans-sc-6-wght-normal.17e15c4f0a5bfd92.woff2 +0 -0
  212. package/static/edgepress/fonts/noto-sans-sc-60-wght-normal.3657f66babdf6aff.woff2 +0 -0
  213. package/static/edgepress/fonts/noto-sans-sc-61-wght-normal.23919a2eb11d25dd.woff2 +0 -0
  214. package/static/edgepress/fonts/noto-sans-sc-62-wght-normal.a901edf25bc1cfae.woff2 +0 -0
  215. package/static/edgepress/fonts/noto-sans-sc-63-wght-normal.92f56f713cc0b62f.woff2 +0 -0
  216. package/static/edgepress/fonts/noto-sans-sc-64-wght-normal.4929c9f39a5a4bd9.woff2 +0 -0
  217. package/static/edgepress/fonts/noto-sans-sc-65-wght-normal.8daa61282fb62a11.woff2 +0 -0
  218. package/static/edgepress/fonts/noto-sans-sc-66-wght-normal.6479166925eb462b.woff2 +0 -0
  219. package/static/edgepress/fonts/noto-sans-sc-67-wght-normal.a6b0e11c4c761ffd.woff2 +0 -0
  220. package/static/edgepress/fonts/noto-sans-sc-68-wght-normal.65b77f1fe9d68dae.woff2 +0 -0
  221. package/static/edgepress/fonts/noto-sans-sc-69-wght-normal.b34f765cbbf4d02e.woff2 +0 -0
  222. package/static/edgepress/fonts/noto-sans-sc-70-wght-normal.a99d55c00e4f95b7.woff2 +0 -0
  223. package/static/edgepress/fonts/noto-sans-sc-71-wght-normal.3298bed30dc8d233.woff2 +0 -0
  224. package/static/edgepress/fonts/noto-sans-sc-72-wght-normal.6597209ca9707726.woff2 +0 -0
  225. package/static/edgepress/fonts/noto-sans-sc-73-wght-normal.e7ac1d4930eabd78.woff2 +0 -0
  226. package/static/edgepress/fonts/noto-sans-sc-74-wght-normal.1f0287be83a28e7a.woff2 +0 -0
  227. package/static/edgepress/fonts/noto-sans-sc-75-wght-normal.d9a4bb7bcc2be578.woff2 +0 -0
  228. package/static/edgepress/fonts/noto-sans-sc-76-wght-normal.5a019946bcadcec6.woff2 +0 -0
  229. package/static/edgepress/fonts/noto-sans-sc-77-wght-normal.7c445e85d04f5319.woff2 +0 -0
  230. package/static/edgepress/fonts/noto-sans-sc-78-wght-normal.7d4afb70f641781c.woff2 +0 -0
  231. package/static/edgepress/fonts/noto-sans-sc-79-wght-normal.5798753a721bb4ec.woff2 +0 -0
  232. package/static/edgepress/fonts/noto-sans-sc-80-wght-normal.db887159ca6e46f3.woff2 +0 -0
  233. package/static/edgepress/fonts/noto-sans-sc-81-wght-normal.71e5743bbd225b3d.woff2 +0 -0
  234. package/static/edgepress/fonts/noto-sans-sc-82-wght-normal.8c5094c3785fd04f.woff2 +0 -0
  235. package/static/edgepress/fonts/noto-sans-sc-83-wght-normal.4a60a1ccba905284.woff2 +0 -0
  236. package/static/edgepress/fonts/noto-sans-sc-84-wght-normal.3ed54e59ef4758e3.woff2 +0 -0
  237. package/static/edgepress/fonts/noto-sans-sc-85-wght-normal.e87e0a1342e1778c.woff2 +0 -0
  238. package/static/edgepress/fonts/noto-sans-sc-86-wght-normal.6d3ac3e20959dbcb.woff2 +0 -0
  239. package/static/edgepress/fonts/noto-sans-sc-87-wght-normal.0eeffd5daad5c17b.woff2 +0 -0
  240. package/static/edgepress/fonts/noto-sans-sc-88-wght-normal.b1d9582dfa268463.woff2 +0 -0
  241. package/static/edgepress/fonts/noto-sans-sc-89-wght-normal.8b437aeb9e9fcb5a.woff2 +0 -0
  242. package/static/edgepress/fonts/noto-sans-sc-90-wght-normal.83b0a59e0a5e045a.woff2 +0 -0
  243. package/static/edgepress/fonts/noto-sans-sc-91-wght-normal.382f72b98d4bb9d7.woff2 +0 -0
  244. package/static/edgepress/fonts/noto-sans-sc-97-wght-normal.5e52856457c5cdab.woff2 +0 -0
  245. package/static/edgepress/fonts/noto-sans-sc-98-wght-normal.ffded4e7fd560d93.woff2 +0 -0
  246. package/static/edgepress/fonts/noto-sans-sc-99-wght-normal.54e302c23f11a8fd.woff2 +0 -0
  247. package/static/edgepress/fonts/noto-sans-sc-OFL.txt +93 -0
  248. package/static/edgepress/fonts/noto-sans-sc-cyrillic-wght-normal.5932d441e7126669.woff2 +0 -0
  249. package/static/edgepress/fonts/noto-sans-sc-latin-ext-wght-normal.e316201f3fc493d1.woff2 +0 -0
  250. package/static/edgepress/fonts/noto-sans-sc-latin-wght-normal.c1d919c8701a86ed.woff2 +0 -0
  251. package/static/edgepress/fonts/noto-sans-sc-vietnamese-wght-normal.cba3d00c8db989f0.woff2 +0 -0
  252. package/static/edgepress/fonts/noto-sans-tc-0-wght-normal.63c21eda5d20203f.woff2 +0 -0
  253. package/static/edgepress/fonts/noto-sans-tc-100-wght-normal.87a7c76301c24a28.woff2 +0 -0
  254. package/static/edgepress/fonts/noto-sans-tc-101-wght-normal.c9e83fc4ffd53746.woff2 +0 -0
  255. package/static/edgepress/fonts/noto-sans-tc-102-wght-normal.9a00ae0e5735852b.woff2 +0 -0
  256. package/static/edgepress/fonts/noto-sans-tc-103-wght-normal.7cfe93b3221f4def.woff2 +0 -0
  257. package/static/edgepress/fonts/noto-sans-tc-104-wght-normal.2d5ac7497d84cb99.woff2 +0 -0
  258. package/static/edgepress/fonts/noto-sans-tc-105-wght-normal.0989885bb16bcd9b.woff2 +0 -0
  259. package/static/edgepress/fonts/noto-sans-tc-106-wght-normal.1faa921b035064e7.woff2 +0 -0
  260. package/static/edgepress/fonts/noto-sans-tc-107-wght-normal.2f6006745ae16d69.woff2 +0 -0
  261. package/static/edgepress/fonts/noto-sans-tc-108-wght-normal.a61e48c10a2cf4b9.woff2 +0 -0
  262. package/static/edgepress/fonts/noto-sans-tc-109-wght-normal.f28c767724736d2d.woff2 +0 -0
  263. package/static/edgepress/fonts/noto-sans-tc-110-wght-normal.4b04bd88c3dc7c5d.woff2 +0 -0
  264. package/static/edgepress/fonts/noto-sans-tc-111-wght-normal.b6251e1967932a52.woff2 +0 -0
  265. package/static/edgepress/fonts/noto-sans-tc-112-wght-normal.e264513b32f90660.woff2 +0 -0
  266. package/static/edgepress/fonts/noto-sans-tc-113-wght-normal.46cb347d88f3338e.woff2 +0 -0
  267. package/static/edgepress/fonts/noto-sans-tc-114-wght-normal.9f9e1e0d0ab2aeb4.woff2 +0 -0
  268. package/static/edgepress/fonts/noto-sans-tc-115-wght-normal.653dd2ab7d551b40.woff2 +0 -0
  269. package/static/edgepress/fonts/noto-sans-tc-116-wght-normal.4718bf3627191297.woff2 +0 -0
  270. package/static/edgepress/fonts/noto-sans-tc-117-wght-normal.b241a9409682af5f.woff2 +0 -0
  271. package/static/edgepress/fonts/noto-sans-tc-118-wght-normal.fda2800dc1c06852.woff2 +0 -0
  272. package/static/edgepress/fonts/noto-sans-tc-119-wght-normal.948af36bd63a72c7.woff2 +0 -0
  273. package/static/edgepress/fonts/noto-sans-tc-19-wght-normal.62191cdc3a10e60a.woff2 +0 -0
  274. package/static/edgepress/fonts/noto-sans-tc-20-wght-normal.65c90892c2e01657.woff2 +0 -0
  275. package/static/edgepress/fonts/noto-sans-tc-21-wght-normal.d3f59b094c334866.woff2 +0 -0
  276. package/static/edgepress/fonts/noto-sans-tc-22-wght-normal.b1983a041d7e4e1f.woff2 +0 -0
  277. package/static/edgepress/fonts/noto-sans-tc-23-wght-normal.16e2163b66c7732a.woff2 +0 -0
  278. package/static/edgepress/fonts/noto-sans-tc-24-wght-normal.72c8561976116537.woff2 +0 -0
  279. package/static/edgepress/fonts/noto-sans-tc-25-wght-normal.b2948d928ce4dd54.woff2 +0 -0
  280. package/static/edgepress/fonts/noto-sans-tc-26-wght-normal.d583236b90abedc9.woff2 +0 -0
  281. package/static/edgepress/fonts/noto-sans-tc-27-wght-normal.7d6073ba07597c9b.woff2 +0 -0
  282. package/static/edgepress/fonts/noto-sans-tc-28-wght-normal.517204d716b089cd.woff2 +0 -0
  283. package/static/edgepress/fonts/noto-sans-tc-29-wght-normal.10189a8f8ca38099.woff2 +0 -0
  284. package/static/edgepress/fonts/noto-sans-tc-30-wght-normal.695a71d72dfab3f7.woff2 +0 -0
  285. package/static/edgepress/fonts/noto-sans-tc-31-wght-normal.868d59473ef0e73c.woff2 +0 -0
  286. package/static/edgepress/fonts/noto-sans-tc-32-wght-normal.92efa2d4b3702ec0.woff2 +0 -0
  287. package/static/edgepress/fonts/noto-sans-tc-33-wght-normal.d2274bcd5636197d.woff2 +0 -0
  288. package/static/edgepress/fonts/noto-sans-tc-34-wght-normal.1ac8c3718ee2eed2.woff2 +0 -0
  289. package/static/edgepress/fonts/noto-sans-tc-35-wght-normal.00b3df730d5a4c73.woff2 +0 -0
  290. package/static/edgepress/fonts/noto-sans-tc-36-wght-normal.6963feb6c628b81f.woff2 +0 -0
  291. package/static/edgepress/fonts/noto-sans-tc-37-wght-normal.a1b4bd294af24cd1.woff2 +0 -0
  292. package/static/edgepress/fonts/noto-sans-tc-38-wght-normal.8edb2f7f2955921b.woff2 +0 -0
  293. package/static/edgepress/fonts/noto-sans-tc-39-wght-normal.37bf7394eb3148c6.woff2 +0 -0
  294. package/static/edgepress/fonts/noto-sans-tc-40-wght-normal.3efa655bc48f9133.woff2 +0 -0
  295. package/static/edgepress/fonts/noto-sans-tc-41-wght-normal.48d47014544ebd5d.woff2 +0 -0
  296. package/static/edgepress/fonts/noto-sans-tc-42-wght-normal.214c733a59d423e7.woff2 +0 -0
  297. package/static/edgepress/fonts/noto-sans-tc-43-wght-normal.c2c9876f138bb20f.woff2 +0 -0
  298. package/static/edgepress/fonts/noto-sans-tc-44-wght-normal.28928bfea29db06a.woff2 +0 -0
  299. package/static/edgepress/fonts/noto-sans-tc-45-wght-normal.bf3743f8155fa9d2.woff2 +0 -0
  300. package/static/edgepress/fonts/noto-sans-tc-46-wght-normal.06970903593781c3.woff2 +0 -0
  301. package/static/edgepress/fonts/noto-sans-tc-47-wght-normal.8932ed83a91794d4.woff2 +0 -0
  302. package/static/edgepress/fonts/noto-sans-tc-48-wght-normal.dfd9225628bcf234.woff2 +0 -0
  303. package/static/edgepress/fonts/noto-sans-tc-49-wght-normal.c27d341ad39d44eb.woff2 +0 -0
  304. package/static/edgepress/fonts/noto-sans-tc-50-wght-normal.01a0f4e7dfba0a56.woff2 +0 -0
  305. package/static/edgepress/fonts/noto-sans-tc-51-wght-normal.5a30022af3d30e0f.woff2 +0 -0
  306. package/static/edgepress/fonts/noto-sans-tc-52-wght-normal.4884f032342a3274.woff2 +0 -0
  307. package/static/edgepress/fonts/noto-sans-tc-53-wght-normal.537adcae44511270.woff2 +0 -0
  308. package/static/edgepress/fonts/noto-sans-tc-54-wght-normal.6bc8c7d3e47c6fde.woff2 +0 -0
  309. package/static/edgepress/fonts/noto-sans-tc-55-wght-normal.725a48711f1e1997.woff2 +0 -0
  310. package/static/edgepress/fonts/noto-sans-tc-56-wght-normal.f43ecaa73e0cd8fc.woff2 +0 -0
  311. package/static/edgepress/fonts/noto-sans-tc-57-wght-normal.15b24e9d42a3270f.woff2 +0 -0
  312. package/static/edgepress/fonts/noto-sans-tc-58-wght-normal.9b2d8a71667d3da6.woff2 +0 -0
  313. package/static/edgepress/fonts/noto-sans-tc-59-wght-normal.a68535a6b3289d89.woff2 +0 -0
  314. package/static/edgepress/fonts/noto-sans-tc-6-wght-normal.32cece1ae80c4f2b.woff2 +0 -0
  315. package/static/edgepress/fonts/noto-sans-tc-60-wght-normal.3b2c56a921d1cad4.woff2 +0 -0
  316. package/static/edgepress/fonts/noto-sans-tc-61-wght-normal.54f51f80a0740878.woff2 +0 -0
  317. package/static/edgepress/fonts/noto-sans-tc-62-wght-normal.ba029c5bb6c07bf1.woff2 +0 -0
  318. package/static/edgepress/fonts/noto-sans-tc-63-wght-normal.380919beec4c7f3d.woff2 +0 -0
  319. package/static/edgepress/fonts/noto-sans-tc-64-wght-normal.f96fe0be479d201f.woff2 +0 -0
  320. package/static/edgepress/fonts/noto-sans-tc-65-wght-normal.7d544b80701fe678.woff2 +0 -0
  321. package/static/edgepress/fonts/noto-sans-tc-66-wght-normal.fab669c07a1e3bee.woff2 +0 -0
  322. package/static/edgepress/fonts/noto-sans-tc-67-wght-normal.0001bb744743fdfa.woff2 +0 -0
  323. package/static/edgepress/fonts/noto-sans-tc-68-wght-normal.1a57eda03886b43c.woff2 +0 -0
  324. package/static/edgepress/fonts/noto-sans-tc-69-wght-normal.017fecc749bcd6d5.woff2 +0 -0
  325. package/static/edgepress/fonts/noto-sans-tc-7-wght-normal.cd0f0cac743dbbfe.woff2 +0 -0
  326. package/static/edgepress/fonts/noto-sans-tc-70-wght-normal.79fb9d70b9534ec7.woff2 +0 -0
  327. package/static/edgepress/fonts/noto-sans-tc-71-wght-normal.04a6ea581b5f1195.woff2 +0 -0
  328. package/static/edgepress/fonts/noto-sans-tc-72-wght-normal.d3a4eb35499157b7.woff2 +0 -0
  329. package/static/edgepress/fonts/noto-sans-tc-73-wght-normal.d81f8484404ee465.woff2 +0 -0
  330. package/static/edgepress/fonts/noto-sans-tc-74-wght-normal.4a5da9e0c2702f7d.woff2 +0 -0
  331. package/static/edgepress/fonts/noto-sans-tc-75-wght-normal.8b87f9c6c164513a.woff2 +0 -0
  332. package/static/edgepress/fonts/noto-sans-tc-76-wght-normal.a71463dbfd9fa7b5.woff2 +0 -0
  333. package/static/edgepress/fonts/noto-sans-tc-77-wght-normal.d094414ea752cd52.woff2 +0 -0
  334. package/static/edgepress/fonts/noto-sans-tc-78-wght-normal.04f7c97bd9cbc73b.woff2 +0 -0
  335. package/static/edgepress/fonts/noto-sans-tc-79-wght-normal.1ed089d037a02049.woff2 +0 -0
  336. package/static/edgepress/fonts/noto-sans-tc-8-wght-normal.d052677dfb5db5bd.woff2 +0 -0
  337. package/static/edgepress/fonts/noto-sans-tc-80-wght-normal.6d41ca59cfd50442.woff2 +0 -0
  338. package/static/edgepress/fonts/noto-sans-tc-81-wght-normal.f09bd0afa8a58114.woff2 +0 -0
  339. package/static/edgepress/fonts/noto-sans-tc-82-wght-normal.7920841c526b1b02.woff2 +0 -0
  340. package/static/edgepress/fonts/noto-sans-tc-83-wght-normal.0c6f7f82db8da0d8.woff2 +0 -0
  341. package/static/edgepress/fonts/noto-sans-tc-84-wght-normal.f37c0a853b31265e.woff2 +0 -0
  342. package/static/edgepress/fonts/noto-sans-tc-85-wght-normal.4173bff087653b82.woff2 +0 -0
  343. package/static/edgepress/fonts/noto-sans-tc-86-wght-normal.dac35605ebec15c4.woff2 +0 -0
  344. package/static/edgepress/fonts/noto-sans-tc-87-wght-normal.8ac85fdd0b15a6bd.woff2 +0 -0
  345. package/static/edgepress/fonts/noto-sans-tc-88-wght-normal.61625b0b21e8407f.woff2 +0 -0
  346. package/static/edgepress/fonts/noto-sans-tc-89-wght-normal.a1da3dccbf00698e.woff2 +0 -0
  347. package/static/edgepress/fonts/noto-sans-tc-90-wght-normal.bf08f0355222a782.woff2 +0 -0
  348. package/static/edgepress/fonts/noto-sans-tc-91-wght-normal.2ecf295bba2bfaa3.woff2 +0 -0
  349. package/static/edgepress/fonts/noto-sans-tc-92-wght-normal.36508326bb68115f.woff2 +0 -0
  350. package/static/edgepress/fonts/noto-sans-tc-97-wght-normal.c712899e0fc9e947.woff2 +0 -0
  351. package/static/edgepress/fonts/noto-sans-tc-98-wght-normal.13a648e521d18d7f.woff2 +0 -0
  352. package/static/edgepress/fonts/noto-sans-tc-99-wght-normal.7f8c9a777e64159a.woff2 +0 -0
  353. package/static/edgepress/fonts/noto-sans-tc-OFL.txt +93 -0
  354. package/static/edgepress/fonts/noto-sans-tc-cyrillic-wght-normal.dd0980ced8e46cb3.woff2 +0 -0
  355. package/static/edgepress/fonts/noto-sans-tc-latin-ext-wght-normal.817d96335dc52ce6.woff2 +0 -0
  356. package/static/edgepress/fonts/noto-sans-tc-latin-wght-normal.50cb5fb0a522cfaf.woff2 +0 -0
  357. package/static/edgepress/fonts/noto-sans-tc-vietnamese-wght-normal.2a77fb7b70fa304d.woff2 +0 -0
  358. package/static/edgepress/fonts/noto-sans-vietnamese-wght-normal.791e3f213c155a5b.woff2 +0 -0
  359. package/static/edgepress/fonts/noto-serif-OFL.txt +93 -0
  360. package/static/edgepress/fonts/noto-serif-cyrillic-ext-wght-normal.7c7afb20d33e30ec.woff2 +0 -0
  361. package/static/edgepress/fonts/noto-serif-cyrillic-wght-normal.54e3bd0c4a002b0f.woff2 +0 -0
  362. package/static/edgepress/fonts/noto-serif-greek-ext-wght-normal.9b3f4c4ff3adefd2.woff2 +0 -0
  363. package/static/edgepress/fonts/noto-serif-greek-wght-normal.1252037b6f1d6e86.woff2 +0 -0
  364. package/static/edgepress/fonts/noto-serif-latin-ext-wght-normal.2654f8d1261a420f.woff2 +0 -0
  365. package/static/edgepress/fonts/noto-serif-latin-wght-normal.46281456234014ce.woff2 +0 -0
  366. package/static/edgepress/fonts/noto-serif-math-wght-normal.d4a6aba2cb4636b3.woff2 +0 -0
  367. package/static/edgepress/fonts/noto-serif-vietnamese-wght-normal.fb6a5ed734c2fbe3.woff2 +0 -0
  368. package/static/edgepress/fonts/provenance.json +1356 -0
  369. package/static/edgepress/fonts.css +14 -0
  370. package/static/edgepress/image-viewer.js +23 -0
  371. package/static/edgepress/images.css +4 -0
  372. package/static/edgepress/link-directory.css +14 -0
  373. package/static/edgepress/local-time.js +12 -0
  374. package/static/edgepress/media-viewer.css +1 -0
  375. package/static/edgepress/media-viewer.js +111 -0
  376. package/static/edgepress/navigation-select.js +14 -0
  377. package/static/edgepress/oembed.js +129 -0
  378. package/static/edgepress/plugins/backend/external-api.js +4 -0
  379. package/static/edgepress/plugins/backend/external-widget.js +13 -0
  380. package/static/edgepress/plugins/consent/choices.js +47 -0
  381. package/static/edgepress/plugins/consent/manager.js +56 -74
  382. package/static/edgepress/project-demo.js +93 -0
  383. package/static/edgepress/search.js +2 -2
  384. package/static/edgepress/services-consent.js +3 -0
  385. package/static/edgepress/services.js +15 -0
  386. package/static/edgepress/webmcp.js +86 -0
  387. package/tests/assets-runtime.test.mjs +91 -0
  388. package/tests/audit.test.mjs +142 -0
  389. package/tests/brand-regression.test.mjs +110 -0
  390. package/tests/consent-browser.test.mjs +132 -0
  391. package/tests/consent-config.test.mjs +85 -0
  392. package/tests/consent-csp.test.mjs +90 -0
  393. package/tests/data-saver-loading.test.mjs +158 -0
  394. package/tests/data-saver-network.test.mjs +99 -0
  395. package/tests/data-saver.test.mjs +294 -0
  396. package/tests/document-package.test.mjs +28 -0
  397. package/tests/document-viewer.test.mjs +152 -0
  398. package/tests/edge-issues.test.mjs +65 -0
  399. package/tests/embed-syntax.test.mjs +68 -0
  400. package/tests/external-links.test.mjs +198 -0
  401. package/tests/fixtures/recording.mp4 +0 -0
  402. package/tests/fonts.test.mjs +99 -0
  403. package/tests/image-dimensions.test.mjs +15 -0
  404. package/tests/image-viewer.test.mjs +36 -0
  405. package/tests/json-pages.test.mjs +66 -0
  406. package/tests/link-directory.test.mjs +51 -0
  407. package/tests/local-tool.test.mjs +34 -0
  408. package/tests/markdown-media.test.mjs +119 -0
  409. package/tests/media-block.test.mjs +102 -0
  410. package/tests/navigation.test.mjs +87 -0
  411. package/tests/oembed-layout.test.mjs +98 -0
  412. package/tests/oembed.test.mjs +96 -0
  413. package/tests/page-authoring.test.mjs +27 -0
  414. package/tests/page-formatting.test.mjs +37 -0
  415. package/tests/post-list.test.mjs +96 -0
  416. package/tests/project-demo.test.mjs +73 -0
  417. package/tests/publication-time.test.mjs +43 -0
  418. package/tests/release-version.test.mjs +28 -0
  419. package/tests/revisions.test.mjs +93 -0
  420. package/tests/rss.test.mjs +54 -0
  421. package/tests/services.test.mjs +35 -0
  422. package/tests/theme-layout.test.mjs +95 -0
  423. package/tests/video-metadata.test.mjs +28 -0
  424. package/tests/webmcp.test.mjs +121 -0
  425. package/tests/writing.test.mjs +101 -0
  426. package/themes/atelier/assets/style.css +144 -22
  427. package/themes/atelier/layouts/partials/head.html +8 -1
  428. package/themes/atelier/layouts/partials/header.html +3 -1
  429. package/themes/default/assets/data-saver-theme.css +2 -0
  430. package/themes/default/assets/style.css +139 -23
  431. package/themes/default/layouts/partials/head.html +9 -2
  432. package/themes/default/layouts/partials/header.html +3 -1
  433. package/themes/default/theme.json +1 -0
  434. package/themes/folio/README.md +7 -0
  435. package/themes/folio/assets/data-saver-theme.css +3 -0
  436. package/themes/folio/assets/folio/navigation.js +10 -0
  437. package/themes/folio/assets/style.css +516 -0
  438. package/themes/folio/layouts/layout.html +15 -0
  439. package/themes/folio/layouts/partials/footer.html +6 -0
  440. package/themes/folio/layouts/partials/head.html +30 -0
  441. package/themes/folio/layouts/partials/header.html +8 -0
  442. package/themes/folio/theme.json +7 -0
  443. package/themes/signal/assets/style.css +143 -21
  444. package/themes/signal/layouts/partials/head.html +8 -1
  445. package/themes/signal/layouts/partials/header.html +3 -1
  446. package/tools/README.md +14 -0
  447. package/tools/assets/format-pages.mjs +56 -0
  448. package/tools/assets/generate-brand-assets.py +160 -0
  449. package/tools/assets/sync-fonts.mjs +71 -0
  450. package/tools/assets/sync-icons.mjs +17 -0
  451. package/tools/assets/video-preview.mjs +15 -0
  452. package/tools/recordings/capture-document-demo.mjs +147 -0
  453. package/tools/recordings/demo-workbench.mjs +57 -0
  454. package/tools/recordings/desktop-recording.mjs +92 -0
  455. package/tools/recordings/provision-vm.sh +18 -0
  456. package/tools/recordings/start-vm-desktop.sh +28 -0
  457. package/tools/recordings/vm-desktop.mjs +124 -0
  458. package/tools/verification/README.md +44 -0
  459. package/tools/verification/data-saver-site.mjs +405 -0
  460. package/tools/verification/page-performance.mjs +76 -0
  461. package/tools/verification/verify-brand-assets.py +52 -0
  462. package/tools/verification/verify-brand.mjs +180 -0
  463. package/vercel.json +36 -0
  464. package/wrangler.jsonc +5 -7
  465. package/content/pages/home/en.md +0 -99
  466. package/content/pages/home/zh-cn.md +0 -99
  467. package/content/pages/plugin-development/en.md +0 -109
  468. package/content/pages/plugin-development/zh-cn.md +0 -109
  469. package/content/pages/privacy-policy/en.md +0 -93
  470. package/content/pages/privacy-policy/zh-cn.md +0 -93
  471. package/content/pages/project-introduction/en.md +0 -88
  472. package/content/pages/project-introduction/zh-cn.md +0 -88
  473. package/content/pages/quick-start/en.md +0 -153
  474. package/content/pages/quick-start/zh-cn.md +0 -153
  475. package/content/pages/theme-development/en.md +0 -132
  476. package/content/pages/theme-development/zh-cn.md +0 -132
  477. package/src/worker.js +0 -139
  478. package/static/edgepress/brand/edgepress-mark.svg +0 -7
  479. package/static/edgepress/brand/mascot-209.webp +0 -0
  480. package/static/edgepress/brand/mascot-418.png +0 -0
  481. package/static/edgepress/brand/mascot-418.webp +0 -0
  482. package/static/edgepress/brand/mascot.png +0 -0
  483. package/static/edgepress/brand/og-image.png +0 -0
  484. package/static/edgepress/brand/og-image.svg +0 -46
  485. package/static/edgepress/icons.svg +0 -24
@@ -1,6 +1,33 @@
1
1
  {
2
+ "dataSaverLoadFailed": "页面必需资源加载失败。请重试,或切换可用的文字省流版。",
3
+ "dataSaverRetry": "重新加载",
4
+ "dataSaverProgressControls": "页面操作:已完成 {loaded} / {total} 个脚本",
5
+ "dataSaverLoadingNotice": "正在加载完整版。你可以现在切换文字省流版,跳过字体与多媒体。",
6
+ "dataSaverProgressStyles": "页面样式:已完成 {loaded} / {total} 个文件",
7
+ "dataSaverProgressMedia": "首屏图片:已完成 {loaded} / {total}",
8
+ "serviceLoad": "加载这项服务",
9
+ "dataSaverLoading": "正在准备页面…",
10
+ "dataSaverTitle": "流量使用",
11
+ "dataSaverAuto": "自动",
12
+ "dataSaverText": "仅文字",
13
+ "dataSaverFull": "完整显示",
14
+ "dataSaverNotice": "文字模式暂停加载图片、字体、文档预览及可选外部服务。需要时单独加载媒体,或切换到完整显示。",
15
+ "dataSaverLoad": "加载这项媒体",
16
+ "dataSaverMissingDescription": "这项媒体没有提供文字说明,请按需加载以查看内容。",
17
+ "dataSaverSlowTitle": "这个页面加载得有些久",
18
+ "dataSaverSlowNotice": "可以切换到不加载图片和网络字体的文字省流版,或继续等待完整页面。",
19
+ "dataSaverSwitchText": "切换文字省流版",
20
+ "dataSaverKeepFull": "继续等待",
21
+ "dataSaverReturnFull": "切回完整页面",
22
+ "dataSaverTextNotice": "文字省流版 · 图片、字体和预览仅在需要时加载。",
23
+ "documentViewerPreview": "预览文档",
24
+ "documentViewerClose": "关闭预览",
25
+ "documentViewerLoading": "正在加载文档…",
26
+ "documentViewerError": "无法预览。请检查文件、访问权限和跨域设置。",
27
+ "documentViewerPage": "页码",
28
+ "documentViewerSheet": "工作表",
2
29
  "home": "首页",
3
- "archives": "归档",
30
+ "archives": "见闻",
4
31
  "noPosts": "还没有文章",
5
32
  "newer": "较新文章",
6
33
  "older": "较早文章",
@@ -11,13 +38,13 @@
11
38
  "forbidden": "无权访问",
12
39
  "forbiddenText": "你没有权限访问此页面。",
13
40
  "returnHome": "返回首页",
14
- "allPosts": "所有文章",
41
+ "allPosts": "全部见闻",
15
42
  "searchPosts": "搜索文章",
16
43
  "searchIntro": "搜索此网站发布的 Markdown 文章。搜索在你的浏览器本地运行。",
17
44
  "searchLabel": "搜索文章",
18
45
  "searchButton": "搜索",
19
- "searchHint": "输入文章标题或正文中的一个或多个词。",
20
- "searchPrompt": "输入搜索词以查找文章。",
46
+ "searchHint": "",
47
+ "searchPrompt": "",
21
48
  "searchNeedsJavaScript": "文章搜索需要启用 JavaScript。搜索索引保存在此网站。",
22
49
  "searchNoResults": "没有找到匹配的文章。",
23
50
  "searchResults": "匹配的文章",
@@ -33,6 +60,7 @@
33
60
  "languageLabel": "语言",
34
61
  "skipToContent": "跳转到正文",
35
62
  "pagination": "分页导航",
63
+ "pageNumber": "第 {page} 页",
36
64
  "pages": "项目文档",
37
65
  "latestPosts": "最新文章",
38
66
  "postAuthor": "作者:{author}",
@@ -55,12 +83,49 @@
55
83
  "servicePrivacyLink": "查看政策",
56
84
  "reviewDetails": "详情",
57
85
  "essentialStorage": "选择保存在此设备,最长 {days} 天。",
58
- "pluginTracking": "跟踪",
59
- "pluginStatistics": "统计",
60
- "pluginAdvertising": "广告",
61
- "pluginCaptcha": "人机验证",
62
86
  "consentReload": "选择已保存,正在重新载入以应用设置。",
63
87
  "agentSummary": "EdgePress 网站构建器的项目指南与参考文档。",
64
88
  "closePrivacy": "关闭设置",
65
- "consentStoredOnDevice": "此设备"
89
+ "consentStoredOnDevice": "此设备",
90
+ "postStarter": "在这里写第一段正文。需要时可使用 ## 小标题、列表、链接和代码块。",
91
+ "postCreated": "已创建 {file}",
92
+ "postNextSteps": "打开这个文件,在第二个 --- 后用 Markdown 写正文。标题、日期和语言已经填好。",
93
+ "postPreview": "运行 npm run dev 预览,npm run build 构建,再通过已有部署流程发布。",
94
+ "postReadingTime": "约 {minutes} 分钟阅读",
95
+ "categoryBlog": "博客",
96
+ "categoryUncategorized": "未分类",
97
+ "allCategoryPosts": "此分类全部文章",
98
+ "postPinned": "置顶",
99
+ "postUpdated": "更新于",
100
+ "postChanges": "最近一次变动",
101
+ "loadMedia": "加载媒体",
102
+ "embedUnavailable": "媒体暂时不可用。",
103
+ "embedNeedsConsent": "此媒体由 {service} 提供。你同意此服务并请求查看后才会加载,当前尚未连接平台。",
104
+ "embedReady": "你已同意 {service}。内容进入画面时会自动加载。",
105
+ "embedLoading": "正在加载 {service} 媒体…",
106
+ "embedLoaded": "已加载 {service} 媒体。",
107
+ "embedDisabled": "本站已关闭 {service} 服务,此媒体未加载。",
108
+ "imageViewerOpenImage": "放大图片",
109
+ "imageViewerCloseImage": "关闭图片",
110
+ "imageViewerZoomIn": "放大",
111
+ "imageViewerZoomOut": "缩小",
112
+ "imageViewerSaveOriginal": "保存原图",
113
+ "imageViewerRetryMedia": "重新加载",
114
+ "imageViewerLoading": "加载中…",
115
+ "imageViewerImageUnavailable": "图片已删除或暂时无法加载。",
116
+ "postChangeBefore": "修改前",
117
+ "postChangeAfter": "修改后",
118
+ "postChangeAdded": "新增内容",
119
+ "postChangeRemoved": "移除内容",
120
+ "demoPlay": "播放演示",
121
+ "demoPause": "暂停演示",
122
+ "demoReplay": "重新播放",
123
+ "demoError": "演示暂时无法加载,请重试。",
124
+ "demoResume": "继续播放",
125
+ "demoLoading": "正在加载演示…",
126
+ "demoSeek": "演示进度",
127
+ "externalLinkTitle": "即将离开本站",
128
+ "externalLinkDescription": "这个链接指向其他网站,其内容与隐私政策由对方负责。是否继续由你决定。",
129
+ "externalLinkBack": "返回",
130
+ "externalLinkContinue": "继续前往"
66
131
  }
package/netlify.toml ADDED
@@ -0,0 +1,6 @@
1
+ [build]
2
+ command = "npm run build"
3
+ publish = "dist"
4
+
5
+ [build.environment]
6
+ NODE_VERSION = "22"
package/package.json CHANGED
@@ -1,7 +1,8 @@
1
1
  {
2
2
  "name": "edgepress",
3
- "version": "2026.10.1",
4
- "description": "A static website builder for Cloudflare Workers with editable pages, Markdown posts, local search, themes, and consent-gated integrations.",
3
+ "license": "MIT",
4
+ "version": "2026.10.13",
5
+ "description": "Static websites from Markdown and editable pages, with themes, consent-controlled embeds and readable article updates.",
5
6
  "type": "module",
6
7
  "bin": {
7
8
  "edgepress": "src/cli.js"
@@ -11,13 +12,22 @@
11
12
  "languages",
12
13
  "plugins",
13
14
  "src",
15
+ "schemas",
14
16
  "static",
15
17
  "themes",
16
18
  "config.yml",
17
19
  "edgepress.config.mjs",
18
20
  "project-compatibility.json",
19
21
  "wrangler.jsonc",
20
- "README.md"
22
+ "README.md",
23
+ "vercel.json",
24
+ "edgeone.json",
25
+ "esa.jsonc",
26
+ "netlify.toml",
27
+ "tests",
28
+ "tools/assets",
29
+ "tools/recordings",
30
+ "tools/verification"
21
31
  ],
22
32
  "repository": {
23
33
  "type": "git",
@@ -45,15 +55,36 @@
45
55
  "check": "node src/cli.js check",
46
56
  "doctor": "node src/cli.js doctor",
47
57
  "iterate": "node src/cli.js iterate",
48
- "security:check": "node src/cli.js security"
58
+ "security:check": "node src/cli.js security",
59
+ "test": "node --test --test-concurrency=2 tests/*.test.mjs",
60
+ "icons:sync": "node tools/assets/sync-icons.mjs",
61
+ "deploy:cloudflare": "node src/cli.js deploy cloudflare",
62
+ "deploy:vercel": "node src/cli.js deploy vercel",
63
+ "deploy:edgeone": "node src/cli.js deploy edgeone",
64
+ "deploy:esa": "node src/cli.js deploy esa",
65
+ "deploy:netlify": "node src/cli.js deploy netlify",
66
+ "fonts:sync": "node tools/assets/sync-fonts.mjs"
49
67
  },
50
68
  "dependencies": {
69
+ "@jsw-teams/document-viewer": "https://codeload.github.com/jsw-teams/document-viewer/tar.gz/ab21d0ee9c078d084b2abee373ffad302928978c",
70
+ "@jsw-teams/media-viewer": "https://codeload.github.com/jsw-teams/media-viewer/tar.gz/12eb8983c2df1eabb3aaece44b232c56b4a9e1fe",
71
+ "esbuild": "^0.28.2",
72
+ "htmlparser2": "^12.0.0",
73
+ "image-size": "^2.0.4",
51
74
  "marked": "^18.0.13",
52
- "sanitize-html": "^2.17.7",
75
+ "postcss": "^8.5.15",
76
+ "sanitize-html": "^2.18.1",
53
77
  "yaml": "^2.9.1"
54
78
  },
79
+ "overrides": {
80
+ "@file-viewer/doc": {
81
+ "dompurify": "3.4.17"
82
+ }
83
+ },
55
84
  "devDependencies": {
85
+ "lucide-static": "1.55.0",
56
86
  "playwright": "^1.63.0",
57
- "wrangler": "^4.144.0"
87
+ "vscode-json-languageservice": "^6.0.0-next.3",
88
+ "wrangler": "^4.149.0"
58
89
  }
59
90
  }
@@ -1,3 +1,5 @@
1
+ import {createHash} from 'node:crypto';
2
+ import {choiceSnapshot} from '../../static/edgepress/plugins/consent/choices.js';
1
3
  function translate(config, locale, key) {
2
4
  const base = config.i18n.translationsByLocale?.[config.i18n.defaultLocale];
3
5
  const selected = config.i18n.translationsByLocale?.[locale];
@@ -22,35 +24,26 @@ export default function consentManager(api) {
22
24
  'privacySettings', 'privacyNotice', 'privacyIntro', 'acceptOptional', 'rejectOptional',
23
25
  'savePreferences', 'optionalServices', 'noIntegrations', 'privacyPolicy', 'privacyController', 'privacyContact',
24
26
  'serviceDataCategories', 'serviceRecipient', 'serviceRetention', 'servicePrivacyDetails', 'servicePrivacyLink', 'consentReload',
25
- 'closePrivacy', 'reviewDetails', 'essentialStorage', 'pluginTracking',
26
- 'pluginStatistics', 'pluginAdvertising', 'pluginCaptcha'
27
+ 'closePrivacy', 'reviewDetails', 'essentialStorage', 'loadMedia', 'embedUnavailable',
28
+ 'embedNeedsConsent', 'embedReady', 'embedLoading', 'embedLoaded', 'embedDisabled'
27
29
  ].map((key) => [key, translate(config, locale, key)]));
28
- const services = ['tracking', 'statistics', 'advertising', 'captcha'].flatMap((group) =>
29
- config.browserPlugins[group].enabled ? config.browserPlugins[group].services.map((service) => ({ ...service, category: group })) : []
30
- );
30
+ const services = config.browserPlugins.services.filter(service => service.enabled !== false);
31
31
  const privacy = {
32
32
  ...config.privacy,
33
33
  consent: config.browserPlugins.consent,
34
34
  integrations: services
35
35
  };
36
36
  if (privacy.policyUrl.startsWith('/')) privacy.policyUrl = localizedUrl(config, locale, privacy.policyUrl);
37
- const choiceFingerprint = JSON.stringify({
37
+ const snapshot = choiceSnapshot({
38
38
  controller: config.privacy.controller,
39
39
  policyUrl: config.privacy.policyUrl,
40
40
  consent: config.browserPlugins.consent,
41
41
  integrations: services
42
- });
43
- const legacyChoiceFingerprints = config.i18n.locales.map((legacyLocale) => JSON.stringify({
44
- controller: config.privacy.controller,
45
- policyUrl: config.privacy.policyUrl.startsWith('/')
46
- ? localizedUrl(config, legacyLocale, config.privacy.policyUrl)
47
- : config.privacy.policyUrl,
48
- consent: config.browserPlugins.consent,
49
- integrations: services
50
- }));
51
- const payload = safeJson({ privacy, ui, siteLanguage: locale, defaultLocale: config.i18n.defaultLocale, choiceFingerprint, legacyChoiceFingerprints });
42
+ },config.site.url);
43
+ const choiceFingerprint=createHash('sha256').update(snapshot).digest('hex');
44
+ const payload = safeJson({ privacy, ui, siteOrigin:config.site.url,siteLanguage: locale, defaultLocale: config.i18n.defaultLocale, choiceFingerprint,choiceSnapshot:snapshot });
52
45
  const integration = '<script type="application/json" id="edgepress-privacy-config">' + payload + '</script>' +
53
- '<script src="/edgepress/plugins/consent/manager.js" defer></script>';
46
+ '<script type="module" src="/edgepress/plugins/consent/manager.js"></script>';
54
47
  return html.replace(/<\/body\s*>/i, integration + '</body>');
55
48
  });
56
49
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "frameworkVersion": "2026.9.10",
3
+ "frameworkVersion": "2026.10.5",
4
4
  "requirements": {
5
5
  "nodeMajor": 22,
6
6
  "nodeMinimumVersion": "22.12.0",
@@ -10,30 +10,141 @@
10
10
  "pluginApiMajor": 1
11
11
  },
12
12
  "features": [
13
- { "name": "Static generation and content-hash cache", "stage": "stable", "since": "2026.9.1" },
14
- { "name": "Cloudflare Static Assets deployment", "stage": "stable", "since": "2026.9.1" },
15
- { "name": "Row-based editable pages and reusable layout components", "stage": "experimental", "since": "2026.9.1" },
16
- { "name": "Image/video with text and display typography elements", "stage": "experimental", "since": "2026.9.1" },
17
- { "name": "i18n locale routes", "stage": "experimental", "since": "2026.9.1" },
18
- { "name": "Accessibility and agent-friendliness PDF report with embedded screenshots", "stage": "experimental", "since": "2026.9.1" },
19
- { "name": "Consent-gated browser plugins", "stage": "experimental", "since": "2026.9.1" },
20
- { "name": "Service binding and URL/token backend proxy", "stage": "experimental", "since": "2026.9.1" },
21
- { "name": "Live local preview and theme switching", "stage": "experimental", "since": "2026.9.1" },
22
- { "name": "Report-only maintenance iteration", "stage": "experimental", "since": "2026.9.1" },
23
- { "name": "Local browser search across Markdown posts", "stage": "experimental", "since": "2026.9.2" },
24
- { "name": "Markdown syntax verification and responsive post screenshots", "stage": "experimental", "since": "2026.9.2" },
25
- { "name": "Compact localized language selector", "stage": "experimental", "since": "2026.9.2" },
26
- { "name": "npm theme installation and blank theme scaffolds", "stage": "experimental", "since": "2026.9.3" },
27
- { "name": "PDF-only audit output and temporary screenshot capture", "stage": "experimental", "since": "2026.9.4" },
28
- { "name": "Cloudflare one-click deployment guidance for existing and new projects", "stage": "stable", "since": "2026.9.5" },
29
- { "name": "Localized Posts navigation and responsive code copy controls", "stage": "experimental", "since": "2026.9.6" },
30
- { "name": "Linked tables of contents on Markdown post pages", "stage": "experimental", "since": "2026.9.6" },
31
- { "name": "Consent-nested browser services and generated privacy disclosures", "stage": "experimental", "since": "2026.9.7" },
32
- { "name": "Responsive homepage imagery and chronological all-post archives", "stage": "experimental", "since": "2026.9.7" },
33
- { "name": "Date-versioned localized consent disclosures with isolated responsive checks", "stage": "experimental", "since": "2026.9.8" },
34
- { "name": "Markdown video syntax and locale-deduplicated chronological post lists", "stage": "experimental", "since": "2026.9.8" },
35
- { "name": "Floating post contents and compact consent controls", "stage": "experimental", "since": "2026.9.9" },
36
- { "name": "Locale-stable consent choices and localized page-block links", "stage": "experimental", "since": "2026.9.10" }
13
+ {
14
+ "name": "Static generation and content-hash cache",
15
+ "stage": "stable",
16
+ "since": "2026.9.1"
17
+ },
18
+ {
19
+ "name": "Cloudflare Static Assets deployment",
20
+ "stage": "stable",
21
+ "since": "2026.9.1"
22
+ },
23
+ {
24
+ "name": "Row-based editable pages and reusable layout components",
25
+ "stage": "experimental",
26
+ "since": "2026.9.1"
27
+ },
28
+ {
29
+ "name": "Image/video with text and display typography elements",
30
+ "stage": "experimental",
31
+ "since": "2026.9.1"
32
+ },
33
+ {
34
+ "name": "i18n locale routes",
35
+ "stage": "experimental",
36
+ "since": "2026.9.1"
37
+ },
38
+ {
39
+ "name": "Accessibility and agent-friendliness PDF report with embedded screenshots",
40
+ "stage": "experimental",
41
+ "since": "2026.9.1"
42
+ },
43
+ {
44
+ "name": "Consent-gated browser plugins",
45
+ "stage": "experimental",
46
+ "since": "2026.9.1"
47
+ },
48
+ {
49
+ "name": "Live local preview and theme switching",
50
+ "stage": "experimental",
51
+ "since": "2026.9.1"
52
+ },
53
+ {
54
+ "name": "Report-only maintenance iteration",
55
+ "stage": "experimental",
56
+ "since": "2026.9.1"
57
+ },
58
+ {
59
+ "name": "Local browser search across Markdown posts",
60
+ "stage": "experimental",
61
+ "since": "2026.9.2"
62
+ },
63
+ {
64
+ "name": "Markdown syntax verification and responsive post screenshots",
65
+ "stage": "experimental",
66
+ "since": "2026.9.2"
67
+ },
68
+ {
69
+ "name": "Compact localized language selector",
70
+ "stage": "experimental",
71
+ "since": "2026.9.2"
72
+ },
73
+ {
74
+ "name": "npm theme installation and blank theme scaffolds",
75
+ "stage": "experimental",
76
+ "since": "2026.9.3"
77
+ },
78
+ {
79
+ "name": "PDF-only audit output and temporary screenshot capture",
80
+ "stage": "experimental",
81
+ "since": "2026.9.4"
82
+ },
83
+ {
84
+ "name": "Cloudflare one-click deployment guidance for existing and new projects",
85
+ "stage": "stable",
86
+ "since": "2026.9.5"
87
+ },
88
+ {
89
+ "name": "Localized Posts navigation and responsive code copy controls",
90
+ "stage": "experimental",
91
+ "since": "2026.9.6"
92
+ },
93
+ {
94
+ "name": "Linked tables of contents on Markdown post pages",
95
+ "stage": "experimental",
96
+ "since": "2026.9.6"
97
+ },
98
+ {
99
+ "name": "Consent-nested browser services and generated privacy disclosures",
100
+ "stage": "experimental",
101
+ "since": "2026.9.7"
102
+ },
103
+ {
104
+ "name": "Responsive homepage imagery and chronological all-post archives",
105
+ "stage": "experimental",
106
+ "since": "2026.9.7"
107
+ },
108
+ {
109
+ "name": "Date-versioned localized consent disclosures with isolated responsive checks",
110
+ "stage": "experimental",
111
+ "since": "2026.9.8"
112
+ },
113
+ {
114
+ "name": "Markdown video syntax and locale-deduplicated chronological post lists",
115
+ "stage": "experimental",
116
+ "since": "2026.9.8"
117
+ },
118
+ {
119
+ "name": "Floating post contents and compact consent controls",
120
+ "stage": "experimental",
121
+ "since": "2026.9.9"
122
+ },
123
+ {
124
+ "name": "Locale-stable consent choices and localized page-block links",
125
+ "stage": "experimental",
126
+ "since": "2026.9.10"
127
+ },
128
+ {
129
+ "name": "Consent-gated RepoRelay GitHub App comments, pinned posts, local times and automatic content revisions",
130
+ "stage": "experimental",
131
+ "since": "2026.10.3"
132
+ },
133
+ {
134
+ "name": "CommentNest URL integration and persistent consent with isolated comment UI",
135
+ "stage": "experimental",
136
+ "since": "2026.10.5"
137
+ },
138
+ {
139
+ "name": "Static deployment for Vercel, Netlify, EdgeOne Pages and ESA Pages",
140
+ "stage": "experimental",
141
+ "since": "2026.10.5"
142
+ },
143
+ {
144
+ "name": "Consent-registered external APIs and widgets",
145
+ "stage": "experimental",
146
+ "since": "2026.10.5"
147
+ }
37
148
  ],
38
149
  "releaseHistory": [
39
150
  {
@@ -95,6 +206,12 @@
95
206
  "date": "2026-09-27",
96
207
  "request": 10,
97
208
  "notes": "Keep consent choices across locale changes and migrate existing records; add localized page-block links; make article tags clear; load search only where needed; redraw icons and simplify privacy wording."
209
+ },
210
+ {
211
+ "version": "2026.10.5",
212
+ "date": "2026-10-03",
213
+ "request": 5,
214
+ "notes": "Move all comment frontend assets and backend implementation to CommentNest; keep only a consent-gated backend URL adapter. Preserve privacy choices across refresh and presentation changes, including blocked local storage fallback."
98
215
  }
99
216
  ]
100
217
  }
@@ -0,0 +1,74 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "title": "EdgePress Page / 写文建站页面",
4
+ "description": "Page → rows → cells → ordered elements. 页面 → 行 → 单元格 → 按顺序排列的元素。",
5
+ "type": "object",
6
+ "required": ["blocks"],
7
+ "properties": {
8
+ "$schema": {"type": "string", "description": "Local editor schema; never fetched by the built website. 编辑器的本地结构说明。"},
9
+ "title": {"type": "string", "minLength": 1, "description": "Page title / 页面标题"},
10
+ "lang": {"type": "string", "description": "Enabled locale matching the lowercase filename / 与文件名匹配的已启用语言"},
11
+ "slug": {"type": "string", "description": "Page path / 页面路径"},
12
+ "homepage": {"type": "boolean", "description": "Publish at the localized site root / 发布为当前语言首页"},
13
+ "description": {"type": "string"},
14
+ "keywords": {"type": "array", "items": {"type": "string"}},
15
+ "draft": {"type": "boolean"},
16
+ "robots": {"type": "string"},
17
+ "image": {"type": "string"},
18
+ "blocks": {
19
+ "type": "array", "minItems": 1, "maxItems": 100,
20
+ "description": "Page rows in display order / 页面中按顺序显示的行",
21
+ "items": {"$ref": "#/definitions/row"}
22
+ }
23
+ },
24
+ "definitions": {
25
+ "row": {
26
+ "type": "object", "required": ["columns", "cells"], "additionalProperties": false,
27
+ "description": "One row; columns must equal the cell count / 一行,栏数必须等于单元格个数",
28
+ "properties": {
29
+ "columns": {"type": "integer", "minimum": 1, "maximum": 4, "description": "Column count / 栏数"},
30
+ "cells": {"type": "array", "minItems": 1, "maxItems": 4, "description": "Parallel cells in this row / 这一行的并列单元格", "items": {"$ref": "#/definitions/elements"}}
31
+ },
32
+ "allOf": [
33
+ {"if": {"properties": {"columns": {"const": 1}}}, "then": {"properties": {"cells": {"minItems": 1, "maxItems": 1}}}},
34
+ {"if": {"properties": {"columns": {"const": 2}}}, "then": {"properties": {"cells": {"minItems": 2, "maxItems": 2}}}},
35
+ {"if": {"properties": {"columns": {"const": 3}}}, "then": {"properties": {"cells": {"minItems": 3, "maxItems": 3}}}},
36
+ {"if": {"properties": {"columns": {"const": 4}}}, "then": {"properties": {"cells": {"minItems": 4, "maxItems": 4}}}}
37
+ ]
38
+ },
39
+ "elements": {
40
+ "type": "array", "minItems": 1, "maxItems": 100,
41
+ "description": "Ordered elements inside one cell or section / 单元格或分区内按顺序排列的元素",
42
+ "items": {"$ref": "#/definitions/element"}
43
+ },
44
+ "element": {
45
+ "type": "object", "required": ["type"],
46
+ "description": "One element; type selects its renderer / 一个元素,type 指定呈现方式",
47
+ "allOf": [{"if": {"properties": {"type": {"const": "local-tool"}}}, "then": {"required": ["id", "title", "script", "fallback"]}}],
48
+ "properties": {
49
+ "type": {"enum": ["hero", "section", "heading", "text", "media-text", "display-text", "link-list", "steps", "code", "data-table", "list", "notice", "privacy-services", "privacy-consent", "privacy-controller", "link-directory", "feature-grid", "image", "quote", "cta", "faq", "oembed", "service", "post-list", "latest-posts", "ad-slot", "captcha", "document", "media-viewer", "local-tool"]},
50
+ "id": {"type": "string"},
51
+ "script": {"type": "string", "description": "Same-origin local browser module / 站内浏览器模块"},
52
+ "stylesheet": {"type": "string", "description": "Optional local CSS / 可选站内样式"},
53
+ "data": {"type": "string", "description": "Optional public local JSON asset / 可选站内公开 JSON 数据"},
54
+ "fallback": {"type": "string", "description": "Explanation when JavaScript is disabled / 未启用 JavaScript 时的说明"},
55
+ "title": {"type": "string"},
56
+ "text": {"type": "string"},
57
+ "paragraphs": {"type": "array", "items": {"type": "string"}},
58
+ "items": {"type": "array", "description": "Entries for this element / 此元素的条目"},
59
+ "blocks": {"$ref": "#/definitions/elements", "description": "Section child elements, not page rows / 分区的子元素,不是页面行"},
60
+ "category": {"type": "string"},
61
+ "categories": {"type": "array", "items": {"type": "string"}},
62
+ "count": {"type": "integer", "minimum": 1, "maximum": 12},
63
+ "level": {"type": "integer", "minimum": 2, "maximum": 6},
64
+ "code": {"type": "string", "description": "Code content; use \\n for line breaks / 代码内容,换行使用 \\n"},
65
+ "language": {"type": "string"},
66
+ "src": {"type": "string"},
67
+ "url": {"type": "string"},
68
+ "alt": {"type": "string"},
69
+ "caption": {"type": "string"},
70
+ "cta": {"type": "object", "properties": {"label": {"type": "string"}, "url": {"type": "string"}}, "required": ["label", "url"]}
71
+ }
72
+ }
73
+ }
74
+ }