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.
Files changed (340) hide show
  1. package/admin-dist/assets/index-BO9-CXmW.css +1 -0
  2. package/admin-dist/assets/index-Ufu8zZH_.js +668 -0
  3. package/admin-dist/index.html +2 -2
  4. package/dist/admin-api/error-response.d.ts +21 -0
  5. package/dist/admin-api/error-response.d.ts.map +1 -0
  6. package/dist/admin-api/error-response.js +12 -0
  7. package/dist/admin-api/error-response.js.map +1 -0
  8. package/dist/admin-api/index.d.ts +0 -2
  9. package/dist/admin-api/index.d.ts.map +1 -1
  10. package/dist/admin-api/index.js +4 -24
  11. package/dist/admin-api/index.js.map +1 -1
  12. package/dist/admin-api/routes/assets.d.ts +16 -0
  13. package/dist/admin-api/routes/assets.d.ts.map +1 -0
  14. package/dist/admin-api/routes/assets.js +433 -0
  15. package/dist/admin-api/routes/assets.js.map +1 -0
  16. package/dist/admin-api/routes/fragments.d.ts.map +1 -1
  17. package/dist/admin-api/routes/fragments.js +30 -4
  18. package/dist/admin-api/routes/fragments.js.map +1 -1
  19. package/dist/admin-api/routes/pages.d.ts.map +1 -1
  20. package/dist/admin-api/routes/pages.js +37 -4
  21. package/dist/admin-api/routes/pages.js.map +1 -1
  22. package/dist/admin-api/routes/publish.d.ts.map +1 -1
  23. package/dist/admin-api/routes/publish.js +68 -35
  24. package/dist/admin-api/routes/publish.js.map +1 -1
  25. package/dist/admin-api/schemas/assets.d.ts +48 -0
  26. package/dist/admin-api/schemas/assets.d.ts.map +1 -0
  27. package/dist/admin-api/schemas/assets.js +44 -0
  28. package/dist/admin-api/schemas/assets.js.map +1 -0
  29. package/dist/admin-api/schemas/index.d.ts +2 -0
  30. package/dist/admin-api/schemas/index.d.ts.map +1 -1
  31. package/dist/admin-api/schemas/index.js +2 -0
  32. package/dist/admin-api/schemas/index.js.map +1 -1
  33. package/dist/admin-api/source-context.d.ts +0 -7
  34. package/dist/admin-api/source-context.d.ts.map +1 -1
  35. package/dist/admin-api/source-context.js +0 -3
  36. package/dist/admin-api/source-context.js.map +1 -1
  37. package/dist/assets/analyze-audio.d.ts +3 -0
  38. package/dist/assets/analyze-audio.d.ts.map +1 -0
  39. package/dist/assets/analyze-audio.js +80 -0
  40. package/dist/assets/analyze-audio.js.map +1 -0
  41. package/dist/assets/analyze-image.d.ts +19 -0
  42. package/dist/assets/analyze-image.d.ts.map +1 -0
  43. package/dist/assets/analyze-image.js +123 -0
  44. package/dist/assets/analyze-image.js.map +1 -0
  45. package/dist/assets/analyze.d.ts +94 -0
  46. package/dist/assets/analyze.d.ts.map +1 -0
  47. package/dist/assets/analyze.js +45 -0
  48. package/dist/assets/analyze.js.map +1 -0
  49. package/dist/assets/asset-deps.d.ts +30 -0
  50. package/dist/assets/asset-deps.d.ts.map +1 -0
  51. package/dist/assets/asset-deps.js +42 -0
  52. package/dist/assets/asset-deps.js.map +1 -0
  53. package/dist/assets/asset-paths.d.ts +155 -0
  54. package/dist/assets/asset-paths.d.ts.map +1 -0
  55. package/dist/assets/asset-paths.js +197 -0
  56. package/dist/assets/asset-paths.js.map +1 -0
  57. package/dist/assets/delete.d.ts +75 -0
  58. package/dist/assets/delete.d.ts.map +1 -0
  59. package/dist/assets/delete.js +82 -0
  60. package/dist/assets/delete.js.map +1 -0
  61. package/dist/assets/errors.d.ts +241 -0
  62. package/dist/assets/errors.d.ts.map +1 -0
  63. package/dist/assets/errors.js +300 -0
  64. package/dist/assets/errors.js.map +1 -0
  65. package/dist/assets/find-refs.d.ts +37 -0
  66. package/dist/assets/find-refs.d.ts.map +1 -0
  67. package/dist/assets/find-refs.js +35 -0
  68. package/dist/assets/find-refs.js.map +1 -0
  69. package/dist/assets/hash.d.ts +13 -0
  70. package/dist/assets/hash.d.ts.map +1 -0
  71. package/dist/assets/hash.js +43 -0
  72. package/dist/assets/hash.js.map +1 -0
  73. package/dist/assets/image-metadata.d.ts +11 -0
  74. package/dist/assets/image-metadata.d.ts.map +1 -0
  75. package/dist/assets/image-metadata.js +31 -0
  76. package/dist/assets/image-metadata.js.map +1 -0
  77. package/dist/assets/ingest-locale.d.ts +86 -0
  78. package/dist/assets/ingest-locale.d.ts.map +1 -0
  79. package/dist/assets/ingest-locale.js +209 -0
  80. package/dist/assets/ingest-locale.js.map +1 -0
  81. package/dist/assets/ingest.d.ts +96 -0
  82. package/dist/assets/ingest.d.ts.map +1 -0
  83. package/dist/assets/ingest.js +308 -0
  84. package/dist/assets/ingest.js.map +1 -0
  85. package/dist/assets/kind-compat.d.ts +34 -0
  86. package/dist/assets/kind-compat.d.ts.map +1 -0
  87. package/dist/assets/kind-compat.js +33 -0
  88. package/dist/assets/kind-compat.js.map +1 -0
  89. package/dist/assets/list.d.ts +46 -0
  90. package/dist/assets/list.d.ts.map +1 -0
  91. package/dist/assets/list.js +102 -0
  92. package/dist/assets/list.js.map +1 -0
  93. package/dist/assets/manifest-default.d.ts +56 -0
  94. package/dist/assets/manifest-default.d.ts.map +1 -0
  95. package/dist/assets/manifest-default.js +120 -0
  96. package/dist/assets/manifest-default.js.map +1 -0
  97. package/dist/assets/manifest-filename.d.ts +52 -0
  98. package/dist/assets/manifest-filename.d.ts.map +1 -0
  99. package/dist/assets/manifest-filename.js +104 -0
  100. package/dist/assets/manifest-filename.js.map +1 -0
  101. package/dist/assets/manifest-locale.d.ts +60 -0
  102. package/dist/assets/manifest-locale.d.ts.map +1 -0
  103. package/dist/assets/manifest-locale.js +206 -0
  104. package/dist/assets/manifest-locale.js.map +1 -0
  105. package/dist/assets/manifest-merge.d.ts +66 -0
  106. package/dist/assets/manifest-merge.d.ts.map +1 -0
  107. package/dist/assets/manifest-merge.js +82 -0
  108. package/dist/assets/manifest-merge.js.map +1 -0
  109. package/dist/assets/manifest.d.ts +83 -0
  110. package/dist/assets/manifest.d.ts.map +1 -0
  111. package/dist/assets/manifest.js +93 -0
  112. package/dist/assets/manifest.js.map +1 -0
  113. package/dist/assets/mime-sniff.d.ts +18 -0
  114. package/dist/assets/mime-sniff.d.ts.map +1 -0
  115. package/dist/assets/mime-sniff.js +84 -0
  116. package/dist/assets/mime-sniff.js.map +1 -0
  117. package/dist/assets/preprocess-svg.d.ts +3 -0
  118. package/dist/assets/preprocess-svg.d.ts.map +1 -0
  119. package/dist/assets/preprocess-svg.js +49 -0
  120. package/dist/assets/preprocess-svg.js.map +1 -0
  121. package/dist/assets/preprocess.d.ts +62 -0
  122. package/dist/assets/preprocess.d.ts.map +1 -0
  123. package/dist/assets/preprocess.js +86 -0
  124. package/dist/assets/preprocess.js.map +1 -0
  125. package/dist/assets/publish-plan.d.ts +41 -0
  126. package/dist/assets/publish-plan.d.ts.map +1 -0
  127. package/dist/assets/publish-plan.js +49 -0
  128. package/dist/assets/publish-plan.js.map +1 -0
  129. package/dist/assets/publish.d.ts +33 -0
  130. package/dist/assets/publish.d.ts.map +1 -0
  131. package/dist/assets/publish.js +81 -0
  132. package/dist/assets/publish.js.map +1 -0
  133. package/dist/assets/refs.d.ts +37 -0
  134. package/dist/assets/refs.d.ts.map +1 -0
  135. package/dist/assets/refs.js +33 -0
  136. package/dist/assets/refs.js.map +1 -0
  137. package/dist/assets/remove-override.d.ts +42 -0
  138. package/dist/assets/remove-override.d.ts.map +1 -0
  139. package/dist/assets/remove-override.js +53 -0
  140. package/dist/assets/remove-override.js.map +1 -0
  141. package/dist/assets/rename.d.ts +43 -0
  142. package/dist/assets/rename.d.ts.map +1 -0
  143. package/dist/assets/rename.js +271 -0
  144. package/dist/assets/rename.js.map +1 -0
  145. package/dist/assets/replace.d.ts +37 -0
  146. package/dist/assets/replace.d.ts.map +1 -0
  147. package/dist/assets/replace.js +195 -0
  148. package/dist/assets/replace.js.map +1 -0
  149. package/dist/assets/resolve.d.ts +141 -0
  150. package/dist/assets/resolve.d.ts.map +1 -0
  151. package/dist/assets/resolve.js +381 -0
  152. package/dist/assets/resolve.js.map +1 -0
  153. package/dist/assets/rewrite-manifest-asset-ref.d.ts +44 -0
  154. package/dist/assets/rewrite-manifest-asset-ref.d.ts.map +1 -0
  155. package/dist/assets/rewrite-manifest-asset-ref.js +51 -0
  156. package/dist/assets/rewrite-manifest-asset-ref.js.map +1 -0
  157. package/dist/assets/scan-manifest-for-asset.d.ts +63 -0
  158. package/dist/assets/scan-manifest-for-asset.d.ts.map +1 -0
  159. package/dist/assets/scan-manifest-for-asset.js +105 -0
  160. package/dist/assets/scan-manifest-for-asset.js.map +1 -0
  161. package/dist/assets/serve-route.d.ts +45 -0
  162. package/dist/assets/serve-route.d.ts.map +1 -0
  163. package/dist/assets/serve-route.js +123 -0
  164. package/dist/assets/serve-route.js.map +1 -0
  165. package/dist/assets/svg-sanitize.d.ts +38 -0
  166. package/dist/assets/svg-sanitize.d.ts.map +1 -0
  167. package/dist/assets/svg-sanitize.js +209 -0
  168. package/dist/assets/svg-sanitize.js.map +1 -0
  169. package/dist/assets/update-metadata.d.ts +61 -0
  170. package/dist/assets/update-metadata.d.ts.map +1 -0
  171. package/dist/assets/update-metadata.js +82 -0
  172. package/dist/assets/update-metadata.js.map +1 -0
  173. package/dist/assets/url.d.ts +82 -0
  174. package/dist/assets/url.d.ts.map +1 -0
  175. package/dist/assets/url.js +103 -0
  176. package/dist/assets/url.js.map +1 -0
  177. package/dist/assets/validate.d.ts +74 -0
  178. package/dist/assets/validate.d.ts.map +1 -0
  179. package/dist/assets/validate.js +136 -0
  180. package/dist/assets/validate.js.map +1 -0
  181. package/dist/assets/variants.d.ts +23 -0
  182. package/dist/assets/variants.d.ts.map +1 -0
  183. package/dist/assets/variants.js +74 -0
  184. package/dist/assets/variants.js.map +1 -0
  185. package/dist/cli/assets-cli.d.ts +58 -0
  186. package/dist/cli/assets-cli.d.ts.map +1 -0
  187. package/dist/cli/assets-cli.js +233 -0
  188. package/dist/cli/assets-cli.js.map +1 -0
  189. package/dist/cli/assets-display.d.ts +112 -0
  190. package/dist/cli/assets-display.d.ts.map +1 -0
  191. package/dist/cli/assets-display.js +106 -0
  192. package/dist/cli/assets-display.js.map +1 -0
  193. package/dist/cli/bootstrap.d.ts +0 -2
  194. package/dist/cli/bootstrap.d.ts.map +1 -1
  195. package/dist/cli/bootstrap.js +0 -1
  196. package/dist/cli/bootstrap.js.map +1 -1
  197. package/dist/cli/index.js +64 -18
  198. package/dist/cli/index.js.map +1 -1
  199. package/dist/compare.d.ts.map +1 -1
  200. package/dist/compare.js +15 -12
  201. package/dist/compare.js.map +1 -1
  202. package/dist/dep-sidecars.d.ts +127 -0
  203. package/dist/dep-sidecars.d.ts.map +1 -0
  204. package/dist/dep-sidecars.js +122 -0
  205. package/dist/dep-sidecars.js.map +1 -0
  206. package/dist/editor/AssetEmbeddedWidget.d.ts +3 -0
  207. package/dist/editor/AssetEmbeddedWidget.d.ts.map +1 -0
  208. package/dist/editor/AssetEmbeddedWidget.js +146 -0
  209. package/dist/editor/AssetEmbeddedWidget.js.map +1 -0
  210. package/dist/editor/mount.d.ts +12 -1
  211. package/dist/editor/mount.d.ts.map +1 -1
  212. package/dist/editor/mount.js +36 -5
  213. package/dist/editor/mount.js.map +1 -1
  214. package/dist/format.d.ts +44 -0
  215. package/dist/format.d.ts.map +1 -0
  216. package/dist/format.js +65 -0
  217. package/dist/format.js.map +1 -0
  218. package/dist/fragment-deps.d.ts +24 -0
  219. package/dist/fragment-deps.d.ts.map +1 -0
  220. package/dist/fragment-deps.js +20 -0
  221. package/dist/fragment-deps.js.map +1 -0
  222. package/dist/hash.d.ts +0 -6
  223. package/dist/hash.d.ts.map +1 -1
  224. package/dist/hash.js +0 -18
  225. package/dist/hash.js.map +1 -1
  226. package/dist/history-provider.d.ts.map +1 -1
  227. package/dist/history-provider.js +30 -8
  228. package/dist/history-provider.js.map +1 -1
  229. package/dist/history-recorder.d.ts +7 -3
  230. package/dist/history-recorder.d.ts.map +1 -1
  231. package/dist/history-recorder.js +9 -1
  232. package/dist/history-recorder.js.map +1 -1
  233. package/dist/history-restorer.d.ts.map +1 -1
  234. package/dist/history-restorer.js +34 -2
  235. package/dist/history-restorer.js.map +1 -1
  236. package/dist/history.d.ts +26 -8
  237. package/dist/history.d.ts.map +1 -1
  238. package/dist/index.d.ts +2 -4
  239. package/dist/index.d.ts.map +1 -1
  240. package/dist/index.js +1 -2
  241. package/dist/index.js.map +1 -1
  242. package/dist/locale.d.ts +20 -0
  243. package/dist/locale.d.ts.map +1 -1
  244. package/dist/locale.js +38 -0
  245. package/dist/locale.js.map +1 -1
  246. package/dist/providers/_atomic-write.d.ts +9 -0
  247. package/dist/providers/_atomic-write.d.ts.map +1 -0
  248. package/dist/providers/_atomic-write.js +72 -0
  249. package/dist/providers/_atomic-write.js.map +1 -0
  250. package/dist/providers/_rm-ignore-missing.d.ts +31 -0
  251. package/dist/providers/_rm-ignore-missing.d.ts.map +1 -0
  252. package/dist/providers/_rm-ignore-missing.js +12 -0
  253. package/dist/providers/_rm-ignore-missing.js.map +1 -0
  254. package/dist/providers/_stream-interop.d.ts +23 -0
  255. package/dist/providers/_stream-interop.d.ts.map +1 -0
  256. package/dist/providers/_stream-interop.js +21 -0
  257. package/dist/providers/_stream-interop.js.map +1 -0
  258. package/dist/providers/azure-blob.d.ts.map +1 -1
  259. package/dist/providers/azure-blob.js +60 -0
  260. package/dist/providers/azure-blob.js.map +1 -1
  261. package/dist/providers/filesystem.d.ts +4 -0
  262. package/dist/providers/filesystem.d.ts.map +1 -1
  263. package/dist/providers/filesystem.js +63 -2
  264. package/dist/providers/filesystem.js.map +1 -1
  265. package/dist/providers/s3.d.ts.map +1 -1
  266. package/dist/providers/s3.js +84 -1
  267. package/dist/providers/s3.js.map +1 -1
  268. package/dist/publish-rendered.d.ts +37 -17
  269. package/dist/publish-rendered.d.ts.map +1 -1
  270. package/dist/publish-rendered.js +71 -67
  271. package/dist/publish-rendered.js.map +1 -1
  272. package/dist/publish.d.ts +13 -12
  273. package/dist/publish.d.ts.map +1 -1
  274. package/dist/publish.js +23 -47
  275. package/dist/publish.js.map +1 -1
  276. package/dist/resolver.d.ts +12 -2
  277. package/dist/resolver.d.ts.map +1 -1
  278. package/dist/resolver.js +54 -9
  279. package/dist/resolver.js.map +1 -1
  280. package/dist/schema/dimensions.d.ts +78 -0
  281. package/dist/schema/dimensions.d.ts.map +1 -0
  282. package/dist/schema/dimensions.js +97 -0
  283. package/dist/schema/dimensions.js.map +1 -0
  284. package/dist/schema/helpers.d.ts +108 -0
  285. package/dist/schema/helpers.d.ts.map +1 -0
  286. package/dist/schema/helpers.js +133 -0
  287. package/dist/schema/helpers.js.map +1 -0
  288. package/dist/schema/index.d.ts +27 -0
  289. package/dist/schema/index.d.ts.map +1 -0
  290. package/dist/schema/index.js +25 -0
  291. package/dist/schema/index.js.map +1 -0
  292. package/dist/schema/types.d.ts +390 -0
  293. package/dist/schema/types.d.ts.map +1 -0
  294. package/dist/schema/types.js +25 -0
  295. package/dist/schema/types.js.map +1 -0
  296. package/dist/selector-chain.d.ts +63 -0
  297. package/dist/selector-chain.d.ts.map +1 -0
  298. package/dist/selector-chain.js +58 -0
  299. package/dist/selector-chain.js.map +1 -0
  300. package/dist/sidecars.d.ts +19 -18
  301. package/dist/sidecars.d.ts.map +1 -1
  302. package/dist/sidecars.js +70 -62
  303. package/dist/sidecars.js.map +1 -1
  304. package/dist/targets.d.ts.map +1 -1
  305. package/dist/targets.js +15 -37
  306. package/dist/targets.js.map +1 -1
  307. package/dist/themes.d.ts +69 -0
  308. package/dist/themes.d.ts.map +1 -0
  309. package/dist/themes.js +85 -0
  310. package/dist/themes.js.map +1 -0
  311. package/dist/transforms/adapter.d.ts +115 -0
  312. package/dist/transforms/adapter.d.ts.map +1 -0
  313. package/dist/transforms/adapter.js +2 -0
  314. package/dist/transforms/adapter.js.map +1 -0
  315. package/dist/transforms/cloudflare.d.ts +17 -0
  316. package/dist/transforms/cloudflare.d.ts.map +1 -0
  317. package/dist/transforms/cloudflare.js +110 -0
  318. package/dist/transforms/cloudflare.js.map +1 -0
  319. package/dist/transforms/index.d.ts +24 -0
  320. package/dist/transforms/index.d.ts.map +1 -0
  321. package/dist/transforms/index.js +30 -0
  322. package/dist/transforms/index.js.map +1 -0
  323. package/dist/transforms/sharp.d.ts +3 -0
  324. package/dist/transforms/sharp.d.ts.map +1 -0
  325. package/dist/transforms/sharp.js +43 -0
  326. package/dist/transforms/sharp.js.map +1 -0
  327. package/dist/types.d.ts +125 -1
  328. package/dist/types.d.ts.map +1 -1
  329. package/dist/types.js.map +1 -1
  330. package/package.json +20 -1
  331. package/admin-dist/assets/index-B6pVot0Y.css +0 -1
  332. package/admin-dist/assets/index-DniLwxJA.js +0 -609
  333. package/dist/providers/r2.d.ts +0 -8
  334. package/dist/providers/r2.d.ts.map +0 -1
  335. package/dist/providers/r2.js +0 -86
  336. package/dist/providers/r2.js.map +0 -1
  337. package/dist/source-sidecars.d.ts +0 -32
  338. package/dist/source-sidecars.d.ts.map +0 -1
  339. package/dist/source-sidecars.js +0 -98
  340. package/dist/source-sidecars.js.map +0 -1
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=adapter.js.map
@@ -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,3 @@
1
+ import type { TransformAdapter } from './adapter.js';
2
+ export declare const sharpAdapter: TransformAdapter;
3
+ //# sourceMappingURL=sharp.d.ts.map
@@ -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
- /** Storage abstraction — filesystem, S3, Azure Blob, etc. */
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 {
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAqNA,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"}
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.6.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)}