@buoy-gg/core 7.0.77 → 7.0.79

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 (60) hide show
  1. package/bundlers/vite.d.ts +1 -1
  2. package/bundlers/vite.mjs +3 -3
  3. package/lib/commonjs/earlyNetwork.js +1 -1
  4. package/lib/commonjs/floatingMenu/AppHost.js +1 -1
  5. package/lib/commonjs/floatingMenu/AppHost.web.js +1 -1
  6. package/lib/commonjs/floatingMenu/AppHostLogic.js +1 -1
  7. package/lib/commonjs/floatingMenu/DevToolsSettingsModal.shared.js +1 -1
  8. package/lib/commonjs/floatingMenu/FloatingDevTools.js +1 -1
  9. package/lib/commonjs/floatingMenu/FloatingDevTools.web.js +1 -1
  10. package/lib/commonjs/floatingMenu/autoDiscoverPresets.js +1 -1
  11. package/lib/commonjs/floatingMenu/autoExternalSync.js +1 -1
  12. package/lib/commonjs/floatingMenu/backTarget.js +1 -0
  13. package/lib/commonjs/floatingMenu/capacitorBackButton.js +1 -1
  14. package/lib/commonjs/floatingMenu/dial/DialDevTools.js +1 -1
  15. package/lib/commonjs/floatingMenu/dial/DialDevTools.web.js +1 -1
  16. package/lib/commonjs/floatingMenu/externalSyncGate.js +1 -1
  17. package/lib/commonjs/floatingMenu/hardwareBack.js +1 -0
  18. package/lib/commonjs/version.js +1 -1
  19. package/lib/module/earlyNetwork.js +1 -1
  20. package/lib/module/floatingMenu/AppHost.js +1 -1
  21. package/lib/module/floatingMenu/AppHost.web.js +1 -1
  22. package/lib/module/floatingMenu/AppHostLogic.js +1 -1
  23. package/lib/module/floatingMenu/DevToolsSettingsModal.shared.js +1 -1
  24. package/lib/module/floatingMenu/FloatingDevTools.js +1 -1
  25. package/lib/module/floatingMenu/FloatingDevTools.web.js +1 -1
  26. package/lib/module/floatingMenu/autoDiscoverPresets.js +1 -1
  27. package/lib/module/floatingMenu/autoExternalSync.js +1 -1
  28. package/lib/module/floatingMenu/backTarget.js +1 -0
  29. package/lib/module/floatingMenu/capacitorBackButton.js +1 -1
  30. package/lib/module/floatingMenu/dial/DialDevTools.js +1 -1
  31. package/lib/module/floatingMenu/dial/DialDevTools.web.js +1 -1
  32. package/lib/module/floatingMenu/externalSyncGate.js +1 -1
  33. package/lib/module/floatingMenu/hardwareBack.js +1 -0
  34. package/lib/module/version.js +1 -1
  35. package/lib/typescript/commonjs/earlyNetwork.d.ts +19 -4
  36. package/lib/typescript/commonjs/floatingMenu/AppHostLogic.d.ts +6 -0
  37. package/lib/typescript/commonjs/floatingMenu/backTarget.d.ts +17 -0
  38. package/lib/typescript/commonjs/floatingMenu/capacitorBackButton.d.ts +5 -3
  39. package/lib/typescript/commonjs/floatingMenu/defaultConfig.d.ts +1 -1
  40. package/lib/typescript/commonjs/floatingMenu/hardwareBack.d.ts +8 -0
  41. package/lib/typescript/commonjs/version.d.ts +1 -1
  42. package/lib/typescript/module/earlyNetwork.d.ts +19 -4
  43. package/lib/typescript/module/floatingMenu/AppHostLogic.d.ts +6 -0
  44. package/lib/typescript/module/floatingMenu/backTarget.d.ts +17 -0
  45. package/lib/typescript/module/floatingMenu/capacitorBackButton.d.ts +5 -3
  46. package/lib/typescript/module/floatingMenu/defaultConfig.d.ts +1 -1
  47. package/lib/typescript/module/floatingMenu/hardwareBack.d.ts +8 -0
  48. package/lib/typescript/module/version.d.ts +1 -1
  49. package/lib/web/auto.mjs +1 -1
  50. package/lib/web/chunks/{FloatingDevTools.web-IIOOVSUC.mjs → FloatingDevTools.web-5EMC7ZIE.mjs} +1 -1
  51. package/lib/web/chunks/FloatingDevTools.web-QLTO5FXP.mjs +1 -0
  52. package/lib/web/chunks/chunk-EFTCKGMC.mjs +10 -0
  53. package/lib/web/chunks/chunk-JXTHZBMM.mjs +10 -0
  54. package/lib/web/chunks/chunk-OXRZOHYP.mjs +1 -0
  55. package/lib/web/index.mjs +1 -1
  56. package/lib/web/register-network.mjs +1 -1
  57. package/lib/web/register.mjs +1 -1
  58. package/package.json +5 -5
  59. package/lib/web/chunks/chunk-5EUMNDI5.mjs +0 -1
  60. package/lib/web/chunks/chunk-LAJ3HKAL.mjs +0 -10
@@ -44,7 +44,7 @@ export declare function findInstalledTools(root: string, options?: { exclude?: s
44
44
  missingWeb: string[];
45
45
  };
46
46
  export declare function installedToolsModule(found: { id: string; key: string }[], options?: { assetList?: string }): string;
47
- export declare function injectRegister(html: string, hook?: string): string | undefined;
47
+ export declare function injectRegister(html: string, hook?: string | string[]): string | undefined;
48
48
  export declare function earlyHook(root: string, register?: boolean | 'react' | 'network'): string | undefined;
49
49
  /** True when the app's package.json asks for Solid 2, where Buoy stays off for now. */
50
50
  export declare function wantsSolid2(root: string): boolean;
package/bundlers/vite.mjs CHANGED
@@ -1,6 +1,6 @@
1
- import{existsSync as x,readFileSync as k,realpathSync as _}from"node:fs";import{createRequire as C}from"node:module";import c from"node:path";export function missingReactNativeWeb(e=import.meta.url){try{C(e).resolve("react-native-web");return false}catch{return true}}const L=[["network","network"],["storage","storage"],["events","events"],["console","console"],["env","env"],["redux","redux"],["zustand","zustand"],["jotai","jotai"],["react-query","react-query"],["route-events","route-events"],["time-machine","time-machine"],["clock","clock"],["lifecycle","lifecycle"],["location","location"],["permissions","permissions"],["notifications","push-notifications"],["scenarios","scenarios"],["sentry","sentry"],["ask-buoy","ask-buoy"],["impersonate","impersonate"],["perf-monitor","perf-monitor"],["js-top","js-top"],["highlight-updates","highlight-updates"],["debug-borders","debug-borders"],["images","images"],["assets","assets"],["image-overlay","image-overlay"],["tv-remote","tv-remote"],["focus-inspector","focus-inspector"],["external-sync","external-sync"]];const O="@buoy-gg/core/web/installed-tools";const D="@buoy-gg/core/web/register";const W="@buoy-gg/core/web/register-network";const N="\0buoy:installed-tools";const U="@buoy-gg/solid";const z="@buoy-gg/solid/register";const B=["solid-js","solid-js/web","solid-js/store"];const H="#buoy-solid-auto";const J="\0buoy:solid-links";const M=["@buoy-gg/solid","@buoy-gg/solid/register","@buoy-gg/solid/router","@buoy-gg/solid/store","@buoy-gg/solid/highlights"];const v="@buoy-gg/vue";const P="@buoy-gg/vue/register";const A=[{name:"solid",pkg:U,register:z,dedupe:()=>B},{name:"vue",pkg:v,register:P,dedupe:e=>["vue",...e["@tanstack/vue-query"]?["@tanstack/query-core"]:[]]}];export function frameworkHost(e){const t=S(e);return A.find(n=>t[n.pkg])}function I(e){for(let t=e;;t=c.dirname(t)){const n=c.join(t,"package.json");if(x(n))return n;if(c.dirname(t)===t)return void 0}}function S(e){const t=I(e);try{const n=t?JSON.parse(k(t,"utf8")):{};return{...n.dependencies,...n.devDependencies,...n.optionalDependencies,...n.peerDependencies}}catch{return{}}}export function wantsSolid2(e){const t=String(S(e)["solid-js"]??"");return t==="next"||/^[\s^~>=v]*2(?:\.|$)/.test(t)}export function earlyHook(e,t=true){if(t===false)return void 0;if(t==="react")return D;if(t==="network")return W;return frameworkHost(e)?.register??D}export function disabledEntry(e,t){const[n,o,...s]=t.split("/");if(n!=="@buoy-gg"||!o)return void 0;const r=c.join(E(e,`${n}/${o}`)??"","package.json");if(!x(r))return void 0;try{const i=JSON.parse(k(r,"utf8")).exports?.[s.length?`./${s.join("/")}`:"."];const a=i&&typeof i==="object"?i["buoy-disabled"]:void 0;return typeof a==="string"?c.join(c.dirname(r),a):void 0}catch{return void 0}}function E(e,t){for(let n=e;;n=c.dirname(n)){const o=c.join(n,"node_modules",t);if(x(c.join(o,"package.json")))return o;if(c.dirname(n)===n)return void 0}}export function solidLinksModule(e,t){const n=S(e);const o=new Set(t.map(({key:i})=>i));const s=Boolean(n["@tanstack/solid-query"])&&o.has("react-query");const r=Boolean(n["@solidjs/router"])&&o.has("route-events");return[s||r?"import { useContext, getOwner } from 'solid-js';":"",s?"import { QueryClientContext } from '@tanstack/solid-query';":"",r?"import { useLocation, useCurrentMatches, useNavigate } from '@solidjs/router';":"","export function useBuoyLinks(options) {"," const links = {};",s?" const client = useContext(QueryClientContext);\n if (client) links.queryClient = client();":"",r?[" try {"," const location = useLocation(), matches = useCurrentMatches(), navigate = useNavigate(), owner = getOwner();"," links.router = () => import('@buoy-gg/solid/router').then((m) => m.connectBuoyRouter({ location, matches, navigate, routes: options.routes, owner }));"," } catch { /* not inside <Router> */ }"].join("\n"):""," return links;","}",""].filter(Boolean).join("\n")}function V(e){const t=new Map;const n=(o,s)=>{for(const r of s){const i=r.startsWith("@buoy-gg/")&&!t.has(r)?E(o,r):void 0;if(!i)continue;const a=_(i);t.set(r,a);let d=[];try{d=Object.keys(JSON.parse(k(c.join(a,"package.json"),"utf8")).dependencies??{})}catch{}n(a,d)}};n(e,[...Object.keys(S(e)),"@buoy-gg/core"]);return[...t.values()]}function G(e,t){const n=(r,i)=>{for(const a of i){const d=E(a,r);if(d)return d}return void 0};const o=n("react-dom",[e,...t]);const s={react:n("react",[...o?[_(o)]:[],e,...t]),"react-dom":o,"react-native-web":n("react-native-web",[e,...t])};return Object.fromEntries(Object.entries(s).filter(([,r])=>r))}function F(e,t){for(let n=e;;n=c.dirname(n)){const o=c.join(n,"node_modules",t,"package.json");if(x(o)){try{return JSON.parse(k(o,"utf8"))}catch{return void 0}}if(c.dirname(n)===n)return void 0}}export function findInstalledTools(e,{exclude:t=[]}={}){const n=I(e);let o;try{const a=n?JSON.parse(k(n,"utf8")):{};const d={...a.dependencies,...a.devDependencies,...a.optionalDependencies,...a.peerDependencies};if(d["@buoy-gg/core"])o=new Set(Object.keys(d))}catch{}const s=new Set(t.map(a=>a.replace(/^@buoy-gg\//,"")));const r=[];const i=[];for(const[a,d]of L){const y=`@buoy-gg/${a}`;if(s.has(a)||s.has(d)||o&&!o.has(y))continue;const m=F(e,y);if(!m)continue;if(m.exports&&typeof m.exports==="object"&&m.exports["./web"])r.push({id:y,key:d});else i.push(y)}return{found:r,missingWeb:i}}export function installedToolsModule(e,{assetList:t}={}){const n=e.map(({id:i},a)=>`import * as t${a} from ${JSON.stringify(`${i}/web`)};`);const o=e.map(({key:i},a)=>`${JSON.stringify(i)}: t${a}`);const s=e.findIndex(({key:i})=>i==="assets");const r=t&&s!==-1?`t${s}.loadBrowserAssetManifest?.(${JSON.stringify(t)})?.catch?.(() => {});
1
+ import{existsSync as $,readFileSync as k,realpathSync as N}from"node:fs";import{createRequire as z}from"node:module";import c from"node:path";export function missingReactNativeWeb(e=import.meta.url){try{z(e).resolve("react-native-web");return false}catch{return true}}const B=[["network","network"],["storage","storage"],["events","events"],["console","console"],["env","env"],["redux","redux"],["zustand","zustand"],["jotai","jotai"],["react-query","react-query"],["route-events","route-events"],["time-machine","time-machine"],["clock","clock"],["lifecycle","lifecycle"],["location","location"],["permissions","permissions"],["notifications","push-notifications"],["scenarios","scenarios"],["sentry","sentry"],["ask-buoy","ask-buoy"],["impersonate","impersonate"],["perf-monitor","perf-monitor"],["js-top","js-top"],["highlight-updates","highlight-updates"],["debug-borders","debug-borders"],["images","images"],["assets","assets"],["image-overlay","image-overlay"],["tv-remote","tv-remote"],["focus-inspector","focus-inspector"],["external-sync","external-sync"]];const x="@buoy-gg/core/web/installed-tools";const O="@buoy-gg/core/web/register";const H="@buoy-gg/core/web/register-network";const J="\0buoy:installed-tools";const P="@buoy-gg/solid";const q="@buoy-gg/solid/register";const C=["solid-js","solid-js/web","solid-js/store"];const A="#buoy-solid-auto";const M="\0buoy:solid-links";const V=["@buoy-gg/solid","@buoy-gg/solid/register","@buoy-gg/solid/router","@buoy-gg/solid/store","@buoy-gg/solid/highlights"];const v="@buoy-gg/vue";const W="@buoy-gg/vue/register";const G=[{name:"solid",pkg:P,register:q,dedupe:()=>C},{name:"vue",pkg:v,register:W,dedupe:e=>["vue",...e["@tanstack/vue-query"]?["@tanstack/query-core"]:[]]}];export function frameworkHost(e){const t=j(e);return G.find(n=>t[n.pkg])}function D(e){for(let t=e;;t=c.dirname(t)){const n=c.join(t,"package.json");if($(n))return n;if(c.dirname(t)===t)return void 0}}function j(e){const t=D(e);try{const n=t?JSON.parse(k(t,"utf8")):{};return{...n.dependencies,...n.devDependencies,...n.optionalDependencies,...n.peerDependencies}}catch{return{}}}export function wantsSolid2(e){const t=String(j(e)["solid-js"]??"");return t==="next"||/^[\s^~>=v]*2(?:\.|$)/.test(t)}export function earlyHook(e,t=true){if(t===false)return void 0;if(t==="react")return O;if(t==="network")return H;return frameworkHost(e)?.register??O}export function disabledEntry(e,t){const[n,o,...s]=t.split("/");if(n!=="@buoy-gg"||!o)return void 0;const r=c.join(_(e,`${n}/${o}`)??"","package.json");if(!$(r))return void 0;try{const a=JSON.parse(k(r,"utf8")).exports?.[s.length?`./${s.join("/")}`:"."];const i=a&&typeof a==="object"?a["buoy-disabled"]:void 0;return typeof i==="string"?c.join(c.dirname(r),i):void 0}catch{return void 0}}function _(e,t){for(let n=e;;n=c.dirname(n)){const o=c.join(n,"node_modules",t);if($(c.join(o,"package.json")))return o;if(c.dirname(n)===n)return void 0}}export function solidLinksModule(e,t){const n=j(e);const o=new Set(t.map(({key:a})=>a));const s=Boolean(n["@tanstack/solid-query"])&&o.has("react-query");const r=Boolean(n["@solidjs/router"])&&o.has("route-events");return[s||r?"import { useContext, getOwner } from 'solid-js';":"",s?"import { QueryClientContext, onlineManager } from '@tanstack/solid-query';":"",r?"import { useLocation, useCurrentMatches, useNavigate } from '@solidjs/router';":"","export function useBuoyLinks(options) {"," const links = {};",s?" const client = useContext(QueryClientContext);\n if (client) { links.queryClient = client(); links.onlineManager = onlineManager; }":"",r?[" try {"," const location = useLocation(), matches = useCurrentMatches(), navigate = useNavigate(), owner = getOwner();"," links.router = () => import('@buoy-gg/solid/router').then((m) => m.connectBuoyRouter({ location, matches, navigate, routes: options.routes, owner }));"," } catch { /* not inside <Router> */ }"].join("\n"):""," return links;","}",""].filter(Boolean).join("\n")}function F(e){const t=new Map;const n=(o,s)=>{for(const r of s){const a=r.startsWith("@buoy-gg/")&&!t.has(r)?_(o,r):void 0;if(!a)continue;const i=N(a);t.set(r,i);let d=[];try{d=Object.keys(JSON.parse(k(c.join(i,"package.json"),"utf8")).dependencies??{})}catch{}n(i,d)}};n(e,[...Object.keys(j(e)),"@buoy-gg/core"]);return[...t.values()]}function Q(e,t){const n=(r,a)=>{for(const i of a){const d=_(i,r);if(d)return d}return void 0};const o=n("react-dom",[e,...t]);const s={react:n("react",[...o?[N(o)]:[],e,...t]),"react-dom":o,"react-native-web":n("react-native-web",[e,...t])};return Object.fromEntries(Object.entries(s).filter(([,r])=>r))}function K(e,t){for(let n=e;;n=c.dirname(n)){const o=c.join(n,"node_modules",t,"package.json");if($(o)){try{return JSON.parse(k(o,"utf8"))}catch{return void 0}}if(c.dirname(n)===n)return void 0}}export function findInstalledTools(e,{exclude:t=[]}={}){const n=D(e);let o;try{const i=n?JSON.parse(k(n,"utf8")):{};const d={...i.dependencies,...i.devDependencies,...i.optionalDependencies,...i.peerDependencies};if(d["@buoy-gg/core"])o=new Set(Object.keys(d))}catch{}const s=new Set(t.map(i=>i.replace(/^@buoy-gg\//,"")));const r=[];const a=[];for(const[i,d]of B){const y=`@buoy-gg/${i}`;if(s.has(i)||s.has(d)||o&&!o.has(y))continue;const m=K(e,y);if(!m)continue;if(m.exports&&typeof m.exports==="object"&&m.exports["./web"])r.push({id:y,key:d});else a.push(y)}return{found:r,missingWeb:a}}export function installedToolsModule(e,{assetList:t}={}){const n=e.map(({id:a},i)=>`import * as t${i} from ${JSON.stringify(`${a}/web`)};`);const o=e.map(({key:a},i)=>`${JSON.stringify(a)}: t${i}`);const s=e.findIndex(({key:a})=>a==="assets");const r=t&&s!==-1?`t${s}.loadBrowserAssetManifest?.(${JSON.stringify(t)})?.catch?.(() => {});
2
2
  `:"";return`${n.join("\n")}
3
3
  ${r}export const installedTools = { ${o.join(", ")} };
4
4
  export const installedToolsFound = true;
5
- `}function Q(e){return e.replace(/<!--[\s\S]*?(?:-->|$)/g,t=>" ".repeat(t.length))}export function injectRegister(e,t=D){const n=`<script type="module">import ${JSON.stringify(t)};<\/script>`;const o=Q(e).search(/<script\b[^>]*\btype\s*=\s*["']?module["']?[^>]*>/i);return o===-1?void 0:`${e.slice(0,o)}${n}
6
- ${e.slice(o)}`}function K(e,t){const n=I(e);const o=new Set(t.map(s=>s.replace(/^@buoy-gg\//,"")));try{const s=n?JSON.parse(k(n,"utf8")):{};const r={...s.dependencies,...s.devDependencies,...s.optionalDependencies,...s.peerDependencies};return L.filter(([i,a])=>r[`@buoy-gg/${i}`]&&!o.has(i)&&!o.has(a)).map(([i])=>`@buoy-gg/${i}`).join()}catch{return""}}export function assetListUrl(e,t,n){const o=n==="serve"&&!/^(?:\/|[a-z]+:)/i.test(e)?"/":e;return/^(?:\/|[a-z]+:)/i.test(o)?`${o.endsWith("/")?o:`${o}/`}${t}`:void 0}export function buoy({exclude:e=[],register:t=true,enableInRelease:n=false}={}){let o={found:[],missingWeb:[]};let s=process.cwd();let r=t===false?void 0:D;let i=false;let a=false;let d=[];let y;let m;let T;const $=()=>{clearInterval(T);T=void 0};return{name:"buoy",enforce:"pre",config(u,l){s=c.resolve(u.root??process.cwd());o=findInstalledTools(s,{exclude:e});const f=frameworkHost(s);const b=f?.name==="solid";a=b;const p=b&&wantsSolid2(s);if(p)console.warn("[buoy] This app uses Solid 2, and @buoy-gg/solid supports Solid 1.8 and 1.9 for now. Buoy is off, so your app still runs.");const g=l?.command==="build";i=Boolean(f)&&(p||g&&!n);r=i?void 0:earlyHook(s,t);d=V(s);const j=d.some(w=>!w.split(c.sep).includes("node_modules"))?G(s,d):void 0;const h=o.found.map(({id:w})=>`${w}/web`);if(f?.name==="vue"){if(r)h.unshift(r);const w=new Set(o.found.map(({key:q})=>q));h.push("@buoy-gg/core/web","@buoy-gg/core/web/register-network",`${v}/register`);h.push(v,`${v}/pinia`,...w.has("route-events")?[`${v}/router`]:[],...w.has("highlight-updates")?[`${v}/highlights`]:[]);const R={optimizeDeps:{exclude:[O],include:h},resolve:{dedupe:f.dedupe(S(s)),alias:j}};return g&&!i?{...R,define:{__VUE_PROD_DEVTOOLS__:"true"}}:R}if(!b){if(r)h.unshift(r);return{optimizeDeps:{exclude:[O],include:h},resolve:{alias:j}}}h.unshift("@buoy-gg/core/web","@buoy-gg/core/web/register-network","@buoy-gg/solid > @buoy-gg/shared-ui/web/utils");return{optimizeDeps:{exclude:[O,...M],include:h},resolve:{dedupe:B,alias:j}}},configResolved(u){y=u.logger;if(!i&&missingReactNativeWeb())throw new Error("[buoy] Buoy's menu needs react-native-web, and it isn't installed. Run: npm install react-native-web");const l=u.plugins.find(p=>p.name==="buoy-asset-manifest");m=l?assetListUrl(u.base,l.api?.filename??"buoy-assets.json",u.command):void 0;if(l&&!m)y.warn(`[buoy] base '${u.base}' is relative, so load the asset list yourself with loadBrowserAssetManifest().`);const f=u.server?.fs?.allow;for(const p of f?d.map(g=>g.split(c.sep).join("/")):[]){if(!f.some(g=>`${p}/`.startsWith(`${g.replace(/\/$/,"")}/`)))f.push(p)}if(u.command!=="serve"||i)return;const b=o.found.map(({key:p})=>p).join(", ")||"none";y.info(`[buoy] tools: ${b}`);if(o.missingWeb.length)y.warn(`[buoy] these have no browser build; update them to the same release as @buoy-gg/core: ${o.missingWeb.join(", ")}`)},configureServer(u){const l=I(s);if(!l)return;const f=g=>g.map(({id:j})=>j).join();const b=()=>{if(f(findInstalledTools(s,{exclude:e}).found)===f(o.found))return false;$();void u.restart();return true};const p=()=>{$();if(K(s,e)===f(o.found))return;let g=0;T=setInterval(()=>{if(!b()&&++g>=120)$()},1e3)};u.watcher.add(l);u.watcher.on("change",g=>{if(c.resolve(g)===c.resolve(l)&&!b())p()});p()},closeBundle(){$()},resolveId(u){if(u===O)return N;if(u===H&&a)return J;if(i&&u.startsWith("@buoy-gg/"))return disabledEntry(s,u);return void 0},load(u){if(u===N)return installedToolsModule(o.found,{assetList:m});if(u===J)return solidLinksModule(s,o.found);return void 0},transformIndexHtml:{order:"pre",handler(u){if(!r)return u;const l=injectRegister(u,r);if(l===void 0)y?.warn(`[buoy] index.html has no module script, so the early hook wasn't added. Import '${r}' first in your entry file.`);return l??u}}}}export default buoy;
5
+ `}function X(e){return e.replace(/<!--[\s\S]*?(?:-->|$)/g,t=>" ".repeat(t.length))}export function injectRegister(e,t=O){const n=`<script type="module">${[t].flat().map(s=>`import ${JSON.stringify(s)};`).join(" ")}<\/script>`;const o=X(e).search(/<script\b[^>]*\btype\s*=\s*["']?module["']?[^>]*>/i);return o===-1?void 0:`${e.slice(0,o)}${n}
6
+ ${e.slice(o)}`}function Y(e,t){const n=D(e);const o=new Set(t.map(s=>s.replace(/^@buoy-gg\//,"")));try{const s=n?JSON.parse(k(n,"utf8")):{};const r={...s.dependencies,...s.devDependencies,...s.optionalDependencies,...s.peerDependencies};return B.filter(([a,i])=>r[`@buoy-gg/${a}`]&&!o.has(a)&&!o.has(i)).map(([a])=>`@buoy-gg/${a}`).join()}catch{return""}}export function assetListUrl(e,t,n){const o=n==="serve"&&!/^(?:\/|[a-z]+:)/i.test(e)?"/":e;return/^(?:\/|[a-z]+:)/i.test(o)?`${o.endsWith("/")?o:`${o}/`}${t}`:void 0}export function buoy({exclude:e=[],register:t=true,enableInRelease:n=false}={}){let o={found:[],missingWeb:[]};let s=process.cwd();let r=t===false?void 0:O;let a=[];let i=false;let d=false;let y=[];let m;let I;let T;const S=()=>{clearInterval(T);T=void 0};return{name:"buoy",enforce:"pre",config(u,l){s=c.resolve(u.root??process.cwd());o=findInstalledTools(s,{exclude:e});const f=frameworkHost(s);const b=f?.name==="solid";d=b;const p=b&&wantsSolid2(s);if(p)console.warn("[buoy] This app uses Solid 2, and @buoy-gg/solid supports Solid 1.8 and 1.9 for now. Buoy is off, so your app still runs.");const g=l?.command==="build";i=Boolean(f)&&(p||g&&!n);r=i?void 0:earlyHook(s,t);const E=r===q||r===W;a=E&&o.found.some(({key:w})=>w==="network")?["@buoy-gg/network/web"]:[];y=F(s);const R=y.some(w=>!w.split(c.sep).includes("node_modules"))?Q(s,y):void 0;const h=o.found.map(({id:w})=>`${w}/web`);if(f?.name==="vue"){if(r)h.unshift(r);const w=new Set(o.found.map(({key:U})=>U));h.push("@buoy-gg/core/web","@buoy-gg/core/web/register-network",`${v}/register`);h.push(v,`${v}/pinia`,...w.has("route-events")?[`${v}/router`]:[],...w.has("highlight-updates")?[`${v}/highlights`]:[]);const L={optimizeDeps:{exclude:[x],include:h},resolve:{dedupe:f.dedupe(j(s)),alias:R}};return g&&!i?{...L,define:{__VUE_PROD_DEVTOOLS__:"true"}}:L}if(!b){if(r)h.unshift(r);return{optimizeDeps:{exclude:[x],include:h},resolve:{alias:R}}}h.unshift("@buoy-gg/core/web","@buoy-gg/core/web/register-network","@buoy-gg/solid > @buoy-gg/shared-ui/web/utils");return{optimizeDeps:{exclude:[x,...V],include:h},resolve:{dedupe:C,alias:R}}},configResolved(u){m=u.logger;if(!i&&missingReactNativeWeb())throw new Error("[buoy] Buoy's menu needs react-native-web, and it isn't installed. Run: npm install react-native-web");const l=u.plugins.find(p=>p.name==="buoy-asset-manifest");I=l?assetListUrl(u.base,l.api?.filename??"buoy-assets.json",u.command):void 0;if(l&&!I)m.warn(`[buoy] base '${u.base}' is relative, so load the asset list yourself with loadBrowserAssetManifest().`);const f=u.server?.fs?.allow;for(const p of f?y.map(g=>g.split(c.sep).join("/")):[]){if(!f.some(g=>`${p}/`.startsWith(`${g.replace(/\/$/,"")}/`)))f.push(p)}if(u.command!=="serve"||i)return;const b=o.found.map(({key:p})=>p).join(", ")||"none";m.info(`[buoy] tools: ${b}`);if(o.missingWeb.length)m.warn(`[buoy] these have no browser build; update them to the same release as @buoy-gg/core: ${o.missingWeb.join(", ")}`)},configureServer(u){const l=D(s);if(!l)return;const f=g=>g.map(({id:E})=>E).join();const b=()=>{if(f(findInstalledTools(s,{exclude:e}).found)===f(o.found))return false;S();void u.restart();return true};const p=()=>{S();if(Y(s,e)===f(o.found))return;let g=0;T=setInterval(()=>{if(!b()&&++g>=120)S()},1e3)};u.watcher.add(l);u.watcher.on("change",g=>{if(c.resolve(g)===c.resolve(l)&&!b())p()});p()},closeBundle(){S()},resolveId(u){if(u===x)return J;if(u===A&&d)return M;if(i&&u.startsWith("@buoy-gg/"))return disabledEntry(s,u);return void 0},load(u){if(u===J)return installedToolsModule(o.found,{assetList:I});if(u===M)return solidLinksModule(s,o.found);return void 0},transformIndexHtml:{order:"pre",handler(u){if(!r)return u;const l=injectRegister(u,[r,...a]);if(l===void 0)m?.warn(`[buoy] index.html has no module script, so the early hook wasn't added. Import '${r}' first in your entry file.`);return l??u}}}}export default buoy;
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.installEarlyNetworkRecorder=installEarlyNetworkRecorder;const MAX_RECORDS=100;function installEarlyNetworkRecorder(){if(typeof window==="undefined")return;const u=window;if(u.__BUOY_EARLY_NETWORK__)return;const d=Date.now;let f=true;const i=[];const y=c=>{i.push(c);if(i.length>MAX_RECORDS){const e=i.shift();if(e?.kind==="fetch")void e.settled.then(r=>r.clone?.body?.cancel()).catch(()=>{})}};const l=typeof window.fetch==="function"?window.fetch:void 0;if(l){window.fetch=function c(e,r){if(r?.__buoyInternal)return l.call(window,e,r);if(!f)return l.call(window,e,r);let h;try{if(e instanceof Request&&e.body&&!e.bodyUsed&&r?.body===void 0)h=e.clone()}catch{}const a=d();const o=l.call(window,e,r);const n=o.then(t=>{const s=d();const _=/event-stream|ndjson/.test(t.headers.get("content-type")??"");let w;try{if(!_)w=t.clone()}catch{}return{response:t,clone:w,headersAt:s}},t=>({error:t,headersAt:d()}));y({kind:"fetch",input:e,init:r,requestCopy:h,start:a,settled:n});return o}}if(typeof XMLHttpRequest!=="undefined"){const c=XMLHttpRequest.prototype;const{open:e,send:r,setRequestHeader:h}=c;const a=new WeakMap;c.open=function(o,n,...t){if(f)a.set(this,{method:o,url:String(n),headers:{}});return e.call(this,o,n,...t)};c.setRequestHeader=function(o,n){const t=a.get(this);if(t)t.headers[o]=n;return h.call(this,o,n)};c.send=function(o){const n=a.get(this);if(f&&n){a.delete(this);const t=d();const s=this;s.addEventListener("readystatechange",()=>{if(s.readyState===2&&s._buoyTtfb===void 0)s._buoyTtfb=d()-t;if(s.readyState===4)s._buoyEarlyEnd=d()});y({kind:"xhr",xhr:s,method:n.method,url:n.url,headers:n.headers,body:o,start:t})}return r.call(this,o)}}u.__BUOY_EARLY_NETWORK__={version:1,records:i,adopt(){f=false;return i.splice(0)}}}
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.LEGACY_EARLY_NETWORK_KEY=exports.EARLY_NETWORK_KEY=void 0;exports.installEarlyNetworkRecorder=installEarlyNetworkRecorder;const EARLY_NETWORK_KEY=exports.EARLY_NETWORK_KEY=Symbol.for("buoy.earlyNetwork");const LEGACY_EARLY_NETWORK_KEY=exports.LEGACY_EARLY_NETWORK_KEY="__BUOY_EARLY_NETWORK__";const MAX_RECORDS=100;function installEarlyNetworkRecorder(){if(typeof window==="undefined")return;const u=window;if(u[EARLY_NETWORK_KEY]||u[LEGACY_EARLY_NETWORK_KEY])return;const d=Date.now;let i=true;const f=[];const E=s=>{f.push(Object.freeze(s));if(f.length>MAX_RECORDS){const e=f.shift();if(e?.kind==="fetch")void e.settled.then(r=>r.clone?.body?.cancel()).catch(()=>{})}};const l=typeof window.fetch==="function"?window.fetch:void 0;if(l){window.fetch=function s(e,r){if(r?.__buoyInternal)return l.call(window,e,r);if(!i)return l.call(window,e,r);let h;try{if(e instanceof Request&&e.body&&!e.bodyUsed&&r?.body===void 0)h=e.clone()}catch{}const a=d();const o=l.call(window,e,r);const n=o.then(t=>{const c=d();const b=/event-stream|ndjson/.test(t.headers.get("content-type")??"");let w;try{if(!b)w=t.clone()}catch{}return{response:t,clone:w,headersAt:c}},t=>({error:t,headersAt:d()}));E({kind:"fetch",input:e,init:r,requestCopy:h,start:a,settled:n});return o}}if(typeof XMLHttpRequest!=="undefined"){const s=XMLHttpRequest.prototype;const{open:e,send:r,setRequestHeader:h}=s;const a=new WeakMap;s.open=function(o,n,...t){if(i)a.set(this,{method:o,url:String(n),headers:{}});return e.call(this,o,n,...t)};s.setRequestHeader=function(o,n){const t=a.get(this);if(t)t.headers[o]=n;return h.call(this,o,n)};s.send=function(o){const n=a.get(this);if(i&&n){a.delete(this);const t=d();const c=this;c.addEventListener("readystatechange",()=>{if(c.readyState===2&&c._buoyTtfb===void 0)c._buoyTtfb=d()-t;if(c.readyState===4)c._buoyEarlyEnd=d()});E({kind:"xhr",xhr:c,method:n.method,url:n.url,headers:n.headers,body:o,start:t})}return r.call(this,o)}}const y=()=>{i=false;return f.splice(0)};const R=Object.freeze({version:1,get pending(){return f.length},adopt:y});const _=(s,e)=>{try{Object.defineProperty(u,s,{value:e,enumerable:false,writable:false,configurable:false})}catch{}};_(EARLY_NETWORK_KEY,R);_(LEGACY_EARLY_NETWORK_KEY,Object.freeze({version:1,adopt:y}))}
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.useAppHost=exports.AppOverlay=exports.AppHostProvider=void 0;var _sharedUi=require("@buoy-gg/shared-ui");var _react=_interopRequireWildcard(require("react"));var _reactNative=require("react-native");var _AppHostLogic=require("./AppHostLogic.js");var _AppIcon=require("./AppIcon");var _MinimizedToolsContext=require("./MinimizedToolsContext.js");var _ToolHost=require("./ToolHost.js");var _DevToolsSettingsModal=require("./DevToolsSettingsModal");var _jsxRuntime=require("react/jsx-runtime");function _interopRequireWildcard(t,l){if("function"==typeof WeakMap)var a=new WeakMap,m=new WeakMap;return(_interopRequireWildcard=function(i,f){if(!f&&i&&i.__esModule)return i;var c,d,u={__proto__:null,default:i};if(null===i||"object"!=typeof i&&"function"!=typeof i)return u;if(c=f?m:a){if(c.has(i))return c.get(i);c.set(i,u)}for(const g in i)"default"!==g&&{}.hasOwnProperty.call(i,g)&&((d=(c=Object.defineProperty)&&Object.getOwnPropertyDescriptor(i,g))&&(d.get||d.set)?c(u,g,d):u[g]=i[g]);return u})(t,l)}const AppHostContext=(0,_react.createContext)(null);const STORAGE_KEY_OPEN_APPS="@react_buoy_open_apps";const PERSISTENCE_DELAY=500;const AppHostProvider=({children:t})=>{const[l,a]=(0,_react.useState)([]);const[m,i]=(0,_react.useState)(false);const f=(0,_react.useRef)(null);const c=(0,_react.useRef)([]);const d=(0,_react.useRef)(null);const{restore:u}=(0,_MinimizedToolsContext.useMinimizedTools)();const g=(0,_react.useCallback)(n=>{let o="";a(s=>{const{apps:r,instanceId:S,wasMinimized:x}=(0,_AppHostLogic.resolveOpenAppsState)(s,n,()=>`${n.id}-${Date.now()}-${Math.random().toString(36).slice(2)}`);o=S;if(x){setTimeout(()=>u(S),0)}return r});return o},[u]);const e=(0,_react.useCallback)(()=>{if(m)return;if(!c.current.length)return;const n=d.current;if(!n||n.length===0){i(true);return}d.current=null;n.forEach(({id:o,minimized:s})=>{const r=c.current.find(S=>S.id===o);if(r){const S=(0,_AppIcon.renderAppIcon)(r.icon,{slot:"dial",size:20,color:r.color});g({id:r.id,title:r.name,component:r.component,props:r.props,launchMode:r.launchMode||"self-modal",singleton:r.singleton,icon:S,color:r.color,modal:r.modal,minimized:s})}});i(true)},[m,g]);(0,_react.useEffect)(()=>{const n=async()=>{try{const o=await _sharedUi.persistentStorage.getItem(STORAGE_KEY_OPEN_APPS);if(o){const s=JSON.parse(o);let r;if(Array.isArray(s)&&s.length>0){if(typeof s[0]==="string"){r=s.map(S=>({id:S,minimized:false}))}else{r=s}if(r.length){d.current=r;e();return}}}}catch(o){}i(true)};n()},[e]);(0,_react.useEffect)(()=>{if(!m)return;if(f.current){clearTimeout(f.current)}f.current=setTimeout(()=>{const n=l.map(o=>({id:o.id,minimized:o.minimized??false}));_sharedUi.persistentStorage.setItem(STORAGE_KEY_OPEN_APPS,JSON.stringify(n))},PERSISTENCE_DELAY);return()=>{if(f.current){clearTimeout(f.current)}}},[l,m]);const h=(0,_react.useCallback)(n=>{c.current=n;e()},[e]);const p=(0,_react.useCallback)(n=>{a(o=>{if(!o.length)return o;if(!n)return o.slice(0,-1);return o.filter(s=>s.instanceId!==n)})},[]);const v=(0,_react.useCallback)(()=>a([]),[]);const M=(0,_react.useCallback)(n=>{a(o=>o.map(s=>s.instanceId===n?{...s,minimized:true}:s))},[]);const b=(0,_react.useCallback)((n,o)=>{a(s=>s.map(r=>r.instanceId===n?{...r,minimized:false,restoreState:o}:r))},[]);const I=(0,_react.useCallback)(n=>{const o=l.find(s=>s.instanceId===n);return o?.minimized??false},[l]);_react.default.useEffect(()=>{if(l.length===0)return;const n=()=>{p();return true};const o=_reactNative.BackHandler.addEventListener("hardwareBackPress",n);return()=>o.remove()},[l.length,p]);const A=(0,_react.useMemo)(()=>({openApps:l,isAnyOpen:l.filter(n=>n.launchMode!=="toggle-only"&&!n.minimized).length>0,open:g,close:p,closeAll:v,registerApps:h,minimize:M,restore:b,isMinimized:I}),[l,g,p,v,h,M,b,I]);return(0,_jsxRuntime.jsx)(AppHostContext.Provider,{value:A,children:t})};exports.AppHostProvider=AppHostProvider;const useAppHost=()=>{const t=(0,_react.useContext)(AppHostContext);if(!t){return{openApps:[],isAnyOpen:false,open:()=>"",close:()=>{},closeAll:()=>{},minimize:()=>{},restore:(l,a)=>{},isMinimized:()=>false}}return t};exports.useAppHost=useAppHost;const AppRenderer=({app:t,zIndex:l,onClose:a,onMinimize:m,minimizeTargetPosition:i,globalEnableSharedModalDimensions:f})=>{const c=t.component;const d=!t.minimized;const u={...t.props??{},...f===true?{enableSharedModalDimensions:true}:{}};if(t.modal&&(t.launchMode==="self-modal"||!t.launchMode)){return(0,_jsxRuntime.jsx)(_ToolHost.ToolModalShell,{app:t,config:t.modal,visible:d,zIndex:l,onClose:a,onMinimize:m,initialModalState:t.restoreState,enableSharedModalDimensions:f===true,bodyProps:u})}if(t.launchMode==="self-modal"){return(0,_jsxRuntime.jsx)(c,{...u,visible:d,onClose:a,onRequestClose:a,onMinimize:m,minimizeTargetPosition:i,initialModalState:t.restoreState,instanceId:t.instanceId,zIndex:l})}if(t.launchMode==="inline"){if(!d)return null;return(0,_jsxRuntime.jsx)(_reactNative.View,{pointerEvents:"box-none",style:[_reactNative.StyleSheet.absoluteFill,{zIndex:l}],children:(0,_jsxRuntime.jsx)(c,{...u,onClose:a,onMinimize:m,minimizeTargetPosition:i,initialModalState:t.restoreState,instanceId:t.instanceId})})}return(0,_jsxRuntime.jsx)(_reactNative.Modal,{visible:d,transparent:true,animationType:"slide",onRequestClose:a,children:(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.backdrop,children:(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.card,children:(0,_jsxRuntime.jsx)(c,{...u,onClose:a,onMinimize:m,minimizeTargetPosition:i,initialModalState:t.restoreState,instanceId:t.instanceId})})})})};const AppOverlay=()=>{const{openApps:t,close:l,minimize:a}=useAppHost();const{minimize:m,restore:i,getNextIconPosition:f,minimizedTools:c}=(0,_MinimizedToolsContext.useMinimizedTools)();const{settings:d}=(0,_DevToolsSettingsModal.useDevToolsSettings)();(0,_react.useEffect)(()=>{(0,_sharedUi.setExpandableWindowControls)(d.globalSettings?.expandableWindowControls!==false)},[d.globalSettings?.expandableWindowControls]);_react.default.useEffect(()=>{t.forEach(e=>{if(e.minimized&&e.launchMode!=="toggle-only"){const h=c.some(p=>p.instanceId===e.instanceId);if(!h){m({instanceId:e.instanceId,id:e.id,title:e.title||e.id,icon:e.icon,color:e.color})}}});c.forEach(e=>{const h=t.find(p=>p.instanceId===e.instanceId);if(!h||!h.minimized){i(e.instanceId)}})},[t,c,m,i]);const u=t.filter(e=>e.launchMode!=="toggle-only");if(u.length===0)return null;const g=9e3;return(0,_jsxRuntime.jsx)(_jsxRuntime.Fragment,{children:u.map((e,h)=>{const p=g+h;const v=f();const M=b=>{a(e.instanceId);m({instanceId:e.instanceId,id:e.id,title:e.title||e.id,icon:e.icon,color:e.color,modalState:b})};return(0,_jsxRuntime.jsx)(AppRenderer,{app:e,zIndex:p,onClose:()=>l(e.instanceId),onMinimize:M,minimizeTargetPosition:v,globalEnableSharedModalDimensions:d.globalSettings?.enableSharedModalDimensions},e.instanceId)})})};exports.AppOverlay=AppOverlay;const styles=_reactNative.StyleSheet.create({backdrop:{flex:1,backgroundColor:"rgba(0,0,0,0.28)",alignItems:"center",justifyContent:"center"},card:{maxHeight:"90%",width:"94%",borderRadius:12,backgroundColor:"white",overflow:"hidden"}});
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.useAppHost=exports.AppOverlay=exports.AppHostProvider=void 0;var _sharedUi=require("@buoy-gg/shared-ui");var _react=_interopRequireWildcard(require("react"));var _reactNative=require("react-native");var _AppHostLogic=require("./AppHostLogic.js");var _AppIcon=require("./AppIcon");var _MinimizedToolsContext=require("./MinimizedToolsContext.js");var _ToolHost=require("./ToolHost.js");var _DevToolsSettingsModal=require("./DevToolsSettingsModal");var _DevToolsVisibilityContext=require("./DevToolsVisibilityContext.js");var _hardwareBack=require("./hardwareBack.js");var _jsxRuntime=require("react/jsx-runtime");function _interopRequireWildcard(t,s){if("function"==typeof WeakMap)var c=new WeakMap,m=new WeakMap;return(_interopRequireWildcard=function(i,f){if(!f&&i&&i.__esModule)return i;var l,d,u={__proto__:null,default:i};if(null===i||"object"!=typeof i&&"function"!=typeof i)return u;if(l=f?m:c){if(l.has(i))return l.get(i);l.set(i,u)}for(const p in i)"default"!==p&&{}.hasOwnProperty.call(i,p)&&((d=(l=Object.defineProperty)&&Object.getOwnPropertyDescriptor(i,p))&&(d.get||d.set)?l(u,p,d):u[p]=i[p]);return u})(t,s)}const AppHostContext=(0,_react.createContext)(null);const STORAGE_KEY_OPEN_APPS="@react_buoy_open_apps";const PERSISTENCE_DELAY=500;const AppHostProvider=({children:t})=>{const[s,c]=(0,_react.useState)([]);const[m,i]=(0,_react.useState)(false);const f=(0,_react.useRef)(null);const l=(0,_react.useRef)([]);const d=(0,_react.useRef)(null);const{restore:u}=(0,_MinimizedToolsContext.useMinimizedTools)();const p=(0,_react.useCallback)(n=>{let o="";c(r=>{const{apps:a,instanceId:v,wasMinimized:y}=(0,_AppHostLogic.resolveOpenAppsState)(r,n,()=>`${n.id}-${Date.now()}-${Math.random().toString(36).slice(2)}`);o=v;if(y){setTimeout(()=>u(v),0)}return a});return o},[u]);const e=(0,_react.useCallback)(()=>{if(m)return;if(!l.current.length)return;const n=d.current;if(!n||n.length===0){i(true);return}d.current=null;n.forEach(({id:o,minimized:r})=>{const a=l.current.find(v=>v.id===o);if(a){const v=(0,_AppIcon.renderAppIcon)(a.icon,{slot:"dial",size:20,color:a.color});p({id:a.id,title:a.name,component:a.component,props:a.props,launchMode:a.launchMode||"self-modal",singleton:a.singleton,icon:v,color:a.color,modal:a.modal,minimized:r})}});i(true)},[m,p]);(0,_react.useEffect)(()=>{const n=async()=>{try{const o=await _sharedUi.persistentStorage.getItem(STORAGE_KEY_OPEN_APPS);if(o){const r=JSON.parse(o);let a;if(Array.isArray(r)&&r.length>0){if(typeof r[0]==="string"){a=r.map(v=>({id:v,minimized:false}))}else{a=r}if(a.length){d.current=a;e();return}}}}catch(o){}i(true)};n()},[e]);(0,_react.useEffect)(()=>{if(!m)return;if(f.current){clearTimeout(f.current)}f.current=setTimeout(()=>{const n=s.map(o=>({id:o.id,minimized:o.minimized??false}));_sharedUi.persistentStorage.setItem(STORAGE_KEY_OPEN_APPS,JSON.stringify(n))},PERSISTENCE_DELAY);return()=>{if(f.current){clearTimeout(f.current)}}},[s,m]);const g=(0,_react.useCallback)(n=>{l.current=n;e()},[e]);const h=(0,_react.useCallback)(n=>{c(o=>{if(!o.length)return o;if(!n)return o.slice(0,-1);return o.filter(r=>r.instanceId!==n)})},[]);const S=(0,_react.useCallback)(()=>c([]),[]);const b=(0,_react.useCallback)(n=>{c(o=>o.map(r=>r.instanceId===n?{...r,minimized:true}:r))},[]);const M=(0,_react.useCallback)((n,o)=>{c(r=>(0,_AppHostLogic.restoreOpenApp)(r,n,o))},[]);const A=(0,_react.useCallback)(n=>{const o=s.find(r=>r.instanceId===n);return o?.minimized??false},[s]);const{isDialOpen:I}=(0,_DevToolsVisibilityContext.useDevToolsVisibility)();(0,_hardwareBack.useHardwareBack)(s.length>0,()=>{const n=(0,_hardwareBack.resolveBackTarget)(s,I);if(n?.kind!=="tool")return false;h(n.instanceId);return true});const x=(0,_react.useMemo)(()=>({openApps:s,isAnyOpen:s.filter(n=>n.launchMode!=="toggle-only"&&!n.minimized).length>0,open:p,close:h,closeAll:S,registerApps:g,minimize:b,restore:M,isMinimized:A}),[s,p,h,S,g,b,M,A]);return(0,_jsxRuntime.jsx)(AppHostContext.Provider,{value:x,children:t})};exports.AppHostProvider=AppHostProvider;const useAppHost=()=>{const t=(0,_react.useContext)(AppHostContext);if(!t){return{openApps:[],isAnyOpen:false,open:()=>"",close:()=>{},closeAll:()=>{},minimize:()=>{},restore:(s,c)=>{},isMinimized:()=>false}}return t};exports.useAppHost=useAppHost;const AppRenderer=({app:t,zIndex:s,onClose:c,onMinimize:m,minimizeTargetPosition:i,globalEnableSharedModalDimensions:f})=>{const l=t.component;const d=!t.minimized;const u={...t.props??{},...f===true?{enableSharedModalDimensions:true}:{}};if(t.modal&&(t.launchMode==="self-modal"||!t.launchMode)){return(0,_jsxRuntime.jsx)(_ToolHost.ToolModalShell,{app:t,config:t.modal,visible:d,zIndex:s,onClose:c,onMinimize:m,initialModalState:t.restoreState,enableSharedModalDimensions:f===true,bodyProps:u})}if(t.launchMode==="self-modal"){return(0,_jsxRuntime.jsx)(l,{...u,visible:d,onClose:c,onRequestClose:c,onMinimize:m,minimizeTargetPosition:i,initialModalState:t.restoreState,instanceId:t.instanceId,zIndex:s})}if(t.launchMode==="inline"){if(!d)return null;return(0,_jsxRuntime.jsx)(_reactNative.View,{pointerEvents:"box-none",style:[_reactNative.StyleSheet.absoluteFill,{zIndex:s}],children:(0,_jsxRuntime.jsx)(l,{...u,onClose:c,onMinimize:m,minimizeTargetPosition:i,initialModalState:t.restoreState,instanceId:t.instanceId})})}return(0,_jsxRuntime.jsx)(_reactNative.Modal,{visible:d,transparent:true,animationType:"slide",onRequestClose:c,children:(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.backdrop,children:(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.card,children:(0,_jsxRuntime.jsx)(l,{...u,onClose:c,onMinimize:m,minimizeTargetPosition:i,initialModalState:t.restoreState,instanceId:t.instanceId})})})})};const AppOverlay=()=>{const{openApps:t,close:s,minimize:c}=useAppHost();const{minimize:m,restore:i,getNextIconPosition:f,minimizedTools:l}=(0,_MinimizedToolsContext.useMinimizedTools)();const{settings:d}=(0,_DevToolsSettingsModal.useDevToolsSettings)();(0,_react.useEffect)(()=>{(0,_sharedUi.setExpandableWindowControls)(d.globalSettings?.expandableWindowControls!==false)},[d.globalSettings?.expandableWindowControls]);_react.default.useEffect(()=>{t.forEach(e=>{if(e.minimized&&e.launchMode!=="toggle-only"){const g=l.some(h=>h.instanceId===e.instanceId);if(!g){m({instanceId:e.instanceId,id:e.id,title:e.title||e.id,icon:e.icon,color:e.color})}}});l.forEach(e=>{const g=t.find(h=>h.instanceId===e.instanceId);if(!g||!g.minimized){i(e.instanceId)}})},[t,l,m,i]);const u=t.filter(e=>e.launchMode!=="toggle-only");if(u.length===0)return null;const p=9e3;return(0,_jsxRuntime.jsx)(_jsxRuntime.Fragment,{children:u.map((e,g)=>{const h=p+g;const S=f();const b=M=>{c(e.instanceId);m({instanceId:e.instanceId,id:e.id,title:e.title||e.id,icon:e.icon,color:e.color,modalState:M})};return(0,_jsxRuntime.jsx)(AppRenderer,{app:e,zIndex:h,onClose:()=>s(e.instanceId),onMinimize:b,minimizeTargetPosition:S,globalEnableSharedModalDimensions:d.globalSettings?.enableSharedModalDimensions},e.instanceId)})})};exports.AppOverlay=AppOverlay;const styles=_reactNative.StyleSheet.create({backdrop:{flex:1,backgroundColor:"rgba(0,0,0,0.28)",alignItems:"center",justifyContent:"center"},card:{maxHeight:"90%",width:"94%",borderRadius:12,backgroundColor:"white",overflow:"hidden"}});
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.useAppHost=exports.AppOverlay=exports.AppHostProvider=void 0;var _floating=require("@buoy-gg/shared-ui/floating");var _sharedUi=require("@buoy-gg/shared-ui");var _react=require("react");var _AppHostLogic=require("./AppHostLogic.js");var _AppIcon=require("./AppIcon");var _ToolHost=require("./ToolHost.js");var _DevToolsSettingsModalShared=require("./DevToolsSettingsModal.shared.js");var _floatingToolsWeb=require("./floatingTools.web.js");var _capacitorBackButton=require("./capacitorBackButton.js");var _jsxRuntime=require("react/jsx-runtime");const AppHostContext=(0,_react.createContext)(null);const STORAGE_KEY_OPEN_APPS="@react_buoy_open_apps";const ICON_SIZE=44;const ICON_GAP=12;const BOTTOM_OFFSET=100;const RIGHT_OFFSET=16;const dockIconPosition=t=>({x:window.innerWidth-ICON_SIZE-RIGHT_OFFSET,y:window.innerHeight-BOTTOM_OFFSET-ICON_SIZE-t*(ICON_SIZE+ICON_GAP)});const AppHostProvider=({children:t})=>{const[s,a]=(0,_react.useState)([]);const[c,d]=(0,_react.useState)(false);const p=(0,_react.useRef)([]);const u=(0,_react.useRef)(null);const r=(0,_react.useRef)(false);const f=(0,_react.useRef)(false);const h=(0,_react.useRef)(false);const v=(0,_react.useCallback)(n=>{let o="";a(i=>{const{apps:e,instanceId:l}=(0,_AppHostLogic.resolveOpenAppsState)(i,n,()=>`${n.id}-${Date.now()}-${Math.random().toString(36).slice(2)}`);o=l;return e});return o},[]);const b=(0,_react.useCallback)(()=>{if(r.current||!f.current||!h.current)return;r.current=true;const n=u.current;if(!n||n.length===0){d(true);return}u.current=null;n.forEach(({id:o,minimized:i})=>{const e=p.current.find(l=>l.id===o);if(e&&e.component){const l=(0,_AppIcon.renderAppIcon)(e.icon,{slot:"dial",size:20,color:e.color});v({id:e.id,title:e.name,component:e.component,props:e.props,modal:e.modal,launchMode:e.launchMode||"self-modal",singleton:e.singleton??true,icon:l,color:e.color,minimized:i})}});d(true)},[v]);(0,_react.useEffect)(()=>{let n=false;const o=async()=>{try{const i=await _sharedUi.persistentStorage.getItem(STORAGE_KEY_OPEN_APPS);if(n)return;if(i){const e=JSON.parse(i);let l;if(Array.isArray(e)&&e.length>0){if(typeof e[0]==="string"){l=e.map(g=>({id:g,minimized:false}))}else{l=e.filter(g=>typeof g==="object"&&g!==null&&typeof g.id==="string")}if(l.length){u.current=l}}}}catch{}if(n)return;f.current=true;b()};void o();return()=>{n=true}},[b]);(0,_react.useEffect)(()=>{if(!c)return;const n=s.map(o=>({id:o.id,minimized:o.minimized??false}));void _sharedUi.persistentStorage.setItem(STORAGE_KEY_OPEN_APPS,JSON.stringify(n))},[s,c]);const A=(0,_react.useCallback)(n=>{p.current=n;h.current=true;b()},[b]);const m=(0,_react.useCallback)(n=>{a(o=>{if(!o.length)return o;if(!n)return o.slice(0,-1);return o.filter(i=>i.instanceId!==n)})},[]);const S=(0,_react.useCallback)(()=>a([]),[]);const x=(0,_react.useCallback)((n,o)=>{a(i=>i.map(e=>e.instanceId===n?{...e,minimized:true,restoreState:o}:e))},[]);const I=(0,_react.useCallback)((n,o)=>{a(i=>{const e=i.find(l=>l.instanceId===n);if(!e)return i;return[...i.filter(l=>l!==e),{...e,minimized:false,restoreState:o??e.restoreState}]})},[]);const M=(0,_react.useCallback)(n=>{const o=s.find(i=>i.instanceId===n);return o?.minimized??false},[s]);const y=s.some(n=>n.launchMode!=="toggle-only"&&!n.minimized);(0,_react.useEffect)(()=>{if(!y)return;const n=o=>{if(o.key!=="Escape")return;if(o.defaultPrevented)return;const i=[...s].reverse().find(e=>e.launchMode!=="toggle-only"&&!e.minimized);if(i)m(i.instanceId)};return(0,_floating.listenBuoyKeydown)(n)},[y,m,s]);(0,_capacitorBackButton.useCapacitorBackButton)(s.length>0,()=>m());const C=(0,_react.useMemo)(()=>({openApps:s,isAnyOpen:y,open:v,close:m,closeAll:S,registerApps:A,minimize:x,restore:I,isMinimized:M}),[s,y,v,m,S,A,x,I,M]);return(0,_jsxRuntime.jsx)(AppHostContext.Provider,{value:C,children:t})};exports.AppHostProvider=AppHostProvider;const useAppHost=()=>{const t=(0,_react.useContext)(AppHostContext);if(!t){return{openApps:[],isAnyOpen:false,open:()=>"",close:()=>{},closeAll:()=>{},registerApps:()=>{},minimize:()=>{},restore:()=>{},isMinimized:()=>false}}return t};exports.useAppHost=useAppHost;const BASE_ZINDEX=9e3;const backdropStyle={position:"fixed",inset:0,backgroundColor:"rgba(0,0,0,0.28)",display:"flex",alignItems:"center",justifyContent:"center"};const cardStyle={maxHeight:"90%",width:"94%",borderRadius:12,backgroundColor:"white",overflow:"hidden"};const AppRenderer=({app:t,zIndex:s,onClose:a,onMinimize:c,minimizeTargetPosition:d,enableSharedModalDimensions:p})=>{const u=t.component;const r=!t.minimized;const f={...t.props??{},...p?{enableSharedModalDimensions:true}:{}};if(t.modal&&(!t.launchMode||t.launchMode==="self-modal")){return(0,_jsxRuntime.jsx)("div",{"data-testid":`buoy-tool-instance-${t.id}`,style:{position:"fixed",inset:0,zIndex:s,pointerEvents:"none"},children:(0,_jsxRuntime.jsx)(_ToolHost.ToolModalShell,{app:t,config:t.modal,visible:r,zIndex:s,onClose:a,onMinimize:c,initialModalState:t.restoreState,enableSharedModalDimensions:p,bodyProps:f})})}if(t.launchMode==="self-modal"){return(0,_jsxRuntime.jsx)("div",{"data-testid":`buoy-tool-instance-${t.id}`,style:{position:"fixed",inset:0,zIndex:s,pointerEvents:"none"},children:(0,_jsxRuntime.jsx)(u,{...f,visible:r,onClose:a,onRequestClose:a,onMinimize:c,minimizeTargetPosition:d,instanceId:t.instanceId,zIndex:s,initialModalState:t.restoreState})})}if(t.launchMode==="inline"){if(!r)return null;return(0,_jsxRuntime.jsx)("div",{"data-testid":`buoy-tool-instance-${t.id}`,style:{position:"fixed",inset:0,zIndex:s,pointerEvents:"none"},children:(0,_jsxRuntime.jsx)(u,{...f,onClose:a,onMinimize:c,minimizeTargetPosition:d,initialModalState:t.restoreState,instanceId:t.instanceId})})}return(0,_jsxRuntime.jsx)("div",{"data-testid":`buoy-tool-instance-${t.id}`,style:{...backdropStyle,zIndex:s,display:r?"flex":"none"},children:(0,_jsxRuntime.jsx)("div",{style:cardStyle,children:(0,_jsxRuntime.jsx)(u,{...f,onClose:a,onMinimize:c,minimizeTargetPosition:d,initialModalState:t.restoreState,instanceId:t.instanceId})})})};const AppOverlay=()=>{const{openApps:t,close:s,minimize:a}=useAppHost();const{settings:c}=(0,_DevToolsSettingsModalShared.useDevToolsSettings)();(0,_react.useEffect)(()=>{(0,_sharedUi.setExpandableWindowControls)(c.globalSettings?.expandableWindowControls!==false)},[c.globalSettings?.expandableWindowControls]);const d=t.filter(r=>r.launchMode!=="toggle-only");if(d.length===0)return null;const p=d.filter(r=>r.minimized).length;const u=(0,_floatingToolsWeb.getBubbleAnchorPosition)()??dockIconPosition(p);return(0,_jsxRuntime.jsx)(_jsxRuntime.Fragment,{children:d.map((r,f)=>(0,_jsxRuntime.jsx)(AppRenderer,{app:r,zIndex:BASE_ZINDEX+f,onClose:()=>s(r.instanceId),onMinimize:h=>a(r.instanceId,h),enableSharedModalDimensions:c.globalSettings?.enableSharedModalDimensions===true,minimizeTargetPosition:u},r.instanceId))})};exports.AppOverlay=AppOverlay;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.useAppHost=exports.AppOverlay=exports.AppHostProvider=void 0;var _floating=require("@buoy-gg/shared-ui/floating");var _sharedUi=require("@buoy-gg/shared-ui");var _react=require("react");var _AppHostLogic=require("./AppHostLogic.js");var _AppIcon=require("./AppIcon");var _ToolHost=require("./ToolHost.js");var _DevToolsSettingsModalShared=require("./DevToolsSettingsModal.shared.js");var _floatingToolsWeb=require("./floatingTools.web.js");var _capacitorBackButton=require("./capacitorBackButton.js");var _backTarget=require("./backTarget.js");var _DevToolsVisibilityContext=require("./DevToolsVisibilityContext.js");var _jsxRuntime=require("react/jsx-runtime");const AppHostContext=(0,_react.createContext)(null);const STORAGE_KEY_OPEN_APPS="@react_buoy_open_apps";const ICON_SIZE=44;const ICON_GAP=12;const BOTTOM_OFFSET=100;const RIGHT_OFFSET=16;const dockIconPosition=t=>({x:window.innerWidth-ICON_SIZE-RIGHT_OFFSET,y:window.innerHeight-BOTTOM_OFFSET-ICON_SIZE-t*(ICON_SIZE+ICON_GAP)});const AppHostProvider=({children:t})=>{const[s,l]=(0,_react.useState)([]);const[a,c]=(0,_react.useState)(false);const f=(0,_react.useRef)([]);const u=(0,_react.useRef)(null);const r=(0,_react.useRef)(false);const p=(0,_react.useRef)(false);const v=(0,_react.useRef)(false);const b=(0,_react.useCallback)(e=>{let o="";l(i=>{const{apps:n,instanceId:d}=(0,_AppHostLogic.resolveOpenAppsState)(i,e,()=>`${e.id}-${Date.now()}-${Math.random().toString(36).slice(2)}`);o=d;return n});return o},[]);const h=(0,_react.useCallback)(()=>{if(r.current||!p.current||!v.current)return;r.current=true;const e=u.current;if(!e||e.length===0){c(true);return}u.current=null;e.forEach(({id:o,minimized:i})=>{const n=f.current.find(d=>d.id===o);if(n&&n.component){const d=(0,_AppIcon.renderAppIcon)(n.icon,{slot:"dial",size:20,color:n.color});b({id:n.id,title:n.name,component:n.component,props:n.props,modal:n.modal,launchMode:n.launchMode||"self-modal",singleton:n.singleton??true,icon:d,color:n.color,minimized:i})}});c(true)},[b]);(0,_react.useEffect)(()=>{let e=false;const o=async()=>{try{const i=await _sharedUi.persistentStorage.getItem(STORAGE_KEY_OPEN_APPS);if(e)return;if(i){const n=JSON.parse(i);let d;if(Array.isArray(n)&&n.length>0){if(typeof n[0]==="string"){d=n.map(m=>({id:m,minimized:false}))}else{d=n.filter(m=>typeof m==="object"&&m!==null&&typeof m.id==="string")}if(d.length){u.current=d}}}}catch{}if(e)return;p.current=true;h()};void o();return()=>{e=true}},[h]);(0,_react.useEffect)(()=>{if(!a)return;const e=s.map(o=>({id:o.id,minimized:o.minimized??false}));void _sharedUi.persistentStorage.setItem(STORAGE_KEY_OPEN_APPS,JSON.stringify(e))},[s,a]);const A=(0,_react.useCallback)(e=>{f.current=e;v.current=true;h()},[h]);const g=(0,_react.useCallback)(e=>{l(o=>{if(!o.length)return o;if(!e)return o.slice(0,-1);return o.filter(i=>i.instanceId!==e)})},[]);const x=(0,_react.useCallback)(()=>l([]),[]);const S=(0,_react.useCallback)((e,o)=>{l(i=>i.map(n=>n.instanceId===e?{...n,minimized:true,restoreState:o}:n))},[]);const I=(0,_react.useCallback)((e,o)=>{l(i=>(0,_AppHostLogic.restoreOpenApp)(i,e,o))},[]);const M=(0,_react.useCallback)(e=>{const o=s.find(i=>i.instanceId===e);return o?.minimized??false},[s]);const y=s.some(e=>e.launchMode!=="toggle-only"&&!e.minimized);(0,_react.useEffect)(()=>{if(!y)return;const e=o=>{if(o.key!=="Escape")return;if(o.defaultPrevented)return;const i=[...s].reverse().find(n=>n.launchMode!=="toggle-only"&&!n.minimized);if(i)g(i.instanceId)};return(0,_floating.listenBuoyKeydown)(e)},[y,g,s]);const{isDialOpen:C}=(0,_DevToolsVisibilityContext.useDevToolsVisibility)();(0,_capacitorBackButton.useCapacitorBackButton)(s.length>0,()=>{const e=(0,_backTarget.resolveBackTarget)(s,C);if(e?.kind==="tool")g(e.instanceId)});const _=(0,_react.useMemo)(()=>({openApps:s,isAnyOpen:y,open:b,close:g,closeAll:x,registerApps:A,minimize:S,restore:I,isMinimized:M}),[s,y,b,g,x,A,S,I,M]);return(0,_jsxRuntime.jsx)(AppHostContext.Provider,{value:_,children:t})};exports.AppHostProvider=AppHostProvider;const useAppHost=()=>{const t=(0,_react.useContext)(AppHostContext);if(!t){return{openApps:[],isAnyOpen:false,open:()=>"",close:()=>{},closeAll:()=>{},registerApps:()=>{},minimize:()=>{},restore:()=>{},isMinimized:()=>false}}return t};exports.useAppHost=useAppHost;const BASE_ZINDEX=9e3;const backdropStyle={position:"fixed",inset:0,backgroundColor:"rgba(0,0,0,0.28)",display:"flex",alignItems:"center",justifyContent:"center"};const cardStyle={maxHeight:"90%",width:"94%",borderRadius:12,backgroundColor:"white",overflow:"hidden"};const AppRenderer=({app:t,zIndex:s,onClose:l,onMinimize:a,minimizeTargetPosition:c,enableSharedModalDimensions:f})=>{const u=t.component;const r=!t.minimized;const p={...t.props??{},...f?{enableSharedModalDimensions:true}:{}};if(t.modal&&(!t.launchMode||t.launchMode==="self-modal")){return(0,_jsxRuntime.jsx)("div",{"data-testid":`buoy-tool-instance-${t.id}`,style:{position:"fixed",inset:0,zIndex:s,pointerEvents:"none"},children:(0,_jsxRuntime.jsx)(_ToolHost.ToolModalShell,{app:t,config:t.modal,visible:r,zIndex:s,onClose:l,onMinimize:a,initialModalState:t.restoreState,enableSharedModalDimensions:f,bodyProps:p})})}if(t.launchMode==="self-modal"){return(0,_jsxRuntime.jsx)("div",{"data-testid":`buoy-tool-instance-${t.id}`,style:{position:"fixed",inset:0,zIndex:s,pointerEvents:"none"},children:(0,_jsxRuntime.jsx)(u,{...p,visible:r,onClose:l,onRequestClose:l,onMinimize:a,minimizeTargetPosition:c,instanceId:t.instanceId,zIndex:s,initialModalState:t.restoreState})})}if(t.launchMode==="inline"){if(!r)return null;return(0,_jsxRuntime.jsx)("div",{"data-testid":`buoy-tool-instance-${t.id}`,style:{position:"fixed",inset:0,zIndex:s,pointerEvents:"none"},children:(0,_jsxRuntime.jsx)(u,{...p,onClose:l,onMinimize:a,minimizeTargetPosition:c,initialModalState:t.restoreState,instanceId:t.instanceId})})}return(0,_jsxRuntime.jsx)("div",{"data-testid":`buoy-tool-instance-${t.id}`,style:{...backdropStyle,zIndex:s,display:r?"flex":"none"},children:(0,_jsxRuntime.jsx)("div",{style:cardStyle,children:(0,_jsxRuntime.jsx)(u,{...p,onClose:l,onMinimize:a,minimizeTargetPosition:c,initialModalState:t.restoreState,instanceId:t.instanceId})})})};const AppOverlay=()=>{const{openApps:t,close:s,minimize:l}=useAppHost();const{settings:a}=(0,_DevToolsSettingsModalShared.useDevToolsSettings)();(0,_react.useEffect)(()=>{(0,_sharedUi.setExpandableWindowControls)(a.globalSettings?.expandableWindowControls!==false)},[a.globalSettings?.expandableWindowControls]);const c=t.filter(r=>r.launchMode!=="toggle-only");if(c.length===0)return null;const f=c.filter(r=>r.minimized).length;const u=(0,_floatingToolsWeb.getBubbleAnchorPosition)()??dockIconPosition(f);return(0,_jsxRuntime.jsx)(_jsxRuntime.Fragment,{children:c.map((r,p)=>(0,_jsxRuntime.jsx)(AppRenderer,{app:r,zIndex:BASE_ZINDEX+p,onClose:()=>s(r.instanceId),onMinimize:v=>l(r.instanceId,v),enableSharedModalDimensions:a.globalSettings?.enableSharedModalDimensions===true,minimizeTargetPosition:u},r.instanceId))})};exports.AppOverlay=AppOverlay;
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.resolveOpenAppsState=void 0;const resolveOpenAppsState=(s,i,p)=>{if(i.singleton){const e=s.find(n=>n.id===i.id);if(e){const n=e.minimized??false;return{instanceId:e.instanceId,wasMinimized:n,apps:[...s.filter(a=>a.instanceId!==e.instanceId),{...e,minimized:false}]}}}const t=p();return{instanceId:t,wasMinimized:false,apps:[...s,{...i,instanceId:t}]}};exports.resolveOpenAppsState=resolveOpenAppsState;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.restoreOpenApp=exports.resolveOpenAppsState=void 0;const resolveOpenAppsState=(s,i,n)=>{if(i.singleton){const e=s.find(p=>p.id===i.id);if(e){const p=e.minimized??false;return{instanceId:e.instanceId,wasMinimized:p,apps:[...s.filter(r=>r.instanceId!==e.instanceId),{...e,minimized:false}]}}}const t=n();return{instanceId:t,wasMinimized:false,apps:[...s,{...i,instanceId:t}]}};exports.resolveOpenAppsState=resolveOpenAppsState;const restoreOpenApp=(s,i,n)=>{const t=s.find(e=>e.instanceId===i);if(!t)return s;return[...s.filter(e=>e!==t),{...t,minimized:false,restoreState:n??t.restoreState}]};exports.restoreOpenApp=restoreOpenApp;
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.useDevToolsSettings=exports.DevToolsSettingsModal=void 0;var _react=require("react");var _reactNative=require("react-native");var _settingsBus=require("./settingsBus.js");var _useDesktopSyncStatus=require("./useDesktopSyncStatus");var _sharedUi=require("@buoy-gg/shared-ui");var _floatingToolsCore=require("@buoy-gg/floating-tools-core");var _DefaultConfigContext=require("./DefaultConfigContext.js");var _AppIcon=require("./AppIcon");var _jsxRuntime=require("react/jsx-runtime");const STORAGE_KEY="@react_buoy_dev_tools_settings";const MAX_DIAL_SLOTS=6;const enforceDialLimit=a=>{let l=MAX_DIAL_SLOTS;const s={};for(const[c,n]of Object.entries(a)){if(n&&l>0){s[c]=true;l-=1}else{s[c]=false}}return s};const sanitizeFloating=(a,l)=>{const{userStatus:s,environment:c,...n}=a;const i=l?Object.entries(n).filter(([d])=>l.includes(d)):Object.entries(n);return{...Object.fromEntries(i),environment:c??false}};const mergeWithDefaults=(a,l,s)=>{if(!l)return a;const c={...a.dialTools,...l.dialTools??{}};const n=s?.allowedDialKeys?Object.entries(c).filter(([d])=>s.allowedDialKeys?.includes(d)):Object.entries(c);const i=enforceDialLimit(Object.fromEntries(n));return{dialTools:i,floatingTools:sanitizeFloating({...a.floatingTools,...l.floatingTools??{}},s?.allowedFloatingKeys),globalSettings:{enableSharedModalDimensions:false,expandableWindowControls:true,...l.globalSettings??{}}}};const generateDefaultSettings=(a=[],l,s)=>{const c={};const n={};const i=new Set(l??[]);const d=new Set(s??[]);const g=!s||s.length===0;for(const x of a){const{id:r,slot:p="both"}=x;if(p==="dial"||p==="both"){c[r]=g?true:d.has(r)}if(p==="row"||p==="both"){n[r]=i.has(r)}}return{dialTools:enforceDialLimit(c),floatingTools:{...n,environment:i.has("environment")},globalSettings:{enableSharedModalDimensions:false,expandableWindowControls:true}}};const DevToolsSettingsModal=({visible:a,onClose:l,onSettingsChange:s,initialSettings:c,availableApps:n=[],storage:i=_sharedUi.persistentStorage,zIndex:d})=>{const{defaultFloatingTools:g,defaultDialTools:x}=(0,_DefaultConfigContext.useDefaultConfig)();const r=(0,_react.useMemo)(()=>generateDefaultSettings(n,g,x),[n,g,x]);const p=(0,_react.useMemo)(()=>Object.keys(r.dialTools),[r]);const E=(0,_react.useMemo)(()=>Object.keys(r.floatingTools).filter(e=>e!=="environment"),[r]);const[f,m]=(0,_react.useState)(c||cachedSettings||r);const[b,F]=(0,_react.useState)(cachedActiveTab??"floating");const[N,G]=(0,_react.useState)(cachedActiveTab!==null);const[C,Y]=(0,_react.useState)(new Set);const[$,O]=(0,_react.useState)(false);const[Q,X]=(0,_react.useState)(false);(0,_react.useEffect)(()=>{const e=requestAnimationFrame(()=>X(true));return()=>cancelAnimationFrame(e)},[]);const h=(0,_useDesktopSyncStatus.useDesktopSyncStatus)();(0,_react.useEffect)(()=>{const e=async()=>{try{const t=await _sharedUi.persistentStorage.getItem(_sharedUi.devToolsStorageKeys.settings.activeTab());if(t&&["floating","settings","pro"].includes(t)){const o=t;cachedActiveTab=o;F(u=>u===o?u:o)}}catch(t){}finally{G(true)}};e()},[]);(0,_react.useEffect)(()=>{if(!N)return;_sharedUi.persistentStorage.setItem(_sharedUi.devToolsStorageKeys.settings.activeTab(),b).catch(e=>{console.warn("[Buoy]","Failed to save settings active tab:",e)})},[b,N]);const Z=(0,_sharedUi.getUseLicense)();const S=Z?.();const j=S?.isPro??false;const I=!j&&S?.licenseKey?S.error:null;const ee=S?.errorKind==="transport";const[y,te]=(0,_react.useState)(cachedStorageBackend);const[B,V]=(0,_react.useState)(false);const[z,D]=(0,_react.useState)(false);const[T,oe]=(0,_react.useState)(false);const[R,k]=(0,_react.useState)([]);const[P,H]=(0,_react.useState)(false);const M=(0,_sharedUi.useSafeAreaInsets)();const K=_reactNative.Dimensions.get("window").height;const _=_reactNative.Dimensions.get("window").width;const se=Math.floor(K*.33);const ne=Math.min(_-32,400);const A=(0,_react.useCallback)(async()=>{try{const e=await i.getItem(STORAGE_KEY);if(e){const t=JSON.parse(e);const o=mergeWithDefaults(r,t,{allowedDialKeys:p,allowedFloatingKeys:E});cachedSettings=o;m(u=>sameSettings(u,o)?u:o);return}cachedSettings=r;m(t=>sameSettings(t,r)?t:r)}catch(e){console.error("[Buoy]","Failed to load dev tools settings:",e);m(r)}},[r,p,E,i]);(0,_react.useEffect)(()=>{A()},[A]);(0,_react.useEffect)(()=>{(0,_sharedUi.getStorageBackendType)().then(e=>{cachedStorageBackend=e;te(t=>t===e?t:e)})},[]);(0,_react.useEffect)(()=>{if(T){H(true);_sharedUi.persistentStorage.getAllKeys().then(e=>{k(e.sort())}).catch(()=>{k([])}).finally(()=>{H(false)})}},[T]);const W=async e=>{try{let t=null;try{const u=await i?.getItem(STORAGE_KEY);t=u?JSON.parse(u):null}catch{}const o={...e,dialTools:{...t?.dialTools,...enforceDialLimit(e.dialTools)},floatingTools:{...t?.floatingTools,...e.floatingTools}};await i.setItem(STORAGE_KEY,JSON.stringify(o));cachedSettings=o;m(o);s?.(o);_settingsBus.settingsBus.emit(o)}catch(t){console.error("[Buoy]","Failed to save dev tools settings:",t)}};const ie=e=>{const t={...f,floatingTools:{...f.floatingTools,[e]:!f.floatingTools[e]}};W(t)};const re=e=>{const t={...f,globalSettings:{...f.globalSettings,[e]:!f.globalSettings?.[e]}};W(t)};const ae=async()=>{V(true);D(false);try{await _sharedUi.persistentStorage.clear();D(true);m(r);if(i!==_sharedUi.persistentStorage)await i.setItem(STORAGE_KEY,JSON.stringify(r));s?.(r);_settingsBus.settingsBus.emit(r);setTimeout(()=>D(false),2e3)}catch(e){console.error("[Buoy]","Failed to clear storage:",e)}finally{V(false)}};const le=(0,_react.useCallback)(e=>{},[]);const ce=e=>{const t=n.find(o=>o.id===e);if(t?.description){return t.description}if(e==="environment"){return"Environment badge."}return""};const L=e=>{if(e==="environment"){return"Env Badge"}const t=n.find(o=>o.id===e);return t?.name??e.toUpperCase().replace(/_/g," ")};const de=e=>{if(!Q)return null;switch(e){case"query":return(0,_jsxRuntime.jsx)(_floatingToolsCore.QueryIcon,{size:18});case"env":return(0,_jsxRuntime.jsx)(_floatingToolsCore.EnvIcon,{size:18});case"sentry":return(0,_jsxRuntime.jsx)(_sharedUi.SentryIcon,{size:18,color:"#9945FF"});case"storage":return(0,_jsxRuntime.jsx)(_floatingToolsCore.StorageIcon,{size:18,bgColor:_sharedUi.night.color.surface});case"wifi":case"query-wifi-toggle":return(0,_jsxRuntime.jsx)(_sharedUi.WifiCircuitIcon,{size:18,colorPreset:"green",strength:4,noBackground:true});case"route-events":return(0,_jsxRuntime.jsx)(_floatingToolsCore.RoutesIcon,{size:18,bgColor:_sharedUi.night.color.surface});case"network":return(0,_jsxRuntime.jsx)(_floatingToolsCore.NetworkIcon,{size:18});case"environment":return(0,_jsxRuntime.jsx)(_floatingToolsCore.EnvIcon,{size:18});case"debug-borders":return(0,_jsxRuntime.jsx)(_sharedUi.Layers,{size:18,color:_sharedUi.night.color.accent});case"highlight-updates":return(0,_jsxRuntime.jsx)(_sharedUi.RenderCountIcon,{size:18,color:_sharedUi.night.color.accent});case"highlight-updates-modal":return(0,_jsxRuntime.jsx)(_floatingToolsCore.HighlighterIcon,{size:18});case"redux":return(0,_jsxRuntime.jsx)(_floatingToolsCore.ReduxIcon,{size:18});case"image-overlay":return(0,_jsxRuntime.jsx)(_sharedUi.ImageOverlayIcon,{size:18});case"events":return(0,_jsxRuntime.jsx)(_floatingToolsCore.EventsIcon,{size:18});case"zustand":try{const{ZustandIcon:t}=require("@buoy-gg/zustand");return(0,_jsxRuntime.jsx)(t,{size:18})}catch{return(0,_jsxRuntime.jsx)(_sharedUi.Info,{size:18,color:_sharedUi.night.color.textSecondary})}case"jotai":try{const{JotaiIcon:t}=require("@buoy-gg/jotai");return(0,_jsxRuntime.jsx)(t,{size:18})}catch{return(0,_jsxRuntime.jsx)(_sharedUi.Info,{size:18,color:_sharedUi.night.color.textSecondary})}default:{const t=n.find(o=>o.id===e);if(t?.icon!=null){return(0,_AppIcon.renderAppIcon)(t.icon,{slot:"row",size:18,color:t.color})}return(0,_jsxRuntime.jsx)(_sharedUi.Info,{size:18,color:_sharedUi.night.color.textSecondary})}}};const ge=(e,t,o,u)=>{const v=ce(e);return(0,_jsxRuntime.jsxs)(_reactNative.TouchableOpacity,{activeOpacity:o?1:.7,onPress:()=>!o&&u(),accessibilityLabel:L(e),accessibilityRole:"button",style:[styles.toolRow,o&&styles.rowDisabled],children:[(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.toolIconSlot,children:de(e)}),(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.rowInfo,children:[(0,_jsxRuntime.jsxs)(_reactNative.Text,{style:styles.rowLabel,children:[L(e),o?" \xB7 max 6":""]}),v?(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.rowCaption,numberOfLines:1,children:v}):null]}),(0,_jsxRuntime.jsx)(_sharedUi.NightSwitch,{value:t,disabled:o,onValueChange:()=>u(),accessibilityLabel:L(e)})]},e)};const q=e=>{Y(t=>{const o=new Set(t);if(o.has(e)){o.delete(e)}else{o.add(e)}return o})};const J=(e,t,o,u,v)=>{const ye=f.globalSettings?.[e]??false;const U=C.has(e);return(0,_jsxRuntime.jsxs)(_reactNative.View,{children:[(0,_jsxRuntime.jsxs)(_reactNative.TouchableOpacity,{activeOpacity:.7,onPress:()=>q(e),accessibilityLabel:t,style:styles.settingRow,children:[(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.rowInfo,children:[(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.rowLabel,children:t}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.rowCaption,numberOfLines:U?0:1,children:o})]}),(0,_jsxRuntime.jsx)(_sharedUi.NightSwitch,{value:ye,onValueChange:()=>re(e),accessibilityLabel:t})]}),U&&(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.settingRowBody,children:[(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.settingRowBodyText,children:u}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.settingRowBodyHint,children:v})]})]},e)};const w=(e,t,o)=>(0,_jsxRuntime.jsxs)(_reactNative.View,{children:[(0,_jsxRuntime.jsx)(_sharedUi.NightSectionLabel,{children:e}),t,o]});const ue=y==="filesystem"?(0,_jsxRuntime.jsx)(_sharedUi.NightBadge,{label:"File System",tone:"accent"}):y==="asyncstorage"?(0,_jsxRuntime.jsx)(_sharedUi.NightBadge,{label:"Async Storage",tone:"warning"}):y==="localstorage"?(0,_jsxRuntime.jsx)(_sharedUi.NightBadge,{label:"Local Storage",tone:"accent"}):y==="memory"?(0,_jsxRuntime.jsx)(_sharedUi.NightBadge,{label:"Memory",tone:"danger"}):(0,_jsxRuntime.jsx)(_sharedUi.NightBadge,{label:"Loading\u2026",tone:"neutral"});const he=()=>(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.container,children:[(0,_jsxRuntime.jsxs)(_reactNative.ScrollView,{style:styles.scrollContent,showsVerticalScrollIndicator:false,contentContainerStyle:styles.scrollContainer,children:[b==="floating"&&(0,_jsxRuntime.jsx)(_jsxRuntime.Fragment,{children:w("Floating Tools",(0,_jsxRuntime.jsx)(_sharedUi.NightCard,{glass:true,children:(0,_jsxRuntime.jsx)(_sharedUi.NightRows,{children:Object.entries(f.floatingTools).map(([e,t])=>ge(e,t,false,()=>ie(e)))})}),(0,_jsxRuntime.jsx)(_sharedUi.NightFootnote,{children:"Tools switched on here appear in the floating bubble row."}))}),b==="settings"&&(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[w("Background",(0,_jsxRuntime.jsx)(_sharedUi.NightCard,{glass:true,padded:true,children:(0,_jsxRuntime.jsx)(_sharedUi.BackgroundSwitcher,{embedded:true})})),w("Storage",(0,_jsxRuntime.jsxs)(_sharedUi.NightCard,{glass:true,children:[(0,_jsxRuntime.jsxs)(_reactNative.TouchableOpacity,{activeOpacity:.7,onPress:()=>oe(!T),accessibilityLabel:"Storage Type",style:styles.settingRow,children:[(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.rowInfo,children:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.rowLabel,children:"Storage Type"})}),ue,T?(0,_jsxRuntime.jsx)(_sharedUi.ChevronDown,{size:16,color:_sharedUi.night.color.textTertiary}):(0,_jsxRuntime.jsx)(_sharedUi.ChevronRightIcon,{size:16,color:_sharedUi.night.color.textTertiary})]}),T&&(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.settingRowBody,children:[(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.settingRowBodyText,children:y==="filesystem"?"Settings persist independently and survive AsyncStorage.clear() calls during logout.":y==="asyncstorage"?"Settings may be lost if AsyncStorage is cleared during logout.":y==="localstorage"?"Settings are saved in this browser. Clearing site data removes them.":y==="memory"?"Settings are stored in memory only and will be lost on app restart.":"Checking storage backend\u2026"}),y==="asyncstorage"&&(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[styles.settingRowBodyText,styles.bodyWarning],children:"Install expo-file-system to persist settings through logout flows."}),y==="memory"&&(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[styles.settingRowBodyText,styles.bodyDanger],children:"No persistent storage available \u2014 install expo-file-system (best) or @react-native-async-storage/async-storage."})]}),(0,_jsxRuntime.jsx)(_sharedUi.NightSeparator,{}),(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.storageExpanded,children:[(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.storageExpandedHeader,children:[(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.storageExpandedTitle,children:"SAVED SETTINGS"}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.storageExpandedCount,children:P?"\u2026":`${R.length} keys`})]}),P?(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.storageKeyEmpty,children:"Loading\u2026"}):R.length===0?(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.storageKeyEmpty,children:"No settings saved yet"}):(0,_jsxRuntime.jsx)(_reactNative.ScrollView,{style:styles.storageKeysList,nestedScrollEnabled:true,showsVerticalScrollIndicator:true,children:R.map(e=>(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.storageKeyItem,children:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.storageKeyText,numberOfLines:1,children:e.replace("@react_buoy_","")})},e))})]}),(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.cardButtonWrap,children:(0,_jsxRuntime.jsx)(_sharedUi.NightButton,{label:z?"Cleared":B?"Clearing\u2026":"Clear All Settings",variant:z?"secondary":"destructive",size:"md",disabled:B,onPress:ae,icon:z?(0,_jsxRuntime.jsx)(_sharedUi.CheckCircle2,{size:15,color:_sharedUi.night.color.accent}):(0,_jsxRuntime.jsx)(_sharedUi.Trash2,{size:15,color:B?_sharedUi.night.color.textTertiary:_sharedUi.night.color.danger})})})]})]})),h&&h.state!=="idle"&&w("Desktop Sync",(0,_jsxRuntime.jsxs)(_sharedUi.NightCard,{glass:true,children:[(0,_jsxRuntime.jsxs)(_reactNative.TouchableOpacity,{activeOpacity:.7,onPress:()=>q("desktopSync"),accessibilityLabel:"Buoy Desktop",style:styles.settingRow,children:[(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.rowInfo,children:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.rowLabel,children:"Buoy Desktop"})}),h.state==="connected"?(0,_jsxRuntime.jsx)(_sharedUi.NightBadge,{label:"Connected",tone:"accent"}):h.state==="connecting"?(0,_jsxRuntime.jsx)(_sharedUi.NightBadge,{label:"Connecting\u2026",tone:"neutral"}):(0,_jsxRuntime.jsx)(_sharedUi.NightBadge,{label:"Retrying",tone:"warning"}),C.has("desktopSync")?(0,_jsxRuntime.jsx)(_sharedUi.ChevronDown,{size:16,color:_sharedUi.night.color.textTertiary}):(0,_jsxRuntime.jsx)(_sharedUi.ChevronRightIcon,{size:16,color:_sharedUi.night.color.textTertiary})]}),C.has("desktopSync")&&(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.settingRowBody,children:[(0,_jsxRuntime.jsxs)(_reactNative.Text,{style:styles.settingRowBodyText,children:[h.state==="connected"?"Streaming tool data to Buoy Desktop at ":"Trying to reach Buoy Desktop at ",(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.footnoteMono,children:h.targetURL??"(unknown URL)"}),h.state!=="connected"&&" \u2014 is the desktop app running? Override with the externalSync socketURL option if it runs elsewhere."]}),h.state==="retrying"&&h.lastError&&(0,_jsxRuntime.jsxs)(_reactNative.Text,{style:[styles.settingRowBodyText,styles.bodyWarning],children:["Last error: ",h.lastError]})]})]})),w("Modal Behavior",(0,_jsxRuntime.jsx)(_sharedUi.NightCard,{glass:true,children:(0,_jsxRuntime.jsxs)(_sharedUi.NightRows,{children:[J("enableSharedModalDimensions","Shared Modal Size","Sync dimensions across all tools","When enabled, all tool modals will share the same size and position. Resizing one modal will affect all others. When disabled, each tool remembers its own size and position independently.","Keep OFF for the best experience. This allows you to customize each tool's modal size separately."),(0,_sharedUi.expandableWindowControlsSupported)(_reactNative.Platform.OS==="web")?J("expandableWindowControls","Expand Controls","iPad-style expandable window buttons","When enabled, the window control buttons (minimize, toggle mode, close) start as small dots and expand into larger, easy-to-tap buttons when pressed. When disabled, buttons are directly tappable at their small size.","Keep ON for touch devices where the small buttons are hard to press. Turn OFF if you prefer direct single-tap access."):null]})}))]}),b==="pro"&&(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[w("License",(0,_jsxRuntime.jsxs)(_sharedUi.NightCard,{glass:true,children:[(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.settingRow,children:[(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.rowInfo,children:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.rowLabel,children:"License Status"})}),(0,_jsxRuntime.jsx)(_reactNative.View,{testID:"buoy-settings-license-status",accessibilityLabel:j?"License: Active":"License: Free",children:j?(0,_jsxRuntime.jsx)(_sharedUi.NightBadge,{label:"Active",tone:"accent"}):(0,_jsxRuntime.jsx)(_sharedUi.NightBadge,{label:"Free",tone:"neutral"})})]}),S?.tierSource==="session"?(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.settingRow,children:[(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.rowInfo,children:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.rowLabel,children:"Signed in with Buoy"})}),(0,_jsxRuntime.jsx)(_sharedUi.NightButton,{label:"Sign out",variant:"secondary",size:"md",onPress:()=>void(0,_sharedUi.signOutOfBuoy)(),testID:"buoy-settings-signout"})]}):null,S?.teamRole?(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.settingRow,testID:"buoy-settings-team-role",children:(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.rowInfo,children:[(0,_jsxRuntime.jsxs)(_reactNative.Text,{style:styles.rowLabel,children:["Role: ",S.teamRole]}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.rowCaption,children:S.allowedTools?"Your team picks the tools you see.":"You see all tools."})]})}):null]}),(0,_jsxRuntime.jsx)(_sharedUi.NightFootnote,{children:j?"You have full access to all Buoy DevTools features.":I?ee?`Couldn't reach the license server (${I}). A VPN or corporate proxy can block buoy.gg \u2014 turn it off and reload. Your key hasn't been rejected.`:`License check failed: ${I}.`:"Upgrade to Pro to unlock all features and support development."})),!j&&(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[w("Pro Features",(0,_jsxRuntime.jsx)(_sharedUi.NightCard,{glass:true,children:(0,_jsxRuntime.jsx)(_sharedUi.NightRows,{children:["Advanced Settings","Priority Support"].map(e=>(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.featureRow,children:[(0,_jsxRuntime.jsx)(_sharedUi.CheckCircle2,{size:16,color:_sharedUi.night.color.accent}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.rowLabel,children:e})]},e))})})),(0,_jsxRuntime.jsx)(_sharedUi.NightButton,{label:"Upgrade to Pro",variant:"primary",size:"lg",onPress:()=>O(true)})]})]})]}),(0,_jsxRuntime.jsx)(_sharedUi.BuoyUpgradeSheet,{visible:$,onClose:()=>O(false)})]});return(0,_jsxRuntime.jsx)(_sharedUi.JsModal,{visible:a,onClose:l,zIndex:d,variant:"night",header:{showToggleButton:false,customContent:(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.headerRow,children:(0,_jsxRuntime.jsx)(_sharedUi.NightSegmented,{glass:true,tabs:[{key:"floating",label:"Floating"},{key:"settings",label:"Settings"},{key:"pro",label:"Pro"}],activeKey:b,onChange:e=>F(e)})})},initialMode:"bottomSheet",onModeChange:le,persistenceKey:_sharedUi.devToolsStorageKeys.settings.root(),enablePersistence:true,maxHeight:K-M.top,initialHeight:se,initialFloatingPosition:{x:(_-ne)/2,y:M.top+20},enableGlitchEffects:true,children:he()})};exports.DevToolsSettingsModal=DevToolsSettingsModal;const basicDefaultSettings={dialTools:{},floatingTools:{environment:false},globalSettings:{enableSharedModalDimensions:false}};const createDefaultsFromConfig=(a,l)=>{const s=new Set(a??[]);const c=new Set(l??[]);const n={};for(const d of c){n[d]=true}const i={environment:s.has("environment")};for(const d of s){if(d!=="environment"){i[d]=true}}return{dialTools:enforceDialLimit(n),floatingTools:i,globalSettings:{enableSharedModalDimensions:false}}};let cachedSettings=null;let cachedActiveTab=null;let cachedStorageBackend=null;const sameSettings=(a,l)=>JSON.stringify(a)===JSON.stringify(l);_settingsBus.settingsBus.addListener(a=>{if(a)cachedSettings=a});const useDevToolsSettings=()=>{const{defaultFloatingTools:a,defaultDialTools:l}=(0,_DefaultConfigContext.useDefaultConfig)();const s=(0,_react.useMemo)(()=>{if(!a&&!l){return basicDefaultSettings}return createDefaultsFromConfig(a,l)},[a,l]);const[c,n]=(0,_react.useState)(s);const i=(0,_react.useCallback)(async()=>{try{const g=await _sharedUi.persistentStorage.getItem(STORAGE_KEY);if(g){const x=JSON.parse(g);const r=mergeWithDefaults(s,x);n(r);return}n(s)}catch(g){console.error("[Buoy]","Failed to load dev tools settings:",g);n(s)}},[s]);(0,_react.useEffect)(()=>(0,_sharedUi.onSettingsApplied)(g=>{if(g.includes(STORAGE_KEY))void i()}),[i]);(0,_react.useEffect)(()=>{i();const g=_settingsBus.settingsBus.addListener(x=>{try{if(x){n(x)}}catch(r){}});return()=>{g()}},[i]);const d=(0,_react.useCallback)(()=>{i()},[i]);return{settings:c,refreshSettings:d}};exports.useDevToolsSettings=useDevToolsSettings;const styles=_reactNative.StyleSheet.create({container:{flex:1,backgroundColor:"transparent"},headerRow:{flexDirection:"row",alignItems:"center",paddingLeft:_sharedUi.night.gutter,paddingRight:_sharedUi.night.gutter,paddingBottom:8},scrollContent:{flex:1},scrollContainer:{paddingHorizontal:_sharedUi.night.gutter,paddingTop:8,paddingBottom:24,gap:_sharedUi.night.groupGap},toolRow:{flexDirection:"row",alignItems:"center",gap:12,paddingHorizontal:_sharedUi.night.rowPadH,paddingVertical:12},settingRow:{flexDirection:"row",alignItems:"center",gap:10,paddingHorizontal:_sharedUi.night.rowPadH,paddingVertical:_sharedUi.night.rowPadV,minHeight:52},featureRow:{flexDirection:"row",alignItems:"center",gap:10,paddingHorizontal:_sharedUi.night.rowPadH,paddingVertical:12},rowDisabled:{opacity:.4},toolIconSlot:{width:24,alignItems:"center"},rowInfo:{flex:1,gap:2},rowLabel:{color:_sharedUi.night.color.text,fontSize:_sharedUi.night.font.row,fontWeight:"500"},rowCaption:{color:_sharedUi.night.color.textTertiary,fontSize:_sharedUi.night.font.label},settingRowBody:{paddingHorizontal:_sharedUi.night.rowPadH,paddingBottom:_sharedUi.night.rowPadV,gap:6},settingRowBodyText:{color:_sharedUi.night.color.textSecondary,fontSize:_sharedUi.night.font.caption,lineHeight:_sharedUi.night.font.caption*1.45},settingRowBodyHint:{color:_sharedUi.night.color.textTertiary,fontSize:_sharedUi.night.font.caption,lineHeight:_sharedUi.night.font.caption*1.45},bodyWarning:{color:_sharedUi.night.color.warning},bodyDanger:{color:_sharedUi.night.color.danger},cardButtonWrap:{paddingHorizontal:_sharedUi.night.cardPad,paddingTop:10,paddingBottom:_sharedUi.night.cardPad},storageExpanded:{paddingHorizontal:_sharedUi.night.rowPadH,paddingVertical:12,gap:8},storageExpandedHeader:{flexDirection:"row",alignItems:"center"},storageExpandedTitle:{flex:1,color:_sharedUi.night.color.textSecondary,fontSize:_sharedUi.night.font.micro,fontWeight:"600",letterSpacing:.5},storageExpandedCount:{color:_sharedUi.night.color.textTertiary,fontSize:_sharedUi.night.font.micro},storageKeysList:{maxHeight:150},storageKeyItem:{backgroundColor:_sharedUi.night.color.glassElevated,borderRadius:_sharedUi.night.radius.segment,paddingHorizontal:10,paddingVertical:7,marginBottom:4},storageKeyText:{color:_sharedUi.night.color.textSecondary,fontSize:_sharedUi.night.font.micro,fontFamily:_sharedUi.monoFont},storageKeyEmpty:{color:_sharedUi.night.color.textTertiary,fontSize:_sharedUi.night.font.caption,fontStyle:"italic"},footnoteMono:{fontFamily:_sharedUi.monoFont,fontSize:_sharedUi.night.font.label,color:_sharedUi.night.color.textSecondary}});
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.useDevToolsSettings=exports.DevToolsSettingsModal=void 0;var _react=require("react");var _reactNative=require("react-native");var _settingsBus=require("./settingsBus.js");var _useDesktopSyncStatus=require("./useDesktopSyncStatus");var _sharedUi=require("@buoy-gg/shared-ui");var _floatingToolsCore=require("@buoy-gg/floating-tools-core");var _DefaultConfigContext=require("./DefaultConfigContext.js");var _AppIcon=require("./AppIcon");var _jsxRuntime=require("react/jsx-runtime");const STORAGE_KEY="@react_buoy_dev_tools_settings";const MAX_DIAL_SLOTS=6;const enforceDialLimit=a=>{let l=MAX_DIAL_SLOTS;const s={};for(const[c,n]of Object.entries(a)){if(n&&l>0){s[c]=true;l-=1}else{s[c]=false}}return s};const sanitizeFloating=(a,l)=>{const{userStatus:s,environment:c,...n}=a;const i=l?Object.entries(n).filter(([d])=>l.includes(d)):Object.entries(n);return{...Object.fromEntries(i),environment:c??false}};const mergeWithDefaults=(a,l,s)=>{if(!l)return a;const c={...a.dialTools,...l.dialTools??{}};const n=s?.allowedDialKeys?Object.entries(c).filter(([d])=>s.allowedDialKeys?.includes(d)):Object.entries(c);const i=enforceDialLimit(Object.fromEntries(n));return{dialTools:i,floatingTools:sanitizeFloating({...a.floatingTools,...l.floatingTools??{}},s?.allowedFloatingKeys),globalSettings:{enableSharedModalDimensions:false,expandableWindowControls:true,...l.globalSettings??{}}}};const generateDefaultSettings=(a=[],l,s)=>{const c={};const n={};const i=new Set(l??[]);const d=new Set(s??[]);const g=!s||s.length===0;for(const x of a){const{id:r,slot:p="both"}=x;if(p==="dial"||p==="both"){c[r]=g?true:d.has(r)}if(p==="row"||p==="both"){n[r]=i.has(r)}}return{dialTools:enforceDialLimit(c),floatingTools:{...n,environment:i.has("environment")},globalSettings:{enableSharedModalDimensions:false,expandableWindowControls:true}}};const DevToolsSettingsModal=({visible:a,onClose:l,onSettingsChange:s,initialSettings:c,availableApps:n=[],storage:i=_sharedUi.persistentStorage,zIndex:d})=>{const{defaultFloatingTools:g,defaultDialTools:x}=(0,_DefaultConfigContext.useDefaultConfig)();const r=(0,_react.useMemo)(()=>generateDefaultSettings(n,g,x),[n,g,x]);const p=(0,_react.useMemo)(()=>Object.keys(r.dialTools),[r]);const E=(0,_react.useMemo)(()=>Object.keys(r.floatingTools).filter(e=>e!=="environment"),[r]);const[f,m]=(0,_react.useState)(c||cachedSettings||r);const[b,k]=(0,_react.useState)(cachedActiveTab??"floating");const[F,G]=(0,_react.useState)(cachedActiveTab!==null);const[C,Y]=(0,_react.useState)(new Set);const[$,N]=(0,_react.useState)(false);const[Q,X]=(0,_react.useState)(false);(0,_react.useEffect)(()=>{const e=requestAnimationFrame(()=>X(true));return()=>cancelAnimationFrame(e)},[]);const h=(0,_useDesktopSyncStatus.useDesktopSyncStatus)();(0,_react.useEffect)(()=>{const e=async()=>{try{const t=await _sharedUi.persistentStorage.getItem(_sharedUi.devToolsStorageKeys.settings.activeTab());if(t&&["floating","settings","pro"].includes(t)){const o=t;cachedActiveTab=o;k(u=>u===o?u:o)}}catch(t){}finally{G(true)}};e()},[]);(0,_react.useEffect)(()=>{if(!F)return;_sharedUi.persistentStorage.setItem(_sharedUi.devToolsStorageKeys.settings.activeTab(),b).catch(e=>{console.warn("[Buoy]","Failed to save settings active tab:",e)})},[b,F]);const Z=(0,_sharedUi.getUseLicense)();const S=Z?.();const j=S?.isPro??false;const I=!j&&S?.licenseKey?S.error:null;const ee=S?.errorKind==="transport";const[y,te]=(0,_react.useState)(cachedStorageBackend);const[B,O]=(0,_react.useState)(false);const[z,D]=(0,_react.useState)(false);const[T,oe]=(0,_react.useState)(false);const[R,V]=(0,_react.useState)([]);const[P,H]=(0,_react.useState)(false);const M=(0,_sharedUi.useSafeAreaInsets)();const K=_reactNative.Dimensions.get("window").height;const _=_reactNative.Dimensions.get("window").width;const se=Math.floor(K*.33);const ne=Math.min(_-32,400);const A=(0,_react.useCallback)(async()=>{try{const e=await i.getItem(STORAGE_KEY);if(e){const t=JSON.parse(e);const o=mergeWithDefaults(r,t,{allowedDialKeys:p,allowedFloatingKeys:E});cachedSettings=o;m(u=>sameSettings(u,o)?u:o);return}cachedSettings=r;m(t=>sameSettings(t,r)?t:r)}catch(e){console.error("[Buoy]","Failed to load dev tools settings:",e);m(r)}},[r,p,E,i]);(0,_react.useEffect)(()=>{A()},[A]);(0,_react.useEffect)(()=>{(0,_sharedUi.getStorageBackendType)().then(e=>{cachedStorageBackend=e;te(t=>t===e?t:e)})},[]);(0,_react.useEffect)(()=>{if(T){H(true);_sharedUi.persistentStorage.getAllKeys().then(e=>{V(e.sort())}).catch(()=>{V([])}).finally(()=>{H(false)})}},[T]);const W=async e=>{try{let t=null;try{const u=await i?.getItem(STORAGE_KEY);t=u?JSON.parse(u):null}catch{}const o={...e,dialTools:{...t?.dialTools,...enforceDialLimit(e.dialTools)},floatingTools:{...t?.floatingTools,...e.floatingTools}};await i.setItem(STORAGE_KEY,JSON.stringify(o));cachedSettings=o;m(o);s?.(o);_settingsBus.settingsBus.emit(o)}catch(t){console.error("[Buoy]","Failed to save dev tools settings:",t)}};const ie=e=>{const t={...f,floatingTools:{...f.floatingTools,[e]:!f.floatingTools[e]}};W(t)};const re=e=>{const t={...f,globalSettings:{...f.globalSettings,[e]:!f.globalSettings?.[e]}};W(t)};const ae=async()=>{O(true);D(false);try{await _sharedUi.persistentStorage.clear();D(true);m(r);if(i!==_sharedUi.persistentStorage)await i.setItem(STORAGE_KEY,JSON.stringify(r));s?.(r);_settingsBus.settingsBus.emit(r);setTimeout(()=>D(false),2e3)}catch(e){console.error("[Buoy]","Failed to clear storage:",e)}finally{O(false)}};const le=(0,_react.useCallback)(e=>{},[]);const ce=e=>{const t=n.find(o=>o.id===e);if(t?.description){return t.description}if(e==="environment"){return"Environment badge."}return""};const L=e=>{if(e==="environment"){return"Env Badge"}const t=n.find(o=>o.id===e);return t?.name??e.toUpperCase().replace(/_/g," ")};const de=e=>{if(!Q)return null;switch(e){case"query":return(0,_jsxRuntime.jsx)(_floatingToolsCore.QueryIcon,{size:18});case"env":return(0,_jsxRuntime.jsx)(_floatingToolsCore.EnvIcon,{size:18});case"sentry":return(0,_jsxRuntime.jsx)(_sharedUi.SentryIcon,{size:18,color:"#9945FF"});case"storage":return(0,_jsxRuntime.jsx)(_floatingToolsCore.StorageIcon,{size:18,bgColor:_sharedUi.night.color.surface});case"wifi":case"query-wifi-toggle":return(0,_jsxRuntime.jsx)(_sharedUi.WifiCircuitIcon,{size:18,colorPreset:"green",strength:4,noBackground:true});case"route-events":return(0,_jsxRuntime.jsx)(_floatingToolsCore.RoutesIcon,{size:18,bgColor:_sharedUi.night.color.surface});case"network":return(0,_jsxRuntime.jsx)(_floatingToolsCore.NetworkIcon,{size:18});case"environment":return(0,_jsxRuntime.jsx)(_floatingToolsCore.EnvIcon,{size:18});case"debug-borders":return(0,_jsxRuntime.jsx)(_sharedUi.Layers,{size:18,color:_sharedUi.night.color.accent});case"highlight-updates":return(0,_jsxRuntime.jsx)(_sharedUi.RenderCountIcon,{size:18,color:_sharedUi.night.color.accent});case"highlight-updates-modal":return(0,_jsxRuntime.jsx)(_floatingToolsCore.HighlighterIcon,{size:18});case"redux":return(0,_jsxRuntime.jsx)(_floatingToolsCore.ReduxIcon,{size:18});case"image-overlay":return(0,_jsxRuntime.jsx)(_sharedUi.ImageOverlayIcon,{size:18});case"events":return(0,_jsxRuntime.jsx)(_floatingToolsCore.EventsIcon,{size:18});case"zustand":try{const{ZustandIcon:t}=require("@buoy-gg/zustand");return(0,_jsxRuntime.jsx)(t,{size:18})}catch{return(0,_jsxRuntime.jsx)(_sharedUi.Info,{size:18,color:_sharedUi.night.color.textSecondary})}case"jotai":try{const{JotaiIcon:t}=require("@buoy-gg/jotai");return(0,_jsxRuntime.jsx)(t,{size:18})}catch{return(0,_jsxRuntime.jsx)(_sharedUi.Info,{size:18,color:_sharedUi.night.color.textSecondary})}default:{const t=n.find(o=>o.id===e);if(t?.icon!=null){return(0,_AppIcon.renderAppIcon)(t.icon,{slot:"row",size:18,color:t.color})}return(0,_jsxRuntime.jsx)(_sharedUi.Info,{size:18,color:_sharedUi.night.color.textSecondary})}}};const ge=(e,t,o,u)=>{const v=ce(e);return(0,_jsxRuntime.jsxs)(_reactNative.TouchableOpacity,{activeOpacity:o?1:.7,onPress:()=>!o&&u(),accessibilityLabel:L(e),accessibilityRole:"button",style:[styles.toolRow,o&&styles.rowDisabled],children:[(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.toolIconSlot,children:de(e)}),(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.rowInfo,children:[(0,_jsxRuntime.jsxs)(_reactNative.Text,{style:styles.rowLabel,children:[L(e),o?" \xB7 max 6":""]}),v?(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.rowCaption,numberOfLines:1,children:v}):null]}),(0,_jsxRuntime.jsx)(_sharedUi.NightSwitch,{value:t,disabled:o,onValueChange:()=>u(),accessibilityLabel:L(e)})]},e)};const q=e=>{Y(t=>{const o=new Set(t);if(o.has(e)){o.delete(e)}else{o.add(e)}return o})};const J=(e,t,o,u,v)=>{const ye=f.globalSettings?.[e]??false;const U=C.has(e);return(0,_jsxRuntime.jsxs)(_reactNative.View,{children:[(0,_jsxRuntime.jsxs)(_reactNative.TouchableOpacity,{activeOpacity:.7,onPress:()=>q(e),accessibilityLabel:t,style:styles.settingRow,children:[(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.rowInfo,children:[(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.rowLabel,children:t}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.rowCaption,numberOfLines:U?0:1,children:o})]}),(0,_jsxRuntime.jsx)(_sharedUi.NightSwitch,{value:ye,onValueChange:()=>re(e),accessibilityLabel:t})]}),U&&(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.settingRowBody,children:[(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.settingRowBodyText,children:u}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.settingRowBodyHint,children:v})]})]},e)};const w=(e,t,o)=>(0,_jsxRuntime.jsxs)(_reactNative.View,{children:[(0,_jsxRuntime.jsx)(_sharedUi.NightSectionLabel,{children:e}),t,o]});const ue=y==="filesystem"?(0,_jsxRuntime.jsx)(_sharedUi.NightBadge,{label:"File System",tone:"accent"}):y==="asyncstorage"?(0,_jsxRuntime.jsx)(_sharedUi.NightBadge,{label:"Async Storage",tone:"warning"}):y==="localstorage"?(0,_jsxRuntime.jsx)(_sharedUi.NightBadge,{label:"Local Storage",tone:"accent"}):y==="memory"?(0,_jsxRuntime.jsx)(_sharedUi.NightBadge,{label:"Memory",tone:"danger"}):(0,_jsxRuntime.jsx)(_sharedUi.NightBadge,{label:"Loading\u2026",tone:"neutral"});const he=()=>(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.container,children:[(0,_jsxRuntime.jsxs)(_reactNative.ScrollView,{keyboardShouldPersistTaps:"handled",style:styles.scrollContent,showsVerticalScrollIndicator:false,contentContainerStyle:styles.scrollContainer,children:[b==="floating"&&(0,_jsxRuntime.jsx)(_jsxRuntime.Fragment,{children:w("Floating Tools",(0,_jsxRuntime.jsx)(_sharedUi.NightCard,{glass:true,children:(0,_jsxRuntime.jsx)(_sharedUi.NightRows,{children:Object.entries(f.floatingTools).map(([e,t])=>ge(e,t,false,()=>ie(e)))})}),(0,_jsxRuntime.jsx)(_sharedUi.NightFootnote,{children:"Tools switched on here appear in the floating bubble row."}))}),b==="settings"&&(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[w("Background",(0,_jsxRuntime.jsx)(_sharedUi.NightCard,{glass:true,padded:true,children:(0,_jsxRuntime.jsx)(_sharedUi.BackgroundSwitcher,{embedded:true})})),w("Storage",(0,_jsxRuntime.jsxs)(_sharedUi.NightCard,{glass:true,children:[(0,_jsxRuntime.jsxs)(_reactNative.TouchableOpacity,{activeOpacity:.7,onPress:()=>oe(!T),accessibilityLabel:"Storage Type",style:styles.settingRow,children:[(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.rowInfo,children:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.rowLabel,children:"Storage Type"})}),ue,T?(0,_jsxRuntime.jsx)(_sharedUi.ChevronDown,{size:16,color:_sharedUi.night.color.textTertiary}):(0,_jsxRuntime.jsx)(_sharedUi.ChevronRightIcon,{size:16,color:_sharedUi.night.color.textTertiary})]}),T&&(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.settingRowBody,children:[(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.settingRowBodyText,children:y==="filesystem"?"Settings persist independently and survive AsyncStorage.clear() calls during logout.":y==="asyncstorage"?"Settings may be lost if AsyncStorage is cleared during logout.":y==="localstorage"?"Settings are saved in this browser. Clearing site data removes them.":y==="memory"?"Settings are stored in memory only and will be lost on app restart.":"Checking storage backend\u2026"}),y==="asyncstorage"&&(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[styles.settingRowBodyText,styles.bodyWarning],children:"Install expo-file-system to persist settings through logout flows."}),y==="memory"&&(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[styles.settingRowBodyText,styles.bodyDanger],children:"No persistent storage available \u2014 install expo-file-system (best) or @react-native-async-storage/async-storage."})]}),(0,_jsxRuntime.jsx)(_sharedUi.NightSeparator,{}),(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.storageExpanded,children:[(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.storageExpandedHeader,children:[(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.storageExpandedTitle,children:"SAVED SETTINGS"}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.storageExpandedCount,children:P?"\u2026":`${R.length} keys`})]}),P?(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.storageKeyEmpty,children:"Loading\u2026"}):R.length===0?(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.storageKeyEmpty,children:"No settings saved yet"}):(0,_jsxRuntime.jsx)(_reactNative.ScrollView,{keyboardShouldPersistTaps:"handled",style:styles.storageKeysList,nestedScrollEnabled:true,showsVerticalScrollIndicator:true,children:R.map(e=>(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.storageKeyItem,children:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.storageKeyText,numberOfLines:1,children:e.replace("@react_buoy_","")})},e))})]}),(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.cardButtonWrap,children:(0,_jsxRuntime.jsx)(_sharedUi.NightButton,{label:z?"Cleared":B?"Clearing\u2026":"Clear All Settings",variant:z?"secondary":"destructive",size:"md",disabled:B,onPress:ae,icon:z?(0,_jsxRuntime.jsx)(_sharedUi.CheckCircle2,{size:15,color:_sharedUi.night.color.accent}):(0,_jsxRuntime.jsx)(_sharedUi.Trash2,{size:15,color:B?_sharedUi.night.color.textTertiary:_sharedUi.night.color.danger})})})]})]})),h&&h.state!=="idle"&&w("Desktop Sync",(0,_jsxRuntime.jsxs)(_sharedUi.NightCard,{glass:true,children:[(0,_jsxRuntime.jsxs)(_reactNative.TouchableOpacity,{activeOpacity:.7,onPress:()=>q("desktopSync"),accessibilityLabel:"Buoy Desktop",style:styles.settingRow,children:[(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.rowInfo,children:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.rowLabel,children:"Buoy Desktop"})}),h.state==="connected"?(0,_jsxRuntime.jsx)(_sharedUi.NightBadge,{label:"Connected",tone:"accent"}):h.state==="connecting"?(0,_jsxRuntime.jsx)(_sharedUi.NightBadge,{label:"Connecting\u2026",tone:"neutral"}):(0,_jsxRuntime.jsx)(_sharedUi.NightBadge,{label:"Retrying",tone:"warning"}),C.has("desktopSync")?(0,_jsxRuntime.jsx)(_sharedUi.ChevronDown,{size:16,color:_sharedUi.night.color.textTertiary}):(0,_jsxRuntime.jsx)(_sharedUi.ChevronRightIcon,{size:16,color:_sharedUi.night.color.textTertiary})]}),C.has("desktopSync")&&(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.settingRowBody,children:[(0,_jsxRuntime.jsxs)(_reactNative.Text,{style:styles.settingRowBodyText,children:[h.state==="connected"?"Streaming tool data to Buoy Desktop at ":"Trying to reach Buoy Desktop at ",(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.footnoteMono,children:h.targetURL??"(unknown URL)"}),h.state!=="connected"&&" \u2014 is the desktop app running? Override with the externalSync socketURL option if it runs elsewhere."]}),h.state==="retrying"&&h.lastError&&(0,_jsxRuntime.jsxs)(_reactNative.Text,{style:[styles.settingRowBodyText,styles.bodyWarning],children:["Last error: ",h.lastError]})]})]})),w("Modal Behavior",(0,_jsxRuntime.jsx)(_sharedUi.NightCard,{glass:true,children:(0,_jsxRuntime.jsxs)(_sharedUi.NightRows,{children:[J("enableSharedModalDimensions","Shared Modal Size","Sync dimensions across all tools","When enabled, all tool modals will share the same size and position. Resizing one modal will affect all others. When disabled, each tool remembers its own size and position independently.","Keep OFF for the best experience. This allows you to customize each tool's modal size separately."),(0,_sharedUi.expandableWindowControlsSupported)(_reactNative.Platform.OS==="web")?J("expandableWindowControls","Expand Controls","iPad-style expandable window buttons","When enabled, the window control buttons (minimize, toggle mode, close) start as small dots and expand into larger, easy-to-tap buttons when pressed. When disabled, buttons are directly tappable at their small size.","Keep ON for touch devices where the small buttons are hard to press. Turn OFF if you prefer direct single-tap access."):null]})}))]}),b==="pro"&&(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[w("License",(0,_jsxRuntime.jsxs)(_sharedUi.NightCard,{glass:true,children:[(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.settingRow,children:[(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.rowInfo,children:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.rowLabel,children:"License Status"})}),(0,_jsxRuntime.jsx)(_reactNative.View,{testID:"buoy-settings-license-status",accessibilityLabel:j?"License: Active":"License: Free",children:j?(0,_jsxRuntime.jsx)(_sharedUi.NightBadge,{label:"Active",tone:"accent"}):(0,_jsxRuntime.jsx)(_sharedUi.NightBadge,{label:"Free",tone:"neutral"})})]}),S?.tierSource==="session"?(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.settingRow,children:[(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.rowInfo,children:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.rowLabel,children:"Signed in with Buoy"})}),(0,_jsxRuntime.jsx)(_sharedUi.NightButton,{label:"Sign out",variant:"secondary",size:"md",onPress:()=>void(0,_sharedUi.signOutOfBuoy)(),testID:"buoy-settings-signout"})]}):null,S?.teamRole?(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.settingRow,testID:"buoy-settings-team-role",children:(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.rowInfo,children:[(0,_jsxRuntime.jsxs)(_reactNative.Text,{style:styles.rowLabel,children:["Role: ",S.teamRole]}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.rowCaption,children:S.allowedTools?"Your team picks the tools you see.":"You see all tools."})]})}):null]}),(0,_jsxRuntime.jsx)(_sharedUi.NightFootnote,{children:j?"You have full access to all Buoy DevTools features.":I?ee?`Couldn't reach the license server (${I}). A VPN or corporate proxy can block buoy.gg \u2014 turn it off and reload. Your key hasn't been rejected.`:`License check failed: ${I}.`:"Upgrade to Pro to unlock all features and support development."})),!j&&(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[w("Pro Features",(0,_jsxRuntime.jsx)(_sharedUi.NightCard,{glass:true,children:(0,_jsxRuntime.jsx)(_sharedUi.NightRows,{children:["Advanced Settings","Priority Support"].map(e=>(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.featureRow,children:[(0,_jsxRuntime.jsx)(_sharedUi.CheckCircle2,{size:16,color:_sharedUi.night.color.accent}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.rowLabel,children:e})]},e))})})),(0,_jsxRuntime.jsx)(_sharedUi.NightButton,{label:"Upgrade to Pro",variant:"primary",size:"lg",onPress:()=>N(true)})]})]})]}),(0,_jsxRuntime.jsx)(_sharedUi.BuoyUpgradeSheet,{visible:$,onClose:()=>N(false)})]});return(0,_jsxRuntime.jsx)(_sharedUi.JsModal,{visible:a,onClose:l,zIndex:d,variant:"night",header:{showToggleButton:false,customContent:(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.headerRow,children:(0,_jsxRuntime.jsx)(_sharedUi.NightSegmented,{glass:true,tabs:[{key:"floating",label:"Floating"},{key:"settings",label:"Settings"},{key:"pro",label:"Pro"}],activeKey:b,onChange:e=>k(e)})})},initialMode:"bottomSheet",onModeChange:le,persistenceKey:_sharedUi.devToolsStorageKeys.settings.root(),enablePersistence:true,maxHeight:K-M.top,initialHeight:se,initialFloatingPosition:{x:(_-ne)/2,y:M.top+20},enableGlitchEffects:true,children:he()})};exports.DevToolsSettingsModal=DevToolsSettingsModal;const basicDefaultSettings={dialTools:{},floatingTools:{environment:false},globalSettings:{enableSharedModalDimensions:false}};const createDefaultsFromConfig=(a,l)=>{const s=new Set(a??[]);const c=new Set(l??[]);const n={};for(const d of c){n[d]=true}const i={environment:s.has("environment")};for(const d of s){if(d!=="environment"){i[d]=true}}return{dialTools:enforceDialLimit(n),floatingTools:i,globalSettings:{enableSharedModalDimensions:false}}};let cachedSettings=null;let cachedActiveTab=null;let cachedStorageBackend=null;const sameSettings=(a,l)=>JSON.stringify(a)===JSON.stringify(l);_settingsBus.settingsBus.addListener(a=>{if(a)cachedSettings=a});const useDevToolsSettings=()=>{const{defaultFloatingTools:a,defaultDialTools:l}=(0,_DefaultConfigContext.useDefaultConfig)();const s=(0,_react.useMemo)(()=>{if(!a&&!l){return basicDefaultSettings}return createDefaultsFromConfig(a,l)},[a,l]);const[c,n]=(0,_react.useState)(s);const i=(0,_react.useCallback)(async()=>{try{const g=await _sharedUi.persistentStorage.getItem(STORAGE_KEY);if(g){const x=JSON.parse(g);const r=mergeWithDefaults(s,x);n(r);return}n(s)}catch(g){console.error("[Buoy]","Failed to load dev tools settings:",g);n(s)}},[s]);(0,_react.useEffect)(()=>(0,_sharedUi.onSettingsApplied)(g=>{if(g.includes(STORAGE_KEY))void i()}),[i]);(0,_react.useEffect)(()=>{i();const g=_settingsBus.settingsBus.addListener(x=>{try{if(x){n(x)}}catch(r){}});return()=>{g()}},[i]);const d=(0,_react.useCallback)(()=>{i()},[i]);return{settings:c,refreshSettings:d}};exports.useDevToolsSettings=useDevToolsSettings;const styles=_reactNative.StyleSheet.create({container:{flex:1,backgroundColor:"transparent"},headerRow:{flexDirection:"row",alignItems:"center",paddingLeft:_sharedUi.night.gutter,paddingRight:_sharedUi.night.gutter,paddingBottom:8},scrollContent:{flex:1},scrollContainer:{paddingHorizontal:_sharedUi.night.gutter,paddingTop:8,paddingBottom:24,gap:_sharedUi.night.groupGap},toolRow:{flexDirection:"row",alignItems:"center",gap:12,paddingHorizontal:_sharedUi.night.rowPadH,paddingVertical:12},settingRow:{flexDirection:"row",alignItems:"center",gap:10,paddingHorizontal:_sharedUi.night.rowPadH,paddingVertical:_sharedUi.night.rowPadV,minHeight:52},featureRow:{flexDirection:"row",alignItems:"center",gap:10,paddingHorizontal:_sharedUi.night.rowPadH,paddingVertical:12},rowDisabled:{opacity:.4},toolIconSlot:{width:24,alignItems:"center"},rowInfo:{flex:1,gap:2},rowLabel:{color:_sharedUi.night.color.text,fontSize:_sharedUi.night.font.row,fontWeight:"500"},rowCaption:{color:_sharedUi.night.color.textTertiary,fontSize:_sharedUi.night.font.label},settingRowBody:{paddingHorizontal:_sharedUi.night.rowPadH,paddingBottom:_sharedUi.night.rowPadV,gap:6},settingRowBodyText:{color:_sharedUi.night.color.textSecondary,fontSize:_sharedUi.night.font.caption,lineHeight:_sharedUi.night.font.caption*1.45},settingRowBodyHint:{color:_sharedUi.night.color.textTertiary,fontSize:_sharedUi.night.font.caption,lineHeight:_sharedUi.night.font.caption*1.45},bodyWarning:{color:_sharedUi.night.color.warning},bodyDanger:{color:_sharedUi.night.color.danger},cardButtonWrap:{paddingHorizontal:_sharedUi.night.cardPad,paddingTop:10,paddingBottom:_sharedUi.night.cardPad},storageExpanded:{paddingHorizontal:_sharedUi.night.rowPadH,paddingVertical:12,gap:8},storageExpandedHeader:{flexDirection:"row",alignItems:"center"},storageExpandedTitle:{flex:1,color:_sharedUi.night.color.textSecondary,fontSize:_sharedUi.night.font.micro,fontWeight:"600",letterSpacing:.5},storageExpandedCount:{color:_sharedUi.night.color.textTertiary,fontSize:_sharedUi.night.font.micro},storageKeysList:{maxHeight:150},storageKeyItem:{backgroundColor:_sharedUi.night.color.glassElevated,borderRadius:_sharedUi.night.radius.segment,paddingHorizontal:10,paddingVertical:7,marginBottom:4},storageKeyText:{color:_sharedUi.night.color.textSecondary,fontSize:_sharedUi.night.font.micro,fontFamily:_sharedUi.monoFont},storageKeyEmpty:{color:_sharedUi.night.color.textTertiary,fontSize:_sharedUi.night.font.caption,fontStyle:"italic"},footnoteMono:{fontFamily:_sharedUi.monoFont,fontSize:_sharedUi.night.font.label,color:_sharedUi.night.color.textSecondary}});
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.FloatingDevTools=void 0;var _sharedUi=require("@buoy-gg/shared-ui");var _react=_interopRequireWildcard(require("react"));var _reactNative=require("react-native");var _AppHost=require("./AppHost");var _TeamToolCloser=require("./TeamToolCloser.js");var _teamToolsNote=require("./teamToolsNote.js");var _FloatingMenu=require("./FloatingMenu.js");var _ToolOpenerBridge=require("./ToolOpenerBridge.js");var _autoDiscoverPresets=require("./autoDiscoverPresets.js");var _installPing=require("../telemetry/installPing.js");var _Buoy=require("../Buoy.js");var _AppIcon=require("./AppIcon");var _DevToolsVisibilityContext=require("./DevToolsVisibilityContext.js");var _optionalRequire=require("./optionalRequire.js");var _MinimizedToolsContext=require("./MinimizedToolsContext.js");var _defaultConfig=require("./defaultConfig.js");var _DefaultConfigContext=require("./DefaultConfigContext.js");var _license=_interopRequireWildcard(require("@buoy-gg/license"));var licenseModule=_license;var _floatingToolsCore=require("@buoy-gg/floating-tools-core");var _BuoySignIn=require("./BuoySignIn");var _autoExternalSync=require("./autoExternalSync.js");var _externalSyncGate=require("./externalSyncGate.js");var _jsxRuntime=require("react/jsx-runtime");function _interopRequireWildcard(t,n){if("function"==typeof WeakMap)var s=new WeakMap,a=new WeakMap;return(_interopRequireWildcard=function(r,m){if(!m&&r&&r.__esModule)return r;var l,u,g={__proto__:null,default:r};if(null===r||"object"!=typeof r&&"function"!=typeof r)return g;if(l=m?a:s){if(l.has(r))return l.get(r);l.set(r,g)}for(const i in r)"default"!==i&&{}.hasOwnProperty.call(r,i)&&((u=(l=Object.defineProperty)&&Object.getOwnPropertyDescriptor(r,i))&&(u.get||u.set)?l(g,i,u):g[i]=r[i]);return g})(t,n)}let warnedReleaseTransport=null;function warnReleaseTransportOnce(t){if(!t||t===warnedReleaseTransport)return;warnedReleaseTransport=t;console.warn("[Buoy]",t)}function resolveSignInAppId(t){if(t&&typeof t==="object"&&t.appId)return t.appId;try{const{Platform:n}=require("react-native");const s=require("expo-constants");const a=(s?.default??s)?.expoConfig;const r=n.OS==="android"?a?.android?.package:a?.ios?.bundleIdentifier;if(typeof r==="string"&&r)return r}catch{}try{const n=require("expo-application");const s=(n?.default??n)?.applicationId;if(typeof s==="string"&&s)return s}catch{}return null}const FloatingDevTools=({apps:t,requiredEnvVars:n,requiredStorageKeys:s,askBuoy:a,children:r,disableHints:m=false,defaultFloatingTools:l,defaultDialTools:u,requireLicense:g,licenseKey:i,zustandStores:T,environment:U,externalSync:b=true,headless:_=false,signIn:j,...D})=>{const G=U??(0,_sharedUi.normalizeEnvironment)(process.env.NODE_ENV??"dev");const{isLicensed:q}=(0,_license.useProAccess)();const{licenseKey:E,isInitialized:k,tier:h,access:c,allowedTools:O}=(0,_license.useLicense)();const J=i===void 0||(0,_license.sameLicenseKey)(i,E);const M=J&&c.status==="admitted";(0,_react.useEffect)(()=>{if(!k||c.status==="initializing")return;void(0,_installPing.sendInstallPing)({tier:c.status==="admitted"?h:"locked",enabled:(0,_Buoy.isTelemetryEnabled)()})},[k,c.status,h]);const x=j?resolveSignInAppId(j):null;(0,_react.useEffect)(()=>{if(!x)return;const e=licenseModule.SessionManager;if(!e)return;e.configure({audience:`app:${x}`});void e.load().catch(()=>{})},[x]);(0,_react.useEffect)(()=>{(0,_sharedUi.setBuoyAppId)(x??resolveSignInAppId(true))},[x]);(0,_react.useEffect)(()=>{void _license.LicenseManager.configure(i??(0,_Buoy.defaultLicenseKey)()).catch(()=>{})},[i]);(0,_react.useEffect)(()=>{if(M)(0,_sharedUi.startSettingsSync)()},[M]);(0,_react.useEffect)(()=>{if(!T||c.status==="locked")return;try{const{watchStores:e}=require("@buoy-gg/zustand");return e(T)}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/zustand",e)}},[T,c.status]);const Q=(0,_react.useMemo)(()=>{if(u){return(0,_defaultConfig.validateDialConfig)(u)}return u},[u]);const R=(0,_react.useMemo)(()=>{const e=[];if(n&&n.length>0){try{const{createEnvTool:o,createEnvVarConfig:P}=require("@buoy-gg/env");e.push(o({requiredEnvVars:P(n)}))}catch(o){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/env",o)}}if(s&&s.length>0){try{const{createStorageTool:o}=require("@buoy-gg/storage");e.push(o({requiredStorageKeys:s}))}catch(o){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/storage",o)}}if(a){try{const{createAskBuoyTool:o}=require("@buoy-gg/ask-buoy");e.push(o(a))}catch(o){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/ask-buoy",o)}}return e},[n,s,a]);const A=(0,_react.useMemo)(()=>{if(!t&&R.length===0)return void 0;return[...t||[],...R]},[t,R]);const p=(0,_react.useMemo)(()=>A?(0,_autoDiscoverPresets.autoDiscoverPresetsWithCustom)(A):(0,_autoDiscoverPresets.autoDiscoverPresets)(),[A]);const S=(0,_react.useMemo)(()=>p.filter(e=>e.sync),[p]);const $=(0,_react.useMemo)(()=>(0,_floatingToolsCore.filterTeamTools)(p,O),[p,O]);const F=(0,_react.useMemo)(()=>{try{const{DebugBordersStandaloneOverlay:e}=require("@buoy-gg/debug-borders");return e}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/debug-borders",e);return null}},[]);const w=(0,_react.useMemo)(()=>{try{const{HighlightUpdatesOverlay:e}=require("@buoy-gg/highlight-updates");return e}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/highlight-updates",e);return null}},[]);const B=(0,_react.useMemo)(()=>{try{const{ImageOverlayStandalone:e}=require("@buoy-gg/image-overlay");return e}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/image-overlay",e);return null}},[]);const z=(0,_react.useMemo)(()=>{try{const{PerfMonitorOverlay:e}=require("@buoy-gg/perf-monitor");return e}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/perf-monitor",e);return null}},[]);const H=(0,_react.useMemo)(()=>{try{const{JsTopHudOverlay:e}=require("@buoy-gg/js-top");return e}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/js-top",e);return null}},[]);const y=(0,_react.useMemo)(()=>{try{const{RouteTracker:e}=require("@buoy-gg/route-events");return e}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/route-events",e);return null}},[]);const d=(0,_react.useMemo)(()=>{try{const{ReactQueryTracker:e}=require("@buoy-gg/react-query");return e}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/react-query",e);return null}},[]);const L=(0,_react.useMemo)(()=>{try{const{ImpersonateOverlay:e}=require("@buoy-gg/impersonate");return e}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/impersonate",e);return null}},[]);const N=(0,_react.useMemo)(()=>{try{const{ScenariosOverlay:e}=require("@buoy-gg/scenarios");return e}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/scenarios",e);return null}},[]);const f=(0,_react.useMemo)(()=>{try{const{ReduxAutoInstrument:e}=require("@buoy-gg/redux");return e??null}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/redux",e);return null}},[]);const v=(0,_react.useMemo)(()=>{try{const{ConsoleRoot:e}=require("@buoy-gg/console");return e??null}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/console",e);return null}},[]);const K=(0,_react.useCallback)(e=>{const o=p.find(P=>P.id===e);if(!o)return null;return(0,_AppIcon.renderAppIcon)(o.icon,{slot:"dial",size:20,color:o.color})},[p]);const I=typeof __DEV__!=="undefined"&&__DEV__;if(!I&&!q){return j&&!_?(0,_jsxRuntime.jsx)(_BuoySignIn.BuoySignIn,{needsPlan:true}):null}const V=(0,_externalSyncGate.shouldMountExternalSync)({isDevelopment:I,isLicensed:q,externalSync:b,isAvailable:(0,_autoExternalSync.isExternalSyncAvailable)()});const C=(0,_externalSyncGate.externalSyncOptions)(b);if(!I&&C?.enableInRelease){warnReleaseTransportOnce((0,_externalSyncGate.releaseTransportProblem)(C.socketURL,C))}const W=(0,_jsxRuntime.jsx)(_autoExternalSync.ToolRegistryPublisher,{requiredEnvVars:n,customApps:S});if(!M){return(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[c.status==="initializing"&&(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[f&&(0,_jsxRuntime.jsx)(f,{}),v&&(0,_jsxRuntime.jsx)(v,{}),y&&(0,_jsxRuntime.jsx)(y,{}),d&&(0,_jsxRuntime.jsx)(d,{})]}),!_&&(j?(0,_jsxRuntime.jsx)(_BuoySignIn.BuoySignIn,{}):(0,_jsxRuntime.jsx)(_sharedUi.AccountSetup,{}))]})}if(_){return(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[f&&(0,_jsxRuntime.jsx)(f,{}),v&&(0,_jsxRuntime.jsx)(v,{}),y&&(0,_jsxRuntime.jsx)(y,{}),d&&(0,_jsxRuntime.jsx)(d,{}),W,V&&(0,_jsxRuntime.jsx)(_autoExternalSync.AutoExternalSync,{options:(0,_externalSyncGate.externalSyncOptions)(b),requiredEnvVars:n,isPro:q,tier:h,licenseKey:E,customApps:S})]})}return(0,_jsxRuntime.jsx)(_DefaultConfigContext.DefaultConfigProvider,{defaultFloatingTools:l,defaultDialTools:Q,children:(0,_jsxRuntime.jsx)(_sharedUi.HintsProvider,{disableHints:m,children:(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.container,pointerEvents:"box-none",__buoyDevToolsRoot:true,children:(0,_jsxRuntime.jsxs)(_DevToolsVisibilityContext.DevToolsVisibilityProvider,{children:[B&&(0,_jsxRuntime.jsx)(_reactNative.View,{style:_reactNative.StyleSheet.absoluteFill,pointerEvents:"box-none",collapsable:false,children:(0,_jsxRuntime.jsx)(B,{})}),(0,_jsxRuntime.jsx)(_AppHost.AppHostProvider,{children:(0,_jsxRuntime.jsxs)(_MinimizedToolsContext.MinimizedToolsProvider,{getToolIcon:K,children:[(0,_jsxRuntime.jsx)(_FloatingMenu.FloatingMenu,{...D,apps:$,emptyNote:O?_teamToolsNote.NO_TEAM_TOOLS_NOTE:void 0,environment:G}),D.hidden?null:(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[(0,_jsxRuntime.jsx)(_AppHost.AppOverlay,{}),(0,_jsxRuntime.jsx)(_sharedUi.FloatingToolHost,{})]}),(0,_jsxRuntime.jsx)(_ToolOpenerBridge.ToolOpenerBridge,{}),(0,_jsxRuntime.jsx)(_TeamToolCloser.TeamToolCloser,{allowedTools:O??null})]})}),r,F&&(0,_jsxRuntime.jsx)(F,{}),w&&(0,_jsxRuntime.jsx)(w,{}),z&&(0,_jsxRuntime.jsx)(z,{}),H&&(0,_jsxRuntime.jsx)(H,{}),L&&(0,_jsxRuntime.jsx)(L,{}),N&&(0,_jsxRuntime.jsx)(N,{}),f&&(0,_jsxRuntime.jsx)(f,{}),v&&(0,_jsxRuntime.jsx)(v,{}),y&&(0,_jsxRuntime.jsx)(y,{}),d&&(0,_jsxRuntime.jsx)(d,{}),W,V&&(0,_jsxRuntime.jsx)(_autoExternalSync.AutoExternalSync,{options:(0,_externalSyncGate.externalSyncOptions)(b),requiredEnvVars:n,isPro:q,tier:h,licenseKey:E,customApps:S})]})})})})};exports.FloatingDevTools=FloatingDevTools;const styles=_reactNative.StyleSheet.create({container:{position:"absolute",top:0,left:0,right:0,bottom:0,zIndex:9999}});
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.FloatingDevTools=void 0;var _sharedUi=require("@buoy-gg/shared-ui");var _react=_interopRequireWildcard(require("react"));var _reactNative=require("react-native");var _AppHost=require("./AppHost");var _TeamToolCloser=require("./TeamToolCloser.js");var _teamToolsNote=require("./teamToolsNote.js");var _FloatingMenu=require("./FloatingMenu.js");var _ToolOpenerBridge=require("./ToolOpenerBridge.js");var _autoDiscoverPresets=require("./autoDiscoverPresets.js");var _installPing=require("../telemetry/installPing.js");var _Buoy=require("../Buoy.js");var _AppIcon=require("./AppIcon");var _DevToolsVisibilityContext=require("./DevToolsVisibilityContext.js");var _optionalRequire=require("./optionalRequire.js");var _MinimizedToolsContext=require("./MinimizedToolsContext.js");var _defaultConfig=require("./defaultConfig.js");var _DefaultConfigContext=require("./DefaultConfigContext.js");var _license=_interopRequireWildcard(require("@buoy-gg/license"));var licenseModule=_license;var _floatingToolsCore=require("@buoy-gg/floating-tools-core");var _BuoySignIn=require("./BuoySignIn");var _autoExternalSync=require("./autoExternalSync.js");var _externalSyncGate=require("./externalSyncGate.js");var _jsxRuntime=require("react/jsx-runtime");function _interopRequireWildcard(t,n){if("function"==typeof WeakMap)var s=new WeakMap,a=new WeakMap;return(_interopRequireWildcard=function(r,j){if(!j&&r&&r.__esModule)return r;var l,u,g={__proto__:null,default:r};if(null===r||"object"!=typeof r&&"function"!=typeof r)return g;if(l=j?a:s){if(l.has(r))return l.get(r);l.set(r,g)}for(const i in r)"default"!==i&&{}.hasOwnProperty.call(r,i)&&((u=(l=Object.defineProperty)&&Object.getOwnPropertyDescriptor(r,i))&&(u.get||u.set)?l(g,i,u):g[i]=r[i]);return g})(t,n)}let warnedReleaseTransport=null;function warnReleaseTransportOnce(t){if(!t||t===warnedReleaseTransport)return;warnedReleaseTransport=t;console.warn("[Buoy]",t)}function resolveSignInAppId(t){if(t&&typeof t==="object"&&t.appId)return t.appId;try{const{Platform:n}=require("react-native");const s=require("expo-constants");const a=(s?.default??s)?.expoConfig;const r=n.OS==="android"?a?.android?.package:a?.ios?.bundleIdentifier;if(typeof r==="string"&&r)return r}catch{}try{const n=require("expo-application");const s=(n?.default??n)?.applicationId;if(typeof s==="string"&&s)return s}catch{}return null}const FloatingDevTools=({apps:t,requiredEnvVars:n,requiredStorageKeys:s,askBuoy:a,children:r,disableHints:j=false,defaultFloatingTools:l,defaultDialTools:u,requireLicense:g,licenseKey:i,zustandStores:_,environment:J,externalSync:m=true,headless:E=false,signIn:q,...k})=>{const Q=J??(0,_sharedUi.normalizeEnvironment)(process.env.NODE_ENV??"dev");const{isLicensed:O}=(0,_license.useProAccess)();const{licenseKey:R,isInitialized:B,tier:h,access:c,allowedTools:T}=(0,_license.useLicense)();const $=i===void 0||(0,_license.sameLicenseKey)(i,R);const M=$&&c.status==="admitted";(0,_react.useEffect)(()=>{if(!B||c.status==="initializing")return;void(0,_installPing.sendInstallPing)({tier:c.status==="admitted"?h:"locked",enabled:(0,_Buoy.isTelemetryEnabled)()})},[B,c.status,h]);const b=q?resolveSignInAppId(q):null;(0,_react.useEffect)(()=>{if(!b)return;const e=licenseModule.SessionManager;if(!e)return;e.configure({audience:`app:${b}`});void e.load().catch(()=>{})},[b]);(0,_react.useEffect)(()=>{(0,_sharedUi.setBuoyAppId)(b??resolveSignInAppId(true))},[b]);(0,_react.useEffect)(()=>{void _license.LicenseManager.configure(i??(0,_Buoy.defaultLicenseKey)()).catch(()=>{})},[i]);(0,_react.useEffect)(()=>{if(M)(0,_sharedUi.startSettingsSync)()},[M]);(0,_react.useEffect)(()=>{if(!_||c.status==="locked")return;try{const{watchStores:e}=require("@buoy-gg/zustand");return e(_)}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/zustand",e)}},[_,c.status]);const K=(0,_react.useMemo)(()=>{if(u){return(0,_defaultConfig.validateDialConfig)(u)}return u},[u]);const A=(0,_react.useMemo)(()=>{const e=[];if(n&&n.length>0){try{const{createEnvTool:o,createEnvVarConfig:D}=require("@buoy-gg/env");e.push(o({requiredEnvVars:D(n)}))}catch(o){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/env",o)}}if(s&&s.length>0){try{const{createStorageTool:o}=require("@buoy-gg/storage");e.push(o({requiredStorageKeys:s}))}catch(o){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/storage",o)}}if(a){try{const{createAskBuoyTool:o}=require("@buoy-gg/ask-buoy");e.push(o(a))}catch(o){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/ask-buoy",o)}}return e},[n,s,a]);const I=(0,_react.useMemo)(()=>{if(!t&&A.length===0)return void 0;return[...t||[],...A]},[t,A]);const p=(0,_react.useMemo)(()=>I?(0,_autoDiscoverPresets.autoDiscoverPresetsWithCustom)(I):(0,_autoDiscoverPresets.autoDiscoverPresets)(),[I]);const S=(0,_react.useMemo)(()=>p.filter(e=>e.sync),[p]);const X=(0,_react.useMemo)(()=>(0,_floatingToolsCore.filterTeamTools)(p,T),[p,T]);const F=(0,_react.useMemo)(()=>{try{const{DebugBordersStandaloneOverlay:e}=require("@buoy-gg/debug-borders");return e}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/debug-borders",e);return null}},[]);const w=(0,_react.useMemo)(()=>{try{const{HighlightUpdatesOverlay:e}=require("@buoy-gg/highlight-updates");return e}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/highlight-updates",e);return null}},[]);const L=(0,_react.useMemo)(()=>{try{const{ImageOverlayStandalone:e}=require("@buoy-gg/image-overlay");return e}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/image-overlay",e);return null}},[]);const z=(0,_react.useMemo)(()=>{try{const{PerfMonitorOverlay:e}=require("@buoy-gg/perf-monitor");return e}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/perf-monitor",e);return null}},[]);const H=(0,_react.useMemo)(()=>{try{const{JsTopHudOverlay:e}=require("@buoy-gg/js-top");return e}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/js-top",e);return null}},[]);const y=(0,_react.useMemo)(()=>{try{const{RouteTracker:e}=require("@buoy-gg/route-events");return e}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/route-events",e);return null}},[]);const d=(0,_react.useMemo)(()=>{try{const{ReactQueryTracker:e}=require("@buoy-gg/react-query");return e}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/react-query",e);return null}},[]);const N=(0,_react.useMemo)(()=>{try{const{ImpersonateOverlay:e}=require("@buoy-gg/impersonate");return e}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/impersonate",e);return null}},[]);const V=(0,_react.useMemo)(()=>{try{const{BugLinksOverlay:e}=require("@buoy-gg/bug-links");return e??null}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/bug-links",e);return null}},[]);const W=(0,_react.useMemo)(()=>{try{const{ScenariosOverlay:e}=require("@buoy-gg/scenarios");return e}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/scenarios",e);return null}},[]);const f=(0,_react.useMemo)(()=>{try{const{ReduxAutoInstrument:e}=require("@buoy-gg/redux");return e??null}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/redux",e);return null}},[]);const v=(0,_react.useMemo)(()=>{try{const{ConsoleRoot:e}=require("@buoy-gg/console");return e??null}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/console",e);return null}},[]);const x=(0,_react.useMemo)(()=>{try{const{OtaInspectorRoot:e}=require("@buoy-gg/ota-inspector");return e??null}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/ota-inspector",e);return null}},[]);const Y=(0,_react.useCallback)(e=>{const o=p.find(D=>D.id===e);if(!o)return null;return(0,_AppIcon.renderAppIcon)(o.icon,{slot:"dial",size:20,color:o.color})},[p]);const C=typeof __DEV__!=="undefined"&&__DEV__;if(!C&&!O){return q&&!E?(0,_jsxRuntime.jsx)(_BuoySignIn.BuoySignIn,{needsPlan:true}):null}const U=(0,_externalSyncGate.shouldMountExternalSync)({isDevelopment:C,isLicensed:O,externalSync:m,isAvailable:(0,_autoExternalSync.isExternalSyncAvailable)()});const P=(0,_externalSyncGate.externalSyncOptions)(m);if(!C&&P?.enableInRelease){warnReleaseTransportOnce((0,_externalSyncGate.releaseTransportProblem)(P.socketURL,P))}const G=(0,_jsxRuntime.jsx)(_autoExternalSync.ToolRegistryPublisher,{requiredEnvVars:n,customApps:S});if(!M){return(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[c.status==="initializing"&&(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[f&&(0,_jsxRuntime.jsx)(f,{}),v&&(0,_jsxRuntime.jsx)(v,{}),x&&(0,_jsxRuntime.jsx)(x,{}),y&&(0,_jsxRuntime.jsx)(y,{}),d&&(0,_jsxRuntime.jsx)(d,{})]}),!E&&(q?(0,_jsxRuntime.jsx)(_BuoySignIn.BuoySignIn,{}):(0,_jsxRuntime.jsx)(_sharedUi.AccountSetup,{}))]})}if(E){return(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[f&&(0,_jsxRuntime.jsx)(f,{}),v&&(0,_jsxRuntime.jsx)(v,{}),x&&(0,_jsxRuntime.jsx)(x,{}),y&&(0,_jsxRuntime.jsx)(y,{}),d&&(0,_jsxRuntime.jsx)(d,{}),G,U&&(0,_jsxRuntime.jsx)(_autoExternalSync.AutoExternalSync,{options:(0,_externalSyncGate.externalSyncOptions)(m),requiredEnvVars:n,isPro:O,tier:h,licenseKey:R,customApps:S})]})}return(0,_jsxRuntime.jsx)(_DefaultConfigContext.DefaultConfigProvider,{defaultFloatingTools:l,defaultDialTools:K,children:(0,_jsxRuntime.jsx)(_sharedUi.HintsProvider,{disableHints:j,children:(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.container,pointerEvents:"box-none",__buoyDevToolsRoot:true,children:(0,_jsxRuntime.jsxs)(_DevToolsVisibilityContext.DevToolsVisibilityProvider,{children:[L&&(0,_jsxRuntime.jsx)(_reactNative.View,{style:_reactNative.StyleSheet.absoluteFill,pointerEvents:"box-none",collapsable:false,children:(0,_jsxRuntime.jsx)(L,{})}),(0,_jsxRuntime.jsx)(_AppHost.AppHostProvider,{children:(0,_jsxRuntime.jsxs)(_MinimizedToolsContext.MinimizedToolsProvider,{getToolIcon:Y,children:[(0,_jsxRuntime.jsx)(_FloatingMenu.FloatingMenu,{...k,apps:X,emptyNote:T?_teamToolsNote.NO_TEAM_TOOLS_NOTE:void 0,environment:Q}),k.hidden?null:(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[(0,_jsxRuntime.jsx)(_AppHost.AppOverlay,{}),(0,_jsxRuntime.jsx)(_sharedUi.FloatingToolHost,{})]}),(0,_jsxRuntime.jsx)(_ToolOpenerBridge.ToolOpenerBridge,{}),(0,_jsxRuntime.jsx)(_TeamToolCloser.TeamToolCloser,{allowedTools:T??null})]})}),r,F&&(0,_jsxRuntime.jsx)(F,{}),w&&(0,_jsxRuntime.jsx)(w,{}),z&&(0,_jsxRuntime.jsx)(z,{}),H&&(0,_jsxRuntime.jsx)(H,{}),N&&(0,_jsxRuntime.jsx)(N,{}),V&&(0,_jsxRuntime.jsx)(V,{}),W&&(0,_jsxRuntime.jsx)(W,{}),f&&(0,_jsxRuntime.jsx)(f,{}),v&&(0,_jsxRuntime.jsx)(v,{}),x&&(0,_jsxRuntime.jsx)(x,{}),y&&(0,_jsxRuntime.jsx)(y,{}),d&&(0,_jsxRuntime.jsx)(d,{}),G,U&&(0,_jsxRuntime.jsx)(_autoExternalSync.AutoExternalSync,{options:(0,_externalSyncGate.externalSyncOptions)(m),requiredEnvVars:n,isPro:O,tier:h,licenseKey:R,customApps:S})]})})})})};exports.FloatingDevTools=FloatingDevTools;const styles=_reactNative.StyleSheet.create({container:{position:"absolute",top:0,left:0,right:0,bottom:0,zIndex:9999}});
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.FloatingDevTools=FloatingDevTools;var _floating=require("@buoy-gg/shared-ui/floating");var _license=_interopRequireWildcard(require("@buoy-gg/license"));var licenseModule=_license;var _sharedUi=require("@buoy-gg/shared-ui");var _react=require("react");var _floatingToolsReact=require("@buoy-gg/floating-tools-react");var _autoDiscoverPresetsWeb=require("../utils/autoDiscoverPresets.web.js");var _floatingToolsCore=require("@buoy-gg/floating-tools-core");var _teamToolsNote=require("./teamToolsNote.js");var _floatingToolsWeb=require("./floatingTools.web.js");var _DialDevToolsWeb=require("./dial/DialDevTools.web.js");var _dialUsageStore=require("./dial/dialUsageStore.js");var _OnboardingTooltipWeb=require("./dial/OnboardingTooltip.web.js");var _DevToolsSettingsModalWeb=require("./DevToolsSettingsModal.web.js");var _AppHostWeb=require("./AppHost.web.js");var _MinimizedToolsStackWeb=require("./MinimizedToolsStack.web.js");var _createWebTools=require("../utils/createWebTools.js");var _BrowserToolRuntime=require("./BrowserToolRuntime.js");var _releaseOptIn=require("../releaseOptIn.js");var _BuoySignInWeb=require("./BuoySignIn.web.js");var _Buoy=require("../Buoy.js");var _BuoyCodeSignIn=require("./BuoyCodeSignIn.js");var _DevToolsVisibilityContext=require("./DevToolsVisibilityContext.js");var _createWebTool=require("../utils/createWebTool.js");var _DefaultConfigContext=require("./DefaultConfigContext.js");var _DevToolsSettingsModalShared=require("./DevToolsSettingsModal.shared.js");var _defaultConfig=require("./defaultConfig.js");var _installedTools=require("../installedTools.js");var _jsxRuntime=require("react/jsx-runtime");function _interopRequireWildcard(n,s){if("function"==typeof WeakMap)var i=new WeakMap,a=new WeakMap;return(_interopRequireWildcard=function(t,r){if(!r&&t&&t.__esModule)return t;var l,c,p={__proto__:null,default:t};if(null===t||"object"!=typeof t&&"function"!=typeof t)return p;if(l=r?a:i){if(l.has(t))return l.get(t);l.set(t,p)}for(const d in t)"default"!==d&&{}.hasOwnProperty.call(t,d)&&((c=(l=Object.defineProperty)&&Object.getOwnPropertyDescriptor(t,d))&&(c.get||c.set)?l(p,d,c):p[d]=t[d]);return p})(n,s)}const EMPTY_MODULES={};const MENU_TOOLTIP_KEY="@react_buoy_floating_menu_tooltip_shown";const webSettingsStorage=_sharedUi.persistentStorage;function MenuLauncherIcon({size:n=14,color:s="#20C997"}){const i=Math.max(2,n/4);const a=Math.max(1,n/16);return(0,_jsxRuntime.jsx)("div",{style:{display:"grid",gridTemplateColumns:`repeat(3, ${i}px)`,gap:a,width:n,height:n,alignContent:"center",justifyContent:"center"},children:Array.from({length:9}).map((t,r)=>(0,_jsxRuntime.jsx)("div",{style:{width:i,height:i,borderRadius:i/2,backgroundColor:s}},r))})}function AdmittedFloatingDevTools(n){const{defaultFloatingTools:s,defaultDialTools:i,disableHints:a=false,children:t}=n;const r=(0,_react.useMemo)(()=>i?(0,_defaultConfig.validateDialConfig)(i):i,[i]);return(0,_jsxRuntime.jsx)(_DefaultConfigContext.DefaultConfigProvider,{defaultFloatingTools:s,defaultDialTools:r,children:(0,_jsxRuntime.jsx)(_sharedUi.HintsProvider,{disableHints:a,children:(0,_jsxRuntime.jsxs)(_DevToolsVisibilityContext.DevToolsVisibilityProvider,{children:[(0,_jsxRuntime.jsx)(_AppHostWeb.AppHostProvider,{children:(0,_jsxRuntime.jsx)(FloatingDevToolsInner,{...n})}),t]})})})}const STARTUP_ROOTS=["ReduxAutoInstrument","ConsoleRoot","RouteTracker","ReactQueryTracker"];function StartupCapture({modules:n=EMPTY_MODULES}){return(0,_jsxRuntime.jsx)(_jsxRuntime.Fragment,{children:Object.entries(n).flatMap(([s,i])=>STARTUP_ROOTS.map(a=>{const t=i[a];return t?(0,_jsxRuntime.jsx)(t,{},`${s}:${a}`):null}))})}function WebToolOpenerBridge(){const{openApps:n,restore:s}=(0,_AppHostWeb.useAppHost)();(0,_react.useEffect)(()=>(0,_sharedUi.registerToolOpener)(i=>{const a=n.find(t=>t.id===i);if(!a)return false;s(a.instanceId);return true}),[n,s]);return null}function defaultEnvironment(){const n=(0,_license.capacitorDebug)();const s=n===null?process.env.NODE_ENV:n?"development":"production";return(0,_sharedUi.normalizeEnvironment)(s??"dev")}function configOverrides(n,s,i,a){const t=x=>Object.entries(n).find(([v])=>v.replace(/^@buoy-gg\//,"").replace(/\/web$/,"")===x)?.[1];const r=[];const l=t("env");if(s?.length&&l?.createEnvTool&&l.createEnvVarConfig){r.push((0,_createWebTool.createWebTool)(l.createEnvTool({requiredEnvVars:l.createEnvVarConfig(s)})))}const c=t("storage");if(i?.length&&c?.createStorageTool){r.push((0,_createWebTool.createWebTool)(c.createStorageTool({requiredStorageKeys:i})))}const p=t("ask-buoy");const d=a==="hosted"?p?.hostedAskBuoy?.():a;if(d&&p?.createAskBuoyTool)r.push((0,_createWebTool.createWebTool)(p.createAskBuoyTool(d)));return r}function FloatingDevToolsInner({environment:n,userRole:s="admin",availableEnvironments:i,onEnvironmentSwitch:a,apps:t,modules:r=EMPTY_MODULES,externalSync:l,requiredEnvVars:c,sentryGetClient:p,disableHints:d=false,headless:x=false,hidden:v=false,defaultFloatingTools:X,defaultDialTools:E,zustandStores:w,requiredStorageKeys:B,askBuoy:W}){const I=n??defaultEnvironment();const Z=(0,_react.useMemo)(()=>E?(0,_defaultConfig.validateDialConfig)(E):void 0,[E]);const[g,S]=(0,_react.useState)(false);const[y,C]=(0,_react.useState)(false);const M=(0,_react.useRef)(false);const m=(0,_AppHostWeb.useAppHost)();const R=(0,_react.useMemo)(()=>configOverrides(r,c,B,W),[r,c,B,W]);const{allowedTools:b}=(0,_license.useLicense)();const f=(0,_react.useMemo)(()=>(0,_floatingToolsCore.filterTeamTools)((0,_autoDiscoverPresetsWeb.autoDiscoverWithCustom)([...(0,_createWebTools.createWebTools)(r),...t??[],...R]),b),[t,r,R,b]);const{openApps:L,close:F}=m;(0,_react.useEffect)(()=>{if(!b)return;for(const e of L){if(!(0,_floatingToolsCore.isTeamToolAllowed)(e.id,b))F(e.instanceId)}},[L,b,F]);const A=(0,_react.useMemo)(()=>Object.entries(r).find(([e])=>e.replace(/^@buoy-gg\//,"").replace(/\/web$/,"")==="zustand")?.[1],[r]);(0,_react.useEffect)(()=>{if(!w||typeof A?.watchStores!=="function")return;const e=A.watchStores(w);return typeof e==="function"?e:void 0},[w,A]);const D=(0,_DevToolsVisibilityContext.useDevToolsVisibility)();const N=m.openApps.some(e=>!e.minimized);(0,_react.useEffect)(()=>{D.setDialOpen(g)},[g,D.setDialOpen]);(0,_react.useEffect)(()=>{D.setToolOpen(N||y)},[N,y,D.setToolOpen]);const{registerApps:K}=m;(0,_react.useEffect)(()=>{K(f.map(e=>{const o=e.icon;return{...e,icon:typeof o==="function"?({size:u})=>o(u):o}}))},[K,f]);const ee=(0,_react.useMemo)(()=>f.map(e=>({id:e.id,name:e.name,description:e.description,slot:e.slot})),[f]);(0,_floatingToolsReact.useSettings)({availableTools:ee,storage:webSettingsStorage});(0,_react.useEffect)(()=>{let e=false;const o=async()=>{const[u,T]=await Promise.all([_sharedUi.persistentStorage.getItem(_sharedUi.devToolsStorageKeys.dial.isOpen()),_sharedUi.persistentStorage.getItem(_sharedUi.devToolsStorageKeys.settings.modalOpen())]);if(e)return;if(u==="true")S(true);if(T==="true"){S(true);C(true)}M.current=true};void o();return()=>{e=true}},[]);(0,_react.useEffect)(()=>{if(!M.current)return;void _sharedUi.persistentStorage.setItem(_sharedUi.devToolsStorageKeys.dial.isOpen(),g?"true":"false")},[g]);(0,_react.useEffect)(()=>{if(!M.current)return;void _sharedUi.persistentStorage.setItem(_sharedUi.devToolsStorageKeys.settings.modalOpen(),y?"true":"false")},[y]);const _=(0,_react.useCallback)(e=>{void(0,_dialUsageStore.recordToolUsage)(e.id);if(e.launchMode==="toggle-only"){e.onPress?.();return}if(e.component){const o=typeof e.icon==="function"?e.icon(20):e.icon;m.open({id:e.id,title:e.name||(0,_floatingToolsReact.getToolLabel)(e.id),component:e.component,props:e.props,modal:e.modal,launchMode:e.launchMode||"self-modal",singleton:e.singleton??true,icon:o,color:e.color||(0,_floatingToolsReact.getToolColor)(e.id)})}else{e.onPress?.()}},[m]);const V=(0,_react.useRef)({tools:f,openApps:m.openApps,openTool:_});V.current={tools:f,openApps:m.openApps,openTool:_};(0,_react.useEffect)(()=>(0,_sharedUi.registerToolOpener)(e=>{const{tools:o,openApps:u,openTool:T}=V.current;if(u.some(q=>q.id===e))return false;const P=o.find(q=>q.id===e);if(!P||P.launchMode==="toggle-only")return false;T(P);return true}),[]);const O=(0,_react.useMemo)(()=>{const e=(0,_autoDiscoverPresetsWeb.getToolsBySlot)(f,"dial");return e.map(o=>{const u=o.color||(0,_floatingToolsReact.getToolColor)(o.id);let T;if(typeof o.icon==="string"){T=o.icon}else if(typeof o.icon==="function"){T=o.icon(32)}else{T=null}return{id:o.id,name:o.name||(0,_floatingToolsReact.getToolLabel)(o.id),icon:T,unavailable:!o.component&&!o.onPress,color:u,onPress:()=>{_(o);S(false)}}})},[f,_]);const z=(0,_react.useMemo)(()=>{if(!g)return O;const e=new Map(O.map(o=>[o.id,o]));return(0,_dialUsageStore.getRankedToolIds)(O.map(o=>o.id)).map(o=>e.get(o)).filter(o=>Boolean(o))},[g,O]);const{settings:k}=(0,_DevToolsSettingsModalShared.useDevToolsSettings)();const ne=(0,_react.useMemo)(()=>(0,_autoDiscoverPresetsWeb.getToolsBySlot)(f,"row").filter(e=>(k.floatingTools[e.id]??false)===true&&(e.component||e.onPress)),[f,k.floatingTools]);const te=(0,_react.useMemo)(()=>f.map(e=>({id:e.id,name:e.name||(0,_floatingToolsReact.getToolLabel)(e.id),description:e.description||(0,_floatingToolsReact.getToolDescription)(e.id),slot:e.slot,icon:e.icon,color:e.color})),[f]);const[oe,H]=(0,_react.useState)(false);const U=m.openApps.some(e=>!e.minimized);(0,_react.useEffect)(()=>{if(d)return;let e=false;const o=setTimeout(async()=>{const u=await _sharedUi.persistentStorage.getItem(MENU_TOOLTIP_KEY);if(!e&&!u)H(true)},1e3);return()=>{e=true;clearTimeout(o)}},[d]);const h=(0,_react.useCallback)(()=>{H(false);void _sharedUi.persistentStorage.setItem(MENU_TOOLTIP_KEY,"true")},[]);const $=(0,_react.useCallback)(()=>{h();S(true)},[h]);const se=(0,_react.useCallback)(()=>{S(false);C(false)},[]);const ie=(0,_react.useCallback)(()=>{C(e=>!e)},[]);const re=(0,_react.useCallback)(()=>C(false),[]);const Y=Boolean(i?.length&&a);const G=k.floatingTools.environment!==false;const j=oe&&!g&&!U&&!v;(0,_react.useEffect)(()=>{if(!j)return;const e=u=>{if(!(u.target instanceof Element)||!u.target.closest("[data-buoy-root]"))h()};const o=u=>{if(u.key==="Escape")h()};document.addEventListener("pointerdown",e,true);document.addEventListener("keydown",o);return()=>{document.removeEventListener("pointerdown",e,true);document.removeEventListener("keydown",o)}},[j,h]);const Q=m.openApps.some(e=>e.minimized&&e.launchMode!=="toggle-only");const J=(0,_jsxRuntime.jsx)(_BrowserToolRuntime.BrowserToolRuntime,{modules:r,apps:t,requiredEnvVars:c,externalSync:l,headless:x,sentryGetClient:p});if(x)return J;return(0,_jsxRuntime.jsxs)("div",{"data-buoy-root":"",style:{display:"contents"},children:[J,(0,_jsxRuntime.jsx)(WebToolOpenerBridge,{}),j&&(0,_jsxRuntime.jsx)("div",{style:{position:"fixed",inset:0,backgroundColor:"rgba(0,0,0,0.85)",zIndex:1e4,pointerEvents:"none"}}),(0,_jsxRuntime.jsx)("div",{style:v?{visibility:"hidden"}:{display:"contents"},"aria-hidden":v||void 0,children:(0,_jsxRuntime.jsxs)(_floatingToolsWeb.FloatingTools,{enablePositionPersistence:!j,pushToSide:g||U,suspendPointerEvents:g,centerOnboarding:j,minimizedStack:Q?(0,_jsxRuntime.jsx)(_MinimizedToolsStackWeb.MinimizedToolsStack,{}):void 0,hasMinimizedStack:Q,children:[I&&G&&!Y&&(0,_jsxRuntime.jsx)(_sharedUi.EnvironmentIndicator,{environment:I}),Y&&G&&(0,_jsxRuntime.jsx)(_sharedUi.EnvironmentSelectorInline,{currentEnvironment:I??"local",availableEnvironments:i,onSelect:a}),s?(0,_jsxRuntime.jsx)(_floatingToolsWeb.UserStatus,{userRole:s,onPress:$}):(0,_jsxRuntime.jsx)("button",{"aria-label":"Open dev tools",onClick:$,style:{display:"flex",alignItems:"center",justifyContent:"center",padding:"6px 8px",background:"none",border:"none",cursor:"pointer"},children:(0,_jsxRuntime.jsx)(MenuLauncherIcon,{})}),ne.map(e=>(0,_jsxRuntime.jsx)("button",{"aria-label":e.name||(0,_floatingToolsReact.getToolLabel)(e.id),title:e.description,onClick:()=>_(e),style:{display:"flex",alignItems:"center",justifyContent:"center",padding:"4px 6px",borderRadius:6,background:"none",border:"none",cursor:"pointer"},children:typeof e.icon==="function"?e.icon(16):e.icon},e.id))]})}),j&&(0,_jsxRuntime.jsx)(_OnboardingTooltipWeb.OnboardingTooltip,{title:"Welcome to Buoy!",message:"Grab and position this menu wherever you want, then tap the icon to open your tools.",onDismiss:h}),g&&!v&&(0,_jsxRuntime.jsx)(_DialDevToolsWeb.DialMenu,{icons:z,onClose:se,centerLabel:"BUOY",onCenterPress:ie,settingsOpen:y,hintsDisabled:d,emptyNote:b&&z.length===0?_teamToolsNote.NO_TEAM_TOOLS_NOTE:void 0}),y&&!v&&(0,_jsxRuntime.jsx)(_DevToolsSettingsModalWeb.SettingsModal,{visible:true,onClose:re,availableTools:te,defaultFloatingTools:X,defaultDialTools:Z,onSettingsChange:e=>{}}),!v&&(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[(0,_jsxRuntime.jsx)(_AppHostWeb.AppOverlay,{}),(0,_jsxRuntime.jsx)(_floating.FloatingToolHost,{})]})]})}function useCapacitorSignInAudience(n){const s=n&&typeof n==="object"?n.appId:void 0;const i=!!n;(0,_react.useEffect)(()=>{if(!i)return;let a=false;const t=licenseModule.SessionManager;if(!t)return;const r=l=>{if(a||!l)return;t.configure({audience:`app:${l}`});void t.load().catch(()=>{})};if(s)r(s);else void(0,_license.loadCapacitorAppHost)().then(l=>r(l?.bundleId)).catch(()=>{});return()=>{a=true}},[i,s])}function usePublishAppId(n){const s=n&&typeof n==="object"?n.appId:void 0;(0,_react.useEffect)(()=>{let i=false;if(s){(0,_sharedUi.setBuoyAppId)(s)}else if((0,_license.isCapacitorNative)()){void(0,_license.loadCapacitorAppHost)().then(a=>{if(!i)(0,_sharedUi.setBuoyAppId)(a?.bundleId)}).catch(()=>{})}else if(typeof location!=="undefined"&&location.origin&&location.origin!=="null"){(0,_sharedUi.setBuoyAppId)(location.origin)}return()=>{i=true}},[s])}let warnedNoTools=false;function withInstalledTools(n){if(n.modules)return n;if(!_installedTools.installedToolsFound&&!warnedNoTools&&typeof console!=="undefined"){warnedNoTools=true;console.info("[Buoy] No tools loaded. Add buoy() from '@buoy-gg/core/vite' to your Vite plugins, or pass modules to FloatingDevTools.")}return{...n,modules:_installedTools.installedTools}}function FloatingDevTools(n){return(0,_jsxRuntime.jsx)(_floating.BuoyPortal,{children:(0,_jsxRuntime.jsx)(FloatingDevToolsContent,{...withInstalledTools(n)})})}function FloatingDevToolsContent(n){const{access:s,isPro:i,licenseKey:a}=(0,_license.useLicense)();(0,_react.useEffect)(()=>{void _license.LicenseManager.configure(n.licenseKey??(0,_Buoy.defaultLicenseKey)())},[n.licenseKey]);const t=n.licenseKey===void 0||(0,_license.sameLicenseKey)(n.licenseKey,a);const r=(0,_license.resolveDevBuild)(typeof __DEV__!=="undefined"?__DEV__:process.env.NODE_ENV!=="production");const l=t&&s.status==="admitted";(0,_react.useEffect)(()=>{if(l)(0,_sharedUi.startSettingsSync)()},[l]);(0,_react.useEffect)(()=>{if(r||s.status==="initializing")return;if(i&&l)(0,_releaseOptIn.markReleaseOptIn)();else(0,_releaseOptIn.clearReleaseOptIn)()},[r,i,l,s.status]);const c=(0,_license.isCapacitorNative)();useCapacitorSignInAudience(c?n.signIn:void 0);usePublishAppId(n.signIn);if(!r&&!i){if(!n.signIn||n.headless)return null;return c?(0,_jsxRuntime.jsx)(_BuoyCodeSignIn.BuoySignIn,{needsPlan:true}):(0,_jsxRuntime.jsx)(_BuoySignInWeb.BuoySignIn,{})}if(!l){return(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[s.status==="initializing"&&(0,_jsxRuntime.jsx)(StartupCapture,{modules:n.modules}),n.headless?null:n.signIn&&c?(0,_jsxRuntime.jsx)(_BuoyCodeSignIn.BuoySignIn,{}):(0,_jsxRuntime.jsx)(_sharedUi.AccountSetup,{})]})}return(0,_jsxRuntime.jsx)(AdmittedFloatingDevTools,{...n})}
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.FloatingDevTools=FloatingDevTools;var _floating=require("@buoy-gg/shared-ui/floating");var _license=_interopRequireWildcard(require("@buoy-gg/license"));var licenseModule=_license;var _sharedUi=require("@buoy-gg/shared-ui");var _react=require("react");var _floatingToolsReact=require("@buoy-gg/floating-tools-react");var _autoDiscoverPresetsWeb=require("../utils/autoDiscoverPresets.web.js");var _floatingToolsCore=require("@buoy-gg/floating-tools-core");var _teamToolsNote=require("./teamToolsNote.js");var _floatingToolsWeb=require("./floatingTools.web.js");var _DialDevToolsWeb=require("./dial/DialDevTools.web.js");var _dialUsageStore=require("./dial/dialUsageStore.js");var _OnboardingTooltipWeb=require("./dial/OnboardingTooltip.web.js");var _DevToolsSettingsModalWeb=require("./DevToolsSettingsModal.web.js");var _AppHostWeb=require("./AppHost.web.js");var _MinimizedToolsStackWeb=require("./MinimizedToolsStack.web.js");var _ToggleStateManager=require("./ToggleStateManager.js");var _createWebTools=require("../utils/createWebTools.js");var _BrowserToolRuntime=require("./BrowserToolRuntime.js");var _releaseOptIn=require("../releaseOptIn.js");var _BuoySignInWeb=require("./BuoySignIn.web.js");var _Buoy=require("../Buoy.js");var _BuoyCodeSignIn=require("./BuoyCodeSignIn.js");var _DevToolsVisibilityContext=require("./DevToolsVisibilityContext.js");var _createWebTool=require("../utils/createWebTool.js");var _DefaultConfigContext=require("./DefaultConfigContext.js");var _DevToolsSettingsModalShared=require("./DevToolsSettingsModal.shared.js");var _defaultConfig=require("./defaultConfig.js");var _installedTools=require("../installedTools.js");var _jsxRuntime=require("react/jsx-runtime");function _interopRequireWildcard(n,s){if("function"==typeof WeakMap)var i=new WeakMap,a=new WeakMap;return(_interopRequireWildcard=function(o,r){if(!r&&o&&o.__esModule)return o;var l,c,p={__proto__:null,default:o};if(null===o||"object"!=typeof o&&"function"!=typeof o)return p;if(l=r?a:i){if(l.has(o))return l.get(o);l.set(o,p)}for(const d in o)"default"!==d&&{}.hasOwnProperty.call(o,d)&&((c=(l=Object.defineProperty)&&Object.getOwnPropertyDescriptor(o,d))&&(c.get||c.set)?l(p,d,c):p[d]=o[d]);return p})(n,s)}const EMPTY_MODULES={};const MENU_TOOLTIP_KEY="@react_buoy_floating_menu_tooltip_shown";const webSettingsStorage=_sharedUi.persistentStorage;function MenuLauncherIcon({size:n=14,color:s="#20C997"}){const i=Math.max(2,n/4);const a=Math.max(1,n/16);return(0,_jsxRuntime.jsx)("div",{style:{display:"grid",gridTemplateColumns:`repeat(3, ${i}px)`,gap:a,width:n,height:n,alignContent:"center",justifyContent:"center"},children:Array.from({length:9}).map((o,r)=>(0,_jsxRuntime.jsx)("div",{style:{width:i,height:i,borderRadius:i/2,backgroundColor:s}},r))})}function AdmittedFloatingDevTools(n){const{defaultFloatingTools:s,defaultDialTools:i,disableHints:a=false,children:o}=n;const r=(0,_react.useMemo)(()=>i?(0,_defaultConfig.validateDialConfig)(i):i,[i]);return(0,_jsxRuntime.jsx)(_DefaultConfigContext.DefaultConfigProvider,{defaultFloatingTools:s,defaultDialTools:r,children:(0,_jsxRuntime.jsx)(_sharedUi.HintsProvider,{disableHints:a,children:(0,_jsxRuntime.jsxs)(_DevToolsVisibilityContext.DevToolsVisibilityProvider,{children:[(0,_jsxRuntime.jsx)(_AppHostWeb.AppHostProvider,{children:(0,_jsxRuntime.jsx)(FloatingDevToolsInner,{...n})}),o]})})})}const STARTUP_ROOTS=["ReduxAutoInstrument","ConsoleRoot","RouteTracker","ReactQueryTracker"];function StartupCapture({modules:n=EMPTY_MODULES}){return(0,_jsxRuntime.jsx)(_jsxRuntime.Fragment,{children:Object.entries(n).flatMap(([s,i])=>STARTUP_ROOTS.map(a=>{const o=i[a];return o?(0,_jsxRuntime.jsx)(o,{},`${s}:${a}`):null}))})}function WebToolOpenerBridge(){const{openApps:n,restore:s}=(0,_AppHostWeb.useAppHost)();(0,_react.useEffect)(()=>(0,_sharedUi.registerToolOpener)(i=>{const a=n.find(o=>o.id===i);if(!a)return false;s(a.instanceId);return true}),[n,s]);return null}function defaultEnvironment(){const n=(0,_license.capacitorDebug)();const s=n===null?process.env.NODE_ENV:n?"development":"production";return(0,_sharedUi.normalizeEnvironment)(s??"dev")}function configOverrides(n,s,i,a){const o=x=>Object.entries(n).find(([v])=>v.replace(/^@buoy-gg\//,"").replace(/\/web$/,"")===x)?.[1];const r=[];const l=o("env");if(s?.length&&l?.createEnvTool&&l.createEnvVarConfig){r.push((0,_createWebTool.createWebTool)(l.createEnvTool({requiredEnvVars:l.createEnvVarConfig(s)})))}const c=o("storage");if(i?.length&&c?.createStorageTool){r.push((0,_createWebTool.createWebTool)(c.createStorageTool({requiredStorageKeys:i})))}const p=o("ask-buoy");const d=a==="hosted"?p?.hostedAskBuoy?.():a;if(d&&p?.createAskBuoyTool)r.push((0,_createWebTool.createWebTool)(p.createAskBuoyTool(d)));return r}function toggleIsOn(n){if(n.launchMode!=="toggle-only")return void 0;const s=n.isOn;return typeof s==="function"?s():void 0}function FloatingDevToolsInner({environment:n,userRole:s="admin",availableEnvironments:i,onEnvironmentSwitch:a,apps:o,modules:r=EMPTY_MODULES,externalSync:l,requiredEnvVars:c,sentryGetClient:p,disableHints:d=false,headless:x=false,hidden:v=false,defaultFloatingTools:Z,defaultDialTools:E,zustandStores:M,requiredStorageKeys:B,askBuoy:W}){const I=n??defaultEnvironment();const ee=(0,_react.useMemo)(()=>E?(0,_defaultConfig.validateDialConfig)(E):void 0,[E]);const[g,S]=(0,_react.useState)(false);const[y,O]=(0,_react.useState)(false);const[,R]=(0,_react.useState)(0);(0,_react.useEffect)(()=>_ToggleStateManager.toggleStateManager.subscribe(()=>R(e=>e+1)),[]);const w=(0,_react.useRef)(false);const m=(0,_AppHostWeb.useAppHost)();const L=(0,_react.useMemo)(()=>configOverrides(r,c,B,W),[r,c,B,W]);const{allowedTools:b}=(0,_license.useLicense)();const f=(0,_react.useMemo)(()=>(0,_floatingToolsCore.filterTeamTools)((0,_autoDiscoverPresetsWeb.autoDiscoverWithCustom)([...(0,_createWebTools.createWebTools)(r),...o??[],...L]),b),[o,r,L,b]);const{openApps:F,close:N}=m;(0,_react.useEffect)(()=>{if(!b)return;for(const e of F){if(!(0,_floatingToolsCore.isTeamToolAllowed)(e.id,b))N(e.instanceId)}},[F,b,N]);const A=(0,_react.useMemo)(()=>Object.entries(r).find(([e])=>e.replace(/^@buoy-gg\//,"").replace(/\/web$/,"")==="zustand")?.[1],[r]);(0,_react.useEffect)(()=>{if(!M||typeof A?.watchStores!=="function")return;const e=A.watchStores(M);return typeof e==="function"?e:void 0},[M,A]);const C=(0,_DevToolsVisibilityContext.useDevToolsVisibility)();const K=m.openApps.some(e=>!e.minimized);(0,_react.useEffect)(()=>{C.setDialOpen(g)},[g,C.setDialOpen]);(0,_react.useEffect)(()=>{C.setToolOpen(K||y)},[K,y,C.setToolOpen]);const{registerApps:V}=m;(0,_react.useEffect)(()=>{V(f.map(e=>{const t=e.icon;return{...e,icon:typeof t==="function"?({size:u})=>t(u):t}}))},[V,f]);const ne=(0,_react.useMemo)(()=>f.map(e=>({id:e.id,name:e.name,description:e.description,slot:e.slot})),[f]);(0,_floatingToolsReact.useSettings)({availableTools:ne,storage:webSettingsStorage});(0,_react.useEffect)(()=>{let e=false;const t=async()=>{const[u,T]=await Promise.all([_sharedUi.persistentStorage.getItem(_sharedUi.devToolsStorageKeys.dial.isOpen()),_sharedUi.persistentStorage.getItem(_sharedUi.devToolsStorageKeys.settings.modalOpen())]);if(e)return;if(u==="true")S(true);if(T==="true"){S(true);O(true)}w.current=true};void t();return()=>{e=true}},[]);(0,_react.useEffect)(()=>{if(!w.current)return;void _sharedUi.persistentStorage.setItem(_sharedUi.devToolsStorageKeys.dial.isOpen(),g?"true":"false")},[g]);(0,_react.useEffect)(()=>{if(!w.current)return;void _sharedUi.persistentStorage.setItem(_sharedUi.devToolsStorageKeys.settings.modalOpen(),y?"true":"false")},[y]);const _=(0,_react.useCallback)(e=>{void(0,_dialUsageStore.recordToolUsage)(e.id);if(e.launchMode==="toggle-only"){e.onPress?.();R(t=>t+1);return}if(e.component){const t=typeof e.icon==="function"?e.icon(20):e.icon;m.open({id:e.id,title:e.name||(0,_floatingToolsReact.getToolLabel)(e.id),component:e.component,props:e.props,modal:e.modal,launchMode:e.launchMode||"self-modal",singleton:e.singleton??true,icon:t,color:e.color||(0,_floatingToolsReact.getToolColor)(e.id)})}else{e.onPress?.()}},[m]);const z=(0,_react.useRef)({tools:f,openApps:m.openApps,openTool:_});z.current={tools:f,openApps:m.openApps,openTool:_};(0,_react.useEffect)(()=>(0,_sharedUi.registerToolOpener)(e=>{const{tools:t,openApps:u,openTool:T}=z.current;if(u.some(q=>q.id===e))return false;const P=t.find(q=>q.id===e);if(!P||P.launchMode==="toggle-only")return false;T(P);return true}),[]);const D=(0,_react.useMemo)(()=>{const e=(0,_autoDiscoverPresetsWeb.getToolsBySlot)(f,"dial");return e.map(t=>{const u=t.color||(0,_floatingToolsReact.getToolColor)(t.id);let T;if(typeof t.icon==="string"){T=t.icon}else if(typeof t.icon==="function"){T=t.icon(32)}else{T=null}return{id:t.id,name:t.name||(0,_floatingToolsReact.getToolLabel)(t.id),icon:T,unavailable:!t.component&&!t.onPress,color:u,onPress:()=>{_(t);S(false)}}})},[f,_]);const H=(0,_react.useMemo)(()=>{if(!g)return D;const e=new Map(D.map(t=>[t.id,t]));return(0,_dialUsageStore.getRankedToolIds)(D.map(t=>t.id)).map(t=>e.get(t)).filter(t=>Boolean(t))},[g,D]);const{settings:k}=(0,_DevToolsSettingsModalShared.useDevToolsSettings)();const te=(0,_react.useMemo)(()=>(0,_autoDiscoverPresetsWeb.getToolsBySlot)(f,"row").filter(e=>(k.floatingTools[e.id]??false)===true&&(e.component||e.onPress)),[f,k.floatingTools]);const oe=(0,_react.useMemo)(()=>f.map(e=>({id:e.id,name:e.name||(0,_floatingToolsReact.getToolLabel)(e.id),description:e.description||(0,_floatingToolsReact.getToolDescription)(e.id),slot:e.slot,icon:e.icon,color:e.color})),[f]);const[se,U]=(0,_react.useState)(false);const $=m.openApps.some(e=>!e.minimized);(0,_react.useEffect)(()=>{if(d)return;let e=false;const t=setTimeout(async()=>{const u=await _sharedUi.persistentStorage.getItem(MENU_TOOLTIP_KEY);if(!e&&!u)U(true)},1e3);return()=>{e=true;clearTimeout(t)}},[d]);const h=(0,_react.useCallback)(()=>{U(false);void _sharedUi.persistentStorage.setItem(MENU_TOOLTIP_KEY,"true")},[]);const Y=(0,_react.useCallback)(()=>{h();S(true)},[h]);const ie=(0,_react.useCallback)(()=>{S(false);O(false)},[]);const re=(0,_react.useCallback)(()=>{O(e=>!e)},[]);const ae=(0,_react.useCallback)(()=>O(false),[]);const G=Boolean(i?.length&&a);const Q=k.floatingTools.environment!==false;const j=se&&!g&&!$&&!v;(0,_react.useEffect)(()=>{if(!j)return;const e=u=>{if(!(u.target instanceof Element)||!u.target.closest("[data-buoy-root]"))h()};const t=u=>{if(u.key==="Escape")h()};document.addEventListener("pointerdown",e,true);document.addEventListener("keydown",t);return()=>{document.removeEventListener("pointerdown",e,true);document.removeEventListener("keydown",t)}},[j,h]);const J=m.openApps.some(e=>e.minimized&&e.launchMode!=="toggle-only");const X=(0,_jsxRuntime.jsx)(_BrowserToolRuntime.BrowserToolRuntime,{modules:r,apps:o,requiredEnvVars:c,externalSync:l,headless:x,sentryGetClient:p});if(x)return X;return(0,_jsxRuntime.jsxs)("div",{"data-buoy-root":"",style:{display:"contents"},children:[X,(0,_jsxRuntime.jsx)(WebToolOpenerBridge,{}),j&&(0,_jsxRuntime.jsx)("div",{style:{position:"fixed",inset:0,backgroundColor:"rgba(0,0,0,0.85)",zIndex:1e4,pointerEvents:"none"}}),(0,_jsxRuntime.jsx)("div",{style:v?{visibility:"hidden"}:{display:"contents"},"aria-hidden":v||void 0,children:(0,_jsxRuntime.jsxs)(_floatingToolsWeb.FloatingTools,{enablePositionPersistence:!j,pushToSide:g||$,suspendPointerEvents:g,centerOnboarding:j,minimizedStack:J?(0,_jsxRuntime.jsx)(_MinimizedToolsStackWeb.MinimizedToolsStack,{}):void 0,hasMinimizedStack:J,children:[I&&Q&&!G&&(0,_jsxRuntime.jsx)(_sharedUi.EnvironmentIndicator,{environment:I}),G&&Q&&(0,_jsxRuntime.jsx)(_sharedUi.EnvironmentSelectorInline,{currentEnvironment:I??"local",availableEnvironments:i,onSelect:a}),s?(0,_jsxRuntime.jsx)(_floatingToolsWeb.UserStatus,{userRole:s,onPress:Y}):(0,_jsxRuntime.jsx)("button",{"aria-label":"Open dev tools",onClick:Y,style:{display:"flex",alignItems:"center",justifyContent:"center",padding:"6px 8px",background:"none",border:"none",cursor:"pointer"},children:(0,_jsxRuntime.jsx)(MenuLauncherIcon,{})}),te.map(e=>(0,_jsxRuntime.jsx)("button",{"aria-label":e.name||(0,_floatingToolsReact.getToolLabel)(e.id),"aria-pressed":toggleIsOn(e),title:e.description,onClick:()=>_(e),style:{display:"flex",alignItems:"center",justifyContent:"center",padding:"4px 6px",borderRadius:6,background:"none",border:"none",cursor:"pointer"},children:typeof e.icon==="function"?e.icon(16):e.icon},e.id))]})}),j&&(0,_jsxRuntime.jsx)(_OnboardingTooltipWeb.OnboardingTooltip,{title:"Welcome to Buoy!",message:"Grab and position this menu wherever you want, then tap the icon to open your tools.",onDismiss:h}),g&&!v&&(0,_jsxRuntime.jsx)(_DialDevToolsWeb.DialMenu,{icons:H,onClose:ie,centerLabel:"BUOY",onCenterPress:re,settingsOpen:y,hintsDisabled:d,emptyNote:b&&H.length===0?_teamToolsNote.NO_TEAM_TOOLS_NOTE:void 0}),y&&!v&&(0,_jsxRuntime.jsx)(_DevToolsSettingsModalWeb.SettingsModal,{visible:true,onClose:ae,availableTools:oe,defaultFloatingTools:Z,defaultDialTools:ee,onSettingsChange:e=>{}}),!v&&(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[(0,_jsxRuntime.jsx)(_AppHostWeb.AppOverlay,{}),(0,_jsxRuntime.jsx)(_floating.FloatingToolHost,{})]})]})}function useCapacitorSignInAudience(n){const s=n&&typeof n==="object"?n.appId:void 0;const i=!!n;(0,_react.useEffect)(()=>{if(!i)return;let a=false;const o=licenseModule.SessionManager;if(!o)return;const r=l=>{if(a||!l)return;o.configure({audience:`app:${l}`});void o.load().catch(()=>{})};if(s)r(s);else void(0,_license.loadCapacitorAppHost)().then(l=>r(l?.bundleId)).catch(()=>{});return()=>{a=true}},[i,s])}function usePublishAppId(n){const s=n&&typeof n==="object"?n.appId:void 0;(0,_react.useEffect)(()=>{let i=false;if(s){(0,_sharedUi.setBuoyAppId)(s)}else if((0,_license.isCapacitorNative)()){void(0,_license.loadCapacitorAppHost)().then(a=>{if(!i)(0,_sharedUi.setBuoyAppId)(a?.bundleId)}).catch(()=>{})}else if(typeof location!=="undefined"&&location.origin&&location.origin!=="null"){(0,_sharedUi.setBuoyAppId)(location.origin)}return()=>{i=true}},[s])}let warnedNoTools=false;function withInstalledTools(n){if(n.modules)return n;if(!_installedTools.installedToolsFound&&!warnedNoTools&&typeof console!=="undefined"){warnedNoTools=true;console.info("[Buoy] No tools loaded. Add buoy() from '@buoy-gg/core/vite' to your Vite plugins, or pass modules to FloatingDevTools.")}return{...n,modules:_installedTools.installedTools}}function FloatingDevTools(n){return(0,_jsxRuntime.jsx)(_floating.BuoyPortal,{children:(0,_jsxRuntime.jsx)(FloatingDevToolsContent,{...withInstalledTools(n)})})}function FloatingDevToolsContent(n){const{access:s,isPro:i,licenseKey:a}=(0,_license.useLicense)();(0,_react.useEffect)(()=>{void _license.LicenseManager.configure(n.licenseKey??(0,_Buoy.defaultLicenseKey)())},[n.licenseKey]);const o=n.licenseKey===void 0||(0,_license.sameLicenseKey)(n.licenseKey,a);const r=(0,_license.resolveDevBuild)(typeof __DEV__!=="undefined"?__DEV__:process.env.NODE_ENV!=="production");const l=o&&s.status==="admitted";(0,_react.useEffect)(()=>{if(l)(0,_sharedUi.startSettingsSync)()},[l]);(0,_react.useEffect)(()=>{if(r||s.status==="initializing")return;if(i&&l)(0,_releaseOptIn.markReleaseOptIn)();else(0,_releaseOptIn.clearReleaseOptIn)()},[r,i,l,s.status]);const c=(0,_license.isCapacitorNative)();useCapacitorSignInAudience(c?n.signIn:void 0);usePublishAppId(n.signIn);if(!r&&!i){if(!n.signIn||n.headless)return null;return c?(0,_jsxRuntime.jsx)(_BuoyCodeSignIn.BuoySignIn,{needsPlan:true}):(0,_jsxRuntime.jsx)(_BuoySignInWeb.BuoySignIn,{})}if(!l){return(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[s.status==="initializing"&&(0,_jsxRuntime.jsx)(StartupCapture,{modules:n.modules}),n.headless?null:n.signIn&&c?(0,_jsxRuntime.jsx)(_BuoyCodeSignIn.BuoySignIn,{}):(0,_jsxRuntime.jsx)(_sharedUi.AccountSetup,{})]})}return(0,_jsxRuntime.jsx)(AdmittedFloatingDevTools,{...n})}
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.autoDiscoverPresets=autoDiscoverPresets;exports.autoDiscoverPresetsWithCustom=autoDiscoverPresetsWithCustom;var _optionalRequire=require("./optionalRequire.js");function autoDiscoverPresets(){const t=[];const u=[{name:"@buoy-gg/env",loader:()=>{try{const{envToolPreset:r}=require("@buoy-gg/env");return r}catch(r){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/env",r);return null}}},{name:"@buoy-gg/network",loader:()=>{try{const{networkToolPreset:r}=require("@buoy-gg/network");return r}catch(r){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/network",r);return null}}},{name:"@buoy-gg/storage",loader:()=>{try{const{storageToolPreset:r}=require("@buoy-gg/storage");return r}catch(r){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/storage",r);return null}}},{name:"@buoy-gg/react-query",loader:()=>{try{const{reactQueryToolPreset:r,wifiTogglePreset:e}=require("@buoy-gg/react-query");return[r,e]}catch(r){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/react-query",r);return null}}},{name:"@buoy-gg/route-events",loader:()=>{try{const{routeEventsToolPreset:r}=require("@buoy-gg/route-events");return r}catch(r){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/route-events",r);return null}}},{name:"@buoy-gg/debug-borders",loader:()=>{try{const{debugBordersToolPreset:r}=require("@buoy-gg/debug-borders");return r}catch(r){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/debug-borders",r);return null}}},{name:"@buoy-gg/highlight-updates",loader:()=>{try{const{highlightUpdatesPreset:r,highlightUpdatesModalPreset:e}=require("@buoy-gg/highlight-updates");return[e,r]}catch(r){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/highlight-updates",r);return null}}},{name:"@buoy-gg/console",loader:()=>{try{const{consoleToolPreset:r}=require("@buoy-gg/console");return r}catch(r){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/console",r);return null}}},{name:"@buoy-gg/notifications",loader:()=>{try{return require("@buoy-gg/notifications").notificationToolPreset}catch(r){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/notifications",r);return null}}},{name:"@buoy-gg/sentry",loader:()=>{try{const{sentryToolPreset:r}=require("@buoy-gg/sentry");return r}catch(r){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/sentry",r);return null}}},{name:"@buoy-gg/time-machine",loader:()=>{try{const{timeMachineToolPreset:r}=require("@buoy-gg/time-machine");return r}catch(r){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/time-machine",r);return null}}},{name:"@buoy-gg/clock",loader:()=>{try{const{clockToolPreset:r}=require("@buoy-gg/clock");return r}catch(r){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/clock",r);return null}}},{name:"@buoy-gg/lifecycle",loader:()=>{try{const{lifecycleToolPreset:r}=require("@buoy-gg/lifecycle");return r}catch(r){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/lifecycle",r);return null}}},{name:"@buoy-gg/location",loader:()=>{try{const{locationToolPreset:r}=require("@buoy-gg/location");return r}catch(r){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/location",r);return null}}},{name:"@buoy-gg/permissions",loader:()=>{try{const{permissionsToolPreset:r}=require("@buoy-gg/permissions");return r}catch(r){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/permissions",r);return null}}},{name:"@buoy-gg/scenarios",loader:()=>{try{const{scenariosToolPreset:r}=require("@buoy-gg/scenarios");return r}catch(r){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/scenarios",r);return null}}},{name:"@buoy-gg/ask-buoy",loader:()=>{try{const{askBuoyToolPreset:r}=require("@buoy-gg/ask-buoy");return r}catch(r){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/ask-buoy",r);return null}}},{name:"@buoy-gg/redux",loader:()=>{try{const{reduxToolPreset:r}=require("@buoy-gg/redux");return r}catch(r){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/redux",r);return null}}},{name:"@buoy-gg/zustand",loader:()=>{try{const{zustandToolPreset:r}=require("@buoy-gg/zustand");return r}catch(r){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/zustand",r);return null}}},{name:"@buoy-gg/events",loader:()=>{try{const{eventsToolPreset:r}=require("@buoy-gg/events");return r}catch(r){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/events",r);return null}}},{name:"@buoy-gg/jotai",loader:()=>{try{const{jotaiToolPreset:r}=require("@buoy-gg/jotai");return r}catch(r){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/jotai",r);return null}}},{name:"@buoy-gg/image-overlay",loader:()=>{try{const{imageOverlayToolPreset:r}=require("@buoy-gg/image-overlay");return r}catch(r){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/image-overlay",r);return null}}},{name:"@buoy-gg/perf-monitor",loader:()=>{try{const{perfMonitorPreset:r,perfMonitorModalPreset:e}=require("@buoy-gg/perf-monitor");return[r,e]}catch(r){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/perf-monitor",r);return null}}},{name:"@buoy-gg/js-top",loader:()=>{try{const{jsTopPreset:r,jsTopModalPreset:e}=require("@buoy-gg/js-top");return[e,r]}catch(r){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/js-top",r);return null}}},{name:"@buoy-gg/images",loader:()=>{try{const{imagesToolPreset:r}=require("@buoy-gg/images");return r}catch(r){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/images",r);return null}}},{name:"@buoy-gg/assets",loader:()=>{try{const{assetsToolPreset:r}=require("@buoy-gg/assets");return r}catch(r){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/assets",r);return null}}}];for(const{name:r,loader:e}of u){try{const o=e();if(o){if(Array.isArray(o)){t.push(...o)}else{t.push(o)}}}catch(o){(0,_optionalRequire.reportOptionalRequireError)(r,o)}}return t}function autoDiscoverPresetsWithCustom(t){const u=autoDiscoverPresets();const r=new Set(t.map(o=>o.id));const e=u.filter(o=>!r.has(o.id));return[...t,...e]}
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.autoDiscoverPresets=autoDiscoverPresets;exports.autoDiscoverPresetsWithCustom=autoDiscoverPresetsWithCustom;var _optionalRequire=require("./optionalRequire.js");function autoDiscoverPresets(){const t=[];const u=[{name:"@buoy-gg/env",loader:()=>{try{const{envToolPreset:r}=require("@buoy-gg/env");return r}catch(r){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/env",r);return null}}},{name:"@buoy-gg/network",loader:()=>{try{const{networkToolPreset:r}=require("@buoy-gg/network");return r}catch(r){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/network",r);return null}}},{name:"@buoy-gg/storage",loader:()=>{try{const{storageToolPreset:r}=require("@buoy-gg/storage");return r}catch(r){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/storage",r);return null}}},{name:"@buoy-gg/react-query",loader:()=>{try{const{reactQueryToolPreset:r,wifiTogglePreset:e}=require("@buoy-gg/react-query");return[r,e]}catch(r){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/react-query",r);return null}}},{name:"@buoy-gg/route-events",loader:()=>{try{const{routeEventsToolPreset:r}=require("@buoy-gg/route-events");return r}catch(r){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/route-events",r);return null}}},{name:"@buoy-gg/debug-borders",loader:()=>{try{const{debugBordersToolPreset:r}=require("@buoy-gg/debug-borders");return r}catch(r){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/debug-borders",r);return null}}},{name:"@buoy-gg/highlight-updates",loader:()=>{try{const{highlightUpdatesPreset:r,highlightUpdatesModalPreset:e}=require("@buoy-gg/highlight-updates");return[e,r]}catch(r){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/highlight-updates",r);return null}}},{name:"@buoy-gg/console",loader:()=>{try{const{consoleToolPreset:r}=require("@buoy-gg/console");return r}catch(r){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/console",r);return null}}},{name:"@buoy-gg/notifications",loader:()=>{try{return require("@buoy-gg/notifications").notificationToolPreset}catch(r){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/notifications",r);return null}}},{name:"@buoy-gg/sentry",loader:()=>{try{const{sentryToolPreset:r}=require("@buoy-gg/sentry");return r}catch(r){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/sentry",r);return null}}},{name:"@buoy-gg/time-machine",loader:()=>{try{const{timeMachineToolPreset:r}=require("@buoy-gg/time-machine");return r}catch(r){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/time-machine",r);return null}}},{name:"@buoy-gg/clock",loader:()=>{try{const{clockToolPreset:r}=require("@buoy-gg/clock");return r}catch(r){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/clock",r);return null}}},{name:"@buoy-gg/bug-links",loader:()=>{try{const{reportBugToolPreset:r,bugLinksToolPreset:e}=require("@buoy-gg/bug-links");return[r,e]}catch(r){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/bug-links",r);return null}}},{name:"@buoy-gg/memory-leaks",loader:()=>{try{const{memoryLeaksToolPreset:r}=require("@buoy-gg/memory-leaks");return r}catch(r){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/memory-leaks",r);return null}}},{name:"@buoy-gg/lifecycle",loader:()=>{try{const{lifecycleToolPreset:r}=require("@buoy-gg/lifecycle");return r}catch(r){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/lifecycle",r);return null}}},{name:"@buoy-gg/ota-inspector",loader:()=>{try{const{otaInspectorToolPreset:r}=require("@buoy-gg/ota-inspector");return r}catch(r){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/ota-inspector",r);return null}}},{name:"@buoy-gg/location",loader:()=>{try{const{locationToolPreset:r}=require("@buoy-gg/location");return r}catch(r){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/location",r);return null}}},{name:"@buoy-gg/permissions",loader:()=>{try{const{permissionsToolPreset:r}=require("@buoy-gg/permissions");return r}catch(r){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/permissions",r);return null}}},{name:"@buoy-gg/scenarios",loader:()=>{try{const{scenariosToolPreset:r}=require("@buoy-gg/scenarios");return r}catch(r){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/scenarios",r);return null}}},{name:"@buoy-gg/ask-buoy",loader:()=>{try{const{askBuoyToolPreset:r}=require("@buoy-gg/ask-buoy");return r}catch(r){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/ask-buoy",r);return null}}},{name:"@buoy-gg/redux",loader:()=>{try{const{reduxToolPreset:r}=require("@buoy-gg/redux");return r}catch(r){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/redux",r);return null}}},{name:"@buoy-gg/zustand",loader:()=>{try{const{zustandToolPreset:r}=require("@buoy-gg/zustand");return r}catch(r){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/zustand",r);return null}}},{name:"@buoy-gg/events",loader:()=>{try{const{eventsToolPreset:r}=require("@buoy-gg/events");return r}catch(r){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/events",r);return null}}},{name:"@buoy-gg/jotai",loader:()=>{try{const{jotaiToolPreset:r}=require("@buoy-gg/jotai");return r}catch(r){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/jotai",r);return null}}},{name:"@buoy-gg/image-overlay",loader:()=>{try{const{imageOverlayToolPreset:r}=require("@buoy-gg/image-overlay");return r}catch(r){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/image-overlay",r);return null}}},{name:"@buoy-gg/perf-monitor",loader:()=>{try{const{perfMonitorPreset:r,perfMonitorModalPreset:e}=require("@buoy-gg/perf-monitor");return[r,e]}catch(r){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/perf-monitor",r);return null}}},{name:"@buoy-gg/js-top",loader:()=>{try{const{jsTopPreset:r,jsTopModalPreset:e}=require("@buoy-gg/js-top");return[e,r]}catch(r){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/js-top",r);return null}}},{name:"@buoy-gg/images",loader:()=>{try{const{imagesToolPreset:r}=require("@buoy-gg/images");return r}catch(r){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/images",r);return null}}},{name:"@buoy-gg/assets",loader:()=>{try{const{assetsToolPreset:r}=require("@buoy-gg/assets");return r}catch(r){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/assets",r);return null}}}];for(const{name:r,loader:e}of u){try{const o=e();if(o){if(Array.isArray(o)){t.push(...o)}else{t.push(o)}}}catch(o){(0,_optionalRequire.reportOptionalRequireError)(r,o)}}return t}function autoDiscoverPresetsWithCustom(t){const u=autoDiscoverPresets();const r=new Set(t.map(o=>o.id));const e=u.filter(o=>!r.has(o.id));return[...t,...e]}
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.AutoExternalSync=AutoExternalSync;exports.ToolRegistryPublisher=ToolRegistryPublisher;exports.isExternalSyncAvailable=isExternalSyncAvailable;exports.useToolAdapterMap=useToolAdapterMap;var _react=require("react");var _reactNative=require("react-native");var _license=require("@buoy-gg/license");var _optionalRequire=require("./optionalRequire.js");var _appSyncAdapter=require("./sync/appSyncAdapter.js");var _deviceIdentity=require("./deviceIdentity.js");var _externalSyncGate=require("./externalSyncGate.js");var _Buoy=require("../Buoy.js");var _sharedUi=require("@buoy-gg/shared-ui");(0,_Buoy.applyDefaultLicenseKey)();let externalSyncModule=null;let storageModule=null;let networkModule=null;let reactQueryModule=null;let routeEventsModule=null;let reduxModule=null;let zustandModule=null;let jotaiModule=null;let eventsModule=null;let consoleModule=null;let clockModule=null;let permissionsModule=null;let lifecycleModule=null;let locationModule=null;let sentryModule=null;let notificationsModule=null;try{notificationsModule=require("@buoy-gg/notifications")}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/notifications",e)}let envModule=null;let highlightUpdatesModule=null;let debugBordersModule=null;let impersonateModule=null;let perfMonitorModule=null;let jsTopModule=null;let imagesModule=null;let assetsModule=null;let tvRemoteModule=null;let focusInspectorModule=null;let expoConstantsModule=null;try{externalSyncModule=require("@buoy-gg/external-sync")}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/external-sync",e)}try{storageModule=require("@buoy-gg/storage")}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/storage",e)}try{networkModule=require("@buoy-gg/network")}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/network",e)}try{reactQueryModule=require("@buoy-gg/react-query")}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/react-query",e)}try{routeEventsModule=require("@buoy-gg/route-events")}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/route-events",e)}try{reduxModule=require("@buoy-gg/redux")}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/redux",e)}try{zustandModule=require("@buoy-gg/zustand")}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/zustand",e)}try{jotaiModule=require("@buoy-gg/jotai")}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/jotai",e)}try{eventsModule=require("@buoy-gg/events")}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/events",e)}try{consoleModule=require("@buoy-gg/console")}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/console",e)}try{clockModule=require("@buoy-gg/clock")}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/clock",e)}try{lifecycleModule=require("@buoy-gg/lifecycle")}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/lifecycle",e)}try{locationModule=require("@buoy-gg/location")}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/location",e)}try{permissionsModule=require("@buoy-gg/permissions")}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/permissions",e)}try{sentryModule=require("@buoy-gg/sentry")}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/sentry",e)}try{envModule=require("@buoy-gg/env")}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/env",e)}try{highlightUpdatesModule=require("@buoy-gg/highlight-updates")}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/highlight-updates",e)}try{debugBordersModule=require("@buoy-gg/debug-borders")}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/debug-borders",e)}try{impersonateModule=require("@buoy-gg/impersonate")}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/impersonate",e)}try{perfMonitorModule=require("@buoy-gg/perf-monitor")}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/perf-monitor",e)}try{jsTopModule=require("@buoy-gg/js-top")}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/js-top",e)}try{imagesModule=require("@buoy-gg/images")}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/images",e)}try{assetsModule=require("@buoy-gg/assets")}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/assets",e)}try{tvRemoteModule=require("@buoy-gg/tv-remote")}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/tv-remote",e)}try{focusInspectorModule=require("@buoy-gg/focus-inspector")}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/focus-inspector",e)}try{expoConstantsModule=require("expo-constants")}catch(e){(0,_optionalRequire.reportOptionalRequireError)("expo-constants",e)}function isExternalSyncAvailable(){return!!externalSyncModule?.useExternalSyncSocket}function getAppName(){const e=expoConstantsModule?.default??expoConstantsModule;return e?.expoConfig?.name??e?.manifest2?.extra?.expoClient?.name??null}function getHardwareName(){const e=expoConstantsModule?.default??expoConstantsModule;const o=e?.deviceName;return typeof o==="string"&&o.length>0?o:null}function useToolAdapterMap({requiredEnvVars:e,customApps:o}){const n=reactQueryModule?.useReactQuerySyncAdapter?reactQueryModule.useReactQuerySyncAdapter():null;return useToolAdapterMapInner(n,e,o)}function ToolRegistryPublisher({requiredEnvVars:e,customApps:o}){const n=useToolAdapterMap({requiredEnvVars:e,customApps:o});const r=(0,_react.useRef)(n);r.current=n;(0,_react.useEffect)(()=>(0,_sharedUi.registerToolAdapters)(()=>r.current),[]);return null}function AutoExternalSync({options:e,requiredEnvVars:o,isPro:n,tier:r,licenseKey:t,customApps:g}){const{useExternalSyncSocket:d,useExternalSync:f}=externalSyncModule;const l=useToolAdapterMap({requiredEnvVars:o,customApps:g});const s=(0,_deviceIdentity.useDeviceIdentity)(e,{appName:getAppName(),hardwareName:getHardwareName(),platform:_reactNative.Platform.OS});const y=s?.deviceId??null;const{socket:i}=d({deviceName:s?.deviceName??"Buoy Device",socketURL:e?.socketURL??externalSyncModule.getDefaultSocketURL?.()??"http://localhost:42831",persistentDeviceId:y,platform:_reactNative.Platform.OS,enableLogs:e?.enableLogs});const u=(0,_react.useRef)({isPro:n,tier:r,licenseKey:t});u.current={isPro:n,tier:r,licenseKey:t};(0,_react.useEffect)(()=>{if(!i)return;const c=()=>{if(!_license.LicenseManager.hasAccountAccess()||!i.connected)return;const p=_license.LicenseManager.getState();if(!u.current.isPro&&(p.isInitialized===false||p.isValidating===true))return;i.emit("device-license",{isPro:u.current.isPro?"1":"0",tier:u.current.tier??(u.current.isPro?"pro":"free")})};if(i.connected)c();i.on("connect",c);return()=>{i.off("connect",c)}},[i,n,r,t]);const a=e?.releaseActions?.join(",")??"";const b=(0,_react.useMemo)(()=>(0,_externalSyncGate.applyReleaseActionPolicy)(l,typeof __DEV__!=="undefined"&&__DEV__,a?a.split(","):void 0),[l,a]);f({tools:b,socket:i,deviceId:y,enableLogs:e?.enableLogs});return null}function useToolAdapterMapInner(e,o,n){return(0,_react.useMemo)(()=>{const r={app:_appSyncAdapter.appSyncAdapter};if(storageModule?.storageSyncAdapter){r.storage=storageModule.storageSyncAdapter}if(networkModule?.networkSyncAdapter){r.network=networkModule.networkSyncAdapter}if(e){r.query=e}if(routeEventsModule?.routeEventsSyncAdapter){r["route-events"]=routeEventsModule.routeEventsSyncAdapter}if(reduxModule?.reduxSyncAdapter){r.redux=reduxModule.reduxSyncAdapter}if(zustandModule?.zustandSyncAdapter){r.zustand=zustandModule.zustandSyncAdapter}if(jotaiModule?.jotaiSyncAdapter){r.jotai=jotaiModule.jotaiSyncAdapter}if(eventsModule?.eventsSyncAdapter){r.events=eventsModule.eventsSyncAdapter}if(consoleModule?.consoleSyncAdapter){r.console=consoleModule.consoleSyncAdapter}if(clockModule?.clockSyncAdapter){r.clock=clockModule.clockSyncAdapter}if(permissionsModule?.permissionsSyncAdapter){r.permissions=permissionsModule.permissionsSyncAdapter}if(lifecycleModule?.lifecycleSyncAdapter){r.lifecycle=lifecycleModule.lifecycleSyncAdapter}if(locationModule?.locationSyncAdapter){r.location=locationModule.locationSyncAdapter}if(notificationsModule?.notificationSyncAdapter){r["push-notifications"]=notificationsModule.notificationSyncAdapter}if(sentryModule?.sentrySyncAdapter){r.sentry=sentryModule.sentrySyncAdapter}try{const t=require("@buoy-gg/time-machine");if(t?.timeMachineSyncAdapter){r["time-machine"]=t.timeMachineSyncAdapter}}catch(t){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/time-machine",t)}try{const t=require("@buoy-gg/scenarios");if(t?.scenariosSyncAdapter){r.scenarios=t.scenariosSyncAdapter}}catch(t){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/scenarios",t)}try{const t=require("@buoy-gg/ask-buoy");if(t?.askBuoySyncAdapter){r["ask-buoy"]=t.askBuoySyncAdapter}}catch(t){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/ask-buoy",t)}if(envModule?.createEnvSyncAdapter){r.env=envModule.createEnvSyncAdapter(o??[])}if(highlightUpdatesModule?.highlightUpdatesSyncAdapter){r["highlight-updates"]=highlightUpdatesModule.highlightUpdatesSyncAdapter}if(debugBordersModule?.debugBordersSyncAdapter){r["debug-borders"]=debugBordersModule.debugBordersSyncAdapter}if(impersonateModule?.impersonateSyncAdapter){r.impersonate=impersonateModule.impersonateSyncAdapter}if(perfMonitorModule?.perfMonitorSyncAdapter){r["perf-monitor"]=perfMonitorModule.perfMonitorSyncAdapter}if(jsTopModule?.jsTopSyncAdapter){r["js-top"]=jsTopModule.jsTopSyncAdapter}if(imagesModule?.imagesSyncAdapter){r.images=imagesModule.imagesSyncAdapter}if(assetsModule?.assetsSyncAdapter){r.assets=assetsModule.assetsSyncAdapter}if(tvRemoteModule?.tvRemoteSyncAdapter){r["tv-remote"]=tvRemoteModule.tvRemoteSyncAdapter}if(focusInspectorModule?.focusInspectorSyncAdapter){r["focus-inspector"]=focusInspectorModule.focusInspectorSyncAdapter}for(const t of n??[]){if(t?.sync){r[`custom:${t.id}`]=t.sync}}return r},[e,o,n])}
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.AutoExternalSync=AutoExternalSync;exports.ToolRegistryPublisher=ToolRegistryPublisher;exports.isExternalSyncAvailable=isExternalSyncAvailable;exports.useToolAdapterMap=useToolAdapterMap;var _react=require("react");var _reactNative=require("react-native");var _license=require("@buoy-gg/license");var _optionalRequire=require("./optionalRequire.js");var _appSyncAdapter=require("./sync/appSyncAdapter.js");var _deviceIdentity=require("./deviceIdentity.js");var _externalSyncGate=require("./externalSyncGate.js");var _Buoy=require("../Buoy.js");var _sharedUi=require("@buoy-gg/shared-ui");(0,_Buoy.applyDefaultLicenseKey)();let externalSyncModule=null;let storageModule=null;let networkModule=null;let reactQueryModule=null;let routeEventsModule=null;let reduxModule=null;let zustandModule=null;let jotaiModule=null;let eventsModule=null;let consoleModule=null;let clockModule=null;let bugLinksModule=null;let memoryLeaksModule=null;try{memoryLeaksModule=require("@buoy-gg/memory-leaks")}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/memory-leaks",e)}let permissionsModule=null;let lifecycleModule=null;let otaModule=null;let locationModule=null;let sentryModule=null;let notificationsModule=null;try{notificationsModule=require("@buoy-gg/notifications")}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/notifications",e)}let envModule=null;let highlightUpdatesModule=null;let debugBordersModule=null;let impersonateModule=null;let perfMonitorModule=null;let jsTopModule=null;let imagesModule=null;let assetsModule=null;let tvRemoteModule=null;let focusInspectorModule=null;let expoConstantsModule=null;try{externalSyncModule=require("@buoy-gg/external-sync")}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/external-sync",e)}try{storageModule=require("@buoy-gg/storage")}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/storage",e)}try{networkModule=require("@buoy-gg/network")}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/network",e)}try{reactQueryModule=require("@buoy-gg/react-query")}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/react-query",e)}try{routeEventsModule=require("@buoy-gg/route-events")}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/route-events",e)}try{reduxModule=require("@buoy-gg/redux")}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/redux",e)}try{zustandModule=require("@buoy-gg/zustand")}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/zustand",e)}try{jotaiModule=require("@buoy-gg/jotai")}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/jotai",e)}try{eventsModule=require("@buoy-gg/events")}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/events",e)}try{consoleModule=require("@buoy-gg/console")}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/console",e)}try{clockModule=require("@buoy-gg/clock")}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/clock",e)}try{bugLinksModule=require("@buoy-gg/bug-links")}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/bug-links",e)}try{lifecycleModule=require("@buoy-gg/lifecycle")}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/lifecycle",e)}try{otaModule=require("@buoy-gg/ota-inspector")}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/ota-inspector",e)}try{locationModule=require("@buoy-gg/location")}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/location",e)}try{permissionsModule=require("@buoy-gg/permissions")}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/permissions",e)}try{sentryModule=require("@buoy-gg/sentry")}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/sentry",e)}try{envModule=require("@buoy-gg/env")}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/env",e)}try{highlightUpdatesModule=require("@buoy-gg/highlight-updates")}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/highlight-updates",e)}try{debugBordersModule=require("@buoy-gg/debug-borders")}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/debug-borders",e)}try{impersonateModule=require("@buoy-gg/impersonate")}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/impersonate",e)}try{perfMonitorModule=require("@buoy-gg/perf-monitor")}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/perf-monitor",e)}try{jsTopModule=require("@buoy-gg/js-top")}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/js-top",e)}try{imagesModule=require("@buoy-gg/images")}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/images",e)}try{assetsModule=require("@buoy-gg/assets")}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/assets",e)}try{tvRemoteModule=require("@buoy-gg/tv-remote")}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/tv-remote",e)}try{focusInspectorModule=require("@buoy-gg/focus-inspector")}catch(e){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/focus-inspector",e)}try{expoConstantsModule=require("expo-constants")}catch(e){(0,_optionalRequire.reportOptionalRequireError)("expo-constants",e)}function isExternalSyncAvailable(){return!!externalSyncModule?.useExternalSyncSocket}function getAppName(){const e=expoConstantsModule?.default??expoConstantsModule;return e?.expoConfig?.name??e?.manifest2?.extra?.expoClient?.name??null}function getHardwareName(){const e=expoConstantsModule?.default??expoConstantsModule;const o=e?.deviceName;return typeof o==="string"&&o.length>0?o:null}function useToolAdapterMap({requiredEnvVars:e,customApps:o}){const n=reactQueryModule?.useReactQuerySyncAdapter?reactQueryModule.useReactQuerySyncAdapter():null;return useToolAdapterMapInner(n,e,o)}function ToolRegistryPublisher({requiredEnvVars:e,customApps:o}){const n=useToolAdapterMap({requiredEnvVars:e,customApps:o});const r=(0,_react.useRef)(n);r.current=n;(0,_react.useEffect)(()=>(0,_sharedUi.registerToolAdapters)(()=>r.current),[]);return null}function AutoExternalSync({options:e,requiredEnvVars:o,isPro:n,tier:r,licenseKey:t,customApps:g}){const{useExternalSyncSocket:d,useExternalSync:f}=externalSyncModule;const l=useToolAdapterMap({requiredEnvVars:o,customApps:g});const s=(0,_deviceIdentity.useDeviceIdentity)(e,{appName:getAppName(),hardwareName:getHardwareName(),platform:_reactNative.Platform.OS});const y=s?.deviceId??null;const{socket:u}=d({deviceName:s?.deviceName??"Buoy Device",socketURL:e?.socketURL??externalSyncModule.getDefaultSocketURL?.()??"http://localhost:42831",persistentDeviceId:y,platform:_reactNative.Platform.OS,enableLogs:e?.enableLogs});const a=(0,_react.useRef)({isPro:n,tier:r,licenseKey:t});a.current={isPro:n,tier:r,licenseKey:t};(0,_react.useEffect)(()=>{if(!u)return;const c=()=>{if(!_license.LicenseManager.hasAccountAccess()||!u.connected)return;const p=_license.LicenseManager.getState();if(!a.current.isPro&&(p.isInitialized===false||p.isValidating===true))return;u.emit("device-license",{isPro:a.current.isPro?"1":"0",tier:a.current.tier??(a.current.isPro?"pro":"free")})};if(u.connected)c();u.on("connect",c);return()=>{u.off("connect",c)}},[u,n,r,t]);const i=e?.releaseActions?.join(",")??"";const b=(0,_react.useMemo)(()=>(0,_externalSyncGate.applyReleaseActionPolicy)(l,typeof __DEV__!=="undefined"&&__DEV__,i?i.split(","):void 0),[l,i]);f({tools:b,socket:u,deviceId:y,enableLogs:e?.enableLogs});return null}function useToolAdapterMapInner(e,o,n){return(0,_react.useMemo)(()=>{const r={app:_appSyncAdapter.appSyncAdapter};if(storageModule?.storageSyncAdapter){r.storage=storageModule.storageSyncAdapter}if(networkModule?.networkSyncAdapter){r.network=networkModule.networkSyncAdapter}if(e){r.query=e}if(routeEventsModule?.routeEventsSyncAdapter){r["route-events"]=routeEventsModule.routeEventsSyncAdapter}if(reduxModule?.reduxSyncAdapter){r.redux=reduxModule.reduxSyncAdapter}if(zustandModule?.zustandSyncAdapter){r.zustand=zustandModule.zustandSyncAdapter}if(jotaiModule?.jotaiSyncAdapter){r.jotai=jotaiModule.jotaiSyncAdapter}if(eventsModule?.eventsSyncAdapter){r.events=eventsModule.eventsSyncAdapter}if(consoleModule?.consoleSyncAdapter){r.console=consoleModule.consoleSyncAdapter}if(memoryLeaksModule?.memoryLeaksSyncAdapter)r["memory-leaks"]=memoryLeaksModule.memoryLeaksSyncAdapter;if(clockModule?.clockSyncAdapter){r.clock=clockModule.clockSyncAdapter}if(permissionsModule?.permissionsSyncAdapter){r.permissions=permissionsModule.permissionsSyncAdapter}if(bugLinksModule?.bugLinksSyncAdapter){r["bug-links"]=bugLinksModule.bugLinksSyncAdapter}if(otaModule?.otaInspectorSyncAdapter)r["ota-update-inspector"]=otaModule.otaInspectorSyncAdapter;if(lifecycleModule?.lifecycleSyncAdapter){r.lifecycle=lifecycleModule.lifecycleSyncAdapter}if(locationModule?.locationSyncAdapter){r.location=locationModule.locationSyncAdapter}if(notificationsModule?.notificationSyncAdapter){r["push-notifications"]=notificationsModule.notificationSyncAdapter}if(sentryModule?.sentrySyncAdapter){r.sentry=sentryModule.sentrySyncAdapter}try{const t=require("@buoy-gg/time-machine");if(t?.timeMachineSyncAdapter){r["time-machine"]=t.timeMachineSyncAdapter}}catch(t){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/time-machine",t)}try{const t=require("@buoy-gg/scenarios");if(t?.scenariosSyncAdapter){r.scenarios=t.scenariosSyncAdapter}}catch(t){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/scenarios",t)}try{const t=require("@buoy-gg/ask-buoy");if(t?.askBuoySyncAdapter){r["ask-buoy"]=t.askBuoySyncAdapter}}catch(t){(0,_optionalRequire.reportOptionalRequireError)("@buoy-gg/ask-buoy",t)}if(envModule?.createEnvSyncAdapter){r.env=envModule.createEnvSyncAdapter(o??[])}if(highlightUpdatesModule?.highlightUpdatesSyncAdapter){r["highlight-updates"]=highlightUpdatesModule.highlightUpdatesSyncAdapter}if(debugBordersModule?.debugBordersSyncAdapter){r["debug-borders"]=debugBordersModule.debugBordersSyncAdapter}if(impersonateModule?.impersonateSyncAdapter){r.impersonate=impersonateModule.impersonateSyncAdapter}if(perfMonitorModule?.perfMonitorSyncAdapter){r["perf-monitor"]=perfMonitorModule.perfMonitorSyncAdapter}if(jsTopModule?.jsTopSyncAdapter){r["js-top"]=jsTopModule.jsTopSyncAdapter}if(imagesModule?.imagesSyncAdapter){r.images=imagesModule.imagesSyncAdapter}if(assetsModule?.assetsSyncAdapter){r.assets=assetsModule.assetsSyncAdapter}if(tvRemoteModule?.tvRemoteSyncAdapter){r["tv-remote"]=tvRemoteModule.tvRemoteSyncAdapter}if(focusInspectorModule?.focusInspectorSyncAdapter){r["focus-inspector"]=focusInspectorModule.focusInspectorSyncAdapter}for(const t of n??[]){if(t?.sync){r[`custom:${t.id}`]=t.sync}}return r},[e,o,n])}
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.resolveBackTarget=resolveBackTarget;function resolveBackTarget(e,r){if(r)return{kind:"dial"};for(let t=e.length-1;t>=0;t--){const n=e[t];if(n.launchMode!=="toggle-only"&&!n.minimized){return{kind:"tool",instanceId:n.instanceId}}}const i=e[e.length-1];return i?{kind:"tool",instanceId:i.instanceId}:null}
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.BUOY_BACK_PRIORITY=void 0;exports.ionicHandlesBack=ionicHandlesBack;exports.isBuoyHoldingBackButton=isBuoyHoldingBackButton;exports.useCapacitorBackButton=useCapacitorBackButton;var _react=require("react");var _license=require("@buoy-gg/license");function isBuoyHoldingBackButton(){return globalThis.__BUOY_HOLDS_BACK__===true}const BUOY_BACK_PRIORITY=exports.BUOY_BACK_PRIORITY=99.5;function ionicHandlesBack(){if(typeof document==="undefined")return false;const e=globalThis.Ionic;if(!e&&!document.querySelector("ion-app"))return false;try{return e?.config?.get?.("hardwareBackButton",true)!==false}catch{return true}}function useCapacitorBackButton(e,u){const n=(0,_react.useRef)(u);n.current=u;(0,_react.useEffect)(()=>{if(!e||(0,_license.capacitorPlatform)()!=="android")return;const o=globalThis;o.__BUOY_HOLDS_BACK__=true;let i;if(ionicHandlesBack()){const t=r=>{r.detail?.register?.(BUOY_BACK_PRIORITY,()=>{n.current()})};document.addEventListener("ionBackButton",t);i=()=>document.removeEventListener("ionBackButton",t)}else{const t=(0,_license.capacitorPlugin)("App");if(!t?.addListener){o.__BUOY_HOLDS_BACK__=false;return}let r=false;let c=null;void Promise.resolve(t.addListener("backButton",()=>n.current())).then(a=>{if(r)void a.remove();else c=a}).catch(()=>{});i=()=>{r=true;if(c)void c.remove()}}return()=>{i();o.__BUOY_HOLDS_BACK__=false}},[e])}
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.BUOY_DIAL_BACK_PRIORITY=exports.BUOY_BACK_PRIORITY=void 0;exports.ionicHandlesBack=ionicHandlesBack;exports.isBuoyHoldingBackButton=isBuoyHoldingBackButton;exports.useCapacitorBackButton=useCapacitorBackButton;var _react=require("react");var _license=require("@buoy-gg/license");function isBuoyHoldingBackButton(){return globalThis.__BUOY_HOLDS_BACK__===true}const BUOY_BACK_PRIORITY=exports.BUOY_BACK_PRIORITY=99.5;const BUOY_DIAL_BACK_PRIORITY=exports.BUOY_DIAL_BACK_PRIORITY=99.6;let holders=0;function ionicHandlesBack(){if(typeof document==="undefined")return false;const e=globalThis.Ionic;if(!e&&!document.querySelector("ion-app"))return false;try{return e?.config?.get?.("hardwareBackButton",true)!==false}catch{return true}}function useCapacitorBackButton(e,i,u=BUOY_BACK_PRIORITY){const n=(0,_react.useRef)(i);n.current=i;(0,_react.useEffect)(()=>{if(!e||(0,_license.capacitorPlatform)()!=="android")return;const a=globalThis;holders+=1;a.__BUOY_HOLDS_BACK__=true;const s=()=>{holders=Math.max(0,holders-1);a.__BUOY_HOLDS_BACK__=holders>0};let o;if(ionicHandlesBack()){const t=r=>{r.detail?.register?.(u,()=>{n.current()})};document.addEventListener("ionBackButton",t);o=()=>document.removeEventListener("ionBackButton",t)}else{const t=(0,_license.capacitorPlugin)("App");if(!t?.addListener){s();return}let r=false;let c=null;void Promise.resolve(t.addListener("backButton",()=>n.current())).then(B=>{if(r)void B.remove();else c=B}).catch(()=>{});o=()=>{r=true;if(c)void c.remove()}}return()=>{o();s()}},[e,u])}