{"version":3,"sources":["../src/docs/search-client.ts"],"sourcesContent":["import { existsSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\nimport type { FarmDocsResolvedConfig } from \"./types\";\n\nexport function isFarmDocsSearchEnabled(docs: FarmDocsResolvedConfig | undefined): boolean {\n  if (!docs?.enabled) return false;\n\n  const search = docs.config.search;\n  if (search === false) return false;\n  return !(search && typeof search === \"object\" && search.enabled === false);\n}\n\nexport function resolveFarmDocsSearchClientModule(root: string): string | undefined {\n  try {\n    const requireFromApp = createRequire(path.join(path.resolve(root), \"package.json\"));\n    const themeEntry = requireFromApp.resolve(\"@farming-labs/theme\");\n    const commandSearchModule = path.join(path.dirname(themeEntry), \"docs-command-search.mjs\");\n    if (existsSync(commandSearchModule)) return commandSearchModule;\n  } catch {\n    // The public package entry remains a compatible fallback.\n  }\n\n  return undefined;\n}\n\nexport function generateFarmDocsSearchBootstrapRuntime(): string {\n  return `(()=>{if(window.__farmDocsSearchBootstrap)return;window.__farmDocsSearchBootstrap=true;const queue=(trigger,event)=>{if(window.__FARM_DOCS_SEARCH_BRIDGE_ACTIVE__)return;event.preventDefault();event.stopPropagation();event.stopImmediatePropagation();window.__FARM_DOCS_SEARCH_PENDING__=trigger;window.__FARM_MOUNT_DOCS_SEARCH__?.()};document.addEventListener(\"click\",(event)=>{const target=event.target instanceof Element?event.target.closest(\"[data-search-full]\"):null;if(target)queue(\"button\",event)},true);document.addEventListener(\"keydown\",(event)=>{if((event.metaKey||event.ctrlKey)&&event.key.toLowerCase()===\"k\")queue(\"keyboard\",event)},true)})();`;\n}\n\nexport function generateFarmDocsSearchClientRuntime(enabled: boolean, moduleId?: string): string {\n  if (!enabled || !moduleId) {\n    return `\nfunction isFarmDocsSearchPage() {\n  return false;\n}\n\nasync function mountFarmDocsSearch() {\n  return false;\n}\n`;\n  }\n\n  return `\nlet farmDocsSearchRoot = null;\nlet farmDocsSearchContainer = null;\nlet farmDocsSearchModulePromise = null;\nlet farmDocsSearchPendingTrigger = window.__FARM_DOCS_SEARCH_PENDING__ === 'keyboard'\n  ? 'keyboard'\n  : window.__FARM_DOCS_SEARCH_PENDING__\n    ? 'button'\n    : null;\nlet farmDocsSearchReady = false;\n\nfunction isFarmDocsSearchPage() {\n  return document.querySelector('[data-farm-docs-search-root]') instanceof HTMLElement;\n}\n\nfunction replayFarmDocsSearchOpen() {\n  const pendingTrigger = farmDocsSearchPendingTrigger;\n  farmDocsSearchPendingTrigger = null;\n  window.__FARM_DOCS_SEARCH_PENDING__ = null;\n  if (!pendingTrigger) return;\n\n  queueMicrotask(() => {\n    if (pendingTrigger === 'keyboard') {\n      document.dispatchEvent(\n        new KeyboardEvent('keydown', {\n          key: 'k',\n          metaKey: true,\n          bubbles: true,\n          cancelable: true,\n        }),\n      );\n    } else {\n      const trigger = document.querySelector('[data-search-full]');\n      if (trigger instanceof HTMLElement) trigger.click();\n    }\n  });\n}\n\nfunction FarmDocsSearchBridge({ component, api }) {\n  React.useEffect(() => {\n    farmDocsSearchReady = true;\n    replayFarmDocsSearchOpen();\n    return () => {\n      farmDocsSearchReady = false;\n    };\n  }, []);\n\n  return React.createElement(component, { api });\n}\n\nfunction queueFarmDocsSearchOpen(trigger, event) {\n  if (farmDocsSearchReady) return;\n  event.preventDefault();\n  event.stopPropagation();\n  event.stopImmediatePropagation();\n  farmDocsSearchPendingTrigger = trigger;\n  window.__FARM_DOCS_SEARCH_PENDING__ = trigger;\n  void mountFarmDocsSearch();\n}\n\ndocument.addEventListener(\n  'click',\n  (event) => {\n    const target = event.target instanceof Element\n      ? event.target.closest('[data-search-full]')\n      : null;\n    if (target) queueFarmDocsSearchOpen('button', event);\n  },\n  true,\n);\n\ndocument.addEventListener(\n  'keydown',\n  (event) => {\n    if ((event.metaKey || event.ctrlKey) && event.key.toLowerCase() === 'k') {\n      queueFarmDocsSearchOpen('keyboard', event);\n    }\n  },\n  true,\n);\n\nwindow.__FARM_DOCS_SEARCH_BRIDGE_ACTIVE__ = true;\n\nasync function mountFarmDocsSearch() {\n  const container = document.querySelector('[data-farm-docs-search-root]');\n  if (!(container instanceof HTMLElement)) return false;\n  if (farmDocsSearchContainer === container && farmDocsSearchRoot) return true;\n\n  try {\n    farmDocsSearchModulePromise ||= import(${JSON.stringify(moduleId)});\n    const { DocsCommandSearch } = await farmDocsSearchModulePromise;\n    if (!container.isConnected) return false;\n\n    if (farmDocsSearchRoot) {\n      farmDocsSearchReady = false;\n      try {\n        farmDocsSearchRoot.unmount();\n      } catch {}\n    }\n\n    farmDocsSearchContainer = container;\n    farmDocsSearchRoot = createRoot(container);\n    farmDocsSearchRoot.render(\n      React.createElement(FarmDocsSearchBridge, {\n        component: DocsCommandSearch,\n        api: container.dataset.api || '/api/docs',\n      }),\n    );\n    return true;\n  } catch (error) {\n    farmDocsSearchModulePromise = null;\n    console.error('[Farm.js] Could not load docs search:', error);\n    return false;\n  }\n}\n\nwindow.__FARM_MOUNT_DOCS_SEARCH__ = mountFarmDocsSearch;\n`;\n}\n"],"mappings":";;;;;AAAA,SAAS,kBAAkB;AAC3B,SAAS,qBAAqB;AAC9B,OAAO,UAAU;AAGV,SAAS,wBAAwB,MAAmD;AACzF,MAAI,CAAC,MAAM,QAAS,QAAO;AAE3B,QAAM,SAAS,KAAK,OAAO;AAC3B,MAAI,WAAW,MAAO,QAAO;AAC7B,SAAO,EAAE,UAAU,OAAO,WAAW,YAAY,OAAO,YAAY;AACtE;AANgB;AAQT,SAAS,kCAAkC,MAAkC;AAClF,MAAI;AACF,UAAM,iBAAiB,cAAc,KAAK,KAAK,KAAK,QAAQ,IAAI,GAAG,cAAc,CAAC;AAClF,UAAM,aAAa,eAAe,QAAQ,qBAAqB;AAC/D,UAAM,sBAAsB,KAAK,KAAK,KAAK,QAAQ,UAAU,GAAG,yBAAyB;AACzF,QAAI,WAAW,mBAAmB,EAAG,QAAO;AAAA,EAC9C,QAAQ;AAAA,EAER;AAEA,SAAO;AACT;AAXgB;AAaT,SAAS,yCAAiD;AAC/D,SAAO;AACT;AAFgB;AAIT,SAAS,oCAAoC,SAAkB,UAA2B;AAC/F,MAAI,CAAC,WAAW,CAAC,UAAU;AACzB,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAST;AAEA,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6CAyFoC,KAAK,UAAU,QAAQ,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6BrE;AAnIgB;","names":[]}