@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/server.cjs CHANGED
@@ -5632,6 +5632,52 @@ var init_config = __esm({
5632
5632
  }
5633
5633
  });
5634
5634
 
5635
+ // src/theme/config.ts
5636
+ function resolveFarmThemeConfig(config, basePath = "/") {
5637
+ if (config && "enabled" in config) {
5638
+ return config;
5639
+ }
5640
+ if (!config) {
5641
+ return {
5642
+ enabled: false,
5643
+ default: "system",
5644
+ storageKey: DEFAULT_FARM_THEME_STORAGE_KEY,
5645
+ cookiePath: normalizeCookiePath(basePath)
5646
+ };
5647
+ }
5648
+ const storageKey = config.storageKey?.trim() || DEFAULT_FARM_THEME_STORAGE_KEY;
5649
+ if (!STORAGE_KEY_PATTERN.test(storageKey)) {
5650
+ throw new Error(
5651
+ "theme.storageKey may only contain letters, numbers, dots, underscores, and hyphens."
5652
+ );
5653
+ }
5654
+ const defaultTheme = config.default ?? "system";
5655
+ if (defaultTheme !== "light" && defaultTheme !== "dark" && defaultTheme !== "system") {
5656
+ throw new Error('theme.default must be "light", "dark", or "system".');
5657
+ }
5658
+ return {
5659
+ enabled: true,
5660
+ default: defaultTheme,
5661
+ storageKey,
5662
+ cookiePath: normalizeCookiePath(basePath)
5663
+ };
5664
+ }
5665
+ function normalizeCookiePath(basePath) {
5666
+ const normalized = `/${basePath}`.replace(/\/{2,}/g, "/");
5667
+ if (normalized === "/") return normalized;
5668
+ return normalized.replace(/\/$/, "");
5669
+ }
5670
+ var DEFAULT_FARM_THEME_STORAGE_KEY, STORAGE_KEY_PATTERN;
5671
+ var init_config2 = __esm({
5672
+ "src/theme/config.ts"() {
5673
+ "use strict";
5674
+ DEFAULT_FARM_THEME_STORAGE_KEY = "farm-theme";
5675
+ STORAGE_KEY_PATTERN = /^[A-Za-z0-9._-]+$/;
5676
+ __name(resolveFarmThemeConfig, "resolveFarmThemeConfig");
5677
+ __name(normalizeCookiePath, "normalizeCookiePath");
5678
+ }
5679
+ });
5680
+
5635
5681
  // src/devtools-config.ts
5636
5682
  function resolveFarmDevtoolsConfig(config, mode = "development") {
5637
5683
  if (mode !== "development" || config === false) {
@@ -10733,6 +10779,7 @@ async function resolveConfig(userConfig, mode) {
10733
10779
  routeRules,
10734
10780
  images: resolveFarmImageConfig(userConfig.images),
10735
10781
  performance: resolveFarmPerformanceConfig(userConfig.performance),
10782
+ theme: resolveFarmThemeConfig(userConfig.theme, userConfig.basePath || "/"),
10736
10783
  publicDir: userConfig.publicDir || "public",
10737
10784
  i18n: resolveFarmI18nConfig(userConfig.i18n, { root, mode }),
10738
10785
  openapi: {
@@ -10810,7 +10857,7 @@ async function loadConfig(rootDir, configPath, mode = process.env.NODE_ENV === "
10810
10857
  return void 0;
10811
10858
  }
10812
10859
  var import_path9, FARM_RESOLVED_CUSTOM_CONTEXT, DOCS_CONFIG_FILENAMES;
10813
- var init_config2 = __esm({
10860
+ var init_config3 = __esm({
10814
10861
  "src/config.ts"() {
10815
10862
  "use strict";
10816
10863
  init_integrations();
@@ -10831,6 +10878,7 @@ var init_config2 = __esm({
10831
10878
  init_auth_config();
10832
10879
  init_preload();
10833
10880
  init_security();
10881
+ init_config2();
10834
10882
  init_config_entry();
10835
10883
  FARM_RESOLVED_CUSTOM_CONTEXT = /* @__PURE__ */ Symbol.for("farm.resolvedCustomContext");
10836
10884
  __name(normalizeDeployTarget, "normalizeDeployTarget");
@@ -11333,7 +11381,7 @@ var init_api = __esm({
11333
11381
  "src/docs/api.ts"() {
11334
11382
  "use strict";
11335
11383
  import_docs2 = require("@farming-labs/docs");
11336
- init_config2();
11384
+ init_config3();
11337
11385
  init_handler();
11338
11386
  __name(isRecord4, "isRecord");
11339
11387
  __name(isResolvedDocsConfig2, "isResolvedDocsConfig");
@@ -12318,7 +12366,7 @@ var init_devtools = __esm({
12318
12366
  "src/devtools.ts"() {
12319
12367
  "use strict";
12320
12368
  import_node_path14 = __toESM(require("path"));
12321
- init_config2();
12369
+ init_config3();
12322
12370
  init_cron();
12323
12371
  init_route_runtime();
12324
12372
  __name(normalizePath, "normalizePath");
@@ -14025,6 +14073,8 @@ __export(server_exports, {
14025
14073
  getServerActionInvalidations: () => getServerActionInvalidations,
14026
14074
  getServerActionSignal: () => getServerActionSignal,
14027
14075
  getStorage: () => getStorage,
14076
+ getTheme: () => getTheme,
14077
+ getThemeSnapshot: () => getThemeSnapshot,
14028
14078
  globFiles: () => globFiles,
14029
14079
  initStorage: () => initStorage,
14030
14080
  invalidate: () => invalidate,
@@ -20671,6 +20721,125 @@ function DefaultNotFoundPage(_props) {
20671
20721
  }
20672
20722
  __name(DefaultNotFoundPage, "DefaultNotFoundPage");
20673
20723
 
20724
+ // src/theme/server-runtime.ts
20725
+ init_config2();
20726
+ var THEME_SCRIPT_ID = "farm-theme-script";
20727
+ var THEME_STYLE_ID = "farm-theme-style";
20728
+ function createFarmThemeDocumentParts(input, basePath = "/", serverTheme) {
20729
+ const config = resolveFarmThemeConfig(input, basePath);
20730
+ if (!config.enabled) return { attributes: "", head: "" };
20731
+ const hydrationTheme = serverTheme ?? config.default;
20732
+ const initialTheme = hydrationTheme === "system" ? "light" : hydrationTheme;
20733
+ const script = createFarmThemeBootstrapScript(config, hydrationTheme);
20734
+ return {
20735
+ attributes: ` data-theme="${initialTheme}"`,
20736
+ 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>`
20737
+ };
20738
+ }
20739
+ __name(createFarmThemeDocumentParts, "createFarmThemeDocumentParts");
20740
+ function createFarmThemeBootstrapScript(config, serverTheme = config.default) {
20741
+ return `(function(config,serverTheme){
20742
+ var isTheme=function(value){return value==="light"||value==="dark"||value==="system";};
20743
+ var decode=function(value){try{return decodeURIComponent(value);}catch(_error){return value;}};
20744
+ 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());}};
20745
+ var media=window.matchMedia("(prefers-color-scheme: dark)");
20746
+ var resolveTheme=function(theme){return theme==="system"?(media.matches?"dark":"light"):theme;};
20747
+ var storedTheme=readCookie();
20748
+ var preference=isTheme(storedTheme)?storedTheme:config.default;
20749
+ var serverSnapshot={theme:serverTheme,resolvedTheme:serverTheme==="system"?undefined:serverTheme,mounted:false};
20750
+ 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;};
20751
+ var emit=function(){var snapshot=apply();window.dispatchEvent(new CustomEvent("farm:themechange",{detail:snapshot}));};
20752
+ 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){}};
20753
+ var setTheme=function(theme){if(!isTheme(theme))throw new TypeError("Unknown FARMJS theme: "+String(theme));preference=theme;persist(theme);emit();};
20754
+ var initialSnapshot={theme:preference,resolvedTheme:resolveTheme(preference),mounted:true};
20755
+ window.__FARM_THEME__={config:config,serverSnapshot:serverSnapshot,snapshot:initialSnapshot,setTheme:setTheme};
20756
+ document.documentElement.dataset.theme=initialSnapshot.resolvedTheme;
20757
+ var handleSystemChange=function(){if(preference==="system")emit();};
20758
+ if(typeof media.addEventListener==="function")media.addEventListener("change",handleSystemChange);else if(typeof media.addListener==="function")media.addListener(handleSystemChange);
20759
+ window.addEventListener("storage",function(event){if(event.key!==config.storageKey||!isTheme(event.newValue))return;preference=event.newValue;persist(preference);emit();});
20760
+ })(${serializeInlineValue(config)},${serializeInlineValue(serverTheme)});`;
20761
+ }
20762
+ __name(createFarmThemeBootstrapScript, "createFarmThemeBootstrapScript");
20763
+ function serializeInlineValue(value) {
20764
+ return JSON.stringify(value).replace(/</g, "\\u003c").replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029");
20765
+ }
20766
+ __name(serializeInlineValue, "serializeInlineValue");
20767
+
20768
+ // src/theme/bridge.ts
20769
+ var FALLBACK_SERVER_SNAPSHOT = Object.freeze({
20770
+ theme: "system",
20771
+ resolvedTheme: void 0,
20772
+ mounted: false
20773
+ });
20774
+ var FARM_THEME_SERVER_SNAPSHOT_RESOLVER = /* @__PURE__ */ Symbol.for("farm.js.theme.server-snapshot-resolver");
20775
+ function _setFarmThemeServerSnapshotResolver(resolver) {
20776
+ globalThis[FARM_THEME_SERVER_SNAPSHOT_RESOLVER] = resolver;
20777
+ }
20778
+ __name(_setFarmThemeServerSnapshotResolver, "_setFarmThemeServerSnapshotResolver");
20779
+
20780
+ // src/theme/server.ts
20781
+ init_config2();
20782
+ var defaultThemeConfig = resolveFarmThemeConfig(void 0);
20783
+ function _setDefaultFarmThemeConfig(config, basePath = "/") {
20784
+ defaultThemeConfig = resolveFarmThemeConfig(config, basePath);
20785
+ }
20786
+ __name(_setDefaultFarmThemeConfig, "_setDefaultFarmThemeConfig");
20787
+ function getTheme(request = getCurrentRequest()) {
20788
+ return readFarmThemePreference(request, defaultThemeConfig);
20789
+ }
20790
+ __name(getTheme, "getTheme");
20791
+ function getThemeSnapshot(request = getCurrentRequest()) {
20792
+ const theme = readFarmThemePreference(request, defaultThemeConfig);
20793
+ return {
20794
+ theme,
20795
+ resolvedTheme: theme === "system" ? void 0 : theme,
20796
+ mounted: false
20797
+ };
20798
+ }
20799
+ __name(getThemeSnapshot, "getThemeSnapshot");
20800
+ function readFarmThemePreference(request, config) {
20801
+ if (!config.enabled) return config.default;
20802
+ const stored = readCookie3(request.headers.get("cookie"), config.storageKey);
20803
+ return isFarmThemePreference(stored) ? stored : config.default;
20804
+ }
20805
+ __name(readFarmThemePreference, "readFarmThemePreference");
20806
+ function readCookie3(cookieHeader, name) {
20807
+ if (!cookieHeader) return void 0;
20808
+ for (const entry of cookieHeader.split(";")) {
20809
+ const separator = entry.indexOf("=");
20810
+ if (separator < 0) continue;
20811
+ const key = decodeCookieValue(entry.slice(0, separator).trim());
20812
+ if (key !== name) continue;
20813
+ return decodeCookieValue(entry.slice(separator + 1).trim());
20814
+ }
20815
+ return void 0;
20816
+ }
20817
+ __name(readCookie3, "readCookie");
20818
+ function decodeCookieValue(value) {
20819
+ try {
20820
+ return decodeURIComponent(value);
20821
+ } catch {
20822
+ return value;
20823
+ }
20824
+ }
20825
+ __name(decodeCookieValue, "decodeCookieValue");
20826
+ function isFarmThemePreference(value) {
20827
+ return value === "light" || value === "dark" || value === "system";
20828
+ }
20829
+ __name(isFarmThemePreference, "isFarmThemePreference");
20830
+ _setFarmThemeServerSnapshotResolver(() => {
20831
+ try {
20832
+ return getThemeSnapshot();
20833
+ } catch {
20834
+ const theme = defaultThemeConfig.default;
20835
+ return {
20836
+ theme,
20837
+ resolvedTheme: theme === "system" ? void 0 : theme,
20838
+ mounted: false
20839
+ };
20840
+ }
20841
+ });
20842
+
20674
20843
  // src/server/renderer.ts
20675
20844
  var cachedClerkProvider = null;
20676
20845
  var importRuntimeModule = new Function("specifier", "return import(specifier);");
@@ -20679,10 +20848,10 @@ function hasRequestHeader(req, name) {
20679
20848
  return Array.isArray(value) ? value.length > 0 : Boolean(value);
20680
20849
  }
20681
20850
  __name(hasRequestHeader, "hasRequestHeader");
20682
- function serializeInlineValue(value) {
20851
+ function serializeInlineValue2(value) {
20683
20852
  return JSON.stringify(value).replace(/</g, "\\u003c").replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029");
20684
20853
  }
20685
- __name(serializeInlineValue, "serializeInlineValue");
20854
+ __name(serializeInlineValue2, "serializeInlineValue");
20686
20855
  function escapeHtmlAttribute2(value) {
20687
20856
  return value.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
20688
20857
  }
@@ -20776,7 +20945,7 @@ function createDocumentFooter(options) {
20776
20945
  __name(createDocumentFooter, "createDocumentFooter");
20777
20946
  function createDeferredHydrationScript(records) {
20778
20947
  if (records.length === 0) return "";
20779
- return `<script>window.__FARM_DEFERRED_DATA__=${serializeInlineValue(
20948
+ return `<script>window.__FARM_DEFERRED_DATA__=${serializeInlineValue2(
20780
20949
  snapshotDeferredData(records)
20781
20950
  )};</script>`;
20782
20951
  }
@@ -21917,9 +22086,9 @@ var _ServerRenderer = class _ServerRenderer {
21917
22086
  slots: routeSlotPayload
21918
22087
  });
21919
22088
  const propsScript = `<script>
21920
- window.__FARM_PROPS__ = ${serializeInlineValue(deferredProps.data.page)};
21921
- window.__FARM_ROUTE_SLOTS__ = ${serializeInlineValue(deferredProps.data.slots)};
21922
- window.__FARM_DEPLOYMENT_ID__ = ${serializeInlineValue(deploymentId)};
22089
+ window.__FARM_PROPS__ = ${serializeInlineValue2(deferredProps.data.page)};
22090
+ window.__FARM_ROUTE_SLOTS__ = ${serializeInlineValue2(deferredProps.data.slots)};
22091
+ window.__FARM_DEPLOYMENT_ID__ = ${serializeInlineValue2(deploymentId)};
21923
22092
  window.__FARM_PATH__ = ${JSON.stringify(req.__FARM_ROUTE__ || req.url || "/")};
21924
22093
  window.__FARM_IS_CLIENT__ = ${JSON.stringify(isClientComponent)};
21925
22094
  window.__FARM_PAGE_SHOULD_HYDRATE__ = ${JSON.stringify(
@@ -21937,7 +22106,7 @@ window.__FARM_LOADING_MODULE__ = ${JSON.stringify(
21937
22106
  )};
21938
22107
  window.__FARM_MANIFEST__ = ${JSON.stringify(clientManifest)};
21939
22108
  window.__FARM_INTEGRATION_API_MANIFEST__ = ${JSON.stringify(getRegisteredIntegrationAPIManifest())};
21940
- ${getFarmI18nClientSnapshot() ? `window.__FARM_I18N__ = ${serializeInlineValue(getFarmI18nClientSnapshot())};` : ""}
22109
+ ${getFarmI18nClientSnapshot() ? `window.__FARM_I18N__ = ${serializeInlineValue2(getFarmI18nClientSnapshot())};` : ""}
21941
22110
  </script>`;
21942
22111
  const hydrationClickQueueScript = isClientComponent || req.__FARM_SHOULD_HYDRATE__ === true || req.__FARM_HAS_HYDRATABLE_ROUTE_SLOTS__ === true ? createPreHydrationClickQueueScript() : "";
21943
22112
  const {
@@ -21948,6 +22117,11 @@ ${getFarmI18nClientSnapshot() ? `window.__FARM_I18N__ = ${serializeInlineValue(g
21948
22117
  const i18nSnapshot = getFarmI18nClientSnapshot();
21949
22118
  const i18nAlternateTags = i18nSnapshot ? renderI18nAlternateLinks(req.__FARM_ROUTE__ || req.url || "/", i18nSnapshot) : "";
21950
22119
  const fontHead = renderFarmFontDevHead(this.config.root || process.cwd());
22120
+ const themeDocument = createFarmThemeDocumentParts(
22121
+ this.config.theme,
22122
+ this.config.basePath,
22123
+ getTheme()
22124
+ );
21951
22125
  const streamRoot = import_react5.default.createElement("div", { style: { display: "contents" } }, element);
21952
22126
  const { pipe } = (0, import_server2.renderToPipeableStream)(streamRoot, {
21953
22127
  onShellReady() {
@@ -21961,8 +22135,9 @@ ${getFarmI18nClientSnapshot() ? `window.__FARM_I18N__ = ${serializeInlineValue(g
21961
22135
  console.log(`[FARM STREAM] onShellReady at ${shellReadyMs}ms`);
21962
22136
  }
21963
22137
  const shell = `<!DOCTYPE html>
21964
- <html lang="${escapeHtmlAttribute2(i18nSnapshot?.locale || "en")}"${i18nSnapshot ? ` dir="${i18nSnapshot.direction}"` : ""}>
22138
+ <html lang="${escapeHtmlAttribute2(i18nSnapshot?.locale || "en")}"${i18nSnapshot ? ` dir="${i18nSnapshot.direction}"` : ""}${themeDocument.attributes}>
21965
22139
  <head>
22140
+ ${themeDocument.head}
21966
22141
  <meta charset="utf-8">
21967
22142
  <meta name="viewport" content="width=device-width, initial-scale=1">
21968
22143
  <meta name="farm-deployment-id" content="${escapeHtmlAttribute2(deploymentId)}">
@@ -22164,15 +22339,21 @@ ${getFarmI18nClientSnapshot() ? `window.__FARM_I18N__ = ${serializeInlineValue(g
22164
22339
  const i18nSnapshot = getFarmI18nClientSnapshot();
22165
22340
  const clientScript = isClientComponent ? ` <script type="module" src="/@farm/client.js"></script>` : "";
22166
22341
  const integrationManifestScript = `<script>
22167
- window.__FARM_DEPLOYMENT_ID__ = ${serializeInlineValue(this.getDeploymentId())};
22342
+ window.__FARM_DEPLOYMENT_ID__ = ${serializeInlineValue2(this.getDeploymentId())};
22168
22343
  window.__FARM_INTEGRATION_API_MANIFEST__ = ${JSON.stringify(getRegisteredIntegrationAPIManifest())};
22169
- ${i18nSnapshot ? `window.__FARM_I18N__ = ${serializeInlineValue(i18nSnapshot)};` : ""}
22344
+ ${i18nSnapshot ? `window.__FARM_I18N__ = ${serializeInlineValue2(i18nSnapshot)};` : ""}
22170
22345
  </script>`;
22171
22346
  const alternateLinks = i18nSnapshot ? renderI18nAlternateLinks(requestPath, i18nSnapshot) : "";
22172
22347
  const fontHead = renderFarmFontDevHead(this.config.root || process.cwd());
22348
+ const themeDocument = createFarmThemeDocumentParts(
22349
+ this.config.theme,
22350
+ this.config.basePath,
22351
+ getTheme()
22352
+ );
22173
22353
  return `<!DOCTYPE html>
22174
- <html lang="${escapeHtmlAttribute2(i18nSnapshot?.locale || "en")}"${i18nSnapshot ? ` dir="${i18nSnapshot.direction}"` : ""}>
22354
+ <html lang="${escapeHtmlAttribute2(i18nSnapshot?.locale || "en")}"${i18nSnapshot ? ` dir="${i18nSnapshot.direction}"` : ""}${themeDocument.attributes}>
22175
22355
  <head>
22356
+ ${themeDocument.head}
22176
22357
  <meta charset="utf-8">
22177
22358
  <meta name="viewport" content="width=device-width, initial-scale=1">
22178
22359
  <meta name="farm-deployment-id" content="${escapeHtmlAttribute2(this.getDeploymentId())}">
@@ -22219,6 +22400,7 @@ init_config();
22219
22400
  init_auth_config();
22220
22401
  init_preload();
22221
22402
  init_security();
22403
+ init_config2();
22222
22404
  var defaultDocsConfig = {
22223
22405
  enabled: false,
22224
22406
  entry: "/docs",
@@ -22232,6 +22414,7 @@ var _FarmApp = class _FarmApp {
22232
22414
  constructor(config = {}, viteServer) {
22233
22415
  this.config = this.normalizeConfig(config);
22234
22416
  configureFarmObservability(this.config.observability);
22417
+ _setDefaultFarmThemeConfig(this.config.theme);
22235
22418
  this.i18nRuntime = createFarmI18nRuntime(this.config.i18n);
22236
22419
  _setDefaultFarmI18nRuntime(this.i18nRuntime);
22237
22420
  this.viteServer = viteServer;
@@ -22290,6 +22473,7 @@ var _FarmApp = class _FarmApp {
22290
22473
  security: resolveFarmSecurityConfig(config.security),
22291
22474
  images: resolveFarmImageConfig(config.images),
22292
22475
  performance: resolveFarmPerformanceConfig(config.performance),
22476
+ theme: resolveFarmThemeConfig(config.theme, config.basePath || "/"),
22293
22477
  i18n: isResolvedI18nConfig(config.i18n) ? config.i18n : resolveFarmI18nConfig(config.i18n, {
22294
22478
  root,
22295
22479
  mode: process.env.NODE_ENV === "production" ? "production" : "development"
@@ -23494,6 +23678,15 @@ __name(normalizeMiddlewareModule, "normalizeMiddlewareModule");
23494
23678
 
23495
23679
  // src/middleware/manager.ts
23496
23680
  init_response();
23681
+
23682
+ // src/cli-colors.ts
23683
+ var import_picocolors = __toESM(require("picocolors"));
23684
+ function createCliColors(interactive = process.stdout.isTTY === true) {
23685
+ return import_picocolors.default.createColors(interactive);
23686
+ }
23687
+ __name(createCliColors, "createCliColors");
23688
+
23689
+ // src/middleware/manager.ts
23497
23690
  function isMiddlewareResponse(value) {
23498
23691
  return value instanceof Response;
23499
23692
  }
@@ -23650,23 +23843,16 @@ var _MiddlewareManager = class _MiddlewareManager {
23650
23843
  if (applicable.length === 0) {
23651
23844
  return false;
23652
23845
  }
23653
- try {
23654
- const pc = require("picocolors");
23655
- const middlewarePaths = applicable.map(({ mw }) => mw.path).join(", ");
23656
- const log = [
23657
- pc.dim("[") + pc.bold(pc.blue("FARM")) + pc.dim("]"),
23658
- pc.dim("[") + pc.bold(pc.magenta("MIDDLEWARE")) + pc.dim("]"),
23659
- pc.dim("[") + pc.bold(pc.white(method.padEnd(3))) + pc.dim("]"),
23660
- pc.gray("Executing middleware: "),
23661
- pc.gray(pathname),
23662
- pc.dim(` (${(Date.now() - startTime).toFixed(2)}ms)`)
23663
- ].join(" ");
23664
- console.log(log);
23665
- } catch {
23666
- console.log(
23667
- `[FARM] [MIDDLEWARE] [${method}] Executing ${pathname} (${applicable.length} middleware)`
23668
- );
23669
- }
23846
+ const pc = createCliColors();
23847
+ const log = [
23848
+ pc.dim("[") + pc.bold(pc.blue("FARM")) + pc.dim("]"),
23849
+ pc.dim("[") + pc.bold(pc.magenta("MIDDLEWARE")) + pc.dim("]"),
23850
+ pc.dim("[") + pc.bold(pc.white(method.padEnd(3))) + pc.dim("]"),
23851
+ pc.gray("Executing middleware: "),
23852
+ pc.gray(pathname),
23853
+ pc.dim(` (${(Date.now() - startTime).toFixed(2)}ms)`)
23854
+ ].join(" ");
23855
+ console.log(log);
23670
23856
  for (const entry of applicable) {
23671
23857
  const { mw, routeMatch } = entry;
23672
23858
  const configMatch = mw.config ? this.matchesConfig(routePathname, mw.config, ctx) : { matched: true };
@@ -24902,7 +25088,7 @@ function transformError(id, message) {
24902
25088
  __name(transformError, "transformError");
24903
25089
 
24904
25090
  // package.json
24905
- var version = "0.1.0-beta.21";
25091
+ var version = "0.1.0-beta.23";
24906
25092
 
24907
25093
  // src/version.ts
24908
25094
  var FARM_VERSION = version;
@@ -25303,6 +25489,32 @@ __name(mergeFarmViteConfig, "mergeFarmViteConfig");
25303
25489
  // src/vite.ts
25304
25490
  init_fonts();
25305
25491
  init_server_http();
25492
+
25493
+ // src/theme/vite.ts
25494
+ init_config2();
25495
+ var FARM_DARK_VARIANT = '@custom-variant dark (&:where([data-theme="dark"], [data-theme="dark"] *));';
25496
+ function createFarmThemeCssPlugin(input, basePath = "/") {
25497
+ const config = resolveFarmThemeConfig(input, basePath);
25498
+ return {
25499
+ name: "farm:theme-css",
25500
+ enforce: "pre",
25501
+ transform(code, id) {
25502
+ if (!config.enabled || !/\.css(?:\?.*)?$/.test(id) || !/@import\s+["']tailwindcss["']/.test(code) || /@custom-variant\s+dark\b/.test(code)) {
25503
+ return null;
25504
+ }
25505
+ return {
25506
+ code: `${code.trimEnd()}
25507
+
25508
+ ${FARM_DARK_VARIANT}
25509
+ `,
25510
+ map: null
25511
+ };
25512
+ }
25513
+ };
25514
+ }
25515
+ __name(createFarmThemeCssPlugin, "createFarmThemeCssPlugin");
25516
+
25517
+ // src/vite.ts
25306
25518
  var ALL_TYPE_ARTIFACTS = {
25307
25519
  routes: true,
25308
25520
  api: true,
@@ -25607,18 +25819,14 @@ function farmPlugin(options = {}, initialPluginManager) {
25607
25819
  let refreshRouteDiscovery = null;
25608
25820
  let workflowHandler = null;
25609
25821
  const logUpdate = /* @__PURE__ */ __name((tag, message) => {
25610
- try {
25611
- const pc = require("picocolors");
25612
- const log = [
25613
- pc.dim("[") + pc.bold(pc.blue("FARM")) + pc.dim("]"),
25614
- pc.dim("[") + pc.bold(pc.cyan(tag)) + pc.dim("]"),
25615
- pc.dim("[") + pc.bold(pc.yellow("UPDATE")) + pc.dim("]"),
25616
- pc.gray(message)
25617
- ].join(" ");
25618
- console.log(log);
25619
- } catch {
25620
- console.log(`[FARM] [${tag}] [UPDATE] ${message}`);
25621
- }
25822
+ const pc = createCliColors();
25823
+ const log = [
25824
+ pc.dim("[") + pc.bold(pc.blue("FARM")) + pc.dim("]"),
25825
+ pc.dim("[") + pc.bold(pc.cyan(tag)) + pc.dim("]"),
25826
+ pc.dim("[") + pc.bold(pc.yellow("UPDATE")) + pc.dim("]"),
25827
+ pc.gray(message)
25828
+ ].join(" ");
25829
+ console.log(log);
25622
25830
  }, "logUpdate");
25623
25831
  return {
25624
25832
  name: "farm",
@@ -26059,25 +26267,21 @@ window.__FARM_MANIFEST__ = ${inlineValue({
26059
26267
  return;
26060
26268
  }
26061
26269
  logResponse.__last = { key: dedupeKey, ts: now };
26062
- try {
26063
- const pc = require("picocolors");
26064
- let statusColor = pc.green;
26065
- if (status >= 500) statusColor = pc.red;
26066
- else if (status >= 400) statusColor = pc.yellow;
26067
- else if (status >= 300) statusColor = pc.cyan;
26068
- const log = [
26069
- pc.dim("[") + pc.bold(pc.blue("FARM")) + pc.dim("]"),
26070
- pc.dim("[") + pc.bold(pc.cyan(tag)) + pc.dim("]"),
26071
- pc.dim("[") + pc.bold(pc.white(method.padEnd(3))) + pc.dim("]"),
26072
- pc.gray(urlPath),
26073
- pc.dim("-"),
26074
- statusColor(status.toString()),
26075
- pc.dim(`(${duration}ms)`)
26076
- ].join(" ");
26077
- console.log(log);
26078
- } catch {
26079
- console.log(`[FARM] [${tag}] [${method}] ${urlPath} - ${status} (${duration}ms)`);
26080
- }
26270
+ const pc = createCliColors();
26271
+ let statusColor = pc.green;
26272
+ if (status >= 500) statusColor = pc.red;
26273
+ else if (status >= 400) statusColor = pc.yellow;
26274
+ else if (status >= 300) statusColor = pc.cyan;
26275
+ const log = [
26276
+ pc.dim("[") + pc.bold(pc.blue("FARM")) + pc.dim("]"),
26277
+ pc.dim("[") + pc.bold(pc.cyan(tag)) + pc.dim("]"),
26278
+ pc.dim("[") + pc.bold(pc.white(method.padEnd(3))) + pc.dim("]"),
26279
+ pc.gray(urlPath),
26280
+ pc.dim("-"),
26281
+ statusColor(status.toString()),
26282
+ pc.dim(`(${duration}ms)`)
26283
+ ].join(" ");
26284
+ console.log(log);
26081
26285
  }, "logResponse");
26082
26286
  server.middlewares.use(
26083
26287
  _withAfterNodeMiddleware(async (req, res, next) => {
@@ -28697,14 +28901,22 @@ async function renderPage(pageData) {
28697
28901
  if (!doc.documentElement || !doc.body) return false;
28698
28902
 
28699
28903
  resetReactRoots();
28904
+ const activeFarmTheme =
28905
+ window.__FARM_THEME__?.snapshot?.resolvedTheme ||
28906
+ document.documentElement.getAttribute('data-theme');
28700
28907
  Array.from(document.documentElement.attributes).forEach(function(attr) {
28908
+ if (attr.name === 'data-theme') return;
28701
28909
  if (!doc.documentElement.hasAttribute(attr.name)) {
28702
28910
  document.documentElement.removeAttribute(attr.name);
28703
28911
  }
28704
28912
  });
28705
28913
  Array.from(doc.documentElement.attributes).forEach(function(attr) {
28914
+ if (attr.name === 'data-theme') return;
28706
28915
  document.documentElement.setAttribute(attr.name, attr.value);
28707
28916
  });
28917
+ if (activeFarmTheme) {
28918
+ document.documentElement.setAttribute('data-theme', activeFarmTheme);
28919
+ }
28708
28920
 
28709
28921
  document.head.innerHTML = doc.head ? doc.head.innerHTML : '';
28710
28922
  document.body.innerHTML = doc.body.innerHTML;
@@ -28713,6 +28925,7 @@ async function renderPage(pageData) {
28713
28925
 
28714
28926
  setTimeout(function() {
28715
28927
  Array.from(document.querySelectorAll('script')).forEach(function(script) {
28928
+ if (script.id === 'farm-theme-script') return;
28716
28929
  const freshScript = document.createElement('script');
28717
28930
  Array.from(script.attributes).forEach(function(attr) {
28718
28931
  freshScript.setAttribute(attr.name, attr.value);
@@ -29143,7 +29356,7 @@ async function defineConfig2(config = {}) {
29143
29356
  return null;
29144
29357
  }
29145
29358
  };
29146
- const pc = await import("picocolors").then((m) => m.default);
29359
+ const pc = createCliColors();
29147
29360
  let serverStarted = false;
29148
29361
  let startTime = Date.now();
29149
29362
  const farmLogger = {
@@ -29210,6 +29423,7 @@ async function defineConfig2(config = {}) {
29210
29423
  };
29211
29424
  return {
29212
29425
  plugins: [
29426
+ createFarmThemeCssPlugin(config.theme, config.basePath),
29213
29427
  tailwindcss(),
29214
29428
  viteBrowserExternalPlugin,
29215
29429
  farmI18nClientBridgePlugin(),
@@ -29689,8 +29903,8 @@ function assertServerQueryKey(key) {
29689
29903
  __name(assertServerQueryKey, "assertServerQueryKey");
29690
29904
 
29691
29905
  // src/server/create-server.ts
29692
- var import_vite2 = require("vite");
29693
- init_config2();
29906
+ var import_vite3 = require("vite");
29907
+ init_config3();
29694
29908
 
29695
29909
  // src/plugin.ts
29696
29910
  init_env();
@@ -30524,22 +30738,6 @@ var DEFAULT_FARM_DEV_SERVER_PORT = 3e3;
30524
30738
  function createBrandingPlugin() {
30525
30739
  let serverStarted = false;
30526
30740
  let startTime = Date.now();
30527
- const getColors = /* @__PURE__ */ __name(() => {
30528
- const id = /* @__PURE__ */ __name((s) => s, "id");
30529
- try {
30530
- const pc = typeof require === "function" ? require("picocolors") : null;
30531
- if (pc && typeof pc.createColors === "function") return pc.createColors(true);
30532
- if (pc) return pc;
30533
- } catch {
30534
- }
30535
- return {
30536
- dim: id,
30537
- bold: id,
30538
- green: id,
30539
- cyan: id,
30540
- gray: id
30541
- };
30542
- }, "getColors");
30543
30741
  return {
30544
30742
  name: "farm:branding",
30545
30743
  enforce: "pre",
@@ -30553,7 +30751,7 @@ function createBrandingPlugin() {
30553
30751
  const elapsed = Date.now() - startTime;
30554
30752
  const address = server.httpServer?.address();
30555
30753
  const resolvedPort = typeof address === "object" && address ? address.port : server.config.server.port || port || 3e3;
30556
- const pc = getColors();
30754
+ const pc = createCliColors();
30557
30755
  console.log("");
30558
30756
  console.log(
30559
30757
  ` ${pc.bold(pc.green("Farm.js"))} ${pc.dim(`v${FARM_VERSION}`)} ${pc.dim(`ready in ${elapsed}ms`)}`
@@ -30661,19 +30859,19 @@ async function createServer(config = {}) {
30661
30859
  try {
30662
30860
  const tailwindcss = (await import("@tailwindcss/vite")).default;
30663
30861
  tailwindVitePlugin = tailwindcss();
30664
- logger.info("\u{1F4E6} Enabled built-in Tailwind support (@tailwindcss/vite)");
30665
30862
  } catch (error) {
30666
30863
  logger.warn(
30667
30864
  `Tailwind plugin auto-enable failed; continuing without it: ${error.message}`
30668
30865
  );
30669
30866
  }
30670
30867
  }
30671
- const server = await (0, import_vite2.createServer)(
30868
+ const server = await (0, import_vite3.createServer)(
30672
30869
  mergeFarmViteConfig(
30673
30870
  {
30674
30871
  root: projectRoot,
30675
30872
  css: shouldUseProjectPostcss ? void 0 : { postcss: { plugins: [] } },
30676
30873
  plugins: [
30874
+ createFarmThemeCssPlugin(finalConfig.theme, finalConfig.basePath),
30677
30875
  ...tailwindVitePlugin ? [tailwindVitePlugin] : [],
30678
30876
  createDevDependencyStubsPlugin(),
30679
30877
  farmI18nClientBridgePlugin(),
@@ -30884,6 +31082,8 @@ __name(assertFunction, "assertFunction");
30884
31082
  getServerActionInvalidations,
30885
31083
  getServerActionSignal,
30886
31084
  getStorage,
31085
+ getTheme,
31086
+ getThemeSnapshot,
30887
31087
  globFiles,
30888
31088
  initStorage,
30889
31089
  invalidate,