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.
- package/LICENSE +21 -0
- package/README.md +216 -16
- package/config.yml +99 -127
- package/content/assets/edgepress/brand/avatar.png +0 -0
- package/content/assets/edgepress/brand/deploy-esa.svg +1 -0
- package/content/assets/edgepress/brand/home-hero-768.webp +0 -0
- package/content/assets/edgepress/brand/home-hero.png +0 -0
- package/content/assets/edgepress/brand/home-hero.webp +0 -0
- package/content/assets/edgepress/brand/mascot.png +0 -0
- package/content/assets/edgepress/brand/mascot.webp +0 -0
- package/content/assets/edgepress/brand/og-image.png +0 -0
- package/content/assets/edgepress/brand/og-image.webp +0 -0
- package/content/assets/edgepress/brand/sources/edgepress-avatar-master.png +0 -0
- package/content/assets/edgepress/brand/sources/export-manifest.json +181 -0
- package/content/assets/edgepress/brand/sources/prompts.json +12 -0
- package/content/assets/edgepress/favicon/apple-touch-icon.png +0 -0
- package/content/assets/edgepress/favicon/favicon-16.png +0 -0
- package/content/assets/edgepress/favicon/favicon-32.png +0 -0
- package/content/assets/edgepress/favicon/favicon-48.png +0 -0
- package/content/assets/edgepress/favicon/favicon-64.png +0 -0
- package/content/assets/edgepress/favicon/favicon.ico +0 -0
- package/content/assets/edgepress/icons/LICENSE.txt +43 -0
- package/content/assets/edgepress/icons/arrow-right.svg +16 -0
- package/content/assets/edgepress/icons/arrow-up-right.svg +16 -0
- package/content/assets/edgepress/icons/book-open.svg +16 -0
- package/content/assets/edgepress/icons/check-circle.svg +16 -0
- package/content/assets/edgepress/icons/check.svg +15 -0
- package/content/assets/edgepress/icons/cloud.svg +15 -0
- package/content/assets/edgepress/icons/code.svg +16 -0
- package/content/assets/edgepress/icons/cpu.svg +28 -0
- package/content/assets/edgepress/icons/file-text.svg +19 -0
- package/content/assets/edgepress/icons/github.svg +17 -0
- package/content/assets/edgepress/icons/globe.svg +17 -0
- package/content/assets/edgepress/icons/help-circle.svg +17 -0
- package/content/assets/edgepress/icons/home.svg +16 -0
- package/content/assets/edgepress/icons/layers.svg +17 -0
- package/content/assets/edgepress/icons/layout-grid.svg +18 -0
- package/content/assets/edgepress/icons/mail.svg +16 -0
- package/content/assets/edgepress/icons/newspaper.svg +18 -0
- package/content/assets/edgepress/icons/palette.svg +19 -0
- package/content/assets/edgepress/icons/plug.svg +18 -0
- package/content/assets/edgepress/icons/provenance.json +8 -0
- package/content/assets/edgepress/icons/puzzle.svg +15 -0
- package/content/assets/edgepress/icons/rocket.svg +18 -0
- package/content/assets/edgepress/icons/rss.svg +17 -0
- package/content/assets/edgepress/icons/search.svg +16 -0
- package/content/assets/edgepress/icons/settings.svg +16 -0
- package/content/assets/edgepress/icons/shield-check.svg +16 -0
- package/content/assets/edgepress/icons/sparkles.svg +18 -0
- package/content/assets/edgepress/icons/terminal.svg +16 -0
- package/content/assets/edgepress/icons/x.svg +16 -0
- package/{static → content/assets}/edgepress-markdown-guide.svg +1 -1
- package/content/assets/images/previews/edgepress-en.webp +0 -0
- package/content/assets/images/previews/edgepress-revisions-en.png +0 -0
- package/content/assets/images/previews/edgepress-workflow-en.90f4650b21013786.gif +0 -0
- package/content/assets/images/previews/edgepress-workflow-zh.41f1e0a685f47267.gif +0 -0
- package/content/assets/images/previews/edgepress-zh.webp +0 -0
- package/content/assets/images/previews/provenance.json +49 -0
- package/content/guides/markdown-media.md +38 -0
- package/content/guides/platforms.md +15 -0
- package/content/guides/product-demos.md +37 -0
- package/content/guides/zh-cn.md +62 -0
- package/content/pages/deployment/en.json +74 -0
- package/content/pages/deployment/zh-cn.json +74 -0
- package/content/pages/home/en.json +248 -0
- package/content/pages/home/zh-cn.json +248 -0
- package/content/pages/local-tools/en.json +14 -0
- package/content/pages/local-tools/zh-cn.json +14 -0
- package/content/pages/page-authoring/en.json +107 -0
- package/content/pages/page-authoring/zh-cn.json +107 -0
- package/content/pages/plugin-development/en.json +202 -0
- package/content/pages/plugin-development/zh-cn.json +202 -0
- package/content/pages/privacy-policy/en.json +171 -0
- package/content/pages/privacy-policy/zh-cn.json +171 -0
- package/content/pages/project-introduction/en.json +158 -0
- package/content/pages/project-introduction/zh-cn.json +158 -0
- package/content/pages/quick-start/en.json +325 -0
- package/content/pages/quick-start/zh-cn.json +325 -0
- package/content/pages/theme-development/en.json +353 -0
- package/content/pages/theme-development/zh-cn.json +349 -0
- package/content/posts/2026-09-24-edgepress-release-2026-9-1/en.md +1 -1
- package/content/posts/2026-09-24-edgepress-release-2026-9-1/zh-cn.md +1 -1
- package/content/posts/2026-10-03-edgepress-release-2026-10-3/en.md +16 -0
- package/content/posts/2026-10-03-edgepress-release-2026-10-3/zh-cn.md +16 -0
- package/content/posts/2026-10-03-edgepress-release-202610-4/en.md +22 -0
- package/content/posts/2026-10-03-edgepress-release-202610-4/zh-cn.md +20 -0
- package/content/posts/2026-10-03-edgepress-release-202610-5/en.md +15 -0
- package/content/posts/2026-10-03-edgepress-release-202610-5/zh-cn.md +15 -0
- package/edgeone.json +43 -0
- package/esa.jsonc +9 -0
- package/languages/base/en.json +75 -10
- package/languages/packs/zh-CN.json +74 -9
- package/netlify.toml +6 -0
- package/package.json +37 -6
- package/plugins/consent/index.js +10 -17
- package/project-compatibility.json +142 -25
- package/schemas/pages.schema.json +74 -0
- package/src/assets.js +146 -18
- package/src/browser-audit.js +158 -0
- package/src/build.js +34 -9
- package/src/cli.js +46 -41
- package/src/config.js +114 -63
- package/src/consent-csp.js +137 -0
- package/src/content.js +55 -30
- package/src/data-saver.js +194 -0
- package/src/deploy.js +28 -0
- package/src/document.js +44 -0
- package/src/embed.js +60 -0
- package/src/generators.js +101 -59
- package/src/i18n.js +19 -3
- package/src/icons.js +5 -4
- package/src/image-dimensions.js +17 -0
- package/src/local-tool.js +29 -0
- package/src/maintenance.js +25 -8
- package/src/markdown-fixture.js +20 -0
- package/src/markdown.js +80 -16
- package/src/media-assets.js +19 -0
- package/src/media-viewer.js +47 -0
- package/src/oembed.js +53 -0
- package/src/page-blocks.js +124 -54
- package/src/page-check.js +29 -39
- package/src/plugin-api.js +7 -1
- package/src/post-details.js +60 -0
- package/src/post-template.js +5 -0
- package/src/publication-time.js +47 -0
- package/src/report-path.js +19 -0
- package/src/report-visuals.js +91 -18
- package/src/revision-cards.js +30 -0
- package/src/revision-images.js +44 -0
- package/src/revisions.js +77 -0
- package/src/rss.js +100 -0
- package/src/service-block.js +18 -0
- package/src/theme.js +59 -9
- package/src/video-metadata.js +36 -0
- package/static/edgepress/data-saver.css +12 -0
- package/static/edgepress/data-saver.js +333 -0
- package/static/edgepress/document-viewer.js +35 -0
- package/static/edgepress/external-links-policy.js +14 -0
- package/static/edgepress/external-links.css +13 -0
- package/static/edgepress/external-links.js +120 -0
- package/static/edgepress/fonts/faces.css +2217 -0
- package/static/edgepress/fonts/noto-sans-OFL.txt +93 -0
- package/static/edgepress/fonts/noto-sans-cyrillic-ext-wght-normal.82ff72b28e6610f2.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-cyrillic-wght-normal.6ab64433de6077ca.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-devanagari-wght-normal.ea6a530b75d93de7.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-greek-ext-wght-normal.790b255c10c32e0b.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-greek-wght-normal.7f655207c2f6c140.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-latin-ext-wght-normal.6d5a79315528df19.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-latin-wght-normal.51ca196f49a33e79.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-100-wght-normal.ad5f29028d5699a5.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-101-wght-normal.e189b81fc22ca6af.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-102-wght-normal.941c0c2971fc1d6d.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-103-wght-normal.bafbd591af6493ff.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-104-wght-normal.b0bf80ced89dd61b.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-105-wght-normal.8d8b4e6f4a00621d.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-106-wght-normal.bae74acc629d2e74.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-107-wght-normal.a42eff5010de7b0d.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-108-wght-normal.91882203459867be.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-109-wght-normal.a91f8b038e5ce108.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-110-wght-normal.bbca9081655c4523.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-111-wght-normal.372be010ac0e87cb.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-112-wght-normal.34a4580239eae8dc.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-113-wght-normal.614ab8f616352583.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-114-wght-normal.cf7b8344807a316e.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-115-wght-normal.fb29957c7adccb9a.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-116-wght-normal.a98dc5a726f82141.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-117-wght-normal.d94b5af0c14838af.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-118-wght-normal.76c9ddb85ae4578c.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-119-wght-normal.b3b2374881f4cd93.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-21-wght-normal.c1409c43e55ecff2.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-22-wght-normal.77037ed42ff4e7b0.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-23-wght-normal.38d0df21ac374e93.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-24-wght-normal.8fa21e7e457acf3e.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-25-wght-normal.f760b7a3871d214d.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-26-wght-normal.be8386e7bd7facfe.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-27-wght-normal.4895abcaddbd162e.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-28-wght-normal.82540b6201a9b9ad.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-29-wght-normal.ff21d8fcc60ce391.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-30-wght-normal.1f76f6ffded00b9e.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-31-wght-normal.e6c25be1bb08a63a.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-32-wght-normal.0cda750d7d04a4e1.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-33-wght-normal.b9732b5606bd87c5.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-34-wght-normal.38aa326b4c84902a.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-35-wght-normal.bd98226c8e0aa808.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-36-wght-normal.0db1ca695a491d37.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-37-wght-normal.8df409a4e0a237c2.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-38-wght-normal.672d2d994994a3c3.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-39-wght-normal.272d6d0e153f56e8.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-4-wght-normal.9fafd93ac77b81ff.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-40-wght-normal.5b9ef1ed48420aa7.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-41-wght-normal.30aee47f660fd88a.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-42-wght-normal.ec0014830db682b6.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-43-wght-normal.43df2b5dad9bb835.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-44-wght-normal.acaa6195041b1a92.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-45-wght-normal.8cdb9903f770db21.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-46-wght-normal.6590d0a6fe94571c.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-47-wght-normal.b05afdd32b3bf722.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-48-wght-normal.c9585f7d070700be.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-49-wght-normal.4943895a4dfa5dcf.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-5-wght-normal.e64f57937e3ae4fe.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-50-wght-normal.13e51063d7743cfe.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-51-wght-normal.fd4df1f02c2cb4d7.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-52-wght-normal.06999a39c4c3a7ea.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-53-wght-normal.767b7b9864658d91.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-54-wght-normal.4cd00537a46f6f1a.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-55-wght-normal.0118ec5d8c30b197.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-56-wght-normal.a3e4a78929826930.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-57-wght-normal.7623501009e4a6db.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-58-wght-normal.56ae1a59a32e4a25.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-59-wght-normal.7a377a40e99fd9bc.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-6-wght-normal.17e15c4f0a5bfd92.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-60-wght-normal.3657f66babdf6aff.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-61-wght-normal.23919a2eb11d25dd.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-62-wght-normal.a901edf25bc1cfae.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-63-wght-normal.92f56f713cc0b62f.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-64-wght-normal.4929c9f39a5a4bd9.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-65-wght-normal.8daa61282fb62a11.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-66-wght-normal.6479166925eb462b.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-67-wght-normal.a6b0e11c4c761ffd.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-68-wght-normal.65b77f1fe9d68dae.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-69-wght-normal.b34f765cbbf4d02e.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-70-wght-normal.a99d55c00e4f95b7.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-71-wght-normal.3298bed30dc8d233.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-72-wght-normal.6597209ca9707726.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-73-wght-normal.e7ac1d4930eabd78.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-74-wght-normal.1f0287be83a28e7a.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-75-wght-normal.d9a4bb7bcc2be578.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-76-wght-normal.5a019946bcadcec6.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-77-wght-normal.7c445e85d04f5319.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-78-wght-normal.7d4afb70f641781c.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-79-wght-normal.5798753a721bb4ec.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-80-wght-normal.db887159ca6e46f3.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-81-wght-normal.71e5743bbd225b3d.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-82-wght-normal.8c5094c3785fd04f.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-83-wght-normal.4a60a1ccba905284.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-84-wght-normal.3ed54e59ef4758e3.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-85-wght-normal.e87e0a1342e1778c.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-86-wght-normal.6d3ac3e20959dbcb.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-87-wght-normal.0eeffd5daad5c17b.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-88-wght-normal.b1d9582dfa268463.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-89-wght-normal.8b437aeb9e9fcb5a.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-90-wght-normal.83b0a59e0a5e045a.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-91-wght-normal.382f72b98d4bb9d7.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-97-wght-normal.5e52856457c5cdab.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-98-wght-normal.ffded4e7fd560d93.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-99-wght-normal.54e302c23f11a8fd.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-OFL.txt +93 -0
- package/static/edgepress/fonts/noto-sans-sc-cyrillic-wght-normal.5932d441e7126669.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-latin-ext-wght-normal.e316201f3fc493d1.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-latin-wght-normal.c1d919c8701a86ed.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-vietnamese-wght-normal.cba3d00c8db989f0.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-0-wght-normal.63c21eda5d20203f.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-100-wght-normal.87a7c76301c24a28.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-101-wght-normal.c9e83fc4ffd53746.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-102-wght-normal.9a00ae0e5735852b.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-103-wght-normal.7cfe93b3221f4def.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-104-wght-normal.2d5ac7497d84cb99.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-105-wght-normal.0989885bb16bcd9b.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-106-wght-normal.1faa921b035064e7.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-107-wght-normal.2f6006745ae16d69.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-108-wght-normal.a61e48c10a2cf4b9.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-109-wght-normal.f28c767724736d2d.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-110-wght-normal.4b04bd88c3dc7c5d.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-111-wght-normal.b6251e1967932a52.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-112-wght-normal.e264513b32f90660.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-113-wght-normal.46cb347d88f3338e.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-114-wght-normal.9f9e1e0d0ab2aeb4.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-115-wght-normal.653dd2ab7d551b40.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-116-wght-normal.4718bf3627191297.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-117-wght-normal.b241a9409682af5f.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-118-wght-normal.fda2800dc1c06852.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-119-wght-normal.948af36bd63a72c7.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-19-wght-normal.62191cdc3a10e60a.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-20-wght-normal.65c90892c2e01657.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-21-wght-normal.d3f59b094c334866.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-22-wght-normal.b1983a041d7e4e1f.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-23-wght-normal.16e2163b66c7732a.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-24-wght-normal.72c8561976116537.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-25-wght-normal.b2948d928ce4dd54.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-26-wght-normal.d583236b90abedc9.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-27-wght-normal.7d6073ba07597c9b.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-28-wght-normal.517204d716b089cd.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-29-wght-normal.10189a8f8ca38099.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-30-wght-normal.695a71d72dfab3f7.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-31-wght-normal.868d59473ef0e73c.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-32-wght-normal.92efa2d4b3702ec0.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-33-wght-normal.d2274bcd5636197d.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-34-wght-normal.1ac8c3718ee2eed2.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-35-wght-normal.00b3df730d5a4c73.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-36-wght-normal.6963feb6c628b81f.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-37-wght-normal.a1b4bd294af24cd1.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-38-wght-normal.8edb2f7f2955921b.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-39-wght-normal.37bf7394eb3148c6.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-40-wght-normal.3efa655bc48f9133.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-41-wght-normal.48d47014544ebd5d.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-42-wght-normal.214c733a59d423e7.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-43-wght-normal.c2c9876f138bb20f.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-44-wght-normal.28928bfea29db06a.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-45-wght-normal.bf3743f8155fa9d2.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-46-wght-normal.06970903593781c3.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-47-wght-normal.8932ed83a91794d4.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-48-wght-normal.dfd9225628bcf234.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-49-wght-normal.c27d341ad39d44eb.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-50-wght-normal.01a0f4e7dfba0a56.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-51-wght-normal.5a30022af3d30e0f.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-52-wght-normal.4884f032342a3274.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-53-wght-normal.537adcae44511270.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-54-wght-normal.6bc8c7d3e47c6fde.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-55-wght-normal.725a48711f1e1997.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-56-wght-normal.f43ecaa73e0cd8fc.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-57-wght-normal.15b24e9d42a3270f.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-58-wght-normal.9b2d8a71667d3da6.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-59-wght-normal.a68535a6b3289d89.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-6-wght-normal.32cece1ae80c4f2b.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-60-wght-normal.3b2c56a921d1cad4.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-61-wght-normal.54f51f80a0740878.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-62-wght-normal.ba029c5bb6c07bf1.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-63-wght-normal.380919beec4c7f3d.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-64-wght-normal.f96fe0be479d201f.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-65-wght-normal.7d544b80701fe678.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-66-wght-normal.fab669c07a1e3bee.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-67-wght-normal.0001bb744743fdfa.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-68-wght-normal.1a57eda03886b43c.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-69-wght-normal.017fecc749bcd6d5.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-7-wght-normal.cd0f0cac743dbbfe.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-70-wght-normal.79fb9d70b9534ec7.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-71-wght-normal.04a6ea581b5f1195.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-72-wght-normal.d3a4eb35499157b7.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-73-wght-normal.d81f8484404ee465.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-74-wght-normal.4a5da9e0c2702f7d.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-75-wght-normal.8b87f9c6c164513a.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-76-wght-normal.a71463dbfd9fa7b5.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-77-wght-normal.d094414ea752cd52.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-78-wght-normal.04f7c97bd9cbc73b.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-79-wght-normal.1ed089d037a02049.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-8-wght-normal.d052677dfb5db5bd.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-80-wght-normal.6d41ca59cfd50442.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-81-wght-normal.f09bd0afa8a58114.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-82-wght-normal.7920841c526b1b02.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-83-wght-normal.0c6f7f82db8da0d8.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-84-wght-normal.f37c0a853b31265e.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-85-wght-normal.4173bff087653b82.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-86-wght-normal.dac35605ebec15c4.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-87-wght-normal.8ac85fdd0b15a6bd.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-88-wght-normal.61625b0b21e8407f.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-89-wght-normal.a1da3dccbf00698e.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-90-wght-normal.bf08f0355222a782.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-91-wght-normal.2ecf295bba2bfaa3.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-92-wght-normal.36508326bb68115f.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-97-wght-normal.c712899e0fc9e947.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-98-wght-normal.13a648e521d18d7f.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-99-wght-normal.7f8c9a777e64159a.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-OFL.txt +93 -0
- package/static/edgepress/fonts/noto-sans-tc-cyrillic-wght-normal.dd0980ced8e46cb3.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-latin-ext-wght-normal.817d96335dc52ce6.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-latin-wght-normal.50cb5fb0a522cfaf.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-vietnamese-wght-normal.2a77fb7b70fa304d.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-vietnamese-wght-normal.791e3f213c155a5b.woff2 +0 -0
- package/static/edgepress/fonts/noto-serif-OFL.txt +93 -0
- package/static/edgepress/fonts/noto-serif-cyrillic-ext-wght-normal.7c7afb20d33e30ec.woff2 +0 -0
- package/static/edgepress/fonts/noto-serif-cyrillic-wght-normal.54e3bd0c4a002b0f.woff2 +0 -0
- package/static/edgepress/fonts/noto-serif-greek-ext-wght-normal.9b3f4c4ff3adefd2.woff2 +0 -0
- package/static/edgepress/fonts/noto-serif-greek-wght-normal.1252037b6f1d6e86.woff2 +0 -0
- package/static/edgepress/fonts/noto-serif-latin-ext-wght-normal.2654f8d1261a420f.woff2 +0 -0
- package/static/edgepress/fonts/noto-serif-latin-wght-normal.46281456234014ce.woff2 +0 -0
- package/static/edgepress/fonts/noto-serif-math-wght-normal.d4a6aba2cb4636b3.woff2 +0 -0
- package/static/edgepress/fonts/noto-serif-vietnamese-wght-normal.fb6a5ed734c2fbe3.woff2 +0 -0
- package/static/edgepress/fonts/provenance.json +1356 -0
- package/static/edgepress/fonts.css +14 -0
- package/static/edgepress/image-viewer.js +23 -0
- package/static/edgepress/images.css +4 -0
- package/static/edgepress/link-directory.css +14 -0
- package/static/edgepress/local-time.js +12 -0
- package/static/edgepress/media-viewer.css +1 -0
- package/static/edgepress/media-viewer.js +111 -0
- package/static/edgepress/navigation-select.js +14 -0
- package/static/edgepress/oembed.js +129 -0
- package/static/edgepress/plugins/backend/external-api.js +4 -0
- package/static/edgepress/plugins/backend/external-widget.js +13 -0
- package/static/edgepress/plugins/consent/choices.js +47 -0
- package/static/edgepress/plugins/consent/manager.js +56 -74
- package/static/edgepress/project-demo.js +93 -0
- package/static/edgepress/search.js +2 -2
- package/static/edgepress/services-consent.js +3 -0
- package/static/edgepress/services.js +15 -0
- package/static/edgepress/webmcp.js +86 -0
- package/tests/assets-runtime.test.mjs +91 -0
- package/tests/audit.test.mjs +142 -0
- package/tests/brand-regression.test.mjs +110 -0
- package/tests/consent-browser.test.mjs +132 -0
- package/tests/consent-config.test.mjs +85 -0
- package/tests/consent-csp.test.mjs +90 -0
- package/tests/data-saver-loading.test.mjs +158 -0
- package/tests/data-saver-network.test.mjs +99 -0
- package/tests/data-saver.test.mjs +294 -0
- package/tests/document-package.test.mjs +28 -0
- package/tests/document-viewer.test.mjs +152 -0
- package/tests/edge-issues.test.mjs +65 -0
- package/tests/embed-syntax.test.mjs +68 -0
- package/tests/external-links.test.mjs +198 -0
- package/tests/fixtures/recording.mp4 +0 -0
- package/tests/fonts.test.mjs +99 -0
- package/tests/image-dimensions.test.mjs +15 -0
- package/tests/image-viewer.test.mjs +36 -0
- package/tests/json-pages.test.mjs +66 -0
- package/tests/link-directory.test.mjs +51 -0
- package/tests/local-tool.test.mjs +34 -0
- package/tests/markdown-media.test.mjs +119 -0
- package/tests/media-block.test.mjs +102 -0
- package/tests/navigation.test.mjs +87 -0
- package/tests/oembed-layout.test.mjs +98 -0
- package/tests/oembed.test.mjs +96 -0
- package/tests/page-authoring.test.mjs +27 -0
- package/tests/page-formatting.test.mjs +37 -0
- package/tests/post-list.test.mjs +96 -0
- package/tests/project-demo.test.mjs +73 -0
- package/tests/publication-time.test.mjs +43 -0
- package/tests/release-version.test.mjs +28 -0
- package/tests/revisions.test.mjs +93 -0
- package/tests/rss.test.mjs +54 -0
- package/tests/services.test.mjs +35 -0
- package/tests/theme-layout.test.mjs +95 -0
- package/tests/video-metadata.test.mjs +28 -0
- package/tests/webmcp.test.mjs +121 -0
- package/tests/writing.test.mjs +101 -0
- package/themes/atelier/assets/style.css +144 -22
- package/themes/atelier/layouts/partials/head.html +8 -1
- package/themes/atelier/layouts/partials/header.html +3 -1
- package/themes/default/assets/data-saver-theme.css +2 -0
- package/themes/default/assets/style.css +139 -23
- package/themes/default/layouts/partials/head.html +9 -2
- package/themes/default/layouts/partials/header.html +3 -1
- package/themes/default/theme.json +1 -0
- package/themes/folio/README.md +7 -0
- package/themes/folio/assets/data-saver-theme.css +3 -0
- package/themes/folio/assets/folio/navigation.js +10 -0
- package/themes/folio/assets/style.css +516 -0
- package/themes/folio/layouts/layout.html +15 -0
- package/themes/folio/layouts/partials/footer.html +6 -0
- package/themes/folio/layouts/partials/head.html +30 -0
- package/themes/folio/layouts/partials/header.html +8 -0
- package/themes/folio/theme.json +7 -0
- package/themes/signal/assets/style.css +143 -21
- package/themes/signal/layouts/partials/head.html +8 -1
- package/themes/signal/layouts/partials/header.html +3 -1
- package/tools/README.md +14 -0
- package/tools/assets/format-pages.mjs +56 -0
- package/tools/assets/generate-brand-assets.py +160 -0
- package/tools/assets/sync-fonts.mjs +71 -0
- package/tools/assets/sync-icons.mjs +17 -0
- package/tools/assets/video-preview.mjs +15 -0
- package/tools/recordings/capture-document-demo.mjs +147 -0
- package/tools/recordings/demo-workbench.mjs +57 -0
- package/tools/recordings/desktop-recording.mjs +92 -0
- package/tools/recordings/provision-vm.sh +18 -0
- package/tools/recordings/start-vm-desktop.sh +28 -0
- package/tools/recordings/vm-desktop.mjs +124 -0
- package/tools/verification/README.md +44 -0
- package/tools/verification/data-saver-site.mjs +405 -0
- package/tools/verification/page-performance.mjs +76 -0
- package/tools/verification/verify-brand-assets.py +52 -0
- package/tools/verification/verify-brand.mjs +180 -0
- package/vercel.json +36 -0
- package/wrangler.jsonc +5 -7
- package/content/pages/home/en.md +0 -99
- package/content/pages/home/zh-cn.md +0 -99
- package/content/pages/plugin-development/en.md +0 -109
- package/content/pages/plugin-development/zh-cn.md +0 -109
- package/content/pages/privacy-policy/en.md +0 -93
- package/content/pages/privacy-policy/zh-cn.md +0 -93
- package/content/pages/project-introduction/en.md +0 -88
- package/content/pages/project-introduction/zh-cn.md +0 -88
- package/content/pages/quick-start/en.md +0 -153
- package/content/pages/quick-start/zh-cn.md +0 -153
- package/content/pages/theme-development/en.md +0 -132
- package/content/pages/theme-development/zh-cn.md +0 -132
- package/src/worker.js +0 -139
- package/static/edgepress/brand/edgepress-mark.svg +0 -7
- package/static/edgepress/brand/mascot-209.webp +0 -0
- package/static/edgepress/brand/mascot-418.png +0 -0
- package/static/edgepress/brand/mascot-418.webp +0 -0
- package/static/edgepress/brand/mascot.png +0 -0
- package/static/edgepress/brand/og-image.png +0 -0
- package/static/edgepress/brand/og-image.svg +0 -46
- package/static/edgepress/icons.svg +0 -24
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<!-- @license lucide-static v1.52.0 - ISC -->
|
|
2
|
+
<svg
|
|
3
|
+
class="lucide lucide-rocket"
|
|
4
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
5
|
+
width="24"
|
|
6
|
+
height="24"
|
|
7
|
+
viewBox="0 0 24 24"
|
|
8
|
+
fill="none"
|
|
9
|
+
stroke="currentColor"
|
|
10
|
+
stroke-width="2"
|
|
11
|
+
stroke-linecap="round"
|
|
12
|
+
stroke-linejoin="round"
|
|
13
|
+
>
|
|
14
|
+
<path d="M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5" />
|
|
15
|
+
<path d="M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09" />
|
|
16
|
+
<path d="M9 12a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.4 22.4 0 0 1-4 2z" />
|
|
17
|
+
<path d="M9 12H4s.55-3.03 2-4c1.62-1.08 5 .05 5 .05" />
|
|
18
|
+
</svg>
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
<!-- @license lucide-static v1.52.0 - ISC -->
|
|
2
|
+
<svg
|
|
3
|
+
class="lucide lucide-rss"
|
|
4
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
5
|
+
width="24"
|
|
6
|
+
height="24"
|
|
7
|
+
viewBox="0 0 24 24"
|
|
8
|
+
fill="none"
|
|
9
|
+
stroke="currentColor"
|
|
10
|
+
stroke-width="2"
|
|
11
|
+
stroke-linecap="round"
|
|
12
|
+
stroke-linejoin="round"
|
|
13
|
+
>
|
|
14
|
+
<path d="M4 11a9 9 0 0 1 9 9" />
|
|
15
|
+
<path d="M4 4a16 16 0 0 1 16 16" />
|
|
16
|
+
<circle cx="5" cy="19" r="1" />
|
|
17
|
+
</svg>
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<!-- @license lucide-static v1.52.0 - ISC -->
|
|
2
|
+
<svg
|
|
3
|
+
class="lucide lucide-search"
|
|
4
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
5
|
+
width="24"
|
|
6
|
+
height="24"
|
|
7
|
+
viewBox="0 0 24 24"
|
|
8
|
+
fill="none"
|
|
9
|
+
stroke="currentColor"
|
|
10
|
+
stroke-width="2"
|
|
11
|
+
stroke-linecap="round"
|
|
12
|
+
stroke-linejoin="round"
|
|
13
|
+
>
|
|
14
|
+
<path d="m21 21-4.34-4.34" />
|
|
15
|
+
<circle cx="11" cy="11" r="8" />
|
|
16
|
+
</svg>
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<!-- @license lucide-static v1.52.0 - ISC -->
|
|
2
|
+
<svg
|
|
3
|
+
class="lucide lucide-settings"
|
|
4
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
5
|
+
width="24"
|
|
6
|
+
height="24"
|
|
7
|
+
viewBox="0 0 24 24"
|
|
8
|
+
fill="none"
|
|
9
|
+
stroke="currentColor"
|
|
10
|
+
stroke-width="2"
|
|
11
|
+
stroke-linecap="round"
|
|
12
|
+
stroke-linejoin="round"
|
|
13
|
+
>
|
|
14
|
+
<path d="M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915" />
|
|
15
|
+
<circle cx="12" cy="12" r="3" />
|
|
16
|
+
</svg>
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<!-- @license lucide-static v1.52.0 - ISC -->
|
|
2
|
+
<svg
|
|
3
|
+
class="lucide lucide-shield-check"
|
|
4
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
5
|
+
width="24"
|
|
6
|
+
height="24"
|
|
7
|
+
viewBox="0 0 24 24"
|
|
8
|
+
fill="none"
|
|
9
|
+
stroke="currentColor"
|
|
10
|
+
stroke-width="2"
|
|
11
|
+
stroke-linecap="round"
|
|
12
|
+
stroke-linejoin="round"
|
|
13
|
+
>
|
|
14
|
+
<path d="M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z" />
|
|
15
|
+
<path d="m9 12 2 2 4-4" />
|
|
16
|
+
</svg>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<!-- @license lucide-static v1.52.0 - ISC -->
|
|
2
|
+
<svg
|
|
3
|
+
class="lucide lucide-sparkles"
|
|
4
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
5
|
+
width="24"
|
|
6
|
+
height="24"
|
|
7
|
+
viewBox="0 0 24 24"
|
|
8
|
+
fill="none"
|
|
9
|
+
stroke="currentColor"
|
|
10
|
+
stroke-width="2"
|
|
11
|
+
stroke-linecap="round"
|
|
12
|
+
stroke-linejoin="round"
|
|
13
|
+
>
|
|
14
|
+
<path d="M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z" />
|
|
15
|
+
<path d="M20 2v4" />
|
|
16
|
+
<path d="M22 4h-4" />
|
|
17
|
+
<circle cx="4" cy="20" r="2" />
|
|
18
|
+
</svg>
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<!-- @license lucide-static v1.52.0 - ISC -->
|
|
2
|
+
<svg
|
|
3
|
+
class="lucide lucide-terminal"
|
|
4
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
5
|
+
width="24"
|
|
6
|
+
height="24"
|
|
7
|
+
viewBox="0 0 24 24"
|
|
8
|
+
fill="none"
|
|
9
|
+
stroke="currentColor"
|
|
10
|
+
stroke-width="2"
|
|
11
|
+
stroke-linecap="round"
|
|
12
|
+
stroke-linejoin="round"
|
|
13
|
+
>
|
|
14
|
+
<path d="M12 19h8" />
|
|
15
|
+
<path d="m4 17 6-6-6-6" />
|
|
16
|
+
</svg>
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<!-- @license lucide-static v1.52.0 - ISC -->
|
|
2
|
+
<svg
|
|
3
|
+
class="lucide lucide-x"
|
|
4
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
5
|
+
width="24"
|
|
6
|
+
height="24"
|
|
7
|
+
viewBox="0 0 24 24"
|
|
8
|
+
fill="none"
|
|
9
|
+
stroke="currentColor"
|
|
10
|
+
stroke-width="2"
|
|
11
|
+
stroke-linecap="round"
|
|
12
|
+
stroke-linejoin="round"
|
|
13
|
+
>
|
|
14
|
+
<path d="M18 6 6 18" />
|
|
15
|
+
<path d="m6 6 12 12" />
|
|
16
|
+
</svg>
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
<g font-family="system-ui, sans-serif" text-anchor="middle" fill="#24352d">
|
|
6
6
|
<rect x="44" y="86" width="230" height="148" rx="18" fill="#fff" stroke="#b8c6bc" stroke-width="3"/>
|
|
7
7
|
<text x="159" y="139" font-size="23" font-weight="700">Markdown source</text>
|
|
8
|
-
<text x="159" y="181" font-size="
|
|
8
|
+
<text x="159" y="181" font-size="12">content/posts/<post-id>/en.md</text>
|
|
9
9
|
<text x="159" y="209" font-size="17">headings · lists · links</text>
|
|
10
10
|
<path d="M292 160h78m-16-16 16 16-16 16" fill="none" stroke="#426b57" stroke-width="5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
11
11
|
<rect x="382" y="86" width="230" height="148" rx="18" fill="#e3ece5" stroke="#9db4a4" stroke-width="3"/>
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"file": "edgepress-en.webp",
|
|
4
|
+
"kind": "actual local built website screenshot",
|
|
5
|
+
"source": "edgepress/dist/",
|
|
6
|
+
"viewport": {
|
|
7
|
+
"width": 1200,
|
|
8
|
+
"height": 820
|
|
9
|
+
},
|
|
10
|
+
"date": "2026-10-04"
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
"file": "edgepress-zh.webp",
|
|
14
|
+
"kind": "actual local built website screenshot",
|
|
15
|
+
"source": "edgepress/dist/zh-CN/",
|
|
16
|
+
"viewport": {
|
|
17
|
+
"width": 1200,
|
|
18
|
+
"height": 820
|
|
19
|
+
},
|
|
20
|
+
"date": "2026-10-04"
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"file": "edgepress-revisions-en.png",
|
|
24
|
+
"kind": "actual before-and-after image comparison from a locally built article",
|
|
25
|
+
"source": "web/signal.js.gripe/dist/2026/10/signal-vol-1/; current cover supplied by the operator",
|
|
26
|
+
"viewport": {
|
|
27
|
+
"width": 1200,
|
|
28
|
+
"height": 1000
|
|
29
|
+
},
|
|
30
|
+
"date": "2026-10-06",
|
|
31
|
+
"consent": "All optional services rejected before capture"
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"file": "edgepress-workflow-en.90f4650b21013786.gif",
|
|
35
|
+
"kind": "FFmpeg recording of an isolated WSL2 desktop; real terminal, editor and Chromium; preview startup wait shortened; isolated service fixtures",
|
|
36
|
+
"source": "web/js.gripe/tools/recordings/capture-project-demos.mjs",
|
|
37
|
+
"date": "2026-10-07",
|
|
38
|
+
"duration": 25240,
|
|
39
|
+
"bytes": 723577
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"file": "edgepress-workflow-zh.41f1e0a685f47267.gif",
|
|
43
|
+
"kind": "FFmpeg recording of an isolated WSL2 desktop; real terminal, editor and Chromium; preview startup wait shortened; isolated service fixtures",
|
|
44
|
+
"source": "web/js.gripe/tools/recordings/capture-project-demos.mjs",
|
|
45
|
+
"date": "2026-10-07",
|
|
46
|
+
"duration": 23960,
|
|
47
|
+
"bytes": 717704
|
|
48
|
+
}
|
|
49
|
+
]
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Local video and CJK emphasis in Markdown"
|
|
3
|
+
lang: en
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Insert a local video with the ordinary image-shaped Markdown syntax:
|
|
7
|
+
|
|
8
|
+
```md
|
|
9
|
+

|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
EdgePress enhances same-origin MP4, WebM, OGV and OGG files with the shared Multimedia viewer player. It provides themed controls, time, seeking, speed, volume and fullscreen. The file starts loading when the visitor presses Play. Scrolling the player out of view pauses playback and retains its position. Returning does not automatically resume it.
|
|
13
|
+
|
|
14
|
+
The native video element remains the fallback if the enhancement is unavailable. The player engine and styles are bundled locally and fingerprinted with the other site assets. A site with Markdown videos receives these assets even when it has no Pages galleries. In text view, the video and its engine activate only when the visitor requests that media. External embeds retain their own service-consent rules.
|
|
15
|
+
|
|
16
|
+
Use meaningful alternative text and an optional title for the visible caption. Reference-style links are supported too:
|
|
17
|
+
|
|
18
|
+
To show a poster and total duration before Play, generate a local preview once (FFmpeg and FFprobe must be on PATH):
|
|
19
|
+
|
|
20
|
+
```sh
|
|
21
|
+
node node_modules/edgepress/tools/assets/video-preview.mjs content/assets/media/bypass.mp4
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
An optional second argument selects the frame time in seconds. Commit the generated `bypass.mp4.poster.jpg` and `bypass.mp4.json` beside the video. The sidecar contains measured `duration`, `width`, `height` and the relative `poster` filename. EdgePress reads these local files during every build and adds the preview attributes to matching video elements, including Markdown videos. Cloud builds need no FFmpeg; visitors load the poster, while the video still waits for Play. After playback begins, the player's actual media duration replaces the supplied value. Regenerate the preview when replacing the video.
|
|
25
|
+
|
|
26
|
+
```md
|
|
27
|
+
![An action comparison][comparison]
|
|
28
|
+
|
|
29
|
+
[comparison]: /media/comparison.mp4
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
CJK prose can place bold text ending in brackets or punctuation directly beside the next word:
|
|
33
|
+
|
|
34
|
+
```md
|
|
35
|
+
本次采用**有限动画(背景复用)**制作短片。
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
The bracketed phrase renders as bold without adding spaces. Code spans, fenced code, escaped delimiters and link destinations retain their normal Markdown behavior.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# Free hosting comparison
|
|
2
|
+
|
|
3
|
+
Checked against official documentation on 2026-10-04. This ranking is for static EdgePress output. Function, database and CDN allowances are different meters; they cannot be added together.
|
|
4
|
+
|
|
5
|
+
| Priority | Platform | Free allowance relevant to this site | Conditions |
|
|
6
|
+
| --- | --- | --- | --- |
|
|
7
|
+
| 1 | Cloudflare Static Assets | Unlimited free static requests; Workers Builds includes 3,000 build minutes/month | A static-only deployment does not consume Worker function calls. See [asset pricing](https://developers.cloudflare.com/workers/platform/pricing/) and [build limits](https://developers.cloudflare.com/workers/ci-cd/builds/limits-and-pricing/). |
|
|
8
|
+
| 2 | Tencent EdgeOne Pages | Currently unlimited website traffic and requests; 500 builds/month, 40 projects, 5 GB project storage | Current generous free-phase limits may change when commercialization starts. See [FAQ](https://pages.edgeone.ai/document/faqs) and [quotas](https://pages.edgeone.ai/document/limits-and-quotas). |
|
|
9
|
+
| 3 | Vercel Hobby | 100 GB Fast Data Transfer, 1 million CDN requests/month | Personal, non-commercial use; quotas reset monthly. See [Hobby](https://vercel.com/docs/plans/hobby). |
|
|
10
|
+
| 4 | Netlify Free, current credit plans | 300 shared credits/month; production deploy costs 15, bandwidth costs 20/GB, requests cost 2/10,000 | 15 GB is a theoretical bandwidth-only upper bound before deploys and requests. Exhaustion pauses the site until reset. Older accounts can have different legacy plans. See [credit plans](https://docs.netlify.com/manage/accounts-and-billing/billing/billing-for-credit-based-plans/credit-based-pricing-plans/). |
|
|
11
|
+
| Verify separately | Alibaba Cloud ESA Pages | Pages traffic uses the selected site's package allowance | The 100,000/day free function allowance is not a static traffic allowance. No universal free Pages bandwidth limit was verified, so ESA is not ranked above documented free plans. See [official billing](https://help.aliyun.com/zh/edge-security-acceleration/esa/user-guide/functions-and-pages-billing). |
|
|
12
|
+
|
|
13
|
+
Cloudflare and EdgeOne both offer the largest published static allowance. Cloudflare comes first for this project because its static deployment and build-minute allowance are established; EdgeOne can be preferable for the audience's measured network performance. This is a practical recommendation, not a numerical comparison between build minutes and build counts.
|
|
14
|
+
|
|
15
|
+
All platforms receive the same `dist/`. CSS, JavaScript and their local dependencies have content hashes and one-year immutable caching. HTML and unversioned metadata remain refreshable. ESA requires equivalent cache rules in its console. External services have separate quotas and are called only with current consent and a matching page or visitor action. Homepages have no discussion slot.
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Product demonstrations
|
|
2
|
+
|
|
3
|
+
Use a static poster and a local MP4 or WebM for website playback. Visitors start playback manually and can drag the progress bar or use its arrow keys. Touch seeking needs an intentional horizontal drag; scrolling vertically and tapping control spacing keep the playhead. Leaving the viewport pauses playback and returning keeps the same position until Continue is clicked. The final frame remains visible until Replay is chosen.
|
|
4
|
+
|
|
5
|
+
```yaml
|
|
6
|
+
- type: media-text
|
|
7
|
+
mediaType: image
|
|
8
|
+
src: /images/publishing.webp
|
|
9
|
+
animationSrc: /images/publishing.mp4
|
|
10
|
+
alt: Publishing a photo and video post
|
|
11
|
+
title: Publish a story
|
|
12
|
+
text: Write a caption, attach media and share the result.
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Put the MP4 metadata at the start of the file (FFmpeg `-movflags +faststart`) and use a hashed filename for immutable caching. The runtime prepares nearby media, streams the native file and preserves its playhead without Blob URLs. Posters reserve the layout. GIF exports remain useful in GitHub documentation.
|
|
16
|
+
|
|
17
|
+
Record a real project and hold its visible results. For EdgePress, show `edgepress new post 'An afternoon by the water'`, editing the generated Markdown in a code editor, running `edgepress server`, opening the homepage, and clicking the article to read it. The preview uses the actual local server. Do not overlay unrelated slogans or publish test posts to production.
|
|
18
|
+
|
|
19
|
+
中文:网站使用静态封面与本地 MP4/WebM;手动播放,可拖动进度条或用方向键定位;离开视野时暂停,再回来保留原位置,点击继续才播放,结束后停留最后一帧。视频采用 faststart 与内容哈希,接近视野时预载,保留 GIF 给 GitHub 文档。示例必须来自独立写文建站项目:创建文章、代码编辑器修改、运行 `edgepress server`,再从网站首页点击进入文章。录制不需要固定字幕条。
|
|
20
|
+
|
|
21
|
+
## Isolated desktop recordings
|
|
22
|
+
|
|
23
|
+
Use a disposable VM and its own display. The current Windows workflow imports a dedicated WSL2 Debian VM and starts Xvfb display :99 with Openbox, xterm, Geany and Chromium. FFmpeg x11grab records that entire guest desktop at 25 fps. Playwright controls only the guest browser through its loopback CDP endpoint; xdotool controls only DISPLAY :99. Host mouse, keyboard, clipboard and browser sessions remain separate.
|
|
24
|
+
|
|
25
|
+
Create `/opt/recording/workspace` inside the guest as a link to the mounted canonical workspace. Pack the local EdgePress release with `npm pack` and install the resulting archive under `/opt/recording`, together with its locked Linux dependencies and Wrangler; verify `/opt/recording/node_modules/.bin/edgepress` before capture. Rebuild esbuild in the guest if lifecycle scripts were disabled. When GitHub downloads are unavailable in the guest, transfer the same pinned media-viewer archive from the host and point only the temporary package’s dependency at that archive. Do not fall back to a Windows global CLI.
|
|
26
|
+
|
|
27
|
+
The reusable helpers live in tools/recordings/. provision-vm.sh installs open-source desktop tools inside the guest; start-vm-desktop.sh starts its private display. demo-workbench.mjs prepares a real standalone writing site, executes edgepress in the guest terminal, saves the actual Markdown through Geany and opens the actual local preview in Chromium. desktop-recording.mjs invokes FFmpeg capture, trim, concat, H.264 faststart and GIF palette filters. It contains no screenshot capture loop or renderer.
|
|
28
|
+
|
|
29
|
+
Run start-vm-desktop.sh with `--keep-alive` during a capture session so the desktop stays available between commands. Browser startup waits for the guest CDP endpoint and disables unsolicited translation prompts. Use the physical browser window for page layout and the guest's actual X11 pointer for visible actions. Retain the application's navigation, quota cards and original styles; scroll controls into view before using them. Select both attachments through the native file chooser and show the publication result. The local video fixture adds gentle motion to the existing repository photograph so playback, pause, seeking and speed changes can be seen.
|
|
30
|
+
|
|
31
|
+
For embeddings, paste !embed[ishare](URL) into the body, save, run edgepress server, open the article from the homepage, grant consent and inspect the attachments. Only the uninformative middle of local-preview startup is omitted; retain the command and ready state. Service fixtures are isolated and never publish production test posts.
|
|
32
|
+
|
|
33
|
+
Begin writing captures with the terminal already visible. Hold the saved document and server-ready state, then show the homepage link and rendered article. In an embedding capture, verify the copied share URL, play and pause the embedded video, then switch to the picture. Review the exported timeline at several points in every clip and verify MP4/GIF duration, posters and file hashes before synchronizing references.
|
|
34
|
+
|
|
35
|
+
Keep raw masters, temporary sites and manifests in ignored tools/.recordings/. Publish only verified hashed posters, MP4 clips and documentation GIFs under content/assets/. Run `npm run recordings:capture` from `web/js.gripe`; optional `DEMO` and `DEMO_LOCALE` select a project and language. Inspect the exported clips before running `npm run recordings:sync`. Stop the guest desktop after capture. The operator can also use [OBS Studio display capture](https://obsproject.com/kb/display-capture-sources) inside a VM; this automated pipeline uses [FFmpeg x11grab](https://ffmpeg.org/ffmpeg-devices.html#x11grab) and [Playwright CDP](https://playwright.dev/docs/api/class-browsertype#browser-type-connect-over-cdp).
|
|
36
|
+
|
|
37
|
+
The builder emits each progressive file's exact Content-Length and Accept-Ranges policy, with immutable caching for content hashes. Generated audit PDFs live only in tools/reports/page-check.pdf and come from edgepress check.
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# 写文建站
|
|
2
|
+
|
|
3
|
+
写文建站把 Markdown 文章和 JSON 页面布局构建为静态网站。英文界面使用官方名称 EdgePress。首页、文章、搜索、多语言切换和本地 JavaScript 交互都随静态产物发布。
|
|
4
|
+
|
|
5
|
+

|
|
6
|
+
|
|
7
|
+
构建器自动识别并展示文章最近一次内容调整,无需手写修正说明。界面按“修改前/修改后”“新增/移除”展示具体文字及实际图片,支持 Markdown 排版,窄屏自动纵向排列,颜色跟随主题。封面替换、正文换图及同一路径图片内容被更新均计入变动;改动涉及的本地图片从 Git 恢复成哈希快照,旧文件移除后仍可比较。仅生成最近一次变动需要的图片,按内容去重,缓存一年。设置 `showChanges: false` 可关闭单篇文章的面板。
|
|
8
|
+
|
|
9
|
+

|
|
10
|
+
|
|
11
|
+
文章正文使用独立一行的 `!embed[ishare](https://ishare.js.gripe/s/0123456789abcdef0123456789abcdef)`;YouTube 示例为 `!embed[youtube](https://www.youtube.com/watch?v=jNQXAC9IVRw)`。Pages 的 text 区块也使用相同语法,普通文字继续转义,不需要在文章属性添加 embeds。服务在 config.yml 注册并逐项披露;构建器保留主题占位区,访客同意后才按可见区域加载。
|
|
12
|
+
|
|
13
|
+
历史对比需要完整 Git 历史,GitHub Actions 使用 `fetch-depth: 0`。缺少历史时不编造变动;缺少图片历史文件时保留说明,不请求失效地址。不会为重建历史主动访问外部图片地址,也不会发布草稿的图片快照。
|
|
14
|
+
|
|
15
|
+
## 本地开始
|
|
16
|
+
|
|
17
|
+
需要 Node.js 22.12 或更新版本。以下命令安装已发布的 npm 版本;最新 GitHub 改动可通过 README 的仓库模板部署,或克隆本仓库后在根目录运行 `npm ci`、`npm run dev`。在新目录中安装 npm 版本:
|
|
18
|
+
|
|
19
|
+
```sh
|
|
20
|
+
npm install edgepress
|
|
21
|
+
npx edgepress init
|
|
22
|
+
npm install
|
|
23
|
+
npm run dev
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
运行 `npm run new -- post "我的第一篇文章"`,打开命令输出的文件,在第二个 `---` 后撰写 Markdown。文章放在 `content/posts/<文章目录>/`;页面放在 `content/pages/<页面目录>/`,内容全部写入前置数据的 `blocks`,正文留空。页面先声明栏数,再定义各栏元素。图片放在 `content/assets/`,例如 `content/assets/images/photo.webp` 对应公开地址 `/images/photo.webp`。
|
|
27
|
+
|
|
28
|
+
发布前在 `config.yml` 填写真实站点 URL、名称、隐私责任人和联系方式;在 `edgepress.config.mjs` 选择主题、路由及语言包。不要编辑生成的 `dist/`。
|
|
29
|
+
|
|
30
|
+
## 免费额度优先的部署选择
|
|
31
|
+
|
|
32
|
+
完整数值与官方来源见 [平台比较](platforms.md),核对日期为 2026-10-04。静态站优先选择 Cloudflare,其次腾讯 EdgeOne Pages;个人非商业网站可选 Vercel,之后是共享积分较少的 Netlify。阿里云 ESA Pages 的静态流量使用站点套餐额度,需先在控制台确认,不能用函数免费请求数代替流量额度。
|
|
33
|
+
|
|
34
|
+
README 提供五个平台的部署按钮。Cloudflare、Vercel、Netlify 和 EdgeOne 打开仓库模板部署;ESA 按钮打开官方导入页,需要授权 GitHub 并选择仓库。按钮创建新项目,更新已有网站应使用其已连接的仓库。
|
|
35
|
+
|
|
36
|
+
| 平台 | 仓库内配置 | 部署命令 |
|
|
37
|
+
| --- | --- | --- |
|
|
38
|
+
| Cloudflare | `wrangler.jsonc` | `npm run deploy:cloudflare` |
|
|
39
|
+
| 腾讯 EdgeOne Pages | `edgeone.json` | `npm run deploy:edgeone -- -n my-site` |
|
|
40
|
+
| Vercel | `vercel.json` | `npm run deploy:vercel` |
|
|
41
|
+
| Netlify | `netlify.toml` | `npm run deploy:netlify` |
|
|
42
|
+
| 阿里云 ESA Pages | `esa.jsonc` | `npm run deploy:esa -- --name my-site` |
|
|
43
|
+
|
|
44
|
+
构建命令统一为 `npm run build`,输出目录统一为 `dist`。平台账号与域名授权仍需由运营者完成。GitHub 手动部署工作流也可选择平台;Netlify 使用仓库 Secret `NETLIFY_AUTH_TOKEN` 和 `NETLIFY_SITE_ID`。
|
|
45
|
+
|
|
46
|
+
## 可选服务、隐私与缓存
|
|
47
|
+
|
|
48
|
+
在 `config.yml` 的 `plugins.consent.services` 逐项注册服务,填写服务名、真实 HTTPS 地址、用途、数据类别、接收者、保留期限与隐私链接,覆盖全部启用语言。授权列表直接显示服务名,不使用预设分类或分类标签。访客同意后,服务仍按页面需要或访客操作调用;更换服务地址会使旧授权失效。
|
|
49
|
+
|
|
50
|
+
评论使用独立的 [我提问](https://github.com/jsw-teams/iask/blob/main/docs/zh-CN.md),网站只提供通用服务插槽。首页不放评论插槽;需要讨论的页面可增加 `type: service` 和 `integration: github-comments`。文章由构建器生成讨论上下文。服务端密钥只存放在独立服务平台。
|
|
51
|
+
|
|
52
|
+
接口使用固定 URL 和 HTTP 请求头传递操作与上下文。CSS、JavaScript 及依赖使用内容哈希名称,缓存一年;HTML 和未版本化元数据保持可更新。ESA 需在控制台配置对应缓存规则。布局支持响应式、键盘操作、可见焦点、语义结构和多语言,新增内容仍需填写有意义的图片替代文本。
|
|
53
|
+
|
|
54
|
+
## 看看生成的网站
|
|
55
|
+
|
|
56
|
+

|
|
57
|
+
|
|
58
|
+
示例展示由写文建站生成的实际页面。网站使用静态封面搭配按需加载 MP4,提供观看、暂停、定位和重播;GIF 用于项目文档,见[演示配置](product-demos.md)。
|
|
59
|
+
|
|
60
|
+
## 项目演示与图标
|
|
61
|
+
|
|
62
|
+
演示通过 `edgepress new post '海边的下午'` 新建文章,在代码编辑器修改后运行 `edgepress server`,从首页点击进入文章。录制工作台位于 `tools/recordings/demo-workbench.mjs`,临时录制内容放在忽略的 `tools/.recordings/`。网站演示由访客手动播放,支持拖动进度和键盘操作,保留暂停位置。导航与页面图标使用本地打包的 Lucide 1.52,并保留许可证。
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "../../../schemas/pages.schema.json",
|
|
3
|
+
"title": "Static deployment and optional services",
|
|
4
|
+
"lang": "en",
|
|
5
|
+
"slug": "deployment",
|
|
6
|
+
"description": "Deploy static output on Cloudflare, Vercel, EdgeOne Pages or ESA Pages and register optional external services through consent.",
|
|
7
|
+
"blocks": [
|
|
8
|
+
{
|
|
9
|
+
"columns": 1,
|
|
10
|
+
"cells": [
|
|
11
|
+
[
|
|
12
|
+
{
|
|
13
|
+
"type": "hero",
|
|
14
|
+
"eyebrow": "Deployment",
|
|
15
|
+
"title": "Publish the same static site on five platforms.",
|
|
16
|
+
"text": "Build with npm run build. Every platform serves dist/. Page rendering, search and local JavaScript work without a website backend."
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"type": "text",
|
|
20
|
+
"heading": "Platform configuration",
|
|
21
|
+
"paragraphs": [
|
|
22
|
+
"Cloudflare reads wrangler.jsonc and serves static assets without a Worker script. Vercel reads vercel.json. Tencent EdgeOne Pages reads edgeone.json. Alibaba Cloud ESA Pages reads esa.jsonc.",
|
|
23
|
+
"Vercel and EdgeOne support repository deployment buttons. ESA uses repository import or the native deployment CLI. Authenticate in your chosen platform and run one deployment command locally. GitHub Actions runs dependency security audits only."
|
|
24
|
+
]
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"type": "code",
|
|
28
|
+
"title": "Choose a deployment platform",
|
|
29
|
+
"language": "sh",
|
|
30
|
+
"code": "npm run deploy:cloudflare\nnpm run deploy:vercel\nnpm run deploy:netlify\nnpm run deploy:edgeone -- -n my-site\nnpm run deploy:esa -- --name my-site\n"
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"type": "text",
|
|
34
|
+
"heading": "Optional APIs and widgets",
|
|
35
|
+
"paragraphs": [
|
|
36
|
+
"Register external services in config.yml under plugins.consent.services. Use external-api with backendUrl for visitor-triggered API calls, or external-widget with backendUrl and a same-service moduleUrl exporting mount for an isolated interface.",
|
|
37
|
+
"Each service needs a unique ID, name, purpose, dataCategories, recipient, retention and HTTPS privacyUrl. Localized disclosure maps must cover every enabled site language. Do not put operator secrets in browser configuration.",
|
|
38
|
+
"Enable the group only after setting real service URLs and the privacy controller. The browser imports no service module and makes no API call before explicit per-service consent. Endpoint changes invalidate previous consent."
|
|
39
|
+
]
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"type": "code",
|
|
43
|
+
"title": "Call a registered API from a theme asset",
|
|
44
|
+
"language": "js",
|
|
45
|
+
"code": "import {callService} from '/edgepress/services.js';\n// Run this in response to the visitor's action after consent.\nconst response = await callService('lookup', 'query', {headers: {'X-Service-Context': 'example'}});\n"
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"type": "text",
|
|
49
|
+
"heading": "Comment service ownership",
|
|
50
|
+
"text": "iask owns its entire interface, translations, styles, authentication, uploads, storage and API. The website supplies only a generic service slot and published content context. Its deployment and credentials are managed separately."
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"type": "link-list",
|
|
54
|
+
"title": "iask integration",
|
|
55
|
+
"items": [
|
|
56
|
+
{
|
|
57
|
+
"label": "Independent service setup",
|
|
58
|
+
"url": "https://github.com/jsw-teams/iask/blob/main/docs/edgepress.md"
|
|
59
|
+
}
|
|
60
|
+
]
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"type": "text",
|
|
64
|
+
"heading": "Cache policy",
|
|
65
|
+
"paragraphs": [
|
|
66
|
+
"CSS and JavaScript names include a content hash, including local module dependencies. Cloudflare, Vercel and EdgeOne cache these immutable URLs for one year. HTML and unversioned metadata revalidate so a rebuild can publish new references immediately.",
|
|
67
|
+
"ESA serves the same hashed assets. Configure its browser and edge cache rules for CSS and JS to one year, while leaving HTML and unversioned JSON short-lived. esa.jsonc configures the build and asset directory; it has no documented equivalent of Vercel custom headers."
|
|
68
|
+
]
|
|
69
|
+
}
|
|
70
|
+
]
|
|
71
|
+
]
|
|
72
|
+
}
|
|
73
|
+
]
|
|
74
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "../../../schemas/pages.schema.json",
|
|
3
|
+
"title": "静态部署与可选服务",
|
|
4
|
+
"lang": "zh-CN",
|
|
5
|
+
"slug": "deployment",
|
|
6
|
+
"description": "将同一份静态产物部署到 Cloudflare、Vercel、Netlify、腾讯 EdgeOne Pages 或阿里云 ESA Pages,外部服务由 consent 注册并按需调用。",
|
|
7
|
+
"blocks": [
|
|
8
|
+
{
|
|
9
|
+
"columns": 1,
|
|
10
|
+
"cells": [
|
|
11
|
+
[
|
|
12
|
+
{
|
|
13
|
+
"type": "hero",
|
|
14
|
+
"eyebrow": "部署指南",
|
|
15
|
+
"title": "同一份静态网站,部署到五个平台。",
|
|
16
|
+
"text": "npm run build 生成 dist/。页面、搜索及本地 JavaScript 动态交互不依赖网站后端。"
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"type": "text",
|
|
20
|
+
"heading": "平台入口",
|
|
21
|
+
"paragraphs": [
|
|
22
|
+
"Cloudflare 使用 wrangler.jsonc 的纯静态资源托管;Vercel 使用 vercel.json;腾讯 EdgeOne Pages 使用 edgeone.json;阿里云 ESA Pages 使用 esa.jsonc。构建命令均为 npm run build,输出目录均为 dist。",
|
|
23
|
+
"Vercel 和 EdgeOne 支持仓库部署按钮。ESA 使用仓库导入或官方 CLI;配置平台账号后执行一条部署命令。也可配置仓库 Secrets 后运行手动部署工作流。"
|
|
24
|
+
]
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"type": "code",
|
|
28
|
+
"title": "选择部署平台",
|
|
29
|
+
"language": "sh",
|
|
30
|
+
"code": "npm run deploy:cloudflare\nnpm run deploy:vercel\nnpm run deploy:netlify\nnpm run deploy:edgeone -- -n my-site\nnpm run deploy:esa -- --name my-site\n"
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"type": "text",
|
|
34
|
+
"heading": "按访客需求调用外部服务",
|
|
35
|
+
"paragraphs": [
|
|
36
|
+
"在 config.yml 的 plugins.consent.services 注册服务。external-api 使用 backendUrl;external-widget 使用 backendUrl 和同服务来源的 moduleUrl,模块导出 mount 函数。",
|
|
37
|
+
"每项服务填写唯一 ID、名称、用途、数据类别、接收者、保留期限与 HTTPS 隐私链接。多语言说明须覆盖全部已启用语言。先填写真实地址和隐私责任人,再启用服务。",
|
|
38
|
+
"访客明确选择前不加载外部模块或调用 API。接口在访客操作时调用,单纯给予 consent 不会主动请求 API。地址变更使已保存的 consent 失效。Secret 只放在独立后端的平台设置中。"
|
|
39
|
+
]
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"type": "code",
|
|
43
|
+
"title": "从主题源码调用已注册 API",
|
|
44
|
+
"language": "js",
|
|
45
|
+
"code": "import {callService} from '/edgepress/services.js';\nconst response = await callService('lookup', 'query', {headers: {'X-Service-Context': 'example'}});\n"
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"type": "text",
|
|
49
|
+
"heading": "评论由独立项目负责",
|
|
50
|
+
"text": "iask 全权负责评论前端、翻译、样式、登录、附件、存储及 API。网站只提供通用服务插槽和已发布内容上下文。"
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"type": "link-list",
|
|
54
|
+
"title": "独立服务接入",
|
|
55
|
+
"items": [
|
|
56
|
+
{
|
|
57
|
+
"label": "iask 部署与接入",
|
|
58
|
+
"url": "https://github.com/jsw-teams/iask/blob/main/docs/edgepress.md"
|
|
59
|
+
}
|
|
60
|
+
]
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"type": "text",
|
|
64
|
+
"heading": "控制缓存成本",
|
|
65
|
+
"paragraphs": [
|
|
66
|
+
"CSS、JS 与本地模块依赖使用内容哈希命名,Cloudflare、Vercel、Netlify 和 EdgeOne 缓存一年。HTML 及未带哈希的元数据重新验证,构建更新会发布新的资源地址。",
|
|
67
|
+
"ESA 继续使用同一份哈希资源,并在控制台配置 CSS、JS 的浏览器及边缘缓存一年,HTML 和未版本化 JSON 短缓存。esa.jsonc 配置构建和静态目录,官方未文档化与 Vercel headers 对应的配置字段。"
|
|
68
|
+
]
|
|
69
|
+
}
|
|
70
|
+
]
|
|
71
|
+
]
|
|
72
|
+
}
|
|
73
|
+
]
|
|
74
|
+
}
|