gazetta 0.6.0 → 0.7.0
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/admin-dist/assets/index-BO9-CXmW.css +1 -0
- package/admin-dist/assets/index-Ufu8zZH_.js +668 -0
- package/admin-dist/index.html +2 -2
- package/dist/admin-api/error-response.d.ts +21 -0
- package/dist/admin-api/error-response.d.ts.map +1 -0
- package/dist/admin-api/error-response.js +12 -0
- package/dist/admin-api/error-response.js.map +1 -0
- package/dist/admin-api/index.d.ts +0 -2
- package/dist/admin-api/index.d.ts.map +1 -1
- package/dist/admin-api/index.js +4 -24
- package/dist/admin-api/index.js.map +1 -1
- package/dist/admin-api/routes/assets.d.ts +16 -0
- package/dist/admin-api/routes/assets.d.ts.map +1 -0
- package/dist/admin-api/routes/assets.js +433 -0
- package/dist/admin-api/routes/assets.js.map +1 -0
- package/dist/admin-api/routes/fragments.d.ts.map +1 -1
- package/dist/admin-api/routes/fragments.js +30 -4
- package/dist/admin-api/routes/fragments.js.map +1 -1
- package/dist/admin-api/routes/pages.d.ts.map +1 -1
- package/dist/admin-api/routes/pages.js +37 -4
- package/dist/admin-api/routes/pages.js.map +1 -1
- package/dist/admin-api/routes/publish.d.ts.map +1 -1
- package/dist/admin-api/routes/publish.js +68 -35
- package/dist/admin-api/routes/publish.js.map +1 -1
- package/dist/admin-api/schemas/assets.d.ts +48 -0
- package/dist/admin-api/schemas/assets.d.ts.map +1 -0
- package/dist/admin-api/schemas/assets.js +44 -0
- package/dist/admin-api/schemas/assets.js.map +1 -0
- package/dist/admin-api/schemas/index.d.ts +2 -0
- package/dist/admin-api/schemas/index.d.ts.map +1 -1
- package/dist/admin-api/schemas/index.js +2 -0
- package/dist/admin-api/schemas/index.js.map +1 -1
- package/dist/admin-api/source-context.d.ts +0 -7
- package/dist/admin-api/source-context.d.ts.map +1 -1
- package/dist/admin-api/source-context.js +0 -3
- package/dist/admin-api/source-context.js.map +1 -1
- package/dist/assets/analyze-audio.d.ts +3 -0
- package/dist/assets/analyze-audio.d.ts.map +1 -0
- package/dist/assets/analyze-audio.js +80 -0
- package/dist/assets/analyze-audio.js.map +1 -0
- package/dist/assets/analyze-image.d.ts +19 -0
- package/dist/assets/analyze-image.d.ts.map +1 -0
- package/dist/assets/analyze-image.js +123 -0
- package/dist/assets/analyze-image.js.map +1 -0
- package/dist/assets/analyze.d.ts +94 -0
- package/dist/assets/analyze.d.ts.map +1 -0
- package/dist/assets/analyze.js +45 -0
- package/dist/assets/analyze.js.map +1 -0
- package/dist/assets/asset-deps.d.ts +30 -0
- package/dist/assets/asset-deps.d.ts.map +1 -0
- package/dist/assets/asset-deps.js +42 -0
- package/dist/assets/asset-deps.js.map +1 -0
- package/dist/assets/asset-paths.d.ts +155 -0
- package/dist/assets/asset-paths.d.ts.map +1 -0
- package/dist/assets/asset-paths.js +197 -0
- package/dist/assets/asset-paths.js.map +1 -0
- package/dist/assets/delete.d.ts +75 -0
- package/dist/assets/delete.d.ts.map +1 -0
- package/dist/assets/delete.js +82 -0
- package/dist/assets/delete.js.map +1 -0
- package/dist/assets/errors.d.ts +241 -0
- package/dist/assets/errors.d.ts.map +1 -0
- package/dist/assets/errors.js +300 -0
- package/dist/assets/errors.js.map +1 -0
- package/dist/assets/find-refs.d.ts +37 -0
- package/dist/assets/find-refs.d.ts.map +1 -0
- package/dist/assets/find-refs.js +35 -0
- package/dist/assets/find-refs.js.map +1 -0
- package/dist/assets/hash.d.ts +13 -0
- package/dist/assets/hash.d.ts.map +1 -0
- package/dist/assets/hash.js +43 -0
- package/dist/assets/hash.js.map +1 -0
- package/dist/assets/image-metadata.d.ts +11 -0
- package/dist/assets/image-metadata.d.ts.map +1 -0
- package/dist/assets/image-metadata.js +31 -0
- package/dist/assets/image-metadata.js.map +1 -0
- package/dist/assets/ingest-locale.d.ts +86 -0
- package/dist/assets/ingest-locale.d.ts.map +1 -0
- package/dist/assets/ingest-locale.js +209 -0
- package/dist/assets/ingest-locale.js.map +1 -0
- package/dist/assets/ingest.d.ts +96 -0
- package/dist/assets/ingest.d.ts.map +1 -0
- package/dist/assets/ingest.js +308 -0
- package/dist/assets/ingest.js.map +1 -0
- package/dist/assets/kind-compat.d.ts +34 -0
- package/dist/assets/kind-compat.d.ts.map +1 -0
- package/dist/assets/kind-compat.js +33 -0
- package/dist/assets/kind-compat.js.map +1 -0
- package/dist/assets/list.d.ts +46 -0
- package/dist/assets/list.d.ts.map +1 -0
- package/dist/assets/list.js +102 -0
- package/dist/assets/list.js.map +1 -0
- package/dist/assets/manifest-default.d.ts +56 -0
- package/dist/assets/manifest-default.d.ts.map +1 -0
- package/dist/assets/manifest-default.js +120 -0
- package/dist/assets/manifest-default.js.map +1 -0
- package/dist/assets/manifest-filename.d.ts +52 -0
- package/dist/assets/manifest-filename.d.ts.map +1 -0
- package/dist/assets/manifest-filename.js +104 -0
- package/dist/assets/manifest-filename.js.map +1 -0
- package/dist/assets/manifest-locale.d.ts +60 -0
- package/dist/assets/manifest-locale.d.ts.map +1 -0
- package/dist/assets/manifest-locale.js +206 -0
- package/dist/assets/manifest-locale.js.map +1 -0
- package/dist/assets/manifest-merge.d.ts +66 -0
- package/dist/assets/manifest-merge.d.ts.map +1 -0
- package/dist/assets/manifest-merge.js +82 -0
- package/dist/assets/manifest-merge.js.map +1 -0
- package/dist/assets/manifest.d.ts +83 -0
- package/dist/assets/manifest.d.ts.map +1 -0
- package/dist/assets/manifest.js +93 -0
- package/dist/assets/manifest.js.map +1 -0
- package/dist/assets/mime-sniff.d.ts +18 -0
- package/dist/assets/mime-sniff.d.ts.map +1 -0
- package/dist/assets/mime-sniff.js +84 -0
- package/dist/assets/mime-sniff.js.map +1 -0
- package/dist/assets/preprocess-svg.d.ts +3 -0
- package/dist/assets/preprocess-svg.d.ts.map +1 -0
- package/dist/assets/preprocess-svg.js +49 -0
- package/dist/assets/preprocess-svg.js.map +1 -0
- package/dist/assets/preprocess.d.ts +62 -0
- package/dist/assets/preprocess.d.ts.map +1 -0
- package/dist/assets/preprocess.js +86 -0
- package/dist/assets/preprocess.js.map +1 -0
- package/dist/assets/publish-plan.d.ts +41 -0
- package/dist/assets/publish-plan.d.ts.map +1 -0
- package/dist/assets/publish-plan.js +49 -0
- package/dist/assets/publish-plan.js.map +1 -0
- package/dist/assets/publish.d.ts +33 -0
- package/dist/assets/publish.d.ts.map +1 -0
- package/dist/assets/publish.js +81 -0
- package/dist/assets/publish.js.map +1 -0
- package/dist/assets/refs.d.ts +37 -0
- package/dist/assets/refs.d.ts.map +1 -0
- package/dist/assets/refs.js +33 -0
- package/dist/assets/refs.js.map +1 -0
- package/dist/assets/remove-override.d.ts +42 -0
- package/dist/assets/remove-override.d.ts.map +1 -0
- package/dist/assets/remove-override.js +53 -0
- package/dist/assets/remove-override.js.map +1 -0
- package/dist/assets/rename.d.ts +43 -0
- package/dist/assets/rename.d.ts.map +1 -0
- package/dist/assets/rename.js +271 -0
- package/dist/assets/rename.js.map +1 -0
- package/dist/assets/replace.d.ts +37 -0
- package/dist/assets/replace.d.ts.map +1 -0
- package/dist/assets/replace.js +195 -0
- package/dist/assets/replace.js.map +1 -0
- package/dist/assets/resolve.d.ts +141 -0
- package/dist/assets/resolve.d.ts.map +1 -0
- package/dist/assets/resolve.js +381 -0
- package/dist/assets/resolve.js.map +1 -0
- package/dist/assets/rewrite-manifest-asset-ref.d.ts +44 -0
- package/dist/assets/rewrite-manifest-asset-ref.d.ts.map +1 -0
- package/dist/assets/rewrite-manifest-asset-ref.js +51 -0
- package/dist/assets/rewrite-manifest-asset-ref.js.map +1 -0
- package/dist/assets/scan-manifest-for-asset.d.ts +63 -0
- package/dist/assets/scan-manifest-for-asset.d.ts.map +1 -0
- package/dist/assets/scan-manifest-for-asset.js +105 -0
- package/dist/assets/scan-manifest-for-asset.js.map +1 -0
- package/dist/assets/serve-route.d.ts +45 -0
- package/dist/assets/serve-route.d.ts.map +1 -0
- package/dist/assets/serve-route.js +123 -0
- package/dist/assets/serve-route.js.map +1 -0
- package/dist/assets/svg-sanitize.d.ts +38 -0
- package/dist/assets/svg-sanitize.d.ts.map +1 -0
- package/dist/assets/svg-sanitize.js +209 -0
- package/dist/assets/svg-sanitize.js.map +1 -0
- package/dist/assets/update-metadata.d.ts +61 -0
- package/dist/assets/update-metadata.d.ts.map +1 -0
- package/dist/assets/update-metadata.js +82 -0
- package/dist/assets/update-metadata.js.map +1 -0
- package/dist/assets/url.d.ts +82 -0
- package/dist/assets/url.d.ts.map +1 -0
- package/dist/assets/url.js +103 -0
- package/dist/assets/url.js.map +1 -0
- package/dist/assets/validate.d.ts +74 -0
- package/dist/assets/validate.d.ts.map +1 -0
- package/dist/assets/validate.js +136 -0
- package/dist/assets/validate.js.map +1 -0
- package/dist/assets/variants.d.ts +23 -0
- package/dist/assets/variants.d.ts.map +1 -0
- package/dist/assets/variants.js +74 -0
- package/dist/assets/variants.js.map +1 -0
- package/dist/cli/assets-cli.d.ts +58 -0
- package/dist/cli/assets-cli.d.ts.map +1 -0
- package/dist/cli/assets-cli.js +233 -0
- package/dist/cli/assets-cli.js.map +1 -0
- package/dist/cli/assets-display.d.ts +112 -0
- package/dist/cli/assets-display.d.ts.map +1 -0
- package/dist/cli/assets-display.js +106 -0
- package/dist/cli/assets-display.js.map +1 -0
- package/dist/cli/bootstrap.d.ts +0 -2
- package/dist/cli/bootstrap.d.ts.map +1 -1
- package/dist/cli/bootstrap.js +0 -1
- package/dist/cli/bootstrap.js.map +1 -1
- package/dist/cli/index.js +64 -18
- package/dist/cli/index.js.map +1 -1
- package/dist/compare.d.ts.map +1 -1
- package/dist/compare.js +15 -12
- package/dist/compare.js.map +1 -1
- package/dist/dep-sidecars.d.ts +127 -0
- package/dist/dep-sidecars.d.ts.map +1 -0
- package/dist/dep-sidecars.js +122 -0
- package/dist/dep-sidecars.js.map +1 -0
- package/dist/editor/AssetEmbeddedWidget.d.ts +3 -0
- package/dist/editor/AssetEmbeddedWidget.d.ts.map +1 -0
- package/dist/editor/AssetEmbeddedWidget.js +146 -0
- package/dist/editor/AssetEmbeddedWidget.js.map +1 -0
- package/dist/editor/mount.d.ts +12 -1
- package/dist/editor/mount.d.ts.map +1 -1
- package/dist/editor/mount.js +36 -5
- package/dist/editor/mount.js.map +1 -1
- package/dist/format.d.ts +44 -0
- package/dist/format.d.ts.map +1 -0
- package/dist/format.js +65 -0
- package/dist/format.js.map +1 -0
- package/dist/fragment-deps.d.ts +24 -0
- package/dist/fragment-deps.d.ts.map +1 -0
- package/dist/fragment-deps.js +20 -0
- package/dist/fragment-deps.js.map +1 -0
- package/dist/hash.d.ts +0 -6
- package/dist/hash.d.ts.map +1 -1
- package/dist/hash.js +0 -18
- package/dist/hash.js.map +1 -1
- package/dist/history-provider.d.ts.map +1 -1
- package/dist/history-provider.js +30 -8
- package/dist/history-provider.js.map +1 -1
- package/dist/history-recorder.d.ts +7 -3
- package/dist/history-recorder.d.ts.map +1 -1
- package/dist/history-recorder.js +9 -1
- package/dist/history-recorder.js.map +1 -1
- package/dist/history-restorer.d.ts.map +1 -1
- package/dist/history-restorer.js +34 -2
- package/dist/history-restorer.js.map +1 -1
- package/dist/history.d.ts +26 -8
- package/dist/history.d.ts.map +1 -1
- package/dist/index.d.ts +2 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -2
- package/dist/index.js.map +1 -1
- package/dist/locale.d.ts +20 -0
- package/dist/locale.d.ts.map +1 -1
- package/dist/locale.js +38 -0
- package/dist/locale.js.map +1 -1
- package/dist/providers/_atomic-write.d.ts +9 -0
- package/dist/providers/_atomic-write.d.ts.map +1 -0
- package/dist/providers/_atomic-write.js +72 -0
- package/dist/providers/_atomic-write.js.map +1 -0
- package/dist/providers/_rm-ignore-missing.d.ts +31 -0
- package/dist/providers/_rm-ignore-missing.d.ts.map +1 -0
- package/dist/providers/_rm-ignore-missing.js +12 -0
- package/dist/providers/_rm-ignore-missing.js.map +1 -0
- package/dist/providers/_stream-interop.d.ts +23 -0
- package/dist/providers/_stream-interop.d.ts.map +1 -0
- package/dist/providers/_stream-interop.js +21 -0
- package/dist/providers/_stream-interop.js.map +1 -0
- package/dist/providers/azure-blob.d.ts.map +1 -1
- package/dist/providers/azure-blob.js +60 -0
- package/dist/providers/azure-blob.js.map +1 -1
- package/dist/providers/filesystem.d.ts +4 -0
- package/dist/providers/filesystem.d.ts.map +1 -1
- package/dist/providers/filesystem.js +63 -2
- package/dist/providers/filesystem.js.map +1 -1
- package/dist/providers/s3.d.ts.map +1 -1
- package/dist/providers/s3.js +84 -1
- package/dist/providers/s3.js.map +1 -1
- package/dist/publish-rendered.d.ts +37 -17
- package/dist/publish-rendered.d.ts.map +1 -1
- package/dist/publish-rendered.js +71 -67
- package/dist/publish-rendered.js.map +1 -1
- package/dist/publish.d.ts +13 -12
- package/dist/publish.d.ts.map +1 -1
- package/dist/publish.js +23 -47
- package/dist/publish.js.map +1 -1
- package/dist/resolver.d.ts +12 -2
- package/dist/resolver.d.ts.map +1 -1
- package/dist/resolver.js +54 -9
- package/dist/resolver.js.map +1 -1
- package/dist/schema/dimensions.d.ts +78 -0
- package/dist/schema/dimensions.d.ts.map +1 -0
- package/dist/schema/dimensions.js +97 -0
- package/dist/schema/dimensions.js.map +1 -0
- package/dist/schema/helpers.d.ts +108 -0
- package/dist/schema/helpers.d.ts.map +1 -0
- package/dist/schema/helpers.js +133 -0
- package/dist/schema/helpers.js.map +1 -0
- package/dist/schema/index.d.ts +27 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +25 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/types.d.ts +390 -0
- package/dist/schema/types.d.ts.map +1 -0
- package/dist/schema/types.js +25 -0
- package/dist/schema/types.js.map +1 -0
- package/dist/selector-chain.d.ts +63 -0
- package/dist/selector-chain.d.ts.map +1 -0
- package/dist/selector-chain.js +58 -0
- package/dist/selector-chain.js.map +1 -0
- package/dist/sidecars.d.ts +19 -18
- package/dist/sidecars.d.ts.map +1 -1
- package/dist/sidecars.js +70 -62
- package/dist/sidecars.js.map +1 -1
- package/dist/targets.d.ts.map +1 -1
- package/dist/targets.js +15 -37
- package/dist/targets.js.map +1 -1
- package/dist/themes.d.ts +69 -0
- package/dist/themes.d.ts.map +1 -0
- package/dist/themes.js +85 -0
- package/dist/themes.js.map +1 -0
- package/dist/transforms/adapter.d.ts +115 -0
- package/dist/transforms/adapter.d.ts.map +1 -0
- package/dist/transforms/adapter.js +2 -0
- package/dist/transforms/adapter.js.map +1 -0
- package/dist/transforms/cloudflare.d.ts +17 -0
- package/dist/transforms/cloudflare.d.ts.map +1 -0
- package/dist/transforms/cloudflare.js +110 -0
- package/dist/transforms/cloudflare.js.map +1 -0
- package/dist/transforms/index.d.ts +24 -0
- package/dist/transforms/index.d.ts.map +1 -0
- package/dist/transforms/index.js +30 -0
- package/dist/transforms/index.js.map +1 -0
- package/dist/transforms/sharp.d.ts +3 -0
- package/dist/transforms/sharp.d.ts.map +1 -0
- package/dist/transforms/sharp.js +43 -0
- package/dist/transforms/sharp.js.map +1 -0
- package/dist/types.d.ts +125 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +20 -1
- package/admin-dist/assets/index-B6pVot0Y.css +0 -1
- package/admin-dist/assets/index-DniLwxJA.js +0 -609
- package/dist/providers/r2.d.ts +0 -8
- package/dist/providers/r2.d.ts.map +0 -1
- package/dist/providers/r2.js +0 -86
- package/dist/providers/r2.js.map +0 -1
- package/dist/source-sidecars.d.ts +0 -32
- package/dist/source-sidecars.d.ts.map +0 -1
- package/dist/source-sidecars.js +0 -98
- package/dist/source-sidecars.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/transforms/adapter.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { TransformAdapter } from './adapter.js';
|
|
2
|
+
export interface CloudflareAdapterOptions {
|
|
3
|
+
/**
|
|
4
|
+
* The zone (hostname) where `/cdn-cgi/image/` is served. Typically
|
|
5
|
+
* the same hostname as `siteUrl`. Required — without it we can't
|
|
6
|
+
* compose a CDN URL.
|
|
7
|
+
*/
|
|
8
|
+
zone: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Build a Cloudflare-Images-flavored TransformAdapter for the given zone.
|
|
12
|
+
* Factory function (not a singleton) because the zone is per-target —
|
|
13
|
+
* sites with multiple Cloudflare zones get one adapter instance per
|
|
14
|
+
* configured target.
|
|
15
|
+
*/
|
|
16
|
+
export declare function createCloudflareAdapter(opts: CloudflareAdapterOptions): TransformAdapter;
|
|
17
|
+
//# sourceMappingURL=cloudflare.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloudflare.d.ts","sourceRoot":"","sources":["../../src/transforms/cloudflare.ts"],"names":[],"mappings":"AAuCA,OAAO,KAAK,EAA8B,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAYhF,MAAM,WAAW,wBAAwB;IACvC;;;;OAIG;IACH,IAAI,EAAE,MAAM,CAAA;CACb;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,wBAAwB,GAAG,gBAAgB,CAgCxF"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cloudflare Images transform adapter.
|
|
3
|
+
*
|
|
4
|
+
* Routes URLs through Cloudflare's `/cdn-cgi/image/` endpoint at the
|
|
5
|
+
* configured zone. Cloudflare fetches the origin URL (the asset bytes
|
|
6
|
+
* served from the target's storage), applies the requested transforms
|
|
7
|
+
* (resize, format conversion, quality), and returns the transformed
|
|
8
|
+
* bytes to the browser.
|
|
9
|
+
*
|
|
10
|
+
* URL shape:
|
|
11
|
+
* https://{zone}/cdn-cgi/image/{params}/{originUrl}
|
|
12
|
+
*
|
|
13
|
+
* Where params is a comma-separated list (e.g. `format=auto,width=800`).
|
|
14
|
+
* For the primary URL we use `format=auto` only — Cloudflare picks the
|
|
15
|
+
* best supported format (AVIF, WebP, JPEG) per the browser's Accept
|
|
16
|
+
* header. For srcset entries we add `width={W}` per ladder rung.
|
|
17
|
+
*
|
|
18
|
+
* # Why a fixed ladder
|
|
19
|
+
*
|
|
20
|
+
* Sharp generates 400/800/1200/1600 widths at upload. Cloudflare can
|
|
21
|
+
* generate any width on the fly, but srcset still needs a concrete
|
|
22
|
+
* ladder for the browser to pick from. We use the same widths as the
|
|
23
|
+
* sharp adapter — consistent visual delivery between targets that
|
|
24
|
+
* happen to use different adapters.
|
|
25
|
+
*
|
|
26
|
+
* # Why `Vary: Accept`
|
|
27
|
+
*
|
|
28
|
+
* `format=auto` returns AVIF or WebP per browser support. Caches MUST
|
|
29
|
+
* vary on `Accept` to avoid serving an AVIF response to a WebP-only
|
|
30
|
+
* browser. The cache policy carries that header.
|
|
31
|
+
*
|
|
32
|
+
* # What this adapter ignores
|
|
33
|
+
*
|
|
34
|
+
* `input.variants` — Cloudflare generates widths on demand; the
|
|
35
|
+
* pre-generated ladder is irrelevant. Sites that use Cloudflare can
|
|
36
|
+
* still upload variants (they cost nothing on egress, just a tiny bit
|
|
37
|
+
* of storage), but the URLs the browser receives won't reference them.
|
|
38
|
+
*/
|
|
39
|
+
import { buildAssetUrl } from '../assets/url.js';
|
|
40
|
+
/** Widths the srcset ladder generates. Same as sharp's `VARIANT_WIDTHS`. */
|
|
41
|
+
const LADDER_WIDTHS = [400, 800, 1200, 1600];
|
|
42
|
+
const CDN_CACHE_POLICY = {
|
|
43
|
+
cacheControl: 'public, max-age=31536000, immutable',
|
|
44
|
+
// Cloudflare's `format=auto` returns different bytes per Accept header;
|
|
45
|
+
// caches must vary or they'll serve AVIF to WebP-only clients.
|
|
46
|
+
vary: 'Accept',
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Build a Cloudflare-Images-flavored TransformAdapter for the given zone.
|
|
50
|
+
* Factory function (not a singleton) because the zone is per-target —
|
|
51
|
+
* sites with multiple Cloudflare zones get one adapter instance per
|
|
52
|
+
* configured target.
|
|
53
|
+
*/
|
|
54
|
+
export function createCloudflareAdapter(opts) {
|
|
55
|
+
if (!opts.zone || typeof opts.zone !== 'string') {
|
|
56
|
+
throw new Error('cloudflareAdapter requires a `zone` (e.g. "cdn.example.com")');
|
|
57
|
+
}
|
|
58
|
+
const zone = opts.zone.replace(/^https?:\/\//, '').replace(/\/+$/, '');
|
|
59
|
+
return {
|
|
60
|
+
name: 'cloudflare',
|
|
61
|
+
primaryUrl(input) {
|
|
62
|
+
const origin = absoluteOriginUrl(input);
|
|
63
|
+
// Primary URL uses format=auto only — no width; the browser gets
|
|
64
|
+
// the source-resolution version (within Cloudflare's max).
|
|
65
|
+
return `https://${zone}/cdn-cgi/image/format=auto/${origin}`;
|
|
66
|
+
},
|
|
67
|
+
srcset(input) {
|
|
68
|
+
// No srcset for non-images — same skip rule as sharp adapter.
|
|
69
|
+
// We detect by extension; future kinds can refine this.
|
|
70
|
+
if (!isImageExt(input.ext))
|
|
71
|
+
return null;
|
|
72
|
+
// Skip widths larger than the source image (no point upscaling).
|
|
73
|
+
const sourceWidth = input.width ?? Infinity;
|
|
74
|
+
const widths = LADDER_WIDTHS.filter(w => w <= sourceWidth);
|
|
75
|
+
if (widths.length === 0)
|
|
76
|
+
return null;
|
|
77
|
+
const origin = absoluteOriginUrl(input);
|
|
78
|
+
return widths.map(w => `https://${zone}/cdn-cgi/image/format=auto,width=${w}/${origin} ${w}w`).join(', ');
|
|
79
|
+
},
|
|
80
|
+
cachePolicy(_input) {
|
|
81
|
+
return CDN_CACHE_POLICY;
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Compose the absolute origin URL for the asset bytes — the URL
|
|
87
|
+
* Cloudflare fetches from. Always absolute because Cloudflare's
|
|
88
|
+
* `/cdn-cgi/image/` endpoint requires it. When `siteUrl` isn't set
|
|
89
|
+
* the adapter can't function — origin URLs need to be reachable
|
|
90
|
+
* from Cloudflare's edge.
|
|
91
|
+
*/
|
|
92
|
+
function absoluteOriginUrl(input) {
|
|
93
|
+
if (!input.siteUrl) {
|
|
94
|
+
throw new Error(`cloudflareAdapter requires siteUrl on the resolve context — Cloudflare needs an absolute origin URL to fetch.`);
|
|
95
|
+
}
|
|
96
|
+
// Use buildAssetUrl for path composition (handles selector suffix);
|
|
97
|
+
// it returns the full URL when siteUrl is set.
|
|
98
|
+
return buildAssetUrl({
|
|
99
|
+
name: input.name,
|
|
100
|
+
hash: input.hash,
|
|
101
|
+
ext: input.ext,
|
|
102
|
+
siteUrl: input.siteUrl,
|
|
103
|
+
selector: input.selector,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
/** Whether the extension is one Cloudflare can transform. */
|
|
107
|
+
function isImageExt(ext) {
|
|
108
|
+
return ext === 'jpg' || ext === 'jpeg' || ext === 'png' || ext === 'webp' || ext === 'avif' || ext === 'gif';
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=cloudflare.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloudflare.js","sourceRoot":"","sources":["../../src/transforms/cloudflare.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAGhD,4EAA4E;AAC5E,MAAM,aAAa,GAAsB,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;AAE/D,MAAM,gBAAgB,GAAgB;IACpC,YAAY,EAAE,qCAAqC;IACnD,wEAAwE;IACxE,+DAA+D;IAC/D,IAAI,EAAE,QAAQ;CACf,CAAA;AAWD;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAA8B;IACpE,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAA;IACjF,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;IAEtE,OAAO;QACL,IAAI,EAAE,YAAY;QAElB,UAAU,CAAC,KAAoB;YAC7B,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAA;YACvC,iEAAiE;YACjE,2DAA2D;YAC3D,OAAO,WAAW,IAAI,8BAA8B,MAAM,EAAE,CAAA;QAC9D,CAAC;QAED,MAAM,CAAC,KAAoB;YACzB,8DAA8D;YAC9D,wDAAwD;YACxD,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC;gBAAE,OAAO,IAAI,CAAA;YACvC,iEAAiE;YACjE,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,IAAI,QAAQ,CAAA;YAC3C,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,WAAW,CAAC,CAAA;YAC1D,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAA;YACpC,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAA;YACvC,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,IAAI,oCAAoC,CAAC,IAAI,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC3G,CAAC;QAED,WAAW,CAAC,MAAqB;YAC/B,OAAO,gBAAgB,CAAA;QACzB,CAAC;KACF,CAAA;AACH,CAAC;AAED;;;;;;GAMG;AACH,SAAS,iBAAiB,CAAC,KAAoB;IAC7C,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CACb,+GAA+G,CAChH,CAAA;IACH,CAAC;IACD,oEAAoE;IACpE,+CAA+C;IAC/C,OAAO,aAAa,CAAC;QACnB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;KACzB,CAAC,CAAA;AACJ,CAAC;AAED,6DAA6D;AAC7D,SAAS,UAAU,CAAC,GAAW;IAC7B,OAAO,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,KAAK,CAAA;AAC9G,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transform-adapter factory.
|
|
3
|
+
*
|
|
4
|
+
* One switch over `target.transforms?.adapter`, the only place that
|
|
5
|
+
* knows adapter names. Adding a new adapter is one new module + one
|
|
6
|
+
* case here — no edits to resolver, walker, kind resolvers, or
|
|
7
|
+
* serve-route.
|
|
8
|
+
*
|
|
9
|
+
* Default (no `transforms` config) = `sharpAdapter`. This matches the
|
|
10
|
+
* pre-step-18 hardcoded behavior — sites that don't opt into a CDN
|
|
11
|
+
* adapter get the same URLs and cache headers they had before.
|
|
12
|
+
*/
|
|
13
|
+
import type { TargetConfig } from '../types.js';
|
|
14
|
+
import type { TransformAdapter } from './adapter.js';
|
|
15
|
+
/**
|
|
16
|
+
* Construct a `TransformAdapter` from a target's config. Throws on
|
|
17
|
+
* unknown adapter names so misconfiguration surfaces at boot, not
|
|
18
|
+
* silently at render time.
|
|
19
|
+
*/
|
|
20
|
+
export declare function buildTransformAdapter(target: TargetConfig): TransformAdapter;
|
|
21
|
+
export type { AssetUrlInput, CachePolicy, TransformAdapter } from './adapter.js';
|
|
22
|
+
export { sharpAdapter } from './sharp.js';
|
|
23
|
+
export { createCloudflareAdapter, type CloudflareAdapterOptions } from './cloudflare.js';
|
|
24
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/transforms/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAIpD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,YAAY,GAAG,gBAAgB,CAkB5E;AAGD,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAChF,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AACzC,OAAO,EAAE,uBAAuB,EAAE,KAAK,wBAAwB,EAAE,MAAM,iBAAiB,CAAA"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { sharpAdapter } from './sharp.js';
|
|
2
|
+
import { createCloudflareAdapter } from './cloudflare.js';
|
|
3
|
+
/**
|
|
4
|
+
* Construct a `TransformAdapter` from a target's config. Throws on
|
|
5
|
+
* unknown adapter names so misconfiguration surfaces at boot, not
|
|
6
|
+
* silently at render time.
|
|
7
|
+
*/
|
|
8
|
+
export function buildTransformAdapter(target) {
|
|
9
|
+
const config = target.transforms;
|
|
10
|
+
if (!config || config.adapter === 'sharp')
|
|
11
|
+
return sharpAdapter;
|
|
12
|
+
switch (config.adapter) {
|
|
13
|
+
case 'cloudflare': {
|
|
14
|
+
if (!config.zone) {
|
|
15
|
+
throw new Error('transforms.adapter "cloudflare" requires a `zone` field (e.g. "cdn.example.com")');
|
|
16
|
+
}
|
|
17
|
+
return createCloudflareAdapter({ zone: config.zone });
|
|
18
|
+
}
|
|
19
|
+
default: {
|
|
20
|
+
// Exhaustive check — TypeScript ensures we don't miss a known adapter.
|
|
21
|
+
// Runtime fallthrough is for when site.yaml carries an adapter name
|
|
22
|
+
// this build doesn't know.
|
|
23
|
+
const unknown = config.adapter;
|
|
24
|
+
throw new Error(`Unknown transforms.adapter "${unknown}". Supported: sharp, cloudflare.`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export { sharpAdapter } from './sharp.js';
|
|
29
|
+
export { createCloudflareAdapter } from './cloudflare.js';
|
|
30
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/transforms/index.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AACzC,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAA;AAEzD;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAoB;IACxD,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAA;IAChC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,OAAO,KAAK,OAAO;QAAE,OAAO,YAAY,CAAA;IAC9D,QAAQ,MAAM,CAAC,OAAO,EAAE,CAAC;QACvB,KAAK,YAAY,CAAC,CAAC,CAAC;YAClB,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,kFAAkF,CAAC,CAAA;YACrG,CAAC;YACD,OAAO,uBAAuB,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAA;QACvD,CAAC;QACD,OAAO,CAAC,CAAC,CAAC;YACR,uEAAuE;YACvE,oEAAoE;YACpE,2BAA2B;YAC3B,MAAM,OAAO,GAAI,MAA8B,CAAC,OAAO,CAAA;YACvD,MAAM,IAAI,KAAK,CAAC,+BAA+B,OAAO,kCAAkC,CAAC,CAAA;QAC3F,CAAC;IACH,CAAC;AACH,CAAC;AAID,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AACzC,OAAO,EAAE,uBAAuB,EAAiC,MAAM,iBAAiB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sharp.d.ts","sourceRoot":"","sources":["../../src/transforms/sharp.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAA8B,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAMhF,eAAO,MAAM,YAAY,EAAE,gBAqB1B,CAAA"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default `TransformAdapter`: origin bytes + pre-generated variant ladder.
|
|
3
|
+
*
|
|
4
|
+
* Bytes are served from the target's storage via `assets/serve-route.ts`.
|
|
5
|
+
* Variants are pre-generated at upload by sharp (see `assets/variants.ts`)
|
|
6
|
+
* and listed in the manifest's `variants` array. Both URLs and srcset
|
|
7
|
+
* descriptors point at origin paths — the CDN, if any, caches as-is.
|
|
8
|
+
*
|
|
9
|
+
* Cache policy: `public, max-age=31536000, immutable`. Safe because
|
|
10
|
+
* hash-in-path is content-addressed — new bytes mean a new URL, so
|
|
11
|
+
* the URL's response is genuinely immutable.
|
|
12
|
+
*
|
|
13
|
+
* Single responsibility: wrap `buildAssetUrl` + `buildSrcset` from
|
|
14
|
+
* `assets/url.ts` behind the `TransformAdapter` interface. No extra
|
|
15
|
+
* logic — the adapter is the right shape for swap-out, and the URL
|
|
16
|
+
* helpers stay reusable for tests and future adapters that compose
|
|
17
|
+
* origin URLs (cloudflare prefixes them; imgproxy wraps them).
|
|
18
|
+
*/
|
|
19
|
+
import { buildAssetUrl, buildSrcset } from '../assets/url.js';
|
|
20
|
+
const IMMUTABLE_CACHE = {
|
|
21
|
+
cacheControl: 'public, max-age=31536000, immutable',
|
|
22
|
+
};
|
|
23
|
+
export const sharpAdapter = {
|
|
24
|
+
name: 'sharp',
|
|
25
|
+
primaryUrl(input) {
|
|
26
|
+
return buildAssetUrl({
|
|
27
|
+
name: input.name,
|
|
28
|
+
hash: input.hash,
|
|
29
|
+
ext: input.ext,
|
|
30
|
+
siteUrl: input.siteUrl,
|
|
31
|
+
selector: input.selector,
|
|
32
|
+
});
|
|
33
|
+
},
|
|
34
|
+
srcset(input) {
|
|
35
|
+
if (input.variants.length === 0)
|
|
36
|
+
return null;
|
|
37
|
+
return buildSrcset(input.variants, input.siteUrl);
|
|
38
|
+
},
|
|
39
|
+
cachePolicy(_input) {
|
|
40
|
+
return IMMUTABLE_CACHE;
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
//# sourceMappingURL=sharp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sharp.js","sourceRoot":"","sources":["../../src/transforms/sharp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAG7D,MAAM,eAAe,GAAgB;IACnC,YAAY,EAAE,qCAAqC;CACpD,CAAA;AAED,MAAM,CAAC,MAAM,YAAY,GAAqB;IAC5C,IAAI,EAAE,OAAO;IAEb,UAAU,CAAC,KAAoB;QAC7B,OAAO,aAAa,CAAC;YACnB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;SACzB,CAAC,CAAA;IACJ,CAAC;IAED,MAAM,CAAC,KAAoB;QACzB,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAA;QAC5C,OAAO,WAAW,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;IACnD,CAAC;IAED,WAAW,CAAC,MAAqB;QAC/B,OAAO,eAAe,CAAA;IACxB,CAAC;CACF,CAAA"}
|
package/dist/types.d.ts
CHANGED
|
@@ -22,6 +22,20 @@ export interface EditorMount {
|
|
|
22
22
|
onChange: (content: Record<string, unknown>) => void;
|
|
23
23
|
/** Base URL for loading custom field modules (dev mode: /@fs/ path) */
|
|
24
24
|
fieldsBaseUrl?: string;
|
|
25
|
+
/**
|
|
26
|
+
* Asset picker callback — used by embedded-asset field widgets to
|
|
27
|
+
* open a "select one asset" modal. Admin supplies its own
|
|
28
|
+
* implementation (Vue-rendered in the admin); the editor package
|
|
29
|
+
* depends only on the abstract Promise-returning shape.
|
|
30
|
+
*
|
|
31
|
+
* Returns `{ _asset: name }` on confirm, `null` on cancel.
|
|
32
|
+
*/
|
|
33
|
+
onPickAsset?: (options: {
|
|
34
|
+
accept?: string[];
|
|
35
|
+
currentAssetName?: string | null;
|
|
36
|
+
}) => Promise<{
|
|
37
|
+
_asset: string;
|
|
38
|
+
} | null>;
|
|
25
39
|
}): void;
|
|
26
40
|
unmount(el: HTMLElement): void;
|
|
27
41
|
}
|
|
@@ -176,6 +190,50 @@ export interface TargetConfig {
|
|
|
176
190
|
* preview targets).
|
|
177
191
|
*/
|
|
178
192
|
history?: HistoryConfig;
|
|
193
|
+
/**
|
|
194
|
+
* Image-transform delivery strategy. When unset, `sharp` adapter is
|
|
195
|
+
* used — bytes serve from origin with the immutable cache headers
|
|
196
|
+
* the v1 slice ships. Set to `cloudflare` (or future adapters) to
|
|
197
|
+
* route URLs through a CDN's transform pipeline.
|
|
198
|
+
*/
|
|
199
|
+
transforms?: TransformConfig;
|
|
200
|
+
/**
|
|
201
|
+
* Per-target asset upload policy. Today carries the size cap; future
|
|
202
|
+
* fields (MIME allowlist subset, name policy overrides) extend this
|
|
203
|
+
* block additively. Default cap when unset: 50 MB
|
|
204
|
+
* (DEFAULT_ASSET_MAX_BYTES in assets/validate.ts).
|
|
205
|
+
*
|
|
206
|
+
* Example use cases:
|
|
207
|
+
* - Cloudflare Workers Free tier: cap below 100 MB worker body limit
|
|
208
|
+
* - Self-hosted with nginx + S3: raise to 500 MB for raw-photo
|
|
209
|
+
* workflows
|
|
210
|
+
* - Locked-down prod target: cap at the smallest sensible value
|
|
211
|
+
* for the site's content
|
|
212
|
+
*/
|
|
213
|
+
assets?: AssetUploadConfig;
|
|
214
|
+
}
|
|
215
|
+
/** Per-target asset upload policy. */
|
|
216
|
+
export interface AssetUploadConfig {
|
|
217
|
+
/**
|
|
218
|
+
* Per-asset upload size cap in bytes. Validates against the bytes
|
|
219
|
+
* actually received (sniffed at ingest time, not the client's
|
|
220
|
+
* Content-Length claim). Default: 50 MB.
|
|
221
|
+
*/
|
|
222
|
+
maxBytes?: number;
|
|
223
|
+
}
|
|
224
|
+
/** Per-target transform-adapter configuration. */
|
|
225
|
+
export interface TransformConfig {
|
|
226
|
+
/**
|
|
227
|
+
* Adapter name. v1 ships:
|
|
228
|
+
* - `sharp` (default): origin bytes + pre-generated variant ladder
|
|
229
|
+
* - `cloudflare`: `/cdn-cgi/image/...` URL builder against a zone
|
|
230
|
+
*/
|
|
231
|
+
adapter: 'sharp' | 'cloudflare';
|
|
232
|
+
/**
|
|
233
|
+
* Cloudflare adapter only: the zone (hostname) where `/cdn-cgi/image/`
|
|
234
|
+
* is served. Required when adapter is `cloudflare`.
|
|
235
|
+
*/
|
|
236
|
+
zone?: string;
|
|
179
237
|
}
|
|
180
238
|
/** Per-target history configuration. */
|
|
181
239
|
export interface HistoryConfig {
|
|
@@ -221,6 +279,21 @@ export interface LocalesConfig {
|
|
|
221
279
|
/** Enable Accept-Language detection and redirect. Default: false. */
|
|
222
280
|
detection?: boolean;
|
|
223
281
|
}
|
|
282
|
+
/**
|
|
283
|
+
* Theme configuration. Opt-in: absent = single-theme site (no theme overrides
|
|
284
|
+
* on assets). Themes are a peer override dimension to locales — assets can
|
|
285
|
+
* declare locale-specific bytes, theme-specific bytes, or both.
|
|
286
|
+
*
|
|
287
|
+
* v1 enables themes on **assets only**. Page/fragment theme variants are
|
|
288
|
+
* deferred; templates emit theme-aware CSS via PrimeVue tokens / class-based
|
|
289
|
+
* cascade. See design-media.md and css-theming.md.
|
|
290
|
+
*/
|
|
291
|
+
export interface ThemesConfig {
|
|
292
|
+
/** Supported theme names (lowercase ASCII, no dots). Conventionally `['light', 'dark']`. */
|
|
293
|
+
supported: string[];
|
|
294
|
+
/** Default theme name. Falls back to first in `supported`. */
|
|
295
|
+
default?: string;
|
|
296
|
+
}
|
|
224
297
|
/** Site manifest (site.yaml) */
|
|
225
298
|
export interface SiteManifest {
|
|
226
299
|
name: string;
|
|
@@ -229,6 +302,12 @@ export interface SiteManifest {
|
|
|
229
302
|
locale?: string;
|
|
230
303
|
/** i18n configuration. Absent = single-locale site. */
|
|
231
304
|
locales?: LocalesConfig;
|
|
305
|
+
/**
|
|
306
|
+
* Theme configuration for asset overrides. Absent = no theme dimension
|
|
307
|
+
* (assets are theme-agnostic). When set, assets can carry per-theme
|
|
308
|
+
* byte overrides, and the resolver picks variants per render context.
|
|
309
|
+
*/
|
|
310
|
+
themes?: ThemesConfig;
|
|
232
311
|
/** Default Open Graph image for pages that don't specify their own. */
|
|
233
312
|
defaultOgImage?: string;
|
|
234
313
|
systemPages?: string[];
|
|
@@ -239,7 +318,38 @@ export interface DirEntry {
|
|
|
239
318
|
name: string;
|
|
240
319
|
isDirectory: boolean;
|
|
241
320
|
}
|
|
242
|
-
/**
|
|
321
|
+
/**
|
|
322
|
+
* Byte range for `StorageProvider.readStream`.
|
|
323
|
+
* Both `start` and `end` are inclusive (matches HTTP Range and Node `fs.createReadStream`).
|
|
324
|
+
*/
|
|
325
|
+
export interface ByteRange {
|
|
326
|
+
start: number;
|
|
327
|
+
end: number;
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Storage abstraction — filesystem, S3, R2, Azure Blob.
|
|
331
|
+
*
|
|
332
|
+
* Implementations must provide atomic writes from a reader's perspective
|
|
333
|
+
* (filesystem uses write-then-rename; cloud PUT is naturally atomic per
|
|
334
|
+
* object; multipart uploads commit atomically). `readStream` must honor
|
|
335
|
+
* the optional `range` argument for video/audio seek.
|
|
336
|
+
*
|
|
337
|
+
* Three I/O patterns, each with a use case:
|
|
338
|
+
* - **Text** (`readFile` / `writeFile`): small string content
|
|
339
|
+
* (manifests, YAML, HTML). Encodes/decodes UTF-8 internally.
|
|
340
|
+
* - **Bytes** (`readBytes` / `writeBytes`): small binary content
|
|
341
|
+
* (asset bytes, history blobs). Buffer-shaped — bytes in, bytes
|
|
342
|
+
* out. No string round-trip.
|
|
343
|
+
* - **Stream** (`readStream` / `writeStream`): unbounded content
|
|
344
|
+
* (large uploads, range-served videos). Used by ingest and the
|
|
345
|
+
* asset-serve route.
|
|
346
|
+
*
|
|
347
|
+
* All three are part of the base contract, not separate capabilities —
|
|
348
|
+
* every provider Gazetta ships supports them, and custom providers
|
|
349
|
+
* must too. Authors writing a non-conforming provider get a compile-
|
|
350
|
+
* time error rather than a runtime capability check that surfaces
|
|
351
|
+
* at publish time.
|
|
352
|
+
*/
|
|
243
353
|
export interface StorageProvider {
|
|
244
354
|
readFile(path: string): Promise<string>;
|
|
245
355
|
readDir(path: string): Promise<DirEntry[]>;
|
|
@@ -247,6 +357,20 @@ export interface StorageProvider {
|
|
|
247
357
|
writeFile(path: string, content: string): Promise<void>;
|
|
248
358
|
mkdir(path: string): Promise<void>;
|
|
249
359
|
rm(path: string): Promise<void>;
|
|
360
|
+
/**
|
|
361
|
+
* Read the full byte content of `path`. Bounded — for unbounded /
|
|
362
|
+
* range-served reads, use `readStream`. Used by history-blob reads.
|
|
363
|
+
*/
|
|
364
|
+
readBytes(path: string): Promise<Uint8Array>;
|
|
365
|
+
/**
|
|
366
|
+
* Write `content` to `path` atomically. Bounded — for unbounded
|
|
367
|
+
* uploads, use `writeStream`. Used by history-blob writes (and any
|
|
368
|
+
* future write path that has bytes-in-hand and doesn't need
|
|
369
|
+
* streaming).
|
|
370
|
+
*/
|
|
371
|
+
writeBytes(path: string, content: Uint8Array): Promise<void>;
|
|
372
|
+
readStream(path: string, range?: ByteRange): Promise<ReadableStream<Uint8Array>>;
|
|
373
|
+
writeStream(path: string, stream: ReadableStream<Uint8Array>): Promise<void>;
|
|
250
374
|
}
|
|
251
375
|
/** Resolved component ready for rendering */
|
|
252
376
|
export interface ResolvedComponent {
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,8DAA8D;AAC9D,MAAM,MAAM,gBAAgB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE;IACnG,OAAO,CAAC,EAAE,CAAC,CAAA;IACX,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAA;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/B,iHAAiH;IACjH,MAAM,EAAE,MAAM,CAAA;CACf,KAAK,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAAA;AAE1C,2DAA2D;AAC3D,MAAM,WAAW,WAAW;IAC1B,KAAK,CACH,EAAE,EAAE,WAAW,EACf,KAAK,EAAE;QACL,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QAChC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QAC/B,KAAK,EAAE,MAAM,GAAG,OAAO,CAAA;QACvB,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;QACpD,uEAAuE;QACvE,aAAa,CAAC,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,8DAA8D;AAC9D,MAAM,MAAM,gBAAgB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE;IACnG,OAAO,CAAC,EAAE,CAAC,CAAA;IACX,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAA;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/B,iHAAiH;IACjH,MAAM,EAAE,MAAM,CAAA;CACf,KAAK,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAAA;AAE1C,2DAA2D;AAC3D,MAAM,WAAW,WAAW;IAC1B,KAAK,CACH,EAAE,EAAE,WAAW,EACf,KAAK,EAAE;QACL,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QAChC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QAC/B,KAAK,EAAE,MAAM,GAAG,OAAO,CAAA;QACvB,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;QACpD,uEAAuE;QACvE,aAAa,CAAC,EAAE,MAAM,CAAA;QACtB;;;;;;;WAOG;QACH,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE;YACtB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;YACjB,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;SACjC,KAAK,OAAO,CAAC;YAAE,MAAM,EAAE,MAAM,CAAA;SAAE,GAAG,IAAI,CAAC,CAAA;KACzC,GACA,IAAI,CAAA;IACP,OAAO,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI,CAAA;CAC/B;AAED,iEAAiE;AACjE,MAAM,WAAW,UAAU;IACzB,KAAK,CACH,EAAE,EAAE,WAAW,EACf,KAAK,EAAE;QACL,KAAK,EAAE,OAAO,CAAA;QACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QAC/B,KAAK,EAAE,MAAM,GAAG,OAAO,CAAA;QACvB,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;KACnC,GACA,IAAI,CAAA;IACP,OAAO,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI,CAAA;CAC/B;AAED,qDAAqD;AACrD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,gBAAgB,CAAA;IACzB,MAAM,EAAE,OAAO,CAAA;CAChB;AAED,mEAAmE;AACnE,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACjC,UAAU,CAAC,EAAE,cAAc,EAAE,CAAA;CAC9B;AAED,wGAAwG;AACxG,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,eAAe,CAAA;AAErD,gCAAgC;AAChC,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACjC,UAAU,CAAC,EAAE,cAAc,EAAE,CAAA;CAC9B;AAED,2CAA2C;AAC3C,MAAM,WAAW,gBAAiB,SAAQ,iBAAiB;CAAG;AAE9D,oCAAoC;AACpC,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,YAAY,CAAA;IAClB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,wDAAwD;IACxD,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,0BAA0B;AAC1B,MAAM,WAAW,WAAW;IAC1B,yDAAyD;IACzD,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,+DAA+D;IAC/D,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,oCAAoC;IACpC,KAAK,CAAC,EAAE,WAAW,CAAA;CACpB;AAED,mFAAmF;AACnF,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;qEAEiE;IACjE,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,yCAAyC;AACzC,MAAM,WAAW,YAAa,SAAQ,iBAAiB;IACrD,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,YAAY,CAAA;IACvB,KAAK,CAAC,EAAE,WAAW,CAAA;CACpB;AAED,4BAA4B;AAC5B,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,YAAY,GAAG,YAAY,GAAG,IAAI,GAAG,IAAI,CAAA;IAC/C;;;;;OAKG;IACH,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,mCAAmC;AACnC,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,YAAY,CAAA;IAClB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,SAAS,GAAG,YAAY,CAAA;AAElE,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAA;AAE7C,wCAAwC;AACxC,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,aAAa,CAAA;IACtB,MAAM,CAAC,EAAE,YAAY,CAAA;IACrB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,UAAU,CAAA;IACjB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,iBAAiB,CAAA;IAC/B;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,yDAAyD;IACzD,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;OAEG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,KAAK,CAAC,EAAE,WAAW,CAAA;IACnB;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,aAAa,CAAA;IACvB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,eAAe,CAAA;IAC5B;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,EAAE,iBAAiB,CAAA;CAC3B;AAED,sCAAsC;AACtC,MAAM,WAAW,iBAAiB;IAChC;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,kDAAkD;AAClD,MAAM,WAAW,eAAe;IAC9B;;;;OAIG;IACH,OAAO,EAAE,OAAO,GAAG,YAAY,CAAA;IAC/B;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,wCAAwC;AACxC,MAAM,WAAW,aAAa;IAC5B,uDAAuD;IACvD,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,0FAA0F;AAC1F,wBAAgB,OAAO,CAAC,MAAM,EAAE,YAAY,GAAG,UAAU,CAExD;AAED,yFAAyF;AACzF,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,iBAAiB,CAEtE;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAExD;AAED,mFAAmF;AACnF,eAAO,MAAM,yBAAyB,KAAK,CAAA;AAE3C,0EAA0E;AAC1E,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAE9D;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAGhE;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,8FAA8F;IAC9F,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,yGAAyG;IACzG,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAClC,4FAA4F;IAC5F,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,qEAAqE;IACrE,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,YAAY;IAC3B,4FAA4F;IAC5F,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,8DAA8D;IAC9D,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,gCAAgC;AAChC,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,2FAA2F;IAC3F,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,uDAAuD;IACvD,OAAO,CAAC,EAAE,aAAa,CAAA;IACvB;;;;OAIG;IACH,MAAM,CAAC,EAAE,YAAY,CAAA;IACrB,uEAAuE;IACvE,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;CACvC;AAED,0DAA0D;AAC1D,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,OAAO,CAAA;CACrB;AAED;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;CACZ;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IACvC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAA;IAC1C,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IACtC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACvD,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAClC,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC/B;;;OAGG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;IAC5C;;;;;OAKG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5D,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAA;IAChF,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAC7E;AAED,6CAA6C;AAC7C,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,gBAAgB,CAAA;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACjC,QAAQ,EAAE,iBAAiB,EAAE,CAAA;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,4FAA4F;IAC5F,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,4CAA4C;AAC5C,MAAM,WAAW,aAAa;IAC5B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACzB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACzC"}
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AA+QA,0FAA0F;AAC1F,MAAM,UAAU,OAAO,CAAC,MAAoB;IAC1C,OAAO,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAA;AAC9D,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,cAAc,CAAC,MAAoB;IACjD,OAAO,MAAM,CAAC,WAAW,IAAI,OAAO,CAAA;AACtC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,MAAoB;IAC7C,OAAO,MAAM,CAAC,QAAQ,IAAI,cAAc,CAAC,MAAM,CAAC,KAAK,OAAO,CAAA;AAC9D,CAAC;AAED,mFAAmF;AACnF,MAAM,CAAC,MAAM,yBAAyB,GAAG,EAAE,CAAA;AAE3C,0EAA0E;AAC1E,MAAM,UAAU,gBAAgB,CAAC,MAAoB;IACnD,OAAO,MAAM,CAAC,OAAO,EAAE,OAAO,IAAI,IAAI,CAAA;AACxC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAoB;IACtD,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,EAAE,SAAS,IAAI,yBAAyB,CAAA;IAClE,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;AAC1B,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gazetta",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"description": "Stateless CMS for composable websites",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"cms",
|
|
@@ -30,6 +30,10 @@
|
|
|
30
30
|
"types": "./dist/types.d.ts",
|
|
31
31
|
"import": "./dist/types.js"
|
|
32
32
|
},
|
|
33
|
+
"./format": {
|
|
34
|
+
"types": "./dist/format.d.ts",
|
|
35
|
+
"import": "./dist/format.js"
|
|
36
|
+
},
|
|
33
37
|
"./editor": {
|
|
34
38
|
"types": "./dist/editor/mount.d.ts",
|
|
35
39
|
"import": "./dist/editor/mount.js"
|
|
@@ -42,6 +46,10 @@
|
|
|
42
46
|
"types": "./dist/admin-api/schemas/index.d.ts",
|
|
43
47
|
"import": "./dist/admin-api/schemas/index.js"
|
|
44
48
|
},
|
|
49
|
+
"./schema": {
|
|
50
|
+
"types": "./dist/schema/index.d.ts",
|
|
51
|
+
"import": "./dist/schema/index.js"
|
|
52
|
+
},
|
|
45
53
|
"./workers/cloudflare-r2": {
|
|
46
54
|
"types": "./dist/workers/cloudflare-r2.d.ts",
|
|
47
55
|
"import": "./dist/workers/cloudflare-r2.js"
|
|
@@ -75,16 +83,22 @@
|
|
|
75
83
|
"@tiptap/pm": "^3.22.3",
|
|
76
84
|
"@tiptap/react": "^3.22.3",
|
|
77
85
|
"@tiptap/starter-kit": "^3.22.3",
|
|
86
|
+
"file-type": "^22.0.0",
|
|
78
87
|
"hono": "^4.12.0",
|
|
88
|
+
"isomorphic-dompurify": "^3.12.0",
|
|
79
89
|
"jiti": "^2.6.1",
|
|
80
90
|
"js-yaml": "^4.1.0",
|
|
81
91
|
"marked": "^18.0.0",
|
|
92
|
+
"music-metadata": "^11.12.3",
|
|
82
93
|
"postcss": "^8.5.8",
|
|
83
94
|
"postcss-prefix-selector": "^2.1.1",
|
|
95
|
+
"sharp": "^0.34.0",
|
|
96
|
+
"write-file-atomic": "^7.0.1",
|
|
84
97
|
"zod": "^4.3.6"
|
|
85
98
|
},
|
|
86
99
|
"peerDependencies": {
|
|
87
100
|
"@aws-sdk/client-s3": ">=3",
|
|
101
|
+
"@aws-sdk/lib-storage": ">=3",
|
|
88
102
|
"@azure/storage-blob": ">=12",
|
|
89
103
|
"react": "^18.0.0 || ^19.0.0",
|
|
90
104
|
"react-dom": "^18.0.0 || ^19.0.0"
|
|
@@ -93,12 +107,16 @@
|
|
|
93
107
|
"@aws-sdk/client-s3": {
|
|
94
108
|
"optional": true
|
|
95
109
|
},
|
|
110
|
+
"@aws-sdk/lib-storage": {
|
|
111
|
+
"optional": true
|
|
112
|
+
},
|
|
96
113
|
"@azure/storage-blob": {
|
|
97
114
|
"optional": true
|
|
98
115
|
}
|
|
99
116
|
},
|
|
100
117
|
"devDependencies": {
|
|
101
118
|
"@aws-sdk/client-s3": "^3.1030.0",
|
|
119
|
+
"@aws-sdk/lib-storage": "^3.1039.0",
|
|
102
120
|
"@azure/storage-blob": "^12.31.0",
|
|
103
121
|
"@cloudflare/workers-types": "^4.20260413.1",
|
|
104
122
|
"@stryker-mutator/core": "^9.6.1",
|
|
@@ -108,6 +126,7 @@
|
|
|
108
126
|
"@types/node": "^25.6.0",
|
|
109
127
|
"@types/react": "^19.2.0",
|
|
110
128
|
"@types/react-dom": "^19.2.0",
|
|
129
|
+
"@types/write-file-atomic": "^4.0.3",
|
|
111
130
|
"@vitejs/plugin-vue": "^6.0.6",
|
|
112
131
|
"fast-check": "^4.6.0",
|
|
113
132
|
"tsx": "^4.21.0",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.blast-radius[data-v-44748290]{border-radius:var(--p-border-radius-sm);color:var(--color-muted);background:var(--color-hover-bg);border:1px solid var(--color-border);letter-spacing:-.01em;align-items:center;gap:.375rem;padding:.125rem .5rem;font-size:.75rem;display:inline-flex}.blast-radius .pi[data-v-44748290]{opacity:.7;font-size:.625rem}.blast-radius .unused[data-v-44748290]{opacity:.75;font-style:italic}.blast-radius.compact[data-v-44748290]{font-variant-numeric:tabular-nums;background:0 0;border:0;padding:0 .25rem;font-size:.6875rem}.blast-radius.compact .count[data-v-44748290]{font-weight:600}.publish-item-list[data-v-ba2e46af]{flex-direction:column;gap:.625rem;width:100%;display:flex}.list-header[data-v-ba2e46af]{color:var(--color-muted);justify-content:space-between;align-items:center;font-size:.75rem;display:flex}.summary[data-v-ba2e46af]{font-variant-numeric:tabular-nums}.list-actions[data-v-ba2e46af]{align-items:center;gap:.375rem;display:flex}.link-btn[data-v-ba2e46af]{font:inherit;color:var(--p-primary-color);cursor:pointer;background:0 0;border:0;padding:0}.link-btn[data-v-ba2e46af]:hover{text-decoration:underline}.sep[data-v-ba2e46af]{color:var(--color-border)}.state-loading[data-v-ba2e46af],.state-error[data-v-ba2e46af],.state-empty[data-v-ba2e46af]{color:var(--color-muted);border:1px dashed var(--color-border);border-radius:var(--p-border-radius-sm);align-items:center;gap:.5rem;padding:.75rem;font-size:.8125rem;display:flex}.state-error[data-v-ba2e46af]{color:var(--color-danger-fg);border-color:var(--color-danger-fg)}.items[data-v-ba2e46af]{flex-direction:column;gap:.25rem;max-height:50vh;margin:0;padding:0;list-style:none;display:flex;overflow:auto}.item[data-v-ba2e46af]{border-radius:var(--p-border-radius-sm);grid-template-columns:1.25rem auto 1fr auto auto;align-items:center;gap:.625rem;padding:.375rem .5rem;font-size:.875rem;display:grid}.item[data-v-ba2e46af]:hover{background:var(--color-hover-bg)}.marker[data-v-ba2e46af]{text-align:center;font-variant-numeric:tabular-nums;font-weight:700}.marker-added[data-v-ba2e46af]{color:var(--color-success-fg)}.marker-modified[data-v-ba2e46af]{color:var(--color-warning-fg)}.marker-deleted[data-v-ba2e46af]{color:var(--color-danger-fg)}.marker-unchanged[data-v-ba2e46af]{color:var(--color-muted);opacity:.4}.deleted-spacer[data-v-ba2e46af]{width:1.125rem;height:1px;display:inline-block}.path[data-v-ba2e46af]{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-family:ui-monospace,SFMono-Regular,monospace;font-size:.8125rem;overflow:hidden}.item-deleted .path[data-v-ba2e46af]{opacity:.6;text-decoration:line-through}.by-dest[data-v-ba2e46af]{flex-wrap:wrap;justify-content:flex-end;gap:.25rem;display:flex}.dest-state[data-v-ba2e46af]{border-radius:var(--p-border-radius-xs);border:1px solid var(--color-border);color:var(--color-muted);align-items:center;gap:.25rem;padding:.0625rem .375rem;font-size:.6875rem;display:inline-flex}.dest-name[data-v-ba2e46af]{font-weight:500}.dest-label[data-v-ba2e46af]{opacity:.75}.dest-state-added[data-v-ba2e46af]{color:var(--color-success-fg);border-color:var(--color-success-fg)}.dest-state-modified[data-v-ba2e46af]{color:var(--color-warning-fg);border-color:var(--color-warning-fg)}.dest-state-deleted[data-v-ba2e46af]{color:var(--color-danger-fg);border-color:var(--color-danger-fg)}.dest-state-unchanged[data-v-ba2e46af]{opacity:.5}.publish-panel[data-v-a260edc1]{flex-direction:column;gap:1.25rem;padding-top:.5rem;display:flex}.row[data-v-a260edc1]{align-items:flex-start;gap:1rem;display:flex}.row-items[data-v-a260edc1]{flex-direction:column;align-items:stretch;gap:.5rem}.row-items .row-label[data-v-a260edc1]{padding-top:0}.row-label[data-v-a260edc1]{color:var(--color-muted);text-transform:uppercase;letter-spacing:.04em;flex:0 0 5rem;padding-top:.375rem;font-size:.8125rem;font-weight:500}.row-control[data-v-a260edc1]{flex:1;min-width:0}.row-value[data-v-a260edc1]{flex:1;min-width:0;padding-top:.375rem}.row-value.muted[data-v-a260edc1]{color:var(--color-muted);font-size:.8125rem;font-style:italic}.chip[data-v-a260edc1]{border-radius:var(--p-border-radius-sm);background:var(--color-hover-bg);border:1px solid var(--color-border);align-items:center;padding:.25rem .625rem;font-size:.8125rem;font-weight:500;display:inline-flex}.chip.env-production[data-v-a260edc1]{background:var(--color-env-prod-bg);color:var(--color-env-prod-fg);border-color:var(--color-env-prod-fg)}.chip.env-staging[data-v-a260edc1]{background:var(--color-env-staging-bg);color:var(--color-env-staging-fg);border-color:var(--color-env-staging-fg)}.destinations[data-v-a260edc1]{flex-direction:column;flex:1;gap:.375rem;display:flex}.destination[data-v-a260edc1]{border-radius:var(--p-border-radius-sm);border:1px solid var(--color-border);cursor:pointer;grid-template-columns:auto 1fr auto auto;align-items:center;gap:.625rem;padding:.5rem .75rem;font-size:.875rem;display:grid}.destination[data-v-a260edc1]:hover{background:var(--color-hover-bg)}.dest-name[data-v-a260edc1]{font-weight:500}.dest-badge[data-v-a260edc1]{text-transform:uppercase;letter-spacing:.05em;opacity:.65;border-radius:var(--p-border-radius-xs);border:1px solid;padding:.125rem .375rem;font-size:.6875rem}.dest-status[data-v-a260edc1]{color:var(--color-muted);font-variant-numeric:tabular-nums;font-size:.75rem}.destination.env-production[data-v-a260edc1]{border-left:3px solid var(--color-env-prod-fg)}.destination.env-staging[data-v-a260edc1]{border-left:3px solid var(--color-env-staging-fg)}.destination.grouped[data-v-a260edc1]{border-left:1px solid var(--color-border);margin-left:1.25rem}.destination-group-header[data-v-a260edc1]{border-radius:var(--p-border-radius-sm);text-transform:uppercase;letter-spacing:.03em;border:1px solid var(--color-border);cursor:pointer;color:inherit;text-align:left;background:0 0;align-items:center;gap:.5rem;width:100%;margin-bottom:.125rem;padding:.375rem .625rem;font-family:inherit;font-size:.8125rem;font-weight:600;display:flex}.destination-group-header[data-v-a260edc1]:hover{opacity:.9}.destination-group-header.env-production[data-v-a260edc1]{background:var(--color-env-prod-bg);color:var(--color-env-prod-fg);border-color:var(--color-env-prod-fg)}.destination-group-header.env-staging[data-v-a260edc1]{background:var(--color-env-staging-bg);color:var(--color-env-staging-fg);border-color:var(--color-env-staging-fg)}.group-label[data-v-a260edc1]{flex:1}.group-count[data-v-a260edc1]{letter-spacing:0;text-transform:none;opacity:.75;font-size:.6875rem;font-weight:500}.publish-confirm-banner[data-v-a260edc1]{border-radius:var(--p-border-radius-md);background:var(--color-danger-bg);color:var(--color-danger-fg);align-items:center;gap:.5rem;padding:.5rem .75rem;font-size:.875rem;display:flex}.publish-error[data-v-a260edc1]{border-radius:var(--p-border-radius-md);background:var(--color-danger-bg);color:var(--color-danger-fg);gap:.5rem;padding:.5rem .75rem;font-size:.875rem;display:flex}.publish-error-body[data-v-a260edc1]{flex-direction:column;flex:1;gap:.375rem;display:flex}.publish-error-body p[data-v-a260edc1]{margin:0}.publish-invalid-list[data-v-a260edc1]{flex-direction:column;gap:.25rem;margin:0;padding:0;list-style:none;display:flex}.publish-invalid-list li[data-v-a260edc1]{flex-direction:column;gap:.125rem;font-size:.8125rem;display:flex}.publish-invalid-name[data-v-a260edc1]{font-family:ui-monospace,monospace;font-weight:600}.publish-invalid-error[data-v-a260edc1]{opacity:.85;font-size:.75rem}.publish-progress[data-v-a260edc1]{flex-direction:column;gap:.75rem;display:flex}.progress-row[data-v-a260edc1]{flex-direction:column;gap:.25rem;display:flex}.progress-header[data-v-a260edc1]{justify-content:space-between;align-items:baseline;font-size:.8125rem;display:flex}.progress-target[data-v-a260edc1]{font-weight:600}.progress-count[data-v-a260edc1]{color:var(--color-muted);font-variant-numeric:tabular-nums;font-size:.75rem}.progress-bar[data-v-a260edc1]{background:var(--color-hover-bg);border-radius:2px;height:4px;overflow:hidden}.progress-fill[data-v-a260edc1]{background:var(--p-primary-color);height:100%;transition:width .2s}.progress-label[data-v-a260edc1]{color:var(--color-muted);text-overflow:ellipsis;white-space:nowrap;font-family:ui-monospace,monospace;font-size:.75rem;overflow:hidden}.publish-results[data-v-a260edc1]{flex-direction:column;gap:.5rem;display:flex}.publish-result[data-v-a260edc1]{border-radius:var(--p-border-radius-md);align-items:center;gap:.5rem;padding:.5rem;display:flex}.publish-result.success[data-v-a260edc1]{background:var(--color-success-bg);color:var(--color-success-fg)}.publish-result.error[data-v-a260edc1]{background:var(--color-danger-bg);color:var(--color-danger-fg)}.result-target[data-v-a260edc1]{font-weight:600}.result-detail[data-v-a260edc1]{opacity:.8;margin-left:auto;font-size:.875rem}.result-undo[data-v-a260edc1]{color:inherit;border-radius:var(--p-border-radius-sm);font:inherit;cursor:pointer;opacity:.85;background:0 0;border:1px solid;padding:.125rem .5rem;font-size:.75rem}.result-undo[data-v-a260edc1]:hover:not(:disabled){opacity:1}.result-undo[data-v-a260edc1]:disabled{cursor:default;opacity:.5}.state-loading[data-v-da5daf1a],.state-error[data-v-da5daf1a],.state-empty[data-v-da5daf1a]{color:var(--color-muted);border:1px dashed var(--color-border);border-radius:var(--p-border-radius-sm);align-items:center;gap:.5rem;padding:1rem;font-size:.875rem;display:flex}.state-error[data-v-da5daf1a]{color:var(--color-danger-fg);border-color:var(--color-danger-fg)}.revisions[data-v-da5daf1a]{flex-direction:column;gap:.375rem;max-height:60vh;margin:0;padding:0;list-style:none;display:flex;overflow:auto}.revision[data-v-da5daf1a]{border-radius:var(--p-border-radius-sm);border:1px solid var(--color-border);grid-template-columns:auto 1fr auto;align-items:start;gap:.75rem;padding:.625rem .75rem;display:grid}.op-icon[data-v-da5daf1a]{color:var(--color-muted);padding-top:.125rem;font-size:.875rem}.meta[data-v-da5daf1a]{flex-direction:column;gap:.25rem;min-width:0;display:flex}.head-row[data-v-da5daf1a]{flex-wrap:wrap;align-items:baseline;gap:.5rem;font-size:.8125rem;display:flex}.op-label[data-v-da5daf1a]{font-weight:600}.source[data-v-da5daf1a]{color:var(--color-muted);font-size:.75rem;font-weight:500}.head-badge[data-v-da5daf1a]{text-transform:uppercase;letter-spacing:.04em;border-radius:var(--p-border-radius-xs);background:var(--color-info-bg);color:var(--color-info-fg);padding:.125rem .375rem;font-size:.6875rem;font-weight:600}.time[data-v-da5daf1a]{color:var(--color-muted);font-variant-numeric:tabular-nums;margin-left:auto;font-size:.75rem}.message[data-v-da5daf1a]{color:var(--color-muted);font-size:.8125rem;font-style:italic}.items[data-v-da5daf1a]{color:var(--color-muted);text-overflow:ellipsis;white-space:nowrap;font-family:ui-monospace,SFMono-Regular,monospace;font-size:.75rem;overflow:hidden}.active-target[data-v-4279054b]{border-radius:var(--p-border-radius-sm);background:var(--color-hover-bg);color:var(--color-fg);border:1px solid var(--color-border);cursor:default;align-items:center;gap:.375rem;padding:.25rem .625rem;font-family:inherit;font-size:.8125rem;font-weight:500;display:inline-flex}.active-target.interactive[data-v-4279054b]{cursor:pointer}.active-target.interactive[data-v-4279054b]:hover{filter:brightness(.96)}.active-target.interactive[data-v-4279054b]:focus-visible{outline:2px solid var(--p-primary-color);outline-offset:2px}.dot[data-v-4279054b]{opacity:.6;background:currentColor;border-radius:50%;width:.5rem;height:.5rem}.name[data-v-4279054b]{letter-spacing:-.01em}.readonly-badge[data-v-4279054b]{text-transform:uppercase;letter-spacing:.05em;opacity:.65;border-left:1px solid;margin-left:.125rem;padding-left:.375rem;font-size:.6875rem}.chevron[data-v-4279054b]{opacity:.6;margin-left:.125rem;font-size:.625rem}.env-production[data-v-4279054b]{background:var(--color-env-prod-bg);color:var(--color-env-prod-fg);border-color:var(--color-env-prod-fg)}.env-staging[data-v-4279054b]{background:var(--color-env-staging-bg);color:var(--color-env-staging-fg);border-color:var(--color-env-staging-fg)}.p-menu .p-menuitem.active>.p-menuitem-content{font-weight:600}.p-menu .p-menuitem.active .p-menuitem-icon{color:var(--p-primary-color)}.sync-indicators[data-v-4674f672]{align-items:center;gap:.25rem;margin-left:.5rem;display:inline-flex}.sync-chip[data-v-4674f672]{border-radius:var(--p-border-radius-sm);color:var(--color-muted);border:1px solid var(--color-border);letter-spacing:-.01em;cursor:pointer;background:0 0;align-items:center;gap:.375rem;padding:.125rem .5rem;font-family:inherit;font-size:.75rem;display:inline-flex}.sync-chip[data-v-4674f672]:hover{background:var(--color-hover-bg)}.sync-chip[data-v-4674f672]:focus-visible{outline:2px solid var(--p-primary-color);outline-offset:2px}.dot[data-v-4674f672]{opacity:.55;background:currentColor;border-radius:50%;width:.375rem;height:.375rem}.name[data-v-4674f672]{font-weight:500}.sep[data-v-4674f672]{opacity:.4}.status[data-v-4674f672]{opacity:.85}.sync-chip.state-synced[data-v-4674f672]{color:var(--color-success-fg)}.sync-chip.state-behind[data-v-4674f672]{color:var(--color-fg);border-color:var(--color-fg);opacity:.9}.sync-chip.state-unpublished[data-v-4674f672]{color:var(--color-muted)}.sync-chip.state-error[data-v-4674f672]{color:var(--color-danger-fg)}.sync-chip.state-loading .status[data-v-4674f672]{font-style:italic}.sync-chip.env-production[data-v-4674f672]{border-color:var(--color-env-prod-fg)}.sync-chip.env-production .dot[data-v-4674f672]{color:var(--color-env-prod-fg)}.sync-chip.env-staging[data-v-4674f672]{border-color:var(--color-env-staging-fg)}.sync-chip.env-staging .dot[data-v-4674f672]{color:var(--color-env-staging-fg)}.sync-chip-group[data-v-4674f672]{font-weight:500}.sync-chip-group .pi[data-v-4674f672]{opacity:.7;margin-left:.125rem;font-size:.625rem}.sync-chip-group .group-count[data-v-4674f672]{margin-left:-.125rem;font-weight:400}.sync-chip-group.expanded[data-v-4674f672]{background:var(--color-hover-bg)}.sync-chip-member[data-v-4674f672]{padding-left:.625rem}.sync-chip-member .name[data-v-4674f672]:before{content:"↳ ";opacity:.5;font-weight:400}.locale-picker[data-v-62ef19f8]{align-items:center;gap:2px;margin-left:.5rem;display:flex}.locale-btn[data-v-62ef19f8]{border:1px solid var(--color-border);color:var(--color-muted);letter-spacing:.05em;cursor:pointer;background:0 0;border-radius:3px;padding:.125rem .375rem;font-size:.625rem;font-weight:700;transition:all .15s}.locale-btn[data-v-62ef19f8]:hover{color:var(--color-fg);border-color:var(--color-fg)}.locale-btn.active[data-v-62ef19f8]{color:var(--color-primary);border-color:var(--color-primary);background:color-mix(in srgb, var(--color-primary) 10%, transparent)}.locale-dropdown[data-v-62ef19f8]{position:relative}.locale-trigger[data-v-62ef19f8]{align-items:center;gap:2px;display:flex}.locale-chevron[data-v-62ef19f8]{font-size:.5rem}.locale-menu[data-v-62ef19f8]{background:var(--color-bg);border:1px solid var(--color-border);z-index:100;border-radius:4px;min-width:48px;margin-top:4px;padding:2px;display:none;position:absolute;top:100%;left:0;box-shadow:0 4px 12px #00000026}.locale-dropdown:hover .locale-menu[data-v-62ef19f8],.locale-dropdown:focus-within .locale-menu[data-v-62ef19f8]{flex-direction:column;gap:1px;display:flex}.locale-menu-item[data-v-62ef19f8]{color:var(--color-muted);letter-spacing:.05em;cursor:pointer;text-align:left;background:0 0;border:none;border-radius:2px;padding:.25rem .5rem;font-size:.625rem;font-weight:700;transition:all .15s}.locale-menu-item[data-v-62ef19f8]:hover{background:var(--color-hover-bg);color:var(--color-fg)}.locale-menu-item.active[data-v-62ef19f8]{color:var(--color-primary)}.cms-toolbar[data-v-07bf38cf]{border-top:0;border-left:0;border-right:0;border-radius:0}.cms-logo[data-v-07bf38cf]{align-items:center;gap:.5rem;font-size:1.125rem;font-weight:700;display:flex}.cms-site-name[data-v-07bf38cf]{color:var(--color-muted);margin-left:1rem;margin-right:1rem;font-size:.875rem}.cms-btn[data-v-07bf38cf]{margin-left:.5rem}.cms-toast[data-v-07bf38cf]{align-items:center;gap:.375rem;font-size:.8125rem;display:flex}.cms-toast-error[data-v-07bf38cf]{color:var(--color-danger-fg)}.fade-enter-active[data-v-07bf38cf],.fade-leave-active[data-v-07bf38cf]{transition:opacity .2s}.fade-enter-from[data-v-07bf38cf],.fade-leave-to[data-v-07bf38cf]{opacity:0}.unsaved-message[data-v-31aaf260]{color:#374151;margin:0;font-size:.875rem;line-height:1.5}.dark{color:#e4e4e7}.unsaved-actions[data-v-31aaf260]{justify-content:flex-end;gap:.5rem;width:100%;display:flex}*{box-sizing:border-box;margin:0;padding:0}html,body,#app,.cms-app{height:100%}body{color:var(--color-fg);background:var(--color-bg);font-family:system-ui,-apple-system,sans-serif}.cms-error{color:var(--color-danger-fg);padding:2rem}.cms-loading{color:var(--color-muted);padding:2rem}.global-toast{z-index:1001;background:var(--color-bg);color:var(--color-fg);border:1px solid var(--color-border);border-top:none;border-radius:0 0 8px 8px;align-items:center;gap:8px;max-width:400px;padding:8px 20px;font-size:13px;font-weight:500;display:flex;position:fixed;top:0;left:50%;transform:translate(-50%);box-shadow:0 4px 12px #00000026}.toast-success{color:var(--color-success-fg)}.toast-error{color:var(--color-danger-fg)}.toast-info{color:var(--color-info-fg)}.toast-link{color:inherit;text-decoration:underline}.toast-action{color:inherit;cursor:pointer;font:inherit;background:0 0;border:0;margin-left:4px;padding:2px 6px;font-weight:600;text-decoration:underline}.toast-action:hover{opacity:.8}.toast-dismiss{color:inherit;cursor:pointer;opacity:.7;background:0 0;border:0;align-items:center;margin-left:4px;padding:2px 4px;display:flex}.toast-dismiss:hover{opacity:1}.toast-dismiss .pi{font-size:11px}.toast-enter-active{transition:transform .2s ease-out,opacity .2s ease-out}.toast-leave-active{transition:transform .15s ease-in,opacity .15s ease-in}.toast-enter-from,.toast-leave-to{opacity:0;transform:translate(-50%)translateY(-100%)}body.workspace-editable-prod:before{content:"";pointer-events:none;border:3px solid var(--color-env-prod-fg);z-index:9999;position:fixed;inset:0}.create-content[data-v-6dee5718]{flex-direction:column;gap:1rem;display:flex}.create-field[data-v-6dee5718]{flex-direction:column;gap:.375rem;display:flex}.create-field label[data-v-6dee5718]{text-transform:uppercase;color:#888;letter-spacing:.03em;font-size:.75rem}.create-input[data-v-6dee5718],.create-list[data-v-6dee5718]{width:100%}.create-hint[data-v-6dee5718]{color:#666;font-size:.75rem}.create-error[data-v-6dee5718]{color:#f87171;font-size:.875rem}.create-content[data-v-f1ae2b06]{flex-direction:column;gap:1rem;display:flex}.create-field[data-v-f1ae2b06]{flex-direction:column;gap:.375rem;display:flex}.create-field label[data-v-f1ae2b06]{text-transform:uppercase;color:#888;letter-spacing:.03em;font-size:.75rem}.create-input[data-v-f1ae2b06],.create-list[data-v-f1ae2b06]{width:100%}.create-error[data-v-f1ae2b06]{color:#f87171;font-size:.875rem}.site-tree[data-v-d0c1625f]{font-size:13px;line-height:22px}.section-label[data-v-d0c1625f]{text-transform:uppercase;letter-spacing:.05em;color:var(--color-muted);padding:4px 8px;font-size:11px;font-weight:600}.section-divider[data-v-d0c1625f]{border-top:1px solid var(--color-border);margin:4px 8px}.node-item[data-v-d0c1625f]{cursor:pointer;border-radius:3px;align-items:center;gap:4px;height:22px;margin:0 2px;padding:0 6px;display:flex}.node-item[data-v-d0c1625f]:hover{background:var(--color-hover-bg)}.node-item.selected[data-v-d0c1625f]{background:#a78bfa26;box-shadow:inset 2px 0 #a78bfa}.node-icon[data-v-d0c1625f]{text-align:center;width:16px;color:var(--color-muted);opacity:.85;flex-shrink:0;font-size:10px}.node-label[data-v-d0c1625f]{white-space:nowrap;text-overflow:ellipsis;color:var(--color-muted);flex:1;overflow:hidden}.node-item.selected .node-label[data-v-d0c1625f],.node-item:hover .node-label[data-v-d0c1625f]{color:var(--color-fg)}.node-dirty-dot[data-v-d0c1625f]{background:var(--color-warning-fg);border-radius:50%;flex-shrink:0;width:6px;height:6px;margin-right:2px}.node-delete[data-v-d0c1625f]{opacity:0;flex-shrink:0;transition:opacity .1s}.node-item:hover .node-delete[data-v-d0c1625f]{opacity:1}.new-btns[data-v-d0c1625f]{gap:.5rem;margin-top:8px;padding:0 6px;display:flex}.node-locales[data-v-d0c1625f]{flex-shrink:0;gap:2px;margin-left:auto;display:flex}.locale-badge[data-v-d0c1625f]{letter-spacing:.05em;color:var(--color-muted);border:1px solid var(--color-border);border-radius:2px;padding:0 3px;font-size:.5rem;font-weight:700;line-height:1.4}.add-content[data-v-a05fde9a]{flex-direction:column;gap:1rem;display:flex}.add-field[data-v-a05fde9a]{flex-direction:column;gap:.375rem;display:flex}.add-field label[data-v-a05fde9a]{text-transform:uppercase;color:#888;letter-spacing:.03em;font-size:.75rem}.add-input[data-v-a05fde9a],.add-list[data-v-a05fde9a]{width:100%}.add-error[data-v-a05fde9a]{color:#f87171;font-size:.875rem}.component-tree[data-v-09491004]{font-size:13px;line-height:22px}.empty[data-v-09491004]{color:var(--color-muted)}.node-item[data-v-09491004]{cursor:pointer;border-radius:3px;align-items:center;gap:4px;height:22px;margin:0 2px;padding:0 6px;display:flex}.node-item[data-v-09491004]:hover,.node-item.hovered[data-v-09491004]{background:var(--color-hover-bg)}.node-item.selected[data-v-09491004]{box-shadow:inset 2px 0 0 var(--p-violet-400);background:#a78bfa26}.node-root[data-v-09491004]{border-bottom:1px solid var(--color-border);border-radius:0;height:26px;margin:0 0 2px;padding:0 6px;font-weight:600;line-height:26px}.node-root.selected[data-v-09491004]{box-shadow:none;border-bottom-color:var(--p-violet-400);background:#a78bfa1a}.node-icon[data-v-09491004]{text-align:center;width:16px;color:var(--color-muted);flex-shrink:0;font-size:10px}.node-label[data-v-09491004]{white-space:nowrap;text-overflow:ellipsis;color:var(--color-muted);flex:1;overflow:hidden}.node-item.selected .node-label[data-v-09491004],.node-item:hover .node-label[data-v-09491004],.node-item.hovered .node-label[data-v-09491004],.node-root .node-label[data-v-09491004]{color:var(--color-fg)}.node-error-icon[data-v-09491004]{color:var(--color-danger-fg)}.node-dirty-dot[data-v-09491004]{background:var(--color-warning-fg);border-radius:50%;flex-shrink:0;width:6px;height:6px}.node-revert[data-v-09491004]{opacity:0;flex-shrink:0;width:18px;height:18px;transition:opacity .1s}.node-item:hover .node-revert[data-v-09491004]{opacity:1}.node-actions[data-v-09491004]{opacity:0;flex-shrink:0;gap:0;transition:opacity .1s;display:flex}.node-item:hover .node-actions[data-v-09491004]{opacity:1}.add-btn[data-v-09491004]{margin-top:6px}.metadata-editor[data-v-17b57a38]{border-top:1px solid var(--color-border);margin-top:1rem;padding-top:.75rem}.meta-header[data-v-17b57a38]{justify-content:space-between;align-items:center;margin-bottom:.75rem;display:flex}.meta-header h3[data-v-17b57a38]{text-transform:uppercase;color:var(--color-muted);letter-spacing:.05em;margin:0;font-size:.75rem}.meta-save-btn[data-v-17b57a38]{border:1px solid var(--p-primary-color);border-radius:var(--p-border-radius-sm);background:var(--p-primary-color);color:#fff;cursor:pointer;padding:.1875rem .5rem;font-family:inherit;font-size:.6875rem}.meta-save-btn[data-v-17b57a38]:disabled{opacity:.5;cursor:not-allowed}.meta-fields[data-v-17b57a38]{flex-direction:column;gap:.625rem;display:flex}.field[data-v-17b57a38]{flex-direction:column;gap:.25rem;display:flex;position:relative}.field label[data-v-17b57a38]{text-transform:uppercase;letter-spacing:.04em;color:var(--color-muted);font-size:.6875rem;font-weight:500}.field input[data-v-17b57a38],.field textarea[data-v-17b57a38]{border:1px solid var(--color-input-border);border-radius:var(--p-border-radius-sm);background:var(--color-input-bg);color:var(--color-fg);resize:vertical;padding:.375rem .5rem;font-family:inherit;font-size:.8125rem}.field input[data-v-17b57a38]::placeholder,.field textarea[data-v-17b57a38]::placeholder{color:var(--color-muted);opacity:.6;font-style:italic}.field input[data-v-17b57a38]:focus,.field textarea[data-v-17b57a38]:focus{outline:2px solid var(--p-primary-color);outline-offset:-1px}.char-count[data-v-17b57a38]{font-variant-numeric:tabular-nums;align-self:flex-end;font-size:.625rem}.char-count.ok[data-v-17b57a38]{color:var(--color-muted)}.char-count.warn[data-v-17b57a38]{color:var(--color-warning-fg)}.char-count.over[data-v-17b57a38]{color:var(--color-danger-fg);font-weight:600}.field-checkbox[data-v-17b57a38]{flex-direction:row;align-items:flex-start;gap:.375rem}.checkbox-label[data-v-17b57a38]{color:var(--color-fg);cursor:pointer;align-items:center;gap:.375rem;font-size:.8125rem;display:flex}.checkbox-label input[type=checkbox][data-v-17b57a38]{cursor:pointer}.checkbox-hint[data-v-17b57a38]{color:var(--color-muted);margin-left:1.25rem;font-size:.6875rem}.checkbox-hint code[data-v-17b57a38]{background:var(--color-hover-bg);border-radius:2px;padding:.0625rem .25rem;font-size:.625rem}.serp-preview[data-v-17b57a38]{background:#fff;border:1px solid #dadce0;border-radius:8px;margin-top:1rem;padding:.75rem}.serp-card[data-v-17b57a38]{font-family:Arial,sans-serif}.serp-url[data-v-17b57a38]{color:#202124;white-space:nowrap;text-overflow:ellipsis;margin-bottom:.125rem;font-size:.75rem;overflow:hidden}.serp-title[data-v-17b57a38]{color:#1a0dab;cursor:pointer;margin-bottom:.25rem;font-size:1.125rem;line-height:1.3}.serp-title[data-v-17b57a38]:hover{text-decoration:underline}.serp-desc[data-v-17b57a38]{color:#4d5156;font-size:.8125rem;line-height:1.4}.serp-noindex .serp-card[data-v-17b57a38]{opacity:.4}.serp-noindex-badge[data-v-17b57a38]{color:#b91c1c;align-items:center;gap:.375rem;margin-bottom:.5rem;font-size:.6875rem;font-weight:500;display:flex}.editor-panel h3[data-v-d4d3503b]{text-transform:uppercase;color:var(--color-muted);letter-spacing:.05em;margin:0;font-size:.75rem}.editor-header[data-v-d4d3503b]{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:.5rem;margin-bottom:1rem;display:flex}.editor-error[data-v-d4d3503b]{color:var(--color-danger-fg);text-align:center;flex-direction:column;align-items:center;gap:.5rem;padding-top:3rem;font-size:.875rem;display:flex}.editor-error .pi[data-v-d4d3503b]{font-size:2rem}.editor-error p[data-v-d4d3503b]{max-width:300px;line-height:1.5}.editor-empty[data-v-d4d3503b]{color:var(--color-muted);flex-direction:column;align-items:center;padding-top:3rem;font-size:.875rem;display:flex}.editor-fragment-link[data-v-d4d3503b]{color:var(--color-muted);flex-direction:column;align-items:center;gap:.5rem;padding-top:3rem;font-size:.875rem;display:flex}.editor-fragment-link .pi[data-v-d4d3503b]{opacity:.3;font-size:2rem}.fragment-go-link[data-v-d4d3503b]{color:var(--color-primary);cursor:pointer;font-weight:500}.fragment-go-link[data-v-d4d3503b]:hover{text-decoration:underline}.editor-container[data-v-d4d3503b]{font-size:.875rem}.editor-no-schema[data-v-d4d3503b]{color:var(--color-muted);font-size:.875rem}.preview-panel[data-v-ae9f4f7a]{flex-direction:column;height:100%;display:flex}.preview-panel.fullscreen[data-v-ae9f4f7a]{z-index:1000;background:#f8f8fa;position:fixed;inset:0}.preview-empty[data-v-ae9f4f7a]{color:#aaa;flex-direction:column;align-items:center;padding:3rem 1rem 1rem;font-size:.875rem;display:flex}.preview-toolbar[data-v-ae9f4f7a]{border-bottom:1px solid #e5e7eb;justify-content:space-between;align-items:center;padding:.375rem .5rem;display:flex}.preview-devices[data-v-ae9f4f7a],.preview-actions[data-v-ae9f4f7a]{align-items:center;gap:.25rem;display:flex}.device-btn[data-v-ae9f4f7a]{color:#9ca3af;cursor:pointer;background:0 0;border:1px solid #0000;border-radius:4px;padding:.25rem .5rem;font-size:.875rem}.device-btn[data-v-ae9f4f7a]:hover{color:#374151;border-color:#d1d5db}.device-btn.active[data-v-ae9f4f7a]{color:#a78bfa;border-color:#a78bfa}.host-page-select[data-v-ae9f4f7a]{color:#374151;cursor:pointer;background:#f3f4f6;border:1px solid #d1d5db;border-radius:4px;padding:.2rem .4rem;font-size:.75rem}.preview-separator[data-v-ae9f4f7a]{background:#d1d5db;width:1px;height:14px;margin-left:8px;margin-right:8px}.preview-route[data-v-ae9f4f7a]{color:#6b7280;background:#f3f4f6;border:1px solid #e5e7eb;border-radius:9999px;align-items:center;gap:6px;height:24px;padding:2px 10px;font-family:ui-monospace,monospace;font-size:12px;display:inline-flex}.preview-route .pi[data-v-ae9f4f7a]{color:#9ca3af;font-size:10px}.preview-frame-wrapper[data-v-ae9f4f7a]{background:#e5e7eb;flex:1;justify-content:center;display:flex;overflow:auto}.preview-iframe[data-v-ae9f4f7a]{background:#fff;border:0;flex:none;height:100%;transition:width .2s}.dark .preview-panel.fullscreen{background:#09090b}.dark .preview-toolbar{border-bottom-color:#27272a}.dark .device-btn{color:#71717a}.dark .device-btn:hover{color:#e4e4e7;border-color:#3f3f46}.dark .host-page-select{color:#e0e0e0;background:#1e1e2e;border-color:#3f3f46}.dark .preview-separator{background:#3f3f46}.dark .preview-route{color:#a1a1aa;background:#18181b;border-color:#27272a}.dark .preview-route .pi{color:#52525b}.dark .preview-frame-wrapper{background:#1a1a2e}.cms-editor[data-v-56c2e312]{height:calc(100% - 60px);display:flex}.cms-left[data-v-56c2e312]{border-right:1px solid #27272a;flex-shrink:0;width:250px;overflow:auto}.cms-left-wide[data-v-56c2e312]{width:55%;max-width:900px;overflow:hidden}.cms-splitter[data-v-56c2e312]{border:0;border-radius:0;height:100%}.cms-preview[data-v-56c2e312]{flex:1;min-width:0;overflow:hidden}.cms-panel[data-v-56c2e312]{overflow:auto}.cms-panel-content[data-v-56c2e312]{padding:1rem}.playground[data-v-9cdabe71]{height:calc(100% - 60px);display:flex}.playground-sidebar[data-v-9cdabe71]{border-right:1px solid #e5e7eb;flex-shrink:0;width:220px;padding:.75rem 0;overflow-y:auto}.sidebar-header[data-v-9cdabe71]{text-transform:uppercase;letter-spacing:.05em;color:#6b7280;margin-bottom:.75rem;padding:0 1rem;font-size:.75rem;font-weight:700}.sidebar-loading[data-v-9cdabe71]{color:#9ca3af;padding:1rem;font-size:.8125rem}.sidebar-section[data-v-9cdabe71]{margin-bottom:.5rem}.section-label[data-v-9cdabe71]{text-transform:uppercase;letter-spacing:.05em;color:#9ca3af;padding:.375rem 1rem;font-size:.625rem;font-weight:600}.section-label-toggle[data-v-9cdabe71]{cursor:pointer;-webkit-user-select:none;user-select:none;align-items:center;gap:.375rem;display:flex}.section-label-toggle[data-v-9cdabe71]:hover{color:#6b7280}.toggle-icon[data-v-9cdabe71]{font-size:.5rem}.sidebar-item[data-v-9cdabe71]{cursor:pointer;color:#6b7280;align-items:center;gap:.5rem;padding:.3125rem 1rem;font-size:.8125rem;display:flex}.sidebar-item[data-v-9cdabe71]:hover{color:#374151;background:#80808014}.sidebar-item.active[data-v-9cdabe71]{color:#667eea;background:#667eea1a}.item-icon[data-v-9cdabe71]{text-align:center;flex-shrink:0;width:14px;font-size:.6875rem}.item-name[data-v-9cdabe71]{white-space:nowrap;text-overflow:ellipsis;flex:1;overflow:hidden}.sidebar-empty[data-v-9cdabe71]{color:#9ca3af;padding:1.5rem 1rem;font-size:.8125rem;line-height:1.6}.sidebar-empty .hint[data-v-9cdabe71]{margin-top:.75rem}.sidebar-empty code[data-v-9cdabe71]{background:#8080801a;border-radius:3px;padding:1px 4px;font-family:monospace;font-size:.75rem}.playground-main[data-v-9cdabe71]{flex-direction:column;flex:1;display:flex;overflow:hidden}.main-empty[data-v-9cdabe71]{color:#9ca3af;flex-direction:column;justify-content:center;align-items:center;height:100%;font-size:.875rem;display:flex}.main-toolbar[data-v-9cdabe71]{border-bottom:1px solid #e5e7eb;flex-shrink:0;align-items:center;gap:.75rem;padding:.5rem 1rem;font-size:.8125rem;display:flex}.toolbar-label[data-v-9cdabe71]{color:#6b7280;flex:1;align-items:baseline;gap:.5rem;display:flex}.toolbar-type[data-v-9cdabe71]{text-transform:uppercase;letter-spacing:.03em;font-size:.6875rem}.toolbar-label strong[data-v-9cdabe71]{color:#374151;font-size:.875rem}.toolbar-hint[data-v-9cdabe71]{color:#9ca3af;font-size:.6875rem;font-style:italic}.toolbar-btn[data-v-9cdabe71]{color:#6b7280;cursor:pointer;white-space:nowrap;background:0 0;border:1px solid #e5e7eb;border-radius:6px;align-items:center;gap:.375rem;padding:.25rem .625rem;font-size:.75rem;display:flex}.toolbar-btn[data-v-9cdabe71]:hover{color:#374151;background:#80808014}.main-body[data-v-9cdabe71]{flex:1;display:flex;overflow:hidden}.main-content[data-v-9cdabe71]{flex:1;min-width:0;padding:1.5rem;overflow-y:auto}.mount-container[data-v-9cdabe71]{max-width:600px}.mount-error[data-v-9cdabe71]{color:#dc2626;background:#dc262614;border-radius:6px;margin-bottom:1rem;padding:.75rem;font-size:.8125rem}.value-inspector[data-v-9cdabe71]{border-left:1px solid #e5e7eb;flex-direction:column;flex:1;min-width:0;display:flex;overflow-y:auto}.inspector-header[data-v-9cdabe71]{text-transform:uppercase;letter-spacing:.05em;color:#9ca3af;border-bottom:1px solid #e5e7eb;flex-shrink:0;padding:.5rem .75rem;font-size:.625rem;font-weight:600}.inspector-value[data-v-9cdabe71]{color:#374151;white-space:pre-wrap;word-break:break-word;flex:1;margin:0;padding:.75rem;font-family:JetBrains Mono,Fira Code,monospace;font-size:.75rem;line-height:1.7}.inspector-value .jv-key[data-v-9cdabe71]{color:#6b7280}.inspector-value .jv-str[data-v-9cdabe71]{color:#16a34a}.inspector-value .jv-num[data-v-9cdabe71]{color:#d97706}.inspector-value .jv-bool[data-v-9cdabe71]{color:#7c3aed}.inspector-value .jv-null[data-v-9cdabe71]{color:#9ca3af}.dark .playground .playground-sidebar{border-right-color:#27272a}.dark .playground .sidebar-header{color:#666}.dark .playground .section-label{color:#555}.dark .playground .section-label-toggle:hover{color:#999}.dark .playground .sidebar-item{color:#bbb}.dark .playground .sidebar-item:hover{color:#e4e4e7;background:#ffffff0d}.dark .playground .sidebar-item.active{color:#667eea;background:#667eea26}.dark .playground .main-toolbar{border-bottom-color:#27272a}.dark .playground .toolbar-label{color:#999}.dark .playground .toolbar-label strong{color:#e4e4e7}.dark .playground .toolbar-hint{color:#555}.dark .playground .toolbar-btn{color:#999;border-color:#333}.dark .playground .toolbar-btn:hover{color:#e4e4e7;background:#ffffff0d}.dark .playground .mount-error{color:#f87171;background:#f8717114}.dark .playground .value-inspector{background:#0c0c14;border-left-color:#27272a}.dark .playground .inspector-header{color:#666;border-bottom-color:#27272a}.dark .playground .inspector-value{color:#e4e4e7}.dark .playground .inspector-value .jv-key{color:#8888a0}.dark .playground .inspector-value .jv-str{color:#4ade80}.dark .playground .inspector-value .jv-num{color:#fbbf24}.dark .playground .inspector-value .jv-bool{color:#a78bfa}.dark .playground .inspector-value .jv-null{color:#52525b}:root{--color-bg:var(--p-content-background);--color-fg:var(--p-text-color);--color-muted:var(--p-text-muted-color);--color-border:var(--p-content-border-color);--color-hover-bg:var(--p-content-hover-background);--color-input-bg:var(--p-form-field-background);--color-input-border:var(--p-form-field-border-color);--color-primary:var(--p-primary-color);--color-danger-bg:var(--p-red-50);--color-danger-fg:var(--p-red-700);--color-success-bg:var(--p-green-50);--color-success-fg:var(--p-green-700);--color-warning-bg:var(--p-amber-50);--color-warning-fg:var(--p-amber-900);--color-info-bg:var(--p-blue-50);--color-info-fg:var(--p-blue-900);--color-env-prod-bg:var(--p-red-100);--color-env-prod-fg:var(--p-red-800);--color-env-staging-bg:var(--p-amber-100);--color-env-staging-fg:var(--p-amber-800);--color-change-added:var(--p-green-700);--color-change-modified:var(--p-amber-700);--color-change-deleted:var(--p-gray-500);--color-bg-code:var(--p-surface-100);--color-bg-chip:var(--p-content-hover-background)}.dark{--color-danger-bg:var(--p-red-950);--color-danger-fg:var(--p-red-300);--color-success-bg:var(--p-green-950);--color-success-fg:var(--p-green-400);--color-warning-bg:var(--p-amber-950);--color-warning-fg:var(--p-amber-300);--color-info-bg:var(--p-blue-950);--color-info-fg:var(--p-blue-300);--color-env-prod-bg:var(--p-red-950);--color-env-prod-fg:var(--p-red-300);--color-env-staging-bg:var(--p-amber-950);--color-env-staging-fg:var(--p-amber-300);--color-change-added:var(--p-green-400);--color-change-modified:var(--p-amber-400);--color-change-deleted:var(--p-gray-400);--color-bg-code:var(--p-surface-900)}
|