@farm.js/core 0.1.0-beta.21 → 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 (266) hide show
  1. package/dist/after.d.mts +25 -0
  2. package/dist/after.d.ts +25 -0
  3. package/dist/agent-runtime.d.mts +97 -0
  4. package/dist/agent-runtime.d.ts +97 -0
  5. package/dist/api/route-manager.d.mts +68 -0
  6. package/dist/api/route-manager.d.ts +68 -0
  7. package/dist/api/runtime.d.mts +3 -0
  8. package/dist/api/runtime.d.ts +3 -0
  9. package/dist/api.cjs +22 -19
  10. package/dist/api.cjs.map +1 -1
  11. package/dist/api.d.mts +50 -0
  12. package/dist/api.d.ts +50 -0
  13. package/dist/api.mjs +2 -1
  14. package/dist/app-CTFnOJaI.d.ts +308 -0
  15. package/dist/app-DA6ospIq.d.mts +308 -0
  16. package/dist/app-markdown.d.mts +25 -0
  17. package/dist/app-markdown.d.ts +25 -0
  18. package/dist/cache.d.mts +192 -0
  19. package/dist/cache.d.ts +192 -0
  20. package/dist/{chunk-MIUW47JX.mjs → chunk-2PEJGY5V.mjs} +15 -20
  21. package/dist/chunk-2PEJGY5V.mjs.map +1 -0
  22. package/dist/{chunk-RIXKJPGI.mjs → chunk-42325TLU.mjs} +2 -2
  23. package/dist/chunk-4IVNW5QD.mjs +82 -0
  24. package/dist/chunk-4IVNW5QD.mjs.map +1 -0
  25. package/dist/{chunk-I3UWA2P2.mjs → chunk-5NOVWCFL.mjs} +2 -2
  26. package/dist/chunk-5NOVWCFL.mjs.map +1 -0
  27. package/dist/chunk-D42BNPZH.mjs +79 -0
  28. package/dist/chunk-D42BNPZH.mjs.map +1 -0
  29. package/dist/{chunk-LLPN5SEZ.mjs → chunk-DVPRBMU2.mjs} +2 -2
  30. package/dist/{chunk-VIC7NJ77.mjs → chunk-FJGTYLCO.mjs} +67 -20
  31. package/dist/chunk-FJGTYLCO.mjs.map +1 -0
  32. package/dist/chunk-GIELMNBG.mjs +15 -0
  33. package/dist/chunk-GIELMNBG.mjs.map +1 -0
  34. package/dist/chunk-GQVQESLY.mjs +25 -0
  35. package/dist/chunk-GQVQESLY.mjs.map +1 -0
  36. package/dist/chunk-H53KVQUU.mjs +48 -0
  37. package/dist/chunk-H53KVQUU.mjs.map +1 -0
  38. package/dist/chunk-HCGQYYHI.mjs +1 -0
  39. package/dist/chunk-HCGQYYHI.mjs.map +1 -0
  40. package/dist/{chunk-4EATUJFO.mjs → chunk-ICTGDDV4.mjs} +20 -22
  41. package/dist/chunk-ICTGDDV4.mjs.map +1 -0
  42. package/dist/{chunk-UCYWGN2P.mjs → chunk-OHNSROHS.mjs} +1 -1
  43. package/dist/{chunk-FRPWCMMG.mjs → chunk-SBWOTAX4.mjs} +63 -2
  44. package/dist/chunk-SBWOTAX4.mjs.map +1 -0
  45. package/dist/{chunk-FKKM7HVF.mjs → chunk-TX54PXAJ.mjs} +109 -58
  46. package/dist/chunk-TX54PXAJ.mjs.map +1 -0
  47. package/dist/{chunk-CEVMYGDL.mjs → chunk-YD5IRKVS.mjs} +13 -9
  48. package/dist/chunk-YD5IRKVS.mjs.map +1 -0
  49. package/dist/chunk-recovery-lnQFzcQP.d.mts +26 -0
  50. package/dist/chunk-recovery-lnQFzcQP.d.ts +26 -0
  51. package/dist/client-BT1mFQas.d.mts +447 -0
  52. package/dist/client-Nn0q4eO4.d.ts +447 -0
  53. package/dist/client-cache-CIlyBlmx.d.ts +6 -0
  54. package/dist/client-cache-D-EZ7XVW.d.mts +6 -0
  55. package/dist/client-plugins-CCilIb_G.d.mts +2092 -0
  56. package/dist/client-plugins-DuuleQKk.d.ts +2092 -0
  57. package/dist/client-plugins.d.mts +25 -0
  58. package/dist/client-plugins.d.ts +25 -0
  59. package/dist/client.cjs +122 -35
  60. package/dist/client.cjs.map +1 -1
  61. package/dist/client.d.mts +454 -0
  62. package/dist/client.d.ts +454 -0
  63. package/dist/client.mjs +13 -2
  64. package/dist/config.d.mts +32 -0
  65. package/dist/config.d.ts +32 -0
  66. package/dist/cron.d.mts +78 -0
  67. package/dist/cron.d.ts +78 -0
  68. package/dist/deferred.d.mts +42 -0
  69. package/dist/deferred.d.ts +42 -0
  70. package/dist/deployment.d.mts +36 -0
  71. package/dist/deployment.d.ts +36 -0
  72. package/dist/{devtools-52FYXIEK.mjs → devtools-326RBQCN.mjs} +7 -6
  73. package/dist/{devtools-52FYXIEK.mjs.map → devtools-326RBQCN.mjs.map} +1 -1
  74. package/dist/docs.cjs.map +1 -1
  75. package/dist/docs.d.mts +80 -0
  76. package/dist/docs.d.ts +80 -0
  77. package/dist/docs.mjs +6 -5
  78. package/dist/env-types.d.mts +12 -0
  79. package/dist/env-types.d.ts +12 -0
  80. package/dist/env.d.mts +45 -0
  81. package/dist/env.d.ts +45 -0
  82. package/dist/environment/vite.d.mts +22 -0
  83. package/dist/environment/vite.d.ts +22 -0
  84. package/dist/environment.d.mts +18 -0
  85. package/dist/environment.d.ts +18 -0
  86. package/dist/font.d.mts +95 -0
  87. package/dist/font.d.ts +95 -0
  88. package/dist/headers.d.mts +22 -0
  89. package/dist/headers.d.ts +22 -0
  90. package/dist/i18n/client.d.mts +32 -0
  91. package/dist/i18n/client.d.ts +32 -0
  92. package/dist/i18n/index.d.mts +20 -0
  93. package/dist/i18n/index.d.ts +20 -0
  94. package/dist/i18n/server.d.mts +30 -0
  95. package/dist/i18n/server.d.ts +30 -0
  96. package/dist/image/server.d.mts +37 -0
  97. package/dist/image/server.d.ts +37 -0
  98. package/dist/image/sharp.d.mts +7 -0
  99. package/dist/image/sharp.d.ts +7 -0
  100. package/dist/image-config-Duob7wER.d.mts +50 -0
  101. package/dist/image-config-Duob7wER.d.ts +50 -0
  102. package/dist/image.d.mts +39 -0
  103. package/dist/image.d.ts +39 -0
  104. package/dist/index.cjs +496 -123
  105. package/dist/index.cjs.map +1 -1
  106. package/dist/index.d.mts +480 -0
  107. package/dist/index.d.ts +480 -0
  108. package/dist/index.mjs +70 -52
  109. package/dist/index.mjs.map +1 -1
  110. package/dist/integration-api-CHT2OKAf.d.mts +93 -0
  111. package/dist/integration-api-CHT2OKAf.d.ts +93 -0
  112. package/dist/integrations.d.mts +25 -0
  113. package/dist/integrations.d.ts +25 -0
  114. package/dist/internal/build-runtime.cjs +386 -83
  115. package/dist/internal/build-runtime.cjs.map +1 -1
  116. package/dist/internal/build-runtime.d.mts +42 -0
  117. package/dist/internal/build-runtime.d.ts +42 -0
  118. package/dist/internal/build-runtime.mjs +17 -13
  119. package/dist/internal/client-runtime.d.mts +17 -0
  120. package/dist/internal/client-runtime.d.ts +17 -0
  121. package/dist/internal/config-runtime.cjs +41 -0
  122. package/dist/internal/config-runtime.cjs.map +1 -1
  123. package/dist/internal/config-runtime.d.mts +42 -0
  124. package/dist/internal/config-runtime.d.ts +42 -0
  125. package/dist/internal/config-runtime.mjs +5 -4
  126. package/dist/internal/metadata-image-runtime.d.mts +25 -0
  127. package/dist/internal/metadata-image-runtime.d.ts +25 -0
  128. package/dist/internal/production-node-env.d.mts +12 -0
  129. package/dist/internal/production-node-env.d.ts +12 -0
  130. package/dist/internal/production-runtime.cjs +178 -0
  131. package/dist/internal/production-runtime.cjs.map +1 -1
  132. package/dist/internal/production-runtime.d.mts +80 -0
  133. package/dist/internal/production-runtime.d.ts +80 -0
  134. package/dist/internal/production-runtime.mjs +13 -1
  135. package/dist/internal/production-runtime.mjs.map +1 -1
  136. package/dist/island-CfGru1MO.d.mts +9 -0
  137. package/dist/island-CfGru1MO.d.ts +9 -0
  138. package/dist/markdown.d.mts +60 -0
  139. package/dist/markdown.d.ts +60 -0
  140. package/dist/metadata-DyPRG0wX.d.ts +22 -0
  141. package/dist/metadata-_GHcAySx.d.mts +22 -0
  142. package/dist/middleware.cjs +17 -17
  143. package/dist/middleware.cjs.map +1 -1
  144. package/dist/middleware.d.mts +172 -0
  145. package/dist/middleware.d.ts +172 -0
  146. package/dist/middleware.mjs +3 -2
  147. package/dist/navigation-errors-Dvwpzaer.d.mts +13 -0
  148. package/dist/navigation-errors-Dvwpzaer.d.ts +13 -0
  149. package/dist/navigation.d.mts +14 -0
  150. package/dist/navigation.d.ts +14 -0
  151. package/dist/observability.d.mts +335 -0
  152. package/dist/observability.d.ts +335 -0
  153. package/dist/params-BALtrRim.d.ts +15 -0
  154. package/dist/params-ry-lxqmy.d.mts +15 -0
  155. package/dist/plugin-BJDf43dc.d.mts +165 -0
  156. package/dist/plugin-BJDf43dc.d.ts +165 -0
  157. package/dist/plugin.cjs +261 -62
  158. package/dist/plugin.cjs.map +1 -1
  159. package/dist/plugin.d.mts +25 -0
  160. package/dist/plugin.d.ts +25 -0
  161. package/dist/plugin.mjs +13 -9
  162. package/dist/production-runtime-C4cO3esK.d.mts +81 -0
  163. package/dist/production-runtime-DrEy8kBO.d.ts +81 -0
  164. package/dist/query/client.d.mts +61 -0
  165. package/dist/query/client.d.ts +61 -0
  166. package/dist/query/index.d.mts +90 -0
  167. package/dist/query/index.d.ts +90 -0
  168. package/dist/query/parsers.d.mts +25 -0
  169. package/dist/query/parsers.d.ts +25 -0
  170. package/dist/query/server.d.mts +55 -0
  171. package/dist/query/server.d.ts +55 -0
  172. package/dist/request-B2PpOxYK.d.mts +6 -0
  173. package/dist/request-D40lt6aN.d.ts +6 -0
  174. package/dist/request.d.mts +26 -0
  175. package/dist/request.d.ts +26 -0
  176. package/dist/resolver-DJqjLMg_.d.mts +14 -0
  177. package/dist/resolver-IH4RmPEl.d.ts +14 -0
  178. package/dist/route-runtime-DoOHzCAD.d.mts +38 -0
  179. package/dist/route-runtime-DoOHzCAD.d.ts +38 -0
  180. package/dist/router.d.mts +36 -0
  181. package/dist/router.d.ts +36 -0
  182. package/dist/routes.d.mts +227 -0
  183. package/dist/routes.d.ts +227 -0
  184. package/dist/runtime-Bpp-c28k.d.ts +231 -0
  185. package/dist/runtime-Cxpq6xZN.d.mts +27 -0
  186. package/dist/runtime-Q3u74Nbq.d.mts +231 -0
  187. package/dist/runtime-bv63eUiO.d.ts +27 -0
  188. package/dist/server-action-security.d.mts +45 -0
  189. package/dist/server-action-security.d.ts +45 -0
  190. package/dist/server-fn-client.d.mts +33 -0
  191. package/dist/server-fn-client.d.ts +33 -0
  192. package/dist/server-fn-error-DDh14a0V.d.mts +26 -0
  193. package/dist/server-fn-error-DDh14a0V.d.ts +26 -0
  194. package/dist/server-fn.d.mts +121 -0
  195. package/dist/server-fn.d.ts +121 -0
  196. package/dist/server-plugins.d.mts +58 -0
  197. package/dist/server-plugins.d.ts +58 -0
  198. package/dist/server-query-client.d.mts +51 -0
  199. package/dist/server-query-client.d.ts +51 -0
  200. package/dist/server-query.d.mts +37 -0
  201. package/dist/server-query.d.ts +37 -0
  202. package/dist/server.cjs +285 -85
  203. package/dist/server.cjs.map +1 -1
  204. package/dist/server.d.mts +53 -0
  205. package/dist/server.d.ts +53 -0
  206. package/dist/server.mjs +26 -31
  207. package/dist/server.mjs.map +1 -1
  208. package/dist/storage.d.mts +52 -0
  209. package/dist/storage.d.ts +52 -0
  210. package/dist/testing.d.mts +104 -0
  211. package/dist/testing.d.ts +104 -0
  212. package/dist/theme/client.cjs +115 -0
  213. package/dist/theme/client.cjs.map +1 -0
  214. package/dist/theme/client.d.mts +17 -0
  215. package/dist/theme/client.d.ts +17 -0
  216. package/dist/theme/client.mjs +16 -0
  217. package/dist/theme/client.mjs.map +1 -0
  218. package/dist/theme/index.cjs +71 -0
  219. package/dist/theme/index.cjs.map +1 -0
  220. package/dist/theme/index.d.mts +6 -0
  221. package/dist/theme/index.d.ts +6 -0
  222. package/dist/theme/index.mjs +9 -0
  223. package/dist/theme/index.mjs.map +1 -0
  224. package/dist/theme/server.cjs +191 -0
  225. package/dist/theme/server.cjs.map +1 -0
  226. package/dist/theme/server.d.mts +8 -0
  227. package/dist/theme/server.d.ts +8 -0
  228. package/dist/theme/server.mjs +18 -0
  229. package/dist/theme/server.mjs.map +1 -0
  230. package/dist/transport-BmbGTXA5.d.mts +49 -0
  231. package/dist/transport-BmbGTXA5.d.ts +49 -0
  232. package/dist/types-BMxWr97v.d.mts +81 -0
  233. package/dist/types-BMxWr97v.d.ts +81 -0
  234. package/dist/types-CsR8fpgF.d.mts +30 -0
  235. package/dist/types-CsR8fpgF.d.ts +30 -0
  236. package/dist/types-D1A6-XvH.d.mts +73 -0
  237. package/dist/types-D1A6-XvH.d.ts +73 -0
  238. package/dist/types-DTzm4TCl.d.mts +78 -0
  239. package/dist/types-DTzm4TCl.d.ts +78 -0
  240. package/dist/utils-3sQgfkya.d.ts +23 -0
  241. package/dist/utils-Bop7bly-.d.mts +23 -0
  242. package/dist/version.cjs +1 -1
  243. package/dist/version.cjs.map +1 -1
  244. package/dist/version.d.mts +3 -0
  245. package/dist/version.d.ts +3 -0
  246. package/dist/version.mjs +1 -1
  247. package/dist/vite.cjs +285 -64
  248. package/dist/vite.cjs.map +1 -1
  249. package/dist/vite.d.mts +25 -0
  250. package/dist/vite.d.ts +25 -0
  251. package/dist/vite.mjs +13 -9
  252. package/dist/workflows-CusFV6mn.d.mts +153 -0
  253. package/dist/workflows-CusFV6mn.d.ts +153 -0
  254. package/dist/workflows.d.mts +1 -0
  255. package/dist/workflows.d.ts +1 -0
  256. package/package.json +25 -1
  257. package/dist/chunk-4EATUJFO.mjs.map +0 -1
  258. package/dist/chunk-CEVMYGDL.mjs.map +0 -1
  259. package/dist/chunk-FKKM7HVF.mjs.map +0 -1
  260. package/dist/chunk-FRPWCMMG.mjs.map +0 -1
  261. package/dist/chunk-I3UWA2P2.mjs.map +0 -1
  262. package/dist/chunk-MIUW47JX.mjs.map +0 -1
  263. package/dist/chunk-VIC7NJ77.mjs.map +0 -1
  264. /package/dist/{chunk-RIXKJPGI.mjs.map → chunk-42325TLU.mjs.map} +0 -0
  265. /package/dist/{chunk-LLPN5SEZ.mjs.map → chunk-DVPRBMU2.mjs.map} +0 -0
  266. /package/dist/{chunk-UCYWGN2P.mjs.map → chunk-OHNSROHS.mjs.map} +0 -0
package/dist/index.cjs CHANGED
@@ -14325,12 +14325,201 @@ body {
14325
14325
  }
14326
14326
  });
14327
14327
 
14328
+ // src/theme/config.ts
14329
+ function resolveFarmThemeConfig(config, basePath = "/") {
14330
+ if (config && "enabled" in config) {
14331
+ return config;
14332
+ }
14333
+ if (!config) {
14334
+ return {
14335
+ enabled: false,
14336
+ default: "system",
14337
+ storageKey: DEFAULT_FARM_THEME_STORAGE_KEY,
14338
+ cookiePath: normalizeCookiePath(basePath)
14339
+ };
14340
+ }
14341
+ const storageKey = config.storageKey?.trim() || DEFAULT_FARM_THEME_STORAGE_KEY;
14342
+ if (!STORAGE_KEY_PATTERN.test(storageKey)) {
14343
+ throw new Error(
14344
+ "theme.storageKey may only contain letters, numbers, dots, underscores, and hyphens."
14345
+ );
14346
+ }
14347
+ const defaultTheme = config.default ?? "system";
14348
+ if (defaultTheme !== "light" && defaultTheme !== "dark" && defaultTheme !== "system") {
14349
+ throw new Error('theme.default must be "light", "dark", or "system".');
14350
+ }
14351
+ return {
14352
+ enabled: true,
14353
+ default: defaultTheme,
14354
+ storageKey,
14355
+ cookiePath: normalizeCookiePath(basePath)
14356
+ };
14357
+ }
14358
+ function normalizeCookiePath(basePath) {
14359
+ const normalized = `/${basePath}`.replace(/\/{2,}/g, "/");
14360
+ if (normalized === "/") return normalized;
14361
+ return normalized.replace(/\/$/, "");
14362
+ }
14363
+ var DEFAULT_FARM_THEME_STORAGE_KEY, STORAGE_KEY_PATTERN;
14364
+ var init_config2 = __esm({
14365
+ "src/theme/config.ts"() {
14366
+ "use strict";
14367
+ DEFAULT_FARM_THEME_STORAGE_KEY = "farm-theme";
14368
+ STORAGE_KEY_PATTERN = /^[A-Za-z0-9._-]+$/;
14369
+ __name(resolveFarmThemeConfig, "resolveFarmThemeConfig");
14370
+ __name(normalizeCookiePath, "normalizeCookiePath");
14371
+ }
14372
+ });
14373
+
14374
+ // src/theme/server-runtime.ts
14375
+ function createFarmThemeDocumentParts(input, basePath = "/", serverTheme) {
14376
+ const config = resolveFarmThemeConfig(input, basePath);
14377
+ if (!config.enabled) return { attributes: "", head: "" };
14378
+ const hydrationTheme = serverTheme ?? config.default;
14379
+ const initialTheme = hydrationTheme === "system" ? "light" : hydrationTheme;
14380
+ const script = createFarmThemeBootstrapScript(config, hydrationTheme);
14381
+ return {
14382
+ attributes: ` data-theme="${initialTheme}"`,
14383
+ 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>`
14384
+ };
14385
+ }
14386
+ function createFarmThemeBootstrapScript(config, serverTheme = config.default) {
14387
+ return `(function(config,serverTheme){
14388
+ var isTheme=function(value){return value==="light"||value==="dark"||value==="system";};
14389
+ var decode=function(value){try{return decodeURIComponent(value);}catch(_error){return value;}};
14390
+ 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());}};
14391
+ var media=window.matchMedia("(prefers-color-scheme: dark)");
14392
+ var resolveTheme=function(theme){return theme==="system"?(media.matches?"dark":"light"):theme;};
14393
+ var storedTheme=readCookie();
14394
+ var preference=isTheme(storedTheme)?storedTheme:config.default;
14395
+ var serverSnapshot={theme:serverTheme,resolvedTheme:serverTheme==="system"?undefined:serverTheme,mounted:false};
14396
+ 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;};
14397
+ var emit=function(){var snapshot=apply();window.dispatchEvent(new CustomEvent("farm:themechange",{detail:snapshot}));};
14398
+ 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){}};
14399
+ var setTheme=function(theme){if(!isTheme(theme))throw new TypeError("Unknown FARMJS theme: "+String(theme));preference=theme;persist(theme);emit();};
14400
+ var initialSnapshot={theme:preference,resolvedTheme:resolveTheme(preference),mounted:true};
14401
+ window.__FARM_THEME__={config:config,serverSnapshot:serverSnapshot,snapshot:initialSnapshot,setTheme:setTheme};
14402
+ document.documentElement.dataset.theme=initialSnapshot.resolvedTheme;
14403
+ var handleSystemChange=function(){if(preference==="system")emit();};
14404
+ if(typeof media.addEventListener==="function")media.addEventListener("change",handleSystemChange);else if(typeof media.addListener==="function")media.addListener(handleSystemChange);
14405
+ window.addEventListener("storage",function(event){if(event.key!==config.storageKey||!isTheme(event.newValue))return;preference=event.newValue;persist(preference);emit();});
14406
+ })(${serializeInlineValue(config)},${serializeInlineValue(serverTheme)});`;
14407
+ }
14408
+ function serializeInlineValue(value) {
14409
+ return JSON.stringify(value).replace(/</g, "\\u003c").replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029");
14410
+ }
14411
+ var THEME_SCRIPT_ID, THEME_STYLE_ID;
14412
+ var init_server_runtime = __esm({
14413
+ "src/theme/server-runtime.ts"() {
14414
+ "use strict";
14415
+ init_config2();
14416
+ THEME_SCRIPT_ID = "farm-theme-script";
14417
+ THEME_STYLE_ID = "farm-theme-style";
14418
+ __name(createFarmThemeDocumentParts, "createFarmThemeDocumentParts");
14419
+ __name(createFarmThemeBootstrapScript, "createFarmThemeBootstrapScript");
14420
+ __name(serializeInlineValue, "serializeInlineValue");
14421
+ }
14422
+ });
14423
+
14424
+ // src/theme/bridge.ts
14425
+ function _setFarmThemeServerSnapshotResolver(resolver) {
14426
+ globalThis[FARM_THEME_SERVER_SNAPSHOT_RESOLVER] = resolver;
14427
+ }
14428
+ function getFarmThemeServerSnapshot() {
14429
+ return globalThis[FARM_THEME_SERVER_SNAPSHOT_RESOLVER]?.() ?? FALLBACK_SERVER_SNAPSHOT;
14430
+ }
14431
+ var FALLBACK_SERVER_SNAPSHOT, FARM_THEME_SERVER_SNAPSHOT_RESOLVER;
14432
+ var init_bridge2 = __esm({
14433
+ "src/theme/bridge.ts"() {
14434
+ "use strict";
14435
+ FALLBACK_SERVER_SNAPSHOT = Object.freeze({
14436
+ theme: "system",
14437
+ resolvedTheme: void 0,
14438
+ mounted: false
14439
+ });
14440
+ FARM_THEME_SERVER_SNAPSHOT_RESOLVER = /* @__PURE__ */ Symbol.for("farm.js.theme.server-snapshot-resolver");
14441
+ __name(_setFarmThemeServerSnapshotResolver, "_setFarmThemeServerSnapshotResolver");
14442
+ __name(getFarmThemeServerSnapshot, "getFarmThemeServerSnapshot");
14443
+ }
14444
+ });
14445
+
14446
+ // src/theme/server.ts
14447
+ function _setDefaultFarmThemeConfig(config, basePath = "/") {
14448
+ defaultThemeConfig = resolveFarmThemeConfig(config, basePath);
14449
+ }
14450
+ function getTheme(request = getCurrentRequest()) {
14451
+ return readFarmThemePreference(request, defaultThemeConfig);
14452
+ }
14453
+ function getThemeSnapshot(request = getCurrentRequest()) {
14454
+ const theme = readFarmThemePreference(request, defaultThemeConfig);
14455
+ return {
14456
+ theme,
14457
+ resolvedTheme: theme === "system" ? void 0 : theme,
14458
+ mounted: false
14459
+ };
14460
+ }
14461
+ function readFarmThemePreference(request, config) {
14462
+ if (!config.enabled) return config.default;
14463
+ const stored = readCookie3(request.headers.get("cookie"), config.storageKey);
14464
+ return isFarmThemePreference(stored) ? stored : config.default;
14465
+ }
14466
+ function readCookie3(cookieHeader, name) {
14467
+ if (!cookieHeader) return void 0;
14468
+ for (const entry of cookieHeader.split(";")) {
14469
+ const separator = entry.indexOf("=");
14470
+ if (separator < 0) continue;
14471
+ const key = decodeCookieValue(entry.slice(0, separator).trim());
14472
+ if (key !== name) continue;
14473
+ return decodeCookieValue(entry.slice(separator + 1).trim());
14474
+ }
14475
+ return void 0;
14476
+ }
14477
+ function decodeCookieValue(value) {
14478
+ try {
14479
+ return decodeURIComponent(value);
14480
+ } catch {
14481
+ return value;
14482
+ }
14483
+ }
14484
+ function isFarmThemePreference(value) {
14485
+ return value === "light" || value === "dark" || value === "system";
14486
+ }
14487
+ var defaultThemeConfig;
14488
+ var init_server3 = __esm({
14489
+ "src/theme/server.ts"() {
14490
+ "use strict";
14491
+ init_request();
14492
+ init_bridge2();
14493
+ init_config2();
14494
+ defaultThemeConfig = resolveFarmThemeConfig(void 0);
14495
+ __name(_setDefaultFarmThemeConfig, "_setDefaultFarmThemeConfig");
14496
+ __name(getTheme, "getTheme");
14497
+ __name(getThemeSnapshot, "getThemeSnapshot");
14498
+ __name(readFarmThemePreference, "readFarmThemePreference");
14499
+ __name(readCookie3, "readCookie");
14500
+ __name(decodeCookieValue, "decodeCookieValue");
14501
+ __name(isFarmThemePreference, "isFarmThemePreference");
14502
+ _setFarmThemeServerSnapshotResolver(() => {
14503
+ try {
14504
+ return getThemeSnapshot();
14505
+ } catch {
14506
+ const theme = defaultThemeConfig.default;
14507
+ return {
14508
+ theme,
14509
+ resolvedTheme: theme === "system" ? void 0 : theme,
14510
+ mounted: false
14511
+ };
14512
+ }
14513
+ });
14514
+ }
14515
+ });
14516
+
14328
14517
  // src/server/renderer.ts
14329
14518
  function hasRequestHeader(req, name) {
14330
14519
  const value = req.headers[name.toLowerCase()];
14331
14520
  return Array.isArray(value) ? value.length > 0 : Boolean(value);
14332
14521
  }
14333
- function serializeInlineValue(value) {
14522
+ function serializeInlineValue2(value) {
14334
14523
  return JSON.stringify(value).replace(/</g, "\\u003c").replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029");
14335
14524
  }
14336
14525
  function escapeHtmlAttribute2(value) {
@@ -14417,7 +14606,7 @@ function createDocumentFooter(options) {
14417
14606
  }
14418
14607
  function createDeferredHydrationScript(records) {
14419
14608
  if (records.length === 0) return "";
14420
- return `<script>window.__FARM_DEFERRED_DATA__=${serializeInlineValue(
14609
+ return `<script>window.__FARM_DEFERRED_DATA__=${serializeInlineValue2(
14421
14610
  snapshotDeferredData(records)
14422
14611
  )};</script>`;
14423
14612
  }
@@ -14510,10 +14699,12 @@ var init_renderer = __esm({
14510
14699
  init_font_vite();
14511
14700
  init_metadata_image();
14512
14701
  init_not_found();
14702
+ init_server_runtime();
14703
+ init_server3();
14513
14704
  cachedClerkProvider = null;
14514
14705
  importRuntimeModule = new Function("specifier", "return import(specifier);");
14515
14706
  __name(hasRequestHeader, "hasRequestHeader");
14516
- __name(serializeInlineValue, "serializeInlineValue");
14707
+ __name(serializeInlineValue2, "serializeInlineValue");
14517
14708
  __name(escapeHtmlAttribute2, "escapeHtmlAttribute");
14518
14709
  __name(appendResponseHeader, "appendResponseHeader");
14519
14710
  __name(appendResponseVary, "appendResponseVary");
@@ -15601,9 +15792,9 @@ var init_renderer = __esm({
15601
15792
  slots: routeSlotPayload
15602
15793
  });
15603
15794
  const propsScript = `<script>
15604
- window.__FARM_PROPS__ = ${serializeInlineValue(deferredProps.data.page)};
15605
- window.__FARM_ROUTE_SLOTS__ = ${serializeInlineValue(deferredProps.data.slots)};
15606
- window.__FARM_DEPLOYMENT_ID__ = ${serializeInlineValue(deploymentId)};
15795
+ window.__FARM_PROPS__ = ${serializeInlineValue2(deferredProps.data.page)};
15796
+ window.__FARM_ROUTE_SLOTS__ = ${serializeInlineValue2(deferredProps.data.slots)};
15797
+ window.__FARM_DEPLOYMENT_ID__ = ${serializeInlineValue2(deploymentId)};
15607
15798
  window.__FARM_PATH__ = ${JSON.stringify(req.__FARM_ROUTE__ || req.url || "/")};
15608
15799
  window.__FARM_IS_CLIENT__ = ${JSON.stringify(isClientComponent)};
15609
15800
  window.__FARM_PAGE_SHOULD_HYDRATE__ = ${JSON.stringify(
@@ -15621,7 +15812,7 @@ window.__FARM_LOADING_MODULE__ = ${JSON.stringify(
15621
15812
  )};
15622
15813
  window.__FARM_MANIFEST__ = ${JSON.stringify(clientManifest)};
15623
15814
  window.__FARM_INTEGRATION_API_MANIFEST__ = ${JSON.stringify(getRegisteredIntegrationAPIManifest())};
15624
- ${getFarmI18nClientSnapshot() ? `window.__FARM_I18N__ = ${serializeInlineValue(getFarmI18nClientSnapshot())};` : ""}
15815
+ ${getFarmI18nClientSnapshot() ? `window.__FARM_I18N__ = ${serializeInlineValue2(getFarmI18nClientSnapshot())};` : ""}
15625
15816
  </script>`;
15626
15817
  const hydrationClickQueueScript = isClientComponent || req.__FARM_SHOULD_HYDRATE__ === true || req.__FARM_HAS_HYDRATABLE_ROUTE_SLOTS__ === true ? createPreHydrationClickQueueScript() : "";
15627
15818
  const {
@@ -15632,6 +15823,11 @@ ${getFarmI18nClientSnapshot() ? `window.__FARM_I18N__ = ${serializeInlineValue(g
15632
15823
  const i18nSnapshot = getFarmI18nClientSnapshot();
15633
15824
  const i18nAlternateTags = i18nSnapshot ? renderI18nAlternateLinks(req.__FARM_ROUTE__ || req.url || "/", i18nSnapshot) : "";
15634
15825
  const fontHead = renderFarmFontDevHead(this.config.root || process.cwd());
15826
+ const themeDocument = createFarmThemeDocumentParts(
15827
+ this.config.theme,
15828
+ this.config.basePath,
15829
+ getTheme()
15830
+ );
15635
15831
  const streamRoot = import_react5.default.createElement("div", { style: { display: "contents" } }, element);
15636
15832
  const { pipe } = (0, import_server2.renderToPipeableStream)(streamRoot, {
15637
15833
  onShellReady() {
@@ -15645,8 +15841,9 @@ ${getFarmI18nClientSnapshot() ? `window.__FARM_I18N__ = ${serializeInlineValue(g
15645
15841
  console.log(`[FARM STREAM] onShellReady at ${shellReadyMs}ms`);
15646
15842
  }
15647
15843
  const shell = `<!DOCTYPE html>
15648
- <html lang="${escapeHtmlAttribute2(i18nSnapshot?.locale || "en")}"${i18nSnapshot ? ` dir="${i18nSnapshot.direction}"` : ""}>
15844
+ <html lang="${escapeHtmlAttribute2(i18nSnapshot?.locale || "en")}"${i18nSnapshot ? ` dir="${i18nSnapshot.direction}"` : ""}${themeDocument.attributes}>
15649
15845
  <head>
15846
+ ${themeDocument.head}
15650
15847
  <meta charset="utf-8">
15651
15848
  <meta name="viewport" content="width=device-width, initial-scale=1">
15652
15849
  <meta name="farm-deployment-id" content="${escapeHtmlAttribute2(deploymentId)}">
@@ -15848,15 +16045,21 @@ ${getFarmI18nClientSnapshot() ? `window.__FARM_I18N__ = ${serializeInlineValue(g
15848
16045
  const i18nSnapshot = getFarmI18nClientSnapshot();
15849
16046
  const clientScript = isClientComponent ? ` <script type="module" src="/@farm/client.js"></script>` : "";
15850
16047
  const integrationManifestScript = `<script>
15851
- window.__FARM_DEPLOYMENT_ID__ = ${serializeInlineValue(this.getDeploymentId())};
16048
+ window.__FARM_DEPLOYMENT_ID__ = ${serializeInlineValue2(this.getDeploymentId())};
15852
16049
  window.__FARM_INTEGRATION_API_MANIFEST__ = ${JSON.stringify(getRegisteredIntegrationAPIManifest())};
15853
- ${i18nSnapshot ? `window.__FARM_I18N__ = ${serializeInlineValue(i18nSnapshot)};` : ""}
16050
+ ${i18nSnapshot ? `window.__FARM_I18N__ = ${serializeInlineValue2(i18nSnapshot)};` : ""}
15854
16051
  </script>`;
15855
16052
  const alternateLinks = i18nSnapshot ? renderI18nAlternateLinks(requestPath, i18nSnapshot) : "";
15856
16053
  const fontHead = renderFarmFontDevHead(this.config.root || process.cwd());
16054
+ const themeDocument = createFarmThemeDocumentParts(
16055
+ this.config.theme,
16056
+ this.config.basePath,
16057
+ getTheme()
16058
+ );
15857
16059
  return `<!DOCTYPE html>
15858
- <html lang="${escapeHtmlAttribute2(i18nSnapshot?.locale || "en")}"${i18nSnapshot ? ` dir="${i18nSnapshot.direction}"` : ""}>
16060
+ <html lang="${escapeHtmlAttribute2(i18nSnapshot?.locale || "en")}"${i18nSnapshot ? ` dir="${i18nSnapshot.direction}"` : ""}${themeDocument.attributes}>
15859
16061
  <head>
16062
+ ${themeDocument.head}
15860
16063
  <meta charset="utf-8">
15861
16064
  <meta name="viewport" content="width=device-width, initial-scale=1">
15862
16065
  <meta name="farm-deployment-id" content="${escapeHtmlAttribute2(this.getDeploymentId())}">
@@ -16218,6 +16421,8 @@ var init_app = __esm({
16218
16421
  init_auth_config();
16219
16422
  init_preload();
16220
16423
  init_security();
16424
+ init_config2();
16425
+ init_server3();
16221
16426
  defaultDocsConfig = {
16222
16427
  enabled: false,
16223
16428
  entry: "/docs",
@@ -16228,6 +16433,7 @@ var init_app = __esm({
16228
16433
  constructor(config = {}, viteServer) {
16229
16434
  this.config = this.normalizeConfig(config);
16230
16435
  configureFarmObservability(this.config.observability);
16436
+ _setDefaultFarmThemeConfig(this.config.theme);
16231
16437
  this.i18nRuntime = createFarmI18nRuntime(this.config.i18n);
16232
16438
  _setDefaultFarmI18nRuntime(this.i18nRuntime);
16233
16439
  this.viteServer = viteServer;
@@ -16286,6 +16492,7 @@ var init_app = __esm({
16286
16492
  security: resolveFarmSecurityConfig(config.security),
16287
16493
  images: resolveFarmImageConfig(config.images),
16288
16494
  performance: resolveFarmPerformanceConfig(config.performance),
16495
+ theme: resolveFarmThemeConfig(config.theme, config.basePath || "/"),
16289
16496
  i18n: isResolvedI18nConfig(config.i18n) ? config.i18n : resolveFarmI18nConfig(config.i18n, {
16290
16497
  root,
16291
16498
  mode: process.env.NODE_ENV === "production" ? "production" : "development"
@@ -18150,6 +18357,19 @@ var init_module = __esm({
18150
18357
  }
18151
18358
  });
18152
18359
 
18360
+ // src/cli-colors.ts
18361
+ function createCliColors(interactive = process.stdout.isTTY === true) {
18362
+ return import_picocolors.default.createColors(interactive);
18363
+ }
18364
+ var import_picocolors;
18365
+ var init_cli_colors = __esm({
18366
+ "src/cli-colors.ts"() {
18367
+ "use strict";
18368
+ import_picocolors = __toESM(require("picocolors"));
18369
+ __name(createCliColors, "createCliColors");
18370
+ }
18371
+ });
18372
+
18153
18373
  // src/middleware/manager.ts
18154
18374
  function isMiddlewareResponse(value) {
18155
18375
  return value instanceof Response;
@@ -18166,6 +18386,7 @@ var init_manager = __esm({
18166
18386
  init_response();
18167
18387
  init_observability();
18168
18388
  init_routing();
18389
+ init_cli_colors();
18169
18390
  __name(isMiddlewareResponse, "isMiddlewareResponse");
18170
18391
  _MiddlewareManager = class _MiddlewareManager {
18171
18392
  constructor(appDir, viteServer, config, i18n) {
@@ -18319,23 +18540,16 @@ var init_manager = __esm({
18319
18540
  if (applicable.length === 0) {
18320
18541
  return false;
18321
18542
  }
18322
- try {
18323
- const pc = require("picocolors");
18324
- const middlewarePaths = applicable.map(({ mw }) => mw.path).join(", ");
18325
- const log = [
18326
- pc.dim("[") + pc.bold(pc.blue("FARM")) + pc.dim("]"),
18327
- pc.dim("[") + pc.bold(pc.magenta("MIDDLEWARE")) + pc.dim("]"),
18328
- pc.dim("[") + pc.bold(pc.white(method.padEnd(3))) + pc.dim("]"),
18329
- pc.gray("Executing middleware: "),
18330
- pc.gray(pathname),
18331
- pc.dim(` (${(Date.now() - startTime).toFixed(2)}ms)`)
18332
- ].join(" ");
18333
- console.log(log);
18334
- } catch {
18335
- console.log(
18336
- `[FARM] [MIDDLEWARE] [${method}] Executing ${pathname} (${applicable.length} middleware)`
18337
- );
18338
- }
18543
+ const pc = createCliColors();
18544
+ const log = [
18545
+ pc.dim("[") + pc.bold(pc.blue("FARM")) + pc.dim("]"),
18546
+ pc.dim("[") + pc.bold(pc.magenta("MIDDLEWARE")) + pc.dim("]"),
18547
+ pc.dim("[") + pc.bold(pc.white(method.padEnd(3))) + pc.dim("]"),
18548
+ pc.gray("Executing middleware: "),
18549
+ pc.gray(pathname),
18550
+ pc.dim(` (${(Date.now() - startTime).toFixed(2)}ms)`)
18551
+ ].join(" ");
18552
+ console.log(log);
18339
18553
  for (const entry of applicable) {
18340
18554
  const { mw, routeMatch } = entry;
18341
18555
  const configMatch = mw.config ? this.matchesConfig(routePathname, mw.config, ctx) : { matched: true };
@@ -19846,7 +20060,7 @@ var init_environment_vite = __esm({
19846
20060
  var version;
19847
20061
  var init_package = __esm({
19848
20062
  "package.json"() {
19849
- version = "0.1.0-beta.21";
20063
+ version = "0.1.0-beta.23";
19850
20064
  }
19851
20065
  });
19852
20066
 
@@ -20746,6 +20960,36 @@ var init_fonts = __esm({
20746
20960
  }
20747
20961
  });
20748
20962
 
20963
+ // src/theme/vite.ts
20964
+ function createFarmThemeCssPlugin(input, basePath = "/") {
20965
+ const config = resolveFarmThemeConfig(input, basePath);
20966
+ return {
20967
+ name: "farm:theme-css",
20968
+ enforce: "pre",
20969
+ transform(code, id) {
20970
+ if (!config.enabled || !/\.css(?:\?.*)?$/.test(id) || !/@import\s+["']tailwindcss["']/.test(code) || /@custom-variant\s+dark\b/.test(code)) {
20971
+ return null;
20972
+ }
20973
+ return {
20974
+ code: `${code.trimEnd()}
20975
+
20976
+ ${FARM_DARK_VARIANT}
20977
+ `,
20978
+ map: null
20979
+ };
20980
+ }
20981
+ };
20982
+ }
20983
+ var FARM_DARK_VARIANT;
20984
+ var init_vite = __esm({
20985
+ "src/theme/vite.ts"() {
20986
+ "use strict";
20987
+ init_config2();
20988
+ FARM_DARK_VARIANT = '@custom-variant dark (&:where([data-theme="dark"], [data-theme="dark"] *));';
20989
+ __name(createFarmThemeCssPlugin, "createFarmThemeCssPlugin");
20990
+ }
20991
+ });
20992
+
20749
20993
  // src/docs/last-modified.ts
20750
20994
  function normalizeRelativePath(value) {
20751
20995
  return value.replace(/\\/g, "/").replace(/^\.\/+/, "");
@@ -24723,6 +24967,7 @@ async function resolveConfig(userConfig, mode) {
24723
24967
  routeRules,
24724
24968
  images: resolveFarmImageConfig(userConfig.images),
24725
24969
  performance: resolveFarmPerformanceConfig(userConfig.performance),
24970
+ theme: resolveFarmThemeConfig(userConfig.theme, userConfig.basePath || "/"),
24726
24971
  publicDir: userConfig.publicDir || "public",
24727
24972
  i18n: resolveFarmI18nConfig(userConfig.i18n, { root, mode }),
24728
24973
  openapi: {
@@ -24800,7 +25045,7 @@ async function loadConfig(rootDir, configPath, mode = process.env.NODE_ENV === "
24800
25045
  return void 0;
24801
25046
  }
24802
25047
  var import_path9, FARM_RESOLVED_CUSTOM_CONTEXT, DOCS_CONFIG_FILENAMES;
24803
- var init_config2 = __esm({
25048
+ var init_config3 = __esm({
24804
25049
  "src/config.ts"() {
24805
25050
  "use strict";
24806
25051
  init_integrations();
@@ -24821,6 +25066,7 @@ var init_config2 = __esm({
24821
25066
  init_auth_config();
24822
25067
  init_preload();
24823
25068
  init_security();
25069
+ init_config2();
24824
25070
  init_config_entry();
24825
25071
  FARM_RESOLVED_CUSTOM_CONTEXT = /* @__PURE__ */ Symbol.for("farm.resolvedCustomContext");
24826
25072
  __name(hasCustomFarmRouteContext, "hasCustomFarmRouteContext");
@@ -25325,7 +25571,7 @@ var init_api = __esm({
25325
25571
  "src/docs/api.ts"() {
25326
25572
  "use strict";
25327
25573
  import_docs2 = require("@farming-labs/docs");
25328
- init_config2();
25574
+ init_config3();
25329
25575
  init_handler();
25330
25576
  __name(isRecord4, "isRecord");
25331
25577
  __name(isResolvedDocsConfig2, "isResolvedDocsConfig");
@@ -26310,7 +26556,7 @@ var init_devtools = __esm({
26310
26556
  "src/devtools.ts"() {
26311
26557
  "use strict";
26312
26558
  import_node_path14 = __toESM(require("path"));
26313
- init_config2();
26559
+ init_config3();
26314
26560
  init_cron();
26315
26561
  init_route_runtime();
26316
26562
  __name(normalizePath, "normalizePath");
@@ -28212,18 +28458,14 @@ function farmPlugin(options = {}, initialPluginManager) {
28212
28458
  let refreshRouteDiscovery = null;
28213
28459
  let workflowHandler = null;
28214
28460
  const logUpdate = /* @__PURE__ */ __name((tag, message) => {
28215
- try {
28216
- const pc = require("picocolors");
28217
- const log = [
28218
- pc.dim("[") + pc.bold(pc.blue("FARM")) + pc.dim("]"),
28219
- pc.dim("[") + pc.bold(pc.cyan(tag)) + pc.dim("]"),
28220
- pc.dim("[") + pc.bold(pc.yellow("UPDATE")) + pc.dim("]"),
28221
- pc.gray(message)
28222
- ].join(" ");
28223
- console.log(log);
28224
- } catch {
28225
- console.log(`[FARM] [${tag}] [UPDATE] ${message}`);
28226
- }
28461
+ const pc = createCliColors();
28462
+ const log = [
28463
+ pc.dim("[") + pc.bold(pc.blue("FARM")) + pc.dim("]"),
28464
+ pc.dim("[") + pc.bold(pc.cyan(tag)) + pc.dim("]"),
28465
+ pc.dim("[") + pc.bold(pc.yellow("UPDATE")) + pc.dim("]"),
28466
+ pc.gray(message)
28467
+ ].join(" ");
28468
+ console.log(log);
28227
28469
  }, "logUpdate");
28228
28470
  return {
28229
28471
  name: "farm",
@@ -28664,25 +28906,21 @@ window.__FARM_MANIFEST__ = ${inlineValue({
28664
28906
  return;
28665
28907
  }
28666
28908
  logResponse.__last = { key: dedupeKey, ts: now2 };
28667
- try {
28668
- const pc = require("picocolors");
28669
- let statusColor = pc.green;
28670
- if (status >= 500) statusColor = pc.red;
28671
- else if (status >= 400) statusColor = pc.yellow;
28672
- else if (status >= 300) statusColor = pc.cyan;
28673
- const log = [
28674
- pc.dim("[") + pc.bold(pc.blue("FARM")) + pc.dim("]"),
28675
- pc.dim("[") + pc.bold(pc.cyan(tag)) + pc.dim("]"),
28676
- pc.dim("[") + pc.bold(pc.white(method.padEnd(3))) + pc.dim("]"),
28677
- pc.gray(urlPath),
28678
- pc.dim("-"),
28679
- statusColor(status.toString()),
28680
- pc.dim(`(${duration}ms)`)
28681
- ].join(" ");
28682
- console.log(log);
28683
- } catch {
28684
- console.log(`[FARM] [${tag}] [${method}] ${urlPath} - ${status} (${duration}ms)`);
28685
- }
28909
+ const pc = createCliColors();
28910
+ let statusColor = pc.green;
28911
+ if (status >= 500) statusColor = pc.red;
28912
+ else if (status >= 400) statusColor = pc.yellow;
28913
+ else if (status >= 300) statusColor = pc.cyan;
28914
+ const log = [
28915
+ pc.dim("[") + pc.bold(pc.blue("FARM")) + pc.dim("]"),
28916
+ pc.dim("[") + pc.bold(pc.cyan(tag)) + pc.dim("]"),
28917
+ pc.dim("[") + pc.bold(pc.white(method.padEnd(3))) + pc.dim("]"),
28918
+ pc.gray(urlPath),
28919
+ pc.dim("-"),
28920
+ statusColor(status.toString()),
28921
+ pc.dim(`(${duration}ms)`)
28922
+ ].join(" ");
28923
+ console.log(log);
28686
28924
  }, "logResponse");
28687
28925
  server.middlewares.use(
28688
28926
  _withAfterNodeMiddleware(async (req, res, next) => {
@@ -31296,14 +31534,22 @@ async function renderPage(pageData) {
31296
31534
  if (!doc.documentElement || !doc.body) return false;
31297
31535
 
31298
31536
  resetReactRoots();
31537
+ const activeFarmTheme =
31538
+ window.__FARM_THEME__?.snapshot?.resolvedTheme ||
31539
+ document.documentElement.getAttribute('data-theme');
31299
31540
  Array.from(document.documentElement.attributes).forEach(function(attr) {
31541
+ if (attr.name === 'data-theme') return;
31300
31542
  if (!doc.documentElement.hasAttribute(attr.name)) {
31301
31543
  document.documentElement.removeAttribute(attr.name);
31302
31544
  }
31303
31545
  });
31304
31546
  Array.from(doc.documentElement.attributes).forEach(function(attr) {
31547
+ if (attr.name === 'data-theme') return;
31305
31548
  document.documentElement.setAttribute(attr.name, attr.value);
31306
31549
  });
31550
+ if (activeFarmTheme) {
31551
+ document.documentElement.setAttribute('data-theme', activeFarmTheme);
31552
+ }
31307
31553
 
31308
31554
  document.head.innerHTML = doc.head ? doc.head.innerHTML : '';
31309
31555
  document.body.innerHTML = doc.body.innerHTML;
@@ -31312,6 +31558,7 @@ async function renderPage(pageData) {
31312
31558
 
31313
31559
  setTimeout(function() {
31314
31560
  Array.from(document.querySelectorAll('script')).forEach(function(script) {
31561
+ if (script.id === 'farm-theme-script') return;
31315
31562
  const freshScript = document.createElement('script');
31316
31563
  Array.from(script.attributes).forEach(function(attr) {
31317
31564
  freshScript.setAttribute(attr.name, attr.value);
@@ -31739,7 +31986,7 @@ async function defineConfig2(config = {}) {
31739
31986
  return null;
31740
31987
  }
31741
31988
  };
31742
- const pc = await import("picocolors").then((m) => m.default);
31989
+ const pc = createCliColors();
31743
31990
  let serverStarted = false;
31744
31991
  let startTime = Date.now();
31745
31992
  const farmLogger = {
@@ -31806,6 +32053,7 @@ async function defineConfig2(config = {}) {
31806
32053
  };
31807
32054
  return {
31808
32055
  plugins: [
32056
+ createFarmThemeCssPlugin(config.theme, config.basePath),
31809
32057
  tailwindcss(),
31810
32058
  viteBrowserExternalPlugin,
31811
32059
  farmI18nClientBridgePlugin(),
@@ -31878,7 +32126,7 @@ async function defineConfig2(config = {}) {
31878
32126
  };
31879
32127
  }
31880
32128
  var fs7, path25, ALL_TYPE_ARTIFACTS, createEmptyTypeArtifactSelection, FARM_I18N_CLIENT_BRIDGE_ID, EMPTY_FARM_DOCS_SEARCH_CLIENT_RUNTIME, FARM_CONFIG_FILENAMES;
31881
- var init_vite = __esm({
32129
+ var init_vite2 = __esm({
31882
32130
  "src/vite.ts"() {
31883
32131
  "use strict";
31884
32132
  init_app();
@@ -31914,6 +32162,8 @@ var init_vite = __esm({
31914
32162
  init_vite_config();
31915
32163
  init_fonts();
31916
32164
  init_server_http();
32165
+ init_cli_colors();
32166
+ init_vite();
31917
32167
  ALL_TYPE_ARTIFACTS = {
31918
32168
  routes: true,
31919
32169
  api: true,
@@ -32013,7 +32263,7 @@ var init_plugin = __esm({
32013
32263
  init_env();
32014
32264
  init_request_context();
32015
32265
  init_plugin_integration_context();
32016
- init_vite();
32266
+ init_vite2();
32017
32267
  _FarmRuntimeShutdownError = class _FarmRuntimeShutdownError extends Error {
32018
32268
  constructor(message, errors) {
32019
32269
  super(message);
@@ -33577,6 +33827,7 @@ __export(src_exports, {
33577
33827
  getServerActionInvalidations: () => getServerActionInvalidations,
33578
33828
  getServerActionSignal: () => getServerActionSignal,
33579
33829
  getStorage: () => getStorage,
33830
+ getTheme: () => getTheme2,
33580
33831
  globFiles: () => globFiles,
33581
33832
  hasFarmRouteRuntimeControls: () => hasFarmRouteRuntimeControls,
33582
33833
  hasISR: () => hasISR,
@@ -33693,6 +33944,7 @@ __export(src_exports, {
33693
33944
  resolveFarmLayoutFonts: () => resolveFarmLayoutFonts,
33694
33945
  resolveFarmRouteRuleRuntimeConfig: () => resolveFarmRouteRuleRuntimeConfig,
33695
33946
  resolveFarmRouteRuntimeConfig: () => resolveFarmRouteRuntimeConfig,
33947
+ resolveFarmThemeConfig: () => resolveFarmThemeConfig,
33696
33948
  resolveIntegrationOrmRuntimeClient: () => resolveIntegrationOrmRuntimeClient,
33697
33949
  resolveIntegrationPlugins: () => resolveIntegrationPlugins,
33698
33950
  resolveMarkdownConfig: () => resolveMarkdownConfig,
@@ -33719,12 +33971,14 @@ __export(src_exports, {
33719
33971
  segmentsToPattern: () => segmentsToPattern,
33720
33972
  serverEnv: () => serverEnv,
33721
33973
  setEnv: () => setEnv,
33974
+ setTheme: () => setTheme,
33722
33975
  snapshotDeferredData: () => snapshotDeferredData,
33723
33976
  sqliteStorage: () => sqliteStorage,
33724
33977
  storageCacheAdapter: () => storageCacheAdapter,
33725
33978
  titleFromMarkdown: () => titleFromMarkdown,
33726
33979
  toFormData: () => toFormData,
33727
33980
  toViteModuleId: () => toViteModuleId,
33981
+ toggleTheme: () => toggleTheme,
33728
33982
  unstable_cache: () => unstable_cache,
33729
33983
  unwrapMiddleware: () => unwrapMiddleware,
33730
33984
  updateTag: () => updateTag,
@@ -33740,6 +33994,7 @@ __export(src_exports, {
33740
33994
  useSearchParams: () => useSearchParams,
33741
33995
  useServerFn: () => useServerFn,
33742
33996
  useServerQuery: () => useServerQuery,
33997
+ useTheme: () => useTheme,
33743
33998
  validateServerActionRequest: () => validateServerActionRequest,
33744
33999
  vercelBlobStorage: () => vercelBlobStorage,
33745
34000
  vercelKVStorage: () => vercelKVStorage,
@@ -33769,7 +34024,7 @@ __name(FarmProvider, "FarmProvider");
33769
34024
  // src/index.ts
33770
34025
  init_request();
33771
34026
  init_plugin();
33772
- init_config2();
34027
+ init_config3();
33773
34028
  init_layers();
33774
34029
 
33775
34030
  // src/hmr.ts
@@ -35520,6 +35775,7 @@ init_routes();
35520
35775
  init_routes_server();
35521
35776
  init_utils();
35522
35777
  init_server_http();
35778
+ init_cli_colors();
35523
35779
  function farmApiPlugin(options = {}) {
35524
35780
  const srcDir = options.srcDir ?? "src";
35525
35781
  const debug = options.debug ?? false;
@@ -35533,25 +35789,21 @@ function farmApiPlugin(options = {}) {
35533
35789
  const log = /* @__PURE__ */ __name((_message) => {
35534
35790
  }, "log");
35535
35791
  const logResponse = /* @__PURE__ */ __name((method, urlPath, status, duration) => {
35536
- try {
35537
- const pc = require("picocolors");
35538
- let statusColor = pc.green;
35539
- if (status >= 500) statusColor = pc.red;
35540
- else if (status >= 400) statusColor = pc.yellow;
35541
- else if (status >= 300) statusColor = pc.cyan;
35542
- const logMsg = [
35543
- pc.dim("[") + pc.bold(pc.blue("FARM")) + pc.dim("]"),
35544
- pc.dim("[") + pc.bold(pc.cyan("API")) + pc.dim("]"),
35545
- pc.dim("[") + pc.bold(pc.white(method.padEnd(3))) + pc.dim("]"),
35546
- pc.gray(urlPath),
35547
- pc.dim("-"),
35548
- statusColor(status.toString()),
35549
- pc.dim(`(${duration}ms)`)
35550
- ].join(" ");
35551
- console.log(logMsg);
35552
- } catch {
35553
- console.log(`[FARM] [API] [${method}] ${urlPath} - ${status} (${duration}ms)`);
35554
- }
35792
+ const pc = createCliColors();
35793
+ let statusColor = pc.green;
35794
+ if (status >= 500) statusColor = pc.red;
35795
+ else if (status >= 400) statusColor = pc.yellow;
35796
+ else if (status >= 300) statusColor = pc.cyan;
35797
+ const logMsg = [
35798
+ pc.dim("[") + pc.bold(pc.blue("FARM")) + pc.dim("]"),
35799
+ pc.dim("[") + pc.bold(pc.cyan("API")) + pc.dim("]"),
35800
+ pc.dim("[") + pc.bold(pc.white(method.padEnd(3))) + pc.dim("]"),
35801
+ pc.gray(urlPath),
35802
+ pc.dim("-"),
35803
+ statusColor(status.toString()),
35804
+ pc.dim(`(${duration}ms)`)
35805
+ ].join(" ");
35806
+ console.log(logMsg);
35555
35807
  }, "logResponse");
35556
35808
  const addEndpoint = /* @__PURE__ */ __name((routePath, filePath, method, endpoint2) => {
35557
35809
  const normalizedMethod = method.toUpperCase();
@@ -37295,6 +37547,9 @@ init_cron();
37295
37547
  init_env();
37296
37548
  init_env_types();
37297
37549
 
37550
+ // src/theme/index.ts
37551
+ init_config2();
37552
+
37298
37553
  // src/environment.ts
37299
37554
  var _FarmEnvironmentError = class _FarmEnvironmentError extends Error {
37300
37555
  constructor(api3, expected, actual) {
@@ -38003,12 +38258,12 @@ function useServerQuery(query, input, options = {}) {
38003
38258
  const mountedKeyRef = (0, import_react9.useRef)(void 0);
38004
38259
  inputRef.current = input;
38005
38260
  optionsRef.current = options;
38006
- const subscribe = (0, import_react9.useCallback)(
38261
+ const subscribe2 = (0, import_react9.useCallback)(
38007
38262
  (listener) => cache.subscribe(key, listener),
38008
38263
  [cache, key]
38009
38264
  );
38010
38265
  const getSnapshot = (0, import_react9.useCallback)(() => cache.get(key), [cache, key]);
38011
- const entry = (0, import_react9.useSyncExternalStore)(subscribe, getSnapshot, () => void 0);
38266
+ const entry = (0, import_react9.useSyncExternalStore)(subscribe2, getSnapshot, () => void 0);
38012
38267
  const run = (0, import_react9.useCallback)(
38013
38268
  (force = false) => fetchServerQuery(query, inputRef.current, {
38014
38269
  ...optionsRef.current,
@@ -38134,7 +38389,7 @@ init_deployment();
38134
38389
  init_generate_route_types();
38135
38390
 
38136
38391
  // src/build/index.ts
38137
- init_config2();
38392
+ init_config3();
38138
38393
  var import_path14 = __toESM(require("path"));
38139
38394
  init_utils();
38140
38395
  init_app();
@@ -38142,7 +38397,7 @@ init_route_manager2();
38142
38397
  init_layers();
38143
38398
 
38144
38399
  // src/nitro/universal-build.ts
38145
- init_config2();
38400
+ init_config3();
38146
38401
  init_client_plugin_build();
38147
38402
  var import_os = __toESM(require("os"));
38148
38403
  var import_path12 = __toESM(require("path"));
@@ -38678,6 +38933,7 @@ __name(withVite5TransformContext, "withVite5TransformContext");
38678
38933
  init_font_vite();
38679
38934
  init_vite_config();
38680
38935
  init_not_found();
38936
+ init_vite();
38681
38937
  var import_meta = {};
38682
38938
  function preloadFarmNitroRuntime() {
38683
38939
  return import("nitro").then(
@@ -39350,7 +39606,7 @@ async function validateClientBuildOutput(root, srcDir, outputDir) {
39350
39606
  __name(validateClientBuildOutput, "validateClientBuildOutput");
39351
39607
  async function buildClient(productionVite, config, root, srcDir, outputDir, pageRoutes, layoutRoutes = [], routeSlots = []) {
39352
39608
  const viteBuild = productionVite.build;
39353
- const { farmPlugin: farmPlugin2 } = await Promise.resolve().then(() => (init_vite(), vite_exports));
39609
+ const { farmPlugin: farmPlugin2 } = await Promise.resolve().then(() => (init_vite2(), vite_exports));
39354
39610
  const { PluginManager: PluginManager2 } = await Promise.resolve().then(() => (init_plugin(), plugin_exports));
39355
39611
  const fs9 = await import("fs/promises");
39356
39612
  const pluginManager = new PluginManager2({
@@ -39542,6 +39798,7 @@ async function buildClient(productionVite, config, root, srcDir, outputDir, page
39542
39798
  }
39543
39799
  },
39544
39800
  plugins: [
39801
+ createFarmThemeCssPlugin(config.theme, config.basePath),
39545
39802
  ...tailwindVitePlugin ? [tailwindVitePlugin] : [],
39546
39803
  // Plugin to redirect @farm.js/core imports to client-only exports
39547
39804
  {
@@ -40919,7 +41176,7 @@ void hydrate();
40919
41176
  __name(generateClientHydrationEntry, "generateClientHydrationEntry");
40920
41177
  async function buildSSRInMemory(productionVite, config, root, routeManager, apiRouteManager, serverRenderer, preset, collectedPageRoutes, collectedLayoutRoutes, collectedRouteSlots) {
40921
41178
  const viteBuild = productionVite.build;
40922
- const { farmPlugin: farmPlugin2 } = await Promise.resolve().then(() => (init_vite(), vite_exports));
41179
+ const { farmPlugin: farmPlugin2 } = await Promise.resolve().then(() => (init_vite2(), vite_exports));
40923
41180
  const { PluginManager: PluginManager2 } = await Promise.resolve().then(() => (init_plugin(), plugin_exports));
40924
41181
  const fs9 = await import("fs/promises");
40925
41182
  const pluginManager = new PluginManager2({
@@ -41160,6 +41417,7 @@ async function buildSSRInMemory(productionVite, config, root, routeManager, apiR
41160
41417
  __FARM_PUBLIC_ENV__: JSON.stringify(config.env?.public || {})
41161
41418
  },
41162
41419
  plugins: [
41420
+ createFarmThemeCssPlugin(config.theme, config.basePath),
41163
41421
  ...tailwindVitePlugin ? [tailwindVitePlugin] : [],
41164
41422
  ...!useExternalMetadataImageRuntime && metadataImageRoutes.some((image) => image.sourceType === "module") ? [createMetadataImageWasmPlugin()] : [],
41165
41423
  {
@@ -41373,15 +41631,19 @@ function generateVirtualEntryCode(apiRoutes, pageRoutes, layoutRoutes, routeSlot
41373
41631
  _runWithCurrentRequest,
41374
41632
  _runWithMiddlewareContext,
41375
41633
  _runWithMiddlewareData,
41634
+ _setDefaultFarmThemeConfig,
41376
41635
  addMetadataImageReference,
41636
+ applyFarmThemeDocument,
41377
41637
  appendFarmLinkHeader,
41378
41638
  applyProductionMiddlewareHeaders,
41379
41639
  configureFarmCache,
41380
41640
  configureFarmObservability,
41381
41641
  createFarmCacheKey,
41642
+ createFarmThemeDocumentParts,
41382
41643
  createFarmLocaleCookie,
41383
41644
  createFarmProductionLifecycle,
41384
41645
  createProductionMiddlewareRunner,
41646
+ getTheme as getFarmTheme,
41385
41647
  emitFarmEvent,
41386
41648
  getFarmDataCache,
41387
41649
  getFarmLocaleVaryHeaders,
@@ -41576,6 +41838,8 @@ configureFarmObservability(farmObservabilityConfig);
41576
41838
  configureFarmCache(farmResolvedRuntimeConfig.cache);
41577
41839
  const farmI18nConfig = ${JSON.stringify(config.i18n)};
41578
41840
  const farmServerConfig = ${JSON.stringify(config.server)};
41841
+ const farmThemeConfig = ${JSON.stringify(config.theme)};
41842
+ _setDefaultFarmThemeConfig(farmThemeConfig);
41579
41843
  export const farmProductionLifecycle = createFarmProductionLifecycle({
41580
41844
  server: farmServerConfig,
41581
41845
  start: () => farmPluginRuntime?.startRuntime(),
@@ -43412,7 +43676,13 @@ async function handleFarmRequestInContext(
43412
43676
  !farmI18nSnapshot &&
43413
43677
  !pprCacheKey
43414
43678
  ) {
43679
+ const farmThemeDocument = createFarmThemeDocumentParts(
43680
+ farmThemeConfig,
43681
+ farmResolvedRuntimeConfig.basePath,
43682
+ getFarmTheme(request)
43683
+ );
43415
43684
  const streamPrefix = '<!DOCTYPE html>\\n<html lang="en">\\n<head>\\n' +
43685
+ farmThemeDocument.head + '\\n' +
43416
43686
  ' <meta charset="utf-8">\\n' +
43417
43687
  ' <meta name="viewport" content="width=device-width, initial-scale=1">\\n' +
43418
43688
  (hasFavicon ? '' : ' <link rel="icon" href="data:,">\\n') +
@@ -43428,9 +43698,13 @@ async function handleFarmRequestInContext(
43428
43698
  ) + '\\n' +
43429
43699
  ' <script type="module" src="/farm-client.js"></script>\\n' +
43430
43700
  '</body>\\n</html>';
43701
+ const themedStreamPrefix = streamPrefix.replace(
43702
+ '<html lang="en">',
43703
+ '<html lang="en"' + farmThemeDocument.attributes + '>'
43704
+ );
43431
43705
  const streamedDocument = createFarmDocumentStream(
43432
43706
  renderedPage.stream,
43433
- streamPrefix,
43707
+ themedStreamPrefix,
43434
43708
  streamSuffix,
43435
43709
  function() {
43436
43710
  if (pprBypassReason === "refresh") {
@@ -43513,6 +43787,12 @@ async function handleFarmRequestInContext(
43513
43787
  </html>\`;
43514
43788
  }
43515
43789
  fullHtml = applyFarmI18nDocument(fullHtml, pathname, farmI18nSnapshot);
43790
+ fullHtml = applyFarmThemeDocument(
43791
+ fullHtml,
43792
+ farmThemeConfig,
43793
+ farmResolvedRuntimeConfig.basePath,
43794
+ getFarmTheme(request)
43795
+ );
43516
43796
 
43517
43797
  if (pageStatus === 200 && pprCacheKey && request.method.toUpperCase() !== "HEAD") {
43518
43798
  await pprShellCache.setAsync(
@@ -43639,10 +43919,15 @@ async function handleFarmRequestInContext(
43639
43919
  const errorHtml = ${hasMiddlewareRuntime ? `await _runWithMiddlewareData(middlewareData, () =>
43640
43920
  _runWithMiddlewareContext(middlewareContext, renderErrorElement)
43641
43921
  )` : "await renderErrorElement()"};
43642
- const errorDocument = applyFarmI18nDocument(
43643
- createFarmErrorDocument(errorHtml, "Application Error"),
43644
- pathname,
43645
- getFarmI18nSnapshot()
43922
+ const errorDocument = applyFarmThemeDocument(
43923
+ applyFarmI18nDocument(
43924
+ createFarmErrorDocument(errorHtml, "Application Error"),
43925
+ pathname,
43926
+ getFarmI18nSnapshot()
43927
+ ),
43928
+ farmThemeConfig,
43929
+ farmResolvedRuntimeConfig.basePath,
43930
+ getFarmTheme(request)
43646
43931
  );
43647
43932
  emitFarmEvent({
43648
43933
  type: "render.complete",
@@ -43667,10 +43952,15 @@ async function handleFarmRequestInContext(
43667
43952
  const errorMessage = "Internal Server Error";
43668
43953
  const fallbackHtml = '<main><h1>Application Error</h1><p>' +
43669
43954
  escapeFarmHtmlAttribute(errorMessage) + '</p></main>';
43670
- const fallbackDocument = applyFarmI18nDocument(
43671
- createFarmErrorDocument(fallbackHtml, "Application Error"),
43672
- pathname,
43673
- getFarmI18nSnapshot()
43955
+ const fallbackDocument = applyFarmThemeDocument(
43956
+ applyFarmI18nDocument(
43957
+ createFarmErrorDocument(fallbackHtml, "Application Error"),
43958
+ pathname,
43959
+ getFarmI18nSnapshot()
43960
+ ),
43961
+ farmThemeConfig,
43962
+ farmResolvedRuntimeConfig.basePath,
43963
+ getFarmTheme(request)
43674
43964
  );
43675
43965
  return applyProductionMiddlewareHeaders(new Response(
43676
43966
  fallbackDocument,
@@ -43768,6 +44058,12 @@ async function handleFarmRequestInContext(
43768
44058
  </html>\`;
43769
44059
  }
43770
44060
  fullHtml = applyFarmI18nDocument(fullHtml, pathname, getFarmI18nSnapshot());
44061
+ fullHtml = applyFarmThemeDocument(
44062
+ fullHtml,
44063
+ farmThemeConfig,
44064
+ farmResolvedRuntimeConfig.basePath,
44065
+ getFarmTheme(request)
44066
+ );
43771
44067
 
43772
44068
  emitFarmEvent({
43773
44069
  type: "render.complete",
@@ -43786,8 +44082,14 @@ async function handleFarmRequestInContext(
43786
44082
  }), middlewareHeaders);
43787
44083
  } catch (error) {
43788
44084
  console.error("404 render error:", error);
43789
- return applyProductionMiddlewareHeaders(new Response(
44085
+ const fallbackDocument = applyFarmThemeDocument(
43790
44086
  \`<!DOCTYPE html><html><head><title>404</title></head><body><h1>404 - Page Not Found</h1><p>The page \${pathname} doesn't exist.</p><a href="/">Go Home</a></body></html>\`,
44087
+ farmThemeConfig,
44088
+ farmResolvedRuntimeConfig.basePath,
44089
+ getFarmTheme(request)
44090
+ );
44091
+ return applyProductionMiddlewareHeaders(new Response(
44092
+ fallbackDocument,
43791
44093
  {
43792
44094
  status: 404,
43793
44095
  headers: { "Content-Type": "text/html", "x-farm-preload-buffered": "1" },
@@ -45014,7 +45316,7 @@ async function createProjectModuleServer(createViteServer, config, root) {
45014
45316
  }
45015
45317
  __name(createProjectModuleServer, "createProjectModuleServer");
45016
45318
  async function buildClient2(viteBuild, config, root, srcDir, outputDir) {
45017
- const { farmI18nClientBridgePlugin: farmI18nClientBridgePlugin2, farmPlugin: farmPlugin2 } = await Promise.resolve().then(() => (init_vite(), vite_exports));
45319
+ const { farmI18nClientBridgePlugin: farmI18nClientBridgePlugin2, farmPlugin: farmPlugin2 } = await Promise.resolve().then(() => (init_vite2(), vite_exports));
45018
45320
  const { PluginManager: PluginManager2 } = await Promise.resolve().then(() => (init_plugin(), plugin_exports));
45019
45321
  const pluginManager = new PluginManager2({
45020
45322
  config,
@@ -45041,7 +45343,7 @@ async function buildClient2(viteBuild, config, root, srcDir, outputDir) {
45041
45343
  }
45042
45344
  __name(buildClient2, "buildClient");
45043
45345
  async function buildSSR(viteBuild, config, root, srcDir, outputDir) {
45044
- const { farmI18nClientBridgePlugin: farmI18nClientBridgePlugin2, farmPlugin: farmPlugin2 } = await Promise.resolve().then(() => (init_vite(), vite_exports));
45346
+ const { farmI18nClientBridgePlugin: farmI18nClientBridgePlugin2, farmPlugin: farmPlugin2 } = await Promise.resolve().then(() => (init_vite2(), vite_exports));
45045
45347
  const { PluginManager: PluginManager2 } = await Promise.resolve().then(() => (init_plugin(), plugin_exports));
45046
45348
  const pluginManager = new PluginManager2({
45047
45349
  config,
@@ -45687,8 +45989,74 @@ function createStore(initialState, extend) {
45687
45989
  }
45688
45990
  __name(createStore, "createStore");
45689
45991
 
45690
- // src/client/link.tsx
45992
+ // src/theme/client.tsx
45691
45993
  var import_react13 = require("react");
45994
+ init_bridge2();
45995
+ var FALLBACK_CLIENT_SNAPSHOT = Object.freeze({
45996
+ theme: "system",
45997
+ resolvedTheme: "light",
45998
+ mounted: true
45999
+ });
46000
+ var cachedClientSnapshot = FALLBACK_CLIENT_SNAPSHOT;
46001
+ function snapshotsMatch(left, right) {
46002
+ return left.theme === right.theme && left.resolvedTheme === right.resolvedTheme && left.mounted === right.mounted;
46003
+ }
46004
+ __name(snapshotsMatch, "snapshotsMatch");
46005
+ function getClientSnapshot() {
46006
+ const next = typeof window === "undefined" ? FALLBACK_CLIENT_SNAPSHOT : window.__FARM_THEME__?.snapshot;
46007
+ if (!next) return cachedClientSnapshot;
46008
+ if (!snapshotsMatch(cachedClientSnapshot, next)) cachedClientSnapshot = next;
46009
+ return cachedClientSnapshot;
46010
+ }
46011
+ __name(getClientSnapshot, "getClientSnapshot");
46012
+ function getHydrationSnapshot() {
46013
+ if (typeof window !== "undefined" && window.__FARM_THEME__?.serverSnapshot) {
46014
+ return window.__FARM_THEME__.serverSnapshot;
46015
+ }
46016
+ return getFarmThemeServerSnapshot();
46017
+ }
46018
+ __name(getHydrationSnapshot, "getHydrationSnapshot");
46019
+ function subscribe(listener) {
46020
+ if (typeof window === "undefined") return () => {
46021
+ };
46022
+ const handleThemeChange = /* @__PURE__ */ __name(() => {
46023
+ getClientSnapshot();
46024
+ listener();
46025
+ }, "handleThemeChange");
46026
+ window.addEventListener("farm:themechange", handleThemeChange);
46027
+ return () => window.removeEventListener("farm:themechange", handleThemeChange);
46028
+ }
46029
+ __name(subscribe, "subscribe");
46030
+ function getTheme2() {
46031
+ return getClientSnapshot();
46032
+ }
46033
+ __name(getTheme2, "getTheme");
46034
+ function setTheme(theme) {
46035
+ const runtime = typeof window === "undefined" ? void 0 : window.__FARM_THEME__;
46036
+ if (!runtime) {
46037
+ throw new Error("The FARMJS theme runtime is not enabled. Add `theme` to farm.config.ts.");
46038
+ }
46039
+ runtime.setTheme(theme);
46040
+ }
46041
+ __name(setTheme, "setTheme");
46042
+ function toggleTheme() {
46043
+ const next = getClientSnapshot().resolvedTheme === "dark" ? "light" : "dark";
46044
+ setTheme(next);
46045
+ return next;
46046
+ }
46047
+ __name(toggleTheme, "toggleTheme");
46048
+ function useTheme() {
46049
+ const snapshot = (0, import_react13.useSyncExternalStore)(subscribe, getClientSnapshot, getHydrationSnapshot);
46050
+ return {
46051
+ ...snapshot,
46052
+ setTheme,
46053
+ toggleTheme
46054
+ };
46055
+ }
46056
+ __name(useTheme, "useTheme");
46057
+
46058
+ // src/client/link.tsx
46059
+ var import_react14 = require("react");
45692
46060
  init_router();
45693
46061
  init_client_runtime();
45694
46062
  var import_jsx_runtime5 = require("react/jsx-runtime");
@@ -45750,9 +46118,9 @@ function LinkInner({
45750
46118
  onTouchStart,
45751
46119
  ...props
45752
46120
  }, ref) {
45753
- const elementRef = (0, import_react13.useRef)(null);
45754
- const intentTimeoutRef = (0, import_react13.useRef)(null);
45755
- const hasPrefetched = (0, import_react13.useRef)(false);
46121
+ const elementRef = (0, import_react14.useRef)(null);
46122
+ const intentTimeoutRef = (0, import_react14.useRef)(null);
46123
+ const hasPrefetched = (0, import_react14.useRef)(false);
45756
46124
  const { intent, viewport, render } = normalizePrefetch(prefetch2);
45757
46125
  const baseHref = resolveLinkHref(href, params, {
45758
46126
  query,
@@ -45761,17 +46129,17 @@ function LinkInner({
45761
46129
  });
45762
46130
  const resolvedHref = localizeActiveFarmHref(baseHref, locale);
45763
46131
  const isExternal = isExternalUrl(resolvedHref);
45764
- const doPrefetch = (0, import_react13.useCallback)(() => {
46132
+ const doPrefetch = (0, import_react14.useCallback)(() => {
45765
46133
  if (isExternal || hasPrefetched.current) return;
45766
46134
  const router = getRouter2();
45767
46135
  if (!router) return;
45768
46136
  hasPrefetched.current = true;
45769
46137
  router.prefetch(resolvedHref);
45770
46138
  }, [resolvedHref, isExternal]);
45771
- (0, import_react13.useEffect)(() => {
46139
+ (0, import_react14.useEffect)(() => {
45772
46140
  hasPrefetched.current = false;
45773
46141
  }, [resolvedHref]);
45774
- (0, import_react13.useEffect)(() => {
46142
+ (0, import_react14.useEffect)(() => {
45775
46143
  const element = elementRef.current;
45776
46144
  if (!element || isExternal) return;
45777
46145
  const router = getRouter2();
@@ -45781,7 +46149,7 @@ function LinkInner({
45781
46149
  return () => router.unobserveForPrefetch(element);
45782
46150
  }
45783
46151
  }, [resolvedHref, viewport, isExternal]);
45784
- (0, import_react13.useEffect)(() => {
46152
+ (0, import_react14.useEffect)(() => {
45785
46153
  if (!render || isExternal) return;
45786
46154
  let cancelled = false;
45787
46155
  let timeoutId = null;
@@ -45803,7 +46171,7 @@ function LinkInner({
45803
46171
  }
45804
46172
  };
45805
46173
  }, [render, isExternal, resolvedHref]);
45806
- (0, import_react13.useEffect)(() => {
46174
+ (0, import_react14.useEffect)(() => {
45807
46175
  return () => {
45808
46176
  if (intentTimeoutRef.current) {
45809
46177
  clearTimeout(intentTimeoutRef.current);
@@ -45811,13 +46179,13 @@ function LinkInner({
45811
46179
  }
45812
46180
  };
45813
46181
  }, []);
45814
- const cancelIntent = (0, import_react13.useCallback)(() => {
46182
+ const cancelIntent = (0, import_react14.useCallback)(() => {
45815
46183
  if (intentTimeoutRef.current) {
45816
46184
  clearTimeout(intentTimeoutRef.current);
45817
46185
  intentTimeoutRef.current = null;
45818
46186
  }
45819
46187
  }, []);
45820
- const scheduleIntentPrefetch = (0, import_react13.useCallback)(() => {
46188
+ const scheduleIntentPrefetch = (0, import_react14.useCallback)(() => {
45821
46189
  if (isExternal || !intent || hasPrefetched.current) return;
45822
46190
  cancelIntent();
45823
46191
  intentTimeoutRef.current = setTimeout(() => {
@@ -45825,42 +46193,42 @@ function LinkInner({
45825
46193
  doPrefetch();
45826
46194
  }, prefetchDelay);
45827
46195
  }, [intent, isExternal, prefetchDelay, doPrefetch, cancelIntent]);
45828
- const handleMouseEnter = (0, import_react13.useCallback)(
46196
+ const handleMouseEnter = (0, import_react14.useCallback)(
45829
46197
  (event) => {
45830
46198
  onMouseEnter?.(event);
45831
46199
  scheduleIntentPrefetch();
45832
46200
  },
45833
46201
  [onMouseEnter, scheduleIntentPrefetch]
45834
46202
  );
45835
- const handleMouseLeave = (0, import_react13.useCallback)(
46203
+ const handleMouseLeave = (0, import_react14.useCallback)(
45836
46204
  (event) => {
45837
46205
  onMouseLeave?.(event);
45838
46206
  cancelIntent();
45839
46207
  },
45840
46208
  [onMouseLeave, cancelIntent]
45841
46209
  );
45842
- const handleTouchStart = (0, import_react13.useCallback)(
46210
+ const handleTouchStart = (0, import_react14.useCallback)(
45843
46211
  (event) => {
45844
46212
  onTouchStart?.(event);
45845
46213
  scheduleIntentPrefetch();
45846
46214
  },
45847
46215
  [onTouchStart, scheduleIntentPrefetch]
45848
46216
  );
45849
- const handleFocus = (0, import_react13.useCallback)(
46217
+ const handleFocus = (0, import_react14.useCallback)(
45850
46218
  (event) => {
45851
46219
  onFocus?.(event);
45852
46220
  scheduleIntentPrefetch();
45853
46221
  },
45854
46222
  [onFocus, scheduleIntentPrefetch]
45855
46223
  );
45856
- const handleBlur = (0, import_react13.useCallback)(
46224
+ const handleBlur = (0, import_react14.useCallback)(
45857
46225
  (event) => {
45858
46226
  onBlur?.(event);
45859
46227
  cancelIntent();
45860
46228
  },
45861
46229
  [onBlur, cancelIntent]
45862
46230
  );
45863
- const handleClick = (0, import_react13.useCallback)(
46231
+ const handleClick = (0, import_react14.useCallback)(
45864
46232
  (event) => {
45865
46233
  onClick?.(event);
45866
46234
  if (event.defaultPrevented) return;
@@ -45885,7 +46253,7 @@ function LinkInner({
45885
46253
  },
45886
46254
  [resolvedHref, replace, scroll, viewTransition, target, isExternal, onClick]
45887
46255
  );
45888
- const setRefs = (0, import_react13.useCallback)(
46256
+ const setRefs = (0, import_react14.useCallback)(
45889
46257
  (node) => {
45890
46258
  elementRef.current = node;
45891
46259
  if (typeof ref === "function") ref(node);
@@ -45914,7 +46282,7 @@ function LinkInner({
45914
46282
  );
45915
46283
  }
45916
46284
  __name(LinkInner, "LinkInner");
45917
- var LinkWithRef = (0, import_react13.forwardRef)(LinkInner);
46285
+ var LinkWithRef = (0, import_react14.forwardRef)(LinkInner);
45918
46286
  LinkWithRef.displayName = "Link";
45919
46287
  var Link = LinkWithRef;
45920
46288
  function resolveLinkHref(href, params, options) {
@@ -46854,6 +47222,7 @@ __name(decodeCookiePart, "decodeCookiePart");
46854
47222
  getServerActionInvalidations,
46855
47223
  getServerActionSignal,
46856
47224
  getStorage,
47225
+ getTheme,
46857
47226
  globFiles,
46858
47227
  hasFarmRouteRuntimeControls,
46859
47228
  hasISR,
@@ -46970,6 +47339,7 @@ __name(decodeCookiePart, "decodeCookiePart");
46970
47339
  resolveFarmLayoutFonts,
46971
47340
  resolveFarmRouteRuleRuntimeConfig,
46972
47341
  resolveFarmRouteRuntimeConfig,
47342
+ resolveFarmThemeConfig,
46973
47343
  resolveIntegrationOrmRuntimeClient,
46974
47344
  resolveIntegrationPlugins,
46975
47345
  resolveMarkdownConfig,
@@ -46996,12 +47366,14 @@ __name(decodeCookiePart, "decodeCookiePart");
46996
47366
  segmentsToPattern,
46997
47367
  serverEnv,
46998
47368
  setEnv,
47369
+ setTheme,
46999
47370
  snapshotDeferredData,
47000
47371
  sqliteStorage,
47001
47372
  storageCacheAdapter,
47002
47373
  titleFromMarkdown,
47003
47374
  toFormData,
47004
47375
  toViteModuleId,
47376
+ toggleTheme,
47005
47377
  unstable_cache,
47006
47378
  unwrapMiddleware,
47007
47379
  updateTag,
@@ -47017,6 +47389,7 @@ __name(decodeCookiePart, "decodeCookiePart");
47017
47389
  useSearchParams,
47018
47390
  useServerFn,
47019
47391
  useServerQuery,
47392
+ useTheme,
47020
47393
  validateServerActionRequest,
47021
47394
  vercelBlobStorage,
47022
47395
  vercelKVStorage,