@farm.js/core 0.1.0-beta.6 → 0.1.0-beta.8

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 (447) hide show
  1. package/dist/after.cjs +227 -0
  2. package/dist/after.cjs.map +1 -0
  3. package/dist/after.d.mts +25 -0
  4. package/dist/after.d.ts +25 -0
  5. package/dist/after.mjs +14 -0
  6. package/dist/after.mjs.map +1 -0
  7. package/dist/agent-runtime.cjs +2379 -0
  8. package/dist/agent-runtime.cjs.map +1 -0
  9. package/dist/agent-runtime.d.mts +94 -0
  10. package/dist/agent-runtime.d.ts +94 -0
  11. package/dist/agent-runtime.mjs +479 -0
  12. package/dist/agent-runtime.mjs.map +1 -0
  13. package/dist/api/route-manager.d.mts +66 -0
  14. package/dist/api/route-manager.d.ts +66 -0
  15. package/dist/api/runtime.d.mts +3 -0
  16. package/dist/api/runtime.d.ts +3 -0
  17. package/dist/api.cjs +4100 -0
  18. package/dist/api.cjs.map +1 -0
  19. package/dist/api.d.mts +48 -0
  20. package/dist/api.d.ts +48 -0
  21. package/dist/api.mjs +93 -0
  22. package/dist/api.mjs.map +1 -0
  23. package/dist/app-BWtqQu3R.d.mts +302 -0
  24. package/dist/app-markdown.cjs +244 -0
  25. package/dist/app-markdown.cjs.map +1 -0
  26. package/dist/app-markdown.d.mts +22 -0
  27. package/dist/app-markdown.d.ts +22 -0
  28. package/dist/app-markdown.mjs +27 -0
  29. package/dist/app-markdown.mjs.map +1 -0
  30. package/dist/app-xltejvLY.d.ts +302 -0
  31. package/dist/cache.cjs +945 -0
  32. package/dist/cache.cjs.map +1 -0
  33. package/dist/cache.d.mts +192 -0
  34. package/dist/cache.d.ts +192 -0
  35. package/dist/cache.mjs +46 -0
  36. package/dist/cache.mjs.map +1 -0
  37. package/dist/chunk-2ED5Q2GH.mjs +422 -0
  38. package/dist/chunk-2ED5Q2GH.mjs.map +1 -0
  39. package/dist/chunk-32W4QEJP.mjs +158 -0
  40. package/dist/chunk-32W4QEJP.mjs.map +1 -0
  41. package/dist/chunk-3XNTL3FQ.mjs +452 -0
  42. package/dist/chunk-3XNTL3FQ.mjs.map +1 -0
  43. package/dist/chunk-44ZCFSKE.mjs +84 -0
  44. package/dist/chunk-44ZCFSKE.mjs.map +1 -0
  45. package/dist/chunk-4MGVSBRP.mjs +7787 -0
  46. package/dist/chunk-4MGVSBRP.mjs.map +1 -0
  47. package/dist/chunk-4S3ORGFA.mjs +44 -0
  48. package/dist/chunk-4S3ORGFA.mjs.map +1 -0
  49. package/dist/chunk-5BY76U2M.mjs +1 -0
  50. package/dist/chunk-5BY76U2M.mjs.map +1 -0
  51. package/dist/chunk-5ZGPRGWV.mjs +136 -0
  52. package/dist/chunk-5ZGPRGWV.mjs.map +1 -0
  53. package/dist/chunk-65A7QIKI.mjs +142 -0
  54. package/dist/chunk-65A7QIKI.mjs.map +1 -0
  55. package/dist/chunk-74YTBPTY.mjs +450 -0
  56. package/dist/chunk-74YTBPTY.mjs.map +1 -0
  57. package/dist/chunk-7FBJLMQH.mjs +338 -0
  58. package/dist/chunk-7FBJLMQH.mjs.map +1 -0
  59. package/dist/chunk-7HO6AEOP.mjs +74 -0
  60. package/dist/chunk-7HO6AEOP.mjs.map +1 -0
  61. package/dist/chunk-7MABZJIM.mjs +29 -0
  62. package/dist/chunk-7MABZJIM.mjs.map +1 -0
  63. package/dist/chunk-7N62DNSO.mjs +41 -0
  64. package/dist/chunk-7N62DNSO.mjs.map +1 -0
  65. package/dist/chunk-7ZY5AIJO.mjs +161 -0
  66. package/dist/chunk-7ZY5AIJO.mjs.map +1 -0
  67. package/dist/chunk-ALCLXXTY.mjs +187 -0
  68. package/dist/chunk-ALCLXXTY.mjs.map +1 -0
  69. package/dist/chunk-AZ7YUVNR.mjs +65 -0
  70. package/dist/chunk-AZ7YUVNR.mjs.map +1 -0
  71. package/dist/chunk-B232I2GP.mjs +163 -0
  72. package/dist/chunk-B232I2GP.mjs.map +1 -0
  73. package/dist/chunk-B4W3BNTL.mjs +483 -0
  74. package/dist/chunk-B4W3BNTL.mjs.map +1 -0
  75. package/dist/chunk-C2ROET2V.mjs +718 -0
  76. package/dist/chunk-C2ROET2V.mjs.map +1 -0
  77. package/dist/chunk-CGILA3WO.mjs +14 -0
  78. package/dist/chunk-CGILA3WO.mjs.map +1 -0
  79. package/dist/chunk-CGIXMLSY.mjs +184 -0
  80. package/dist/chunk-CGIXMLSY.mjs.map +1 -0
  81. package/dist/chunk-DJSGLHCN.mjs +597 -0
  82. package/dist/chunk-DJSGLHCN.mjs.map +1 -0
  83. package/dist/chunk-E2MPIBRE.mjs +149 -0
  84. package/dist/chunk-E2MPIBRE.mjs.map +1 -0
  85. package/dist/chunk-E6EPN5BT.mjs +203 -0
  86. package/dist/chunk-E6EPN5BT.mjs.map +1 -0
  87. package/dist/chunk-EI43C4RA.mjs +6277 -0
  88. package/dist/chunk-EI43C4RA.mjs.map +1 -0
  89. package/dist/chunk-EJ7T4TPB.mjs +622 -0
  90. package/dist/chunk-EJ7T4TPB.mjs.map +1 -0
  91. package/dist/chunk-FQYDHKKU.mjs +128 -0
  92. package/dist/chunk-FQYDHKKU.mjs.map +1 -0
  93. package/dist/chunk-FRPWCMMG.mjs +299 -0
  94. package/dist/chunk-FRPWCMMG.mjs.map +1 -0
  95. package/dist/chunk-GN72QAIH.mjs +146 -0
  96. package/dist/chunk-GN72QAIH.mjs.map +1 -0
  97. package/dist/chunk-GQVGIUSN.mjs +149 -0
  98. package/dist/chunk-GQVGIUSN.mjs.map +1 -0
  99. package/dist/chunk-GS6K5OCM.mjs +407 -0
  100. package/dist/chunk-GS6K5OCM.mjs.map +1 -0
  101. package/dist/chunk-GXASWWJU.mjs +364 -0
  102. package/dist/chunk-GXASWWJU.mjs.map +1 -0
  103. package/dist/chunk-GY2STC2S.mjs +180 -0
  104. package/dist/chunk-GY2STC2S.mjs.map +1 -0
  105. package/dist/chunk-H2FA2SBS.mjs +51 -0
  106. package/dist/chunk-H2FA2SBS.mjs.map +1 -0
  107. package/dist/chunk-I4CUBGVF.mjs +93 -0
  108. package/dist/chunk-I4CUBGVF.mjs.map +1 -0
  109. package/dist/chunk-ITN462YM.mjs +98 -0
  110. package/dist/chunk-ITN462YM.mjs.map +1 -0
  111. package/dist/chunk-J23HNLFY.mjs +72 -0
  112. package/dist/chunk-J23HNLFY.mjs.map +1 -0
  113. package/dist/chunk-J4FNJ5IU.mjs +179 -0
  114. package/dist/chunk-J4FNJ5IU.mjs.map +1 -0
  115. package/dist/chunk-J5YWQVI5.mjs +211 -0
  116. package/dist/chunk-J5YWQVI5.mjs.map +1 -0
  117. package/dist/chunk-JDEOUK5V.mjs +427 -0
  118. package/dist/chunk-JDEOUK5V.mjs.map +1 -0
  119. package/dist/chunk-JK25YEN6.mjs +219 -0
  120. package/dist/chunk-JK25YEN6.mjs.map +1 -0
  121. package/dist/chunk-K4667E2Q.mjs +1916 -0
  122. package/dist/chunk-K4667E2Q.mjs.map +1 -0
  123. package/dist/chunk-LGHEOHBU.mjs +218 -0
  124. package/dist/chunk-LGHEOHBU.mjs.map +1 -0
  125. package/dist/chunk-LM2YNO4U.mjs +24 -0
  126. package/dist/chunk-LM2YNO4U.mjs.map +1 -0
  127. package/dist/chunk-ME4MO2RJ.mjs +3540 -0
  128. package/dist/chunk-ME4MO2RJ.mjs.map +1 -0
  129. package/dist/chunk-MIUW47JX.mjs +639 -0
  130. package/dist/chunk-MIUW47JX.mjs.map +1 -0
  131. package/dist/chunk-NNLCAVB6.mjs +391 -0
  132. package/dist/chunk-NNLCAVB6.mjs.map +1 -0
  133. package/dist/chunk-P7QDS5AT.mjs +191 -0
  134. package/dist/chunk-P7QDS5AT.mjs.map +1 -0
  135. package/dist/chunk-PFE6GMNE.mjs +603 -0
  136. package/dist/chunk-PFE6GMNE.mjs.map +1 -0
  137. package/dist/chunk-QGOHVJ6J.mjs +63 -0
  138. package/dist/chunk-QGOHVJ6J.mjs.map +1 -0
  139. package/dist/chunk-QKVUNGAH.mjs +39 -0
  140. package/dist/chunk-QKVUNGAH.mjs.map +1 -0
  141. package/dist/chunk-QM746KUO.mjs +56 -0
  142. package/dist/chunk-QM746KUO.mjs.map +1 -0
  143. package/dist/chunk-QTZZ2ISQ.mjs +753 -0
  144. package/dist/chunk-QTZZ2ISQ.mjs.map +1 -0
  145. package/dist/chunk-RBRLLZL5.mjs +81 -0
  146. package/dist/chunk-RBRLLZL5.mjs.map +1 -0
  147. package/dist/chunk-RHIFZZUI.mjs +69 -0
  148. package/dist/chunk-RHIFZZUI.mjs.map +1 -0
  149. package/dist/chunk-RQ633A5I.mjs +187 -0
  150. package/dist/chunk-RQ633A5I.mjs.map +1 -0
  151. package/dist/chunk-SCFX4UTD.mjs +28 -0
  152. package/dist/chunk-SCFX4UTD.mjs.map +1 -0
  153. package/dist/chunk-SL6HTIOK.mjs +66 -0
  154. package/dist/chunk-SL6HTIOK.mjs.map +1 -0
  155. package/dist/chunk-SPBBQLXI.mjs +207 -0
  156. package/dist/chunk-SPBBQLXI.mjs.map +1 -0
  157. package/dist/chunk-SSA7THPX.mjs +10 -0
  158. package/dist/chunk-SSA7THPX.mjs.map +1 -0
  159. package/dist/chunk-T4QJQK76.mjs +459 -0
  160. package/dist/chunk-T4QJQK76.mjs.map +1 -0
  161. package/dist/chunk-TQAEEJB4.mjs +157 -0
  162. package/dist/chunk-TQAEEJB4.mjs.map +1 -0
  163. package/dist/chunk-UB5UOSHB.mjs +458 -0
  164. package/dist/chunk-UB5UOSHB.mjs.map +1 -0
  165. package/dist/chunk-USWZZUEH.mjs +25 -0
  166. package/dist/chunk-USWZZUEH.mjs.map +1 -0
  167. package/dist/chunk-UVCIEUJC.mjs +16 -0
  168. package/dist/chunk-UVCIEUJC.mjs.map +1 -0
  169. package/dist/chunk-UXUAWNO5.mjs +396 -0
  170. package/dist/chunk-UXUAWNO5.mjs.map +1 -0
  171. package/dist/chunk-V3XURYJO.mjs +756 -0
  172. package/dist/chunk-V3XURYJO.mjs.map +1 -0
  173. package/dist/chunk-V6WE6JSZ.mjs +352 -0
  174. package/dist/chunk-V6WE6JSZ.mjs.map +1 -0
  175. package/dist/chunk-V7RBCSDJ.mjs +170 -0
  176. package/dist/chunk-V7RBCSDJ.mjs.map +1 -0
  177. package/dist/chunk-VCANOYFI.mjs +588 -0
  178. package/dist/chunk-VCANOYFI.mjs.map +1 -0
  179. package/dist/chunk-VY2UYN5R.mjs +224 -0
  180. package/dist/chunk-VY2UYN5R.mjs.map +1 -0
  181. package/dist/chunk-W2CRQFF6.mjs +1352 -0
  182. package/dist/chunk-W2CRQFF6.mjs.map +1 -0
  183. package/dist/chunk-WDU6QXNK.mjs +872 -0
  184. package/dist/chunk-WDU6QXNK.mjs.map +1 -0
  185. package/dist/chunk-WZ5QFROO.mjs +23 -0
  186. package/dist/chunk-WZ5QFROO.mjs.map +1 -0
  187. package/dist/chunk-XIVV5IWN.mjs +541 -0
  188. package/dist/chunk-XIVV5IWN.mjs.map +1 -0
  189. package/dist/chunk-YW7OBE6Q.mjs +119 -0
  190. package/dist/chunk-YW7OBE6Q.mjs.map +1 -0
  191. package/dist/chunk-Z5CQMP54.mjs +365 -0
  192. package/dist/chunk-Z5CQMP54.mjs.map +1 -0
  193. package/dist/chunk-ZBE6MLHL.mjs +230 -0
  194. package/dist/chunk-ZBE6MLHL.mjs.map +1 -0
  195. package/dist/chunk-ZVWA4ZQ3.mjs +189 -0
  196. package/dist/chunk-ZVWA4ZQ3.mjs.map +1 -0
  197. package/dist/chunk-ZZ57EH5Z.mjs +173 -0
  198. package/dist/chunk-ZZ57EH5Z.mjs.map +1 -0
  199. package/dist/client-BT1mFQas.d.mts +447 -0
  200. package/dist/client-Nn0q4eO4.d.ts +447 -0
  201. package/dist/client-cache-CIlyBlmx.d.ts +6 -0
  202. package/dist/client-cache-D-EZ7XVW.d.mts +6 -0
  203. package/dist/client-plugins-BI2R6Eae.d.mts +1926 -0
  204. package/dist/client-plugins-DU9oMspX.d.ts +1926 -0
  205. package/dist/client-plugins.cjs +415 -0
  206. package/dist/client-plugins.cjs.map +1 -0
  207. package/dist/client-plugins.d.mts +22 -0
  208. package/dist/client-plugins.d.ts +22 -0
  209. package/dist/client-plugins.mjs +10 -0
  210. package/dist/client-plugins.mjs.map +1 -0
  211. package/dist/client.cjs +5402 -0
  212. package/dist/client.cjs.map +1 -0
  213. package/dist/client.d.mts +447 -0
  214. package/dist/client.d.ts +447 -0
  215. package/dist/client.mjs +110 -0
  216. package/dist/client.mjs.map +1 -0
  217. package/dist/config.cjs +38 -0
  218. package/dist/config.cjs.map +1 -0
  219. package/dist/config.d.mts +29 -0
  220. package/dist/config.d.ts +29 -0
  221. package/dist/config.mjs +10 -0
  222. package/dist/config.mjs.map +1 -0
  223. package/dist/cron.cjs +406 -0
  224. package/dist/cron.cjs.map +1 -0
  225. package/dist/cron.d.mts +78 -0
  226. package/dist/cron.d.ts +78 -0
  227. package/dist/cron.mjs +30 -0
  228. package/dist/cron.mjs.map +1 -0
  229. package/dist/deferred.cjs +438 -0
  230. package/dist/deferred.cjs.map +1 -0
  231. package/dist/deferred.d.mts +42 -0
  232. package/dist/deferred.d.ts +42 -0
  233. package/dist/deferred.mjs +28 -0
  234. package/dist/deferred.mjs.map +1 -0
  235. package/dist/deployment.cjs +199 -0
  236. package/dist/deployment.cjs.map +1 -0
  237. package/dist/deployment.d.mts +34 -0
  238. package/dist/deployment.d.ts +34 -0
  239. package/dist/deployment.mjs +38 -0
  240. package/dist/deployment.mjs.map +1 -0
  241. package/dist/devtools-REQTS3I7.mjs +371 -0
  242. package/dist/devtools-REQTS3I7.mjs.map +1 -0
  243. package/dist/devtools-client-3XRTBND5.mjs +216 -0
  244. package/dist/devtools-client-3XRTBND5.mjs.map +1 -0
  245. package/dist/devtools-ui-NJKFORTG.mjs +1349 -0
  246. package/dist/devtools-ui-NJKFORTG.mjs.map +1 -0
  247. package/dist/docs.cjs +5548 -0
  248. package/dist/docs.cjs.map +1 -0
  249. package/dist/docs.d.mts +69 -0
  250. package/dist/docs.d.ts +69 -0
  251. package/dist/docs.mjs +47 -0
  252. package/dist/docs.mjs.map +1 -0
  253. package/dist/env-types.cjs +232 -0
  254. package/dist/env-types.cjs.map +1 -0
  255. package/dist/env-types.d.mts +12 -0
  256. package/dist/env-types.d.ts +12 -0
  257. package/dist/env-types.mjs +11 -0
  258. package/dist/env-types.mjs.map +1 -0
  259. package/dist/env.cjs +215 -0
  260. package/dist/env.cjs.map +1 -0
  261. package/dist/env.d.mts +45 -0
  262. package/dist/env.d.ts +45 -0
  263. package/dist/env.mjs +22 -0
  264. package/dist/env.mjs.map +1 -0
  265. package/dist/environment/vite.d.mts +22 -0
  266. package/dist/environment/vite.d.ts +22 -0
  267. package/dist/environment.cjs +96 -0
  268. package/dist/environment.cjs.map +1 -0
  269. package/dist/environment.d.mts +18 -0
  270. package/dist/environment.d.ts +18 -0
  271. package/dist/environment.mjs +14 -0
  272. package/dist/environment.mjs.map +1 -0
  273. package/dist/headers.cjs +126 -0
  274. package/dist/headers.cjs.map +1 -0
  275. package/dist/headers.d.mts +22 -0
  276. package/dist/headers.d.ts +22 -0
  277. package/dist/headers.mjs +12 -0
  278. package/dist/headers.mjs.map +1 -0
  279. package/dist/i18n/client.d.mts +32 -0
  280. package/dist/i18n/client.d.ts +32 -0
  281. package/dist/i18n/index.d.mts +20 -0
  282. package/dist/i18n/index.d.ts +20 -0
  283. package/dist/i18n/server.d.mts +30 -0
  284. package/dist/i18n/server.d.ts +30 -0
  285. package/dist/image/server.d.mts +37 -0
  286. package/dist/image/server.d.ts +37 -0
  287. package/dist/image/sharp.d.mts +7 -0
  288. package/dist/image/sharp.d.ts +7 -0
  289. package/dist/image-config-Duob7wER.d.mts +50 -0
  290. package/dist/image-config-Duob7wER.d.ts +50 -0
  291. package/dist/image.cjs +209 -0
  292. package/dist/image.cjs.map +1 -0
  293. package/dist/image.d.mts +39 -0
  294. package/dist/image.d.ts +39 -0
  295. package/dist/image.mjs +165 -0
  296. package/dist/image.mjs.map +1 -0
  297. package/dist/index.cjs +42186 -0
  298. package/dist/index.cjs.map +1 -0
  299. package/dist/index.d.mts +454 -0
  300. package/dist/index.d.ts +454 -0
  301. package/dist/index.mjs +980 -0
  302. package/dist/index.mjs.map +1 -0
  303. package/dist/integration-api-CHT2OKAf.d.mts +93 -0
  304. package/dist/integration-api-CHT2OKAf.d.ts +93 -0
  305. package/dist/integration-orm-GQLGU66X.mjs +13 -0
  306. package/dist/integration-orm-GQLGU66X.mjs.map +1 -0
  307. package/dist/integrations.cjs +2820 -0
  308. package/dist/integrations.cjs.map +1 -0
  309. package/dist/integrations.d.mts +22 -0
  310. package/dist/integrations.d.ts +22 -0
  311. package/dist/integrations.mjs +51 -0
  312. package/dist/integrations.mjs.map +1 -0
  313. package/dist/internal/build-runtime.cjs +643 -322
  314. package/dist/internal/build-runtime.cjs.map +1 -1
  315. package/dist/internal/build-runtime.d.mts +39 -0
  316. package/dist/internal/build-runtime.d.ts +39 -0
  317. package/dist/internal/build-runtime.mjs +11 -10
  318. package/dist/internal/client-runtime.d.mts +2 -0
  319. package/dist/internal/client-runtime.d.ts +2 -0
  320. package/dist/internal/config-runtime.cjs +135 -39
  321. package/dist/internal/config-runtime.cjs.map +1 -1
  322. package/dist/internal/config-runtime.d.mts +39 -0
  323. package/dist/internal/config-runtime.d.ts +39 -0
  324. package/dist/internal/config-runtime.mjs +5 -4
  325. package/dist/internal/production-node-env.d.mts +12 -0
  326. package/dist/internal/production-node-env.d.ts +12 -0
  327. package/dist/internal/production-runtime.d.mts +39 -0
  328. package/dist/internal/production-runtime.d.ts +39 -0
  329. package/dist/layers-VWVDTPUZ.mjs +16 -0
  330. package/dist/layers-VWVDTPUZ.mjs.map +1 -0
  331. package/dist/manager-THKFTOFE.mjs +10 -0
  332. package/dist/manager-THKFTOFE.mjs.map +1 -0
  333. package/dist/markdown.cjs +364 -0
  334. package/dist/markdown.cjs.map +1 -0
  335. package/dist/markdown.d.mts +60 -0
  336. package/dist/markdown.d.ts +60 -0
  337. package/dist/markdown.mjs +18 -0
  338. package/dist/markdown.mjs.map +1 -0
  339. package/dist/metadata-Cm9ujH4I.d.ts +22 -0
  340. package/dist/metadata-DacXbnLA.d.mts +22 -0
  341. package/dist/middleware.cjs +2148 -0
  342. package/dist/middleware.cjs.map +1 -0
  343. package/dist/middleware.d.mts +164 -0
  344. package/dist/middleware.d.ts +164 -0
  345. package/dist/middleware.mjs +49 -0
  346. package/dist/middleware.mjs.map +1 -0
  347. package/dist/navigation-errors-Dvwpzaer.d.mts +13 -0
  348. package/dist/navigation-errors-Dvwpzaer.d.ts +13 -0
  349. package/dist/navigation.cjs +1329 -0
  350. package/dist/navigation.cjs.map +1 -0
  351. package/dist/navigation.d.mts +14 -0
  352. package/dist/navigation.d.ts +14 -0
  353. package/dist/navigation.mjs +33 -0
  354. package/dist/navigation.mjs.map +1 -0
  355. package/dist/nitro-QO5LV6QK.mjs +689 -0
  356. package/dist/nitro-QO5LV6QK.mjs.map +1 -0
  357. package/dist/observability.cjs +186 -0
  358. package/dist/observability.cjs.map +1 -0
  359. package/dist/observability.d.mts +335 -0
  360. package/dist/observability.d.ts +335 -0
  361. package/dist/observability.mjs +16 -0
  362. package/dist/observability.mjs.map +1 -0
  363. package/dist/params-BALtrRim.d.ts +15 -0
  364. package/dist/params-ry-lxqmy.d.mts +15 -0
  365. package/dist/plugin-BJDf43dc.d.mts +165 -0
  366. package/dist/plugin-BJDf43dc.d.ts +165 -0
  367. package/dist/plugin.cjs +23470 -0
  368. package/dist/plugin.cjs.map +1 -1
  369. package/dist/plugin.d.mts +22 -0
  370. package/dist/plugin.d.ts +22 -0
  371. package/dist/plugin.mjs +8 -7
  372. package/dist/production-runtime-4KKq1AVC.d.mts +79 -0
  373. package/dist/production-runtime-C_B79w2P.d.mts +28 -0
  374. package/dist/production-runtime-DDEM1D2q.d.ts +28 -0
  375. package/dist/production-runtime-DRsWDN2x.d.ts +79 -0
  376. package/dist/query/client.d.mts +61 -0
  377. package/dist/query/client.d.ts +61 -0
  378. package/dist/query/index.d.mts +90 -0
  379. package/dist/query/index.d.ts +90 -0
  380. package/dist/query/parsers.d.mts +25 -0
  381. package/dist/query/parsers.d.ts +25 -0
  382. package/dist/query/server.d.mts +55 -0
  383. package/dist/query/server.d.ts +55 -0
  384. package/dist/request-Dsq4kGW0.d.mts +6 -0
  385. package/dist/request-udtobOLv.d.ts +6 -0
  386. package/dist/request.d.mts +2 -0
  387. package/dist/request.d.ts +2 -0
  388. package/dist/resolver-DJqjLMg_.d.mts +14 -0
  389. package/dist/resolver-IH4RmPEl.d.ts +14 -0
  390. package/dist/route-runtime-DoOHzCAD.d.mts +38 -0
  391. package/dist/route-runtime-DoOHzCAD.d.ts +38 -0
  392. package/dist/router.d.mts +36 -0
  393. package/dist/router.d.ts +36 -0
  394. package/dist/routes.d.mts +224 -0
  395. package/dist/routes.d.ts +224 -0
  396. package/dist/runtime-9nQjVM7X.d.mts +206 -0
  397. package/dist/runtime-Cxpq6xZN.d.mts +27 -0
  398. package/dist/runtime-DgeS2skB.d.ts +206 -0
  399. package/dist/runtime-bv63eUiO.d.ts +27 -0
  400. package/dist/server-action-security.d.mts +43 -0
  401. package/dist/server-action-security.d.ts +43 -0
  402. package/dist/server-fn-client.d.mts +32 -0
  403. package/dist/server-fn-client.d.ts +32 -0
  404. package/dist/server-fn.d.mts +93 -0
  405. package/dist/server-fn.d.ts +93 -0
  406. package/dist/server-plugins.d.mts +55 -0
  407. package/dist/server-plugins.d.ts +55 -0
  408. package/dist/server-query-client.d.mts +50 -0
  409. package/dist/server-query-client.d.ts +50 -0
  410. package/dist/server-query.d.mts +36 -0
  411. package/dist/server-query.d.ts +36 -0
  412. package/dist/server.cjs +731 -447
  413. package/dist/server.cjs.map +1 -1
  414. package/dist/server.d.mts +48 -0
  415. package/dist/server.d.ts +48 -0
  416. package/dist/server.mjs +9 -8
  417. package/dist/server.mjs.map +1 -1
  418. package/dist/storage.d.mts +52 -0
  419. package/dist/storage.d.ts +52 -0
  420. package/dist/testing.d.mts +101 -0
  421. package/dist/testing.d.ts +101 -0
  422. package/dist/transport-BmbGTXA5.d.mts +49 -0
  423. package/dist/transport-BmbGTXA5.d.ts +49 -0
  424. package/dist/types-BMxWr97v.d.mts +81 -0
  425. package/dist/types-BMxWr97v.d.ts +81 -0
  426. package/dist/types-C9N-nk5R.d.mts +53 -0
  427. package/dist/types-C9N-nk5R.d.ts +53 -0
  428. package/dist/types-D1A6-XvH.d.mts +73 -0
  429. package/dist/types-D1A6-XvH.d.ts +73 -0
  430. package/dist/utils-B-cUHwoK.d.ts +23 -0
  431. package/dist/utils-Cm41AefV.d.mts +23 -0
  432. package/dist/version.cjs +1 -1
  433. package/dist/version.cjs.map +1 -1
  434. package/dist/version.d.mts +3 -0
  435. package/dist/version.d.ts +3 -0
  436. package/dist/version.mjs +1 -1
  437. package/dist/vite.cjs +682 -437
  438. package/dist/vite.cjs.map +1 -1
  439. package/dist/vite.d.mts +22 -0
  440. package/dist/vite.d.ts +22 -0
  441. package/dist/vite.mjs +6 -5
  442. package/dist/workflows.d.mts +110 -0
  443. package/dist/workflows.d.ts +110 -0
  444. package/package.json +3 -2
  445. package/types/client.d.ts +1 -1
  446. package/types/image.d.ts +4 -0
  447. package/types/images.d.ts +59 -0
@@ -0,0 +1,3540 @@
1
+ import {
2
+ generateFarmDocsSearchBootstrapRuntime,
3
+ isFarmDocsSearchEnabled
4
+ } from "./chunk-V7RBCSDJ.mjs";
5
+ import {
6
+ resolveDocsConfig
7
+ } from "./chunk-B4W3BNTL.mjs";
8
+ import {
9
+ __name
10
+ } from "./chunk-CGILA3WO.mjs";
11
+
12
+ // src/docs/handler.ts
13
+ import { existsSync as existsSync2, readdirSync as readdirSync2, readFileSync as readFileSync2, statSync as statSync2 } from "fs";
14
+ import { createRequire } from "module";
15
+ import path2 from "path";
16
+ import {
17
+ buildDocsAgentDiscoverySpec,
18
+ buildDocsSitemapManifest,
19
+ isDocsAgentDiscoveryRequest,
20
+ isDocsAgentsRequest,
21
+ isDocsSkillRequest,
22
+ renderDocsAgentsDocument,
23
+ renderDocsLlmsTxt,
24
+ renderDocsMarkdownDocument,
25
+ renderDocsRobotsTxt,
26
+ renderDocsSitemapMarkdown,
27
+ renderDocsSitemapXml,
28
+ renderDocsSkillDocument,
29
+ resolveDocsLlmsTxtFormat,
30
+ resolveDocsRobotsRequest,
31
+ resolveDocsSitemapRequest
32
+ } from "@farming-labs/docs";
33
+ import { marked, Renderer } from "marked";
34
+ import { highlight } from "sugar-high";
35
+
36
+ // src/docs/last-modified.ts
37
+ import { execFileSync } from "child_process";
38
+ import { existsSync, readFileSync, readdirSync, realpathSync, statSync } from "fs";
39
+ import path from "path";
40
+ var FARM_DOCS_LAST_MODIFIED_MANIFEST = ".farm-docs-last-modified.json";
41
+ var COMMIT_MARKER = "__FARM_DOCS_COMMIT__";
42
+ var DOCS_FILE_EXTENSIONS = /* @__PURE__ */ new Set([".md", ".mdx"]);
43
+ var manifestCache = /* @__PURE__ */ new Map();
44
+ function normalizeRelativePath(value) {
45
+ return value.replace(/\\/g, "/").replace(/^\.\/+/, "");
46
+ }
47
+ __name(normalizeRelativePath, "normalizeRelativePath");
48
+ function resolveExistingPath(filePath) {
49
+ try {
50
+ return realpathSync(filePath);
51
+ } catch {
52
+ return path.resolve(filePath);
53
+ }
54
+ }
55
+ __name(resolveExistingPath, "resolveExistingPath");
56
+ function isDocsSourceFile(filePath) {
57
+ return DOCS_FILE_EXTENSIONS.has(path.extname(filePath).toLowerCase());
58
+ }
59
+ __name(isDocsSourceFile, "isDocsSourceFile");
60
+ function discoverDocsSourceFiles(contentDir) {
61
+ const files = [];
62
+ const visit = /* @__PURE__ */ __name((dir) => {
63
+ for (const entry of readdirSync(dir, { withFileTypes: true }).sort(
64
+ (a, b) => a.name.localeCompare(b.name)
65
+ )) {
66
+ if (entry.name.startsWith(".") || entry.name === "node_modules") continue;
67
+ const absolutePath = path.join(dir, entry.name);
68
+ if (entry.isDirectory()) {
69
+ visit(absolutePath);
70
+ } else if (entry.isFile() && isDocsSourceFile(absolutePath)) {
71
+ files.push(absolutePath);
72
+ }
73
+ }
74
+ }, "visit");
75
+ if (existsSync(contentDir)) visit(contentDir);
76
+ return files;
77
+ }
78
+ __name(discoverDocsSourceFiles, "discoverDocsSourceFiles");
79
+ function getGitLastModifiedDates(contentDir) {
80
+ try {
81
+ const gitRoot = execFileSync("git", ["-C", contentDir, "rev-parse", "--show-toplevel"], {
82
+ encoding: "utf8",
83
+ stdio: ["ignore", "pipe", "ignore"]
84
+ }).trim();
85
+ if (!gitRoot) return {};
86
+ const contentPathspec = normalizeRelativePath(path.relative(gitRoot, contentDir)) || ".";
87
+ const contentPrefix = contentPathspec === "." ? "" : `${contentPathspec}/`;
88
+ const history = execFileSync(
89
+ "git",
90
+ [
91
+ "-C",
92
+ gitRoot,
93
+ "-c",
94
+ "core.quotePath=false",
95
+ "log",
96
+ `--format=${COMMIT_MARKER}%cI`,
97
+ "--name-only",
98
+ "--",
99
+ contentPathspec
100
+ ],
101
+ {
102
+ encoding: "utf8",
103
+ stdio: ["ignore", "pipe", "ignore"],
104
+ maxBuffer: 32 * 1024 * 1024
105
+ }
106
+ );
107
+ const pages = {};
108
+ let commitDate;
109
+ for (const rawLine of history.split(/\r?\n/)) {
110
+ const line = normalizeRelativePath(rawLine.trim());
111
+ if (!line) continue;
112
+ if (line.startsWith(COMMIT_MARKER)) {
113
+ commitDate = line.slice(COMMIT_MARKER.length);
114
+ continue;
115
+ }
116
+ if (!commitDate || contentPrefix && !line.startsWith(contentPrefix)) continue;
117
+ const relativePath = contentPrefix ? line.slice(contentPrefix.length) : line;
118
+ if (isDocsSourceFile(relativePath) && !pages[relativePath]) {
119
+ pages[relativePath] = commitDate;
120
+ }
121
+ }
122
+ return pages;
123
+ } catch {
124
+ return {};
125
+ }
126
+ }
127
+ __name(getGitLastModifiedDates, "getGitLastModifiedDates");
128
+ function readManifest(contentDir) {
129
+ const manifestPath = path.join(contentDir, FARM_DOCS_LAST_MODIFIED_MANIFEST);
130
+ if (!existsSync(manifestPath)) return null;
131
+ try {
132
+ const parsed = JSON.parse(
133
+ readFileSync(manifestPath, "utf8")
134
+ );
135
+ if (parsed.version !== 1 || !parsed.pages || typeof parsed.pages !== "object") return null;
136
+ const pages = Object.fromEntries(
137
+ Object.entries(parsed.pages).filter(
138
+ (entry) => typeof entry[1] === "string" && entry[1].length > 0
139
+ )
140
+ );
141
+ return { version: 1, pages };
142
+ } catch {
143
+ return null;
144
+ }
145
+ }
146
+ __name(readManifest, "readManifest");
147
+ function createFarmDocsLastModifiedManifest(contentDir, options = {}) {
148
+ const resolvedContentDir = resolveExistingPath(contentDir);
149
+ const gitDates = getGitLastModifiedDates(resolvedContentDir);
150
+ const fallbackDate = (options.now ?? /* @__PURE__ */ new Date()).toISOString();
151
+ const pages = {};
152
+ for (const sourcePath of discoverDocsSourceFiles(resolvedContentDir)) {
153
+ const relativePath = normalizeRelativePath(path.relative(resolvedContentDir, sourcePath));
154
+ pages[relativePath] = gitDates[relativePath] || (options.fallback === "now" ? fallbackDate : statSync(sourcePath).mtime.toISOString());
155
+ }
156
+ return { version: 1, pages };
157
+ }
158
+ __name(createFarmDocsLastModifiedManifest, "createFarmDocsLastModifiedManifest");
159
+ function getLastModifiedManifest(contentDir) {
160
+ const resolvedContentDir = resolveExistingPath(contentDir);
161
+ const manifestPath = path.join(resolvedContentDir, FARM_DOCS_LAST_MODIFIED_MANIFEST);
162
+ const manifestStat = existsSync(manifestPath) ? statSync(manifestPath) : null;
163
+ const signature = manifestStat ? `file:${manifestStat.mtimeMs}:${manifestStat.size}` : "generated";
164
+ const cached = manifestCache.get(resolvedContentDir);
165
+ if (cached?.signature === signature) return cached.manifest;
166
+ const manifest = readManifest(resolvedContentDir) ?? createFarmDocsLastModifiedManifest(resolvedContentDir);
167
+ manifestCache.set(resolvedContentDir, { signature, manifest });
168
+ return manifest;
169
+ }
170
+ __name(getLastModifiedManifest, "getLastModifiedManifest");
171
+ function resolveFarmDocsPageLastModified(contentDir, sourcePath, frontmatter) {
172
+ const configured = frontmatter.lastModified || frontmatter.lastmod || frontmatter.lastUpdated || frontmatter.updatedAt;
173
+ if (configured) return configured;
174
+ const resolvedContentDir = resolveExistingPath(contentDir);
175
+ const resolvedSourcePath = resolveExistingPath(sourcePath);
176
+ const relativePath = normalizeRelativePath(path.relative(resolvedContentDir, resolvedSourcePath));
177
+ const isInsideContentDir = relativePath !== ".." && !relativePath.startsWith("../") && !path.isAbsolute(relativePath);
178
+ if (isInsideContentDir) {
179
+ const generated = getLastModifiedManifest(resolvedContentDir).pages[relativePath];
180
+ if (generated) return generated;
181
+ }
182
+ return statSync(resolvedSourcePath).mtime.toISOString();
183
+ }
184
+ __name(resolveFarmDocsPageLastModified, "resolveFarmDocsPageLastModified");
185
+
186
+ // src/docs/pixel-border-css.ts
187
+ var farmDocsPixelBorderCss = String.raw`
188
+ /* Farm docs pixel-border bridge.
189
+ * This follows the local @farming-labs/docs pixel-border theme while covering
190
+ * the frameworkless HTML emitted by the Farm docs runtime.
191
+ */
192
+
193
+ :root {
194
+ --color-fd-background: #000;
195
+ --color-fd-foreground: oklch(0.985 0.001 106.423);
196
+ --color-fd-card: hsl(0 0% 4%);
197
+ --color-fd-card-foreground: oklch(0.985 0.001 106.423);
198
+ --color-fd-popover: hsl(0 0% 4%);
199
+ --color-fd-popover-foreground: oklch(0.985 0.001 106.423);
200
+ --color-fd-primary: oklch(0.985 0.001 106.423);
201
+ --color-fd-primary-foreground: oklch(0.216 0.006 56.043);
202
+ --color-fd-secondary: hsl(0 0% 8%);
203
+ --color-fd-secondary-foreground: oklch(0.985 0.001 106.423);
204
+ --color-fd-muted: hsl(0 0% 10%);
205
+ --color-fd-muted-foreground: hsl(0 0% 55%);
206
+ --color-fd-accent: hsl(0 0% 10%);
207
+ --color-fd-accent-foreground: oklch(0.985 0.001 106.423);
208
+ --color-fd-border: hsl(0 0% 15%);
209
+ --color-fd-ring: hsl(0 0% 30%);
210
+ --fd-pixel-modal-border: color-mix(
211
+ in srgb,
212
+ var(--color-fd-foreground) 10%,
213
+ transparent
214
+ );
215
+ --fd-pixel-modal-shadow: color-mix(
216
+ in srgb,
217
+ var(--color-fd-foreground) 8%,
218
+ transparent
219
+ );
220
+ --fd-nav-height: 44px;
221
+ --fd-banner-height: 0px;
222
+ --fd-tocnav-height: 0px;
223
+ --scrollbar-thumb: var(--color-fd-border);
224
+ --scrollbar-thumb-hover: var(--color-fd-ring);
225
+ --scrollbar-track: transparent;
226
+ --radius: 0px;
227
+ --font-geist-sans: "Geist Sans";
228
+ --font-geist-mono: "Geist Mono";
229
+ }
230
+
231
+ .dark {
232
+ --color-fd-background: #000 !important;
233
+ }
234
+
235
+ html,
236
+ body,
237
+ #nd-docs-layout {
238
+ background-color: var(--color-fd-background) !important;
239
+ }
240
+
241
+ @font-face {
242
+ font-family: "Geist Sans";
243
+ font-display: block;
244
+ font-style: normal;
245
+ font-weight: 100 900;
246
+ src:
247
+ local("Geist Sans"),
248
+ url("/assets/Geist-Variable-CrgPqtmy.woff2") format("woff2"),
249
+ url("/node_modules/geist/dist/fonts/geist-sans/Geist-Variable.woff2") format("woff2");
250
+ }
251
+
252
+ @font-face {
253
+ font-family: "Geist Mono";
254
+ font-display: block;
255
+ font-style: normal;
256
+ font-weight: 100 900;
257
+ src:
258
+ local("Geist Mono"),
259
+ url("/assets/GeistMono-Variable-BNLlm6Cd.woff2") format("woff2"),
260
+ url("/node_modules/geist/dist/fonts/geist-mono/GeistMono-Variable.woff2") format("woff2");
261
+ }
262
+
263
+ * {
264
+ scrollbar-color: var(--scrollbar-thumb) var(--scrollbar-track);
265
+ scrollbar-width: thin;
266
+ }
267
+
268
+ html {
269
+ scroll-padding-top: calc(
270
+ var(--fd-nav-height, 56px) + var(--fd-banner-height, 0px) + var(--fd-tocnav-height, 0px) + 24px
271
+ );
272
+ }
273
+
274
+ body {
275
+ overscroll-behavior: none;
276
+ }
277
+
278
+ html[data-farm-docs-sidebar="open"],
279
+ html[data-farm-docs-sidebar="open"] body {
280
+ overflow: hidden;
281
+ }
282
+
283
+ code:not(pre code) {
284
+ overflow-wrap: break-word;
285
+ word-break: break-word;
286
+ }
287
+
288
+ #nd-docs-layout,
289
+ #nd-docs-layout * {
290
+ border-radius: 0 !important;
291
+ }
292
+
293
+ .topbar {
294
+ grid-column: 2 / -1;
295
+ width: 100%;
296
+ }
297
+
298
+ .topbar-actions,
299
+ .mobile-topbar-actions {
300
+ display: flex;
301
+ height: 100%;
302
+ min-width: 0;
303
+ align-items: stretch;
304
+ margin-left: auto;
305
+ }
306
+
307
+ .mobile-topbar {
308
+ display: none;
309
+ }
310
+
311
+ .sidebar-backdrop {
312
+ display: none;
313
+ }
314
+
315
+ .fd-mobile-nav-btn {
316
+ display: inline-flex;
317
+ width: var(--fd-mobile-nav-height, 56px);
318
+ height: 100%;
319
+ flex: 0 0 var(--fd-mobile-nav-height, 56px);
320
+ align-items: center;
321
+ justify-content: center;
322
+ border: 0;
323
+ border-right: 1px solid var(--color-fd-border);
324
+ background: transparent;
325
+ color: var(--color-fd-foreground);
326
+ cursor: pointer;
327
+ padding: 0;
328
+ }
329
+
330
+ .fd-mobile-nav-btn svg {
331
+ width: 19px;
332
+ height: 19px;
333
+ fill: none;
334
+ stroke: currentColor;
335
+ stroke-linecap: round;
336
+ stroke-linejoin: round;
337
+ stroke-width: 2;
338
+ }
339
+
340
+ .mobile-topbar-link {
341
+ display: inline-flex;
342
+ height: 100%;
343
+ min-width: 0;
344
+ align-items: center;
345
+ color: var(--color-fd-muted-foreground);
346
+ font-family: var(--fd-docs-font-mono);
347
+ font-size: 12px;
348
+ letter-spacing: 0.03em;
349
+ text-decoration: none;
350
+ text-transform: uppercase;
351
+ }
352
+
353
+ .mobile-topbar-link {
354
+ border-left: 1px solid var(--color-fd-border);
355
+ padding: 0 14px;
356
+ }
357
+
358
+ .sidebar-brand {
359
+ justify-content: flex-start;
360
+ }
361
+
362
+ .sidebar-brand > a {
363
+ display: inline-flex;
364
+ min-width: 0;
365
+ align-items: center;
366
+ gap: 8px;
367
+ overflow: hidden;
368
+ flex: 0 0 auto;
369
+ text-overflow: ellipsis;
370
+ white-space: nowrap;
371
+ }
372
+
373
+ .sidebar-brand-logo {
374
+ width: 16px;
375
+ height: 16px;
376
+ flex: 0 0 16px;
377
+ color: var(--color-fd-foreground);
378
+ }
379
+
380
+ .sidebar-brand-title {
381
+ min-width: 0;
382
+ overflow: hidden;
383
+ text-overflow: ellipsis;
384
+ white-space: nowrap;
385
+ }
386
+
387
+ .sidebar-brand-suffix {
388
+ opacity: 0.52;
389
+ }
390
+
391
+ .sidebar-brand > span {
392
+ flex: 0 0 auto;
393
+ margin-left: auto;
394
+ }
395
+
396
+ .fd-docs-search-trigger {
397
+ display: inline-flex;
398
+ width: auto;
399
+ min-width: 46px;
400
+ height: 26px;
401
+ flex: 1 1 auto;
402
+ align-items: center;
403
+ justify-content: center;
404
+ gap: 6px;
405
+ overflow: hidden;
406
+ border: 1px solid var(--color-fd-border);
407
+ background: color-mix(in srgb, var(--color-fd-foreground) 4%, transparent);
408
+ color: var(--color-fd-muted-foreground);
409
+ cursor: pointer;
410
+ padding: 0 5px 0 7px;
411
+ font-family: var(--fd-docs-font-mono);
412
+ font-size: 10px;
413
+ letter-spacing: 0;
414
+ line-height: 1;
415
+ text-transform: uppercase;
416
+ transition:
417
+ border-color 150ms ease,
418
+ background-color 150ms ease,
419
+ color 150ms ease;
420
+ appearance: none;
421
+ }
422
+
423
+ .fd-docs-search-trigger:hover,
424
+ .fd-docs-search-trigger:focus-visible,
425
+ .fd-docs-search-trigger[aria-expanded="true"] {
426
+ border-color: color-mix(in srgb, var(--color-fd-foreground) 28%, transparent);
427
+ background: color-mix(in srgb, var(--color-fd-foreground) 8%, transparent);
428
+ color: var(--color-fd-foreground);
429
+ }
430
+
431
+ .fd-docs-search-trigger:focus-visible {
432
+ outline: 1px solid var(--color-fd-foreground);
433
+ outline-offset: 2px;
434
+ }
435
+
436
+ .fd-docs-search-trigger svg {
437
+ width: 13px;
438
+ height: 13px;
439
+ flex: 0 0 13px;
440
+ fill: none;
441
+ stroke: currentColor;
442
+ stroke-linecap: round;
443
+ stroke-linejoin: round;
444
+ stroke-width: 1.8;
445
+ }
446
+
447
+ .fd-docs-search-trigger kbd {
448
+ display: inline-flex;
449
+ min-width: 24px;
450
+ min-height: 16px;
451
+ flex: 0 0 auto;
452
+ align-items: center;
453
+ justify-content: center;
454
+ gap: 2px;
455
+ border: 1px solid var(--color-fd-border);
456
+ background: var(--color-fd-background);
457
+ padding: 1px 4px;
458
+ color: currentColor;
459
+ font-family: inherit;
460
+ font-size: 9px;
461
+ font-weight: 500;
462
+ letter-spacing: 0;
463
+ line-height: 1;
464
+ }
465
+
466
+ .topbar-actions .fd-docs-search-trigger,
467
+ .mobile-topbar-actions .fd-docs-search-trigger {
468
+ width: auto;
469
+ min-width: 54px;
470
+ height: 100%;
471
+ flex: 0 0 auto;
472
+ border: 0;
473
+ border-left: 1px solid var(--color-fd-border);
474
+ background: transparent;
475
+ padding: 0 12px;
476
+ }
477
+
478
+ .topbar-actions .fd-docs-search-trigger:hover,
479
+ .topbar-actions .fd-docs-search-trigger:focus-visible,
480
+ .mobile-topbar-actions .fd-docs-search-trigger:hover,
481
+ .mobile-topbar-actions .fd-docs-search-trigger:focus-visible {
482
+ background: color-mix(in srgb, var(--color-fd-foreground) 6%, transparent);
483
+ }
484
+
485
+ .fd-toc {
486
+ position: sticky;
487
+ top: var(--fd-docs-row-1);
488
+ grid-area: toc;
489
+ display: flex;
490
+ flex-direction: column;
491
+ width: var(--fd-toc-width);
492
+ height: calc(var(--fd-docs-height) - var(--fd-docs-row-1));
493
+ padding: 3rem 1rem 0.5rem 0;
494
+ }
495
+
496
+ .fd-toc-inner {
497
+ min-width: 0;
498
+ }
499
+
500
+ .fd-toc-title {
501
+ display: inline-flex;
502
+ align-items: center;
503
+ margin: 0 0 1rem;
504
+ color: var(--color-fd-muted-foreground);
505
+ gap: 0.375rem;
506
+ font-size: 0.875rem;
507
+ font-weight: 400;
508
+ line-height: 1.4;
509
+ }
510
+
511
+ .fd-toc-title svg {
512
+ width: 1rem;
513
+ height: 1rem;
514
+ }
515
+
516
+ .toc-scroll {
517
+ overflow: auto;
518
+ min-height: 0;
519
+ padding: 0.75rem 0;
520
+ scrollbar-width: none;
521
+ }
522
+
523
+ .toc-track {
524
+ position: relative;
525
+ }
526
+
527
+ .toc-thumb {
528
+ position: absolute;
529
+ inset-block: 0;
530
+ inset-inline-start: 0;
531
+ width: 1px;
532
+ background: var(--color-fd-primary);
533
+ transition: clip-path 150ms ease;
534
+ }
535
+
536
+ .toc-links {
537
+ display: flex;
538
+ flex-direction: column;
539
+ border-inline-start: 1px solid color-mix(in srgb, var(--color-fd-foreground) 10%, transparent);
540
+ }
541
+
542
+ .toc-link {
543
+ display: block;
544
+ padding: 0.375rem 0 0.375rem 0.75rem;
545
+ color: var(--color-fd-muted-foreground);
546
+ font-size: 0.875rem;
547
+ line-height: 1.45;
548
+ text-decoration: none;
549
+ overflow-wrap: anywhere;
550
+ transition: color 150ms ease;
551
+ }
552
+
553
+ .toc-link:first-child {
554
+ padding-top: 0;
555
+ }
556
+
557
+ .toc-link:last-child {
558
+ padding-bottom: 0;
559
+ }
560
+
561
+ .toc-link[data-depth="3"] {
562
+ padding-left: 1.5rem;
563
+ font-size: 0.8125rem;
564
+ }
565
+
566
+ .toc-link[data-depth="4"],
567
+ .toc-link[data-depth="5"],
568
+ .toc-link[data-depth="6"] {
569
+ padding-left: 2rem;
570
+ font-size: 0.8125rem;
571
+ }
572
+
573
+ .toc-link[data-active="true"] {
574
+ color: var(--color-fd-primary);
575
+ }
576
+
577
+ .toc-link:hover {
578
+ color: var(--color-fd-accent-foreground);
579
+ }
580
+
581
+ .toc-empty {
582
+ margin: 0;
583
+ color: var(--color-fd-muted-foreground);
584
+ font-size: 0.875rem;
585
+ }
586
+
587
+ .code-block {
588
+ --fd-code-header-bg: color-mix(
589
+ in srgb,
590
+ var(--color-fd-foreground) 5%,
591
+ var(--color-fd-background)
592
+ );
593
+ --fd-code-body-bg: color-mix(in srgb, var(--color-fd-foreground) 8%, var(--color-fd-background));
594
+ width: 100%;
595
+ min-width: 0;
596
+ max-width: 100%;
597
+ border: 1px solid var(--color-fd-border) !important;
598
+ background: var(--fd-code-body-bg);
599
+ box-shadow: 3px 3px 0 0 var(--color-fd-border) !important;
600
+ }
601
+
602
+ .code-block-header {
603
+ min-height: 34px;
604
+ padding: 4px 8px 4px 10px;
605
+ }
606
+
607
+ .code-block-title {
608
+ font-size: 10px;
609
+ line-height: 1.2;
610
+ text-transform: lowercase;
611
+ }
612
+
613
+ .code-block pre {
614
+ margin: 0;
615
+ max-width: 100%;
616
+ background: var(--fd-code-body-bg);
617
+ }
618
+
619
+ .code-block code {
620
+ border: 0 !important;
621
+ background: transparent !important;
622
+ padding: 0 !important;
623
+ }
624
+
625
+ .fd-breadcrumb {
626
+ display: flex;
627
+ min-width: 0;
628
+ align-items: center;
629
+ gap: 0;
630
+ margin: 0 0 0.5rem;
631
+ color: var(--color-fd-muted-foreground);
632
+ font-family: var(--fd-font-mono, var(--font-geist-mono, ui-monospace, monospace));
633
+ font-size: 0.75rem;
634
+ letter-spacing: 0.01em;
635
+ line-height: 1.4;
636
+ text-transform: uppercase;
637
+ }
638
+
639
+ .fd-breadcrumb-item {
640
+ display: inline-flex;
641
+ min-width: 0;
642
+ align-items: center;
643
+ }
644
+
645
+ .fd-breadcrumb-link {
646
+ color: inherit;
647
+ font-family: var(--fd-font-mono, var(--font-geist-mono, ui-monospace, monospace));
648
+ text-decoration: none;
649
+ }
650
+
651
+ .fd-breadcrumb-link:hover {
652
+ color: var(--color-fd-foreground);
653
+ }
654
+
655
+ .fd-breadcrumb-parent {
656
+ opacity: 0.6;
657
+ font-weight: 400;
658
+ }
659
+
660
+ .fd-breadcrumb-sep {
661
+ margin: 0 0.375rem;
662
+ opacity: 0.4;
663
+ font-size: 0.75rem;
664
+ }
665
+
666
+ .fd-breadcrumb-current {
667
+ color: var(--color-fd-foreground);
668
+ font-family: var(--fd-font-mono, var(--font-geist-mono, ui-monospace, monospace));
669
+ font-weight: 500;
670
+ }
671
+
672
+ .fd-last-updated-inline,
673
+ .fd-last-updated-footer {
674
+ color: var(--color-fd-muted-foreground);
675
+ font-family: var(--fd-docs-font-mono);
676
+ font-size: 0.6875rem;
677
+ line-height: 1.5;
678
+ letter-spacing: 0.04em;
679
+ text-transform: uppercase;
680
+ }
681
+
682
+ .fd-page-action-btn {
683
+ border-radius: 0 !important;
684
+ box-shadow: 2px 2px 0 0 var(--color-fd-border);
685
+ font-family: var(--fd-docs-font-mono) !important;
686
+ font-size: 0.75rem;
687
+ letter-spacing: 0.03em;
688
+ text-transform: uppercase;
689
+ }
690
+
691
+ .fd-page-action-btn .fd-page-action-check-icon {
692
+ display: none;
693
+ }
694
+
695
+ .fd-page-action-btn[data-copied="true"] .fd-page-action-copy-icon {
696
+ display: none;
697
+ }
698
+
699
+ .fd-page-action-btn[data-copied="true"] .fd-page-action-check-icon {
700
+ display: block;
701
+ }
702
+
703
+ @media (max-width: 1020px) {
704
+ :root {
705
+ --fd-mobile-nav-height: 56px;
706
+ --fd-sidebar-edge: 20px;
707
+ --fd-sidebar-guide-x: 58px;
708
+ --fd-sidebar-link-x: 88px;
709
+ --fd-sidebar-sub-guide-x: calc(var(--fd-sidebar-link-x) + 7px);
710
+ --fd-sidebar-sub-link-x: calc(var(--fd-sidebar-sub-guide-x) + 28px);
711
+ }
712
+
713
+ html {
714
+ scroll-padding-top: calc(var(--fd-mobile-nav-height, 56px) + 24px);
715
+ }
716
+
717
+ body {
718
+ overflow-x: hidden;
719
+ }
720
+
721
+ #nd-docs-layout {
722
+ display: block !important;
723
+ min-height: 100dvh;
724
+ border-top: 0;
725
+ padding-top: var(--fd-mobile-nav-height, 56px);
726
+ }
727
+
728
+ .mobile-topbar {
729
+ position: fixed;
730
+ inset: 0 0 auto;
731
+ z-index: 80;
732
+ display: flex;
733
+ height: var(--fd-mobile-nav-height, 56px);
734
+ align-items: stretch;
735
+ border-bottom: 1px solid var(--color-fd-border);
736
+ background: color-mix(in srgb, var(--color-fd-background) 94%, transparent);
737
+ backdrop-filter: blur(12px);
738
+ }
739
+
740
+ .mobile-topbar a:hover,
741
+ .fd-mobile-nav-btn:hover {
742
+ color: var(--color-fd-foreground);
743
+ }
744
+
745
+ .topbar {
746
+ display: none !important;
747
+ }
748
+
749
+ .omni-overlay {
750
+ z-index: 100;
751
+ }
752
+
753
+ .omni-content {
754
+ z-index: 101;
755
+ }
756
+
757
+ .sidebar-backdrop {
758
+ position: fixed;
759
+ inset: 0;
760
+ z-index: 70;
761
+ display: block;
762
+ background: color-mix(in srgb, var(--color-fd-background) 72%, transparent);
763
+ opacity: 0;
764
+ pointer-events: none;
765
+ transition: opacity 180ms ease;
766
+ }
767
+
768
+ #nd-docs-layout[data-sidebar-open="true"] .sidebar-backdrop {
769
+ opacity: 1;
770
+ pointer-events: auto;
771
+ }
772
+
773
+ aside#nd-sidebar {
774
+ position: fixed;
775
+ inset: 0 auto 0 0;
776
+ z-index: 90;
777
+ width: min(342px, calc(100vw - 42px));
778
+ height: 100dvh;
779
+ max-height: none;
780
+ overflow-y: auto;
781
+ overscroll-behavior: contain;
782
+ border-right: 1px solid var(--color-fd-border);
783
+ border-bottom: 0;
784
+ transform: translate3d(-100%, 0, 0);
785
+ transition: transform 180ms ease;
786
+ will-change: transform;
787
+ }
788
+
789
+ #nd-docs-layout[data-sidebar-open="true"] aside#nd-sidebar {
790
+ transform: translate3d(0, 0, 0);
791
+ }
792
+
793
+ main {
794
+ padding: 34px 20px 64px;
795
+ }
796
+
797
+ article#nd-page {
798
+ width: 100%;
799
+ margin: 0;
800
+ }
801
+
802
+ #nd-docs-layout .fd-toc {
803
+ display: none !important;
804
+ }
805
+
806
+ .prose h1 {
807
+ font-size: 32px;
808
+ letter-spacing: 0;
809
+ line-height: 1.16;
810
+ }
811
+
812
+ .code-block {
813
+ margin: 16px 0;
814
+ box-shadow: 2px 2px 0 0 var(--color-fd-border) !important;
815
+ }
816
+
817
+ .code-block-header {
818
+ min-height: 32px;
819
+ padding: 3px 7px 3px 9px;
820
+ }
821
+
822
+ .code-copy-floating {
823
+ top: 6px;
824
+ right: 6px;
825
+ }
826
+
827
+ #nd-docs-layout figure.shiki.code-block pre,
828
+ .code-block pre {
829
+ padding: 12px 11px !important;
830
+ font-size: 12px;
831
+ line-height: 1.5;
832
+ }
833
+
834
+ .sh__line {
835
+ min-height: 1.5em;
836
+ }
837
+
838
+ .fd-page-nav {
839
+ grid-template-columns: 1fr !important;
840
+ }
841
+
842
+ .fd-page-nav-next {
843
+ align-items: flex-start;
844
+ text-align: left;
845
+ }
846
+
847
+ .mobile-topbar-actions .fd-docs-search-trigger {
848
+ min-width: 44px;
849
+ padding: 0 14px;
850
+ }
851
+
852
+ .mobile-topbar-actions .fd-docs-search-trigger kbd {
853
+ display: none;
854
+ }
855
+ }
856
+
857
+ @media (max-width: 640px) {
858
+ .code-block-header {
859
+ min-height: 30px;
860
+ padding: 3px 6px 3px 8px;
861
+ }
862
+
863
+ .code-copy-floating {
864
+ top: 7px;
865
+ right: 7px;
866
+ }
867
+
868
+ #nd-docs-layout figure.shiki.code-block pre,
869
+ .code-block pre {
870
+ padding: 12px !important;
871
+ font-size: 12px;
872
+ line-height: 1.6;
873
+ }
874
+
875
+ #nd-docs-layout figure.shiki.code-block-plain pre,
876
+ .code-block-plain pre {
877
+ padding: 16px 44px 16px 14px !important;
878
+ line-height: 1.65;
879
+ }
880
+
881
+ .sh__line {
882
+ min-height: 1.6em;
883
+ }
884
+ }
885
+
886
+ /* Search styling mirrors @farming-labs/theme's shared Omni palette so Farm
887
+ * matches the Next.js and other framework adapters pixel-for-pixel. The CSS
888
+ * stays bundled because production adapters cannot resolve theme files from
889
+ * node_modules at request time. */
890
+ /* ═══════════════════════════════════════════════════════════════════
891
+ * Omni Command Palette — core styles
892
+ * Uses fumadocs CSS variables so it auto-adapts to every theme.
893
+ * ═══════════════════════════════════════════════════════════════════ */
894
+
895
+ @keyframes omni-fade-in {
896
+ from {
897
+ opacity: 0;
898
+ }
899
+ to {
900
+ opacity: 1;
901
+ }
902
+ }
903
+ @keyframes omni-fade-out {
904
+ from {
905
+ opacity: 1;
906
+ }
907
+ to {
908
+ opacity: 0;
909
+ }
910
+ }
911
+ @keyframes omni-scale-in {
912
+ from {
913
+ opacity: 0;
914
+ transform: translateX(-50%) scale(0.98) translateY(-6px);
915
+ }
916
+ to {
917
+ opacity: 1;
918
+ transform: translateX(-50%) scale(1) translateY(0);
919
+ }
920
+ }
921
+ @keyframes omni-scale-out {
922
+ from {
923
+ opacity: 1;
924
+ transform: translateX(-50%) scale(1) translateY(0);
925
+ }
926
+ to {
927
+ opacity: 0;
928
+ transform: translateX(-50%) scale(0.98) translateY(-6px);
929
+ }
930
+ }
931
+
932
+ @keyframes omni-spin {
933
+ from {
934
+ transform: rotate(0deg);
935
+ }
936
+ to {
937
+ transform: rotate(360deg);
938
+ }
939
+ }
940
+
941
+ .omni-spin {
942
+ animation: omni-spin 1s linear infinite;
943
+ }
944
+
945
+ .omni-overlay {
946
+ position: fixed;
947
+ inset: 0;
948
+ z-index: 50;
949
+ background: rgba(0, 0, 0, 0.2);
950
+ backdrop-filter: blur(2px);
951
+ animation: omni-fade-in 150ms ease-out;
952
+ }
953
+
954
+ .omni-content {
955
+ --omni-content-top: clamp(5rem, 16vh, 7rem);
956
+ position: fixed;
957
+ z-index: 51;
958
+ top: var(--omni-content-top);
959
+ left: 50%;
960
+ transform: translateX(-50%);
961
+ display: flex;
962
+ flex-direction: column;
963
+ width: min(720px, calc(100% - 1rem));
964
+ border-radius: 0.75rem;
965
+ border: 1px solid color-mix(in srgb, var(--color-fd-border, #d4d4d4) 70%, transparent);
966
+ background: var(--color-fd-popover, #fafafa);
967
+ color: var(--color-fd-popover-foreground, var(--color-fd-foreground, #272727));
968
+ font-family: var(--font-sans, system-ui, -apple-system, BlinkMacSystemFont, "SF Pro Text",
969
+ ui-sans-serif, sans-serif);
970
+ box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.5);
971
+ outline: none;
972
+ overscroll-behavior: contain;
973
+ animation: omni-scale-in 200ms cubic-bezier(0.16, 1, 0.3, 1);
974
+ }
975
+
976
+ @media (max-width: 639px) {
977
+ .omni-content {
978
+ --omni-content-top: 1rem;
979
+ top: var(--omni-content-top);
980
+ width: calc(100% - 1rem);
981
+ max-height: calc(100vh - 2rem);
982
+ }
983
+ }
984
+
985
+ /* Header */
986
+ .omni-header {
987
+ border-bottom: 1px solid var(--color-fd-border, #262626);
988
+ }
989
+ .omni-search-row {
990
+ display: flex;
991
+ align-items: center;
992
+ gap: 0.5rem;
993
+ padding: 0.75rem;
994
+ }
995
+ .omni-search-icon {
996
+ color: var(--color-fd-muted-foreground, #a3a3a3);
997
+ flex-shrink: 0;
998
+ }
999
+ .omni-search-icon svg {
1000
+ width: 1.25rem;
1001
+ height: 1.25rem;
1002
+ }
1003
+ .omni-search-input {
1004
+ width: 0;
1005
+ flex: 1;
1006
+ background: transparent;
1007
+ outline: none;
1008
+ font-size: 1.125rem;
1009
+ line-height: 1.75rem;
1010
+ color: var(--color-fd-popover-foreground, var(--color-fd-foreground, #272727));
1011
+ border: none;
1012
+ }
1013
+ .omni-search-input::placeholder {
1014
+ color: var(--color-fd-muted-foreground, #a3a3a3);
1015
+ }
1016
+ .omni-kbd {
1017
+ border-radius: 0.375rem;
1018
+ border: 1px solid var(--color-fd-border, #d4d4d4);
1019
+ background: transparent;
1020
+ padding: 0.375rem 0.5rem;
1021
+ font-size: 0.75rem;
1022
+ color: var(--color-fd-muted-foreground, #a3a3a3);
1023
+ font-family: var(--font-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
1024
+ "Liberation Mono", "Courier New", monospace);
1025
+ line-height: 1rem;
1026
+ }
1027
+ .omni-close-btn {
1028
+ display: inline-flex;
1029
+ align-items: center;
1030
+ justify-content: center;
1031
+ gap: 0.25rem;
1032
+ min-width: 2.5rem;
1033
+ border-radius: 0.375rem;
1034
+ border: 1px solid var(--color-fd-border, #d4d4d4);
1035
+ padding: 0.375rem 0.5rem;
1036
+ color: var(--color-fd-muted-foreground, #a3a3a3);
1037
+ font-family: var(--font-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
1038
+ "Liberation Mono", "Courier New", monospace);
1039
+ font-size: 0.75rem;
1040
+ line-height: 1rem;
1041
+ font-weight: 500;
1042
+ transition:
1043
+ background 120ms,
1044
+ color 120ms;
1045
+ cursor: pointer;
1046
+ background: none;
1047
+ }
1048
+ .omni-close-btn:hover {
1049
+ color: var(--color-fd-accent-foreground, var(--color-fd-foreground, #171717));
1050
+ background: var(--color-fd-accent, #e5e5e5);
1051
+ }
1052
+ .omni-close-btn svg {
1053
+ display: none;
1054
+ }
1055
+
1056
+ /* Body / listbox */
1057
+ .omni-body {
1058
+ flex: 1 1 auto;
1059
+ min-height: 0;
1060
+ max-height: min(540px, calc(100vh - var(--omni-content-top, 7rem) - 8rem));
1061
+ overflow: auto;
1062
+ overscroll-behavior: contain;
1063
+ padding: 0.5rem;
1064
+ }
1065
+ .omni-body::-webkit-scrollbar {
1066
+ width: 6px;
1067
+ }
1068
+ .omni-body::-webkit-scrollbar-track {
1069
+ background: transparent;
1070
+ }
1071
+ .omni-body::-webkit-scrollbar-thumb {
1072
+ background: var(--color-fd-muted, #262626);
1073
+ border-radius: 3px;
1074
+ }
1075
+
1076
+ /* Loading */
1077
+ .omni-loading {
1078
+ display: flex;
1079
+ align-items: center;
1080
+ gap: 0.5rem;
1081
+ padding: 0.75rem 0.625rem;
1082
+ color: var(--color-fd-muted-foreground, #a3a3a3);
1083
+ font-size: 0.875rem;
1084
+ }
1085
+
1086
+ /* Groups */
1087
+ .omni-group {
1088
+ padding: 0;
1089
+ }
1090
+ .omni-group-label {
1091
+ display: none;
1092
+ }
1093
+ .omni-group-items {
1094
+ display: flex;
1095
+ flex-direction: column;
1096
+ gap: 0.25rem;
1097
+ }
1098
+
1099
+ /* Items */
1100
+ .omni-item {
1101
+ position: relative;
1102
+ display: block;
1103
+ width: 100%;
1104
+ flex-shrink: 0;
1105
+ border-radius: 0.5rem;
1106
+ padding: 0.75rem 0.875rem;
1107
+ text-align: left;
1108
+ font-size: 0.875rem;
1109
+ line-height: 1.25rem;
1110
+ cursor: pointer;
1111
+ border: none;
1112
+ background: transparent;
1113
+ color: var(--color-fd-foreground, #fafafa);
1114
+ transition: background 80ms;
1115
+ }
1116
+ .omni-item:hover,
1117
+ .omni-item-active {
1118
+ background: var(--color-fd-accent, rgba(209, 209, 209, 0.5));
1119
+ }
1120
+ .omni-item-active {
1121
+ color: var(--color-fd-accent-foreground, #171717);
1122
+ }
1123
+ .omni-item-disabled {
1124
+ opacity: 0.5;
1125
+ cursor: not-allowed;
1126
+ }
1127
+
1128
+ .omni-item-icon {
1129
+ display: none;
1130
+ }
1131
+ .omni-item-active .omni-item-icon {
1132
+ color: var(--color-fd-accent-foreground, #fafafa);
1133
+ }
1134
+ .omni-item-text {
1135
+ min-width: 0;
1136
+ }
1137
+ .omni-item-label {
1138
+ min-width: 0;
1139
+ overflow: hidden;
1140
+ text-overflow: ellipsis;
1141
+ white-space: nowrap;
1142
+ color: var(--color-fd-popover-foreground, var(--color-fd-foreground, #272727));
1143
+ font-weight: 500;
1144
+ line-height: 1.35;
1145
+ }
1146
+ .omni-item-subtitle {
1147
+ min-width: 0;
1148
+ overflow: hidden;
1149
+ text-overflow: ellipsis;
1150
+ white-space: nowrap;
1151
+ font-size: 0.75rem;
1152
+ line-height: 1rem;
1153
+ color: var(--color-fd-muted-foreground, #a3a3a3);
1154
+ opacity: 1;
1155
+ }
1156
+ .omni-item-active .omni-item-subtitle {
1157
+ color: var(--color-fd-muted-foreground, #737373);
1158
+ opacity: 1;
1159
+ }
1160
+ .omni-item-description {
1161
+ min-width: 0;
1162
+ overflow: hidden;
1163
+ display: -webkit-box;
1164
+ -webkit-line-clamp: 3;
1165
+ -webkit-box-orient: vertical;
1166
+ margin-top: 0.625rem;
1167
+ padding-left: 0.75rem;
1168
+ border-left: 1px solid color-mix(in srgb, var(--color-fd-border, #d4d4d4) 70%, transparent);
1169
+ color: color-mix(in srgb, var(--color-fd-popover-foreground, #272727) 82%, transparent);
1170
+ font-size: 0.875rem;
1171
+ line-height: 1.5rem;
1172
+ font-weight: 400;
1173
+ }
1174
+ .omni-item-badge {
1175
+ display: none;
1176
+ }
1177
+ .omni-item-ext {
1178
+ display: none;
1179
+ }
1180
+ .omni-item-ext:hover {
1181
+ color: var(--color-fd-foreground, #fafafa);
1182
+ background: var(--color-fd-muted, #262626);
1183
+ }
1184
+ .omni-item-shortcuts {
1185
+ display: none;
1186
+ align-items: center;
1187
+ gap: 0.25rem;
1188
+ font-size: 10px;
1189
+ color: var(--color-fd-muted-foreground, #a3a3a3);
1190
+ }
1191
+ @media (min-width: 640px) {
1192
+ .omni-item-shortcuts {
1193
+ display: flex;
1194
+ }
1195
+ }
1196
+ .omni-kbd-sm {
1197
+ border-radius: 0.25rem;
1198
+ background: var(--color-fd-muted, #262626);
1199
+ padding: 0.125rem 0.25rem;
1200
+ font-family: var(--font-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
1201
+ "Liberation Mono", "Courier New", monospace);
1202
+ }
1203
+ .omni-item-chevron {
1204
+ display: none;
1205
+ }
1206
+ /* Highlight */
1207
+ .omni-highlight {
1208
+ border-radius: 0;
1209
+ background: transparent;
1210
+ padding: 0;
1211
+ color: var(--color-fd-primary, #ca8a04);
1212
+ text-decoration: underline;
1213
+ text-underline-offset: 2px;
1214
+ }
1215
+
1216
+ /* Empty states */
1217
+ .omni-empty-group {
1218
+ padding: 0.5rem 0.75rem;
1219
+ font-size: 0.75rem;
1220
+ color: var(--color-fd-muted-foreground, #a3a3a3);
1221
+ }
1222
+ .omni-empty {
1223
+ padding: 1.5rem 0.75rem;
1224
+ text-align: center;
1225
+ font-size: 0.875rem;
1226
+ color: var(--color-fd-muted-foreground, #a3a3a3);
1227
+ }
1228
+ .omni-empty-icon {
1229
+ width: 2rem;
1230
+ height: 2rem;
1231
+ margin: 0 auto 0.5rem;
1232
+ display: flex;
1233
+ align-items: center;
1234
+ justify-content: center;
1235
+ border-radius: 9999px;
1236
+ background: var(--color-fd-muted, #262626);
1237
+ }
1238
+
1239
+ /* Footer */
1240
+ .omni-footer {
1241
+ border-top: 1px solid var(--color-fd-border, #262626);
1242
+ background: color-mix(in srgb, var(--color-fd-secondary, #f5f5f5) 50%, transparent);
1243
+ }
1244
+ .omni-footer-inner {
1245
+ display: flex;
1246
+ align-items: center;
1247
+ justify-content: space-between;
1248
+ gap: 0.75rem;
1249
+ padding: 0.625rem 0.75rem;
1250
+ font-size: 0.75rem;
1251
+ color: var(--color-fd-muted-foreground, #a3a3a3);
1252
+ }
1253
+ .omni-footer-hints {
1254
+ display: flex;
1255
+ align-items: center;
1256
+ flex-wrap: wrap;
1257
+ gap: 0.75rem;
1258
+ }
1259
+ .omni-footer-hint {
1260
+ display: flex;
1261
+ align-items: center;
1262
+ gap: 0.25rem;
1263
+ white-space: nowrap;
1264
+ }
1265
+ .omni-footer-hint svg {
1266
+ box-sizing: border-box;
1267
+ width: 1.375rem;
1268
+ height: 1.375rem;
1269
+ padding: 0.25rem;
1270
+ border-radius: 0.375rem;
1271
+ border: 1px solid var(--color-fd-border, #d4d4d4);
1272
+ background: color-mix(in srgb, var(--color-fd-muted, #e5e5e5) 70%, transparent);
1273
+ color: var(--color-fd-muted-foreground, #737373);
1274
+ flex-shrink: 0;
1275
+ }
1276
+ .omni-footer-hint-desktop {
1277
+ display: none;
1278
+ }
1279
+ .omni-footer-filter {
1280
+ position: relative;
1281
+ display: inline-flex;
1282
+ align-items: center;
1283
+ gap: 0.5rem;
1284
+ margin-left: auto;
1285
+ white-space: nowrap;
1286
+ }
1287
+ @media (min-width: 640px) {
1288
+ .omni-footer-hint-desktop {
1289
+ display: flex;
1290
+ }
1291
+ }
1292
+ .omni-filter-label {
1293
+ color: var(--color-fd-muted-foreground, #a3a3a3);
1294
+ }
1295
+ .omni-filter-value {
1296
+ display: inline-flex;
1297
+ align-items: center;
1298
+ gap: 0.25rem;
1299
+ color: var(--color-fd-popover-foreground, var(--color-fd-foreground, #272727));
1300
+ }
1301
+ .omni-filter-button {
1302
+ display: inline-flex;
1303
+ align-items: center;
1304
+ gap: 0.25rem;
1305
+ border: 0;
1306
+ background: transparent;
1307
+ color: var(--color-fd-popover-foreground, var(--color-fd-foreground, #272727));
1308
+ font: inherit;
1309
+ cursor: pointer;
1310
+ padding: 0;
1311
+ }
1312
+ .omni-filter-button:hover {
1313
+ color: var(--color-fd-accent-foreground, var(--color-fd-foreground, #171717));
1314
+ }
1315
+ .omni-filter-menu {
1316
+ position: absolute;
1317
+ right: 0;
1318
+ bottom: calc(100% + 0.5rem);
1319
+ z-index: 1;
1320
+ width: 10rem;
1321
+ border: 1px solid var(--color-fd-border, #d4d4d4);
1322
+ border-radius: 0.5rem;
1323
+ background: var(--color-fd-popover, #fafafa);
1324
+ padding: 0.25rem;
1325
+ box-shadow: 0 16px 32px -20px rgba(0, 0, 0, 0.45);
1326
+ }
1327
+ .omni-filter-option {
1328
+ display: flex;
1329
+ width: 100%;
1330
+ align-items: center;
1331
+ border: 0;
1332
+ border-radius: 0.375rem;
1333
+ background: transparent;
1334
+ color: var(--color-fd-popover-foreground, var(--color-fd-foreground, #272727));
1335
+ cursor: pointer;
1336
+ font: inherit;
1337
+ padding: 0.5rem 0.625rem;
1338
+ text-align: left;
1339
+ }
1340
+ .omni-filter-option:hover,
1341
+ .omni-filter-option-active {
1342
+ background: var(--color-fd-accent, rgba(209, 209, 209, 0.5));
1343
+ }
1344
+
1345
+ /* ─── Omni Command Palette (pixel-border theme) ─────────────────── */
1346
+
1347
+ .omni-content {
1348
+ border-radius: 0 !important;
1349
+ border: 1px solid var(--fd-pixel-modal-border);
1350
+ box-shadow:
1351
+ 2px 2px 0 0 var(--fd-pixel-modal-shadow),
1352
+ 0 0 0 1px color-mix(in srgb, var(--color-fd-foreground) 3%, transparent);
1353
+ }
1354
+
1355
+ .omni-item {
1356
+ border-radius: 0 !important;
1357
+ }
1358
+
1359
+ .omni-kbd,
1360
+ .omni-kbd-sm {
1361
+ border-radius: 0 !important;
1362
+ border: 1px solid var(--color-fd-border, hsl(0 0% 15%));
1363
+ }
1364
+
1365
+ .omni-close-btn {
1366
+ border-radius: 0 !important;
1367
+ }
1368
+
1369
+ .omni-empty-icon {
1370
+ border-radius: 0 !important;
1371
+ }
1372
+
1373
+ .omni-search-input {
1374
+ font-family: var(--fd-font-sans, system-ui, -apple-system, sans-serif);
1375
+ }
1376
+
1377
+ .omni-group-label {
1378
+ font-family: var(--fd-font-mono, ui-monospace, monospace);
1379
+ letter-spacing: 0.08em;
1380
+ }
1381
+
1382
+ .omni-footer-inner {
1383
+ font-family: var(--fd-font-mono, ui-monospace, monospace);
1384
+ }
1385
+
1386
+ .omni-footer-hint svg {
1387
+ border-radius: 0 !important;
1388
+ }
1389
+
1390
+ .omni-filter-menu,
1391
+ .omni-filter-option {
1392
+ border-radius: 0 !important;
1393
+ }
1394
+
1395
+ .omni-highlight {
1396
+ background: color-mix(in srgb, var(--color-fd-primary, #6366f1) 25%, transparent);
1397
+ border-radius: 0 !important;
1398
+ }
1399
+
1400
+ /* Farm's frameworkless topbar uses a compact search trigger. */
1401
+ .topbar-actions .fd-docs-search-trigger {
1402
+ width: 56px;
1403
+ min-width: 56px;
1404
+ justify-content: center;
1405
+ padding: 0 10px;
1406
+ }
1407
+
1408
+ .topbar-actions .fd-docs-search-trigger kbd {
1409
+ min-width: 36px;
1410
+ height: 19px;
1411
+ min-height: 19px;
1412
+ flex: 0 0 auto;
1413
+ gap: 4px;
1414
+ border-color: color-mix(in srgb, var(--color-fd-foreground) 14%, transparent);
1415
+ background: color-mix(in srgb, var(--color-fd-foreground) 5%, transparent);
1416
+ padding: 0 5px;
1417
+ font-size: 9px;
1418
+ }
1419
+
1420
+ /* Farm's mobile shell sits above the frameworkless docs canvas. Keep the
1421
+ * shared Omni palette above it without changing the cross-framework styling. */
1422
+ .omni-overlay {
1423
+ z-index: 100;
1424
+ }
1425
+
1426
+ .omni-content {
1427
+ z-index: 101;
1428
+ }
1429
+
1430
+ @media (max-width: 1023px) {
1431
+ .mobile-topbar-actions .fd-docs-search-trigger {
1432
+ width: 44px;
1433
+ min-width: 44px;
1434
+ justify-content: center;
1435
+ padding: 0;
1436
+ }
1437
+
1438
+ .mobile-topbar-actions .fd-docs-search-trigger kbd {
1439
+ display: none;
1440
+ }
1441
+ }
1442
+
1443
+ @media (prefers-reduced-motion: reduce) {
1444
+ .omni-overlay,
1445
+ .omni-content {
1446
+ animation: none;
1447
+ }
1448
+ }
1449
+ `;
1450
+
1451
+ // src/docs/handler.ts
1452
+ var DOCS_FILE_NAMES = ["page.mdx", "page.md", "index.mdx", "index.md"];
1453
+ var DOCS_FILE_EXTENSIONS2 = [".mdx", ".md"];
1454
+ var FARM_DOCS_FALLBACK_FAVICON = "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' fill='black'/%3E%3Cpath d='M7 8h18v3H10v5h12v3H10v5H7z' fill='white'/%3E%3C/svg%3E";
1455
+ var FARM_DOCS_FAVICON_FILES = ["favicon.svg", "favicon.ico", "favicon.png"];
1456
+ var GEIST_SANS_FONT_URL = "/assets/Geist-Variable-CrgPqtmy.woff2";
1457
+ var GEIST_MONO_FONT_URL = "/assets/GeistMono-Variable-BNLlm6Cd.woff2";
1458
+ function trimSlashes(value) {
1459
+ return value.replace(/^\/+|\/+$/g, "");
1460
+ }
1461
+ __name(trimSlashes, "trimSlashes");
1462
+ function normalizeEntry(entry) {
1463
+ if (!entry || entry === "/") return "/";
1464
+ return `/${trimSlashes(entry)}`;
1465
+ }
1466
+ __name(normalizeEntry, "normalizeEntry");
1467
+ function normalizeSlug(value) {
1468
+ return trimSlashes(decodeURIComponent(value)).replace(/\.(mdx?|markdown)$/i, "");
1469
+ }
1470
+ __name(normalizeSlug, "normalizeSlug");
1471
+ function resolveFarmDocsFavicon(docs, options) {
1472
+ const configuredFavicon = docs?.config.favicon;
1473
+ if (typeof configuredFavicon === "string" && configuredFavicon.trim()) {
1474
+ return configuredFavicon.trim();
1475
+ }
1476
+ const publicDir = path2.join(path2.resolve(options.root), "public");
1477
+ for (const fileName of FARM_DOCS_FAVICON_FILES) {
1478
+ const faviconPath = path2.join(publicDir, fileName);
1479
+ if (existsSync2(faviconPath) && statSync2(faviconPath).isFile()) {
1480
+ return `/${fileName}`;
1481
+ }
1482
+ }
1483
+ return FARM_DOCS_FALLBACK_FAVICON;
1484
+ }
1485
+ __name(resolveFarmDocsFavicon, "resolveFarmDocsFavicon");
1486
+ function renderFarmDocsFaviconLink(faviconHref) {
1487
+ const normalizedHref = faviconHref.split(/[?#]/, 1)[0]?.toLowerCase() || "";
1488
+ const type = normalizedHref.endsWith(".svg") || faviconHref.startsWith("data:image/svg+xml") ? "image/svg+xml" : normalizedHref.endsWith(".png") ? "image/png" : normalizedHref.endsWith(".ico") ? "image/x-icon" : void 0;
1489
+ const metadata = type === "image/svg+xml" ? ' sizes="any" type="image/svg+xml"' : type ? ` type="${type}"` : "";
1490
+ return `<link rel="icon" href="${escapeAttribute(faviconHref)}"${metadata}>`;
1491
+ }
1492
+ __name(renderFarmDocsFaviconLink, "renderFarmDocsFaviconLink");
1493
+ function renderFarmDocsBrandMark() {
1494
+ return `<svg class="sidebar-brand-logo" viewBox="0 0 24 24" aria-hidden="true" focusable="false">
1495
+ <rect x="2" y="2" width="5" height="5" rx="0.75" fill="currentColor"></rect>
1496
+ <path d="M9.75 2h11.5c.41 0 .75.34.75.75v3.5c0 .41-.34.75-.75.75H9.75A.75.75 0 0 1 9 6.25v-3.5c0-.41.34-.75.75-.75Zm9.75 1.62a.38.38 0 0 0-.38.38v1c0 .21.17.38.38.38h.75c.21 0 .38-.17.38-.38V4a.38.38 0 0 0-.38-.38h-.75Z" fill="currentColor"></path>
1497
+ <rect x="2" y="9.5" width="5" height="5" rx="0.75" fill="currentColor" opacity="0.64"></rect>
1498
+ <rect x="9" y="9.5" width="13" height="5" rx="0.75" fill="currentColor" opacity="0.64"></rect>
1499
+ <rect x="2" y="17" width="5" height="5" rx="0.75" fill="currentColor" opacity="0.34"></rect>
1500
+ <rect x="9" y="17" width="7.5" height="5" rx="0.75" fill="currentColor" opacity="0.34"></rect>
1501
+ </svg>`;
1502
+ }
1503
+ __name(renderFarmDocsBrandMark, "renderFarmDocsBrandMark");
1504
+ function renderFarmDocsBrandTitle(navTitle) {
1505
+ const suffix = navTitle.match(/\.js$/i)?.[0];
1506
+ if (!suffix) {
1507
+ return `<span class="sidebar-brand-title">${escapeHtml(navTitle)}</span>`;
1508
+ }
1509
+ const productName = navTitle.slice(0, -suffix.length);
1510
+ return `<span class="sidebar-brand-title">${escapeHtml(productName)}<span class="sidebar-brand-suffix">${escapeHtml(suffix)}</span></span>`;
1511
+ }
1512
+ __name(renderFarmDocsBrandTitle, "renderFarmDocsBrandTitle");
1513
+ function isSafeSegment(segment) {
1514
+ return segment !== ".." && !segment.includes("/") && !segment.includes("\\");
1515
+ }
1516
+ __name(isSafeSegment, "isSafeSegment");
1517
+ function resolveInside(root, target) {
1518
+ const resolvedRoot = path2.resolve(root);
1519
+ const resolvedTarget = path2.resolve(target);
1520
+ const relative = path2.relative(resolvedRoot, resolvedTarget);
1521
+ if (relative === "" || !relative.startsWith("..") && !path2.isAbsolute(relative)) {
1522
+ return resolvedTarget;
1523
+ }
1524
+ return null;
1525
+ }
1526
+ __name(resolveInside, "resolveInside");
1527
+ function isFarmDocsRequest(docs, request) {
1528
+ if (!docs?.enabled) return false;
1529
+ if (request.method !== "GET" && request.method !== "HEAD") return false;
1530
+ const pathname = new URL(request.url).pathname;
1531
+ const entry = normalizeEntry(docs.entry);
1532
+ if (entry === "/") return true;
1533
+ return pathname === entry || pathname === `${entry}.md` || pathname.startsWith(`${entry}/`);
1534
+ }
1535
+ __name(isFarmDocsRequest, "isFarmDocsRequest");
1536
+ function resolveFarmDocsContentDir(docs, options) {
1537
+ const root = path2.resolve(options.root);
1538
+ const srcDir = options.srcDir || "src";
1539
+ const configuredContentDir = docs.contentDir || docs.config.contentDir;
1540
+ if (configuredContentDir) {
1541
+ return path2.isAbsolute(configuredContentDir) ? configuredContentDir : path2.join(root, configuredContentDir);
1542
+ }
1543
+ const entryDir = docs.config.entry || trimSlashes(docs.entry) || "docs";
1544
+ const appDocsDir = path2.join(root, srcDir, "app", entryDir);
1545
+ if (existsSync2(appDocsDir)) return appDocsDir;
1546
+ return path2.join(root, entryDir);
1547
+ }
1548
+ __name(resolveFarmDocsContentDir, "resolveFarmDocsContentDir");
1549
+ function getFarmDocsRouteTypeEntries(docs) {
1550
+ if (!docs?.enabled) return [];
1551
+ const entry = normalizeEntry(docs.entry);
1552
+ if (entry === "/") return ["/", "/[...docs]"];
1553
+ return [entry, `${entry}/[...docs]`];
1554
+ }
1555
+ __name(getFarmDocsRouteTypeEntries, "getFarmDocsRouteTypeEntries");
1556
+ function getFarmDocsDocumentNavigationMatchers(docs) {
1557
+ if (!docs?.enabled) return [];
1558
+ const entry = normalizeEntry(docs.entry);
1559
+ return [entry === "/" ? "/(.*)" : `${entry}(.*)`];
1560
+ }
1561
+ __name(getFarmDocsDocumentNavigationMatchers, "getFarmDocsDocumentNavigationMatchers");
1562
+ function getRequestSlug(docs, request) {
1563
+ const pathname = new URL(request.url).pathname;
1564
+ const entry = normalizeEntry(docs.entry);
1565
+ if (entry === "/") return normalizeSlug(pathname);
1566
+ if (pathname === entry || pathname === `${entry}.md`) return "";
1567
+ return normalizeSlug(pathname.slice(entry.length));
1568
+ }
1569
+ __name(getRequestSlug, "getRequestSlug");
1570
+ function findDocsPageFile(contentDir, slug) {
1571
+ const segments = slug ? slug.split("/").filter(Boolean) : [];
1572
+ if (!segments.every(isSafeSegment)) return null;
1573
+ const slugDir = path2.join(contentDir, ...segments);
1574
+ const candidates = segments.length === 0 ? DOCS_FILE_NAMES.map((filename) => path2.join(contentDir, filename)) : [
1575
+ ...DOCS_FILE_NAMES.map((filename) => path2.join(slugDir, filename)),
1576
+ ...DOCS_FILE_EXTENSIONS2.map((extension) => path2.join(contentDir, `${slug}${extension}`))
1577
+ ];
1578
+ for (const candidate of candidates) {
1579
+ const safePath = resolveInside(contentDir, candidate);
1580
+ if (safePath && existsSync2(safePath) && statSync2(safePath).isFile()) {
1581
+ return safePath;
1582
+ }
1583
+ }
1584
+ return null;
1585
+ }
1586
+ __name(findDocsPageFile, "findDocsPageFile");
1587
+ function parseFrontmatter(source) {
1588
+ if (!source.startsWith("---")) {
1589
+ return { frontmatter: {}, body: source };
1590
+ }
1591
+ const endIndex = source.indexOf("\n---", 3);
1592
+ if (endIndex === -1) return { frontmatter: {}, body: source };
1593
+ const frontmatterSource = source.slice(3, endIndex).trim();
1594
+ const body = source.slice(source.indexOf("\n", endIndex + 1) + 1);
1595
+ const frontmatter = {};
1596
+ for (const line of frontmatterSource.split(/\r?\n/)) {
1597
+ const separator = line.indexOf(":");
1598
+ if (separator === -1) continue;
1599
+ const key = line.slice(0, separator).trim();
1600
+ const value = line.slice(separator + 1).trim().replace(/^["']|["']$/g, "");
1601
+ if (key && value) frontmatter[key] = value;
1602
+ }
1603
+ return { frontmatter, body };
1604
+ }
1605
+ __name(parseFrontmatter, "parseFrontmatter");
1606
+ function titleFromSlug(slug) {
1607
+ const lastSegment = slug.split("/").filter(Boolean).pop() || "Docs";
1608
+ return lastSegment.split(/[-_]/).filter(Boolean).map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join(" ");
1609
+ }
1610
+ __name(titleFromSlug, "titleFromSlug");
1611
+ function titleFromMarkdown(body, fallback) {
1612
+ const heading = body.match(/^#\s+(.+)$/m)?.[1]?.trim();
1613
+ return heading || fallback;
1614
+ }
1615
+ __name(titleFromMarkdown, "titleFromMarkdown");
1616
+ function loadFarmDocsPage(contentDir, docs, slug) {
1617
+ const sourcePath = findDocsPageFile(contentDir, slug);
1618
+ if (!sourcePath) return null;
1619
+ const source = readFileSync2(sourcePath, "utf8");
1620
+ const { frontmatter, body } = parseFrontmatter(source);
1621
+ const title = frontmatter.title || titleFromMarkdown(body, titleFromSlug(slug));
1622
+ const href = createDocsHref(docs.entry, slug);
1623
+ return {
1624
+ slug,
1625
+ title,
1626
+ description: frontmatter.description,
1627
+ href,
1628
+ sourcePath,
1629
+ lastModified: resolveFarmDocsPageLastModified(contentDir, sourcePath, frontmatter),
1630
+ frontmatter,
1631
+ body
1632
+ };
1633
+ }
1634
+ __name(loadFarmDocsPage, "loadFarmDocsPage");
1635
+ function createDocsHref(entry, slug) {
1636
+ const normalizedEntry = normalizeEntry(entry);
1637
+ const normalizedSlug = trimSlashes(slug);
1638
+ if (normalizedEntry === "/") return normalizedSlug ? `/${normalizedSlug}` : "/";
1639
+ return normalizedSlug ? `${normalizedEntry}/${normalizedSlug}` : normalizedEntry;
1640
+ }
1641
+ __name(createDocsHref, "createDocsHref");
1642
+ function pathToSlug(contentDir, filePath) {
1643
+ const relative = path2.relative(contentDir, filePath).replace(/\\/g, "/");
1644
+ if (relative.startsWith("..")) return null;
1645
+ const extension = path2.extname(relative);
1646
+ if (!DOCS_FILE_EXTENSIONS2.includes(extension)) return null;
1647
+ const withoutExtension = relative.slice(0, -extension.length);
1648
+ if (withoutExtension === "page" || withoutExtension === "index") return "";
1649
+ if (withoutExtension.endsWith("/page") || withoutExtension.endsWith("/index")) {
1650
+ return withoutExtension.replace(/\/(page|index)$/, "");
1651
+ }
1652
+ return withoutExtension;
1653
+ }
1654
+ __name(pathToSlug, "pathToSlug");
1655
+ function loadPage(contentDir, docs, request) {
1656
+ return loadFarmDocsPage(contentDir, docs, getRequestSlug(docs, request));
1657
+ }
1658
+ __name(loadPage, "loadPage");
1659
+ function discoverFarmDocsPages(contentDir, docs) {
1660
+ if (!existsSync2(contentDir)) return [];
1661
+ const pages = [];
1662
+ const visit = /* @__PURE__ */ __name((dir) => {
1663
+ for (const entry of readdirSync2(dir, { withFileTypes: true })) {
1664
+ if (entry.name.startsWith(".") || entry.name === "node_modules") continue;
1665
+ const absolutePath = path2.join(dir, entry.name);
1666
+ if (entry.isDirectory()) {
1667
+ visit(absolutePath);
1668
+ continue;
1669
+ }
1670
+ if (!entry.isFile()) continue;
1671
+ const slug = pathToSlug(contentDir, absolutePath);
1672
+ if (slug === null) continue;
1673
+ const source = readFileSync2(absolutePath, "utf8");
1674
+ const { frontmatter, body } = parseFrontmatter(source);
1675
+ pages.push({
1676
+ slug,
1677
+ title: frontmatter.title || titleFromMarkdown(body, titleFromSlug(slug)),
1678
+ description: frontmatter.description,
1679
+ section: frontmatter.section,
1680
+ href: createDocsHref(docs.entry, slug),
1681
+ sourcePath: absolutePath,
1682
+ lastModified: resolveFarmDocsPageLastModified(contentDir, absolutePath, frontmatter)
1683
+ });
1684
+ }
1685
+ }, "visit");
1686
+ visit(contentDir);
1687
+ return pages.sort((a, b) => a.href.localeCompare(b.href));
1688
+ }
1689
+ __name(discoverFarmDocsPages, "discoverFarmDocsPages");
1690
+ function toFarmDocsMarkdownPage(page) {
1691
+ const lastModified = page.lastModified || page.frontmatter.lastModified || page.frontmatter.lastmod;
1692
+ return {
1693
+ slug: page.slug,
1694
+ url: page.href,
1695
+ title: page.title,
1696
+ description: page.description,
1697
+ lastModified,
1698
+ lastmod: lastModified,
1699
+ content: page.body,
1700
+ rawContent: page.body
1701
+ };
1702
+ }
1703
+ __name(toFarmDocsMarkdownPage, "toFarmDocsMarkdownPage");
1704
+ function getDocsTitle(docs) {
1705
+ return typeof docs.config.nav === "object" && docs.config.nav && "title" in docs.config.nav ? String(docs.config.nav.title || "Documentation") : "Documentation";
1706
+ }
1707
+ __name(getDocsTitle, "getDocsTitle");
1708
+ function getDocsDescription(docs) {
1709
+ return docs.config.metadata?.description;
1710
+ }
1711
+ __name(getDocsDescription, "getDocsDescription");
1712
+ function getLoadedDocsPages(contentDir, docs) {
1713
+ return discoverFarmDocsPages(contentDir, docs).map((page) => loadFarmDocsPage(contentDir, docs, page.slug)).filter((page) => Boolean(page));
1714
+ }
1715
+ __name(getLoadedDocsPages, "getLoadedDocsPages");
1716
+ function toDocsLlmsPage(page) {
1717
+ return toFarmDocsMarkdownPage(page);
1718
+ }
1719
+ __name(toDocsLlmsPage, "toDocsLlmsPage");
1720
+ function toDocsSitemapPage(page) {
1721
+ return {
1722
+ ...toFarmDocsMarkdownPage(page),
1723
+ sourcePath: page.sourcePath
1724
+ };
1725
+ }
1726
+ __name(toDocsSitemapPage, "toDocsSitemapPage");
1727
+ function resolvePageActionsConfig(docs) {
1728
+ return isObjectRecord(docs.config.pageActions) ? docs.config.pageActions : {};
1729
+ }
1730
+ __name(resolvePageActionsConfig, "resolvePageActionsConfig");
1731
+ function resolvePageActionsAlignment(docs) {
1732
+ return resolvePageActionsConfig(docs).alignment === "right" ? "right" : "left";
1733
+ }
1734
+ __name(resolvePageActionsAlignment, "resolvePageActionsAlignment");
1735
+ function resolveCopyMarkdownActionConfig(docs) {
1736
+ const raw = resolvePageActionsConfig(docs).copyMarkdown;
1737
+ if (raw === void 0 || raw === false) return null;
1738
+ const options = isObjectRecord(raw) ? raw : {};
1739
+ if (isObjectRecord(raw) && raw.enabled === false) return null;
1740
+ return {
1741
+ format: options.format === "text" ? "text" : "markdown",
1742
+ includeTitle: options.includeTitle === true,
1743
+ label: readString(options.label) ?? "Copy page",
1744
+ copiedLabel: readString(options.copiedLabel) ?? "Copied!"
1745
+ };
1746
+ }
1747
+ __name(resolveCopyMarkdownActionConfig, "resolveCopyMarkdownActionConfig");
1748
+ function resolveLastUpdatedDisplayConfig(docs) {
1749
+ const raw = docs.config.lastUpdated;
1750
+ const options = isObjectRecord(raw) ? raw : {};
1751
+ return {
1752
+ enabled: raw !== false && (!isObjectRecord(raw) || raw.enabled !== false),
1753
+ label: typeof options.label === "string" ? options.label : "Last updated",
1754
+ position: options.position === "below-title" ? "below-title" : "footer"
1755
+ };
1756
+ }
1757
+ __name(resolveLastUpdatedDisplayConfig, "resolveLastUpdatedDisplayConfig");
1758
+ function formatLastModifiedDate(value) {
1759
+ if (!value) return void 0;
1760
+ const date = new Date(value);
1761
+ if (Number.isNaN(date.getTime())) return value;
1762
+ return new Intl.DateTimeFormat("en", {
1763
+ day: "numeric",
1764
+ month: "long",
1765
+ year: "numeric"
1766
+ }).format(date);
1767
+ }
1768
+ __name(formatLastModifiedDate, "formatLastModifiedDate");
1769
+ function renderLastUpdatedText(page, docs, position) {
1770
+ const config = resolveLastUpdatedDisplayConfig(docs);
1771
+ const formatted = formatLastModifiedDate(page.lastModified);
1772
+ if (!config.enabled || config.position !== position || !formatted) return "";
1773
+ const time = `<time datetime="${escapeAttribute(page.lastModified || "")}">${escapeHtml(formatted)}</time>`;
1774
+ const label = config.label.trim();
1775
+ return label ? `${escapeHtml(label)} ${time}` : time;
1776
+ }
1777
+ __name(renderLastUpdatedText, "renderLastUpdatedText");
1778
+ function resolveReadingTimeDisplayConfig(docs) {
1779
+ const raw = docs.config.readingTime;
1780
+ if (raw === void 0 || raw === false) return null;
1781
+ const options = isObjectRecord(raw) ? raw : {};
1782
+ if (isObjectRecord(raw) && options.enabled === false) return null;
1783
+ const wordsPerMinute = typeof options.wordsPerMinute === "number" && options.wordsPerMinute > 0 ? options.wordsPerMinute : 220;
1784
+ return {
1785
+ wordsPerMinute,
1786
+ format: options.format === "short" ? "short" : "long",
1787
+ includeCode: options.includeCode === true
1788
+ };
1789
+ }
1790
+ __name(resolveReadingTimeDisplayConfig, "resolveReadingTimeDisplayConfig");
1791
+ function countMarkdownWords(body, includeCode) {
1792
+ const readable = (includeCode ? body : body.replace(/```[\s\S]*?```/g, " ").replace(/`[^`]*`/g, " ")).replace(/!\[[^\]]*]\([^)]*\)/g, " ").replace(/\[([^\]]+)]\([^)]*\)/g, "$1").replace(/<[^>]+>/g, " ").replace(/[#>*_~`|:-]/g, " ");
1793
+ return readable.match(/[A-Za-z0-9]+(?:[-'][A-Za-z0-9]+)*/g)?.length ?? 0;
1794
+ }
1795
+ __name(countMarkdownWords, "countMarkdownWords");
1796
+ function renderReadingTimeMeta(page, docs) {
1797
+ const config = resolveReadingTimeDisplayConfig(docs);
1798
+ if (!config) return "";
1799
+ const words = countMarkdownWords(page.body, config.includeCode);
1800
+ const minutes = Math.max(1, Math.ceil(words / config.wordsPerMinute));
1801
+ const label = config.format === "short" ? `${minutes} min` : `${minutes} min read`;
1802
+ return `<div class="fd-page-meta not-prose" data-page-reading-time>
1803
+ <span class="fd-page-meta-dot" aria-hidden="true">\xB7</span>
1804
+ <span class="fd-page-meta-item">${escapeHtml(label)}</span>
1805
+ </div>`;
1806
+ }
1807
+ __name(renderReadingTimeMeta, "renderReadingTimeMeta");
1808
+ function renderPixelPageActions(page, docs) {
1809
+ const copyMarkdown = resolveCopyMarkdownActionConfig(docs);
1810
+ if (!copyMarkdown) return "";
1811
+ const markdownUrl = `${page.href}.md`;
1812
+ const includeTitle = copyMarkdown.includeTitle ? "true" : "false";
1813
+ return `<div class="fd-page-actions" data-page-actions data-actions-alignment="${resolvePageActionsAlignment(docs)}">
1814
+ <button
1815
+ type="button"
1816
+ class="fd-page-action-btn"
1817
+ data-page-action="copy-markdown"
1818
+ data-copied="false"
1819
+ data-markdown-url="${escapeAttribute(markdownUrl)}"
1820
+ data-copy-markdown-format="${copyMarkdown.format}"
1821
+ data-copy-markdown-include-title="${includeTitle}"
1822
+ data-copy-label="${escapeAttribute(copyMarkdown.label)}"
1823
+ data-copied-label="${escapeAttribute(copyMarkdown.copiedLabel)}"
1824
+ aria-label="${escapeAttribute(copyMarkdown.label)}"
1825
+ title="${escapeAttribute(copyMarkdown.label)}"
1826
+ >
1827
+ <svg class="fd-page-action-copy-icon" viewBox="0 0 24 24" aria-hidden="true" focusable="false"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg>
1828
+ <svg class="fd-page-action-check-icon" viewBox="0 0 24 24" aria-hidden="true" focusable="false"><path d="M20 6 9 17l-5-5"></path></svg>
1829
+ <span data-page-action-label>${escapeHtml(copyMarkdown.label)}</span>
1830
+ </button>
1831
+ </div>`;
1832
+ }
1833
+ __name(renderPixelPageActions, "renderPixelPageActions");
1834
+ function renderBelowTitleMeta(page, docs) {
1835
+ const lastUpdated = renderLastUpdatedText(page, docs, "below-title");
1836
+ const actions = renderPixelPageActions(page, docs);
1837
+ const readingTime = renderReadingTimeMeta(page, docs);
1838
+ if (!lastUpdated && !actions && !readingTime) return "";
1839
+ return `<div class="fd-below-title-block not-prose">
1840
+ ${lastUpdated ? `<p class="fd-last-updated-inline">${lastUpdated}</p>` : ""}
1841
+ ${actions}
1842
+ ${readingTime}
1843
+ </div>`;
1844
+ }
1845
+ __name(renderBelowTitleMeta, "renderBelowTitleMeta");
1846
+ function renderMarkdownHtmlWithTitleMeta(page, docs) {
1847
+ const html = renderMarkdownHtml(page.body);
1848
+ const meta = renderBelowTitleMeta(page, docs);
1849
+ if (!meta) return html;
1850
+ const withTitleMeta = html.replace(/(<h1\b[\s\S]*?<\/h1>)/, `$1
1851
+ ${meta}`);
1852
+ return withTitleMeta === html ? `${meta}
1853
+ ${html}` : withTitleMeta;
1854
+ }
1855
+ __name(renderMarkdownHtmlWithTitleMeta, "renderMarkdownHtmlWithTitleMeta");
1856
+ function renderPixelPageFooter(page, docs) {
1857
+ const lastUpdated = renderLastUpdatedText(page, docs, "footer");
1858
+ if (!lastUpdated) return "";
1859
+ return `<div class="not-prose fd-page-footer">
1860
+ <span class="fd-last-updated-footer">${lastUpdated}</span>
1861
+ </div>`;
1862
+ }
1863
+ __name(renderPixelPageFooter, "renderPixelPageFooter");
1864
+ function getDocsLlmsOptions(docs, request) {
1865
+ const configured = typeof docs.config.llmsTxt === "object" && docs.config.llmsTxt !== null ? docs.config.llmsTxt : {};
1866
+ return {
1867
+ enabled: true,
1868
+ baseUrl: new URL(request.url).origin,
1869
+ siteTitle: getDocsTitle(docs),
1870
+ siteDescription: getDocsDescription(docs),
1871
+ ...configured
1872
+ };
1873
+ }
1874
+ __name(getDocsLlmsOptions, "getDocsLlmsOptions");
1875
+ function getDocsDiscoveryOptions(docs, request) {
1876
+ return {
1877
+ origin: new URL(request.url).origin,
1878
+ entry: docs.entry,
1879
+ i18n: null,
1880
+ search: docs.config.search ?? true,
1881
+ mcp: {
1882
+ enabled: false,
1883
+ route: "/api/docs/mcp",
1884
+ name: `${getDocsTitle(docs)} MCP`,
1885
+ version: "1",
1886
+ tools: {
1887
+ listDocs: false,
1888
+ listPages: false,
1889
+ readPage: false,
1890
+ searchDocs: false,
1891
+ getNavigation: false,
1892
+ getCodeExamples: false,
1893
+ getConfigSchema: false
1894
+ }
1895
+ },
1896
+ feedback: void 0,
1897
+ llms: getDocsLlmsOptions(docs, request),
1898
+ sitemap: docs.config.sitemap ?? true,
1899
+ robots: docs.config.robots ?? true,
1900
+ openapi: void 0,
1901
+ markdown: {
1902
+ acceptHeader: true,
1903
+ signatureAgentHeader: true
1904
+ }
1905
+ };
1906
+ }
1907
+ __name(getDocsDiscoveryOptions, "getDocsDiscoveryOptions");
1908
+ function createFarmDocsPublicResponse(contentDir, docs, request) {
1909
+ const url = new URL(request.url);
1910
+ const loadedPages = getLoadedDocsPages(contentDir, docs);
1911
+ const sitemapManifest = /* @__PURE__ */ __name(() => buildDocsSitemapManifest({
1912
+ pages: loadedPages.map(toDocsSitemapPage),
1913
+ entry: docs.entry,
1914
+ siteTitle: getDocsTitle(docs),
1915
+ baseUrl: url.origin
1916
+ }), "sitemapManifest");
1917
+ const textHeaders = /* @__PURE__ */ __name((contentType) => ({
1918
+ "Content-Type": contentType,
1919
+ "Cache-Control": "public, max-age=60"
1920
+ }), "textHeaders");
1921
+ const llmsFormat = resolveDocsLlmsTxtFormat(url);
1922
+ if (llmsFormat) {
1923
+ const generated = renderDocsLlmsTxt(
1924
+ loadedPages.map(toDocsLlmsPage),
1925
+ getDocsLlmsOptions(docs, request)
1926
+ );
1927
+ return new Response(llmsFormat === "llms-full" ? generated.llmsFullTxt : generated.llmsTxt, {
1928
+ status: 200,
1929
+ headers: textHeaders("text/plain; charset=utf-8")
1930
+ });
1931
+ }
1932
+ const sitemapFormat = resolveDocsSitemapRequest(url, docs.config.sitemap ?? true);
1933
+ if (sitemapFormat === "xml") {
1934
+ return new Response(
1935
+ renderDocsSitemapXml(sitemapManifest(), {
1936
+ baseUrl: url.origin,
1937
+ includeLastmod: true
1938
+ }),
1939
+ {
1940
+ status: 200,
1941
+ headers: textHeaders("application/xml; charset=utf-8")
1942
+ }
1943
+ );
1944
+ }
1945
+ if (sitemapFormat === "markdown") {
1946
+ return new Response(
1947
+ renderDocsSitemapMarkdown(sitemapManifest(), {
1948
+ includeDescriptions: true
1949
+ }),
1950
+ {
1951
+ status: 200,
1952
+ headers: textHeaders("text/markdown; charset=utf-8")
1953
+ }
1954
+ );
1955
+ }
1956
+ if (resolveDocsRobotsRequest(url, docs.config.robots ?? true)) {
1957
+ return new Response(
1958
+ renderDocsRobotsTxt({
1959
+ entry: docs.entry,
1960
+ sitemap: docs.config.sitemap ?? true,
1961
+ robots: docs.config.robots ?? true,
1962
+ baseUrl: url.origin
1963
+ }),
1964
+ {
1965
+ status: 200,
1966
+ headers: textHeaders("text/plain; charset=utf-8")
1967
+ }
1968
+ );
1969
+ }
1970
+ if (isDocsAgentDiscoveryRequest(url)) {
1971
+ const spec = buildDocsAgentDiscoverySpec(getDocsDiscoveryOptions(docs, request));
1972
+ const title = getDocsTitle(docs);
1973
+ return new Response(
1974
+ JSON.stringify({
1975
+ ...spec,
1976
+ name: title,
1977
+ site: {
1978
+ ...spec.site,
1979
+ title,
1980
+ description: getDocsDescription(docs),
1981
+ entry: docs.entry
1982
+ }
1983
+ }),
1984
+ {
1985
+ status: 200,
1986
+ headers: textHeaders("application/json; charset=utf-8")
1987
+ }
1988
+ );
1989
+ }
1990
+ if (isDocsAgentsRequest(url)) {
1991
+ return new Response(
1992
+ `${renderDocsAgentsDocument(getDocsDiscoveryOptions(docs, request)).trim()}
1993
+ `,
1994
+ {
1995
+ status: 200,
1996
+ headers: textHeaders("text/markdown; charset=utf-8")
1997
+ }
1998
+ );
1999
+ }
2000
+ if (isDocsSkillRequest(url)) {
2001
+ return new Response(
2002
+ `${renderDocsSkillDocument(getDocsDiscoveryOptions(docs, request)).trim()}
2003
+ `,
2004
+ {
2005
+ status: 200,
2006
+ headers: textHeaders("text/markdown; charset=utf-8")
2007
+ }
2008
+ );
2009
+ }
2010
+ return null;
2011
+ }
2012
+ __name(createFarmDocsPublicResponse, "createFarmDocsPublicResponse");
2013
+ function escapeHtml(value) {
2014
+ return value.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
2015
+ }
2016
+ __name(escapeHtml, "escapeHtml");
2017
+ function shouldReturnMarkdown(request) {
2018
+ const url = new URL(request.url);
2019
+ return url.pathname.endsWith(".md") || request.headers.get("accept")?.includes("text/markdown") === true || request.headers.get("accept")?.includes("text/plain") === true;
2020
+ }
2021
+ __name(shouldReturnMarkdown, "shouldReturnMarkdown");
2022
+ function escapeAttribute(value) {
2023
+ return escapeHtml(value).replace(/'/g, "&#39;");
2024
+ }
2025
+ __name(escapeAttribute, "escapeAttribute");
2026
+ function slugify(value) {
2027
+ return value.toLowerCase().replace(/<[^>]+>/g, "").replace(/`([^`]+)`/g, "$1").replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "");
2028
+ }
2029
+ __name(slugify, "slugify");
2030
+ function createSlugger() {
2031
+ const seen = /* @__PURE__ */ new Map();
2032
+ return (value) => {
2033
+ const base = slugify(value) || "section";
2034
+ const count = seen.get(base) || 0;
2035
+ seen.set(base, count + 1);
2036
+ return count === 0 ? base : `${base}-${count + 1}`;
2037
+ };
2038
+ }
2039
+ __name(createSlugger, "createSlugger");
2040
+ function stripHtml(value) {
2041
+ return value.replace(/<[^>]+>/g, "");
2042
+ }
2043
+ __name(stripHtml, "stripHtml");
2044
+ function getCodeFence(line) {
2045
+ const match = /^(?: {0,3})(`{3,}|~{3,})/.exec(line);
2046
+ const value = match?.[1];
2047
+ if (!value) return null;
2048
+ return { marker: value[0], length: value.length };
2049
+ }
2050
+ __name(getCodeFence, "getCodeFence");
2051
+ function isClosingCodeFence(line, fence) {
2052
+ const trimmed = line.trim();
2053
+ return trimmed.length >= fence.length && Array.from(trimmed).every((char) => char === fence.marker);
2054
+ }
2055
+ __name(isClosingCodeFence, "isClosingCodeFence");
2056
+ function stripMdxRuntimeSyntax(body) {
2057
+ const output = [];
2058
+ let fence = null;
2059
+ for (const line of body.split("\n")) {
2060
+ const nextFence = getCodeFence(line);
2061
+ if (fence) {
2062
+ output.push(line);
2063
+ if (nextFence && nextFence.marker === fence.marker && isClosingCodeFence(line, fence)) {
2064
+ fence = null;
2065
+ }
2066
+ continue;
2067
+ }
2068
+ if (nextFence) {
2069
+ fence = nextFence;
2070
+ output.push(line);
2071
+ continue;
2072
+ }
2073
+ if (/^\s*import\s.+$/.test(line) || /^\s*export\s+(const|default)\s.+$/.test(line)) {
2074
+ continue;
2075
+ }
2076
+ output.push(line);
2077
+ }
2078
+ return output.join("\n");
2079
+ }
2080
+ __name(stripMdxRuntimeSyntax, "stripMdxRuntimeSyntax");
2081
+ function unescapeHtml(value) {
2082
+ return value.replace(/&quot;/g, '"').replace(/&#39;/g, "'").replace(/&lt;/g, "<").replace(/&gt;/g, ">").replace(/&amp;/g, "&");
2083
+ }
2084
+ __name(unescapeHtml, "unescapeHtml");
2085
+ var CODE_LANGUAGE_LABELS = /* @__PURE__ */ new Set([
2086
+ "bash",
2087
+ "cjs",
2088
+ "cmd",
2089
+ "console",
2090
+ "css",
2091
+ "html",
2092
+ "javascript",
2093
+ "js",
2094
+ "json",
2095
+ "jsx",
2096
+ "md",
2097
+ "mdx",
2098
+ "shell",
2099
+ "sh",
2100
+ "terminal",
2101
+ "text",
2102
+ "ts",
2103
+ "tsx",
2104
+ "txt",
2105
+ "typescript",
2106
+ "yaml",
2107
+ "yml",
2108
+ "zsh"
2109
+ ]);
2110
+ var EXTENSIONLESS_CODE_FILENAMES = /* @__PURE__ */ new Set([
2111
+ "dockerfile",
2112
+ "makefile",
2113
+ "procfile",
2114
+ "readme",
2115
+ "license"
2116
+ ]);
2117
+ function isCodePathLabel(label) {
2118
+ const trimmed = label.trim();
2119
+ if (!trimmed || /\s/.test(trimmed)) return false;
2120
+ const lower = trimmed.toLowerCase();
2121
+ if (CODE_LANGUAGE_LABELS.has(lower)) return false;
2122
+ const fileName = trimmed.split(/[\\/]/).filter(Boolean).pop() || trimmed;
2123
+ const lowerFileName = fileName.toLowerCase();
2124
+ if (EXTENSIONLESS_CODE_FILENAMES.has(lowerFileName)) return true;
2125
+ if (fileName.startsWith(".") && fileName.length > 1) return true;
2126
+ return /\.[a-z0-9][a-z0-9-]*$/i.test(fileName);
2127
+ }
2128
+ __name(isCodePathLabel, "isCodePathLabel");
2129
+ function parseCodeInfo(info) {
2130
+ const source = (info || "").trim();
2131
+ const language = source.match(/^\S+/)?.[0] || "text";
2132
+ const explicitLabel = source.match(/\b(?:title|filename|file|label|name)=["']([^"']+)["']/)?.[1]?.trim();
2133
+ return { language, label: explicitLabel || language, hasExplicitLabel: Boolean(explicitLabel) };
2134
+ }
2135
+ __name(parseCodeInfo, "parseCodeInfo");
2136
+ function getStandaloneCodeLabel(line) {
2137
+ const trimmed = line.trim();
2138
+ const match = /^(?:\*\*([^*]+)\*\*|__([^_]+)__|`([^`]+)`)$/u.exec(trimmed);
2139
+ const label = match?.[1] || match?.[2] || match?.[3];
2140
+ return label?.trim() || null;
2141
+ }
2142
+ __name(getStandaloneCodeLabel, "getStandaloneCodeLabel");
2143
+ function hasCodeFenceTitle(info) {
2144
+ return /\b(?:title|filename|file|label|name)=["'][^"']+["']/.test(info);
2145
+ }
2146
+ __name(hasCodeFenceTitle, "hasCodeFenceTitle");
2147
+ function escapeCodeFenceTitle(value) {
2148
+ return value.replace(/"/g, "&quot;");
2149
+ }
2150
+ __name(escapeCodeFenceTitle, "escapeCodeFenceTitle");
2151
+ function addTitleToCodeFence(line, title) {
2152
+ const match = /^(\s{0,3})(`{3,}|~{3,})(.*)$/u.exec(line);
2153
+ if (!match) return line;
2154
+ const [, indent, marker, infoSource] = match;
2155
+ const info = infoSource.trim();
2156
+ if (hasCodeFenceTitle(info)) return line;
2157
+ const suffix = `title="${escapeCodeFenceTitle(title)}"`;
2158
+ return `${indent}${marker}${info ? `${info} ${suffix}` : `text ${suffix}`}`;
2159
+ }
2160
+ __name(addTitleToCodeFence, "addTitleToCodeFence");
2161
+ function attachCodeBlockLabels(body) {
2162
+ const lines = body.split("\n");
2163
+ const output = [];
2164
+ let fence = null;
2165
+ for (let index = 0; index < lines.length; index += 1) {
2166
+ const line = lines[index] || "";
2167
+ const nextFence = getCodeFence(line);
2168
+ if (fence) {
2169
+ output.push(line);
2170
+ if (nextFence && nextFence.marker === fence.marker && isClosingCodeFence(line, fence)) {
2171
+ fence = null;
2172
+ }
2173
+ continue;
2174
+ }
2175
+ if (nextFence) {
2176
+ fence = nextFence;
2177
+ output.push(line);
2178
+ continue;
2179
+ }
2180
+ const label = getStandaloneCodeLabel(line);
2181
+ if (!label) {
2182
+ output.push(line);
2183
+ continue;
2184
+ }
2185
+ let fenceIndex = index + 1;
2186
+ while (fenceIndex < lines.length && (lines[fenceIndex] || "").trim() === "") {
2187
+ fenceIndex += 1;
2188
+ }
2189
+ const labeledFence = getCodeFence(lines[fenceIndex] || "");
2190
+ if (!labeledFence) {
2191
+ output.push(line);
2192
+ continue;
2193
+ }
2194
+ output.push(addTitleToCodeFence(lines[fenceIndex] || "", label));
2195
+ fence = labeledFence;
2196
+ index = fenceIndex;
2197
+ }
2198
+ return output.join("\n");
2199
+ }
2200
+ __name(attachCodeBlockLabels, "attachCodeBlockLabels");
2201
+ function highlightCodeBlock(code) {
2202
+ return highlight(code.replace(/\n$/, "")).replace(/<\/span>\n<span/g, "</span><span");
2203
+ }
2204
+ __name(highlightCodeBlock, "highlightCodeBlock");
2205
+ function renderCodeCopyButton(className = "code-copy") {
2206
+ return `<button class="${className}" type="button" data-copied="false" aria-label="Copy code" title="Copy code" onclick="navigator.clipboard?.writeText(this.closest('figure').querySelector('code').innerText); this.dataset.copied='true'; this.setAttribute('aria-label','Copied'); this.title='Copied'; clearTimeout(this._copyTimer); this._copyTimer=setTimeout(() => { this.dataset.copied='false'; this.setAttribute('aria-label','Copy code'); this.title='Copy code'; }, 4500);"><svg class="code-copy-icon" viewBox="0 0 24 24" aria-hidden="true" focusable="false"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg><svg class="code-copy-check" viewBox="0 0 24 24" aria-hidden="true" focusable="false"><path d="M20 6 9 17l-5-5"></path></svg></button>`;
2207
+ }
2208
+ __name(renderCodeCopyButton, "renderCodeCopyButton");
2209
+ function renderMarkdownHtml(body) {
2210
+ const slug = createSlugger();
2211
+ const renderer = new Renderer();
2212
+ renderer.heading = (text2, level, raw) => {
2213
+ const id = slug(raw || stripHtml(text2));
2214
+ return `<h${level} id="${escapeAttribute(id)}"><a class="heading-anchor" href="#${escapeAttribute(id)}">${text2}</a></h${level}>
2215
+ `;
2216
+ };
2217
+ renderer.code = (code, infostring, escaped) => {
2218
+ const { language, label, hasExplicitLabel } = parseCodeInfo(infostring);
2219
+ const rawCode = escaped ? unescapeHtml(code) : code;
2220
+ const highlighted = highlightCodeBlock(rawCode);
2221
+ const shouldRenderHeader = hasExplicitLabel && isCodePathLabel(label);
2222
+ const header = shouldRenderHeader ? `<div class="code-block-header">
2223
+ <span class="code-block-title">${escapeHtml(label)}</span>
2224
+ ${renderCodeCopyButton()}
2225
+ </div>` : renderCodeCopyButton("code-copy code-copy-floating");
2226
+ return `<figure class="shiki code-block ${shouldRenderHeader ? "code-block-framed" : "code-block-plain"}" data-language="${escapeAttribute(language)}">
2227
+ ${header}
2228
+ <pre><code class="sh-code language-${escapeAttribute(language)}">${highlighted}</code></pre>
2229
+ </figure>
2230
+ `;
2231
+ };
2232
+ renderer.table = (header, body2) => `<div class="fd-table-wrapper table-wrap relative overflow-auto prose-no-margin my-6"><table><thead>${header}</thead><tbody>${body2}</tbody></table></div>
2233
+ `;
2234
+ renderer.blockquote = (quote) => `<blockquote>${quote}</blockquote>
2235
+ `;
2236
+ renderer.codespan = (code) => `<code>${escapeHtml(code)}</code>`;
2237
+ renderer.link = (href, title, text2) => {
2238
+ const safeHref = href || "";
2239
+ const titleAttribute = title ? ` title="${escapeAttribute(title)}"` : "";
2240
+ return `<a href="${escapeAttribute(safeHref)}"${titleAttribute}>${text2}</a>`;
2241
+ };
2242
+ renderer.image = (href, title, text2) => {
2243
+ const titleAttribute = title ? ` title="${escapeAttribute(title)}"` : "";
2244
+ return `<img src="${escapeAttribute(href)}" alt="${escapeAttribute(text2)}"${titleAttribute}>`;
2245
+ };
2246
+ const html = marked(attachCodeBlockLabels(stripMdxRuntimeSyntax(body)), {
2247
+ async: false,
2248
+ breaks: false,
2249
+ gfm: true,
2250
+ renderer
2251
+ });
2252
+ return html.trim();
2253
+ }
2254
+ __name(renderMarkdownHtml, "renderMarkdownHtml");
2255
+ function extractTocItems(body, depth) {
2256
+ const slug = createSlugger();
2257
+ const maxLevel = Math.max(2, Math.min(depth, 6));
2258
+ return body.split(/\r?\n/).map((line) => line.match(/^(#{2,6})\s+(.+)$/)).filter((match) => Boolean(match)).map((match) => ({
2259
+ id: slug(match[2].trim()),
2260
+ title: match[2].trim(),
2261
+ level: match[1].length
2262
+ })).filter((item) => item.level <= maxLevel);
2263
+ }
2264
+ __name(extractTocItems, "extractTocItems");
2265
+ function getThemeUI(docs) {
2266
+ const theme = docs.config.theme;
2267
+ return theme && typeof theme === "object" && "ui" in theme && typeof theme.ui === "object" ? theme.ui : {};
2268
+ }
2269
+ __name(getThemeUI, "getThemeUI");
2270
+ function getThemeName(docs) {
2271
+ const theme = docs.config.theme;
2272
+ return theme && typeof theme === "object" && "name" in theme ? String(theme.name || "farm-docs") : "farm-docs";
2273
+ }
2274
+ __name(getThemeName, "getThemeName");
2275
+ function getThemeLayoutValue(docs, key, fallback) {
2276
+ const layout = getThemeUI(docs).layout;
2277
+ const value = layout && typeof layout === "object" ? layout[key] : void 0;
2278
+ return typeof value === "number" ? value : fallback;
2279
+ }
2280
+ __name(getThemeLayoutValue, "getThemeLayoutValue");
2281
+ function getThemeTocDepth(docs) {
2282
+ const toc = getThemeUI(docs).layout?.toc;
2283
+ return toc && typeof toc === "object" && typeof toc.depth === "number" ? toc.depth : 3;
2284
+ }
2285
+ __name(getThemeTocDepth, "getThemeTocDepth");
2286
+ var SIDEBAR_SECTION_ORDER = [
2287
+ "Start",
2288
+ "Core",
2289
+ "Data and APIs",
2290
+ "Integrations",
2291
+ "Runtime",
2292
+ "Content",
2293
+ "Extending",
2294
+ "Reference"
2295
+ ];
2296
+ var SIDEBAR_PAGE_ORDER = new Map(
2297
+ [
2298
+ "",
2299
+ "getting-started",
2300
+ "project-structure",
2301
+ "configuration",
2302
+ "routing",
2303
+ "layouts",
2304
+ "server-rendering",
2305
+ "middleware",
2306
+ "query",
2307
+ "api-routes",
2308
+ "api-client",
2309
+ "storage",
2310
+ "integrations",
2311
+ "integrations/stripe",
2312
+ "integrations/autumn",
2313
+ "integrations/polar",
2314
+ "integrations/auth",
2315
+ "integrations/email",
2316
+ "integrations/jobs",
2317
+ "integrations/unkey",
2318
+ "integrations/ui-registry",
2319
+ "integrations/orm-storage",
2320
+ "cache-ppr",
2321
+ "observability",
2322
+ "deployment",
2323
+ "docs-engine",
2324
+ "markdown",
2325
+ "openapi",
2326
+ "plugins",
2327
+ "plugins/create-plugin",
2328
+ "cli",
2329
+ "examples",
2330
+ "reference"
2331
+ ].map((slug, index) => [slug, index])
2332
+ );
2333
+ function isSidebarNavigationItem(value) {
2334
+ return value !== null;
2335
+ }
2336
+ __name(isSidebarNavigationItem, "isSidebarNavigationItem");
2337
+ function compareSidebarPages(a, b) {
2338
+ const aOrder = SIDEBAR_PAGE_ORDER.get(a.slug) ?? 1e3;
2339
+ const bOrder = SIDEBAR_PAGE_ORDER.get(b.slug) ?? 1e3;
2340
+ return aOrder - bOrder || a.title.localeCompare(b.title);
2341
+ }
2342
+ __name(compareSidebarPages, "compareSidebarPages");
2343
+ function getSidebarSection(page) {
2344
+ if (page.section) return page.section;
2345
+ if (page.slug.startsWith("integrations/")) return "Integrations";
2346
+ if (page.slug.startsWith("plugins/")) return "Extending";
2347
+ return "Reference";
2348
+ }
2349
+ __name(getSidebarSection, "getSidebarSection");
2350
+ function sidebarIdFor(section) {
2351
+ return `sidebar-${slugify(section)}`;
2352
+ }
2353
+ __name(sidebarIdFor, "sidebarIdFor");
2354
+ function isObjectRecord(value) {
2355
+ return !!value && typeof value === "object" && !Array.isArray(value);
2356
+ }
2357
+ __name(isObjectRecord, "isObjectRecord");
2358
+ function readString(value) {
2359
+ return typeof value === "string" && value.trim() ? value.trim() : void 0;
2360
+ }
2361
+ __name(readString, "readString");
2362
+ function readOptionalString(value) {
2363
+ return typeof value === "string" ? value.trim() : void 0;
2364
+ }
2365
+ __name(readOptionalString, "readOptionalString");
2366
+ function normalizeSidebarSlug(value) {
2367
+ if (value === "/" || value === ".") return "";
2368
+ return trimSlashes(value);
2369
+ }
2370
+ __name(normalizeSidebarSlug, "normalizeSidebarSlug");
2371
+ function getSidebarNavigation(docs) {
2372
+ const navigation = docs.config.navigation;
2373
+ if (!isObjectRecord(navigation) || !Array.isArray(navigation.sidebar)) return [];
2374
+ return navigation.sidebar.map(normalizeSidebarNavigationItem).filter(isSidebarNavigationItem);
2375
+ }
2376
+ __name(getSidebarNavigation, "getSidebarNavigation");
2377
+ function normalizeSidebarNavigationItem(value) {
2378
+ if (!isObjectRecord(value)) return null;
2379
+ const label = readString(value.label) ?? readString(value.title);
2380
+ const icon = readString(value.icon);
2381
+ const slug = readOptionalString(value.slug) ?? readOptionalString(value.path);
2382
+ const href = readString(value.href) ?? readString(value.url);
2383
+ const rawChildren = Array.isArray(value.children) ? value.children : Array.isArray(value.items) ? value.items : [];
2384
+ const children = rawChildren.map(normalizeSidebarNavigationItem).filter(isSidebarNavigationItem);
2385
+ if (!label && !slug && !href && children.length === 0) return null;
2386
+ return {
2387
+ ...label ? { label } : {},
2388
+ ...icon ? { icon } : {},
2389
+ ...slug !== void 0 ? { slug: normalizeSidebarSlug(slug) } : {},
2390
+ ...href ? { href } : {},
2391
+ children
2392
+ };
2393
+ }
2394
+ __name(normalizeSidebarNavigationItem, "normalizeSidebarNavigationItem");
2395
+ function createSidebarPageMaps(pages) {
2396
+ return {
2397
+ bySlug: new Map(pages.map((page) => [page.slug, page])),
2398
+ byHref: new Map(pages.map((page) => [page.href, page]))
2399
+ };
2400
+ }
2401
+ __name(createSidebarPageMaps, "createSidebarPageMaps");
2402
+ function resolveConfiguredSidebarPage(item, maps) {
2403
+ if (item.slug !== void 0) return maps.bySlug.get(item.slug);
2404
+ if (item.href) return maps.byHref.get(item.href);
2405
+ return void 0;
2406
+ }
2407
+ __name(resolveConfiguredSidebarPage, "resolveConfiguredSidebarPage");
2408
+ function getSidebarIconRegistry(docs) {
2409
+ return isObjectRecord(docs.config.icons) ? docs.config.icons : {};
2410
+ }
2411
+ __name(getSidebarIconRegistry, "getSidebarIconRegistry");
2412
+ function renderConfiguredIconSvg(value) {
2413
+ if (typeof value !== "string") return "";
2414
+ const icon = value.trim();
2415
+ if (!icon) return "";
2416
+ if (/^<svg[\s>]/i.test(icon)) return icon;
2417
+ if (/^<(path|circle|rect|line|polyline|polygon|ellipse|g)\b/i.test(icon)) {
2418
+ return `<svg viewBox="0 0 24 24" focusable="false">${icon}</svg>`;
2419
+ }
2420
+ return "";
2421
+ }
2422
+ __name(renderConfiguredIconSvg, "renderConfiguredIconSvg");
2423
+ function renderSidebarIcon(docs, icon, className = "sidebar-icon") {
2424
+ if (!icon) return "";
2425
+ const iconRegistry = getSidebarIconRegistry(docs);
2426
+ const configuredIcon = iconRegistry[icon] ?? icon;
2427
+ const svg = renderConfiguredIconSvg(configuredIcon);
2428
+ if (!svg) return "";
2429
+ return `<span class="${className}" data-sidebar-icon="${escapeAttribute(icon)}" aria-hidden="true">${svg}</span>`;
2430
+ }
2431
+ __name(renderSidebarIcon, "renderSidebarIcon");
2432
+ function renderSidebarLabel(docs, icon, label, className) {
2433
+ return `<span class="${className}">${renderSidebarIcon(docs, icon)}<span class="sidebar-label-text">${escapeHtml(label)}</span></span>`;
2434
+ }
2435
+ __name(renderSidebarLabel, "renderSidebarLabel");
2436
+ function getSidebarPageLabel(item, configured) {
2437
+ if (configured?.label) return configured.label;
2438
+ if (item.slug === "") return "Why?";
2439
+ if (item.slug === "integrations") return "Overview";
2440
+ if (item.slug === "integrations/ui-registry") return "UI Registry";
2441
+ if (item.slug === "integrations/orm-storage") return "ORM Storage";
2442
+ if (item.slug.startsWith("integrations/")) {
2443
+ return item.title.replace(/\s+Integrations?$/i, "");
2444
+ }
2445
+ return item.title;
2446
+ }
2447
+ __name(getSidebarPageLabel, "getSidebarPageLabel");
2448
+ function renderSidebarLink(item, activeHref, docs, configured) {
2449
+ const active = item.href === activeHref;
2450
+ return `<a data-active="${active ? "true" : "false"}" href="${escapeAttribute(item.href)}">${renderSidebarLabel(docs, configured?.icon, getSidebarPageLabel(item, configured), "sidebar-link-label")}</a>`;
2451
+ }
2452
+ __name(renderSidebarLink, "renderSidebarLink");
2453
+ function collectConfiguredSidebarPages(items, maps, seen = /* @__PURE__ */ new Set()) {
2454
+ const ordered = [];
2455
+ for (const item of items) {
2456
+ const page = resolveConfiguredSidebarPage(item, maps);
2457
+ if (page && !seen.has(page.slug)) {
2458
+ seen.add(page.slug);
2459
+ ordered.push(page);
2460
+ }
2461
+ ordered.push(...collectConfiguredSidebarPages(item.children, maps, seen));
2462
+ }
2463
+ return ordered;
2464
+ }
2465
+ __name(collectConfiguredSidebarPages, "collectConfiguredSidebarPages");
2466
+ function getOrderedSidebarPages(pages, docs) {
2467
+ if (!docs) return [...pages].sort(compareSidebarPages);
2468
+ const maps = createSidebarPageMaps(pages);
2469
+ const configuredPages = collectConfiguredSidebarPages(getSidebarNavigation(docs), maps);
2470
+ if (configuredPages.length === 0) return [...pages].sort(compareSidebarPages);
2471
+ const configuredSlugs = new Set(configuredPages.map((page) => page.slug));
2472
+ const remainingPages = pages.filter((page) => !configuredSlugs.has(page.slug)).sort(compareSidebarPages);
2473
+ return [...configuredPages, ...remainingPages];
2474
+ }
2475
+ __name(getOrderedSidebarPages, "getOrderedSidebarPages");
2476
+ function renderExternalSidebarLink(item, activeHref, docs) {
2477
+ if (!item.href || !item.label) return "";
2478
+ const active = item.href === activeHref;
2479
+ return `<a data-active="${active ? "true" : "false"}" href="${escapeAttribute(item.href)}">${renderSidebarLabel(docs, item.icon, item.label, "sidebar-link-label")}</a>`;
2480
+ }
2481
+ __name(renderExternalSidebarLink, "renderExternalSidebarLink");
2482
+ function renderConfiguredSidebarSubgroup(item, childHtml, docs) {
2483
+ const label = item.label;
2484
+ if (!label) return childHtml;
2485
+ return `<div class="sidebar-subgroup" data-sidebar-subgroup="${escapeAttribute(slugify(label))}">
2486
+ <div class="sidebar-subgroup-title">${renderSidebarLabel(docs, item.icon, label, "sidebar-subgroup-label")}</div>
2487
+ <div class="sidebar-subgroup-content">
2488
+ ${childHtml}
2489
+ </div>
2490
+ </div>`;
2491
+ }
2492
+ __name(renderConfiguredSidebarSubgroup, "renderConfiguredSidebarSubgroup");
2493
+ function renderConfiguredSidebarItems(items, maps, activeHref, docs) {
2494
+ const renderedItems = [];
2495
+ for (const item of items) {
2496
+ const page = resolveConfiguredSidebarPage(item, maps);
2497
+ const childHtml = renderConfiguredSidebarItems(item.children, maps, activeHref, docs);
2498
+ if (item.children.length > 0) {
2499
+ renderedItems.push(renderConfiguredSidebarSubgroup(item, childHtml, docs));
2500
+ continue;
2501
+ }
2502
+ const linkHtml = page ? renderSidebarLink(page, activeHref, docs, item) : renderExternalSidebarLink(item, activeHref, docs);
2503
+ if (linkHtml) renderedItems.push(linkHtml);
2504
+ }
2505
+ return renderedItems.join("\n");
2506
+ }
2507
+ __name(renderConfiguredSidebarItems, "renderConfiguredSidebarItems");
2508
+ function renderConfiguredSidebarSection(section, maps, activeHref, docs) {
2509
+ const label = section.label || "Docs";
2510
+ const id = sidebarIdFor(label);
2511
+ const links = renderConfiguredSidebarItems(section.children, maps, activeHref, docs);
2512
+ return `<div class="sidebar-folder" data-state="open">
2513
+ <button class="text-fd-muted-foreground sidebar-folder-trigger" type="button" aria-controls="${escapeAttribute(id)}" aria-expanded="true">${renderSidebarLabel(docs, section.icon, label, "sidebar-folder-label")}</button>
2514
+ <div id="${escapeAttribute(id)}" class="overflow-hidden sidebar-folder-content" data-state="open">
2515
+ ${links}
2516
+ </div>
2517
+ </div>`;
2518
+ }
2519
+ __name(renderConfiguredSidebarSection, "renderConfiguredSidebarSection");
2520
+ function renderAutoSidebarSectionItems(items, activeHref, docs) {
2521
+ return [...items].sort(compareSidebarPages).map((item) => renderSidebarLink(item, activeHref, docs)).join("\n");
2522
+ }
2523
+ __name(renderAutoSidebarSectionItems, "renderAutoSidebarSectionItems");
2524
+ function renderPixelNavItems(pages, activeHref, docs) {
2525
+ const configuredSidebar = getSidebarNavigation(docs);
2526
+ if (configuredSidebar.length > 0) {
2527
+ const maps = createSidebarPageMaps(pages);
2528
+ const renderedSections2 = configuredSidebar.map((section) => {
2529
+ if (section.children.length > 0) {
2530
+ return renderConfiguredSidebarSection(section, maps, activeHref, docs);
2531
+ }
2532
+ const page = resolveConfiguredSidebarPage(section, maps);
2533
+ return page ? renderSidebarLink(page, activeHref, docs, section) : renderExternalSidebarLink(section, activeHref, docs);
2534
+ }).filter(Boolean).join("\n");
2535
+ return `<div class="sidebar-scroll overscroll-contain">
2536
+ <div class="sidebar-tree">
2537
+ ${renderedSections2}
2538
+ </div>
2539
+ </div>`;
2540
+ }
2541
+ const groups = /* @__PURE__ */ new Map();
2542
+ for (const item of pages) {
2543
+ const group = item.slug === "" ? "Start" : getSidebarSection(item);
2544
+ const entries = groups.get(group) ?? [];
2545
+ entries.push(item);
2546
+ groups.set(group, entries);
2547
+ }
2548
+ const renderedSections = Array.from(groups.entries()).sort(([a], [b]) => {
2549
+ const aOrder = SIDEBAR_SECTION_ORDER.indexOf(a);
2550
+ const bOrder = SIDEBAR_SECTION_ORDER.indexOf(b);
2551
+ return (aOrder === -1 ? 100 : aOrder) - (bOrder === -1 ? 100 : bOrder) || a.localeCompare(b);
2552
+ }).map(([section, items]) => {
2553
+ const id = sidebarIdFor(section);
2554
+ const links = renderAutoSidebarSectionItems(items, activeHref, docs);
2555
+ return `<div class="sidebar-folder" data-state="open">
2556
+ <button class="text-fd-muted-foreground sidebar-folder-trigger" type="button" aria-controls="${escapeAttribute(id)}" aria-expanded="true">${renderSidebarLabel(docs, void 0, section, "sidebar-folder-label")}</button>
2557
+ <div id="${escapeAttribute(id)}" class="overflow-hidden sidebar-folder-content" data-state="open">
2558
+ ${links}
2559
+ </div>
2560
+ </div>`;
2561
+ }).join("\n");
2562
+ return `<div class="sidebar-scroll overscroll-contain">
2563
+ <div class="sidebar-tree">
2564
+ ${renderedSections}
2565
+ </div>
2566
+ </div>`;
2567
+ }
2568
+ __name(renderPixelNavItems, "renderPixelNavItems");
2569
+ function renderPixelPageNav(pages, activeHref, docs) {
2570
+ const orderedPages = getOrderedSidebarPages(pages, docs);
2571
+ const activeIndex = orderedPages.findIndex((item) => item.href === activeHref);
2572
+ if (activeIndex === -1) return "";
2573
+ const previous = orderedPages[activeIndex - 1];
2574
+ const next = orderedPages[activeIndex + 1];
2575
+ if (!previous && !next) return "";
2576
+ const renderChevron = /* @__PURE__ */ __name((direction) => `<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="${direction === "prev" ? "15 18 9 12 15 6" : "9 18 15 12 9 6"}" /></svg>`, "renderChevron");
2577
+ const renderCard = /* @__PURE__ */ __name((item, direction) => `<a class="fd-page-nav-card fd-page-nav-${direction}" href="${escapeAttribute(item.href)}">
2578
+ <span class="fd-page-nav-title fd-page-nav-title-${direction}">${direction === "prev" ? `${renderChevron(direction)}${escapeHtml(item.title)}` : `${escapeHtml(item.title)}${renderChevron(direction)}`}</span>
2579
+ <span class="fd-page-nav-description">${direction === "prev" ? "Previous Page" : "Next Page"}</span>
2580
+ </a>`, "renderCard");
2581
+ return `<nav class="not-prose fd-page-nav" aria-label="Page navigation">
2582
+ ${previous ? renderCard(previous, "prev") : ""}
2583
+ ${next ? renderCard(next, "next") : ""}
2584
+ </nav>`;
2585
+ }
2586
+ __name(renderPixelPageNav, "renderPixelPageNav");
2587
+ function titleizePathSegment(value) {
2588
+ return value.replace(/[-_]+/g, " ").replace(/\b\w/g, (character) => character.toUpperCase());
2589
+ }
2590
+ __name(titleizePathSegment, "titleizePathSegment");
2591
+ function isBreadcrumbEnabled(docs) {
2592
+ const breadcrumb = docs.config.breadcrumb;
2593
+ if (breadcrumb === false) return false;
2594
+ if (breadcrumb && typeof breadcrumb === "object" && "enabled" in breadcrumb) {
2595
+ return breadcrumb.enabled !== false;
2596
+ }
2597
+ return true;
2598
+ }
2599
+ __name(isBreadcrumbEnabled, "isBreadcrumbEnabled");
2600
+ function renderPixelBreadcrumb(page, docs) {
2601
+ if (!isBreadcrumbEnabled(docs)) return "";
2602
+ const segments = trimSlashes(page.slug).split("/").filter(Boolean);
2603
+ if (segments.length < 2) return "";
2604
+ const parentSegments = segments.slice(0, -1);
2605
+ const parentSegment = parentSegments[parentSegments.length - 1];
2606
+ const currentSegment = segments[segments.length - 1];
2607
+ const entry = normalizeEntry(docs.entry);
2608
+ const parentPath = parentSegments.join("/");
2609
+ const parentHref = entry === "/" ? `/${parentPath}` : `${entry}/${parentPath}`;
2610
+ return `<nav class="fd-breadcrumb" aria-label="Breadcrumb">
2611
+ <span class="fd-breadcrumb-item">
2612
+ <a class="fd-breadcrumb-parent fd-breadcrumb-link" href="${escapeAttribute(parentHref)}">${escapeHtml(titleizePathSegment(parentSegment))}</a>
2613
+ </span>
2614
+ <span class="fd-breadcrumb-item">
2615
+ <span class="fd-breadcrumb-sep">/</span>
2616
+ <span class="fd-breadcrumb-current">${escapeHtml(titleizePathSegment(currentSegment))}</span>
2617
+ </span>
2618
+ </nav>`;
2619
+ }
2620
+ __name(renderPixelBreadcrumb, "renderPixelBreadcrumb");
2621
+ function renderDocsSearchTrigger(showIcon = true) {
2622
+ return `<button class="fd-docs-search-trigger" type="button" data-search-full="" aria-label="Search documentation" aria-haspopup="dialog" aria-keyshortcuts="Meta+K Control+K">
2623
+ ${showIcon ? '<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false"><circle cx="11" cy="11" r="7"></circle><path d="m20 20-4-4"></path></svg>' : ""}
2624
+ <kbd><span>\u2318</span><span>K</span></kbd>
2625
+ </button>`;
2626
+ }
2627
+ __name(renderDocsSearchTrigger, "renderDocsSearchTrigger");
2628
+ function renderDocsSearchMount(clientEntry) {
2629
+ return `<div id="farm-docs-search-root" data-farm-docs-search-root data-api="/api/docs"></div>
2630
+ <script type="module" src="${escapeAttribute(clientEntry)}"></script>`;
2631
+ }
2632
+ __name(renderDocsSearchMount, "renderDocsSearchMount");
2633
+ function renderDocsSearchBootstrapScript() {
2634
+ return `<script>${generateFarmDocsSearchBootstrapRuntime()}</script>`;
2635
+ }
2636
+ __name(renderDocsSearchBootstrapScript, "renderDocsSearchBootstrapScript");
2637
+ function renderPixelToc(items) {
2638
+ if (items.length === 0) return '<p class="toc-empty">No sections</p>';
2639
+ return `<div class="toc-track">
2640
+ <div class="toc-thumb" data-toc-thumb style="clip-path: polygon(0 0px, 100% 0px, 100% 32px, 0 32px);"></div>
2641
+ <div class="toc-links">
2642
+ ${items.map(
2643
+ (item) => `<a class="toc-link" data-active="${items[0] === item ? "true" : "false"}" data-toc-item data-depth="${item.level}" href="#${escapeAttribute(item.id)}">${escapeHtml(item.title)}</a>`
2644
+ ).join("\n")}
2645
+ </div>
2646
+ </div>`;
2647
+ }
2648
+ __name(renderPixelToc, "renderPixelToc");
2649
+ function renderDocsRuntimeScript(docs) {
2650
+ const docsEntry = JSON.stringify(normalizeEntry(docs.entry));
2651
+ return `<script>(()=>{if(window.__farmDocsRuntime)return;window.__farmDocsRuntime=true;document.documentElement.dataset.farmDocsRuntime="true";document.documentElement.dataset.farmDocsRuntimeId=Math.random().toString(36).slice(2);const docsEntry=${docsEntry};let cleanupToc=()=>{};let closeMobileSidebar=()=>{};const normalizePath=(path)=>path.length>1?path.replace(/\\/+$/,""):path;const isDocsPath=(path)=>{const next=normalizePath(path);const entry=normalizePath(docsEntry);if(next.endsWith(".md"))return false;if(entry==="/")return true;return next===entry||next.startsWith(entry+"/")};const initToc=()=>{cleanupToc();const toc=document.getElementById("nd-toc");if(!toc){cleanupToc=()=>{};return}const links=Array.from(toc.querySelectorAll("[data-toc-item]"));const thumb=toc.querySelector("[data-toc-thumb]");const pairs=links.map((link)=>{let id=link.hash.slice(1);try{id=decodeURIComponent(id)}catch{}return{link,heading:document.getElementById(id)}}).filter((item)=>item.heading);const setActive=(active)=>{for(const {link} of pairs)link.dataset.active=link===active.link?"true":"false";if(!thumb)return;const styles=getComputedStyle(active.link);const top=active.link.offsetTop+parseFloat(styles.paddingTop||"0");const bottom=active.link.offsetTop+active.link.clientHeight-parseFloat(styles.paddingBottom||"0");thumb.style.clipPath="polygon(0 "+top+"px,100% "+top+"px,100% "+bottom+"px,0 "+bottom+"px)"};const update=()=>{if(pairs.length===0)return;const offset=Math.min(window.innerHeight*0.3,160);let active=pairs[0];for(const pair of pairs){if(pair.heading.getBoundingClientRect().top<=offset)active=pair;else break}setActive(active)};let frame=0;const schedule=()=>{if(frame)return;frame=requestAnimationFrame(()=>{frame=0;update()})};const onHashChange=()=>setTimeout(schedule,0);window.addEventListener("scroll",schedule,{passive:true});window.addEventListener("resize",schedule);window.addEventListener("hashchange",onHashChange);cleanupToc=()=>{window.removeEventListener("scroll",schedule);window.removeEventListener("resize",schedule);window.removeEventListener("hashchange",onHashChange);if(frame)cancelAnimationFrame(frame);frame=0};update()};const getSidebar=()=>document.getElementById("nd-sidebar");const ensureActiveVisible=()=>{const sidebar=getSidebar();if(!sidebar)return;const active=sidebar.querySelector('a[data-active="true"]');if(!(active instanceof HTMLElement))return;const activeRect=active.getBoundingClientRect();const sidebarRect=sidebar.getBoundingClientRect();if(activeRect.top<sidebarRect.top||activeRect.bottom>sidebarRect.bottom)sidebar.scrollTop+=activeRect.top-sidebarRect.top-(sidebar.clientHeight-activeRect.height)/2};const setSidebarActive=(path)=>{const sidebar=getSidebar();if(!sidebar)return;const current=normalizePath(path);for(const link of Array.from(sidebar.querySelectorAll("a[href]"))){try{link.dataset.active=normalizePath(new URL(link.href,location.href).pathname)===current?"true":"false"}catch{}}ensureActiveVisible()};const initMobileSidebar=()=>{const layout=document.getElementById("nd-docs-layout");const sidebar=getSidebar();const toggle=document.querySelector("[data-sidebar-toggle]");const backdrop=document.querySelector("[data-sidebar-backdrop]");if(!layout||!sidebar||!(toggle instanceof HTMLButtonElement))return;const setOpen=(open)=>{layout.dataset.sidebarOpen=open?"true":"false";document.documentElement.dataset.farmDocsSidebar=open?"open":"closed";toggle.setAttribute("aria-expanded",open?"true":"false");toggle.setAttribute("aria-label",open?"Close menu":"Open menu")};const toggleOpen=()=>setOpen(layout.dataset.sidebarOpen!=="true");closeMobileSidebar=()=>setOpen(false);toggle.addEventListener("click",(event)=>{event.preventDefault();toggleOpen()});backdrop?.addEventListener("click",()=>closeMobileSidebar());document.addEventListener("keydown",(event)=>{if(event.key==="Escape")closeMobileSidebar()});sidebar.addEventListener("click",(event)=>{const target=event.target instanceof Element?event.target.closest("a[href]"):null;if(target)closeMobileSidebar()});closeMobileSidebar()};const initSidebarScroll=()=>{const sidebar=getSidebar();if(!sidebar)return;const key="farmdocs:sidebar-scroll:"+location.origin;const getStorage=()=>{try{return window.sessionStorage}catch{return null}};const readSaved=()=>{try{const raw=getStorage()?.getItem(key);if(!raw)return null;const parsed=JSON.parse(raw);return parsed&&typeof parsed==="object"?parsed:null}catch{return null}};const save=(path=location.pathname)=>{try{getStorage()?.setItem(key,JSON.stringify({path,scrollTop:sidebar.scrollTop}))}catch{}};const saved=readSaved();if(saved?.path===location.pathname&&Number.isFinite(Number(saved.scrollTop)))sidebar.scrollTop=Number(saved.scrollTop);ensureActiveVisible();save();sidebar.addEventListener("scroll",()=>save(),{passive:true});sidebar.addEventListener("click",(event)=>{const target=event.target instanceof Element?event.target.closest("a[href]"):null;if(!target)return;try{save(new URL(target.href,location.href).pathname)}catch{save()}});window.addEventListener("beforeunload",()=>save())};let navigateController=null;const getPageKey=(root)=>{const article=root.getElementById("nd-page");if(!article)return"";return article.querySelector("h1")?.textContent?.trim()||article.textContent?.replace(/\\s+/g," ").trim().slice(0,160)||""};const swapDocsPage=(html,url)=>{const nextDoc=new DOMParser().parseFromString(html,"text/html");const nextArticle=nextDoc.getElementById("nd-page");const currentArticle=document.getElementById("nd-page");if(!nextArticle||!currentArticle)return false;const nextKey=getPageKey(nextDoc);const importedArticle=document.importNode(nextArticle,true);currentArticle.replaceWith(importedArticle);const renderedArticle=document.getElementById("nd-page");if(!renderedArticle||renderedArticle===currentArticle||(nextKey&&getPageKey(document)!==nextKey))return false;const nextToc=nextDoc.getElementById("nd-toc");const currentToc=document.getElementById("nd-toc");if(nextToc&&currentToc)currentToc.replaceWith(document.importNode(nextToc,true));if(nextDoc.title)document.title=nextDoc.title;const nextDescription=nextDoc.querySelector('meta[name="description"]');const currentDescription=document.querySelector('meta[name="description"]');if(nextDescription&&currentDescription)currentDescription.setAttribute("content",nextDescription.getAttribute("content")||"");setSidebarActive(url.pathname);initToc();closeMobileSidebar();return true};const navigateDocs=async(url,{replace=false,scroll=true}={})=>{if(!isDocsPath(url.pathname))return false;if(navigateController)navigateController.abort();const controller=new AbortController();navigateController=controller;document.documentElement.dataset.farmDocsNavigating="true";try{const response=await fetch(url.href,{cache:"no-store",headers:{accept:"text/html","x-farm-docs-navigate":"1"},signal:controller.signal});if(!response.ok||!((response.headers.get("content-type")||"").includes("text/html")))return false;const html=await response.text();if(!swapDocsPage(html,url))return false;if(replace)history.replaceState({farmDocs:true},"",url.href);else history.pushState({farmDocs:true},"",url.href);if(scroll){if(url.hash){let id=url.hash.slice(1);try{id=decodeURIComponent(id)}catch{}document.getElementById(id)?.scrollIntoView({block:"start"})}else window.scrollTo({top:0,left:0})}return true}catch(error){if(error?.name==="AbortError")return true;return false}finally{if(navigateController===controller){delete document.documentElement.dataset.farmDocsNavigating;navigateController=null}}};const initClientNavigation=()=>{document.addEventListener("click",(event)=>{if(event.defaultPrevented||event.button!==0||event.metaKey||event.ctrlKey||event.shiftKey||event.altKey)return;const target=event.target instanceof Element?event.target.closest("a[href]"):null;if(!target||target.target||target.hasAttribute("download"))return;let url;try{url=new URL(target.href,location.href)}catch{return}if(url.origin!==location.origin||!isDocsPath(url.pathname))return;if(normalizePath(url.pathname)===normalizePath(location.pathname)&&url.hash)return;event.preventDefault();navigateDocs(url).then((handled)=>{if(!handled)location.href=url.href})});window.addEventListener("popstate",()=>{navigateDocs(new URL(location.href),{replace:true,scroll:false}).then((handled)=>{if(!handled)location.reload()})})};const init=()=>{initToc();initMobileSidebar();initSidebarScroll();initClientNavigation()};if(document.readyState==="loading")document.addEventListener("DOMContentLoaded",init,{once:true});else init()})();</script>`;
2652
+ }
2653
+ __name(renderDocsRuntimeScript, "renderDocsRuntimeScript");
2654
+ function renderDocsPageActionsRuntimeScript() {
2655
+ return `<script>(()=>{if(window.__farmDocsPageActionsRuntime)return;window.__farmDocsPageActionsRuntime=true;const readArticleText=()=>{const article=document.getElementById("nd-page");if(!article)return"";const clone=article.cloneNode(true);if(!(clone instanceof HTMLElement))return article.innerText||"";clone.querySelectorAll("[data-page-actions],.fd-page-footer,.fd-page-nav").forEach((node)=>node.remove());return clone.innerText||""};const withTitle=(content,format,includeTitle)=>{if(!includeTitle)return content;const title=document.querySelector("#nd-page h1")?.textContent?.trim()||document.title.trim();if(!title)return content;const trimmed=content.trimStart();if(trimmed.startsWith(title)||trimmed.startsWith("# "+title))return content;return format==="markdown"?"# "+title+"\\n\\n"+content:title+"\\n\\n"+content};const writeClipboard=async(text)=>{if(navigator.clipboard?.writeText){try{await navigator.clipboard.writeText(text);return}catch{}}const textarea=document.createElement("textarea");textarea.value=text;textarea.setAttribute("readonly","");textarea.style.position="fixed";textarea.style.opacity="0";textarea.style.pointerEvents="none";document.body.appendChild(textarea);textarea.select();document.execCommand("copy");textarea.remove()};const markCopied=(button)=>{const label=button.querySelector("[data-page-action-label]");button.dataset.copied="true";button.setAttribute("aria-label",button.dataset.copiedLabel||"Copied!");button.title=button.dataset.copiedLabel||"Copied!";if(label)label.textContent=button.dataset.copiedLabel||"Copied!";const previous=Number(button.dataset.copyTimeout||0);if(previous)clearTimeout(previous);button.dataset.copyTimeout=String(setTimeout(()=>{button.dataset.copied="false";button.setAttribute("aria-label",button.dataset.copyLabel||"Copy page");button.title=button.dataset.copyLabel||"Copy page";if(label)label.textContent=button.dataset.copyLabel||"Copy page";button.dataset.copyTimeout="0"},4500))};document.addEventListener("click",async(event)=>{const target=event.target instanceof Element?event.target.closest('[data-page-action="copy-markdown"]'):null;if(!(target instanceof HTMLButtonElement))return;event.preventDefault();const format=target.dataset.copyMarkdownFormat==="text"?"text":"markdown";const includeTitle=target.dataset.copyMarkdownIncludeTitle==="true";let content="";target.disabled=true;try{if(format==="markdown"&&target.dataset.markdownUrl){try{const response=await fetch(target.dataset.markdownUrl,{headers:{Accept:"text/markdown"}});if(response.ok)content=await response.text()}catch{}}if(!content)content=readArticleText();content=withTitle(content,format,includeTitle);if(content.trim()){await writeClipboard(content);markCopied(target)}}finally{target.disabled=false}})})();</script>`;
2656
+ }
2657
+ __name(renderDocsPageActionsRuntimeScript, "renderDocsPageActionsRuntimeScript");
2658
+ function renderDocsHashRuntimeScript() {
2659
+ return `<script>(()=>{if(window.__farmDocsHashRuntime)return;window.__farmDocsHashRuntime=true;const scrollToHash=()=>{if(!location.hash)return;let id=location.hash.slice(1);try{id=decodeURIComponent(id)}catch{}document.getElementById(id)?.scrollIntoView({block:"start"})};const schedule=()=>requestAnimationFrame(()=>requestAnimationFrame(scrollToHash));if(document.readyState==="loading")document.addEventListener("DOMContentLoaded",schedule,{once:true});else schedule();window.addEventListener("load",schedule,{once:true});window.addEventListener("hashchange",schedule)})();</script>`;
2660
+ }
2661
+ __name(renderDocsHashRuntimeScript, "renderDocsHashRuntimeScript");
2662
+ function renderDocsRuntimeScripts(docs) {
2663
+ return `${renderDocsRuntimeScript(docs)}
2664
+ ${renderDocsHashRuntimeScript()}
2665
+ ${renderDocsPageActionsRuntimeScript()}`;
2666
+ }
2667
+ __name(renderDocsRuntimeScripts, "renderDocsRuntimeScripts");
2668
+ var themeCssCache = /* @__PURE__ */ new Map();
2669
+ function readCssWithImports(filePath, seen = /* @__PURE__ */ new Set()) {
2670
+ const resolved = path2.resolve(filePath);
2671
+ if (seen.has(resolved)) return "";
2672
+ seen.add(resolved);
2673
+ const source = readFileSync2(resolved, "utf8");
2674
+ return source.replace(/@import\s+["']([^"']+)["'];?/g, (_match, importPath) => {
2675
+ try {
2676
+ const importedPath = importPath.startsWith(".") ? path2.resolve(path2.dirname(resolved), importPath) : createRequire(resolved).resolve(importPath);
2677
+ return readCssWithImports(importedPath, seen);
2678
+ } catch {
2679
+ return "";
2680
+ }
2681
+ });
2682
+ }
2683
+ __name(readCssWithImports, "readCssWithImports");
2684
+ function resolvePixelBorderThemeCss(options) {
2685
+ const cacheKey = path2.resolve(options.root);
2686
+ const cached = themeCssCache.get(cacheKey);
2687
+ if (cached !== void 0) return cached;
2688
+ try {
2689
+ const requireFromApp = createRequire(path2.join(cacheKey, "package.json"));
2690
+ const themeCssPath = requireFromApp.resolve("@farming-labs/theme/pixel-border/css");
2691
+ const requireFromTheme = createRequire(themeCssPath);
2692
+ const fumadocsCssPath = requireFromTheme.resolve("fumadocs-ui/style.css");
2693
+ const css = `${readCssWithImports(fumadocsCssPath)}
2694
+ ${readCssWithImports(themeCssPath)}`;
2695
+ themeCssCache.set(cacheKey, css);
2696
+ return css;
2697
+ } catch {
2698
+ themeCssCache.set(cacheKey, "");
2699
+ return "";
2700
+ }
2701
+ }
2702
+ __name(resolvePixelBorderThemeCss, "resolvePixelBorderThemeCss");
2703
+ function renderFarmDocsBridgeCss(docs) {
2704
+ const sidebarWidth = getThemeLayoutValue(docs, "sidebarWidth", 320);
2705
+ const contentWidth = getThemeLayoutValue(docs, "contentWidth", 860);
2706
+ return `
2707
+ @font-face { font-family: "Geist Sans"; src: local("Geist Sans"), url("${GEIST_SANS_FONT_URL}") format("woff2"), url("/node_modules/geist/dist/fonts/geist-sans/Geist-Variable.woff2") format("woff2"); font-display: block; font-style: normal; font-weight: 100 900; }
2708
+ @font-face { font-family: "Geist Mono"; src: local("Geist Mono"), url("${GEIST_MONO_FONT_URL}") format("woff2"), url("/node_modules/geist/dist/fonts/geist-mono/GeistMono-Variable.woff2") format("woff2"); font-display: block; font-style: normal; font-weight: 100 900; }
2709
+ :root { color-scheme: dark; --font-geist-sans: "Geist Sans"; --font-geist-mono: "Geist Mono"; --fd-sidebar-width: ${sidebarWidth}px; --fd-content-width: ${contentWidth}px; --fd-toc-width: 240px; --fd-docs-height: 100vh; --fd-docs-row-1: var(--fd-nav-height, 44px); --fd-docs-font-sans: var(--font-geist-sans, "Geist Sans", var(--font-sans, system-ui, -apple-system, sans-serif)); --fd-docs-font-mono: var(--font-geist-mono, "Geist Mono", var(--font-mono, ui-monospace, monospace)); --fd-font-sans: var(--fd-docs-font-sans); --fd-font-mono: var(--fd-docs-font-mono); --fd-pixel-rail-width: 12px; --fd-sidebar-edge: calc(var(--fd-pixel-rail-width) + 18px); --fd-sidebar-guide-x: calc(var(--fd-sidebar-edge) + 16px); --fd-sidebar-link-x: calc(var(--fd-sidebar-guide-x) + 22px); --fd-sidebar-sub-guide-x: calc(var(--fd-sidebar-link-x) + 7px); --fd-sidebar-sub-link-x: calc(var(--fd-sidebar-sub-guide-x) + 28px); --fd-sidebar-branch-gap: 0px; --fd-sidebar-nested-icon-gap: 0px; --fd-sidebar-line-color: color-mix(in srgb, var(--color-fd-border, hsl(0 0% 15%)) 88%, transparent); }
2710
+ * { box-sizing: border-box; }
2711
+ html { background: var(--color-fd-background, hsl(0 0% 2%)); scroll-padding-top: calc(var(--fd-nav-height, 44px) + 24px); }
2712
+ html[data-farm-docs-sidebar="open"], html[data-farm-docs-sidebar="open"] body { overflow: hidden; }
2713
+ body { margin: 0; min-height: 100vh; background: var(--color-fd-background, hsl(0 0% 2%)); color: var(--color-fd-foreground, oklch(0.985 0.001 106.423)); font-family: var(--fd-docs-font-sans); text-rendering: optimizeLegibility; }
2714
+ ::selection { background: var(--color-fd-foreground, #fff); color: var(--color-fd-background, #000); }
2715
+ a { color: inherit; }
2716
+ #nd-docs-layout { --fd-sidebar-col: var(--fd-sidebar-width); display: grid; grid-template: "sidebar header header" var(--fd-nav-height, 44px) "sidebar main toc" 1fr / var(--fd-sidebar-width) minmax(0, 1fr) var(--fd-toc-width) !important; min-height: 100vh; border-top: 1px solid var(--color-fd-border, hsl(0 0% 15%)); background: var(--color-fd-background, hsl(0 0% 2%)); }
2717
+ #nd-docs-layout.grid { grid-template: "sidebar header header" var(--fd-nav-height, 44px) "sidebar main toc" 1fr / var(--fd-sidebar-width) minmax(0, 1fr) var(--fd-toc-width) !important; }
2718
+ #nd-docs-layout, #nd-docs-layout * { border-radius: 0 !important; }
2719
+ .topbar { position: sticky; top: 0; z-index: 20; grid-area: header; height: var(--fd-nav-height, 44px); display: flex; align-items: center; justify-content: flex-end; gap: 16px; border-bottom: 1px solid var(--color-fd-border, hsl(0 0% 15%)); background: color-mix(in srgb, var(--color-fd-background, hsl(0 0% 2%)) 92%, transparent); backdrop-filter: blur(12px); padding: 0; font-family: var(--fd-docs-font-mono); font-size: 12px; letter-spacing: 0.03em; text-transform: uppercase; }
2720
+ .topbar a { text-decoration: none; color: var(--color-fd-muted-foreground, hsl(0 0% 55%)); }
2721
+ .topbar a:hover { color: var(--color-fd-foreground, oklch(0.985 0.001 106.423)); }
2722
+ .topbar-actions, .mobile-topbar-actions { display: flex; height: 100%; min-width: 0; align-items: stretch; margin-left: auto; }
2723
+ .topbar-llms-link { display: inline-flex; height: 100%; align-items: center; border-left: 1px solid var(--color-fd-border, hsl(0 0% 15%)); padding: 0 22px; }
2724
+ .mobile-topbar { display: none; }
2725
+ .sidebar-backdrop { display: none; }
2726
+ .fd-mobile-nav-btn { display: inline-flex; width: var(--fd-mobile-nav-height, 56px); height: 100%; flex: 0 0 var(--fd-mobile-nav-height, 56px); align-items: center; justify-content: center; border: 0; border-right: 1px solid var(--color-fd-border, hsl(0 0% 15%)); background: transparent; color: var(--color-fd-foreground, oklch(0.985 0.001 106.423)); cursor: pointer; padding: 0; appearance: none; }
2727
+ .fd-mobile-nav-btn svg { width: 19px; height: 19px; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }
2728
+ .mobile-topbar-link { display: inline-flex; height: 100%; min-width: 0; align-items: center; color: var(--color-fd-muted-foreground, hsl(0 0% 55%)); font-family: var(--fd-docs-font-mono); font-size: 12px; letter-spacing: 0.03em; text-decoration: none; text-transform: uppercase; }
2729
+ .mobile-topbar-link { border-left: 1px solid var(--color-fd-border, hsl(0 0% 15%)); padding: 0 14px; }
2730
+ #nd-docs-layout .fd-toc { position: sticky; top: var(--fd-docs-row-1); grid-area: toc; display: flex; width: var(--fd-toc-width); height: calc(var(--fd-docs-height) - var(--fd-docs-row-1)); max-height: calc(100vh - var(--fd-docs-row-1)); flex-direction: column; align-self: start; overflow: hidden; padding: 48px 16px 8px 0; }
2731
+ #nd-docs-layout .fd-toc-inner { display: flex; min-width: 0; min-height: 0; flex: 1 1 auto; flex-direction: column; }
2732
+ #nd-docs-layout .fd-toc-title { display: inline-flex; align-items: center; gap: 0.375rem; margin: 0 0 1rem; color: var(--color-fd-muted-foreground, hsl(0 0% 55%)); font-family: var(--fd-docs-font-sans); font-size: 0.875rem; font-weight: 500; line-height: 1.4; }
2733
+ #nd-docs-layout .fd-toc-title svg { width: 1rem; height: 1rem; flex: 0 0 1rem; color: currentColor; }
2734
+ #nd-docs-layout .toc-scroll { min-height: 0; overflow: auto; padding: 0.75rem 0; scrollbar-width: none; }
2735
+ #nd-docs-layout .toc-scroll::-webkit-scrollbar { display: none; }
2736
+ #nd-docs-layout .toc-track { position: relative; min-width: 0; }
2737
+ #nd-docs-layout .toc-thumb { position: absolute; inset-block: 0; inset-inline-start: 0; width: 1px; background: var(--color-fd-primary, oklch(0.985 0.001 106.423)); transition: clip-path 150ms ease; }
2738
+ #nd-docs-layout .toc-links { display: flex; min-width: 0; flex-direction: column; border-inline-start: 1px solid color-mix(in srgb, var(--color-fd-foreground, #fff) 10%, transparent); }
2739
+ #nd-docs-layout .toc-link { display: block; min-width: 0; padding: 0.375rem 0 0.375rem 0.75rem; color: var(--color-fd-muted-foreground, hsl(0 0% 55%)); font-size: 0.875rem; line-height: 1.45; text-decoration: none; overflow-wrap: anywhere; transition: color 150ms ease; }
2740
+ #nd-docs-layout .toc-link:first-child { padding-top: 0; }
2741
+ #nd-docs-layout .toc-link:last-child { padding-bottom: 0; }
2742
+ #nd-docs-layout .toc-link[data-depth="3"] { padding-left: 1.5rem; font-size: 0.8125rem; }
2743
+ #nd-docs-layout .toc-link[data-depth="4"], #nd-docs-layout .toc-link[data-depth="5"], #nd-docs-layout .toc-link[data-depth="6"] { padding-left: 2rem; font-size: 0.8125rem; }
2744
+ #nd-docs-layout .toc-link[data-active="true"] { color: var(--color-fd-primary, oklch(0.985 0.001 106.423)); }
2745
+ #nd-docs-layout .toc-link:hover { color: var(--color-fd-accent-foreground, oklch(0.985 0.001 106.423)); }
2746
+ #nd-docs-layout .toc-empty { margin: 0; color: var(--color-fd-muted-foreground, hsl(0 0% 55%)); font-size: 0.875rem; line-height: 1.5; }
2747
+ aside#nd-sidebar { position: sticky; top: 0; grid-area: sidebar; height: 100vh; overflow: auto; isolation: isolate; border-left: 1px solid var(--color-fd-border, hsl(0 0% 15%)); border-right: 1px solid var(--color-fd-border, hsl(0 0% 15%)); background-color: var(--color-fd-background, hsl(0 0% 2%)); background-image: linear-gradient(var(--color-fd-border, hsl(0 0% 15%)), var(--color-fd-border, hsl(0 0% 15%))), linear-gradient(var(--color-fd-border, hsl(0 0% 15%)), var(--color-fd-border, hsl(0 0% 15%))), repeating-linear-gradient(-45deg, color-mix(in srgb, var(--color-fd-border, hsl(0 0% 15%)) 2%, transparent), color-mix(in srgb, var(--color-fd-foreground, #fff) 7%, transparent) 1px, transparent 1px, transparent 6px), repeating-linear-gradient(-45deg, color-mix(in srgb, var(--color-fd-border, hsl(0 0% 15%)) 2%, transparent), color-mix(in srgb, var(--color-fd-foreground, #fff) 7%, transparent) 1px, transparent 1px, transparent 6px); background-size: 1px 100%, 1px 100%, var(--fd-pixel-rail-width) 100%, var(--fd-pixel-rail-width) 100%; background-position: var(--fd-pixel-rail-width) 0, calc(100% - var(--fd-pixel-rail-width)) 0, left top, right top; background-repeat: repeat-y; padding: 0 var(--fd-sidebar-edge) 18px; }
2748
+ aside#nd-sidebar::before, aside#nd-sidebar::after { display: none; }
2749
+ aside#nd-sidebar > * { position: relative; z-index: 1; }
2750
+ .sidebar-brand { display: flex; align-items: center; justify-content: space-between; gap: 10px; min-height: var(--fd-nav-height, 44px); margin: 0 calc(-1 * var(--fd-sidebar-edge)) 18px; border-top: 1px solid var(--color-fd-border, hsl(0 0% 15%)); border-bottom: 1px solid var(--color-fd-border, hsl(0 0% 15%)); background: transparent; padding: 0 var(--fd-sidebar-edge); font-family: var(--fd-docs-font-mono); font-size: 12px; letter-spacing: 0.03em; text-transform: uppercase; }
2751
+ .sidebar-brand a { display: inline-flex; min-width: 0; align-items: center; gap: 8px; overflow: hidden; text-decoration: none; text-overflow: ellipsis; white-space: nowrap; }
2752
+ .sidebar-brand-logo { width: 16px; height: 16px; flex: 0 0 16px; color: var(--color-fd-foreground, oklch(0.985 0.001 106.423)); }
2753
+ .sidebar-brand-title { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
2754
+ .sidebar-brand-suffix { opacity: 0.52; }
2755
+ .sidebar-scroll { margin: 0 calc(-1 * var(--fd-sidebar-edge)); overflow: visible; }
2756
+ .sidebar-tree { margin-top: 0 !important; }
2757
+ .sidebar-tree > a[data-active], .sidebar-folder { border-top: 1px solid var(--color-fd-border, hsl(0 0% 15%)); }
2758
+ #nd-docs-layout aside#nd-sidebar .sidebar-tree > .sidebar-folder { margin-left: 0 !important; margin-right: 0 !important; padding: 0 !important; }
2759
+ .sidebar-tree > :last-child { border-bottom: 1px solid var(--color-fd-border, hsl(0 0% 15%)); }
2760
+ #nd-docs-layout aside#nd-sidebar .sidebar-tree a[data-active] { position: relative; display: flex; width: auto !important; min-width: 0; align-items: center; gap: 8px; margin: 0 !important; padding: 6px var(--fd-sidebar-edge) 6px var(--fd-sidebar-link-x) !important; color: var(--color-fd-muted-foreground, hsl(0 0% 55%)); text-decoration: none; font-size: 13.5px !important; line-height: 1.45 !important; background: transparent !important; transition: color 150ms ease; }
2761
+ #nd-docs-layout aside#nd-sidebar .sidebar-tree > a[data-active] { padding-left: var(--fd-sidebar-edge) !important; padding-top: 12px !important; padding-bottom: 12px !important; }
2762
+ #nd-docs-layout aside#nd-sidebar .sidebar-subgroup-content a[data-active] { padding-left: var(--fd-sidebar-sub-link-x) !important; }
2763
+ .sidebar-tree a[data-active="true"], .sidebar-tree a[data-active="true"]:hover { color: var(--color-fd-primary, oklch(0.985 0.001 106.423)) !important; }
2764
+ .sidebar-tree a[data-active="false"]:hover { color: var(--color-fd-foreground, oklch(0.985 0.001 106.423)) !important; }
2765
+ .sidebar-icon { display: inline-flex; width: 14px; height: 14px; flex: 0 0 14px; color: currentColor; opacity: 0.72; }
2766
+ .sidebar-icon svg { width: 100%; height: 100%; fill: none; stroke: currentColor; stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round; }
2767
+ .sidebar-icon[data-sidebar-icon^="brand-"] svg { fill: currentColor; stroke: none; }
2768
+ .sidebar-icon[data-sidebar-icon^="brand-"] svg * { stroke: none; }
2769
+ .sidebar-link-label, .sidebar-folder-label, .sidebar-subgroup-label { display: inline-flex; min-width: 0; align-items: center; gap: 8px; }
2770
+ .sidebar-folder-label .sidebar-icon { width: 13px; height: 13px; flex-basis: 13px; }
2771
+ .sidebar-subgroup-label .sidebar-icon { width: 14px; height: 14px; flex-basis: 14px; }
2772
+ .sidebar-label-text { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
2773
+ .sidebar-tree a[data-active="true"] .sidebar-icon, .sidebar-tree a:hover .sidebar-icon { opacity: 1; }
2774
+ #nd-docs-layout aside#nd-sidebar .sidebar-folder-trigger { display: flex !important; width: 100% !important; min-width: 0; align-items: center; justify-content: flex-start; border: 0; border-bottom: 1px solid var(--color-fd-border, hsl(0 0% 15%)) !important; background: transparent !important; margin: 0 !important; transform: none !important; padding: 8px var(--fd-sidebar-edge) !important; color: var(--color-fd-muted-foreground, hsl(0 0% 55%)) !important; font-family: var(--fd-docs-font-sans); font-size: 12px !important; font-weight: 600; letter-spacing: 0 !important; text-align: left; text-transform: none; cursor: default; }
2775
+ .sidebar-folder-content { position: relative; padding: 8px 0; overflow: hidden; }
2776
+ .sidebar-folder-content::before { content: ""; position: absolute; left: var(--fd-sidebar-guide-x); top: 0; bottom: 0; width: 1px; background: var(--fd-sidebar-line-color); pointer-events: none; }
2777
+ .sidebar-folder-content > a[data-active]::after, .sidebar-subgroup-title::after, .sidebar-subgroup-content a[data-active]::after { content: ""; position: absolute; top: 50%; height: 1px; background: var(--fd-sidebar-line-color); transform: translateY(-50%); pointer-events: none; transition: background-color 150ms ease; }
2778
+ .sidebar-folder-content > a[data-active]::after { left: calc(var(--fd-sidebar-guide-x) + var(--fd-sidebar-branch-gap)); width: calc(var(--fd-sidebar-link-x) - var(--fd-sidebar-guide-x) - var(--fd-sidebar-branch-gap)); }
2779
+ .sidebar-subgroup-title::after { left: calc(var(--fd-sidebar-guide-x) + var(--fd-sidebar-branch-gap)); width: calc(var(--fd-sidebar-sub-guide-x) - var(--fd-sidebar-guide-x) - var(--fd-sidebar-branch-gap)); }
2780
+ .sidebar-folder-content > a[data-active="true"]::after, .sidebar-subgroup-content a[data-active="true"]::after { background: var(--color-fd-primary, oklch(0.985 0.001 106.423)); }
2781
+ .sidebar-subgroup { position: relative; padding: 2px 0 4px; }
2782
+ .sidebar-subgroup::before { content: ""; position: absolute; left: var(--fd-sidebar-sub-guide-x); top: 17px; bottom: 19px; width: 1px; background: var(--fd-sidebar-line-color); pointer-events: none; }
2783
+ .sidebar-subgroup-title { position: relative; display: flex; min-width: 0; align-items: center; margin: 0 !important; padding: 6px var(--fd-sidebar-edge) 6px var(--fd-sidebar-link-x); color: var(--color-fd-muted-foreground, hsl(0 0% 55%)); font-size: 13.5px; font-weight: 400; line-height: 1.45; }
2784
+ .sidebar-subgroup-content { position: relative; padding: 0 0 4px; }
2785
+ .sidebar-subgroup-content a[data-active]::after { left: var(--fd-sidebar-sub-guide-x); width: calc(var(--fd-sidebar-sub-link-x) - var(--fd-sidebar-sub-guide-x) - var(--fd-sidebar-nested-icon-gap)); }
2786
+ main { grid-area: main; min-width: 0; padding: 46px 40px 80px; }
2787
+ article#nd-page { width: min(100%, var(--fd-content-width)); margin: 0 auto; }
2788
+ article#nd-page .fd-breadcrumb { display: flex; min-width: 0; align-items: center; gap: 0; margin: 0 0 0.5rem; color: var(--color-fd-muted-foreground, hsl(0 0% 55%)); font-family: var(--fd-docs-font-mono); font-size: 0.75rem; line-height: 1.4; letter-spacing: 0.01em; text-transform: uppercase; }
2789
+ article#nd-page .fd-breadcrumb-item { display: inline-flex; min-width: 0; align-items: center; }
2790
+ article#nd-page .fd-breadcrumb-link { color: inherit; font-family: var(--fd-docs-font-mono); text-decoration: none; }
2791
+ article#nd-page .fd-breadcrumb-link:hover { color: var(--color-fd-foreground, oklch(0.985 0.001 106.423)); }
2792
+ article#nd-page .fd-breadcrumb-parent { opacity: 0.6; font-weight: 400; }
2793
+ article#nd-page .fd-breadcrumb-sep { margin: 0 0.375rem; opacity: 0.4; font-size: 0.75rem; }
2794
+ article#nd-page .fd-breadcrumb-current { color: var(--color-fd-foreground, oklch(0.985 0.001 106.423)); font-family: var(--fd-docs-font-mono); font-weight: 500; }
2795
+ .prose h1 { margin: 0 0 16px; font-size: 36px; line-height: 1.14; letter-spacing: -0.02em; }
2796
+ .prose h2 { margin: 44px 0 14px; border-top: 1px solid var(--color-fd-border, hsl(0 0% 15%)); padding-top: 26px; font-size: 24px; line-height: 1.24; letter-spacing: -0.01em; }
2797
+ .prose h3 { margin: 30px 0 12px; font-size: 20px; line-height: 1.3; letter-spacing: 0; }
2798
+ .prose h4, .prose h5, .prose h6 { margin: 24px 0 10px; letter-spacing: 0; }
2799
+ .heading-anchor { color: inherit; text-decoration: none; }
2800
+ .heading-anchor:hover { text-decoration: underline; text-underline-offset: 4px; }
2801
+ .prose p { margin: 14px 0; color: color-mix(in srgb, var(--color-fd-foreground, oklch(0.985 0.001 106.423)) 74%, transparent); font-size: 15.6px; line-height: 1.8; }
2802
+ .prose ul, .prose ol { margin: 16px 0; padding-left: 24px; color: color-mix(in srgb, var(--color-fd-foreground, oklch(0.985 0.001 106.423)) 78%, transparent); line-height: 1.75; }
2803
+ .prose li { margin: 6px 0; }
2804
+ .prose code:not(pre code) { border: 1px solid var(--color-fd-border, hsl(0 0% 15%)); background: var(--color-fd-card, hsl(0 0% 4%)); padding: 1px 5px; font-family: var(--fd-docs-font-mono); font-size: 0.88em; overflow-wrap: break-word; word-break: break-word; }
2805
+ .sh-code { --sh-class: #e5c07b; --sh-identifier: #c8ccd4; --sh-string: #98c379; --sh-keyword: #c678dd; --sh-comment: #5c6370; --sh-property: #e06c75; --sh-sign: #c8ccd4; --sh-space: inherit; }
2806
+ .code-block { --fd-code-header-bg: color-mix(in srgb, var(--color-fd-foreground, #fff) 5%, var(--color-fd-background, #000)); --fd-code-body-bg: color-mix(in srgb, var(--color-fd-foreground, #fff) 8%, var(--color-fd-background, #000)); position: relative; width: 100%; min-width: 0; max-width: 100%; margin: 20px 0; overflow: hidden; border: 1px solid var(--color-fd-border, hsl(0 0% 15%)); background: var(--color-fd-background, hsl(0 0% 2%)); box-shadow: 3px 3px 0 0 var(--color-fd-border, hsl(0 0% 15%)); font-family: var(--fd-docs-font-mono); }
2807
+ #nd-docs-layout figure.shiki.code-block { box-shadow: 3px 3px 0 0 var(--color-fd-border, hsl(0 0% 15%)) !important; }
2808
+ .code-block-header { display: flex; align-items: center; justify-content: space-between; gap: 10px; min-width: 0; min-height: 34px; border-bottom: 1px solid var(--color-fd-border, hsl(0 0% 15%)); background-color: var(--fd-code-header-bg); background-image: repeating-linear-gradient(-45deg, color-mix(in srgb, var(--color-fd-foreground, #fff) 4%, transparent), color-mix(in srgb, var(--color-fd-foreground, #fff) 4%, transparent) 1px, transparent 1px, transparent 6px); padding: 4px 8px 4px 10px; }
2809
+ .code-block-title { overflow: hidden; color: color-mix(in srgb, var(--color-fd-foreground, #fff) 50%, transparent); font-size: 10px; line-height: 1.2; text-overflow: ellipsis; text-transform: lowercase; white-space: nowrap; }
2810
+ .code-copy { display: inline-flex; align-items: center; justify-content: center; width: 22px; height: 22px; flex: 0 0 auto; border: 1px solid var(--color-fd-border, hsl(0 0% 15%)); background: color-mix(in srgb, var(--color-fd-background, #000) 80%, transparent); color: var(--color-fd-muted-foreground, hsl(0 0% 55%)); cursor: pointer; padding: 0; }
2811
+ .code-copy-floating { position: absolute; top: 8px; right: 8px; z-index: 2; opacity: 0.72; transition: opacity 150ms ease; }
2812
+ #nd-docs-layout figure.shiki.code-block > .code-copy-floating { opacity: 0.72; }
2813
+ .code-block-plain:hover .code-copy-floating, .code-block-plain:focus-within .code-copy-floating { opacity: 1; }
2814
+ .code-copy svg { width: 13px; height: 13px; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }
2815
+ .code-copy .code-copy-check { display: none; }
2816
+ .code-copy[data-copied="true"] .code-copy-icon { display: none; }
2817
+ .code-copy[data-copied="true"] .code-copy-check { display: block; }
2818
+ .code-copy:hover { color: var(--color-fd-foreground, #fff); background: var(--color-fd-muted, hsl(0 0% 10%)); }
2819
+ .code-block pre { margin: 0; max-width: 100%; overflow-x: auto; border: 0; background: var(--fd-code-body-bg); padding: 18px 20px; color: var(--color-fd-foreground, #fff); font-family: var(--fd-docs-font-mono); font-size: 13px; line-height: 1.6; }
2820
+ #nd-docs-layout figure.shiki.code-block pre { padding: 18px 20px !important; }
2821
+ .code-block code { display: block; min-width: max-content; border: 0 !important; background: transparent !important; padding: 0 !important; font-family: inherit; white-space: normal; }
2822
+ .sh__line { display: block; min-height: 1.6em; white-space: pre; }
2823
+ blockquote { margin: 18px 0; border: 1px solid var(--color-fd-border, hsl(0 0% 15%)); border-left: 3px solid var(--color-fd-foreground, oklch(0.985 0.001 106.423)); background: var(--color-fd-card, hsl(0 0% 4%)); box-shadow: 3px 3px 0 0 var(--color-fd-border, hsl(0 0% 15%)); padding: 14px 16px; color: color-mix(in srgb, var(--color-fd-foreground, oklch(0.985 0.001 106.423)) 78%, transparent); }
2824
+ .fd-table-wrapper { margin: 24px 0; overflow-x: auto; }
2825
+ .fd-table-wrapper table { width: 100%; border: 1px solid var(--color-fd-border, hsl(0 0% 15%)); border-collapse: collapse; font-size: 14px; }
2826
+ .fd-table-wrapper th, .fd-table-wrapper td { border-color: var(--color-fd-border, hsl(0 0% 15%)); border-bottom: 1px solid var(--color-fd-border, hsl(0 0% 15%)); padding: 10px 12px; text-align: left; vertical-align: top; }
2827
+ .fd-table-wrapper th { background: var(--color-fd-muted, hsl(0 0% 10%)); color: var(--color-fd-foreground, oklch(0.985 0.001 106.423)); font-family: inherit; font-size: 13px; font-weight: 500; text-transform: none; }
2828
+ .fd-table-wrapper tr:last-child td { border-bottom: 0; }
2829
+ hr { border: 0; border-top: 1px solid var(--color-fd-border, hsl(0 0% 15%)); margin: 28px 0; }
2830
+ img { max-width: 100%; height: auto; border: 1px solid var(--color-fd-border, hsl(0 0% 15%)); }
2831
+ .fd-page-nav { display: grid; width: 100%; max-width: 100%; grid-template-columns: 1fr; gap: 16px; margin-top: 16px; border-top: 0; padding-top: 0; }
2832
+ .fd-page-nav:has(.fd-page-nav-prev):has(.fd-page-nav-next) { grid-template-columns: repeat(2, minmax(0, 1fr)); }
2833
+ #nd-docs-layout .fd-page-nav-card { display: flex; min-width: 0; min-height: 98px; flex-direction: column; justify-content: flex-start; gap: 8px; border: 1px solid var(--color-fd-border, hsl(0 0% 15%)); border-radius: 0 !important; background: transparent; padding: 16px; color: var(--color-fd-foreground, oklch(0.985 0.001 106.423)); text-decoration: none; transition: background-color 150ms ease, border-color 150ms ease; }
2834
+ .fd-page-nav-card:hover { border-color: var(--color-fd-border, hsl(0 0% 15%)); background: color-mix(in srgb, var(--color-fd-muted, hsl(0 0% 10%)) 80%, transparent); }
2835
+ .fd-page-nav-next { align-items: flex-end; text-align: right; }
2836
+ .fd-page-nav-title { display: inline-flex; max-width: 100%; min-height: 0; align-items: center; gap: 6px; overflow: hidden; color: var(--color-fd-foreground, oklch(0.985 0.001 106.423)); font-size: 0.875rem; font-weight: 500; line-height: 1.5; overflow-wrap: anywhere; }
2837
+ .fd-page-nav-title svg { width: 1rem; height: 1rem; flex-shrink: 0; }
2838
+ .fd-page-nav-description { display: block; max-width: 100%; min-height: 0; overflow: hidden; color: var(--color-fd-muted-foreground, hsl(0 0% 55%)); font-size: 15.6px; font-weight: 400; line-height: 1.8; text-overflow: ellipsis; white-space: nowrap; }
2839
+ .fd-below-title-block { display: flex; flex-direction: column; align-items: flex-start; gap: 0.625rem; margin: 0 0 1.25rem; }
2840
+ .fd-page-actions { display: flex; width: 100%; align-items: center; gap: 0.5rem; }
2841
+ .fd-page-actions[data-actions-alignment="right"] { justify-content: flex-end; }
2842
+ .fd-below-title-block .fd-page-actions { margin: 0; }
2843
+ .fd-page-meta { display: inline-flex; align-items: center; gap: 0.375rem; color: var(--color-fd-muted-foreground, hsl(0 0% 55%)); font-size: 0.8125rem; line-height: 1.5; }
2844
+ .fd-page-meta-dot { color: color-mix(in srgb, var(--color-fd-muted-foreground, hsl(0 0% 55%)) 60%, transparent); }
2845
+ .fd-last-updated-inline, .fd-last-updated-footer { color: var(--color-fd-muted-foreground, hsl(0 0% 55%)); font-family: var(--fd-docs-font-mono); font-size: 0.75rem; letter-spacing: 0.03em; line-height: 1.5; text-transform: uppercase; }
2846
+ #nd-docs-layout .fd-page-action-btn { display: inline-flex; min-height: 2.125rem; align-items: center; justify-content: center; gap: 0.5rem; border: 1px solid var(--color-fd-border, hsl(0 0% 15%)); background: color-mix(in srgb, var(--color-fd-foreground, #fff) 5%, var(--color-fd-background, #000)); color: var(--color-fd-muted-foreground, hsl(0 0% 55%)); padding: 0 0.75rem; box-shadow: 2px 2px 0 0 var(--color-fd-border, hsl(0 0% 15%)); cursor: pointer; font-family: var(--fd-docs-font-mono) !important; font-size: 0.75rem; font-weight: 500; letter-spacing: 0.03em; line-height: 1; text-transform: uppercase; transition: background-color 150ms ease, color 150ms ease, border-color 150ms ease; appearance: none; }
2847
+ #nd-docs-layout .fd-page-action-btn:hover { border-color: color-mix(in srgb, var(--color-fd-foreground, #fff) 22%, transparent); background: color-mix(in srgb, var(--color-fd-foreground, #fff) 8%, var(--color-fd-background, #000)); color: var(--color-fd-foreground, oklch(0.985 0.001 106.423)); }
2848
+ #nd-docs-layout .fd-page-action-btn:disabled { cursor: wait; opacity: 0.72; }
2849
+ #nd-docs-layout .fd-page-action-btn svg { width: 14px; height: 14px; flex: 0 0 14px; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }
2850
+ #nd-docs-layout .fd-page-action-btn .fd-page-action-check-icon { display: none; }
2851
+ #nd-docs-layout .fd-page-action-btn[data-copied="true"] .fd-page-action-copy-icon { display: none; }
2852
+ #nd-docs-layout .fd-page-action-btn[data-copied="true"] .fd-page-action-check-icon { display: block; }
2853
+ .fd-page-footer { display: flex; align-items: center; gap: 0.75rem 1rem; margin-top: 2rem; border-top: 1px solid var(--color-fd-border, hsl(0 0% 15%)); padding-top: 1rem; }
2854
+ .fd-page-footer .fd-last-updated-footer { margin-left: auto; }
2855
+ @media (max-width: 1020px) {
2856
+ :root { --fd-mobile-nav-height: 56px; --fd-sidebar-edge: 20px; --fd-sidebar-guide-x: 58px; --fd-sidebar-link-x: 88px; --fd-sidebar-sub-guide-x: calc(var(--fd-sidebar-link-x) + 7px); --fd-sidebar-sub-link-x: calc(var(--fd-sidebar-sub-guide-x) + 28px); }
2857
+ html { scroll-padding-top: calc(var(--fd-mobile-nav-height, 56px) + 24px); }
2858
+ body { overflow-x: hidden; }
2859
+ #nd-docs-layout { display: block !important; min-height: 100dvh; border-top: 0; padding-top: var(--fd-mobile-nav-height, 56px); }
2860
+ .mobile-topbar { position: fixed; inset: 0 0 auto 0; z-index: 80; display: flex; height: var(--fd-mobile-nav-height, 56px); align-items: stretch; border-bottom: 1px solid var(--color-fd-border, hsl(0 0% 15%)); background: color-mix(in srgb, var(--color-fd-background, hsl(0 0% 2%)) 94%, transparent); backdrop-filter: blur(12px); }
2861
+ .mobile-topbar a:hover, .fd-mobile-nav-btn:hover { color: var(--color-fd-foreground, oklch(0.985 0.001 106.423)); }
2862
+ .topbar { display: none !important; }
2863
+ .sidebar-backdrop { position: fixed; inset: 0; z-index: 70; display: block; background: color-mix(in srgb, var(--color-fd-background, #000) 72%, transparent); opacity: 0; pointer-events: none; transition: opacity 180ms ease; }
2864
+ #nd-docs-layout[data-sidebar-open="true"] .sidebar-backdrop { opacity: 1; pointer-events: auto; }
2865
+ aside#nd-sidebar { position: fixed; inset: 0 auto 0 0; z-index: 90; width: min(342px, calc(100vw - 42px)); height: 100dvh; max-height: none; overflow-y: auto; overscroll-behavior: contain; border-right: 1px solid var(--color-fd-border, hsl(0 0% 15%)); border-bottom: 0; transform: translate3d(-100%, 0, 0); transition: transform 180ms ease; will-change: transform; }
2866
+ #nd-docs-layout[data-sidebar-open="true"] aside#nd-sidebar { transform: translate3d(0, 0, 0); }
2867
+ aside#nd-sidebar::before, aside#nd-sidebar::after { display: none; }
2868
+ .sidebar-brand { min-height: var(--fd-nav-height, 44px); margin-top: 0; }
2869
+ main { padding: 34px 20px 64px; }
2870
+ article#nd-page { width: 100%; margin: 0; }
2871
+ #nd-docs-layout .fd-toc { display: none !important; }
2872
+ .prose h1 { font-size: 32px; line-height: 1.16; letter-spacing: 0; }
2873
+ .prose h2 { margin-top: 34px; padding-top: 22px; font-size: 23px; }
2874
+ .code-block { margin: 16px 0; box-shadow: 2px 2px 0 0 var(--color-fd-border, hsl(0 0% 15%)); }
2875
+ #nd-docs-layout figure.shiki.code-block { box-shadow: 2px 2px 0 0 var(--color-fd-border, hsl(0 0% 15%)) !important; }
2876
+ .code-block-header { min-height: 32px; padding: 3px 7px 3px 9px; }
2877
+ .code-copy-floating { top: 6px; right: 6px; }
2878
+ #nd-docs-layout figure.shiki.code-block pre, .code-block pre { padding: 12px 11px !important; font-size: 12px; line-height: 1.5; }
2879
+ .sh__line { min-height: 1.5em; }
2880
+ .fd-page-nav { grid-template-columns: 1fr !important; }
2881
+ .fd-page-nav-next { align-items: flex-start; text-align: left; }
2882
+ .fd-page-footer { align-items: flex-start; flex-direction: column; }
2883
+ .fd-page-footer .fd-last-updated-footer { margin-left: 0; }
2884
+ }
2885
+ @media (max-width: 640px) {
2886
+ .code-block-header { min-height: 30px; padding: 3px 6px 3px 8px; }
2887
+ .code-copy-floating { top: 7px; right: 7px; }
2888
+ #nd-docs-layout figure.shiki.code-block pre, .code-block pre { padding: 12px !important; font-size: 12px; line-height: 1.6; }
2889
+ #nd-docs-layout figure.shiki.code-block-plain pre, .code-block-plain pre { padding: 16px 44px 16px 14px !important; line-height: 1.65; }
2890
+ .sh__line { min-height: 1.6em; }
2891
+ }
2892
+ ${farmDocsPixelBorderCss}
2893
+ `;
2894
+ }
2895
+ __name(renderFarmDocsBridgeCss, "renderFarmDocsBridgeCss");
2896
+ function renderPixelDocsHtml(page, pages, docs, themeCss, clientEntry, faviconHref) {
2897
+ const navTitle = typeof docs.config.nav === "object" && docs.config.nav && "title" in docs.config.nav ? String(docs.config.nav.title || "Docs") : "Docs";
2898
+ const description = page.description || docs.config.metadata?.description || "";
2899
+ const tocItems = extractTocItems(page.body, getThemeTocDepth(docs));
2900
+ const themeName = getThemeName(docs);
2901
+ const searchEnabled = isFarmDocsSearchEnabled(docs);
2902
+ return `<!DOCTYPE html>
2903
+ <html class="dark" lang="en" data-docs-theme="${escapeAttribute(themeName)}">
2904
+ <head>
2905
+ <meta charset="utf-8">
2906
+ <meta name="viewport" content="width=device-width, initial-scale=1">
2907
+ <meta name="generator" content="@farming-labs/docs via Farm.js">
2908
+ <title>${escapeHtml(page.title)}</title>
2909
+ ${renderFarmDocsFaviconLink(faviconHref)}
2910
+ <link rel="preload" href="${GEIST_SANS_FONT_URL}" as="font" type="font/woff2" crossorigin>
2911
+ <link rel="preload" href="${GEIST_MONO_FONT_URL}" as="font" type="font/woff2" crossorigin>
2912
+ ${description ? `<meta name="description" content="${escapeHtml(description)}">` : ""}
2913
+ <style>${themeCss}
2914
+ ${renderFarmDocsBridgeCss(docs)}</style>
2915
+ ${searchEnabled ? renderDocsSearchBootstrapScript() : ""}
2916
+ </head>
2917
+ <body>
2918
+ <div id="nd-docs-layout" class="grid">
2919
+ <header class="mobile-topbar" aria-label="Mobile docs navigation">
2920
+ <button class="fd-mobile-nav-btn" type="button" data-sidebar-toggle aria-controls="nd-sidebar" aria-expanded="false" aria-label="Open menu">
2921
+ <svg viewBox="0 0 24 24" aria-hidden="true" focusable="false"><line x1="3" y1="6" x2="21" y2="6"></line><line x1="3" y1="12" x2="21" y2="12"></line><line x1="3" y1="18" x2="21" y2="18"></line></svg>
2922
+ </button>
2923
+ <div class="mobile-topbar-actions">
2924
+ ${searchEnabled ? renderDocsSearchTrigger() : ""}
2925
+ <a class="mobile-topbar-link" href="/llms.txt">llms.txt</a>
2926
+ </div>
2927
+ </header>
2928
+ <div class="sidebar-backdrop" data-sidebar-backdrop></div>
2929
+ <aside id="nd-sidebar">
2930
+ <div class="sidebar-brand">
2931
+ <a href="/">${renderFarmDocsBrandMark()}${renderFarmDocsBrandTitle(navTitle)}</a>
2932
+ <span>/ docs</span>
2933
+ </div>
2934
+ ${renderPixelNavItems(pages, page.href, docs)}
2935
+ </aside>
2936
+ <header class="topbar">
2937
+ <div class="topbar-actions">
2938
+ ${searchEnabled ? renderDocsSearchTrigger(false) : ""}
2939
+ <a class="topbar-llms-link" href="/llms.txt">llms.txt</a>
2940
+ </div>
2941
+ </header>
2942
+ <main>
2943
+ <article id="nd-page" class="prose">
2944
+ ${renderPixelBreadcrumb(page, docs)}
2945
+ ${renderMarkdownHtmlWithTitleMeta(page, docs)}
2946
+ ${renderPixelPageFooter(page, docs)}
2947
+ ${renderPixelPageNav(pages, page.href, docs)}
2948
+ </article>
2949
+ </main>
2950
+ <nav id="nd-toc" class="fd-toc sticky top-(--fd-docs-row-1) h-[calc(var(--fd-docs-height)-var(--fd-docs-row-1))] flex flex-col [grid-area:toc] w-(--fd-toc-width) pt-12 pe-4 pb-2 max-xl:hidden" data-toc aria-labelledby="toc-title">
2951
+ <div class="fd-toc-inner">
2952
+ <h3 id="toc-title" class="fd-toc-title inline-flex items-center gap-1.5 text-sm text-fd-muted-foreground"><svg class="size-4" viewBox="0 0 24 24" aria-hidden="true" focusable="false" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 7h16"></path><path d="M4 12h16"></path><path d="M4 17h16"></path></svg>On this page</h3>
2953
+ <div class="toc-scroll">
2954
+ ${renderPixelToc(tocItems)}
2955
+ </div>
2956
+ </div>
2957
+ </nav>
2958
+ </div>
2959
+ ${searchEnabled ? renderDocsSearchMount(clientEntry) : ""}
2960
+ ${renderDocsRuntimeScripts(docs)}
2961
+ </body>
2962
+ </html>`;
2963
+ }
2964
+ __name(renderPixelDocsHtml, "renderPixelDocsHtml");
2965
+ function createFarmDocsHandler(docs, options) {
2966
+ const faviconHref = resolveFarmDocsFavicon(docs, options);
2967
+ return /* @__PURE__ */ __name(async function handleFarmDocsRequest(request) {
2968
+ if (!docs?.enabled || request.method !== "GET" && request.method !== "HEAD") return null;
2969
+ const contentDir = resolveFarmDocsContentDir(docs, options);
2970
+ const publicResponse = createFarmDocsPublicResponse(contentDir, docs, request);
2971
+ if (publicResponse) return publicResponse;
2972
+ if (!isFarmDocsRequest(docs, request)) return null;
2973
+ const page = loadPage(contentDir, docs, request);
2974
+ if (!page) return null;
2975
+ if (shouldReturnMarkdown(request)) {
2976
+ const origin = new URL(request.url).origin;
2977
+ return new Response(
2978
+ renderDocsMarkdownDocument(toFarmDocsMarkdownPage(page), {
2979
+ origin,
2980
+ llms: docs.config.llmsTxt ?? true,
2981
+ sitemap: docs.config.sitemap
2982
+ }),
2983
+ {
2984
+ status: 200,
2985
+ headers: {
2986
+ "Content-Type": "text/markdown; charset=utf-8",
2987
+ "Cache-Control": "public, max-age=60"
2988
+ }
2989
+ }
2990
+ );
2991
+ }
2992
+ return new Response(
2993
+ renderPixelDocsHtml(
2994
+ page,
2995
+ discoverFarmDocsPages(contentDir, docs),
2996
+ docs,
2997
+ resolvePixelBorderThemeCss(options),
2998
+ options.clientEntry || "/farm-client.js",
2999
+ faviconHref
3000
+ ),
3001
+ {
3002
+ status: 200,
3003
+ headers: {
3004
+ "Content-Type": "text/html; charset=utf-8",
3005
+ "Cache-Control": "public, s-maxage=60, stale-while-revalidate=300"
3006
+ }
3007
+ }
3008
+ );
3009
+ }, "handleFarmDocsRequest");
3010
+ }
3011
+ __name(createFarmDocsHandler, "createFarmDocsHandler");
3012
+
3013
+ // src/docs/api.ts
3014
+ import {
3015
+ buildDocsAgentDiscoverySpec as buildDocsAgentDiscoverySpec2,
3016
+ buildDocsConfigMap,
3017
+ buildDocsDiagnostics as buildFarmingDocsDiagnostics,
3018
+ buildDocsSitemapManifest as buildDocsSitemapManifest2,
3019
+ performDocsSearch,
3020
+ renderDocsAgentsDocument as renderDocsAgentsDocument2,
3021
+ renderDocsLlmsTxt as renderDocsLlmsTxt2,
3022
+ renderDocsMarkdownDocument as renderDocsMarkdownDocument2,
3023
+ renderDocsRobotsTxt as renderDocsRobotsTxt2,
3024
+ renderDocsSitemapMarkdown as renderDocsSitemapMarkdown2,
3025
+ renderDocsSitemapXml as renderDocsSitemapXml2,
3026
+ renderDocsSkillDocument as renderDocsSkillDocument2
3027
+ } from "@farming-labs/docs";
3028
+ function isRecord(value) {
3029
+ return typeof value === "object" && value !== null && !Array.isArray(value);
3030
+ }
3031
+ __name(isRecord, "isRecord");
3032
+ function isResolvedDocsConfig(value) {
3033
+ return isRecord(value) && typeof value.enabled === "boolean" && typeof value.entry === "string" && isRecord(value.config);
3034
+ }
3035
+ __name(isResolvedDocsConfig, "isResolvedDocsConfig");
3036
+ function isFarmDocsAPIRequest(requestOrPathname) {
3037
+ const pathname = typeof requestOrPathname === "string" ? requestOrPathname : new URL(requestOrPathname.url).pathname;
3038
+ return pathname === "/api/docs" || pathname.startsWith("/api/docs/");
3039
+ }
3040
+ __name(isFarmDocsAPIRequest, "isFarmDocsAPIRequest");
3041
+ function json(data, init = {}) {
3042
+ const headers = new Headers(init.headers);
3043
+ if (!headers.has("Content-Type")) {
3044
+ headers.set("Content-Type", "application/json");
3045
+ }
3046
+ return new Response(JSON.stringify(data), { ...init, headers });
3047
+ }
3048
+ __name(json, "json");
3049
+ function text(content, contentType, init = {}) {
3050
+ const headers = new Headers(init.headers);
3051
+ headers.set("Content-Type", contentType);
3052
+ return new Response(content, { ...init, headers });
3053
+ }
3054
+ __name(text, "text");
3055
+ function normalizeAction(value) {
3056
+ return value?.trim().toLowerCase().replace(/_/g, "-") || void 0;
3057
+ }
3058
+ __name(normalizeAction, "normalizeAction");
3059
+ function getDocsTitle2(docs) {
3060
+ return typeof docs.config.nav === "object" && docs.config.nav && "title" in docs.config.nav ? String(docs.config.nav.title || "Documentation") : "Documentation";
3061
+ }
3062
+ __name(getDocsTitle2, "getDocsTitle");
3063
+ function isDocsCloudServer(value) {
3064
+ return isRecord(value) && typeof value.handleRequest === "function";
3065
+ }
3066
+ __name(isDocsCloudServer, "isDocsCloudServer");
3067
+ function resolveDocsCloudIntegration(integration) {
3068
+ if (!integration) return void 0;
3069
+ if (isDocsCloudServer(integration)) {
3070
+ return { docsCloud: integration, routeOptions: {} };
3071
+ }
3072
+ if (!integration.docsCloud) return void 0;
3073
+ return {
3074
+ docsCloud: integration.docsCloud,
3075
+ routeOptions: {
3076
+ locale: integration.locale,
3077
+ publicBaseUrl: integration.publicBaseUrl
3078
+ }
3079
+ };
3080
+ }
3081
+ __name(resolveDocsCloudIntegration, "resolveDocsCloudIntegration");
3082
+ function isDocsCloudGetRequest(request) {
3083
+ const url = new URL(request.url);
3084
+ const cloud = normalizeAction(url.searchParams.get("cloud"));
3085
+ const action = normalizeAction(url.searchParams.get("action"));
3086
+ const format = normalizeAction(url.searchParams.get("format"));
3087
+ return cloud === "config" || cloud === "public-config" || action === "cloud-config" || action === "docs-cloud-config" || format === "cloud-config" || format === "docs-cloud-config";
3088
+ }
3089
+ __name(isDocsCloudGetRequest, "isDocsCloudGetRequest");
3090
+ function isDocsCloudAction(action) {
3091
+ return Boolean(
3092
+ action && ["analytics", "track", "track-event", "event", "ask-ai", "ai", "chat", "docs-cloud"].includes(
3093
+ action
3094
+ )
3095
+ );
3096
+ }
3097
+ __name(isDocsCloudAction, "isDocsCloudAction");
3098
+ async function readJson(request) {
3099
+ try {
3100
+ return await request.clone().json();
3101
+ } catch {
3102
+ return void 0;
3103
+ }
3104
+ }
3105
+ __name(readJson, "readJson");
3106
+ async function isDocsCloudPostRequest(request) {
3107
+ const url = new URL(request.url);
3108
+ const cloud = normalizeAction(url.searchParams.get("cloud"));
3109
+ const action = normalizeAction(url.searchParams.get("action"));
3110
+ if (isDocsCloudAction(cloud) || isDocsCloudAction(action)) return true;
3111
+ const body = await readJson(request);
3112
+ if (!isRecord(body)) return false;
3113
+ const bodyAction = normalizeAction(typeof body.action === "string" ? body.action : void 0);
3114
+ if (isDocsCloudAction(bodyAction)) return true;
3115
+ if (typeof body.type === "string") return true;
3116
+ if (isRecord(body.event) && typeof body.event.type === "string") return true;
3117
+ if (isRecord(body.payload) && typeof body.payload.type === "string") return true;
3118
+ return false;
3119
+ }
3120
+ __name(isDocsCloudPostRequest, "isDocsCloudPostRequest");
3121
+ function normalizeDocsApiSlug(value, docs) {
3122
+ const entry = docs.entry.replace(/^\/+|\/+$/g, "");
3123
+ let slug = (value || "").trim().replace(/^\/+|\/+$/g, "");
3124
+ if (entry && slug === entry) return "";
3125
+ if (entry && slug.startsWith(`${entry}/`)) {
3126
+ slug = slug.slice(entry.length + 1);
3127
+ }
3128
+ return decodeURIComponent(slug).replace(/\.(mdx?|markdown)$/i, "");
3129
+ }
3130
+ __name(normalizeDocsApiSlug, "normalizeDocsApiSlug");
3131
+ function getDocsAPIPathTarget(request) {
3132
+ const pathname = new URL(request.url).pathname.replace(/\/+$/, "") || "/";
3133
+ const prefix = "/api/docs";
3134
+ if (pathname !== prefix && !pathname.startsWith(`${prefix}/`)) return {};
3135
+ const rawValue = pathname === prefix ? "" : pathname.slice(prefix.length + 1);
3136
+ const value = rawValue.replace(/^\/+|\/+$/g, "");
3137
+ const normalizedValue = normalizeAction(value);
3138
+ if (!value) return {};
3139
+ if (normalizedValue === "agent" || normalizedValue === "agent.json" || normalizedValue === "agent/spec") {
3140
+ return { format: "agent-spec" };
3141
+ }
3142
+ if (normalizedValue === "agents" || normalizedValue === "agents.md" || normalizedValue === "agent.md") {
3143
+ return { format: "agents" };
3144
+ }
3145
+ if (normalizedValue === "skill" || normalizedValue === "skill.md") return { format: "skill" };
3146
+ if (normalizedValue === "llms.txt") return { format: "llms" };
3147
+ if (normalizedValue === "llms-full.txt") return { format: "llms-full" };
3148
+ if (normalizedValue === "sitemap.md") return { format: "sitemap-md" };
3149
+ if (normalizedValue === "sitemap.xml") return { format: "sitemap-xml" };
3150
+ if (normalizedValue === "robots.txt") return { format: "robots" };
3151
+ if (/\.(mdx?|markdown)$/i.test(value)) return { format: "markdown", slug: value };
3152
+ return { slug: value };
3153
+ }
3154
+ __name(getDocsAPIPathTarget, "getDocsAPIPathTarget");
3155
+ function getDocsAPIFormat(request) {
3156
+ const url = new URL(request.url);
3157
+ return normalizeAction(url.searchParams.get("format") || url.searchParams.get("type")) || getDocsAPIPathTarget(request).format;
3158
+ }
3159
+ __name(getDocsAPIFormat, "getDocsAPIFormat");
3160
+ function getDocsDescription2(docs) {
3161
+ return docs.config.metadata?.description;
3162
+ }
3163
+ __name(getDocsDescription2, "getDocsDescription");
3164
+ function getLoadedDocsPages2(context) {
3165
+ return discoverFarmDocsPages(context.contentDir, context.docs).map((page) => loadFarmDocsPage(context.contentDir, context.docs, page.slug)).filter((page) => Boolean(page));
3166
+ }
3167
+ __name(getLoadedDocsPages2, "getLoadedDocsPages");
3168
+ function toDocsSourcePage(page) {
3169
+ return {
3170
+ ...toFarmDocsMarkdownPage(page),
3171
+ sourcePath: page.sourcePath
3172
+ };
3173
+ }
3174
+ __name(toDocsSourcePage, "toDocsSourcePage");
3175
+ function toDocsSitemapPage2(page) {
3176
+ return {
3177
+ ...toFarmDocsMarkdownPage(page),
3178
+ sourcePath: page.sourcePath
3179
+ };
3180
+ }
3181
+ __name(toDocsSitemapPage2, "toDocsSitemapPage");
3182
+ function toDocsLlmsPage2(page) {
3183
+ return toFarmDocsMarkdownPage(page);
3184
+ }
3185
+ __name(toDocsLlmsPage2, "toDocsLlmsPage");
3186
+ function getDocsLlmsOptions2(context, request) {
3187
+ const configured = isRecord(context.docs.config.llmsTxt) ? context.docs.config.llmsTxt : {};
3188
+ return {
3189
+ enabled: true,
3190
+ baseUrl: new URL(request.url).origin,
3191
+ siteTitle: getDocsTitle2(context.docs),
3192
+ siteDescription: getDocsDescription2(context.docs),
3193
+ ...configured
3194
+ };
3195
+ }
3196
+ __name(getDocsLlmsOptions2, "getDocsLlmsOptions");
3197
+ function getDocsDiscoveryOptions2(context, request) {
3198
+ const origin = new URL(request.url).origin;
3199
+ return {
3200
+ origin,
3201
+ entry: context.docs.entry,
3202
+ i18n: null,
3203
+ search: context.docs.config.search ?? true,
3204
+ mcp: {
3205
+ enabled: false,
3206
+ route: "/api/docs/mcp",
3207
+ name: `${getDocsTitle2(context.docs)} MCP`,
3208
+ version: "1",
3209
+ tools: {
3210
+ listDocs: false,
3211
+ listPages: false,
3212
+ readPage: false,
3213
+ searchDocs: false,
3214
+ getNavigation: false,
3215
+ getCodeExamples: false,
3216
+ getConfigSchema: false
3217
+ }
3218
+ },
3219
+ feedback: void 0,
3220
+ llms: getDocsLlmsOptions2(context, request),
3221
+ sitemap: context.docs.config.sitemap ?? true,
3222
+ robots: context.docs.config.robots ?? true,
3223
+ openapi: context.docs.config.apiReference,
3224
+ markdown: {
3225
+ acceptHeader: true,
3226
+ signatureAgentHeader: true
3227
+ }
3228
+ };
3229
+ }
3230
+ __name(getDocsDiscoveryOptions2, "getDocsDiscoveryOptions");
3231
+ function buildSitemapManifest(context, request) {
3232
+ const origin = new URL(request.url).origin;
3233
+ return buildDocsSitemapManifest2({
3234
+ pages: getLoadedDocsPages2(context).map(toDocsSitemapPage2),
3235
+ entry: context.docs.entry,
3236
+ siteTitle: getDocsTitle2(context.docs),
3237
+ baseUrl: origin
3238
+ });
3239
+ }
3240
+ __name(buildSitemapManifest, "buildSitemapManifest");
3241
+ function renderLlmsTxt(context, request, full) {
3242
+ const generated = renderDocsLlmsTxt2(
3243
+ getLoadedDocsPages2(context).map(toDocsLlmsPage2),
3244
+ getDocsLlmsOptions2(context, request)
3245
+ );
3246
+ return full ? generated.llmsFullTxt : generated.llmsTxt;
3247
+ }
3248
+ __name(renderLlmsTxt, "renderLlmsTxt");
3249
+ function renderSkillDocument(context, request) {
3250
+ const farmAliases = [
3251
+ "## Farm API Route Aliases",
3252
+ "",
3253
+ "- Search JSON: /api/docs?query=<term>",
3254
+ "- Config JSON: /api/docs?format=config",
3255
+ "- Markdown by query: /api/docs?format=markdown&path=<slug>",
3256
+ "- Markdown by path: /api/docs/<slug>.md",
3257
+ "- LLM summary: /api/docs?format=llms",
3258
+ "- Full LLM document: /api/docs?format=llms-full",
3259
+ "- Sitemap XML: /api/docs?format=sitemap-xml",
3260
+ "- Agent spec JSON: /api/docs/agent/spec"
3261
+ ].join("\n");
3262
+ return `${renderDocsSkillDocument2(getDocsDiscoveryOptions2(context, request)).trim()}
3263
+
3264
+ ${farmAliases}
3265
+ `;
3266
+ }
3267
+ __name(renderSkillDocument, "renderSkillDocument");
3268
+ function renderAgentsDocument(context, request) {
3269
+ return `${renderDocsAgentsDocument2(getDocsDiscoveryOptions2(context, request)).trim()}
3270
+ `;
3271
+ }
3272
+ __name(renderAgentsDocument, "renderAgentsDocument");
3273
+ function buildAgentSpec(context, request) {
3274
+ const url = new URL(request.url);
3275
+ const origin = url.origin;
3276
+ const pages = discoverFarmDocsPages(context.contentDir, context.docs);
3277
+ const spec = buildDocsAgentDiscoverySpec2(getDocsDiscoveryOptions2(context, request));
3278
+ const title = getDocsTitle2(context.docs);
3279
+ return {
3280
+ ...spec,
3281
+ name: title,
3282
+ site: {
3283
+ ...spec.site,
3284
+ title,
3285
+ description: getDocsDescription2(context.docs),
3286
+ entry: context.docs.entry
3287
+ },
3288
+ entry: context.docs.entry,
3289
+ routes: {
3290
+ docs: `${origin}${context.docs.entry}`,
3291
+ config: `${origin}/api/docs?format=config`,
3292
+ search: `${origin}/api/docs?query=<term>`,
3293
+ markdown: `${origin}/api/docs/<slug>.md`,
3294
+ markdownQuery: `${origin}/api/docs?format=markdown&path=<slug>`,
3295
+ llms: `${origin}/api/docs?format=llms`,
3296
+ llmsFull: `${origin}/api/docs?format=llms-full`,
3297
+ sitemapXml: `${origin}/api/docs?format=sitemap-xml`,
3298
+ sitemapMarkdown: `${origin}/api/docs?format=sitemap-md`,
3299
+ robots: `${origin}/api/docs?format=robots`,
3300
+ skill: `${origin}/api/docs?format=skill`,
3301
+ agents: `${origin}/api/docs?format=agents`,
3302
+ agentSpec: `${origin}/api/docs/agent/spec`
3303
+ },
3304
+ capabilities: {
3305
+ ...spec.capabilities,
3306
+ search: spec.capabilities.search,
3307
+ markdown: spec.capabilities.markdownRoutes,
3308
+ llms: spec.capabilities.llms,
3309
+ sitemap: spec.capabilities.sitemap,
3310
+ robots: spec.capabilities.robots,
3311
+ post: false
3312
+ },
3313
+ pages
3314
+ };
3315
+ }
3316
+ __name(buildAgentSpec, "buildAgentSpec");
3317
+ function buildDiagnostics(context) {
3318
+ const pages = discoverFarmDocsPages(context.contentDir, context.docs);
3319
+ const diagnostics = buildFarmingDocsDiagnostics(context.docs.config, {
3320
+ entry: context.docs.entry,
3321
+ mcp: {
3322
+ enabled: false,
3323
+ route: "/api/docs/mcp",
3324
+ name: `${getDocsTitle2(context.docs)} MCP`,
3325
+ version: "1",
3326
+ tools: {
3327
+ listDocs: false,
3328
+ listPages: false,
3329
+ readPage: false,
3330
+ searchDocs: false,
3331
+ getNavigation: false,
3332
+ getCodeExamples: false,
3333
+ getConfigSchema: false
3334
+ }
3335
+ }
3336
+ });
3337
+ return {
3338
+ ...diagnostics,
3339
+ enabled: context.docs.enabled,
3340
+ entry: context.docs.entry,
3341
+ root: context.root,
3342
+ srcDir: context.srcDir,
3343
+ contentDir: context.contentDir,
3344
+ configPath: context.docs.configPath || null,
3345
+ pageCount: pages.length,
3346
+ pages
3347
+ };
3348
+ }
3349
+ __name(buildDiagnostics, "buildDiagnostics");
3350
+ async function searchDocs(context, request, query) {
3351
+ const loadedPages = getLoadedDocsPages2(context);
3352
+ const sourcePages = loadedPages.map(toDocsSourcePage);
3353
+ const sourcePageByUrl = new Map(sourcePages.map((page) => [page.url, page]));
3354
+ const resultLimit = isRecord(context.docs.config.search) && typeof context.docs.config.search.maxResults === "number" ? context.docs.config.search.maxResults : void 0;
3355
+ const results = await performDocsSearch({
3356
+ pages: sourcePages,
3357
+ query,
3358
+ search: context.docs.config.search ?? true,
3359
+ pathname: new URL(request.url).pathname,
3360
+ siteTitle: getDocsTitle2(context.docs),
3361
+ limit: resultLimit
3362
+ });
3363
+ return results.map((result) => {
3364
+ const pageUrl = result.url.split("#")[0];
3365
+ const page = sourcePageByUrl.get(pageUrl);
3366
+ return {
3367
+ ...result,
3368
+ title: page?.title || result.content,
3369
+ href: page?.url || pageUrl,
3370
+ description: result.description || page?.description
3371
+ };
3372
+ });
3373
+ }
3374
+ __name(searchDocs, "searchDocs");
3375
+ async function resolveAPIContext(options) {
3376
+ const runtimeConfig = globalThis.__FARM_DOCS_RUNTIME_CONFIG__;
3377
+ const root = options.rootDir || options.root || runtimeConfig?.root || process.cwd();
3378
+ const srcDir = options.srcDir || runtimeConfig?.srcDir || "src";
3379
+ const canUseRuntimeDocs = options.docs === void 0 && options.config === void 0 && options.configPath === void 0 && options.entry === void 0 && options.docsPath === void 0 && options.contentDir === void 0 && options.root === void 0 && options.rootDir === void 0 && options.srcDir === void 0;
3380
+ const docsInput = options.docs ?? (canUseRuntimeDocs ? runtimeConfig?.docs : void 0) ?? {
3381
+ enabled: true,
3382
+ entry: options.entry,
3383
+ docsPath: options.docsPath,
3384
+ contentDir: options.contentDir,
3385
+ config: options.config,
3386
+ configPath: options.configPath
3387
+ };
3388
+ const docs = isResolvedDocsConfig(docsInput) ? docsInput : await resolveDocsConfig(docsInput, { root, srcDir });
3389
+ return {
3390
+ root,
3391
+ srcDir,
3392
+ docs,
3393
+ contentDir: resolveFarmDocsContentDir(docs, { root, srcDir })
3394
+ };
3395
+ }
3396
+ __name(resolveAPIContext, "resolveAPIContext");
3397
+ async function handleDocsAPIGet(request, context) {
3398
+ if (!context.docs.enabled) {
3399
+ return json({ error: "Docs are disabled" }, { status: 404 });
3400
+ }
3401
+ const url = new URL(request.url);
3402
+ const format = getDocsAPIFormat(request);
3403
+ const pathTarget = getDocsAPIPathTarget(request);
3404
+ if (format === "config" || format === "docs-config") {
3405
+ return json({
3406
+ entry: context.docs.entry,
3407
+ contentDir: context.docs.contentDir || context.docs.config.contentDir || null,
3408
+ config: context.docs.config,
3409
+ map: buildDocsConfigMap(context.docs.config, {
3410
+ file: context.docs.configPath || "farm.config.ts"
3411
+ })
3412
+ });
3413
+ }
3414
+ if (format === "skill")
3415
+ return text(renderSkillDocument(context, request), "text/markdown; charset=utf-8");
3416
+ if (format === "agents")
3417
+ return text(renderAgentsDocument(context, request), "text/markdown; charset=utf-8");
3418
+ if (format === "agent" || format === "agent-spec") return json(buildAgentSpec(context, request));
3419
+ if (format === "diagnostics") return json(buildDiagnostics(context));
3420
+ if (format === "llms")
3421
+ return text(renderLlmsTxt(context, request, false), "text/plain; charset=utf-8");
3422
+ if (format === "llms-full")
3423
+ return text(renderLlmsTxt(context, request, true), "text/plain; charset=utf-8");
3424
+ if (format === "sitemap-md") {
3425
+ return text(
3426
+ renderDocsSitemapMarkdown2(buildSitemapManifest(context, request), {
3427
+ includeDescriptions: true
3428
+ }),
3429
+ "text/markdown; charset=utf-8"
3430
+ );
3431
+ }
3432
+ if (format === "sitemap-xml" || format === "sitemap") {
3433
+ const origin = new URL(request.url).origin;
3434
+ return text(
3435
+ renderDocsSitemapXml2(buildSitemapManifest(context, request), {
3436
+ baseUrl: origin,
3437
+ includeLastmod: true
3438
+ }),
3439
+ "application/xml; charset=utf-8"
3440
+ );
3441
+ }
3442
+ if (format === "robots") {
3443
+ return text(
3444
+ renderDocsRobotsTxt2({
3445
+ entry: context.docs.entry,
3446
+ sitemap: context.docs.config.sitemap ?? true,
3447
+ robots: context.docs.config.robots ?? true,
3448
+ baseUrl: new URL(request.url).origin
3449
+ }),
3450
+ "text/plain; charset=utf-8"
3451
+ );
3452
+ }
3453
+ if (format === "markdown" || url.pathname.endsWith(".md")) {
3454
+ const pathParam = url.searchParams.get("path") || url.searchParams.get("slug");
3455
+ const slug = normalizeDocsApiSlug(pathParam ?? pathTarget.slug ?? "", context.docs);
3456
+ const page = loadFarmDocsPage(context.contentDir, context.docs, slug);
3457
+ if (!page) return text("Docs page not found\n", "text/plain; charset=utf-8", { status: 404 });
3458
+ return text(
3459
+ renderDocsMarkdownDocument2(toFarmDocsMarkdownPage(page), {
3460
+ origin: new URL(request.url).origin,
3461
+ llms: getDocsLlmsOptions2(context, request),
3462
+ sitemap: context.docs.config.sitemap
3463
+ }),
3464
+ "text/markdown; charset=utf-8"
3465
+ );
3466
+ }
3467
+ const query = url.searchParams.get("query") || url.searchParams.get("q") || "";
3468
+ if (!query.trim()) return json([]);
3469
+ return json(await searchDocs(context, request, query));
3470
+ }
3471
+ __name(handleDocsAPIGet, "handleDocsAPIGet");
3472
+ function createDocsAPI(options = {}, cloudIntegration) {
3473
+ let contextPromise;
3474
+ const getContext = /* @__PURE__ */ __name(() => {
3475
+ contextPromise ?? (contextPromise = resolveAPIContext(options));
3476
+ return contextPromise;
3477
+ }, "getContext");
3478
+ const integration = resolveDocsCloudIntegration(cloudIntegration);
3479
+ return {
3480
+ async GET(request) {
3481
+ if (integration && isDocsCloudGetRequest(request)) {
3482
+ return integration.docsCloud.handleRequest(request, integration.routeOptions);
3483
+ }
3484
+ return handleDocsAPIGet(request, await getContext());
3485
+ },
3486
+ async POST(request) {
3487
+ if (integration && await isDocsCloudPostRequest(request)) {
3488
+ return integration.docsCloud.handleRequest(request, integration.routeOptions);
3489
+ }
3490
+ return json(
3491
+ {
3492
+ error: "AI is not enabled for this Farm docs API route yet."
3493
+ },
3494
+ { status: 501 }
3495
+ );
3496
+ }
3497
+ };
3498
+ }
3499
+ __name(createDocsAPI, "createDocsAPI");
3500
+ function createFarmDocsAPIHandler(options = {}, cloudIntegration) {
3501
+ const handlers = createDocsAPI(options, cloudIntegration);
3502
+ return /* @__PURE__ */ __name(async function handleFarmDocsAPIRequest(request) {
3503
+ if (!isFarmDocsAPIRequest(request)) return null;
3504
+ const method = request.method.toUpperCase();
3505
+ if (method === "GET" || method === "HEAD") {
3506
+ return handlers.GET(request);
3507
+ }
3508
+ if (method === "POST") {
3509
+ return handlers.POST(request);
3510
+ }
3511
+ return json(
3512
+ {
3513
+ error: "Method Not Allowed"
3514
+ },
3515
+ {
3516
+ status: 405,
3517
+ headers: {
3518
+ Allow: "GET, HEAD, POST"
3519
+ }
3520
+ }
3521
+ );
3522
+ }, "handleFarmDocsAPIRequest");
3523
+ }
3524
+ __name(createFarmDocsAPIHandler, "createFarmDocsAPIHandler");
3525
+
3526
+ export {
3527
+ FARM_DOCS_LAST_MODIFIED_MANIFEST,
3528
+ createFarmDocsLastModifiedManifest,
3529
+ isFarmDocsRequest,
3530
+ resolveFarmDocsContentDir,
3531
+ getFarmDocsRouteTypeEntries,
3532
+ getFarmDocsDocumentNavigationMatchers,
3533
+ loadFarmDocsPage,
3534
+ discoverFarmDocsPages,
3535
+ createFarmDocsHandler,
3536
+ isFarmDocsAPIRequest,
3537
+ createDocsAPI,
3538
+ createFarmDocsAPIHandler
3539
+ };
3540
+ //# sourceMappingURL=chunk-ME4MO2RJ.mjs.map