@farm.js/core 0.1.0-beta.22 → 0.1.0-beta.23

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 (132) hide show
  1. package/dist/agent-runtime.d.mts +2 -1
  2. package/dist/agent-runtime.d.ts +2 -1
  3. package/dist/{app-BB8GCH1g.d.ts → app-CTFnOJaI.d.ts} +5 -3
  4. package/dist/{app-DwsTpyNZ.d.mts → app-DA6ospIq.d.mts} +5 -3
  5. package/dist/app-markdown.d.mts +2 -1
  6. package/dist/app-markdown.d.ts +2 -1
  7. package/dist/chunk-4IVNW5QD.mjs +82 -0
  8. package/dist/chunk-4IVNW5QD.mjs.map +1 -0
  9. package/dist/{chunk-DAUR3WUZ.mjs → chunk-5NOVWCFL.mjs} +2 -2
  10. package/dist/chunk-5NOVWCFL.mjs.map +1 -0
  11. package/dist/chunk-D42BNPZH.mjs +79 -0
  12. package/dist/chunk-D42BNPZH.mjs.map +1 -0
  13. package/dist/{chunk-LLPN5SEZ.mjs → chunk-DVPRBMU2.mjs} +2 -2
  14. package/dist/{chunk-ZP73P4VR.mjs → chunk-FJGTYLCO.mjs} +67 -20
  15. package/dist/chunk-FJGTYLCO.mjs.map +1 -0
  16. package/dist/chunk-GQVQESLY.mjs +25 -0
  17. package/dist/chunk-GQVQESLY.mjs.map +1 -0
  18. package/dist/chunk-H53KVQUU.mjs +48 -0
  19. package/dist/chunk-H53KVQUU.mjs.map +1 -0
  20. package/dist/chunk-HCGQYYHI.mjs +1 -0
  21. package/dist/chunk-HCGQYYHI.mjs.map +1 -0
  22. package/dist/{chunk-UCYWGN2P.mjs → chunk-OHNSROHS.mjs} +1 -1
  23. package/dist/{chunk-FRPWCMMG.mjs → chunk-SBWOTAX4.mjs} +63 -2
  24. package/dist/chunk-SBWOTAX4.mjs.map +1 -0
  25. package/dist/{chunk-XBKXKJX5.mjs → chunk-TX54PXAJ.mjs} +81 -25
  26. package/dist/chunk-TX54PXAJ.mjs.map +1 -0
  27. package/dist/{chunk-CEVMYGDL.mjs → chunk-YD5IRKVS.mjs} +13 -9
  28. package/dist/chunk-YD5IRKVS.mjs.map +1 -0
  29. package/dist/{client-plugins-QQntVkrv.d.mts → client-plugins-CCilIb_G.d.mts} +6 -2
  30. package/dist/{client-plugins-CbRum1fj.d.ts → client-plugins-DuuleQKk.d.ts} +6 -2
  31. package/dist/client-plugins.d.mts +2 -1
  32. package/dist/client-plugins.d.ts +2 -1
  33. package/dist/client.cjs +122 -35
  34. package/dist/client.cjs.map +1 -1
  35. package/dist/client.d.mts +2 -0
  36. package/dist/client.d.ts +2 -0
  37. package/dist/client.mjs +13 -2
  38. package/dist/config.d.mts +2 -1
  39. package/dist/config.d.ts +2 -1
  40. package/dist/{devtools-52FYXIEK.mjs → devtools-326RBQCN.mjs} +7 -6
  41. package/dist/{devtools-52FYXIEK.mjs.map → devtools-326RBQCN.mjs.map} +1 -1
  42. package/dist/docs.cjs.map +1 -1
  43. package/dist/docs.mjs +6 -5
  44. package/dist/index.cjs +431 -55
  45. package/dist/index.cjs.map +1 -1
  46. package/dist/index.d.mts +10 -7
  47. package/dist/index.d.ts +10 -7
  48. package/dist/index.mjs +66 -49
  49. package/dist/index.mjs.map +1 -1
  50. package/dist/integrations.d.mts +2 -1
  51. package/dist/integrations.d.ts +2 -1
  52. package/dist/internal/build-runtime.cjs +337 -34
  53. package/dist/internal/build-runtime.cjs.map +1 -1
  54. package/dist/internal/build-runtime.d.mts +4 -3
  55. package/dist/internal/build-runtime.d.ts +4 -3
  56. package/dist/internal/build-runtime.mjs +15 -12
  57. package/dist/internal/config-runtime.cjs +41 -0
  58. package/dist/internal/config-runtime.cjs.map +1 -1
  59. package/dist/internal/config-runtime.d.mts +3 -2
  60. package/dist/internal/config-runtime.d.ts +3 -2
  61. package/dist/internal/config-runtime.mjs +5 -4
  62. package/dist/internal/production-runtime.cjs +178 -0
  63. package/dist/internal/production-runtime.cjs.map +1 -1
  64. package/dist/internal/production-runtime.d.mts +20 -6
  65. package/dist/internal/production-runtime.d.ts +20 -6
  66. package/dist/internal/production-runtime.mjs +13 -1
  67. package/dist/internal/production-runtime.mjs.map +1 -1
  68. package/dist/{metadata-B5jBJHq1.d.ts → metadata-DyPRG0wX.d.ts} +1 -1
  69. package/dist/{metadata-BxOJ4FJl.d.mts → metadata-_GHcAySx.d.mts} +1 -1
  70. package/dist/middleware.d.mts +4 -3
  71. package/dist/middleware.d.ts +4 -3
  72. package/dist/plugin.cjs +219 -14
  73. package/dist/plugin.cjs.map +1 -1
  74. package/dist/plugin.d.mts +2 -1
  75. package/dist/plugin.d.ts +2 -1
  76. package/dist/plugin.mjs +11 -8
  77. package/dist/{production-runtime-Bxua86uR.d.mts → production-runtime-C4cO3esK.d.mts} +1 -1
  78. package/dist/{production-runtime-CZqXjRVi.d.ts → production-runtime-DrEy8kBO.d.ts} +1 -1
  79. package/dist/{request-7V0GaZK_.d.mts → request-B2PpOxYK.d.mts} +1 -1
  80. package/dist/{request-B5XYBv5a.d.ts → request-D40lt6aN.d.ts} +1 -1
  81. package/dist/request.d.mts +3 -2
  82. package/dist/request.d.ts +3 -2
  83. package/dist/routes.d.mts +2 -1
  84. package/dist/routes.d.ts +2 -1
  85. package/dist/server-plugins.d.mts +3 -2
  86. package/dist/server-plugins.d.ts +3 -2
  87. package/dist/server.cjs +241 -19
  88. package/dist/server.cjs.map +1 -1
  89. package/dist/server.d.mts +8 -6
  90. package/dist/server.d.ts +8 -6
  91. package/dist/server.mjs +20 -11
  92. package/dist/server.mjs.map +1 -1
  93. package/dist/testing.d.mts +2 -1
  94. package/dist/testing.d.ts +2 -1
  95. package/dist/theme/client.cjs +115 -0
  96. package/dist/theme/client.cjs.map +1 -0
  97. package/dist/theme/client.d.mts +17 -0
  98. package/dist/theme/client.d.ts +17 -0
  99. package/dist/theme/client.mjs +16 -0
  100. package/dist/theme/client.mjs.map +1 -0
  101. package/dist/theme/index.cjs +71 -0
  102. package/dist/theme/index.cjs.map +1 -0
  103. package/dist/theme/index.d.mts +6 -0
  104. package/dist/theme/index.d.ts +6 -0
  105. package/dist/theme/index.mjs +9 -0
  106. package/dist/theme/index.mjs.map +1 -0
  107. package/dist/theme/server.cjs +191 -0
  108. package/dist/theme/server.cjs.map +1 -0
  109. package/dist/theme/server.d.mts +8 -0
  110. package/dist/theme/server.d.ts +8 -0
  111. package/dist/theme/server.mjs +18 -0
  112. package/dist/theme/server.mjs.map +1 -0
  113. package/dist/types-CsR8fpgF.d.mts +30 -0
  114. package/dist/types-CsR8fpgF.d.ts +30 -0
  115. package/dist/{utils-xTFxzu47.d.ts → utils-3sQgfkya.d.ts} +1 -1
  116. package/dist/{utils-s9pN0Yep.d.mts → utils-Bop7bly-.d.mts} +1 -1
  117. package/dist/version.cjs +1 -1
  118. package/dist/version.cjs.map +1 -1
  119. package/dist/version.mjs +1 -1
  120. package/dist/vite.cjs +242 -15
  121. package/dist/vite.cjs.map +1 -1
  122. package/dist/vite.d.mts +2 -1
  123. package/dist/vite.d.ts +2 -1
  124. package/dist/vite.mjs +11 -8
  125. package/package.json +25 -1
  126. package/dist/chunk-CEVMYGDL.mjs.map +0 -1
  127. package/dist/chunk-DAUR3WUZ.mjs.map +0 -1
  128. package/dist/chunk-FRPWCMMG.mjs.map +0 -1
  129. package/dist/chunk-XBKXKJX5.mjs.map +0 -1
  130. package/dist/chunk-ZP73P4VR.mjs.map +0 -1
  131. /package/dist/{chunk-LLPN5SEZ.mjs.map → chunk-DVPRBMU2.mjs.map} +0 -0
  132. /package/dist/{chunk-UCYWGN2P.mjs.map → chunk-OHNSROHS.mjs.map} +0 -0
@@ -0,0 +1,25 @@
1
+ import {
2
+ __name
3
+ } from "./chunk-CGILA3WO.mjs";
4
+
5
+ // src/theme/bridge.ts
6
+ var FALLBACK_SERVER_SNAPSHOT = Object.freeze({
7
+ theme: "system",
8
+ resolvedTheme: void 0,
9
+ mounted: false
10
+ });
11
+ var FARM_THEME_SERVER_SNAPSHOT_RESOLVER = /* @__PURE__ */ Symbol.for("farm.js.theme.server-snapshot-resolver");
12
+ function _setFarmThemeServerSnapshotResolver(resolver) {
13
+ globalThis[FARM_THEME_SERVER_SNAPSHOT_RESOLVER] = resolver;
14
+ }
15
+ __name(_setFarmThemeServerSnapshotResolver, "_setFarmThemeServerSnapshotResolver");
16
+ function getFarmThemeServerSnapshot() {
17
+ return globalThis[FARM_THEME_SERVER_SNAPSHOT_RESOLVER]?.() ?? FALLBACK_SERVER_SNAPSHOT;
18
+ }
19
+ __name(getFarmThemeServerSnapshot, "getFarmThemeServerSnapshot");
20
+
21
+ export {
22
+ _setFarmThemeServerSnapshotResolver,
23
+ getFarmThemeServerSnapshot
24
+ };
25
+ //# sourceMappingURL=chunk-GQVQESLY.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/theme/bridge.ts"],"sourcesContent":["import type { FarmThemeSnapshot } from \"./types\";\n\nconst FALLBACK_SERVER_SNAPSHOT: FarmThemeSnapshot = Object.freeze({\n theme: \"system\",\n resolvedTheme: undefined,\n mounted: false,\n});\n\nconst FARM_THEME_SERVER_SNAPSHOT_RESOLVER = Symbol.for(\"farm.js.theme.server-snapshot-resolver\");\n\ntype FarmThemeBridgeGlobal = typeof globalThis & {\n [FARM_THEME_SERVER_SNAPSHOT_RESOLVER]?: () => FarmThemeSnapshot;\n};\n\nexport function _setFarmThemeServerSnapshotResolver(resolver: () => FarmThemeSnapshot): void {\n (globalThis as FarmThemeBridgeGlobal)[FARM_THEME_SERVER_SNAPSHOT_RESOLVER] = resolver;\n}\n\nexport function getFarmThemeServerSnapshot(): FarmThemeSnapshot {\n return (\n (globalThis as FarmThemeBridgeGlobal)[FARM_THEME_SERVER_SNAPSHOT_RESOLVER]?.() ??\n FALLBACK_SERVER_SNAPSHOT\n );\n}\n"],"mappings":";;;;;AAEA,IAAM,2BAA8C,OAAO,OAAO;AAAA,EAChE,OAAO;AAAA,EACP,eAAe;AAAA,EACf,SAAS;AACX,CAAC;AAED,IAAM,sCAAsC,uBAAO,IAAI,wCAAwC;AAMxF,SAAS,oCAAoC,UAAyC;AAC3F,EAAC,WAAqC,mCAAmC,IAAI;AAC/E;AAFgB;AAIT,SAAS,6BAAgD;AAC9D,SACG,WAAqC,mCAAmC,IAAI,KAC7E;AAEJ;AALgB;","names":[]}
@@ -0,0 +1,48 @@
1
+ import {
2
+ __name
3
+ } from "./chunk-CGILA3WO.mjs";
4
+
5
+ // src/theme/config.ts
6
+ var DEFAULT_FARM_THEME_STORAGE_KEY = "farm-theme";
7
+ var STORAGE_KEY_PATTERN = /^[A-Za-z0-9._-]+$/;
8
+ function resolveFarmThemeConfig(config, basePath = "/") {
9
+ if (config && "enabled" in config) {
10
+ return config;
11
+ }
12
+ if (!config) {
13
+ return {
14
+ enabled: false,
15
+ default: "system",
16
+ storageKey: DEFAULT_FARM_THEME_STORAGE_KEY,
17
+ cookiePath: normalizeCookiePath(basePath)
18
+ };
19
+ }
20
+ const storageKey = config.storageKey?.trim() || DEFAULT_FARM_THEME_STORAGE_KEY;
21
+ if (!STORAGE_KEY_PATTERN.test(storageKey)) {
22
+ throw new Error(
23
+ "theme.storageKey may only contain letters, numbers, dots, underscores, and hyphens."
24
+ );
25
+ }
26
+ const defaultTheme = config.default ?? "system";
27
+ if (defaultTheme !== "light" && defaultTheme !== "dark" && defaultTheme !== "system") {
28
+ throw new Error('theme.default must be "light", "dark", or "system".');
29
+ }
30
+ return {
31
+ enabled: true,
32
+ default: defaultTheme,
33
+ storageKey,
34
+ cookiePath: normalizeCookiePath(basePath)
35
+ };
36
+ }
37
+ __name(resolveFarmThemeConfig, "resolveFarmThemeConfig");
38
+ function normalizeCookiePath(basePath) {
39
+ const normalized = `/${basePath}`.replace(/\/{2,}/g, "/");
40
+ if (normalized === "/") return normalized;
41
+ return normalized.replace(/\/$/, "");
42
+ }
43
+ __name(normalizeCookiePath, "normalizeCookiePath");
44
+
45
+ export {
46
+ resolveFarmThemeConfig
47
+ };
48
+ //# sourceMappingURL=chunk-H53KVQUU.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/theme/config.ts"],"sourcesContent":["import type { FarmThemeConfig, ResolvedFarmThemeConfig } from \"./types\";\n\nexport const DEFAULT_FARM_THEME_STORAGE_KEY = \"farm-theme\";\n\nconst STORAGE_KEY_PATTERN = /^[A-Za-z0-9._-]+$/;\n\nexport function resolveFarmThemeConfig(\n config: FarmThemeConfig | ResolvedFarmThemeConfig | false | undefined,\n basePath = \"/\",\n): ResolvedFarmThemeConfig {\n if (config && \"enabled\" in config) {\n return config;\n }\n\n if (!config) {\n return {\n enabled: false,\n default: \"system\",\n storageKey: DEFAULT_FARM_THEME_STORAGE_KEY,\n cookiePath: normalizeCookiePath(basePath),\n };\n }\n\n const storageKey = config.storageKey?.trim() || DEFAULT_FARM_THEME_STORAGE_KEY;\n if (!STORAGE_KEY_PATTERN.test(storageKey)) {\n throw new Error(\n \"theme.storageKey may only contain letters, numbers, dots, underscores, and hyphens.\",\n );\n }\n\n const defaultTheme = config.default ?? \"system\";\n if (defaultTheme !== \"light\" && defaultTheme !== \"dark\" && defaultTheme !== \"system\") {\n throw new Error('theme.default must be \"light\", \"dark\", or \"system\".');\n }\n\n return {\n enabled: true,\n default: defaultTheme,\n storageKey,\n cookiePath: normalizeCookiePath(basePath),\n };\n}\n\nfunction normalizeCookiePath(basePath: string): string {\n const normalized = `/${basePath}`.replace(/\\/{2,}/g, \"/\");\n if (normalized === \"/\") return normalized;\n return normalized.replace(/\\/$/, \"\");\n}\n"],"mappings":";;;;;AAEO,IAAM,iCAAiC;AAE9C,IAAM,sBAAsB;AAErB,SAAS,uBACd,QACA,WAAW,KACc;AACzB,MAAI,UAAU,aAAa,QAAQ;AACjC,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,MACL,SAAS;AAAA,MACT,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,YAAY,oBAAoB,QAAQ;AAAA,IAC1C;AAAA,EACF;AAEA,QAAM,aAAa,OAAO,YAAY,KAAK,KAAK;AAChD,MAAI,CAAC,oBAAoB,KAAK,UAAU,GAAG;AACzC,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,eAAe,OAAO,WAAW;AACvC,MAAI,iBAAiB,WAAW,iBAAiB,UAAU,iBAAiB,UAAU;AACpF,UAAM,IAAI,MAAM,qDAAqD;AAAA,EACvE;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,SAAS;AAAA,IACT;AAAA,IACA,YAAY,oBAAoB,QAAQ;AAAA,EAC1C;AACF;AAnCgB;AAqChB,SAAS,oBAAoB,UAA0B;AACrD,QAAM,aAAa,IAAI,QAAQ,GAAG,QAAQ,WAAW,GAAG;AACxD,MAAI,eAAe,IAAK,QAAO;AAC/B,SAAO,WAAW,QAAQ,OAAO,EAAE;AACrC;AAJS;","names":[]}
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=chunk-HCGQYYHI.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -869,4 +869,4 @@ export {
869
869
  createStore,
870
870
  Link
871
871
  };
872
- //# sourceMappingURL=chunk-UCYWGN2P.mjs.map
872
+ //# sourceMappingURL=chunk-OHNSROHS.mjs.map
@@ -1,3 +1,6 @@
1
+ import {
2
+ resolveFarmThemeConfig
3
+ } from "./chunk-H53KVQUU.mjs";
1
4
  import {
2
5
  __name
3
6
  } from "./chunk-CGILA3WO.mjs";
@@ -291,9 +294,67 @@ function escapeAttribute(value) {
291
294
  }
292
295
  __name(escapeAttribute, "escapeAttribute");
293
296
 
297
+ // src/theme/server-runtime.ts
298
+ var THEME_SCRIPT_ID = "farm-theme-script";
299
+ var THEME_STYLE_ID = "farm-theme-style";
300
+ function createFarmThemeDocumentParts(input, basePath = "/", serverTheme) {
301
+ const config = resolveFarmThemeConfig(input, basePath);
302
+ if (!config.enabled) return { attributes: "", head: "" };
303
+ const hydrationTheme = serverTheme ?? config.default;
304
+ const initialTheme = hydrationTheme === "system" ? "light" : hydrationTheme;
305
+ const script = createFarmThemeBootstrapScript(config, hydrationTheme);
306
+ return {
307
+ attributes: ` data-theme="${initialTheme}"`,
308
+ head: `<style id="${THEME_STYLE_ID}">:root[data-theme="light"]{color-scheme:light}:root[data-theme="dark"]{color-scheme:dark}</style><script id="${THEME_SCRIPT_ID}">${script}</script>`
309
+ };
310
+ }
311
+ __name(createFarmThemeDocumentParts, "createFarmThemeDocumentParts");
312
+ function createFarmThemeBootstrapScript(config, serverTheme = config.default) {
313
+ return `(function(config,serverTheme){
314
+ var isTheme=function(value){return value==="light"||value==="dark"||value==="system";};
315
+ var decode=function(value){try{return decodeURIComponent(value);}catch(_error){return value;}};
316
+ var readCookie=function(){var entries=document.cookie.split(";");for(var index=0;index<entries.length;index++){var entry=entries[index];var separator=entry.indexOf("=");if(separator<0)continue;if(decode(entry.slice(0,separator).trim())===config.storageKey)return decode(entry.slice(separator+1).trim());}};
317
+ var media=window.matchMedia("(prefers-color-scheme: dark)");
318
+ var resolveTheme=function(theme){return theme==="system"?(media.matches?"dark":"light"):theme;};
319
+ var storedTheme=readCookie();
320
+ var preference=isTheme(storedTheme)?storedTheme:config.default;
321
+ var serverSnapshot={theme:serverTheme,resolvedTheme:serverTheme==="system"?undefined:serverTheme,mounted:false};
322
+ var apply=function(){var resolvedTheme=resolveTheme(preference);document.documentElement.dataset.theme=resolvedTheme;var snapshot={theme:preference,resolvedTheme:resolvedTheme,mounted:true};if(window.__FARM_THEME__)window.__FARM_THEME__.snapshot=snapshot;return snapshot;};
323
+ var emit=function(){var snapshot=apply();window.dispatchEvent(new CustomEvent("farm:themechange",{detail:snapshot}));};
324
+ var persist=function(theme){var secure=window.location.protocol==="https:"?"; Secure":"";document.cookie=encodeURIComponent(config.storageKey)+"="+encodeURIComponent(theme)+"; Path="+config.cookiePath+"; Max-Age=31536000; SameSite=Lax"+secure;try{localStorage.setItem(config.storageKey,theme);}catch(_error){}};
325
+ var setTheme=function(theme){if(!isTheme(theme))throw new TypeError("Unknown FARMJS theme: "+String(theme));preference=theme;persist(theme);emit();};
326
+ var initialSnapshot={theme:preference,resolvedTheme:resolveTheme(preference),mounted:true};
327
+ window.__FARM_THEME__={config:config,serverSnapshot:serverSnapshot,snapshot:initialSnapshot,setTheme:setTheme};
328
+ document.documentElement.dataset.theme=initialSnapshot.resolvedTheme;
329
+ var handleSystemChange=function(){if(preference==="system")emit();};
330
+ if(typeof media.addEventListener==="function")media.addEventListener("change",handleSystemChange);else if(typeof media.addListener==="function")media.addListener(handleSystemChange);
331
+ window.addEventListener("storage",function(event){if(event.key!==config.storageKey||!isTheme(event.newValue))return;preference=event.newValue;persist(preference);emit();});
332
+ })(${serializeInlineValue(config)},${serializeInlineValue(serverTheme)});`;
333
+ }
334
+ __name(createFarmThemeBootstrapScript, "createFarmThemeBootstrapScript");
335
+ function applyFarmThemeDocument(html, input, basePath = "/", serverTheme) {
336
+ const parts = createFarmThemeDocumentParts(input, basePath, serverTheme);
337
+ if (!parts.head) return html;
338
+ let output = html.replace(/<html([^>]*)>/i, (_match, attributes) => {
339
+ const nextAttributes = attributes.replace(/\sdata-theme=(?:"[^"]*"|'[^']*'|[^\s>]+)/i, "");
340
+ return `<html${nextAttributes}${parts.attributes}>`;
341
+ });
342
+ if (!output.includes(`id="${THEME_SCRIPT_ID}"`)) {
343
+ output = output.replace(/<head([^>]*)>/i, `<head$1>${parts.head}`);
344
+ }
345
+ return output;
346
+ }
347
+ __name(applyFarmThemeDocument, "applyFarmThemeDocument");
348
+ function serializeInlineValue(value) {
349
+ return JSON.stringify(value).replace(/</g, "\\u003c").replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029");
350
+ }
351
+ __name(serializeInlineValue, "serializeInlineValue");
352
+
294
353
  export {
295
354
  mergeMetadata,
296
355
  addMetadataImageReference,
297
- renderMetadataHead
356
+ renderMetadataHead,
357
+ createFarmThemeDocumentParts,
358
+ applyFarmThemeDocument
298
359
  };
299
- //# sourceMappingURL=chunk-FRPWCMMG.mjs.map
360
+ //# sourceMappingURL=chunk-SBWOTAX4.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/metadata.ts","../src/theme/server-runtime.ts"],"sourcesContent":["import type { Metadata } from \"./types\";\n\nexport type MetadataImageKind = \"opengraph\" | \"twitter\";\n\nexport interface FarmMetadataImageReference {\n kind: MetadataImageKind;\n href: string;\n alt?: string;\n width?: number;\n height?: number;\n contentType?: string;\n}\n\nexport interface RenderedMetadataHead {\n title: string;\n tags: string;\n hasFavicon: boolean;\n}\n\ntype MetadataRecord = Metadata & Record<string, any>;\n\nexport function mergeMetadata(\n base: MetadataRecord | undefined,\n next: MetadataRecord | undefined,\n): MetadataRecord {\n if (!base) return next ? { ...next } : {};\n if (!next) return { ...base };\n\n return {\n ...base,\n ...next,\n openGraph: mergeNestedMetadata(base.openGraph, next.openGraph),\n twitter: mergeNestedMetadata(base.twitter, next.twitter),\n alternates: mergeNestedMetadata((base as any).alternates, (next as any).alternates),\n icons: mergeNestedMetadata((base as any).icons, (next as any).icons),\n };\n}\n\nexport function addMetadataImageReference(\n metadata: MetadataRecord,\n reference: FarmMetadataImageReference,\n): MetadataRecord {\n if (reference.kind === \"opengraph\") {\n const openGraph = { ...metadata.openGraph };\n if (!hasMetadataImages(openGraph.images) && !hasMetadataImages((openGraph as any).image)) {\n openGraph.images = [\n {\n url: reference.href,\n width: reference.width,\n height: reference.height,\n alt: reference.alt,\n type: reference.contentType,\n },\n ];\n }\n\n return {\n ...metadata,\n openGraph,\n };\n }\n\n const twitter = { ...metadata.twitter };\n if (!hasMetadataImages(twitter.images)) {\n twitter.images = [reference.href];\n twitter.card = twitter.card || \"summary_large_image\";\n }\n\n return {\n ...metadata,\n twitter,\n };\n}\n\nexport function renderMetadataHead(metadata: MetadataRecord | undefined): RenderedMetadataHead {\n const resolvedMetadata = metadata || {};\n const metadataBase = resolveMetadataBase(resolvedMetadata);\n const title = resolveMetadataTitle(resolvedMetadata.title) || \"Farm.js App\";\n const tags: string[] = [];\n\n appendMetaName(tags, \"description\", resolvedMetadata.description);\n appendMetaName(tags, \"keywords\", normalizeKeywords(resolvedMetadata.keywords));\n appendMetaName(tags, \"author\", (resolvedMetadata as any).author);\n\n if (Array.isArray(resolvedMetadata.authors)) {\n for (const author of resolvedMetadata.authors) {\n appendMetaName(tags, \"author\", author?.name);\n if (author?.url) {\n appendLink(tags, \"author\", resolveMetadataUrl(author.url, metadataBase));\n }\n }\n }\n\n appendMetaName(tags, \"creator\", resolvedMetadata.creator);\n appendMetaName(tags, \"publisher\", resolvedMetadata.publisher);\n appendMetaName(tags, \"robots\", normalizeRobots(resolvedMetadata.robots));\n\n const alternates = (resolvedMetadata as any).alternates;\n if (isRecord(alternates)) {\n appendLink(tags, \"canonical\", resolveMetadataUrl(alternates.canonical, metadataBase));\n\n if (isRecord(alternates.languages)) {\n for (const [language, href] of Object.entries(alternates.languages)) {\n appendLink(tags, \"alternate\", resolveMetadataUrl(href, metadataBase), {\n hreflang: language,\n });\n }\n }\n }\n\n const hasFavicon = appendIcons(tags, (resolvedMetadata as any).icons, metadataBase);\n\n if ((resolvedMetadata as any).manifest) {\n appendLink(\n tags,\n \"manifest\",\n resolveMetadataUrl((resolvedMetadata as any).manifest, metadataBase),\n );\n }\n\n appendOpenGraph(tags, resolvedMetadata.openGraph, metadataBase);\n appendTwitter(tags, resolvedMetadata.twitter, metadataBase);\n\n return {\n title: escapeText(title),\n tags: tags.length > 0 ? `\\n ${tags.join(\"\\n \")}` : \"\",\n hasFavicon,\n };\n}\n\nfunction mergeNestedMetadata(base: unknown, next: unknown): any {\n if (isRecord(base) && isRecord(next)) {\n return {\n ...base,\n ...next,\n };\n }\n\n return next ?? base;\n}\n\nfunction appendOpenGraph(tags: string[], openGraph: Metadata[\"openGraph\"], metadataBase?: string) {\n if (!isRecord(openGraph)) return;\n\n appendMetaProperty(tags, \"og:title\", openGraph.title);\n appendMetaProperty(tags, \"og:description\", openGraph.description);\n appendMetaProperty(tags, \"og:url\", resolveMetadataUrl(openGraph.url, metadataBase));\n appendMetaProperty(tags, \"og:site_name\", openGraph.siteName);\n appendMetaProperty(tags, \"og:type\", openGraph.type);\n appendMetaProperty(tags, \"og:locale\", (openGraph as any).locale);\n\n const images = normalizeMetadataImages(\n openGraph.images ?? (openGraph as any).image,\n metadataBase,\n );\n for (const image of images) {\n appendMetaProperty(tags, \"og:image\", image.url);\n appendMetaProperty(tags, \"og:image:width\", image.width);\n appendMetaProperty(tags, \"og:image:height\", image.height);\n appendMetaProperty(tags, \"og:image:alt\", image.alt);\n appendMetaProperty(tags, \"og:image:type\", image.type);\n }\n}\n\nfunction appendTwitter(tags: string[], twitter: Metadata[\"twitter\"], metadataBase?: string) {\n if (!isRecord(twitter)) return;\n\n appendMetaName(tags, \"twitter:card\", twitter.card);\n appendMetaName(tags, \"twitter:site\", twitter.site);\n appendMetaName(tags, \"twitter:creator\", twitter.creator);\n appendMetaName(tags, \"twitter:title\", twitter.title);\n appendMetaName(tags, \"twitter:description\", twitter.description);\n\n for (const image of normalizeMetadataImages(twitter.images, metadataBase)) {\n appendMetaName(tags, \"twitter:image\", image.url);\n appendMetaName(tags, \"twitter:image:alt\", image.alt);\n }\n}\n\nfunction appendIcons(tags: string[], icons: unknown, metadataBase?: string): boolean {\n if (!icons) return false;\n\n if (typeof icons === \"string\") {\n const initialTagCount = tags.length;\n appendLink(tags, \"icon\", resolveMetadataUrl(icons, metadataBase));\n return tags.length > initialTagCount;\n }\n\n if (!isRecord(icons)) return false;\n\n const initialTagCount = tags.length;\n appendIconList(tags, \"icon\", icons.icon, metadataBase);\n appendIconList(tags, \"shortcut icon\", icons.shortcut, metadataBase);\n const hasFavicon = tags.length > initialTagCount;\n appendIconList(tags, \"apple-touch-icon\", icons.apple, metadataBase);\n return hasFavicon;\n}\n\nfunction appendIconList(tags: string[], rel: string, value: unknown, metadataBase?: string) {\n for (const icon of normalizeArray(value)) {\n if (typeof icon === \"string\") {\n appendLink(tags, rel, resolveMetadataUrl(icon, metadataBase));\n continue;\n }\n\n if (!isRecord(icon)) continue;\n appendLink(tags, rel, resolveMetadataUrl(icon.url, metadataBase), {\n sizes: icon.sizes,\n type: icon.type,\n });\n }\n}\n\nfunction appendMetaName(tags: string[], name: string, content: unknown) {\n const normalized = normalizeContent(content);\n if (!normalized) return;\n tags.push(`<meta name=\"${escapeAttribute(name)}\" content=\"${escapeAttribute(normalized)}\">`);\n}\n\nfunction appendMetaProperty(tags: string[], property: string, content: unknown) {\n const normalized = normalizeContent(content);\n if (!normalized) return;\n tags.push(\n `<meta property=\"${escapeAttribute(property)}\" content=\"${escapeAttribute(normalized)}\">`,\n );\n}\n\nfunction appendLink(\n tags: string[],\n rel: string,\n href: unknown,\n attrs: Record<string, unknown> = {},\n) {\n const normalizedHref = normalizeContent(href);\n if (!normalizedHref) return;\n\n const attrText = Object.entries(attrs)\n .map(([key, value]) => {\n const normalized = normalizeContent(value);\n return normalized ? ` ${key}=\"${escapeAttribute(normalized)}\"` : \"\";\n })\n .join(\"\");\n\n tags.push(\n `<link rel=\"${escapeAttribute(rel)}\" href=\"${escapeAttribute(normalizedHref)}\"${attrText}>`,\n );\n}\n\nfunction normalizeMetadataImages(\n value: unknown,\n metadataBase?: string,\n): Array<{\n url: string;\n width?: number;\n height?: number;\n alt?: string;\n type?: string;\n}> {\n return normalizeArray(value)\n .map((item) => {\n if (typeof item === \"string\") {\n return { url: resolveMetadataUrl(item, metadataBase) || item };\n }\n\n if (!isRecord(item)) return null;\n const rawUrl = item.url || item.src;\n const url = resolveMetadataUrl(rawUrl, metadataBase);\n if (!url) return null;\n\n return {\n url,\n width: normalizeNumber(item.width),\n height: normalizeNumber(item.height),\n alt: typeof item.alt === \"string\" ? item.alt : undefined,\n type: typeof item.type === \"string\" ? item.type : undefined,\n };\n })\n .filter((item): item is NonNullable<typeof item> => item !== null);\n}\n\nfunction normalizeArray(value: unknown): unknown[] {\n if (value == null) return [];\n return Array.isArray(value) ? value : [value];\n}\n\nfunction hasMetadataImages(value: unknown): boolean {\n return normalizeMetadataImages(value).length > 0;\n}\n\nfunction resolveMetadataTitle(title: Metadata[\"title\"]): string | undefined {\n if (typeof title === \"string\") return title;\n if (isRecord(title)) {\n return normalizeContent(title.default);\n }\n return undefined;\n}\n\nfunction normalizeKeywords(keywords: Metadata[\"keywords\"]): string | undefined {\n if (Array.isArray(keywords)) return keywords.filter(Boolean).join(\", \");\n return keywords;\n}\n\nfunction normalizeRobots(robots: Metadata[\"robots\"]): string | undefined {\n if (typeof robots === \"string\") return robots;\n if (!isRecord(robots)) return undefined;\n\n const values: string[] = [];\n if (typeof robots.index === \"boolean\") values.push(robots.index ? \"index\" : \"noindex\");\n if (typeof robots.follow === \"boolean\") values.push(robots.follow ? \"follow\" : \"nofollow\");\n return values.join(\", \") || undefined;\n}\n\nfunction resolveMetadataBase(metadata: MetadataRecord): string | undefined {\n const base = metadata.metadataBase;\n if (!base) return undefined;\n return String(base);\n}\n\nfunction resolveMetadataUrl(value: unknown, metadataBase?: string): string | undefined {\n const normalized = normalizeContent(value);\n if (!normalized) return undefined;\n if (!metadataBase) return normalized;\n\n try {\n return new URL(normalized, metadataBase).toString();\n } catch {\n return normalized;\n }\n}\n\nfunction normalizeNumber(value: unknown): number | undefined {\n if (typeof value === \"number\" && Number.isFinite(value)) return value;\n if (typeof value === \"string\") {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : undefined;\n }\n return undefined;\n}\n\nfunction normalizeContent(value: unknown): string | undefined {\n if (value == null) return undefined;\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\" || typeof value === \"boolean\") return String(value);\n if (value instanceof URL) return value.toString();\n return undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, any> {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction escapeText(value: string): string {\n return value.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\n}\n\nfunction escapeAttribute(value: string): string {\n return escapeText(value).replace(/\"/g, \"&quot;\");\n}\n","import { resolveFarmThemeConfig } from \"./config\";\nimport type {\n FarmThemeConfig,\n FarmThemePreference,\n FarmThemeRuntime,\n ResolvedFarmThemeConfig,\n} from \"./types\";\n\nconst THEME_SCRIPT_ID = \"farm-theme-script\";\nconst THEME_STYLE_ID = \"farm-theme-style\";\n\ndeclare global {\n interface Window {\n __FARM_THEME__?: FarmThemeRuntime;\n }\n}\n\nexport interface FarmThemeDocumentParts {\n attributes: string;\n head: string;\n}\n\nexport function createFarmThemeDocumentParts(\n input: FarmThemeConfig | ResolvedFarmThemeConfig | false | undefined,\n basePath = \"/\",\n serverTheme?: FarmThemePreference,\n): FarmThemeDocumentParts {\n const config = resolveFarmThemeConfig(input, basePath);\n if (!config.enabled) return { attributes: \"\", head: \"\" };\n\n const hydrationTheme = serverTheme ?? config.default;\n const initialTheme = hydrationTheme === \"system\" ? \"light\" : hydrationTheme;\n const script = createFarmThemeBootstrapScript(config, hydrationTheme);\n\n return {\n attributes: ` data-theme=\"${initialTheme}\"`,\n head: `<style id=\"${THEME_STYLE_ID}\">:root[data-theme=\"light\"]{color-scheme:light}:root[data-theme=\"dark\"]{color-scheme:dark}</style><script id=\"${THEME_SCRIPT_ID}\">${script}</script>`,\n };\n}\n\nexport function createFarmThemeBootstrapScript(\n config: ResolvedFarmThemeConfig,\n serverTheme: FarmThemePreference = config.default,\n): string {\n return `(function(config,serverTheme){\nvar isTheme=function(value){return value===\"light\"||value===\"dark\"||value===\"system\";};\nvar decode=function(value){try{return decodeURIComponent(value);}catch(_error){return value;}};\nvar readCookie=function(){var entries=document.cookie.split(\";\");for(var index=0;index<entries.length;index++){var entry=entries[index];var separator=entry.indexOf(\"=\");if(separator<0)continue;if(decode(entry.slice(0,separator).trim())===config.storageKey)return decode(entry.slice(separator+1).trim());}};\nvar media=window.matchMedia(\"(prefers-color-scheme: dark)\");\nvar resolveTheme=function(theme){return theme===\"system\"?(media.matches?\"dark\":\"light\"):theme;};\nvar storedTheme=readCookie();\nvar preference=isTheme(storedTheme)?storedTheme:config.default;\nvar serverSnapshot={theme:serverTheme,resolvedTheme:serverTheme===\"system\"?undefined:serverTheme,mounted:false};\nvar apply=function(){var resolvedTheme=resolveTheme(preference);document.documentElement.dataset.theme=resolvedTheme;var snapshot={theme:preference,resolvedTheme:resolvedTheme,mounted:true};if(window.__FARM_THEME__)window.__FARM_THEME__.snapshot=snapshot;return snapshot;};\nvar emit=function(){var snapshot=apply();window.dispatchEvent(new CustomEvent(\"farm:themechange\",{detail:snapshot}));};\nvar persist=function(theme){var secure=window.location.protocol===\"https:\"?\"; Secure\":\"\";document.cookie=encodeURIComponent(config.storageKey)+\"=\"+encodeURIComponent(theme)+\"; Path=\"+config.cookiePath+\"; Max-Age=31536000; SameSite=Lax\"+secure;try{localStorage.setItem(config.storageKey,theme);}catch(_error){}};\nvar setTheme=function(theme){if(!isTheme(theme))throw new TypeError(\"Unknown FARMJS theme: \"+String(theme));preference=theme;persist(theme);emit();};\nvar initialSnapshot={theme:preference,resolvedTheme:resolveTheme(preference),mounted:true};\nwindow.__FARM_THEME__={config:config,serverSnapshot:serverSnapshot,snapshot:initialSnapshot,setTheme:setTheme};\ndocument.documentElement.dataset.theme=initialSnapshot.resolvedTheme;\nvar handleSystemChange=function(){if(preference===\"system\")emit();};\nif(typeof media.addEventListener===\"function\")media.addEventListener(\"change\",handleSystemChange);else if(typeof media.addListener===\"function\")media.addListener(handleSystemChange);\nwindow.addEventListener(\"storage\",function(event){if(event.key!==config.storageKey||!isTheme(event.newValue))return;preference=event.newValue;persist(preference);emit();});\n})(${serializeInlineValue(config)},${serializeInlineValue(serverTheme)});`;\n}\n\nexport function applyFarmThemeDocument(\n html: string,\n input: FarmThemeConfig | ResolvedFarmThemeConfig | false | undefined,\n basePath = \"/\",\n serverTheme?: FarmThemePreference,\n): string {\n const parts = createFarmThemeDocumentParts(input, basePath, serverTheme);\n if (!parts.head) return html;\n\n let output = html.replace(/<html([^>]*)>/i, (_match, attributes: string) => {\n const nextAttributes = attributes.replace(/\\sdata-theme=(?:\"[^\"]*\"|'[^']*'|[^\\s>]+)/i, \"\");\n return `<html${nextAttributes}${parts.attributes}>`;\n });\n\n if (!output.includes(`id=\"${THEME_SCRIPT_ID}\"`)) {\n output = output.replace(/<head([^>]*)>/i, `<head$1>${parts.head}`);\n }\n\n return output;\n}\n\nfunction serializeInlineValue(value: unknown): string {\n return JSON.stringify(value)\n .replace(/</g, \"\\\\u003c\")\n .replace(/\\u2028/g, \"\\\\u2028\")\n .replace(/\\u2029/g, \"\\\\u2029\");\n}\n"],"mappings":"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","names":["initialTagCount"]}
@@ -1,23 +1,18 @@
1
1
  import {
2
2
  APITypeGenerator
3
3
  } from "./chunk-LGHEOHBU.mjs";
4
- import {
5
- addMetadataImageReference,
6
- mergeMetadata,
7
- renderMetadataHead
8
- } from "./chunk-FRPWCMMG.mjs";
9
4
  import {
10
5
  createFarmMetadataImageResponse
11
6
  } from "./chunk-53MVSX3R.mjs";
12
- import {
13
- resolveFarmLayoutFonts
14
- } from "./chunk-6ZXIQSXE.mjs";
15
- import {
16
- farmEnvironmentFunctionsPlugin
17
- } from "./chunk-V6WE6JSZ.mjs";
18
7
  import {
19
8
  createFarmImageHandler
20
9
  } from "./chunk-3XNTL3FQ.mjs";
10
+ import {
11
+ addMetadataImageReference,
12
+ createFarmThemeDocumentParts,
13
+ mergeMetadata,
14
+ renderMetadataHead
15
+ } from "./chunk-SBWOTAX4.mjs";
21
16
  import {
22
17
  createEnvTypeDeclarations,
23
18
  generateEnvTypes
@@ -25,11 +20,21 @@ import {
25
20
  import {
26
21
  writeFileIfChanged
27
22
  } from "./chunk-USWZZUEH.mjs";
23
+ import {
24
+ resolveFarmLayoutFonts
25
+ } from "./chunk-6ZXIQSXE.mjs";
26
+ import {
27
+ farmEnvironmentFunctionsPlugin
28
+ } from "./chunk-V6WE6JSZ.mjs";
28
29
  import {
29
30
  getFarmRedirectError,
30
31
  isFarmNotFoundError,
31
32
  isFarmRedirectError
32
33
  } from "./chunk-7HO6AEOP.mjs";
34
+ import {
35
+ _setDefaultFarmThemeConfig,
36
+ getTheme
37
+ } from "./chunk-4IVNW5QD.mjs";
33
38
  import {
34
39
  resolveFarmDocsFontAssets,
35
40
  toFarmDocsPublicFontAssets
@@ -51,16 +56,25 @@ import {
51
56
  getFarmLayerAliases,
52
57
  getFarmSourceRoots
53
58
  } from "./chunk-74YTBPTY.mjs";
54
- import {
55
- resolveFarmPerformanceConfig
56
- } from "./chunk-7ZVN3YZI.mjs";
57
59
  import {
58
60
  getPublicFarmImageConfig,
59
61
  resolveFarmImageConfig
60
62
  } from "./chunk-GY2STC2S.mjs";
63
+ import {
64
+ resolveFarmPerformanceConfig
65
+ } from "./chunk-7ZVN3YZI.mjs";
66
+ import {
67
+ resolveWorkflowsConfig
68
+ } from "./chunk-4E6VRJ6P.mjs";
69
+ import {
70
+ resolveCronConfig
71
+ } from "./chunk-GXASWWJU.mjs";
61
72
  import {
62
73
  resolveServerActionsConfig
63
74
  } from "./chunk-WORFTBLU.mjs";
75
+ import {
76
+ resolveFarmThemeConfig
77
+ } from "./chunk-H53KVQUU.mjs";
64
78
  import {
65
79
  createFarmMarkdownRouteModuleFromFile,
66
80
  createFarmMarkdownSourceResponse,
@@ -73,12 +87,6 @@ import {
73
87
  resolveMarkdownConfig,
74
88
  resolveMarkdownMirrorTarget
75
89
  } from "./chunk-7FBJLMQH.mjs";
76
- import {
77
- resolveWorkflowsConfig
78
- } from "./chunk-4E6VRJ6P.mjs";
79
- import {
80
- resolveCronConfig
81
- } from "./chunk-GXASWWJU.mjs";
82
90
  import {
83
91
  dispatchIntegrationRequest,
84
92
  getFarmIntegrationPluginOwner,
@@ -170,7 +178,7 @@ import {
170
178
  } from "./chunk-RHIFZZUI.mjs";
171
179
  import {
172
180
  FARM_VERSION
173
- } from "./chunk-DAUR3WUZ.mjs";
181
+ } from "./chunk-5NOVWCFL.mjs";
174
182
  import {
175
183
  FARM_DEPLOYMENT_ID_HEADER,
176
184
  createFarmDeploymentCookie,
@@ -4905,6 +4913,11 @@ ${getFarmI18nClientSnapshot() ? `window.__FARM_I18N__ = ${serializeInlineValue(g
4905
4913
  const i18nSnapshot = getFarmI18nClientSnapshot();
4906
4914
  const i18nAlternateTags = i18nSnapshot ? renderI18nAlternateLinks(req.__FARM_ROUTE__ || req.url || "/", i18nSnapshot) : "";
4907
4915
  const fontHead = renderFarmFontDevHead(this.config.root || process.cwd());
4916
+ const themeDocument = createFarmThemeDocumentParts(
4917
+ this.config.theme,
4918
+ this.config.basePath,
4919
+ getTheme()
4920
+ );
4908
4921
  const streamRoot = React.createElement("div", { style: { display: "contents" } }, element);
4909
4922
  const { pipe } = renderToPipeableStream(streamRoot, {
4910
4923
  onShellReady() {
@@ -4918,8 +4931,9 @@ ${getFarmI18nClientSnapshot() ? `window.__FARM_I18N__ = ${serializeInlineValue(g
4918
4931
  console.log(`[FARM STREAM] onShellReady at ${shellReadyMs}ms`);
4919
4932
  }
4920
4933
  const shell = `<!DOCTYPE html>
4921
- <html lang="${escapeHtmlAttribute2(i18nSnapshot?.locale || "en")}"${i18nSnapshot ? ` dir="${i18nSnapshot.direction}"` : ""}>
4934
+ <html lang="${escapeHtmlAttribute2(i18nSnapshot?.locale || "en")}"${i18nSnapshot ? ` dir="${i18nSnapshot.direction}"` : ""}${themeDocument.attributes}>
4922
4935
  <head>
4936
+ ${themeDocument.head}
4923
4937
  <meta charset="utf-8">
4924
4938
  <meta name="viewport" content="width=device-width, initial-scale=1">
4925
4939
  <meta name="farm-deployment-id" content="${escapeHtmlAttribute2(deploymentId)}">
@@ -5127,9 +5141,15 @@ ${i18nSnapshot ? `window.__FARM_I18N__ = ${serializeInlineValue(i18nSnapshot)};`
5127
5141
  </script>`;
5128
5142
  const alternateLinks = i18nSnapshot ? renderI18nAlternateLinks(requestPath, i18nSnapshot) : "";
5129
5143
  const fontHead = renderFarmFontDevHead(this.config.root || process.cwd());
5144
+ const themeDocument = createFarmThemeDocumentParts(
5145
+ this.config.theme,
5146
+ this.config.basePath,
5147
+ getTheme()
5148
+ );
5130
5149
  return `<!DOCTYPE html>
5131
- <html lang="${escapeHtmlAttribute2(i18nSnapshot?.locale || "en")}"${i18nSnapshot ? ` dir="${i18nSnapshot.direction}"` : ""}>
5150
+ <html lang="${escapeHtmlAttribute2(i18nSnapshot?.locale || "en")}"${i18nSnapshot ? ` dir="${i18nSnapshot.direction}"` : ""}${themeDocument.attributes}>
5132
5151
  <head>
5152
+ ${themeDocument.head}
5133
5153
  <meta charset="utf-8">
5134
5154
  <meta name="viewport" content="width=device-width, initial-scale=1">
5135
5155
  <meta name="farm-deployment-id" content="${escapeHtmlAttribute2(this.getDeploymentId())}">
@@ -5184,6 +5204,7 @@ var _FarmApp = class _FarmApp {
5184
5204
  constructor(config = {}, viteServer) {
5185
5205
  this.config = this.normalizeConfig(config);
5186
5206
  configureFarmObservability(this.config.observability);
5207
+ _setDefaultFarmThemeConfig(this.config.theme);
5187
5208
  this.i18nRuntime = createFarmI18nRuntime(this.config.i18n);
5188
5209
  _setDefaultFarmI18nRuntime(this.i18nRuntime);
5189
5210
  this.viteServer = viteServer;
@@ -5242,6 +5263,7 @@ var _FarmApp = class _FarmApp {
5242
5263
  security: resolveFarmSecurityConfig(config.security),
5243
5264
  images: resolveFarmImageConfig(config.images),
5244
5265
  performance: resolveFarmPerformanceConfig(config.performance),
5266
+ theme: resolveFarmThemeConfig(config.theme, config.basePath || "/"),
5245
5267
  i18n: isResolvedI18nConfig(config.i18n) ? config.i18n : resolveFarmI18nConfig(config.i18n, {
5246
5268
  root,
5247
5269
  mode: process.env.NODE_ENV === "production" ? "production" : "development"
@@ -6193,6 +6215,29 @@ function mergeFarmViteConfig(farmConfig, userConfig = {}) {
6193
6215
  }
6194
6216
  __name(mergeFarmViteConfig, "mergeFarmViteConfig");
6195
6217
 
6218
+ // src/theme/vite.ts
6219
+ var FARM_DARK_VARIANT = '@custom-variant dark (&:where([data-theme="dark"], [data-theme="dark"] *));';
6220
+ function createFarmThemeCssPlugin(input, basePath = "/") {
6221
+ const config = resolveFarmThemeConfig(input, basePath);
6222
+ return {
6223
+ name: "farm:theme-css",
6224
+ enforce: "pre",
6225
+ transform(code, id) {
6226
+ if (!config.enabled || !/\.css(?:\?.*)?$/.test(id) || !/@import\s+["']tailwindcss["']/.test(code) || /@custom-variant\s+dark\b/.test(code)) {
6227
+ return null;
6228
+ }
6229
+ return {
6230
+ code: `${code.trimEnd()}
6231
+
6232
+ ${FARM_DARK_VARIANT}
6233
+ `,
6234
+ map: null
6235
+ };
6236
+ }
6237
+ };
6238
+ }
6239
+ __name(createFarmThemeCssPlugin, "createFarmThemeCssPlugin");
6240
+
6196
6241
  // src/vite.ts
6197
6242
  var ALL_TYPE_ARTIFACTS = {
6198
6243
  routes: true,
@@ -6235,7 +6280,7 @@ function loadFarmWorkflowsDevRuntime() {
6235
6280
  }
6236
6281
  __name(loadFarmWorkflowsDevRuntime, "loadFarmWorkflowsDevRuntime");
6237
6282
  function loadFarmDevtoolsSnapshotRuntime() {
6238
- return import("./devtools-52FYXIEK.mjs");
6283
+ return import("./devtools-326RBQCN.mjs");
6239
6284
  }
6240
6285
  __name(loadFarmDevtoolsSnapshotRuntime, "loadFarmDevtoolsSnapshotRuntime");
6241
6286
  function loadFarmDevtoolsUIRuntime() {
@@ -9580,14 +9625,22 @@ async function renderPage(pageData) {
9580
9625
  if (!doc.documentElement || !doc.body) return false;
9581
9626
 
9582
9627
  resetReactRoots();
9628
+ const activeFarmTheme =
9629
+ window.__FARM_THEME__?.snapshot?.resolvedTheme ||
9630
+ document.documentElement.getAttribute('data-theme');
9583
9631
  Array.from(document.documentElement.attributes).forEach(function(attr) {
9632
+ if (attr.name === 'data-theme') return;
9584
9633
  if (!doc.documentElement.hasAttribute(attr.name)) {
9585
9634
  document.documentElement.removeAttribute(attr.name);
9586
9635
  }
9587
9636
  });
9588
9637
  Array.from(doc.documentElement.attributes).forEach(function(attr) {
9638
+ if (attr.name === 'data-theme') return;
9589
9639
  document.documentElement.setAttribute(attr.name, attr.value);
9590
9640
  });
9641
+ if (activeFarmTheme) {
9642
+ document.documentElement.setAttribute('data-theme', activeFarmTheme);
9643
+ }
9591
9644
 
9592
9645
  document.head.innerHTML = doc.head ? doc.head.innerHTML : '';
9593
9646
  document.body.innerHTML = doc.body.innerHTML;
@@ -9596,6 +9649,7 @@ async function renderPage(pageData) {
9596
9649
 
9597
9650
  setTimeout(function() {
9598
9651
  Array.from(document.querySelectorAll('script')).forEach(function(script) {
9652
+ if (script.id === 'farm-theme-script') return;
9599
9653
  const freshScript = document.createElement('script');
9600
9654
  Array.from(script.attributes).forEach(function(attr) {
9601
9655
  freshScript.setAttribute(attr.name, attr.value);
@@ -10093,6 +10147,7 @@ async function defineConfig(config = {}) {
10093
10147
  };
10094
10148
  return {
10095
10149
  plugins: [
10150
+ createFarmThemeCssPlugin(config.theme, config.basePath),
10096
10151
  tailwindcss(),
10097
10152
  viteBrowserExternalPlugin,
10098
10153
  farmI18nClientBridgePlugin(),
@@ -10196,9 +10251,10 @@ export {
10196
10251
  createFarmClientOptimizeDepsConfig,
10197
10252
  createFarmSourceAlias,
10198
10253
  mergeFarmViteConfig,
10254
+ createFarmThemeCssPlugin,
10199
10255
  farmI18nClientBridgePlugin,
10200
10256
  rewriteEarlySsrRelativeImports,
10201
10257
  farmPlugin,
10202
10258
  defineConfig
10203
10259
  };
10204
- //# sourceMappingURL=chunk-XBKXKJX5.mjs.map
10260
+ //# sourceMappingURL=chunk-TX54PXAJ.mjs.map