@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.
- package/bundlers/vite.d.ts +1 -1
- package/bundlers/vite.mjs +3 -3
- package/lib/commonjs/earlyNetwork.js +1 -1
- package/lib/commonjs/floatingMenu/AppHost.js +1 -1
- package/lib/commonjs/floatingMenu/AppHost.web.js +1 -1
- package/lib/commonjs/floatingMenu/AppHostLogic.js +1 -1
- package/lib/commonjs/floatingMenu/DevToolsSettingsModal.shared.js +1 -1
- package/lib/commonjs/floatingMenu/FloatingDevTools.js +1 -1
- package/lib/commonjs/floatingMenu/FloatingDevTools.web.js +1 -1
- package/lib/commonjs/floatingMenu/autoDiscoverPresets.js +1 -1
- package/lib/commonjs/floatingMenu/autoExternalSync.js +1 -1
- package/lib/commonjs/floatingMenu/backTarget.js +1 -0
- package/lib/commonjs/floatingMenu/capacitorBackButton.js +1 -1
- package/lib/commonjs/floatingMenu/dial/DialDevTools.js +1 -1
- package/lib/commonjs/floatingMenu/dial/DialDevTools.web.js +1 -1
- package/lib/commonjs/floatingMenu/externalSyncGate.js +1 -1
- package/lib/commonjs/floatingMenu/hardwareBack.js +1 -0
- package/lib/commonjs/version.js +1 -1
- package/lib/module/earlyNetwork.js +1 -1
- package/lib/module/floatingMenu/AppHost.js +1 -1
- package/lib/module/floatingMenu/AppHost.web.js +1 -1
- package/lib/module/floatingMenu/AppHostLogic.js +1 -1
- package/lib/module/floatingMenu/DevToolsSettingsModal.shared.js +1 -1
- package/lib/module/floatingMenu/FloatingDevTools.js +1 -1
- package/lib/module/floatingMenu/FloatingDevTools.web.js +1 -1
- package/lib/module/floatingMenu/autoDiscoverPresets.js +1 -1
- package/lib/module/floatingMenu/autoExternalSync.js +1 -1
- package/lib/module/floatingMenu/backTarget.js +1 -0
- package/lib/module/floatingMenu/capacitorBackButton.js +1 -1
- package/lib/module/floatingMenu/dial/DialDevTools.js +1 -1
- package/lib/module/floatingMenu/dial/DialDevTools.web.js +1 -1
- package/lib/module/floatingMenu/externalSyncGate.js +1 -1
- package/lib/module/floatingMenu/hardwareBack.js +1 -0
- package/lib/module/version.js +1 -1
- package/lib/typescript/commonjs/earlyNetwork.d.ts +19 -4
- package/lib/typescript/commonjs/floatingMenu/AppHostLogic.d.ts +6 -0
- package/lib/typescript/commonjs/floatingMenu/backTarget.d.ts +17 -0
- package/lib/typescript/commonjs/floatingMenu/capacitorBackButton.d.ts +5 -3
- package/lib/typescript/commonjs/floatingMenu/defaultConfig.d.ts +1 -1
- package/lib/typescript/commonjs/floatingMenu/hardwareBack.d.ts +8 -0
- package/lib/typescript/commonjs/version.d.ts +1 -1
- package/lib/typescript/module/earlyNetwork.d.ts +19 -4
- package/lib/typescript/module/floatingMenu/AppHostLogic.d.ts +6 -0
- package/lib/typescript/module/floatingMenu/backTarget.d.ts +17 -0
- package/lib/typescript/module/floatingMenu/capacitorBackButton.d.ts +5 -3
- package/lib/typescript/module/floatingMenu/defaultConfig.d.ts +1 -1
- package/lib/typescript/module/floatingMenu/hardwareBack.d.ts +8 -0
- package/lib/typescript/module/version.d.ts +1 -1
- package/lib/web/auto.mjs +1 -1
- package/lib/web/chunks/{FloatingDevTools.web-IIOOVSUC.mjs → FloatingDevTools.web-5EMC7ZIE.mjs} +1 -1
- package/lib/web/chunks/FloatingDevTools.web-QLTO5FXP.mjs +1 -0
- package/lib/web/chunks/chunk-EFTCKGMC.mjs +10 -0
- package/lib/web/chunks/chunk-JXTHZBMM.mjs +10 -0
- package/lib/web/chunks/chunk-OXRZOHYP.mjs +1 -0
- package/lib/web/index.mjs +1 -1
- package/lib/web/register-network.mjs +1 -1
- package/lib/web/register.mjs +1 -1
- package/package.json +5 -5
- package/lib/web/chunks/chunk-5EUMNDI5.mjs +0 -1
- package/lib/web/chunks/chunk-LAJ3HKAL.mjs +0 -10
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.DialDevTools=void 0;var _react=require("react");var _reactNative=require("react-native");var _sharedUi=require("@buoy-gg/shared-ui");var _DialIcon=require("./DialIcon.js");var _DialHyperspace=require("./DialHyperspace.js");var _DialPagination=require("./DialPagination.js");var _dialUsageStore=require("./dialUsageStore.js");var _DevToolsSettingsModal=require("../DevToolsSettingsModal");var _license=require("@buoy-gg/license");var _AppIcon=require("../AppIcon");var _AppHost=require("../AppHost");var _OnboardingTooltip=require("./OnboardingTooltip");var _floatingToolsCore=require("@buoy-gg/floating-tools-core");var _jsxRuntime=require("react/jsx-runtime");const BUTTON_SIZE=_floatingToolsCore.DIAL_BUTTON_SIZE;const DIAL_BACKGROUND_FOCUS={x:.5,y:.5};const HUB_CLEARANCE=BUTTON_SIZE*.75+6;const DIAL_IDLE_PULSE=false;const ONBOARDING_STORAGE_KEY="@react_buoy_settings_tooltip_shown";const createEmptySlot=r=>({id:`empty-${r}`,name:`empty-${r}`,icon:null,color:"transparent",onPress:()=>{}});const DialDevTools=({onClose:r,onSettingsPress:F,autoOpenSettings:T=false,apps:m,emptyNote:D,state:ie,actions:C})=>{const[N,G]=(0,_react.useState)(-1);const[n,d]=(0,_react.useState)(false);const[I,q]=(0,_react.useState)(false);const[j,k]=(0,_react.useState)(false);const y=(0,_react.useRef)(false);const L=(0,_sharedUi.useHintsDisabled)();const{refreshSettings:U}=(0,_DevToolsSettingsModal.useDevToolsSettings)();const{open:_}=(0,_AppHost.useAppHost)();const{isPro:z,isWeekendFree:O}=(0,_license.useProAccess)();const{width:b,height:H}=(0,_reactNative.useWindowDimensions)();const i=(0,_floatingToolsCore.getDialLayout)({screenWidth:b}).circleSize;const{id:W}=(0,_sharedUi.useToolBackground)();const a=(0,_react.useMemo)(()=>({parent:{width:i,height:i},circle:{width:i,height:i,borderRadius:i/2},rounded:{borderRadius:i/2},gridLine:{width:i},spoke:{width:i/2-HUB_CLEARANCE}}),[i]);(0,_react.useEffect)(()=>{const t=async()=>{try{const e=await _sharedUi.persistentStorage.getItem(_sharedUi.devToolsStorageKeys.settings.modalOpen());if(e==="true"){d(true)}}catch(e){}finally{q(true)}};t()},[]);(0,_react.useEffect)(()=>{if(!I)return;_sharedUi.persistentStorage.setItem(_sharedUi.devToolsStorageKeys.settings.modalOpen(),n?"true":"false").catch(t=>{console.warn("[Buoy]","Failed to save settings modal state:",t)})},[n,I]);(0,_react.useEffect)(()=>{if(T&&!n){d(true)}},[T,n]);(0,_react.useEffect)(()=>{if(L){return}const t=async()=>{try{const e=await _sharedUi.persistentStorage.getItem(ONBOARDING_STORAGE_KEY);if(!e){setTimeout(()=>{k(true)},1200)}}catch(e){}};t()},[L]);const S=(0,_react.useRef)(new _reactNative.Animated.Value(0)).current;const c=(0,_react.useRef)(new _reactNative.Animated.Value(0)).current;const x=(0,_react.useRef)(new _reactNative.Animated.Value(0)).current;const u=(0,_react.useRef)(new _reactNative.Animated.Value(0)).current;const f=(0,_react.useRef)(new _reactNative.Animated.Value(0)).current;const v=(0,_react.useRef)(new _reactNative.Animated.Value(1)).current;const $=(0,_react.useMemo)(()=>m.map(({id:t,name:e,slot:o,description:p,icon:te,color:oe})=>({id:t,name:e,slot:o,description:p,icon:te,color:oe})),[m]);const g=(0,_react.useRef)(null);const X=()=>{if(n){d(false);return}d(true);if(j&&!y.current){M()}F?.()};const l=(0,_react.useMemo)(()=>m.filter(t=>(t.slot??"both")!=="row"),[m]);const R=(0,_react.useMemo)(()=>{const t=new Map;for(const e of l){t.set(e.id,{id:e.id,name:e.name,icon:typeof e.icon==="function"?null:(0,_AppIcon.renderAppIcon)(e.icon,{slot:"dial",size:20,color:e.color}),iconComponent:typeof e.icon==="function"?e.icon:void 0,color:e.color??_sharedUi.buoyColors.primary,onPress:()=>{void(0,_dialUsageStore.recordToolUsage)(e.id);e?.onPress?.(C);if(e.launchMode!=="toggle-only"){const o=(0,_AppIcon.renderAppIcon)(e.icon,{slot:"dial",size:20,color:e.color});_({id:e.id,title:e.name,component:e.component,props:e.props,launchMode:e.launchMode??"self-modal",singleton:e.singleton??true,icon:o,color:e.color,modal:e.modal})}r?.()}})}return t},[l,C,_,r]);const[A,V]=(0,_react.useState)(()=>(0,_dialUsageStore.getRankedToolIds)(l.map(t=>t.id)));(0,_react.useEffect)(()=>{const t=l.map(o=>o.id);if((0,_dialUsageStore.isDialUsageLoaded)()){V((0,_dialUsageStore.getRankedToolIds)(t));return}let e=false;(0,_dialUsageStore.loadDialUsage)().then(()=>{if(!e)V((0,_dialUsageStore.getRankedToolIds)(t))});return()=>{e=true}},[l]);const h=Math.max(1,Math.ceil(A.length/_floatingToolsCore.MAX_DIAL_SLOTS));const[K,Y]=(0,_react.useState)(0);const s=Math.min(K,h-1);const w=(0,_react.useMemo)(()=>{return A.map(t=>R.get(t)).filter(t=>Boolean(t)).map((t,e)=>({icon:t,page:Math.floor(e/_floatingToolsCore.MAX_DIAL_SLOTS),slot:e%_floatingToolsCore.MAX_DIAL_SLOTS}))},[A,R]);const Z=(0,_react.useMemo)(()=>{const t=w.filter(o=>o.page===s).length;const e=[];for(let o=t;o<_floatingToolsCore.MAX_DIAL_SLOTS;o+=1)e.push(o);return e},[w,s]);const E=t=>{const e=Math.max(0,Math.min(t,h-1));if(e!==s)Y(e)};(0,_react.useEffect)(()=>{const t=_floatingToolsCore.dialAnimationConfig??{entrance:{backdrop:{duration:400},dial:{scale:{damping:15,stiffness:150,mass:1},rotation:{duration:800}},centerButton:{delay:150,damping:10,stiffness:200},icons:{delay:200,duration:400},circuitTraces:{delay:600,duration:1e3}},continuous:{glitch:{interval:3e3,offset:2,stepDuration:50},pulse:{maxScale:1.02,minScale:.98,duration:1e3},floating:{maxY:-8,minY:0,duration:3e3},breathing:{maxScale:1.05,minScale:.98,duration:2500}}};const{entrance:e,continuous:o}=t;_reactNative.Animated.timing(S,{toValue:1,duration:e.backdrop.duration,useNativeDriver:true}).start();_reactNative.Animated.spring(c,{toValue:1,damping:e.dial.scale.damping,stiffness:e.dial.scale.stiffness,mass:e.dial.scale.mass,useNativeDriver:true}).start();_reactNative.Animated.sequence([_reactNative.Animated.timing(x,{toValue:1,duration:e.dial.rotation.duration,easing:_reactNative.Easing.out(_reactNative.Easing.cubic),useNativeDriver:true}),_reactNative.Animated.timing(x,{toValue:0,duration:0,useNativeDriver:true})]).start();_reactNative.Animated.sequence([_reactNative.Animated.delay(e.centerButton.delay),_reactNative.Animated.spring(u,{toValue:1,damping:e.centerButton.damping,stiffness:e.centerButton.stiffness,useNativeDriver:true})]).start();_reactNative.Animated.sequence([_reactNative.Animated.delay(e.icons.delay),_reactNative.Animated.timing(f,{toValue:1,duration:e.icons.duration,easing:_reactNative.Easing.out(_reactNative.Easing.cubic),useNativeDriver:true})]).start();if(!DIAL_IDLE_PULSE)return;g.current=_reactNative.Animated.loop(_reactNative.Animated.sequence([_reactNative.Animated.timing(v,{toValue:o.pulse.maxScale,duration:o.pulse.duration,easing:_reactNative.Easing.inOut(_reactNative.Easing.ease),useNativeDriver:true}),_reactNative.Animated.timing(v,{toValue:o.pulse.minScale,duration:o.pulse.duration,easing:_reactNative.Easing.inOut(_reactNative.Easing.ease),useNativeDriver:true})]));g.current.start();return()=>{g.current?.stop()}},[]);const M=()=>{y.current=true;k(false);_sharedUi.persistentStorage.setItem(ONBOARDING_STORAGE_KEY,"true").catch(t=>{console.warn("[Buoy]","Failed to save dial onboarding state:",t)})};const B=()=>{if(g.current){g.current.stop()}const t=_floatingToolsCore.dialAnimationConfig?.exit??{icons:{duration:300},centerButton:{duration:200},dialScale:{duration:250},backdrop:{duration:200}};_reactNative.Animated.sequence([_reactNative.Animated.timing(f,{toValue:0,duration:t.icons.duration,easing:_reactNative.Easing.in(_reactNative.Easing.cubic),useNativeDriver:true}),_reactNative.Animated.parallel([_reactNative.Animated.timing(u,{toValue:0,duration:t.centerButton.duration,easing:_reactNative.Easing.in(_reactNative.Easing.cubic),useNativeDriver:true}),_reactNative.Animated.timing(c,{toValue:0,duration:t.dialScale.duration,easing:_reactNative.Easing.in(_reactNative.Easing.cubic),useNativeDriver:true})]),_reactNative.Animated.timing(S,{toValue:0,duration:t.backdrop.duration,useNativeDriver:true})]).start(()=>{if(r){setTimeout(()=>{r()},0)}})};const P=t=>{G(1);const e=_floatingToolsCore.dialAnimationConfig?.interaction??{iconSelect:{pulse:[{scale:.9,damping:15,stiffness:500},{scale:1,damping:10,stiffness:200}],actionDelay:50}};const[o,p]=e.iconSelect.pulse;_reactNative.Animated.sequence([_reactNative.Animated.spring(u,{toValue:o.scale,damping:o.damping,stiffness:o.stiffness,useNativeDriver:true}),_reactNative.Animated.spring(u,{toValue:p.scale,damping:p.damping,stiffness:p.stiffness,useNativeDriver:true})]).start();setTimeout(()=>{t.onPress();if(t.id!=="wifi"){B()}},e.iconSelect.actionDelay)};const J={opacity:S};const Q={transform:[{scale:u}]};const ee={transform:[{scale:N>=0?1:v}]};return(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.container,nativeID:"dial-devtools-root",children:[(0,_jsxRuntime.jsx)(_reactNative.Animated.View,{style:[styles.backdrop,J],children:(0,_jsxRuntime.jsx)(_reactNative.Pressable,{style:_sharedUi.absoluteFill,onPress:B})}),l.length===0&&D?(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[styles.emptyNote,{bottom:80+i+16}],accessibilityLiveRegion:"polite",testID:"buoy-dial-empty-note",children:D}):null,(0,_jsxRuntime.jsxs)(_reactNative.Animated.View,{style:[styles.parent,a.parent,{position:"absolute",left:(b-i)/2,bottom:80,transform:[{scale:c},{rotate:x.interpolate({inputRange:[0,1],outputRange:["0deg","360deg"]})}]}],children:[(0,_jsxRuntime.jsxs)(_reactNative.Animated.View,{style:[styles.circle,a.circle],children:[(0,_jsxRuntime.jsxs)(_reactNative.View,{style:[styles.gradientBackground,a.rounded],children:[(0,_jsxRuntime.jsx)(_reactNative.View,{style:[styles.gradientLayer1,a.rounded]}),(0,_jsxRuntime.jsx)(_reactNative.View,{style:[styles.gradientLayer2,a.rounded]}),(0,_jsxRuntime.jsx)(_reactNative.View,{style:[styles.gradientLayer3,a.rounded]}),(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.gridPattern,children:Array.from({length:6}).map((t,e)=>(0,_jsxRuntime.jsxs)(_reactNative.View,{style:[styles.gridLine,a.gridLine,{transform:[{rotate:`${e*60}deg`}]}],children:[(0,_jsxRuntime.jsx)(_reactNative.View,{style:[styles.spoke,a.spoke,styles.spokeLeft]}),(0,_jsxRuntime.jsx)(_reactNative.View,{style:[styles.spoke,a.spoke,styles.spokeRight]})]},e))}),W==="hyperspace"?(0,_jsxRuntime.jsx)(_DialHyperspace.DialHyperspace,{size:i}):(0,_jsxRuntime.jsx)(_sharedUi.ToolBackground,{focus:DIAL_BACKGROUND_FOCUS})]}),w.filter(({page:t})=>t===s).map(({icon:t,slot:e})=>(0,_jsxRuntime.jsx)(_DialIcon.DialIcon,{onPress:P,iconsProgress:f,icon:t,index:e,totalIcons:_floatingToolsCore.MAX_DIAL_SLOTS,active:true},`${t.id??"icon"}:${s}:${e}`)),Z.map(t=>(0,_jsxRuntime.jsx)(_DialIcon.DialIcon,{onPress:P,iconsProgress:f,icon:createEmptySlot(t),index:t,totalIcons:_floatingToolsCore.MAX_DIAL_SLOTS,active:true},`empty-${t}`))]}),(0,_jsxRuntime.jsx)(_reactNative.Animated.View,{style:[styles.buttonContainer,Q],children:(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.buttonGradient,children:[(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.buttonGradientLayer1}),(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.buttonGradientLayer2}),(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.buttonGradientLayer3}),(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.buttonBorder,children:(0,_jsxRuntime.jsx)(_reactNative.Animated.View,{style:[styles.button,ee],children:(0,_jsxRuntime.jsx)(_reactNative.TouchableOpacity,{accessibilityRole:"button",accessibilityLabel:n?"Close Settings":"Open Dev Tools Settings",onPress:X,activeOpacity:.5,style:styles.buttonPressable,children:n?(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[styles.centerText,styles.closeTextTop],children:"CLOSE"}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[styles.centerText,styles.closeTextBottom],children:"SETTINGS"})]}):(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.centerText,children:"BUOY"}),z&&(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[styles.proText,O&&styles.weekendText],children:O?"WEEKEND":"PRO"})]})})})})]})})]}),h>1&&(0,_jsxRuntime.jsx)(_DialPagination.DialPagination,{page:s,pageCount:h,onPrev:()=>E(s-1),onNext:()=>E(s+1),animatedStyle:{position:"absolute",left:(b-i)/2,top:H-80+16,width:i,opacity:c,transform:[{scale:c}]}}),n&&(0,_jsxRuntime.jsx)(_DevToolsSettingsModal.DevToolsSettingsModal,{visible:true,onClose:()=>{d(false);U()},availableApps:$}),j&&!n&&!y.current&&(0,_jsxRuntime.jsx)(_OnboardingTooltip.OnboardingTooltip,{visible:true,onDismiss:M})]})};exports.DialDevTools=DialDevTools;const styles=_reactNative.StyleSheet.create({container:{..._sharedUi.absoluteFill,zIndex:9999},backdrop:{..._sharedUi.absoluteFill,backgroundColor:_floatingToolsCore.dialColors.dialBackdrop},parent:{alignItems:"center",justifyContent:"center"},circle:{position:"absolute",backgroundColor:"transparent",borderWidth:1,borderColor:_floatingToolsCore.dialColors.dialBorder,shadowColor:_floatingToolsCore.dialColors.dialShadow,shadowOffset:{width:0,height:0},shadowOpacity:.5,shadowRadius:20,elevation:10},gradientBackground:{width:"100%",height:"100%",position:"relative",backgroundColor:_floatingToolsCore.dialColors.dialBackground,overflow:"hidden"},gradientLayer1:{..._sharedUi.absoluteFill,backgroundColor:_floatingToolsCore.dialColors.dialGradient1,opacity:.6},gradientLayer2:{..._sharedUi.absoluteFill,backgroundColor:_floatingToolsCore.dialColors.dialGradient2,opacity:.4,top:"30%",left:"30%"},gradientLayer3:{..._sharedUi.absoluteFill,backgroundColor:_floatingToolsCore.dialColors.dialGradient3,opacity:.3,top:"50%",left:"50%"},gridPattern:{..._sharedUi.absoluteFill,alignItems:"center",justifyContent:"center"},gridLine:{position:"absolute",height:1},spoke:{position:"absolute",top:0,height:1,backgroundColor:_floatingToolsCore.dialColors.dialGridLine},spokeLeft:{left:0},spokeRight:{right:0},buttonContainer:{zIndex:1,backgroundColor:"transparent",alignItems:"center",justifyContent:"center",position:"absolute",width:BUTTON_SIZE*1.5,height:BUTTON_SIZE*1.5,borderRadius:BUTTON_SIZE},buttonGradient:{width:"100%",height:"100%",borderRadius:BUTTON_SIZE,alignItems:"center",justifyContent:"center",padding:4,backgroundColor:_floatingToolsCore.dialColors.hubHalo,position:"relative",overflow:"hidden"},buttonGradientLayer1:{..._sharedUi.absoluteFill,backgroundColor:_floatingToolsCore.dialColors.dialGradient1,opacity:.5,borderRadius:BUTTON_SIZE},buttonGradientLayer2:{..._sharedUi.absoluteFill,backgroundColor:_floatingToolsCore.dialColors.dialGradient2,opacity:.3,top:"20%",left:"20%",borderRadius:BUTTON_SIZE},buttonGradientLayer3:{..._sharedUi.absoluteFill,backgroundColor:_floatingToolsCore.dialColors.dialGradient3,opacity:.2,top:"40%",left:"40%",borderRadius:BUTTON_SIZE},buttonBorder:{backgroundColor:_floatingToolsCore.dialColors.hubFill,alignItems:"center",justifyContent:"center",width:BUTTON_SIZE*1.2,height:BUTTON_SIZE*1.2,borderRadius:BUTTON_SIZE*.6},button:{width:BUTTON_SIZE,height:BUTTON_SIZE,borderRadius:BUTTON_SIZE/2,justifyContent:"center",alignItems:"center",position:"relative",overflow:"hidden"},buttonPressable:{width:"100%",height:"100%",justifyContent:"center",alignItems:"center"},centerText:{color:_floatingToolsCore.dialColors.centerText,fontSize:10,fontWeight:"900",fontFamily:_sharedUi.monoFont,letterSpacing:1,textAlign:"center",textTransform:"uppercase",textShadowColor:_floatingToolsCore.dialColors.centerTextGlow,textShadowOffset:{width:0,height:0},textShadowRadius:4},closeTextTop:{marginBottom:-2},emptyNote:{position:"absolute",left:16,right:16,color:_floatingToolsCore.dialColors.iconLabel,fontSize:12,fontFamily:_sharedUi.monoFont,textAlign:"center"},closeTextBottom:{marginTop:-2},proText:{color:_sharedUi.buoyColors.warning,fontSize:8,fontWeight:"900",fontFamily:_sharedUi.monoFont,letterSpacing:2,textAlign:"center",textShadowColor:_floatingToolsCore.dialColors.centerTextGlow,textShadowOffset:{width:0,height:0},textShadowRadius:4},weekendText:{color:"#BF5AF2",letterSpacing:1}});
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.DialDevTools=void 0;var _react=require("react");var _reactNative=require("react-native");var _sharedUi=require("@buoy-gg/shared-ui");var _DialIcon=require("./DialIcon.js");var _DialHyperspace=require("./DialHyperspace.js");var _DialPagination=require("./DialPagination.js");var _dialUsageStore=require("./dialUsageStore.js");var _DevToolsSettingsModal=require("../DevToolsSettingsModal");var _license=require("@buoy-gg/license");var _AppIcon=require("../AppIcon");var _AppHost=require("../AppHost");var _hardwareBack=require("../hardwareBack.js");var _OnboardingTooltip=require("./OnboardingTooltip");var _floatingToolsCore=require("@buoy-gg/floating-tools-core");var _jsxRuntime=require("react/jsx-runtime");const BUTTON_SIZE=_floatingToolsCore.DIAL_BUTTON_SIZE;const DIAL_BACKGROUND_FOCUS={x:.5,y:.5};const HUB_CLEARANCE=BUTTON_SIZE*.75+6;const DIAL_IDLE_PULSE=false;const ONBOARDING_STORAGE_KEY="@react_buoy_settings_tooltip_shown";const createEmptySlot=r=>({id:`empty-${r}`,name:`empty-${r}`,icon:null,color:"transparent",onPress:()=>{}});const DialDevTools=({onClose:r,onSettingsPress:q,autoOpenSettings:D=false,apps:m,emptyNote:C,state:ne,actions:I})=>{const[G,U]=(0,_react.useState)(-1);const[n,l]=(0,_react.useState)(false);const[j,z]=(0,_react.useState)(false);const[k,L]=(0,_react.useState)(false);const y=(0,_react.useRef)(false);const _=(0,_sharedUi.useHintsDisabled)();const{refreshSettings:R}=(0,_DevToolsSettingsModal.useDevToolsSettings)();const{open:O}=(0,_AppHost.useAppHost)();const{isPro:H,isWeekendFree:V}=(0,_license.useProAccess)();const{width:b,height:W}=(0,_reactNative.useWindowDimensions)();const i=(0,_floatingToolsCore.getDialLayout)({screenWidth:b}).circleSize;const{id:$}=(0,_sharedUi.useToolBackground)();const a=(0,_react.useMemo)(()=>({parent:{width:i,height:i},circle:{width:i,height:i,borderRadius:i/2},rounded:{borderRadius:i/2},gridLine:{width:i},spoke:{width:i/2-HUB_CLEARANCE}}),[i]);(0,_react.useEffect)(()=>{const t=async()=>{try{const e=await _sharedUi.persistentStorage.getItem(_sharedUi.devToolsStorageKeys.settings.modalOpen());if(e==="true"){l(true)}}catch(e){}finally{z(true)}};t()},[]);(0,_react.useEffect)(()=>{if(!j)return;_sharedUi.persistentStorage.setItem(_sharedUi.devToolsStorageKeys.settings.modalOpen(),n?"true":"false").catch(t=>{console.warn("[Buoy]","Failed to save settings modal state:",t)})},[n,j]);(0,_react.useEffect)(()=>{if(D&&!n){l(true)}},[D,n]);(0,_react.useEffect)(()=>{if(_){return}const t=async()=>{try{const e=await _sharedUi.persistentStorage.getItem(ONBOARDING_STORAGE_KEY);if(!e){setTimeout(()=>{L(true)},1200)}}catch(e){}};t()},[_]);const S=(0,_react.useRef)(new _reactNative.Animated.Value(0)).current;const c=(0,_react.useRef)(new _reactNative.Animated.Value(0)).current;const x=(0,_react.useRef)(new _reactNative.Animated.Value(0)).current;const u=(0,_react.useRef)(new _reactNative.Animated.Value(0)).current;const f=(0,_react.useRef)(new _reactNative.Animated.Value(0)).current;const v=(0,_react.useRef)(new _reactNative.Animated.Value(1)).current;const X=(0,_react.useMemo)(()=>m.map(({id:t,name:e,slot:o,description:p,icon:oe,color:ie})=>({id:t,name:e,slot:o,description:p,icon:oe,color:ie})),[m]);const B=(0,_react.useRef)(false);const g=(0,_react.useRef)(null);const K=()=>{if(n){l(false);return}l(true);if(k&&!y.current){F()}q?.()};const d=(0,_react.useMemo)(()=>m.filter(t=>(t.slot??"both")!=="row"),[m]);const E=(0,_react.useMemo)(()=>{const t=new Map;for(const e of d){t.set(e.id,{id:e.id,name:e.name,icon:typeof e.icon==="function"?null:(0,_AppIcon.renderAppIcon)(e.icon,{slot:"dial",size:20,color:e.color}),iconComponent:typeof e.icon==="function"?e.icon:void 0,color:e.color??_sharedUi.buoyColors.primary,onPress:()=>{void(0,_dialUsageStore.recordToolUsage)(e.id);e?.onPress?.(I);if(e.launchMode!=="toggle-only"){const o=(0,_AppIcon.renderAppIcon)(e.icon,{slot:"dial",size:20,color:e.color});O({id:e.id,title:e.name,component:e.component,props:e.props,launchMode:e.launchMode??"self-modal",singleton:e.singleton??true,icon:o,color:e.color,modal:e.modal})}r?.()}})}return t},[d,I,O,r]);const[A,M]=(0,_react.useState)(()=>(0,_dialUsageStore.getRankedToolIds)(d.map(t=>t.id)));(0,_react.useEffect)(()=>{const t=d.map(o=>o.id);if((0,_dialUsageStore.isDialUsageLoaded)()){M((0,_dialUsageStore.getRankedToolIds)(t));return}let e=false;(0,_dialUsageStore.loadDialUsage)().then(()=>{if(!e)M((0,_dialUsageStore.getRankedToolIds)(t))});return()=>{e=true}},[d]);const h=Math.max(1,Math.ceil(A.length/_floatingToolsCore.MAX_DIAL_SLOTS));const[Y,Z]=(0,_react.useState)(0);const s=Math.min(Y,h-1);const w=(0,_react.useMemo)(()=>{return A.map(t=>E.get(t)).filter(t=>Boolean(t)).map((t,e)=>({icon:t,page:Math.floor(e/_floatingToolsCore.MAX_DIAL_SLOTS),slot:e%_floatingToolsCore.MAX_DIAL_SLOTS}))},[A,E]);const J=(0,_react.useMemo)(()=>{const t=w.filter(o=>o.page===s).length;const e=[];for(let o=t;o<_floatingToolsCore.MAX_DIAL_SLOTS;o+=1)e.push(o);return e},[w,s]);const P=t=>{const e=Math.max(0,Math.min(t,h-1));if(e!==s)Z(e)};(0,_react.useEffect)(()=>{const t=_floatingToolsCore.dialAnimationConfig??{entrance:{backdrop:{duration:400},dial:{scale:{damping:15,stiffness:150,mass:1},rotation:{duration:800}},centerButton:{delay:150,damping:10,stiffness:200},icons:{delay:200,duration:400},circuitTraces:{delay:600,duration:1e3}},continuous:{glitch:{interval:3e3,offset:2,stepDuration:50},pulse:{maxScale:1.02,minScale:.98,duration:1e3},floating:{maxY:-8,minY:0,duration:3e3},breathing:{maxScale:1.05,minScale:.98,duration:2500}}};const{entrance:e,continuous:o}=t;_reactNative.Animated.timing(S,{toValue:1,duration:e.backdrop.duration,useNativeDriver:true}).start();_reactNative.Animated.spring(c,{toValue:1,damping:e.dial.scale.damping,stiffness:e.dial.scale.stiffness,mass:e.dial.scale.mass,useNativeDriver:true}).start();_reactNative.Animated.sequence([_reactNative.Animated.timing(x,{toValue:1,duration:e.dial.rotation.duration,easing:_reactNative.Easing.out(_reactNative.Easing.cubic),useNativeDriver:true}),_reactNative.Animated.timing(x,{toValue:0,duration:0,useNativeDriver:true})]).start();_reactNative.Animated.sequence([_reactNative.Animated.delay(e.centerButton.delay),_reactNative.Animated.spring(u,{toValue:1,damping:e.centerButton.damping,stiffness:e.centerButton.stiffness,useNativeDriver:true})]).start();_reactNative.Animated.sequence([_reactNative.Animated.delay(e.icons.delay),_reactNative.Animated.timing(f,{toValue:1,duration:e.icons.duration,easing:_reactNative.Easing.out(_reactNative.Easing.cubic),useNativeDriver:true})]).start();if(!DIAL_IDLE_PULSE)return;g.current=_reactNative.Animated.loop(_reactNative.Animated.sequence([_reactNative.Animated.timing(v,{toValue:o.pulse.maxScale,duration:o.pulse.duration,easing:_reactNative.Easing.inOut(_reactNative.Easing.ease),useNativeDriver:true}),_reactNative.Animated.timing(v,{toValue:o.pulse.minScale,duration:o.pulse.duration,easing:_reactNative.Easing.inOut(_reactNative.Easing.ease),useNativeDriver:true})]));g.current.start();return()=>{g.current?.stop()}},[]);const F=()=>{y.current=true;L(false);_sharedUi.persistentStorage.setItem(ONBOARDING_STORAGE_KEY,"true").catch(t=>{console.warn("[Buoy]","Failed to save dial onboarding state:",t)})};const T=()=>{B.current=true;if(g.current){g.current.stop()}const t=_floatingToolsCore.dialAnimationConfig?.exit??{icons:{duration:300},centerButton:{duration:200},dialScale:{duration:250},backdrop:{duration:200}};_reactNative.Animated.sequence([_reactNative.Animated.timing(f,{toValue:0,duration:t.icons.duration,easing:_reactNative.Easing.in(_reactNative.Easing.cubic),useNativeDriver:true}),_reactNative.Animated.parallel([_reactNative.Animated.timing(u,{toValue:0,duration:t.centerButton.duration,easing:_reactNative.Easing.in(_reactNative.Easing.cubic),useNativeDriver:true}),_reactNative.Animated.timing(c,{toValue:0,duration:t.dialScale.duration,easing:_reactNative.Easing.in(_reactNative.Easing.cubic),useNativeDriver:true})]),_reactNative.Animated.timing(S,{toValue:0,duration:t.backdrop.duration,useNativeDriver:true})]).start(()=>{if(r){setTimeout(()=>{r()},0)}})};(0,_hardwareBack.useHardwareBack)(true,()=>{if(B.current)return true;if(n){l(false);R();return true}T();return true});const N=t=>{U(1);const e=_floatingToolsCore.dialAnimationConfig?.interaction??{iconSelect:{pulse:[{scale:.9,damping:15,stiffness:500},{scale:1,damping:10,stiffness:200}],actionDelay:50}};const[o,p]=e.iconSelect.pulse;_reactNative.Animated.sequence([_reactNative.Animated.spring(u,{toValue:o.scale,damping:o.damping,stiffness:o.stiffness,useNativeDriver:true}),_reactNative.Animated.spring(u,{toValue:p.scale,damping:p.damping,stiffness:p.stiffness,useNativeDriver:true})]).start();setTimeout(()=>{t.onPress();if(t.id!=="wifi"){T()}},e.iconSelect.actionDelay)};const Q={opacity:S};const ee={transform:[{scale:u}]};const te={transform:[{scale:G>=0?1:v}]};return(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.container,nativeID:"dial-devtools-root",children:[(0,_jsxRuntime.jsx)(_reactNative.Animated.View,{style:[styles.backdrop,Q],children:(0,_jsxRuntime.jsx)(_reactNative.Pressable,{style:_sharedUi.absoluteFill,onPress:T})}),d.length===0&&C?(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[styles.emptyNote,{bottom:80+i+16}],accessibilityLiveRegion:"polite",testID:"buoy-dial-empty-note",children:C}):null,(0,_jsxRuntime.jsxs)(_reactNative.Animated.View,{style:[styles.parent,a.parent,{position:"absolute",left:(b-i)/2,bottom:80,transform:[{scale:c},{rotate:x.interpolate({inputRange:[0,1],outputRange:["0deg","360deg"]})}]}],children:[(0,_jsxRuntime.jsxs)(_reactNative.Animated.View,{style:[styles.circle,a.circle],children:[(0,_jsxRuntime.jsxs)(_reactNative.View,{style:[styles.gradientBackground,a.rounded],children:[(0,_jsxRuntime.jsx)(_reactNative.View,{style:[styles.gradientLayer1,a.rounded]}),(0,_jsxRuntime.jsx)(_reactNative.View,{style:[styles.gradientLayer2,a.rounded]}),(0,_jsxRuntime.jsx)(_reactNative.View,{style:[styles.gradientLayer3,a.rounded]}),(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.gridPattern,children:Array.from({length:6}).map((t,e)=>(0,_jsxRuntime.jsxs)(_reactNative.View,{style:[styles.gridLine,a.gridLine,{transform:[{rotate:`${e*60}deg`}]}],children:[(0,_jsxRuntime.jsx)(_reactNative.View,{style:[styles.spoke,a.spoke,styles.spokeLeft]}),(0,_jsxRuntime.jsx)(_reactNative.View,{style:[styles.spoke,a.spoke,styles.spokeRight]})]},e))}),$==="hyperspace"?(0,_jsxRuntime.jsx)(_DialHyperspace.DialHyperspace,{size:i}):(0,_jsxRuntime.jsx)(_sharedUi.ToolBackground,{focus:DIAL_BACKGROUND_FOCUS})]}),w.filter(({page:t})=>t===s).map(({icon:t,slot:e})=>(0,_jsxRuntime.jsx)(_DialIcon.DialIcon,{onPress:N,iconsProgress:f,icon:t,index:e,totalIcons:_floatingToolsCore.MAX_DIAL_SLOTS,active:true},`${t.id??"icon"}:${s}:${e}`)),J.map(t=>(0,_jsxRuntime.jsx)(_DialIcon.DialIcon,{onPress:N,iconsProgress:f,icon:createEmptySlot(t),index:t,totalIcons:_floatingToolsCore.MAX_DIAL_SLOTS,active:true},`empty-${t}`))]}),(0,_jsxRuntime.jsx)(_reactNative.Animated.View,{style:[styles.buttonContainer,ee],children:(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.buttonGradient,children:[(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.buttonGradientLayer1}),(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.buttonGradientLayer2}),(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.buttonGradientLayer3}),(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.buttonBorder,children:(0,_jsxRuntime.jsx)(_reactNative.Animated.View,{style:[styles.button,te],children:(0,_jsxRuntime.jsx)(_reactNative.TouchableOpacity,{accessibilityRole:"button",accessibilityLabel:n?"Close Settings":"Open Dev Tools Settings",onPress:K,activeOpacity:.5,style:styles.buttonPressable,children:n?(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[styles.centerText,styles.closeTextTop],children:"CLOSE"}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[styles.centerText,styles.closeTextBottom],children:"SETTINGS"})]}):(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.centerText,children:"BUOY"}),H&&(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[styles.proText,V&&styles.weekendText],children:V?"WEEKEND":"PRO"})]})})})})]})})]}),h>1&&(0,_jsxRuntime.jsx)(_DialPagination.DialPagination,{page:s,pageCount:h,onPrev:()=>P(s-1),onNext:()=>P(s+1),animatedStyle:{position:"absolute",left:(b-i)/2,top:W-80+16,width:i,opacity:c,transform:[{scale:c}]}}),n&&(0,_jsxRuntime.jsx)(_DevToolsSettingsModal.DevToolsSettingsModal,{visible:true,onClose:()=>{l(false);R()},availableApps:X}),k&&!n&&!y.current&&(0,_jsxRuntime.jsx)(_OnboardingTooltip.OnboardingTooltip,{visible:true,onDismiss:F})]})};exports.DialDevTools=DialDevTools;const styles=_reactNative.StyleSheet.create({container:{..._sharedUi.absoluteFill,zIndex:9999},backdrop:{..._sharedUi.absoluteFill,backgroundColor:_floatingToolsCore.dialColors.dialBackdrop},parent:{alignItems:"center",justifyContent:"center"},circle:{position:"absolute",backgroundColor:"transparent",borderWidth:1,borderColor:_floatingToolsCore.dialColors.dialBorder,shadowColor:_floatingToolsCore.dialColors.dialShadow,shadowOffset:{width:0,height:0},shadowOpacity:.5,shadowRadius:20,elevation:10},gradientBackground:{width:"100%",height:"100%",position:"relative",backgroundColor:_floatingToolsCore.dialColors.dialBackground,overflow:"hidden"},gradientLayer1:{..._sharedUi.absoluteFill,backgroundColor:_floatingToolsCore.dialColors.dialGradient1,opacity:.6},gradientLayer2:{..._sharedUi.absoluteFill,backgroundColor:_floatingToolsCore.dialColors.dialGradient2,opacity:.4,top:"30%",left:"30%"},gradientLayer3:{..._sharedUi.absoluteFill,backgroundColor:_floatingToolsCore.dialColors.dialGradient3,opacity:.3,top:"50%",left:"50%"},gridPattern:{..._sharedUi.absoluteFill,alignItems:"center",justifyContent:"center"},gridLine:{position:"absolute",height:1},spoke:{position:"absolute",top:0,height:1,backgroundColor:_floatingToolsCore.dialColors.dialGridLine},spokeLeft:{left:0},spokeRight:{right:0},buttonContainer:{zIndex:1,backgroundColor:"transparent",alignItems:"center",justifyContent:"center",position:"absolute",width:BUTTON_SIZE*1.5,height:BUTTON_SIZE*1.5,borderRadius:BUTTON_SIZE},buttonGradient:{width:"100%",height:"100%",borderRadius:BUTTON_SIZE,alignItems:"center",justifyContent:"center",padding:4,backgroundColor:_floatingToolsCore.dialColors.hubHalo,position:"relative",overflow:"hidden"},buttonGradientLayer1:{..._sharedUi.absoluteFill,backgroundColor:_floatingToolsCore.dialColors.dialGradient1,opacity:.5,borderRadius:BUTTON_SIZE},buttonGradientLayer2:{..._sharedUi.absoluteFill,backgroundColor:_floatingToolsCore.dialColors.dialGradient2,opacity:.3,top:"20%",left:"20%",borderRadius:BUTTON_SIZE},buttonGradientLayer3:{..._sharedUi.absoluteFill,backgroundColor:_floatingToolsCore.dialColors.dialGradient3,opacity:.2,top:"40%",left:"40%",borderRadius:BUTTON_SIZE},buttonBorder:{backgroundColor:_floatingToolsCore.dialColors.hubFill,alignItems:"center",justifyContent:"center",width:BUTTON_SIZE*1.2,height:BUTTON_SIZE*1.2,borderRadius:BUTTON_SIZE*.6},button:{width:BUTTON_SIZE,height:BUTTON_SIZE,borderRadius:BUTTON_SIZE/2,justifyContent:"center",alignItems:"center",position:"relative",overflow:"hidden"},buttonPressable:{width:"100%",height:"100%",justifyContent:"center",alignItems:"center"},centerText:{color:_floatingToolsCore.dialColors.centerText,fontSize:10,fontWeight:"900",fontFamily:_sharedUi.monoFont,letterSpacing:1,textAlign:"center",textTransform:"uppercase",textShadowColor:_floatingToolsCore.dialColors.centerTextGlow,textShadowOffset:{width:0,height:0},textShadowRadius:4},closeTextTop:{marginBottom:-2},emptyNote:{position:"absolute",left:16,right:16,color:_floatingToolsCore.dialColors.iconLabel,fontSize:12,fontFamily:_sharedUi.monoFont,textAlign:"center"},closeTextBottom:{marginTop:-2},proText:{color:_sharedUi.buoyColors.warning,fontSize:8,fontWeight:"900",fontFamily:_sharedUi.monoFont,letterSpacing:2,textAlign:"center",textShadowColor:_floatingToolsCore.dialColors.centerTextGlow,textShadowOffset:{width:0,height:0},textShadowRadius:4},weekendText:{color:"#BF5AF2",letterSpacing:1}});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.DialMenu=DialMenu;var _react=require("react");var _dialA11y=require("./dialA11y.js");var _floatingToolsReact=require("@buoy-gg/floating-tools-react");var _sharedUi=require("@buoy-gg/shared-ui");var _DialHyperspace=require("./DialHyperspace.js");var _OnboardingTooltipWeb=require("./OnboardingTooltip.web.js");var _jsxRuntime=require("react/jsx-runtime");const DIAL_BACKGROUND_FOCUS={x:.5,y:.5};const SETTINGS_TOOLTIP_KEY="@react_buoy_settings_tooltip_shown";let keyframesInjected=false;function injectKeyframes(){if(keyframesInjected||typeof document==="undefined")return;const t=document.createElement("style");t.textContent=(0,_floatingToolsReact.getDialCSSKeyframesString)();document.head.appendChild(t);keyframesInjected=true}const easeOutCubic=t=>1-Math.pow(1-t,3);const easeInCubic=t=>t*t*t;function DialIconItem({icon:t,index:c,totalIcons:j,position:p,progress:r,onPress:y}){const[x,k]=(0,_react.useState)(false);const[F,S]=(0,_react.useState)(false);const m=!t.icon&&t.id.startsWith("empty-");const T=!m&&t.unavailable===true;const C=!m&&!T;const{icons:W}=_floatingToolsReact.dialAnimationConfig;const w=(0,_floatingToolsReact.getIconStaggerInputRange)(c,j);let s=0;if(r<=w[1]){s=0}else if(r<=w[2]){s=(r-w[1])/(w[2]-w[1])}else{s=1}s=Math.max(0,Math.min(1,s));const D=_floatingToolsReact.DIAL_ICON_SIZE;const I=W.pressIn.scale;const H=1.1;const M=s*(F?I:x?H:1);let A=0;if(s<=0){A=0}else if(s<=.3){A=s}else{A=.3+(s-.3)*(.7/.7)}const O=p.x*(s-1);const U=p.y*(s-1);return(0,_jsxRuntime.jsx)("button",{role:"menuitem","aria-label":m?"Empty slot":(0,_dialA11y.dialAccessibilityLabel)(t.id,t.name),"data-testid":t.id?`buoy-dial-${t.id}`:void 0,"aria-disabled":!C,tabIndex:C?0:-1,onClick:C?y:void 0,onPointerEnter:K=>C&&K.pointerType==="mouse"&&k(true),onPointerLeave:()=>{k(false);S(false)},onPointerDown:()=>C&&S(true),onPointerUp:()=>S(false),onPointerCancel:()=>S(false),style:{position:"absolute",left:`calc(50% + ${p.x}px)`,top:`calc(50% + ${p.y}px)`,width:D,height:D,marginLeft:-D/2,marginTop:-D/2,cursor:C?"pointer":"default",background:"none",border:"none",padding:0},children:(0,_jsxRuntime.jsx)("span",{style:{position:"absolute",inset:0,display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",transform:`translate(${O}px, ${U}px) scale(${M})`,opacity:A,transition:x||F?"transform 100ms ease":"none"},children:m?(0,_jsxRuntime.jsx)("div",{style:{width:_floatingToolsReact.dialStyles.emptySlot.dotSize,height:_floatingToolsReact.dialStyles.emptySlot.dotSize,borderRadius:_floatingToolsReact.dialStyles.emptySlot.dotSize/2,backgroundColor:_floatingToolsReact.dialColors.emptyDotBackground,border:`${_floatingToolsReact.dialStyles.emptySlot.borderWidth}px solid ${_floatingToolsReact.dialColors.emptyDotBorder}`}}):(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[(0,_jsxRuntime.jsx)("div",{style:{position:"absolute",width:`${_floatingToolsReact.dialStyles.icon.gradientBgSizePercent}%`,height:`${_floatingToolsReact.dialStyles.icon.gradientBgSizePercent}%`,borderRadius:_floatingToolsReact.dialStyles.icon.gradientBgBorderRadius,backgroundColor:"rgba(0, 0, 0, 0.2)",opacity:_floatingToolsReact.dialStyles.icon.gradientBgOpacity}}),(0,_jsxRuntime.jsx)("div",{style:{position:"absolute",width:`${_floatingToolsReact.dialStyles.icon.innerGlowSizePercent}%`,height:`${_floatingToolsReact.dialStyles.icon.innerGlowSizePercent}%`,borderRadius:_floatingToolsReact.dialStyles.icon.innerGlowBorderRadius,backgroundColor:"rgba(255, 255, 255, 0.02)",opacity:_floatingToolsReact.dialStyles.icon.innerGlowOpacity}}),(0,_jsxRuntime.jsx)("div",{style:{marginBottom:_floatingToolsReact.dialStyles.icon.wrapperMarginBottom,display:"flex",alignItems:"center",justifyContent:"center",fontSize:32,filter:x?"brightness(1.2)":"none"},children:t.icon}),(0,_jsxRuntime.jsx)("span",{style:{fontSize:t.name.length>8?Math.max(_floatingToolsReact.dialStyles.icon.label.fontSize*.7,_floatingToolsReact.dialStyles.icon.label.fontSize*8/t.name.length):_floatingToolsReact.dialStyles.icon.label.fontSize,fontWeight:_floatingToolsReact.dialStyles.icon.label.fontWeight,fontFamily:_floatingToolsReact.dialStyles.icon.label.fontFamily,color:_floatingToolsReact.dialColors.iconLabel,letterSpacing:_floatingToolsReact.dialStyles.icon.label.letterSpacing,marginTop:_floatingToolsReact.dialStyles.icon.label.marginTop,textTransform:"uppercase",whiteSpace:"nowrap"},children:t.name}),T&&(0,_jsxRuntime.jsx)("span",{style:{fontSize:_floatingToolsReact.dialStyles.icon.label.fontSize-1,fontWeight:_floatingToolsReact.dialStyles.icon.label.fontWeight,fontFamily:_floatingToolsReact.dialStyles.icon.label.fontFamily,letterSpacing:_floatingToolsReact.dialStyles.icon.label.letterSpacing,color:_floatingToolsReact.floatingToolsColors.muted,textTransform:"uppercase",whiteSpace:"nowrap"},children:"Unavailable"})]})})})}function PagerChevron({side:t,color:c}){const j=t==="prev"?[[15,18,9,12],[9,12,15,6]]:[[9,18,15,12],[15,12,9,6]];return(0,_jsxRuntime.jsx)("svg",{width:18,height:18,viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",children:j.map(([p,r,y,x],k)=>(0,_jsxRuntime.jsx)("line",{x1:p,y1:r,x2:y,y2:x,stroke:c,strokeWidth:2},k))})}function PagerButton({side:t,disabled:c,onClick:j}){const[p,r]=(0,_react.useState)(false);const y=c?_floatingToolsReact.dialColors.emptyDotBorder:_floatingToolsReact.dialColors.accent;return(0,_jsxRuntime.jsxs)("button",{type:"button","aria-label":`${t==="prev"?"Previous":"Next"} dial page`,"data-testid":`buoy-dial-${t}`,disabled:c,onClick:j,onPointerDown:()=>!c&&r(true),onPointerUp:()=>r(false),onPointerLeave:()=>r(false),onPointerCancel:()=>r(false),style:{display:"flex",alignItems:"center",gap:4,padding:"10px 16px",borderRadius:10,border:`1px solid ${_floatingToolsReact.dialColors.dialBorder}`,backgroundColor:_floatingToolsReact.dialColors.dialBackground,color:c?_floatingToolsReact.dialColors.iconLabelMuted:_floatingToolsReact.dialColors.centerText,fontSize:12,fontWeight:900,fontFamily:_sharedUi.monoFont,letterSpacing:1.5,textTransform:"uppercase",cursor:c?"default":"pointer",opacity:c?.4:1,boxShadow:c?"none":`0 0 8px ${(0,_floatingToolsReact.withAlpha)(_floatingToolsReact.dialColors.dialShadow,.4)}`,transform:p?"scale(0.92)":"scale(1)",transition:"transform 100ms ease"},children:[t==="prev"&&(0,_jsxRuntime.jsx)(PagerChevron,{side:"prev",color:y}),t==="prev"?"PREV":"NEXT",t==="next"&&(0,_jsxRuntime.jsx)(PagerChevron,{side:"next",color:y})]})}function DialMenu({icons:t,onClose:c,centerLabel:j="MENU",onCenterPress:p,settingsOpen:r=false,hintsDisabled:y=false,emptyNote:x}){const{id:k}=(0,_sharedUi.useToolBackground)();const[F,S]=(0,_react.useState)(0);const[m,T]=(0,_react.useState)(0);const[C,W]=(0,_react.useState)(0);const[w,s]=(0,_react.useState)(0);const[D,I]=(0,_react.useState)(0);const[H,M]=(0,_react.useState)(1);const[A,O]=(0,_react.useState)(false);const[U,K]=(0,_react.useState)(false);const[ie,ae]=(0,_react.useState)(false);const N=(0,_react.useRef)(null);const Q=(0,_react.useRef)(null);const g=(0,_react.useRef)(null);const q=(0,_react.useRef)(false);const{entrance:E,exit:L,interaction:$}=_floatingToolsReact.dialAnimationConfig;const re=(0,_floatingToolsReact.getDialCSSAnimationStyles)();const[X,se]=(0,_react.useState)(()=>({width:window.innerWidth,height:window.innerHeight}));(0,_react.useEffect)(()=>{const o=()=>se({width:window.innerWidth,height:window.innerHeight});window.addEventListener("resize",o);return()=>window.removeEventListener("resize",o)},[]);const n=(0,_react.useMemo)(()=>(0,_floatingToolsReact.getDialLayout)({screenWidth:X.width,maxCircleSize:Math.max(120,Math.min(320,X.height-96))}),[X]);const le=(0,_react.useMemo)(()=>(0,_floatingToolsReact.getGridLineRotations)(),[]);const ce=(0,_react.useMemo)(()=>(0,_floatingToolsReact.getAllIconPositions)(_floatingToolsReact.MAX_DIAL_SLOTS,n.iconRadius),[n.iconRadius]);const[de,ue]=(0,_react.useState)(0);const R=Math.max(1,Math.ceil(t.length/_floatingToolsReact.MAX_DIAL_SLOTS));const h=Math.min(de,R-1);const ee=(0,_react.useMemo)(()=>{const o=h*_floatingToolsReact.MAX_DIAL_SLOTS;const e=[...t.slice(o,o+_floatingToolsReact.MAX_DIAL_SLOTS)];while(e.length<_floatingToolsReact.MAX_DIAL_SLOTS){e.push({id:`empty-${e.length}`,name:"",icon:null,onPress:()=>{}})}return e},[t,h]);(0,_react.useEffect)(()=>{injectKeyframes()},[]);(0,_react.useEffect)(()=>{const o=E.backdrop.duration;const e=E.dial.rotation.duration;const d=E.centerButton.delay;const a=E.icons.delay;const l=E.icons.duration;const u=performance.now();const f=v=>{const i=v-u;S(Math.min(1,i/o));const b=Math.min(1,i/400);let P=easeOutCubic(b)*1.1;if(b>.7){P-=(b-.7)*.33}if(b>=1)P=1;T(Math.max(0,Math.min(1.05,P)));const z=Math.min(1,i/e);W(easeOutCubic(z)*360);if(i>=d){const B=Math.min(1,(i-d)/300);let J=easeOutCubic(B)*1.15;if(B>.6){J-=(B-.6)*.375}if(B>=1)J=1;s(Math.max(0,Math.min(1.05,J)))}if(i>=a){const B=Math.min(1,(i-a)/l);I(easeOutCubic(B))}const Z=a+l;if(i<Z){g.current=requestAnimationFrame(f)}else{S(1);T(1);W(360);s(1);I(1);ae(true)}};g.current=requestAnimationFrame(f);return()=>{if(g.current)cancelAnimationFrame(g.current)}},[]);const _=(0,_react.useCallback)(()=>{if(q.current)return;q.current=true;K(true);if(g.current){cancelAnimationFrame(g.current)}const o=performance.now();const e=L.icons.duration;const d=L.centerButton.duration;const a=L.dialScale.duration;const l=Math.max(d,a);const u=L.backdrop.duration;const f=v=>{const i=v-o;if(i<e){const z=easeInCubic(i/e);I(1-z);g.current=requestAnimationFrame(f);return}const b=e;if(i<b+l){I(0);const z=Math.min(1,(i-b)/d);const Z=Math.min(1,(i-b)/a);s(1-easeInCubic(z));T(1-easeInCubic(Z));g.current=requestAnimationFrame(f);return}const P=b+l;if(i<P+u){T(0);s(0);const z=(i-P)/u;S(1-z);g.current=requestAnimationFrame(f);return}S(0);c()};g.current=requestAnimationFrame(f)},[L,c]);(0,_react.useEffect)(()=>{const o=document.activeElement;const e=N.current;return()=>{if(o?.isConnected&&(document.activeElement===document.body||e?.contains(document.activeElement))){o.focus()}}},[]);(0,_react.useEffect)(()=>{if(r)return;Q.current?.focus();const o=e=>{const d=N.current;if(!d)return;if(e.key==="Escape"){e.preventDefault();_()}else if(e.key==="Tab"){const a=Array.from(d.querySelectorAll('button:not(:disabled):not([aria-disabled="true"]), [tabindex="0"]')).filter(f=>f.getClientRects().length>0);const l=a[0];const u=a[a.length-1];if(!d.contains(document.activeElement)||(e.shiftKey?document.activeElement===l:document.activeElement===u)){e.preventDefault();(e.shiftKey?u:l)?.focus()}}else if(["ArrowRight","ArrowDown","ArrowLeft","ArrowUp","Home","End"].includes(e.key)){const a=Array.from(d.querySelectorAll('[role="menuitem"]:not([aria-disabled="true"])'));const l=a.indexOf(document.activeElement);if(l<0||!a.length)return;e.preventDefault();const u=e.key==="Home"?0:e.key==="End"?a.length-1:(l+(e.key==="ArrowRight"||e.key==="ArrowDown"?1:-1)+a.length)%a.length;a[u].focus()}};document.addEventListener("keydown",o);return()=>document.removeEventListener("keydown",o)},[_,r]);const[V,te]=(0,_react.useState)(false);(0,_react.useEffect)(()=>{if(y)return;let o=false;const e=setTimeout(async()=>{const d=await _sharedUi.persistentStorage.getItem(SETTINGS_TOOLTIP_KEY);if(!o&&!d)te(true)},1200);return()=>{o=true;clearTimeout(e)}},[y]);const Y=(0,_react.useCallback)(()=>{te(false);void _sharedUi.persistentStorage.setItem(SETTINGS_TOOLTIP_KEY,"true")},[]);(0,_react.useEffect)(()=>{if(r&&V){Y()}},[r,V,Y]);const pe=(0,_react.useCallback)(o=>{if(o.id.startsWith("empty-")||q.current)return;const[e,d]=$.iconSelect.pulse;const a=performance.now();const l=150;const u=f=>{const v=f-a;if(v<l){const i=easeOutCubic(v/l);M(1-(1-e.scale)*i);requestAnimationFrame(u)}else if(v<l*2){const i=easeOutCubic((v-l)/l);M(e.scale+(d.scale-e.scale)*i);requestAnimationFrame(u)}else{M(1)}};requestAnimationFrame(u);setTimeout(()=>{o.onPress();_()},$.iconSelect.actionDelay)},[$.iconSelect,_]);const oe=(0,_react.useCallback)(o=>{if(q.current)return;const e=Math.max(0,Math.min(o,R-1));if(e!==h)ue(e)},[R,h]);const G=n.buttonSize*_floatingToolsReact.dialStyles.centerButton.containerRatio;const ne=n.buttonSize*_floatingToolsReact.dialStyles.centerButton.borderRatio;const fe=n.buttonSize*_floatingToolsReact.dialStyles.centerButton.containerRatio/2+6;const me=ie&&!U;return(0,_jsxRuntime.jsxs)("div",{ref:N,role:"dialog","aria-label":"Dial Menu","aria-modal":"true",style:{position:"fixed",inset:0,zIndex:1e4},children:[(0,_jsxRuntime.jsx)("button",{type:"button","aria-label":"Close dial menu",tabIndex:0,onClick:_,style:{position:"absolute",inset:0,border:0,padding:0,backgroundColor:_floatingToolsReact.dialColors.dialBackdrop,opacity:F}}),x?(0,_jsxRuntime.jsx)("div",{role:"status","data-testid":"buoy-dial-empty-note",style:{position:"absolute",left:16,right:16,bottom:80+n.circleSize+16,color:_floatingToolsReact.dialColors.iconLabel,fontSize:12,fontFamily:_sharedUi.monoFont,textAlign:"center",opacity:m>.01?1:0},children:x}):null,(0,_jsxRuntime.jsxs)("div",{style:{position:"absolute",left:"50%",marginLeft:-n.circleSize/2,bottom:80,width:n.circleSize,height:n.circleSize,borderRadius:"50%",backgroundColor:_floatingToolsReact.dialColors.dialBackground,border:`${_floatingToolsReact.dialStyles.circle.borderWidth}px solid ${_floatingToolsReact.dialColors.dialBorder}`,boxShadow:`0 0 ${_floatingToolsReact.dialStyles.circle.shadowRadius}px ${(0,_floatingToolsReact.withAlpha)(_floatingToolsReact.dialColors.dialShadow,_floatingToolsReact.dialStyles.circle.shadowOpacity)}`,transform:`scale(${m}) rotate(${C}deg)`,opacity:m>.01?1:0,overflow:"hidden"},children:[(0,_jsxRuntime.jsx)("div",{style:{position:"absolute",inset:0,borderRadius:"50%",backgroundColor:_floatingToolsReact.dialColors.dialGradient1,opacity:_floatingToolsReact.dialStyles.gradientLayers[0].opacity}}),(0,_jsxRuntime.jsx)("div",{style:{position:"absolute",inset:0,top:"30%",left:"30%",borderRadius:"50%",backgroundColor:_floatingToolsReact.dialColors.dialGradient2,opacity:_floatingToolsReact.dialStyles.gradientLayers[1].opacity}}),(0,_jsxRuntime.jsx)("div",{style:{position:"absolute",inset:0,top:"50%",left:"50%",borderRadius:"50%",backgroundColor:_floatingToolsReact.dialColors.dialGradient3,opacity:_floatingToolsReact.dialStyles.gradientLayers[2].opacity}}),le.map(o=>(0,_jsxRuntime.jsx)("div",{style:{position:"absolute",top:"50%",left:0,right:0,height:_floatingToolsReact.dialStyles.grid.lineHeight,transform:`rotate(${o}deg)`,transformOrigin:"center"},children:["left","right"].map(e=>(0,_jsxRuntime.jsx)("div",{style:{position:"absolute",top:0,[e]:0,width:`calc(50% - ${fe}px)`,height:_floatingToolsReact.dialStyles.grid.lineHeight,backgroundColor:_floatingToolsReact.dialColors.dialGridLine}},e))},o)),(0,_jsxRuntime.jsx)("div",{"data-testid":"dial-background","data-background":k,style:{position:"absolute",inset:0,pointerEvents:"none"},children:k==="hyperspace"?(0,_jsxRuntime.jsx)(_DialHyperspace.DialHyperspace,{size:n.circleSize}):(0,_jsxRuntime.jsx)(_sharedUi.ToolBackground,{focus:DIAL_BACKGROUND_FOCUS})}),ee.map((o,e)=>(0,_jsxRuntime.jsx)(DialIconItem,{icon:o,index:e,totalIcons:ee.length,position:ce[e],progress:D,onPress:()=>pe(o)},e)),(0,_jsxRuntime.jsxs)("div",{style:{position:"absolute",left:"50%",top:"50%",width:G,height:G,marginLeft:-G/2,marginTop:-G/2,display:"flex",alignItems:"center",justifyContent:"center",backgroundColor:_floatingToolsReact.dialColors.hubHalo,borderRadius:n.buttonSize,overflow:"hidden",transform:`scale(${w*H})`,opacity:w>.01?1:0},children:[(0,_jsxRuntime.jsx)("div",{style:{position:"absolute",inset:0,backgroundColor:_floatingToolsReact.dialColors.dialGradient1,opacity:.5,borderRadius:n.buttonSize}}),(0,_jsxRuntime.jsx)("div",{style:{position:"absolute",inset:0,top:"20%",left:"20%",backgroundColor:_floatingToolsReact.dialColors.dialGradient2,opacity:.3,borderRadius:n.buttonSize}}),(0,_jsxRuntime.jsx)("div",{style:{position:"absolute",inset:0,top:"40%",left:"40%",backgroundColor:_floatingToolsReact.dialColors.dialGradient3,opacity:.2,borderRadius:n.buttonSize}}),(0,_jsxRuntime.jsx)("div",{style:{width:ne,height:ne,borderRadius:n.buttonSize*_floatingToolsReact.dialStyles.centerButton.borderRadiusRatio,backgroundColor:_floatingToolsReact.dialColors.hubFill,display:"flex",alignItems:"center",justifyContent:"center"},children:(0,_jsxRuntime.jsx)("button",{ref:Q,type:"button","aria-label":r?"Close Settings":"Open Dev Tools Settings",disabled:!p,onClick:p,onPointerEnter:o=>o.pointerType==="mouse"&&O(true),onPointerLeave:()=>O(false),style:{border:0,padding:0,background:"transparent",width:n.buttonSize,height:n.buttonSize,borderRadius:n.buttonSize/2,display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",cursor:p?"pointer":"default",transform:A?`scale(${$.centerHover.scale})`:"scale(1)",transition:`transform ${$.centerHover.duration}ms ease`,animation:me&&!A?re.pulse:"none"},children:r?(0,_jsxRuntime.jsxs)("span",{style:{display:"flex",flexDirection:"column",alignItems:"center",fontSize:_floatingToolsReact.dialStyles.centerButton.text.fontSize-2,fontWeight:_floatingToolsReact.dialStyles.centerButton.text.fontWeight,fontFamily:_floatingToolsReact.dialStyles.centerButton.text.fontFamily,color:_floatingToolsReact.dialColors.centerText,letterSpacing:_floatingToolsReact.dialStyles.centerButton.text.letterSpacing,textAlign:"center",textShadow:`0 0 4px ${_floatingToolsReact.dialColors.centerTextGlow}`,textTransform:"uppercase",lineHeight:1.2},children:[(0,_jsxRuntime.jsx)("span",{style:{marginBottom:-2},children:"CLOSE"}),(0,_jsxRuntime.jsx)("span",{style:{marginTop:-2},children:"SETTINGS"})]}):(0,_jsxRuntime.jsx)("span",{style:{fontSize:_floatingToolsReact.dialStyles.centerButton.text.fontSize,fontWeight:_floatingToolsReact.dialStyles.centerButton.text.fontWeight,fontFamily:_floatingToolsReact.dialStyles.centerButton.text.fontFamily,color:_floatingToolsReact.dialColors.centerText,letterSpacing:_floatingToolsReact.dialStyles.centerButton.text.letterSpacing,textAlign:"center",textShadow:`0 0 4px ${_floatingToolsReact.dialColors.centerTextGlow}`,textTransform:"uppercase"},children:j})})})]})]}),R>1&&(0,_jsxRuntime.jsxs)("div",{style:{position:"absolute",left:"50%",marginLeft:-n.circleSize/2,top:"calc(100% - 64px)",width:n.circleSize,display:"flex",alignItems:"center",justifyContent:"space-between",opacity:Math.min(1,m),transform:`scale(${Math.min(1,m)})`},children:[(0,_jsxRuntime.jsx)(PagerButton,{side:"prev",disabled:h<=0,onClick:()=>oe(h-1)}),(0,_jsxRuntime.jsxs)("span",{"data-testid":"buoy-dial-page",style:{padding:"6px 12px",fontSize:13,fontWeight:900,fontFamily:_sharedUi.monoFont,letterSpacing:2,color:_floatingToolsReact.dialColors.centerText,textShadow:`0 0 6px ${_floatingToolsReact.dialColors.centerTextGlow}`},children:[String(h+1).padStart(2,"0"),(0,_jsxRuntime.jsxs)("span",{style:{color:_floatingToolsReact.dialColors.iconLabelMuted,textShadow:"none"},children:[" / ",String(R).padStart(2,"0")]})]}),(0,_jsxRuntime.jsx)(PagerButton,{side:"next",disabled:h>=R-1,onClick:()=>oe(h+1)})]}),V&&!r&&(0,_jsxRuntime.jsx)(_OnboardingTooltipWeb.OnboardingTooltip,{title:"Welcome to Buoy!",message:"Tap the center button to configure and add tools to your dial menu.",onDismiss:Y,showArrow:false})]})}
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.DialMenu=DialMenu;var _react=require("react");var _dialA11y=require("./dialA11y.js");var _floatingToolsReact=require("@buoy-gg/floating-tools-react");var _sharedUi=require("@buoy-gg/shared-ui");var _DialHyperspace=require("./DialHyperspace.js");var _OnboardingTooltipWeb=require("./OnboardingTooltip.web.js");var _capacitorBackButton=require("../capacitorBackButton.js");var _jsxRuntime=require("react/jsx-runtime");const DIAL_BACKGROUND_FOCUS={x:.5,y:.5};const SETTINGS_TOOLTIP_KEY="@react_buoy_settings_tooltip_shown";let keyframesInjected=false;function injectKeyframes(){if(keyframesInjected||typeof document==="undefined")return;const t=document.createElement("style");t.textContent=(0,_floatingToolsReact.getDialCSSKeyframesString)();document.head.appendChild(t);keyframesInjected=true}const easeOutCubic=t=>1-Math.pow(1-t,3);const easeInCubic=t=>t*t*t;function DialIconItem({icon:t,index:c,totalIcons:j,position:u,progress:a,onPress:g}){const[x,k]=(0,_react.useState)(false);const[O,S]=(0,_react.useState)(false);const m=!t.icon&&t.id.startsWith("empty-");const T=!m&&t.unavailable===true;const C=!m&&!T;const{icons:W}=_floatingToolsReact.dialAnimationConfig;const w=(0,_floatingToolsReact.getIconStaggerInputRange)(c,j);let s=0;if(a<=w[1]){s=0}else if(a<=w[2]){s=(a-w[1])/(w[2]-w[1])}else{s=1}s=Math.max(0,Math.min(1,s));const z=_floatingToolsReact.DIAL_ICON_SIZE;const D=W.pressIn.scale;const H=1.1;const E=s*(O?D:x?H:1);let A=0;if(s<=0){A=0}else if(s<=.3){A=s}else{A=.3+(s-.3)*(.7/.7)}const q=u.x*(s-1);const U=u.y*(s-1);return(0,_jsxRuntime.jsx)("button",{role:"menuitem","aria-label":m?"Empty slot":(0,_dialA11y.dialAccessibilityLabel)(t.id,t.name),"data-testid":t.id?`buoy-dial-${t.id}`:void 0,"aria-disabled":!C,tabIndex:C?0:-1,onClick:C?g:void 0,onPointerEnter:K=>C&&K.pointerType==="mouse"&&k(true),onPointerLeave:()=>{k(false);S(false)},onPointerDown:()=>C&&S(true),onPointerUp:()=>S(false),onPointerCancel:()=>S(false),style:{position:"absolute",left:`calc(50% + ${u.x}px)`,top:`calc(50% + ${u.y}px)`,width:z,height:z,marginLeft:-z/2,marginTop:-z/2,cursor:C?"pointer":"default",background:"none",border:"none",padding:0},children:(0,_jsxRuntime.jsx)("span",{style:{position:"absolute",inset:0,display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",transform:`translate(${q}px, ${U}px) scale(${E})`,opacity:A,transition:x||O?"transform 100ms ease":"none"},children:m?(0,_jsxRuntime.jsx)("div",{style:{width:_floatingToolsReact.dialStyles.emptySlot.dotSize,height:_floatingToolsReact.dialStyles.emptySlot.dotSize,borderRadius:_floatingToolsReact.dialStyles.emptySlot.dotSize/2,backgroundColor:_floatingToolsReact.dialColors.emptyDotBackground,border:`${_floatingToolsReact.dialStyles.emptySlot.borderWidth}px solid ${_floatingToolsReact.dialColors.emptyDotBorder}`}}):(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[(0,_jsxRuntime.jsx)("div",{style:{position:"absolute",width:`${_floatingToolsReact.dialStyles.icon.gradientBgSizePercent}%`,height:`${_floatingToolsReact.dialStyles.icon.gradientBgSizePercent}%`,borderRadius:_floatingToolsReact.dialStyles.icon.gradientBgBorderRadius,backgroundColor:"rgba(0, 0, 0, 0.2)",opacity:_floatingToolsReact.dialStyles.icon.gradientBgOpacity}}),(0,_jsxRuntime.jsx)("div",{style:{position:"absolute",width:`${_floatingToolsReact.dialStyles.icon.innerGlowSizePercent}%`,height:`${_floatingToolsReact.dialStyles.icon.innerGlowSizePercent}%`,borderRadius:_floatingToolsReact.dialStyles.icon.innerGlowBorderRadius,backgroundColor:"rgba(255, 255, 255, 0.02)",opacity:_floatingToolsReact.dialStyles.icon.innerGlowOpacity}}),(0,_jsxRuntime.jsx)("div",{style:{marginBottom:_floatingToolsReact.dialStyles.icon.wrapperMarginBottom,display:"flex",alignItems:"center",justifyContent:"center",fontSize:32,filter:x?"brightness(1.2)":"none"},children:t.icon}),(0,_jsxRuntime.jsx)("span",{style:{fontSize:t.name.length>8?Math.max(_floatingToolsReact.dialStyles.icon.label.fontSize*.7,_floatingToolsReact.dialStyles.icon.label.fontSize*8/t.name.length):_floatingToolsReact.dialStyles.icon.label.fontSize,fontWeight:_floatingToolsReact.dialStyles.icon.label.fontWeight,fontFamily:_floatingToolsReact.dialStyles.icon.label.fontFamily,color:_floatingToolsReact.dialColors.iconLabel,letterSpacing:_floatingToolsReact.dialStyles.icon.label.letterSpacing,marginTop:_floatingToolsReact.dialStyles.icon.label.marginTop,textTransform:"uppercase",whiteSpace:"nowrap"},children:t.name}),T&&(0,_jsxRuntime.jsx)("span",{style:{fontSize:_floatingToolsReact.dialStyles.icon.label.fontSize-1,fontWeight:_floatingToolsReact.dialStyles.icon.label.fontWeight,fontFamily:_floatingToolsReact.dialStyles.icon.label.fontFamily,letterSpacing:_floatingToolsReact.dialStyles.icon.label.letterSpacing,color:_floatingToolsReact.floatingToolsColors.muted,textTransform:"uppercase",whiteSpace:"nowrap"},children:"Unavailable"})]})})})}function PagerChevron({side:t,color:c}){const j=t==="prev"?[[15,18,9,12],[9,12,15,6]]:[[9,18,15,12],[15,12,9,6]];return(0,_jsxRuntime.jsx)("svg",{width:18,height:18,viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",children:j.map(([u,a,g,x],k)=>(0,_jsxRuntime.jsx)("line",{x1:u,y1:a,x2:g,y2:x,stroke:c,strokeWidth:2},k))})}function PagerButton({side:t,disabled:c,onClick:j}){const[u,a]=(0,_react.useState)(false);const g=c?_floatingToolsReact.dialColors.emptyDotBorder:_floatingToolsReact.dialColors.accent;return(0,_jsxRuntime.jsxs)("button",{type:"button","aria-label":`${t==="prev"?"Previous":"Next"} dial page`,"data-testid":`buoy-dial-${t}`,disabled:c,onClick:j,onPointerDown:()=>!c&&a(true),onPointerUp:()=>a(false),onPointerLeave:()=>a(false),onPointerCancel:()=>a(false),style:{display:"flex",alignItems:"center",gap:4,padding:"10px 16px",borderRadius:10,border:`1px solid ${_floatingToolsReact.dialColors.dialBorder}`,backgroundColor:_floatingToolsReact.dialColors.dialBackground,color:c?_floatingToolsReact.dialColors.iconLabelMuted:_floatingToolsReact.dialColors.centerText,fontSize:12,fontWeight:900,fontFamily:_sharedUi.monoFont,letterSpacing:1.5,textTransform:"uppercase",cursor:c?"default":"pointer",opacity:c?.4:1,boxShadow:c?"none":`0 0 8px ${(0,_floatingToolsReact.withAlpha)(_floatingToolsReact.dialColors.dialShadow,.4)}`,transform:u?"scale(0.92)":"scale(1)",transition:"transform 100ms ease"},children:[t==="prev"&&(0,_jsxRuntime.jsx)(PagerChevron,{side:"prev",color:g}),t==="prev"?"PREV":"NEXT",t==="next"&&(0,_jsxRuntime.jsx)(PagerChevron,{side:"next",color:g})]})}function DialMenu({icons:t,onClose:c,centerLabel:j="MENU",onCenterPress:u,settingsOpen:a=false,hintsDisabled:g=false,emptyNote:x}){const{id:k}=(0,_sharedUi.useToolBackground)();const[O,S]=(0,_react.useState)(0);const[m,T]=(0,_react.useState)(0);const[C,W]=(0,_react.useState)(0);const[w,s]=(0,_react.useState)(0);const[z,D]=(0,_react.useState)(0);const[H,E]=(0,_react.useState)(1);const[A,q]=(0,_react.useState)(false);const[U,K]=(0,_react.useState)(false);const[ie,ae]=(0,_react.useState)(false);const N=(0,_react.useRef)(null);const Q=(0,_react.useRef)(null);const y=(0,_react.useRef)(null);const L=(0,_react.useRef)(false);const{entrance:_,exit:$,interaction:F}=_floatingToolsReact.dialAnimationConfig;const re=(0,_floatingToolsReact.getDialCSSAnimationStyles)();const[X,se]=(0,_react.useState)(()=>({width:window.innerWidth,height:window.innerHeight}));(0,_react.useEffect)(()=>{const o=()=>se({width:window.innerWidth,height:window.innerHeight});window.addEventListener("resize",o);return()=>window.removeEventListener("resize",o)},[]);const n=(0,_react.useMemo)(()=>(0,_floatingToolsReact.getDialLayout)({screenWidth:X.width,maxCircleSize:Math.max(120,Math.min(320,X.height-96))}),[X]);const le=(0,_react.useMemo)(()=>(0,_floatingToolsReact.getGridLineRotations)(),[]);const ce=(0,_react.useMemo)(()=>(0,_floatingToolsReact.getAllIconPositions)(_floatingToolsReact.MAX_DIAL_SLOTS,n.iconRadius),[n.iconRadius]);const[de,ue]=(0,_react.useState)(0);const I=Math.max(1,Math.ceil(t.length/_floatingToolsReact.MAX_DIAL_SLOTS));const h=Math.min(de,I-1);const ee=(0,_react.useMemo)(()=>{const o=h*_floatingToolsReact.MAX_DIAL_SLOTS;const e=[...t.slice(o,o+_floatingToolsReact.MAX_DIAL_SLOTS)];while(e.length<_floatingToolsReact.MAX_DIAL_SLOTS){e.push({id:`empty-${e.length}`,name:"",icon:null,onPress:()=>{}})}return e},[t,h]);(0,_react.useEffect)(()=>{injectKeyframes()},[]);(0,_react.useEffect)(()=>{const o=_.backdrop.duration;const e=_.dial.rotation.duration;const d=_.centerButton.delay;const r=_.icons.delay;const l=_.icons.duration;const p=performance.now();const f=v=>{const i=v-p;S(Math.min(1,i/o));const b=Math.min(1,i/400);let P=easeOutCubic(b)*1.1;if(b>.7){P-=(b-.7)*.33}if(b>=1)P=1;T(Math.max(0,Math.min(1.05,P)));const B=Math.min(1,i/e);W(easeOutCubic(B)*360);if(i>=d){const M=Math.min(1,(i-d)/300);let J=easeOutCubic(M)*1.15;if(M>.6){J-=(M-.6)*.375}if(M>=1)J=1;s(Math.max(0,Math.min(1.05,J)))}if(i>=r){const M=Math.min(1,(i-r)/l);D(easeOutCubic(M))}const Z=r+l;if(i<Z){y.current=requestAnimationFrame(f)}else{S(1);T(1);W(360);s(1);D(1);ae(true)}};y.current=requestAnimationFrame(f);return()=>{if(y.current)cancelAnimationFrame(y.current)}},[]);const R=(0,_react.useCallback)(()=>{if(L.current)return;L.current=true;K(true);if(y.current){cancelAnimationFrame(y.current)}const o=performance.now();const e=$.icons.duration;const d=$.centerButton.duration;const r=$.dialScale.duration;const l=Math.max(d,r);const p=$.backdrop.duration;const f=v=>{const i=v-o;if(i<e){const B=easeInCubic(i/e);D(1-B);y.current=requestAnimationFrame(f);return}const b=e;if(i<b+l){D(0);const B=Math.min(1,(i-b)/d);const Z=Math.min(1,(i-b)/r);s(1-easeInCubic(B));T(1-easeInCubic(Z));y.current=requestAnimationFrame(f);return}const P=b+l;if(i<P+p){T(0);s(0);const B=(i-P)/p;S(1-B);y.current=requestAnimationFrame(f);return}S(0);c()};y.current=requestAnimationFrame(f)},[$,c]);(0,_capacitorBackButton.useCapacitorBackButton)(true,()=>{if(L.current)return;if(a)u?.();else R()},_capacitorBackButton.BUOY_DIAL_BACK_PRIORITY);(0,_react.useEffect)(()=>{const o=document.activeElement;const e=N.current;return()=>{if(o?.isConnected&&(document.activeElement===document.body||e?.contains(document.activeElement))){o.focus()}}},[]);(0,_react.useEffect)(()=>{if(a)return;Q.current?.focus();const o=e=>{const d=N.current;if(!d)return;if(e.key==="Escape"){e.preventDefault();R()}else if(e.key==="Tab"){const r=Array.from(d.querySelectorAll('button:not(:disabled):not([aria-disabled="true"]), [tabindex="0"]')).filter(f=>f.getClientRects().length>0);const l=r[0];const p=r[r.length-1];if(!d.contains(document.activeElement)||(e.shiftKey?document.activeElement===l:document.activeElement===p)){e.preventDefault();(e.shiftKey?p:l)?.focus()}}else if(["ArrowRight","ArrowDown","ArrowLeft","ArrowUp","Home","End"].includes(e.key)){const r=Array.from(d.querySelectorAll('[role="menuitem"]:not([aria-disabled="true"])'));const l=r.indexOf(document.activeElement);if(l<0||!r.length)return;e.preventDefault();const p=e.key==="Home"?0:e.key==="End"?r.length-1:(l+(e.key==="ArrowRight"||e.key==="ArrowDown"?1:-1)+r.length)%r.length;r[p].focus()}};document.addEventListener("keydown",o);return()=>document.removeEventListener("keydown",o)},[R,a]);const[Y,te]=(0,_react.useState)(false);(0,_react.useEffect)(()=>{if(g)return;let o=false;const e=setTimeout(async()=>{const d=await _sharedUi.persistentStorage.getItem(SETTINGS_TOOLTIP_KEY);if(!o&&!d)te(true)},1200);return()=>{o=true;clearTimeout(e)}},[g]);const V=(0,_react.useCallback)(()=>{te(false);void _sharedUi.persistentStorage.setItem(SETTINGS_TOOLTIP_KEY,"true")},[]);(0,_react.useEffect)(()=>{if(a&&Y){V()}},[a,Y,V]);const pe=(0,_react.useCallback)(o=>{if(o.id.startsWith("empty-")||L.current)return;const[e,d]=F.iconSelect.pulse;const r=performance.now();const l=150;const p=f=>{const v=f-r;if(v<l){const i=easeOutCubic(v/l);E(1-(1-e.scale)*i);requestAnimationFrame(p)}else if(v<l*2){const i=easeOutCubic((v-l)/l);E(e.scale+(d.scale-e.scale)*i);requestAnimationFrame(p)}else{E(1)}};requestAnimationFrame(p);setTimeout(()=>{o.onPress();R()},F.iconSelect.actionDelay)},[F.iconSelect,R]);const oe=(0,_react.useCallback)(o=>{if(L.current)return;const e=Math.max(0,Math.min(o,I-1));if(e!==h)ue(e)},[I,h]);const G=n.buttonSize*_floatingToolsReact.dialStyles.centerButton.containerRatio;const ne=n.buttonSize*_floatingToolsReact.dialStyles.centerButton.borderRatio;const fe=n.buttonSize*_floatingToolsReact.dialStyles.centerButton.containerRatio/2+6;const me=ie&&!U;return(0,_jsxRuntime.jsxs)("div",{ref:N,role:"dialog","aria-label":"Dial Menu","aria-modal":"true",style:{position:"fixed",inset:0,zIndex:1e4},children:[(0,_jsxRuntime.jsx)("button",{type:"button","aria-label":"Close dial menu",tabIndex:0,onClick:R,style:{position:"absolute",inset:0,border:0,padding:0,backgroundColor:_floatingToolsReact.dialColors.dialBackdrop,opacity:O}}),x?(0,_jsxRuntime.jsx)("div",{role:"status","data-testid":"buoy-dial-empty-note",style:{position:"absolute",left:16,right:16,bottom:80+n.circleSize+16,color:_floatingToolsReact.dialColors.iconLabel,fontSize:12,fontFamily:_sharedUi.monoFont,textAlign:"center",opacity:m>.01?1:0},children:x}):null,(0,_jsxRuntime.jsxs)("div",{style:{position:"absolute",left:"50%",marginLeft:-n.circleSize/2,bottom:80,width:n.circleSize,height:n.circleSize,borderRadius:"50%",backgroundColor:_floatingToolsReact.dialColors.dialBackground,border:`${_floatingToolsReact.dialStyles.circle.borderWidth}px solid ${_floatingToolsReact.dialColors.dialBorder}`,boxShadow:`0 0 ${_floatingToolsReact.dialStyles.circle.shadowRadius}px ${(0,_floatingToolsReact.withAlpha)(_floatingToolsReact.dialColors.dialShadow,_floatingToolsReact.dialStyles.circle.shadowOpacity)}`,transform:`scale(${m}) rotate(${C}deg)`,opacity:m>.01?1:0,overflow:"hidden"},children:[(0,_jsxRuntime.jsx)("div",{style:{position:"absolute",inset:0,borderRadius:"50%",backgroundColor:_floatingToolsReact.dialColors.dialGradient1,opacity:_floatingToolsReact.dialStyles.gradientLayers[0].opacity}}),(0,_jsxRuntime.jsx)("div",{style:{position:"absolute",inset:0,top:"30%",left:"30%",borderRadius:"50%",backgroundColor:_floatingToolsReact.dialColors.dialGradient2,opacity:_floatingToolsReact.dialStyles.gradientLayers[1].opacity}}),(0,_jsxRuntime.jsx)("div",{style:{position:"absolute",inset:0,top:"50%",left:"50%",borderRadius:"50%",backgroundColor:_floatingToolsReact.dialColors.dialGradient3,opacity:_floatingToolsReact.dialStyles.gradientLayers[2].opacity}}),le.map(o=>(0,_jsxRuntime.jsx)("div",{style:{position:"absolute",top:"50%",left:0,right:0,height:_floatingToolsReact.dialStyles.grid.lineHeight,transform:`rotate(${o}deg)`,transformOrigin:"center"},children:["left","right"].map(e=>(0,_jsxRuntime.jsx)("div",{style:{position:"absolute",top:0,[e]:0,width:`calc(50% - ${fe}px)`,height:_floatingToolsReact.dialStyles.grid.lineHeight,backgroundColor:_floatingToolsReact.dialColors.dialGridLine}},e))},o)),(0,_jsxRuntime.jsx)("div",{"data-testid":"dial-background","data-background":k,style:{position:"absolute",inset:0,pointerEvents:"none"},children:k==="hyperspace"?(0,_jsxRuntime.jsx)(_DialHyperspace.DialHyperspace,{size:n.circleSize}):(0,_jsxRuntime.jsx)(_sharedUi.ToolBackground,{focus:DIAL_BACKGROUND_FOCUS})}),ee.map((o,e)=>(0,_jsxRuntime.jsx)(DialIconItem,{icon:o,index:e,totalIcons:ee.length,position:ce[e],progress:z,onPress:()=>pe(o)},e)),(0,_jsxRuntime.jsxs)("div",{style:{position:"absolute",left:"50%",top:"50%",width:G,height:G,marginLeft:-G/2,marginTop:-G/2,display:"flex",alignItems:"center",justifyContent:"center",backgroundColor:_floatingToolsReact.dialColors.hubHalo,borderRadius:n.buttonSize,overflow:"hidden",transform:`scale(${w*H})`,opacity:w>.01?1:0},children:[(0,_jsxRuntime.jsx)("div",{style:{position:"absolute",inset:0,backgroundColor:_floatingToolsReact.dialColors.dialGradient1,opacity:.5,borderRadius:n.buttonSize}}),(0,_jsxRuntime.jsx)("div",{style:{position:"absolute",inset:0,top:"20%",left:"20%",backgroundColor:_floatingToolsReact.dialColors.dialGradient2,opacity:.3,borderRadius:n.buttonSize}}),(0,_jsxRuntime.jsx)("div",{style:{position:"absolute",inset:0,top:"40%",left:"40%",backgroundColor:_floatingToolsReact.dialColors.dialGradient3,opacity:.2,borderRadius:n.buttonSize}}),(0,_jsxRuntime.jsx)("div",{style:{width:ne,height:ne,borderRadius:n.buttonSize*_floatingToolsReact.dialStyles.centerButton.borderRadiusRatio,backgroundColor:_floatingToolsReact.dialColors.hubFill,display:"flex",alignItems:"center",justifyContent:"center"},children:(0,_jsxRuntime.jsx)("button",{ref:Q,type:"button","aria-label":a?"Close Settings":"Open Dev Tools Settings",disabled:!u,onClick:u,onPointerEnter:o=>o.pointerType==="mouse"&&q(true),onPointerLeave:()=>q(false),style:{border:0,padding:0,background:"transparent",width:n.buttonSize,height:n.buttonSize,borderRadius:n.buttonSize/2,display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",cursor:u?"pointer":"default",transform:A?`scale(${F.centerHover.scale})`:"scale(1)",transition:`transform ${F.centerHover.duration}ms ease`,animation:me&&!A?re.pulse:"none"},children:a?(0,_jsxRuntime.jsxs)("span",{style:{display:"flex",flexDirection:"column",alignItems:"center",fontSize:_floatingToolsReact.dialStyles.centerButton.text.fontSize-2,fontWeight:_floatingToolsReact.dialStyles.centerButton.text.fontWeight,fontFamily:_floatingToolsReact.dialStyles.centerButton.text.fontFamily,color:_floatingToolsReact.dialColors.centerText,letterSpacing:_floatingToolsReact.dialStyles.centerButton.text.letterSpacing,textAlign:"center",textShadow:`0 0 4px ${_floatingToolsReact.dialColors.centerTextGlow}`,textTransform:"uppercase",lineHeight:1.2},children:[(0,_jsxRuntime.jsx)("span",{style:{marginBottom:-2},children:"CLOSE"}),(0,_jsxRuntime.jsx)("span",{style:{marginTop:-2},children:"SETTINGS"})]}):(0,_jsxRuntime.jsx)("span",{style:{fontSize:_floatingToolsReact.dialStyles.centerButton.text.fontSize,fontWeight:_floatingToolsReact.dialStyles.centerButton.text.fontWeight,fontFamily:_floatingToolsReact.dialStyles.centerButton.text.fontFamily,color:_floatingToolsReact.dialColors.centerText,letterSpacing:_floatingToolsReact.dialStyles.centerButton.text.letterSpacing,textAlign:"center",textShadow:`0 0 4px ${_floatingToolsReact.dialColors.centerTextGlow}`,textTransform:"uppercase"},children:j})})})]})]}),I>1&&(0,_jsxRuntime.jsxs)("div",{style:{position:"absolute",left:"50%",marginLeft:-n.circleSize/2,top:"calc(100% - 64px)",width:n.circleSize,display:"flex",alignItems:"center",justifyContent:"space-between",opacity:Math.min(1,m),transform:`scale(${Math.min(1,m)})`},children:[(0,_jsxRuntime.jsx)(PagerButton,{side:"prev",disabled:h<=0,onClick:()=>oe(h-1)}),(0,_jsxRuntime.jsxs)("span",{"data-testid":"buoy-dial-page",style:{padding:"6px 12px",fontSize:13,fontWeight:900,fontFamily:_sharedUi.monoFont,letterSpacing:2,color:_floatingToolsReact.dialColors.centerText,textShadow:`0 0 6px ${_floatingToolsReact.dialColors.centerTextGlow}`},children:[String(h+1).padStart(2,"0"),(0,_jsxRuntime.jsxs)("span",{style:{color:_floatingToolsReact.dialColors.iconLabelMuted,textShadow:"none"},children:[" / ",String(I).padStart(2,"0")]})]}),(0,_jsxRuntime.jsx)(PagerButton,{side:"next",disabled:h>=I-1,onClick:()=>oe(h+1)})]}),Y&&!a&&(0,_jsxRuntime.jsx)(_OnboardingTooltipWeb.OnboardingTooltip,{title:"Welcome to Buoy!",message:"Tap the center button to configure and add tools to your dial menu.",onDismiss:V,showArrow:false})]})}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.RELEASE_GATED_ACTIONS=exports.RELEASE_DEFAULT_SOCKET_URL=void 0;exports.applyReleaseActionPolicy=applyReleaseActionPolicy;exports.externalSyncOptions=externalSyncOptions;exports.releaseTransportProblem=releaseTransportProblem;exports.shouldMountExternalSync=shouldMountExternalSync;function externalSyncOptions(e){return typeof e==="object"&&e!==null?e:void 0}function shouldMountExternalSync({isDevelopment:e,isLicensed:n,externalSync:r,isAvailable:t}){if(r===false)return false;if(!t)return false;if(e)return true;const o=externalSyncOptions(r);return n&&o?.enableInRelease===true&&releaseTransportProblem(o.socketURL,o)===null}const RELEASE_DEFAULT_SOCKET_URL=exports.RELEASE_DEFAULT_SOCKET_URL="http://localhost:42831";function isLoopbackHost(e){return e==="localhost"||e.endsWith(".localhost")||/^127\.\d+\.\d+\.\d+$/.test(e)||e==="[::1]"||e==="::1"||e==="10.0.2.2"}function releaseTransportProblem(e,n){const r=e??RELEASE_DEFAULT_SOCKET_URL;if(n?.allowInsecureNetwork===true)return null;let t;try{t=new URL(r)}catch{return`[Buoy] externalSync.socketURL "${r}" isn't a valid URL, so this release build won't connect to Buoy Desktop.`}if(t.protocol==="https:"||t.protocol==="wss:")return null;if(isLoopbackHost(t.hostname))return null;return`[Buoy] This release build won't connect to ${r}: release sync carries real user data, and plain http to another machine is readable by anyone on the same network. Use a simulator, an emulator or adb reverse (localhost), an https:// broker, or set externalSync.allowInsecureNetwork: true for a network you trust.`}const RELEASE_GATED_ACTIONS=exports.RELEASE_GATED_ACTIONS={impersonate:["searchUsers","startImpersonation","resumeImpersonation","updateSettings","removeFromHistory","clearHistory"]};function applyReleaseActionPolicy(e,n,r){if(n)return e;let t=null;for(const[o,u]of Object.entries(RELEASE_GATED_ACTIONS)){if(r?.includes(o))continue;const s=e[o];if(!s?.actions)continue;const a={...s.actions};for(const l of u){if(!(l in a))continue;a[l]=()=>{throw new Error(`${o}.${l} is off in release builds. To allow it from Buoy Desktop and the MCP, pass externalSync={{ enableInRelease: true, releaseActions: ["${o}"] }}.`)}}t??={...e};t[o]={...s,actions:a}}return t??e}
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.RELEASE_GATED_ACTIONS=exports.RELEASE_DEFAULT_SOCKET_URL=void 0;exports.applyReleaseActionPolicy=applyReleaseActionPolicy;exports.externalSyncOptions=externalSyncOptions;exports.releaseTransportProblem=releaseTransportProblem;exports.shouldMountExternalSync=shouldMountExternalSync;function externalSyncOptions(e){return typeof e==="object"&&e!==null?e:void 0}function shouldMountExternalSync({isDevelopment:e,isLicensed:n,externalSync:r,isAvailable:t}){if(r===false)return false;if(!t)return false;if(e)return true;const o=externalSyncOptions(r);return n&&o?.enableInRelease===true&&releaseTransportProblem(o.socketURL,o)===null}const RELEASE_DEFAULT_SOCKET_URL=exports.RELEASE_DEFAULT_SOCKET_URL="http://localhost:42831";function isLoopbackHost(e){return e==="localhost"||e.endsWith(".localhost")||/^127\.\d+\.\d+\.\d+$/.test(e)||e==="[::1]"||e==="::1"||e==="10.0.2.2"}function releaseTransportProblem(e,n){const r=e??RELEASE_DEFAULT_SOCKET_URL;if(n?.allowInsecureNetwork===true)return null;let t;try{t=new URL(r)}catch{return`[Buoy] externalSync.socketURL "${r}" isn't a valid URL, so this release build won't connect to Buoy Desktop.`}if(t.protocol==="https:"||t.protocol==="wss:")return null;if(isLoopbackHost(t.hostname))return null;return`[Buoy] This release build won't connect to ${r}: release sync carries real user data, and plain http to another machine is readable by anyone on the same network. Use a simulator, an emulator or adb reverse (localhost), an https:// broker, or set externalSync.allowInsecureNetwork: true for a network you trust.`}const RELEASE_GATED_ACTIONS=exports.RELEASE_GATED_ACTIONS={"ota-update-inspector":["check","fetch","reload","setHeaders","setURL"],impersonate:["searchUsers","startImpersonation","resumeImpersonation","updateSettings","removeFromHistory","clearHistory"]};function applyReleaseActionPolicy(e,n,r){if(n)return e;let t=null;for(const[o,u]of Object.entries(RELEASE_GATED_ACTIONS)){if(r?.includes(o))continue;const s=e[o];if(!s?.actions)continue;const a={...s.actions};for(const l of u){if(!(l in a))continue;a[l]=()=>{throw new Error(`${o}.${l} is off in release builds. To allow it from Buoy Desktop and the MCP, pass externalSync={{ enableInRelease: true, releaseActions: ["${o}"] }}.`)}}t??={...e};t[o]={...s,actions:a}}return t??e}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"resolveBackTarget",{enumerable:true,get:function(){return _backTarget.resolveBackTarget}});exports.useHardwareBack=useHardwareBack;var _react=require("react");var _reactNative=require("react-native");var _backTarget=require("./backTarget.js");function useHardwareBack(e,r){const t=(0,_react.useRef)(r);t.current=r;(0,_react.useEffect)(()=>{if(!e||_reactNative.Platform.OS!=="android")return;const a=_reactNative.BackHandler.addEventListener("hardwareBackPress",()=>t.current());return()=>a.remove()},[e])}
|
package/lib/commonjs/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.SDK_VERSION=void 0;const SDK_VERSION=exports.SDK_VERSION="7.0.
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.SDK_VERSION=void 0;const SDK_VERSION=exports.SDK_VERSION="7.0.79";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";const
|
|
1
|
+
"use strict";export const EARLY_NETWORK_KEY=Symbol.for("buoy.earlyNetwork");export const LEGACY_EARLY_NETWORK_KEY="__BUOY_EARLY_NETWORK__";const g=100;export 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 y=s=>{f.push(Object.freeze(s));if(f.length>g){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 E=/event-stream|ndjson/.test(t.headers.get("content-type")??"");let _;try{if(!E)_=t.clone()}catch{}return{response:t,clone:_,headersAt:c}},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 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()});y({kind:"xhr",xhr:c,method:n.method,url:n.url,headers:n.headers,body:o,start:t})}return r.call(this,o)}}const w=()=>{i=false;return f.splice(0)};const p=Object.freeze({version:1,get pending(){return f.length},adopt:w});const b=(s,e)=>{try{Object.defineProperty(u,s,{value:e,enumerable:false,writable:false,configurable:false})}catch{}};b(EARLY_NETWORK_KEY,p);b(LEGACY_EARLY_NETWORK_KEY,Object.freeze({version:1,adopt:w}))}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";import{persistentStorage as
|
|
1
|
+
"use strict";import{persistentStorage as E,setExpandableWindowControls as F}from"@buoy-gg/shared-ui";import H,{createContext as j,useCallback as S,useContext as B,useMemo as V,useState as R,useEffect as y,useRef as v}from"react";import{Modal as W,StyleSheet as C,View as x}from"react-native";import{resolveOpenAppsState as $,restoreOpenApp as q}from"./AppHostLogic.js";import{renderAppIcon as J}from"./AppIcon";import{useMinimizedTools as P}from"./MinimizedToolsContext.js";import{ToolModalShell as Y}from"./ToolHost.js";import{useDevToolsSettings as G}from"./DevToolsSettingsModal";import{useDevToolsVisibility as K}from"./DevToolsVisibilityContext.js";import{resolveBackTarget as L,useHardwareBack as X}from"./hardwareBack.js";import{jsx as m,Fragment as Z}from"react/jsx-runtime";const k=j(null);const O="@react_buoy_open_apps";const Q=500;export const AppHostProvider=({children:t})=>{const[s,l]=R([]);const[c,u]=R(false);const f=v(null);const a=v([]);const d=v(null);const{restore:g}=P();const z=S(n=>{let i="";l(o=>{const{apps:r,instanceId:I,wasMinimized:N}=$(o,n,()=>`${n.id}-${Date.now()}-${Math.random().toString(36).slice(2)}`);i=I;if(N){setTimeout(()=>g(I),0)}return r});return i},[g]);const e=S(()=>{if(c)return;if(!a.current.length)return;const n=d.current;if(!n||n.length===0){u(true);return}d.current=null;n.forEach(({id:i,minimized:o})=>{const r=a.current.find(I=>I.id===i);if(r){const I=J(r.icon,{slot:"dial",size:20,color:r.color});z({id:r.id,title:r.name,component:r.component,props:r.props,launchMode:r.launchMode||"self-modal",singleton:r.singleton,icon:I,color:r.color,modal:r.modal,minimized:o})}});u(true)},[c,z]);y(()=>{const n=async()=>{try{const i=await E.getItem(O);if(i){const o=JSON.parse(i);let r;if(Array.isArray(o)&&o.length>0){if(typeof o[0]==="string"){r=o.map(I=>({id:I,minimized:false}))}else{r=o}if(r.length){d.current=r;e();return}}}}catch(i){}u(true)};n()},[e]);y(()=>{if(!c)return;if(f.current){clearTimeout(f.current)}f.current=setTimeout(()=>{const n=s.map(i=>({id:i.id,minimized:i.minimized??false}));E.setItem(O,JSON.stringify(n))},Q);return()=>{if(f.current){clearTimeout(f.current)}}},[s,c]);const h=S(n=>{a.current=n;e()},[e]);const p=S(n=>{l(i=>{if(!i.length)return i;if(!n)return i.slice(0,-1);return i.filter(o=>o.instanceId!==n)})},[]);const M=S(()=>l([]),[]);const A=S(n=>{l(i=>i.map(o=>o.instanceId===n?{...o,minimized:true}:o))},[]);const b=S((n,i)=>{l(o=>q(o,n,i))},[]);const T=S(n=>{const i=s.find(o=>o.instanceId===n);return i?.minimized??false},[s]);const{isDialOpen:w}=K();X(s.length>0,()=>{const n=L(s,w);if(n?.kind!=="tool")return false;p(n.instanceId);return true});const D=V(()=>({openApps:s,isAnyOpen:s.filter(n=>n.launchMode!=="toggle-only"&&!n.minimized).length>0,open:z,close:p,closeAll:M,registerApps:h,minimize:A,restore:b,isMinimized:T}),[s,z,p,M,h,A,b,T]);return m(k.Provider,{value:D,children:t})};export const useAppHost=()=>{const t=B(k);if(!t){return{openApps:[],isAnyOpen:false,open:()=>"",close:()=>{},closeAll:()=>{},minimize:()=>{},restore:(s,l)=>{},isMinimized:()=>false}}return t};const U=({app:t,zIndex:s,onClose:l,onMinimize:c,minimizeTargetPosition:u,globalEnableSharedModalDimensions:f})=>{const a=t.component;const d=!t.minimized;const g={...t.props??{},...f===true?{enableSharedModalDimensions:true}:{}};if(t.modal&&(t.launchMode==="self-modal"||!t.launchMode)){return m(Y,{app:t,config:t.modal,visible:d,zIndex:s,onClose:l,onMinimize:c,initialModalState:t.restoreState,enableSharedModalDimensions:f===true,bodyProps:g})}if(t.launchMode==="self-modal"){return m(a,{...g,visible:d,onClose:l,onRequestClose:l,onMinimize:c,minimizeTargetPosition:u,initialModalState:t.restoreState,instanceId:t.instanceId,zIndex:s})}if(t.launchMode==="inline"){if(!d)return null;return m(x,{pointerEvents:"box-none",style:[C.absoluteFill,{zIndex:s}],children:m(a,{...g,onClose:l,onMinimize:c,minimizeTargetPosition:u,initialModalState:t.restoreState,instanceId:t.instanceId})})}return m(W,{visible:d,transparent:true,animationType:"slide",onRequestClose:l,children:m(x,{style:_.backdrop,children:m(x,{style:_.card,children:m(a,{...g,onClose:l,onMinimize:c,minimizeTargetPosition:u,initialModalState:t.restoreState,instanceId:t.instanceId})})})})};export const AppOverlay=()=>{const{openApps:t,close:s,minimize:l}=useAppHost();const{minimize:c,restore:u,getNextIconPosition:f,minimizedTools:a}=P();const{settings:d}=G();y(()=>{F(d.globalSettings?.expandableWindowControls!==false)},[d.globalSettings?.expandableWindowControls]);H.useEffect(()=>{t.forEach(e=>{if(e.minimized&&e.launchMode!=="toggle-only"){const h=a.some(p=>p.instanceId===e.instanceId);if(!h){c({instanceId:e.instanceId,id:e.id,title:e.title||e.id,icon:e.icon,color:e.color})}}});a.forEach(e=>{const h=t.find(p=>p.instanceId===e.instanceId);if(!h||!h.minimized){u(e.instanceId)}})},[t,a,c,u]);const g=t.filter(e=>e.launchMode!=="toggle-only");if(g.length===0)return null;const z=9e3;return m(Z,{children:g.map((e,h)=>{const p=z+h;const M=f();const A=b=>{l(e.instanceId);c({instanceId:e.instanceId,id:e.id,title:e.title||e.id,icon:e.icon,color:e.color,modalState:b})};return m(U,{app:e,zIndex:p,onClose:()=>s(e.instanceId),onMinimize:A,minimizeTargetPosition:M,globalEnableSharedModalDimensions:d.globalSettings?.enableSharedModalDimensions},e.instanceId)})})};const _=C.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";import{listenBuoyKeydown as
|
|
1
|
+
"use strict";import{listenBuoyKeydown as B}from"@buoy-gg/shared-ui/floating";import{persistentStorage as P,setExpandableWindowControls as $}from"@buoy-gg/shared-ui";import{createContext as F,useCallback as p,useContext as H,useEffect as M,useMemo as N,useRef as b,useState as w}from"react";import{resolveOpenAppsState as j,restoreOpenApp as W}from"./AppHostLogic.js";import{renderAppIcon as G}from"./AppIcon";import{ToolModalShell as V}from"./ToolHost.js";import{useDevToolsSettings as J}from"./DevToolsSettingsModal.shared.js";import{getBubbleAnchorPosition as K}from"./floatingTools.web.js";import{useCapacitorBackButton as Z}from"./capacitorBackButton.js";import{resolveBackTarget as q}from"./backTarget.js";import{useDevToolsVisibility as X}from"./DevToolsVisibilityContext.js";import{jsx as c,Fragment as Y}from"react/jsx-runtime";const T=F(null);const _="@react_buoy_open_apps";const z=44;const L=12;const Q=100;const U=16;const ee=t=>({x:window.innerWidth-z-U,y:window.innerHeight-Q-z-t*(z+L)});export const AppHostProvider=({children:t})=>{const[i,l]=w([]);const[d,a]=w(false);const g=b([]);const m=b(null);const r=b(false);const f=b(false);const A=b(false);const S=p(e=>{let o="";l(s=>{const{apps:n,instanceId:u}=j(s,e,()=>`${e.id}-${Date.now()}-${Math.random().toString(36).slice(2)}`);o=u;return n});return o},[]);const v=p(()=>{if(r.current||!f.current||!A.current)return;r.current=true;const e=m.current;if(!e||e.length===0){a(true);return}m.current=null;e.forEach(({id:o,minimized:s})=>{const n=g.current.find(u=>u.id===o);if(n&&n.component){const u=G(n.icon,{slot:"dial",size:20,color:n.color});S({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:u,color:n.color,minimized:s})}});a(true)},[S]);M(()=>{let e=false;const o=async()=>{try{const s=await P.getItem(_);if(e)return;if(s){const n=JSON.parse(s);let u;if(Array.isArray(n)&&n.length>0){if(typeof n[0]==="string"){u=n.map(y=>({id:y,minimized:false}))}else{u=n.filter(y=>typeof y==="object"&&y!==null&&typeof y.id==="string")}if(u.length){m.current=u}}}}catch{}if(e)return;f.current=true;v()};void o();return()=>{e=true}},[v]);M(()=>{if(!d)return;const e=i.map(o=>({id:o.id,minimized:o.minimized??false}));void P.setItem(_,JSON.stringify(e))},[i,d]);const x=p(e=>{g.current=e;A.current=true;v()},[v]);const h=p(e=>{l(o=>{if(!o.length)return o;if(!e)return o.slice(0,-1);return o.filter(s=>s.instanceId!==e)})},[]);const O=p(()=>l([]),[]);const C=p((e,o)=>{l(s=>s.map(n=>n.instanceId===e?{...n,minimized:true,restoreState:o}:n))},[]);const R=p((e,o)=>{l(s=>W(s,e,o))},[]);const E=p(e=>{const o=i.find(s=>s.instanceId===e);return o?.minimized??false},[i]);const I=i.some(e=>e.launchMode!=="toggle-only"&&!e.minimized);M(()=>{if(!I)return;const e=o=>{if(o.key!=="Escape")return;if(o.defaultPrevented)return;const s=[...i].reverse().find(n=>n.launchMode!=="toggle-only"&&!n.minimized);if(s)h(s.instanceId)};return B(e)},[I,h,i]);const{isDialOpen:k}=X();Z(i.length>0,()=>{const e=q(i,k);if(e?.kind==="tool")h(e.instanceId)});const D=N(()=>({openApps:i,isAnyOpen:I,open:S,close:h,closeAll:O,registerApps:x,minimize:C,restore:R,isMinimized:E}),[i,I,S,h,O,x,C,R,E]);return c(T.Provider,{value:D,children:t})};export const useAppHost=()=>{const t=H(T);if(!t){return{openApps:[],isAnyOpen:false,open:()=>"",close:()=>{},closeAll:()=>{},registerApps:()=>{},minimize:()=>{},restore:()=>{},isMinimized:()=>false}}return t};const te=9e3;const ne={position:"fixed",inset:0,backgroundColor:"rgba(0,0,0,0.28)",display:"flex",alignItems:"center",justifyContent:"center"};const oe={maxHeight:"90%",width:"94%",borderRadius:12,backgroundColor:"white",overflow:"hidden"};const ie=({app:t,zIndex:i,onClose:l,onMinimize:d,minimizeTargetPosition:a,enableSharedModalDimensions:g})=>{const m=t.component;const r=!t.minimized;const f={...t.props??{},...g?{enableSharedModalDimensions:true}:{}};if(t.modal&&(!t.launchMode||t.launchMode==="self-modal")){return c("div",{"data-testid":`buoy-tool-instance-${t.id}`,style:{position:"fixed",inset:0,zIndex:i,pointerEvents:"none"},children:c(V,{app:t,config:t.modal,visible:r,zIndex:i,onClose:l,onMinimize:d,initialModalState:t.restoreState,enableSharedModalDimensions:g,bodyProps:f})})}if(t.launchMode==="self-modal"){return c("div",{"data-testid":`buoy-tool-instance-${t.id}`,style:{position:"fixed",inset:0,zIndex:i,pointerEvents:"none"},children:c(m,{...f,visible:r,onClose:l,onRequestClose:l,onMinimize:d,minimizeTargetPosition:a,instanceId:t.instanceId,zIndex:i,initialModalState:t.restoreState})})}if(t.launchMode==="inline"){if(!r)return null;return c("div",{"data-testid":`buoy-tool-instance-${t.id}`,style:{position:"fixed",inset:0,zIndex:i,pointerEvents:"none"},children:c(m,{...f,onClose:l,onMinimize:d,minimizeTargetPosition:a,initialModalState:t.restoreState,instanceId:t.instanceId})})}return c("div",{"data-testid":`buoy-tool-instance-${t.id}`,style:{...ne,zIndex:i,display:r?"flex":"none"},children:c("div",{style:oe,children:c(m,{...f,onClose:l,onMinimize:d,minimizeTargetPosition:a,initialModalState:t.restoreState,instanceId:t.instanceId})})})};export const AppOverlay=()=>{const{openApps:t,close:i,minimize:l}=useAppHost();const{settings:d}=J();M(()=>{$(d.globalSettings?.expandableWindowControls!==false)},[d.globalSettings?.expandableWindowControls]);const a=t.filter(r=>r.launchMode!=="toggle-only");if(a.length===0)return null;const g=a.filter(r=>r.minimized).length;const m=K()??ee(g);return c(Y,{children:a.map((r,f)=>c(ie,{app:r,zIndex:te+f,onClose:()=>i(r.instanceId),onMinimize:A=>l(r.instanceId,A),enableSharedModalDimensions:d.globalSettings?.enableSharedModalDimensions===true,minimizeTargetPosition:m},r.instanceId))})};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";export const resolveOpenAppsState=(
|
|
1
|
+
"use strict";export const resolveOpenAppsState=(e,s,t)=>{if(s.singleton){const i=e.find(a=>a.id===s.id);if(i){const a=i.minimized??false;return{instanceId:i.instanceId,wasMinimized:a,apps:[...e.filter(p=>p.instanceId!==i.instanceId),{...i,minimized:false}]}}}const n=t();return{instanceId:n,wasMinimized:false,apps:[...e,{...s,instanceId:n}]}};export const restoreOpenApp=(e,s,t)=>{const n=e.find(i=>i.instanceId===s);if(!n)return e;return[...e.filter(i=>i!==n),{...n,minimized:false,restoreState:t??n.restoreState}]};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";import{useState as S,useEffect as C,useCallback as W,useMemo as A}from"react";import{View as l,Text as c,StyleSheet as Xe,ScrollView as be,TouchableOpacity as j,Dimensions as Se,Platform as Ze}from"react-native";import{settingsBus as N}from"./settingsBus.js";import{useDesktopSyncStatus as et}from"./useDesktopSyncStatus";import{SentryIcon as tt,WifiCircuitIcon as ot,ImageOverlayIcon as nt,RenderCountIcon as st,Info as Q,Layers as rt,ChevronRightIcon as we,ChevronDown as Te,getStorageBackendType as it,getUseLicense as at,signOutOfBuoy as lt,persistentStorage as D,Trash2 as ct,CheckCircle2 as ve,BuoyUpgradeSheet as dt,BackgroundSwitcher as gt,night as n,NightCard as R,NightRows as X,NightSectionLabel as ut,NightFootnote as xe,NightSwitch as ze,NightButton as Z,NightSegmented as yt,NightBadge as v,NightSeparator as ht,monoFont as Ie}from"@buoy-gg/shared-ui";import{EnvIcon as Ce,StorageIcon as ft,RoutesIcon as pt,NetworkIcon as mt,QueryIcon as bt,HighlighterIcon as St,ReduxIcon as wt,EventsIcon as Tt}from"@buoy-gg/floating-tools-core";import{useDefaultConfig as Le}from"./DefaultConfigContext.js";import{renderAppIcon as vt}from"./AppIcon";import{JsModal as xt,devToolsStorageKeys as ee,onSettingsApplied as zt,expandableWindowControlsSupported as It}from"@buoy-gg/shared-ui";import{useSafeAreaInsets as Ct}from"@buoy-gg/shared-ui";import{jsx as e,jsxs as i,Fragment as H}from"react/jsx-runtime";const O="@react_buoy_dev_tools_settings";const Lt=6;const V=y=>{let h=Lt;const a={};for(const[f,d]of Object.entries(y)){if(d&&h>0){a[f]=true;h-=1}else{a[f]=false}}return a};const Bt=(y,h)=>{const{userStatus:a,environment:f,...d}=y;const g=h?Object.entries(d).filter(([p])=>h.includes(p)):Object.entries(d);return{...Object.fromEntries(g),environment:f??false}};const Be=(y,h,a)=>{if(!h)return y;const f={...y.dialTools,...h.dialTools??{}};const d=a?.allowedDialKeys?Object.entries(f).filter(([p])=>a.allowedDialKeys?.includes(p)):Object.entries(f);const g=V(Object.fromEntries(d));return{dialTools:g,floatingTools:Bt({...y.floatingTools,...h.floatingTools??{}},a?.allowedFloatingKeys),globalSettings:{enableSharedModalDimensions:false,expandableWindowControls:true,...h.globalSettings??{}}}};const Dt=(y=[],h,a)=>{const f={};const d={};const g=new Set(h??[]);const p=new Set(a??[]);const m=!a||a.length===0;for(const x of y){const{id:u,slot:L="both"}=x;if(L==="dial"||L==="both"){f[u]=m?true:p.has(u)}if(L==="row"||L==="both"){d[u]=g.has(u)}}return{dialTools:V(f),floatingTools:{...d,environment:g.has("environment")},globalSettings:{enableSharedModalDimensions:false,expandableWindowControls:true}}};export const DevToolsSettingsModal=({visible:y,onClose:h,onSettingsChange:a,initialSettings:f,availableApps:d=[],storage:g=D,zIndex:p})=>{const{defaultFloatingTools:m,defaultDialTools:x}=Le();const u=A(()=>Dt(d,m,x),[d,m,x]);const L=A(()=>Object.keys(u.dialTools),[u]);const oe=A(()=>Object.keys(u.floatingTools).filter(t=>t!=="environment"),[u]);const[z,F]=S(f||M||u);const[E,ne]=S(te??"floating");const[se,Ee]=S(te!==null);const[_,Oe]=S(new Set);const[Fe,re]=S(false);const[ke,Pe]=S(false);C(()=>{const t=requestAnimationFrame(()=>Pe(true));return()=>cancelAnimationFrame(t)},[]);const w=et();C(()=>{const t=async()=>{try{const s=await D.getItem(ee.settings.activeTab());if(s&&["floating","settings","pro"].includes(s)){const r=s;te=r;ne(b=>b===r?b:r)}}catch(s){}finally{Ee(true)}};t()},[]);C(()=>{if(!se)return;D.setItem(ee.settings.activeTab(),E).catch(t=>{console.warn("[Buoy]","Failed to save settings active tab:",t)})},[E,se]);const He=at();const I=He?.();const k=I?.isPro??false;const J=!k&&I?.licenseKey?I.error:null;const Me=I?.errorKind==="transport";const[T,Ke]=S(De);const[U,ie]=S(false);const[G,q]=S(false);const[P,We]=S(false);const[Y,ae]=S([]);const[le,ce]=S(false);const de=Ct();const ge=Se.get("window").height;const ue=Se.get("window").width;const Ae=Math.floor(ge*.33);const je=Math.min(ue-32,400);const ye=W(async()=>{try{const t=await g.getItem(O);if(t){const s=JSON.parse(t);const r=Be(u,s,{allowedDialKeys:L,allowedFloatingKeys:oe});M=r;F(b=>Re(b,r)?b:r);return}M=u;F(s=>Re(s,u)?s:u)}catch(t){console.error("[Buoy]","Failed to load dev tools settings:",t);F(u)}},[u,L,oe,g]);C(()=>{ye()},[ye]);C(()=>{it().then(t=>{De=t;Ke(s=>s===t?s:t)})},[]);C(()=>{if(P){ce(true);D.getAllKeys().then(t=>{ae(t.sort())}).catch(()=>{ae([])}).finally(()=>{ce(false)})}},[P]);const he=async t=>{try{let s=null;try{const b=await g?.getItem(O);s=b?JSON.parse(b):null}catch{}const r={...t,dialTools:{...s?.dialTools,...V(t.dialTools)},floatingTools:{...s?.floatingTools,...t.floatingTools}};await g.setItem(O,JSON.stringify(r));M=r;F(r);a?.(r);N.emit(r)}catch(s){console.error("[Buoy]","Failed to save dev tools settings:",s)}};const Ne=t=>{const s={...z,floatingTools:{...z.floatingTools,[t]:!z.floatingTools[t]}};he(s)};const Ve=t=>{const s={...z,globalSettings:{...z.globalSettings,[t]:!z.globalSettings?.[t]}};he(s)};const _e=async()=>{ie(true);q(false);try{await D.clear();q(true);F(u);if(g!==D)await g.setItem(O,JSON.stringify(u));a?.(u);N.emit(u);setTimeout(()=>q(false),2e3)}catch(t){console.error("[Buoy]","Failed to clear storage:",t)}finally{ie(false)}};const Je=W(t=>{},[]);const Ue=t=>{const s=d.find(r=>r.id===t);if(s?.description){return s.description}if(t==="environment"){return"Environment badge."}return""};const $=t=>{if(t==="environment"){return"Env Badge"}const s=d.find(r=>r.id===t);return s?.name??t.toUpperCase().replace(/_/g," ")};const Ge=t=>{if(!ke)return null;switch(t){case"query":return e(bt,{size:18});case"env":return e(Ce,{size:18});case"sentry":return e(tt,{size:18,color:"#9945FF"});case"storage":return e(ft,{size:18,bgColor:n.color.surface});case"wifi":case"query-wifi-toggle":return e(ot,{size:18,colorPreset:"green",strength:4,noBackground:true});case"route-events":return e(pt,{size:18,bgColor:n.color.surface});case"network":return e(mt,{size:18});case"environment":return e(Ce,{size:18});case"debug-borders":return e(rt,{size:18,color:n.color.accent});case"highlight-updates":return e(st,{size:18,color:n.color.accent});case"highlight-updates-modal":return e(St,{size:18});case"redux":return e(wt,{size:18});case"image-overlay":return e(nt,{size:18});case"events":return e(Tt,{size:18});case"zustand":try{const{ZustandIcon:s}=require("@buoy-gg/zustand");return e(s,{size:18})}catch{return e(Q,{size:18,color:n.color.textSecondary})}case"jotai":try{const{JotaiIcon:s}=require("@buoy-gg/jotai");return e(s,{size:18})}catch{return e(Q,{size:18,color:n.color.textSecondary})}default:{const s=d.find(r=>r.id===t);if(s?.icon!=null){return vt(s.icon,{slot:"row",size:18,color:s.color})}return e(Q,{size:18,color:n.color.textSecondary})}}};const qe=(t,s,r,b)=>{const K=Ue(t);return i(j,{activeOpacity:r?1:.7,onPress:()=>!r&&b(),accessibilityLabel:$(t),accessibilityRole:"button",style:[o.toolRow,r&&o.rowDisabled],children:[e(l,{style:o.toolIconSlot,children:Ge(t)}),i(l,{style:o.rowInfo,children:[i(c,{style:o.rowLabel,children:[$(t),r?" \xB7 max 6":""]}),K?e(c,{style:o.rowCaption,numberOfLines:1,children:K}):null]}),e(ze,{value:s,disabled:r,onValueChange:()=>b(),accessibilityLabel:$(t)})]},t)};const fe=t=>{Oe(s=>{const r=new Set(s);if(r.has(t)){r.delete(t)}else{r.add(t)}return r})};const pe=(t,s,r,b,K)=>{const Qe=z.globalSettings?.[t]??false;const me=_.has(t);return i(l,{children:[i(j,{activeOpacity:.7,onPress:()=>fe(t),accessibilityLabel:s,style:o.settingRow,children:[i(l,{style:o.rowInfo,children:[e(c,{style:o.rowLabel,children:s}),e(c,{style:o.rowCaption,numberOfLines:me?0:1,children:r})]}),e(ze,{value:Qe,onValueChange:()=>Ve(t),accessibilityLabel:s})]}),me&&i(l,{style:o.settingRowBody,children:[e(c,{style:o.settingRowBodyText,children:b}),e(c,{style:o.settingRowBodyHint,children:K})]})]},t)};const B=(t,s,r)=>i(l,{children:[e(ut,{children:t}),s,r]});const Ye=T==="filesystem"?e(v,{label:"File System",tone:"accent"}):T==="asyncstorage"?e(v,{label:"Async Storage",tone:"warning"}):T==="localstorage"?e(v,{label:"Local Storage",tone:"accent"}):T==="memory"?e(v,{label:"Memory",tone:"danger"}):e(v,{label:"Loading\u2026",tone:"neutral"});const $e=()=>i(l,{style:o.container,children:[i(be,{style:o.scrollContent,showsVerticalScrollIndicator:false,contentContainerStyle:o.scrollContainer,children:[E==="floating"&&e(H,{children:B("Floating Tools",e(R,{glass:true,children:e(X,{children:Object.entries(z.floatingTools).map(([t,s])=>qe(t,s,false,()=>Ne(t)))})}),e(xe,{children:"Tools switched on here appear in the floating bubble row."}))}),E==="settings"&&i(H,{children:[B("Background",e(R,{glass:true,padded:true,children:e(gt,{embedded:true})})),B("Storage",i(R,{glass:true,children:[i(j,{activeOpacity:.7,onPress:()=>We(!P),accessibilityLabel:"Storage Type",style:o.settingRow,children:[e(l,{style:o.rowInfo,children:e(c,{style:o.rowLabel,children:"Storage Type"})}),Ye,P?e(Te,{size:16,color:n.color.textTertiary}):e(we,{size:16,color:n.color.textTertiary})]}),P&&i(H,{children:[i(l,{style:o.settingRowBody,children:[e(c,{style:o.settingRowBodyText,children:T==="filesystem"?"Settings persist independently and survive AsyncStorage.clear() calls during logout.":T==="asyncstorage"?"Settings may be lost if AsyncStorage is cleared during logout.":T==="localstorage"?"Settings are saved in this browser. Clearing site data removes them.":T==="memory"?"Settings are stored in memory only and will be lost on app restart.":"Checking storage backend\u2026"}),T==="asyncstorage"&&e(c,{style:[o.settingRowBodyText,o.bodyWarning],children:"Install expo-file-system to persist settings through logout flows."}),T==="memory"&&e(c,{style:[o.settingRowBodyText,o.bodyDanger],children:"No persistent storage available \u2014 install expo-file-system (best) or @react-native-async-storage/async-storage."})]}),e(ht,{}),i(l,{style:o.storageExpanded,children:[i(l,{style:o.storageExpandedHeader,children:[e(c,{style:o.storageExpandedTitle,children:"SAVED SETTINGS"}),e(c,{style:o.storageExpandedCount,children:le?"\u2026":`${Y.length} keys`})]}),le?e(c,{style:o.storageKeyEmpty,children:"Loading\u2026"}):Y.length===0?e(c,{style:o.storageKeyEmpty,children:"No settings saved yet"}):e(be,{style:o.storageKeysList,nestedScrollEnabled:true,showsVerticalScrollIndicator:true,children:Y.map(t=>e(l,{style:o.storageKeyItem,children:e(c,{style:o.storageKeyText,numberOfLines:1,children:t.replace("@react_buoy_","")})},t))})]}),e(l,{style:o.cardButtonWrap,children:e(Z,{label:G?"Cleared":U?"Clearing\u2026":"Clear All Settings",variant:G?"secondary":"destructive",size:"md",disabled:U,onPress:_e,icon:G?e(ve,{size:15,color:n.color.accent}):e(ct,{size:15,color:U?n.color.textTertiary:n.color.danger})})})]})]})),w&&w.state!=="idle"&&B("Desktop Sync",i(R,{glass:true,children:[i(j,{activeOpacity:.7,onPress:()=>fe("desktopSync"),accessibilityLabel:"Buoy Desktop",style:o.settingRow,children:[e(l,{style:o.rowInfo,children:e(c,{style:o.rowLabel,children:"Buoy Desktop"})}),w.state==="connected"?e(v,{label:"Connected",tone:"accent"}):w.state==="connecting"?e(v,{label:"Connecting\u2026",tone:"neutral"}):e(v,{label:"Retrying",tone:"warning"}),_.has("desktopSync")?e(Te,{size:16,color:n.color.textTertiary}):e(we,{size:16,color:n.color.textTertiary})]}),_.has("desktopSync")&&i(l,{style:o.settingRowBody,children:[i(c,{style:o.settingRowBodyText,children:[w.state==="connected"?"Streaming tool data to Buoy Desktop at ":"Trying to reach Buoy Desktop at ",e(c,{style:o.footnoteMono,children:w.targetURL??"(unknown URL)"}),w.state!=="connected"&&" \u2014 is the desktop app running? Override with the externalSync socketURL option if it runs elsewhere."]}),w.state==="retrying"&&w.lastError&&i(c,{style:[o.settingRowBodyText,o.bodyWarning],children:["Last error: ",w.lastError]})]})]})),B("Modal Behavior",e(R,{glass:true,children:i(X,{children:[pe("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."),It(Ze.OS==="web")?pe("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]})}))]}),E==="pro"&&i(H,{children:[B("License",i(R,{glass:true,children:[i(l,{style:o.settingRow,children:[e(l,{style:o.rowInfo,children:e(c,{style:o.rowLabel,children:"License Status"})}),e(l,{testID:"buoy-settings-license-status",accessibilityLabel:k?"License: Active":"License: Free",children:k?e(v,{label:"Active",tone:"accent"}):e(v,{label:"Free",tone:"neutral"})})]}),I?.tierSource==="session"?i(l,{style:o.settingRow,children:[e(l,{style:o.rowInfo,children:e(c,{style:o.rowLabel,children:"Signed in with Buoy"})}),e(Z,{label:"Sign out",variant:"secondary",size:"md",onPress:()=>void lt(),testID:"buoy-settings-signout"})]}):null,I?.teamRole?e(l,{style:o.settingRow,testID:"buoy-settings-team-role",children:i(l,{style:o.rowInfo,children:[i(c,{style:o.rowLabel,children:["Role: ",I.teamRole]}),e(c,{style:o.rowCaption,children:I.allowedTools?"Your team picks the tools you see.":"You see all tools."})]})}):null]}),e(xe,{children:k?"You have full access to all Buoy DevTools features.":J?Me?`Couldn't reach the license server (${J}). A VPN or corporate proxy can block buoy.gg \u2014 turn it off and reload. Your key hasn't been rejected.`:`License check failed: ${J}.`:"Upgrade to Pro to unlock all features and support development."})),!k&&i(H,{children:[B("Pro Features",e(R,{glass:true,children:e(X,{children:["Advanced Settings","Priority Support"].map(t=>i(l,{style:o.featureRow,children:[e(ve,{size:16,color:n.color.accent}),e(c,{style:o.rowLabel,children:t})]},t))})})),e(Z,{label:"Upgrade to Pro",variant:"primary",size:"lg",onPress:()=>re(true)})]})]})]}),e(dt,{visible:Fe,onClose:()=>re(false)})]});return e(xt,{visible:y,onClose:h,zIndex:p,variant:"night",header:{showToggleButton:false,customContent:e(l,{style:o.headerRow,children:e(yt,{glass:true,tabs:[{key:"floating",label:"Floating"},{key:"settings",label:"Settings"},{key:"pro",label:"Pro"}],activeKey:E,onChange:t=>ne(t)})})},initialMode:"bottomSheet",onModeChange:Je,persistenceKey:ee.settings.root(),enablePersistence:true,maxHeight:ge-de.top,initialHeight:Ae,initialFloatingPosition:{x:(ue-je)/2,y:de.top+20},enableGlitchEffects:true,children:$e()})};const Rt={dialTools:{},floatingTools:{environment:false},globalSettings:{enableSharedModalDimensions:false}};const Et=(y,h)=>{const a=new Set(y??[]);const f=new Set(h??[]);const d={};for(const p of f){d[p]=true}const g={environment:a.has("environment")};for(const p of a){if(p!=="environment"){g[p]=true}}return{dialTools:V(d),floatingTools:g,globalSettings:{enableSharedModalDimensions:false}}};let M=null;let te=null;let De=null;const Re=(y,h)=>JSON.stringify(y)===JSON.stringify(h);N.addListener(y=>{if(y)M=y});export const useDevToolsSettings=()=>{const{defaultFloatingTools:y,defaultDialTools:h}=Le();const a=A(()=>{if(!y&&!h){return Rt}return Et(y,h)},[y,h]);const[f,d]=S(a);const g=W(async()=>{try{const m=await D.getItem(O);if(m){const x=JSON.parse(m);const u=Be(a,x);d(u);return}d(a)}catch(m){console.error("[Buoy]","Failed to load dev tools settings:",m);d(a)}},[a]);C(()=>zt(m=>{if(m.includes(O))void g()}),[g]);C(()=>{g();const m=N.addListener(x=>{try{if(x){d(x)}}catch(u){}});return()=>{m()}},[g]);const p=W(()=>{g()},[g]);return{settings:f,refreshSettings:p}};const o=Xe.create({container:{flex:1,backgroundColor:"transparent"},headerRow:{flexDirection:"row",alignItems:"center",paddingLeft:n.gutter,paddingRight:n.gutter,paddingBottom:8},scrollContent:{flex:1},scrollContainer:{paddingHorizontal:n.gutter,paddingTop:8,paddingBottom:24,gap:n.groupGap},toolRow:{flexDirection:"row",alignItems:"center",gap:12,paddingHorizontal:n.rowPadH,paddingVertical:12},settingRow:{flexDirection:"row",alignItems:"center",gap:10,paddingHorizontal:n.rowPadH,paddingVertical:n.rowPadV,minHeight:52},featureRow:{flexDirection:"row",alignItems:"center",gap:10,paddingHorizontal:n.rowPadH,paddingVertical:12},rowDisabled:{opacity:.4},toolIconSlot:{width:24,alignItems:"center"},rowInfo:{flex:1,gap:2},rowLabel:{color:n.color.text,fontSize:n.font.row,fontWeight:"500"},rowCaption:{color:n.color.textTertiary,fontSize:n.font.label},settingRowBody:{paddingHorizontal:n.rowPadH,paddingBottom:n.rowPadV,gap:6},settingRowBodyText:{color:n.color.textSecondary,fontSize:n.font.caption,lineHeight:n.font.caption*1.45},settingRowBodyHint:{color:n.color.textTertiary,fontSize:n.font.caption,lineHeight:n.font.caption*1.45},bodyWarning:{color:n.color.warning},bodyDanger:{color:n.color.danger},cardButtonWrap:{paddingHorizontal:n.cardPad,paddingTop:10,paddingBottom:n.cardPad},storageExpanded:{paddingHorizontal:n.rowPadH,paddingVertical:12,gap:8},storageExpandedHeader:{flexDirection:"row",alignItems:"center"},storageExpandedTitle:{flex:1,color:n.color.textSecondary,fontSize:n.font.micro,fontWeight:"600",letterSpacing:.5},storageExpandedCount:{color:n.color.textTertiary,fontSize:n.font.micro},storageKeysList:{maxHeight:150},storageKeyItem:{backgroundColor:n.color.glassElevated,borderRadius:n.radius.segment,paddingHorizontal:10,paddingVertical:7,marginBottom:4},storageKeyText:{color:n.color.textSecondary,fontSize:n.font.micro,fontFamily:Ie},storageKeyEmpty:{color:n.color.textTertiary,fontSize:n.font.caption,fontStyle:"italic"},footnoteMono:{fontFamily:Ie,fontSize:n.font.label,color:n.color.textSecondary}});
|
|
1
|
+
"use strict";import{useState as S,useEffect as C,useCallback as W,useMemo as A}from"react";import{View as l,Text as c,StyleSheet as Xe,ScrollView as be,TouchableOpacity as j,Dimensions as Se,Platform as Ze}from"react-native";import{settingsBus as N}from"./settingsBus.js";import{useDesktopSyncStatus as et}from"./useDesktopSyncStatus";import{SentryIcon as tt,WifiCircuitIcon as ot,ImageOverlayIcon as nt,RenderCountIcon as st,Info as Q,Layers as rt,ChevronRightIcon as we,ChevronDown as Te,getStorageBackendType as it,getUseLicense as at,signOutOfBuoy as lt,persistentStorage as D,Trash2 as ct,CheckCircle2 as ve,BuoyUpgradeSheet as dt,BackgroundSwitcher as gt,night as n,NightCard as R,NightRows as X,NightSectionLabel as ut,NightFootnote as xe,NightSwitch as ze,NightButton as Z,NightSegmented as yt,NightBadge as v,NightSeparator as ht,monoFont as Ie}from"@buoy-gg/shared-ui";import{EnvIcon as Ce,StorageIcon as ft,RoutesIcon as pt,NetworkIcon as mt,QueryIcon as bt,HighlighterIcon as St,ReduxIcon as wt,EventsIcon as Tt}from"@buoy-gg/floating-tools-core";import{useDefaultConfig as Le}from"./DefaultConfigContext.js";import{renderAppIcon as vt}from"./AppIcon";import{JsModal as xt,devToolsStorageKeys as ee,onSettingsApplied as zt,expandableWindowControlsSupported as It}from"@buoy-gg/shared-ui";import{useSafeAreaInsets as Ct}from"@buoy-gg/shared-ui";import{jsx as e,jsxs as i,Fragment as H}from"react/jsx-runtime";const O="@react_buoy_dev_tools_settings";const Lt=6;const V=y=>{let h=Lt;const a={};for(const[f,d]of Object.entries(y)){if(d&&h>0){a[f]=true;h-=1}else{a[f]=false}}return a};const Bt=(y,h)=>{const{userStatus:a,environment:f,...d}=y;const g=h?Object.entries(d).filter(([p])=>h.includes(p)):Object.entries(d);return{...Object.fromEntries(g),environment:f??false}};const Be=(y,h,a)=>{if(!h)return y;const f={...y.dialTools,...h.dialTools??{}};const d=a?.allowedDialKeys?Object.entries(f).filter(([p])=>a.allowedDialKeys?.includes(p)):Object.entries(f);const g=V(Object.fromEntries(d));return{dialTools:g,floatingTools:Bt({...y.floatingTools,...h.floatingTools??{}},a?.allowedFloatingKeys),globalSettings:{enableSharedModalDimensions:false,expandableWindowControls:true,...h.globalSettings??{}}}};const Dt=(y=[],h,a)=>{const f={};const d={};const g=new Set(h??[]);const p=new Set(a??[]);const m=!a||a.length===0;for(const x of y){const{id:u,slot:L="both"}=x;if(L==="dial"||L==="both"){f[u]=m?true:p.has(u)}if(L==="row"||L==="both"){d[u]=g.has(u)}}return{dialTools:V(f),floatingTools:{...d,environment:g.has("environment")},globalSettings:{enableSharedModalDimensions:false,expandableWindowControls:true}}};export const DevToolsSettingsModal=({visible:y,onClose:h,onSettingsChange:a,initialSettings:f,availableApps:d=[],storage:g=D,zIndex:p})=>{const{defaultFloatingTools:m,defaultDialTools:x}=Le();const u=A(()=>Dt(d,m,x),[d,m,x]);const L=A(()=>Object.keys(u.dialTools),[u]);const oe=A(()=>Object.keys(u.floatingTools).filter(t=>t!=="environment"),[u]);const[z,F]=S(f||M||u);const[E,ne]=S(te??"floating");const[se,Ee]=S(te!==null);const[_,Oe]=S(new Set);const[Fe,re]=S(false);const[ke,Pe]=S(false);C(()=>{const t=requestAnimationFrame(()=>Pe(true));return()=>cancelAnimationFrame(t)},[]);const w=et();C(()=>{const t=async()=>{try{const s=await D.getItem(ee.settings.activeTab());if(s&&["floating","settings","pro"].includes(s)){const r=s;te=r;ne(b=>b===r?b:r)}}catch(s){}finally{Ee(true)}};t()},[]);C(()=>{if(!se)return;D.setItem(ee.settings.activeTab(),E).catch(t=>{console.warn("[Buoy]","Failed to save settings active tab:",t)})},[E,se]);const He=at();const I=He?.();const k=I?.isPro??false;const J=!k&&I?.licenseKey?I.error:null;const Me=I?.errorKind==="transport";const[T,Ke]=S(De);const[U,ie]=S(false);const[G,q]=S(false);const[P,We]=S(false);const[Y,ae]=S([]);const[le,ce]=S(false);const de=Ct();const ge=Se.get("window").height;const ue=Se.get("window").width;const Ae=Math.floor(ge*.33);const je=Math.min(ue-32,400);const ye=W(async()=>{try{const t=await g.getItem(O);if(t){const s=JSON.parse(t);const r=Be(u,s,{allowedDialKeys:L,allowedFloatingKeys:oe});M=r;F(b=>Re(b,r)?b:r);return}M=u;F(s=>Re(s,u)?s:u)}catch(t){console.error("[Buoy]","Failed to load dev tools settings:",t);F(u)}},[u,L,oe,g]);C(()=>{ye()},[ye]);C(()=>{it().then(t=>{De=t;Ke(s=>s===t?s:t)})},[]);C(()=>{if(P){ce(true);D.getAllKeys().then(t=>{ae(t.sort())}).catch(()=>{ae([])}).finally(()=>{ce(false)})}},[P]);const he=async t=>{try{let s=null;try{const b=await g?.getItem(O);s=b?JSON.parse(b):null}catch{}const r={...t,dialTools:{...s?.dialTools,...V(t.dialTools)},floatingTools:{...s?.floatingTools,...t.floatingTools}};await g.setItem(O,JSON.stringify(r));M=r;F(r);a?.(r);N.emit(r)}catch(s){console.error("[Buoy]","Failed to save dev tools settings:",s)}};const Ne=t=>{const s={...z,floatingTools:{...z.floatingTools,[t]:!z.floatingTools[t]}};he(s)};const Ve=t=>{const s={...z,globalSettings:{...z.globalSettings,[t]:!z.globalSettings?.[t]}};he(s)};const _e=async()=>{ie(true);q(false);try{await D.clear();q(true);F(u);if(g!==D)await g.setItem(O,JSON.stringify(u));a?.(u);N.emit(u);setTimeout(()=>q(false),2e3)}catch(t){console.error("[Buoy]","Failed to clear storage:",t)}finally{ie(false)}};const Je=W(t=>{},[]);const Ue=t=>{const s=d.find(r=>r.id===t);if(s?.description){return s.description}if(t==="environment"){return"Environment badge."}return""};const $=t=>{if(t==="environment"){return"Env Badge"}const s=d.find(r=>r.id===t);return s?.name??t.toUpperCase().replace(/_/g," ")};const Ge=t=>{if(!ke)return null;switch(t){case"query":return e(bt,{size:18});case"env":return e(Ce,{size:18});case"sentry":return e(tt,{size:18,color:"#9945FF"});case"storage":return e(ft,{size:18,bgColor:n.color.surface});case"wifi":case"query-wifi-toggle":return e(ot,{size:18,colorPreset:"green",strength:4,noBackground:true});case"route-events":return e(pt,{size:18,bgColor:n.color.surface});case"network":return e(mt,{size:18});case"environment":return e(Ce,{size:18});case"debug-borders":return e(rt,{size:18,color:n.color.accent});case"highlight-updates":return e(st,{size:18,color:n.color.accent});case"highlight-updates-modal":return e(St,{size:18});case"redux":return e(wt,{size:18});case"image-overlay":return e(nt,{size:18});case"events":return e(Tt,{size:18});case"zustand":try{const{ZustandIcon:s}=require("@buoy-gg/zustand");return e(s,{size:18})}catch{return e(Q,{size:18,color:n.color.textSecondary})}case"jotai":try{const{JotaiIcon:s}=require("@buoy-gg/jotai");return e(s,{size:18})}catch{return e(Q,{size:18,color:n.color.textSecondary})}default:{const s=d.find(r=>r.id===t);if(s?.icon!=null){return vt(s.icon,{slot:"row",size:18,color:s.color})}return e(Q,{size:18,color:n.color.textSecondary})}}};const qe=(t,s,r,b)=>{const K=Ue(t);return i(j,{activeOpacity:r?1:.7,onPress:()=>!r&&b(),accessibilityLabel:$(t),accessibilityRole:"button",style:[o.toolRow,r&&o.rowDisabled],children:[e(l,{style:o.toolIconSlot,children:Ge(t)}),i(l,{style:o.rowInfo,children:[i(c,{style:o.rowLabel,children:[$(t),r?" \xB7 max 6":""]}),K?e(c,{style:o.rowCaption,numberOfLines:1,children:K}):null]}),e(ze,{value:s,disabled:r,onValueChange:()=>b(),accessibilityLabel:$(t)})]},t)};const fe=t=>{Oe(s=>{const r=new Set(s);if(r.has(t)){r.delete(t)}else{r.add(t)}return r})};const pe=(t,s,r,b,K)=>{const Qe=z.globalSettings?.[t]??false;const me=_.has(t);return i(l,{children:[i(j,{activeOpacity:.7,onPress:()=>fe(t),accessibilityLabel:s,style:o.settingRow,children:[i(l,{style:o.rowInfo,children:[e(c,{style:o.rowLabel,children:s}),e(c,{style:o.rowCaption,numberOfLines:me?0:1,children:r})]}),e(ze,{value:Qe,onValueChange:()=>Ve(t),accessibilityLabel:s})]}),me&&i(l,{style:o.settingRowBody,children:[e(c,{style:o.settingRowBodyText,children:b}),e(c,{style:o.settingRowBodyHint,children:K})]})]},t)};const B=(t,s,r)=>i(l,{children:[e(ut,{children:t}),s,r]});const Ye=T==="filesystem"?e(v,{label:"File System",tone:"accent"}):T==="asyncstorage"?e(v,{label:"Async Storage",tone:"warning"}):T==="localstorage"?e(v,{label:"Local Storage",tone:"accent"}):T==="memory"?e(v,{label:"Memory",tone:"danger"}):e(v,{label:"Loading\u2026",tone:"neutral"});const $e=()=>i(l,{style:o.container,children:[i(be,{keyboardShouldPersistTaps:"handled",style:o.scrollContent,showsVerticalScrollIndicator:false,contentContainerStyle:o.scrollContainer,children:[E==="floating"&&e(H,{children:B("Floating Tools",e(R,{glass:true,children:e(X,{children:Object.entries(z.floatingTools).map(([t,s])=>qe(t,s,false,()=>Ne(t)))})}),e(xe,{children:"Tools switched on here appear in the floating bubble row."}))}),E==="settings"&&i(H,{children:[B("Background",e(R,{glass:true,padded:true,children:e(gt,{embedded:true})})),B("Storage",i(R,{glass:true,children:[i(j,{activeOpacity:.7,onPress:()=>We(!P),accessibilityLabel:"Storage Type",style:o.settingRow,children:[e(l,{style:o.rowInfo,children:e(c,{style:o.rowLabel,children:"Storage Type"})}),Ye,P?e(Te,{size:16,color:n.color.textTertiary}):e(we,{size:16,color:n.color.textTertiary})]}),P&&i(H,{children:[i(l,{style:o.settingRowBody,children:[e(c,{style:o.settingRowBodyText,children:T==="filesystem"?"Settings persist independently and survive AsyncStorage.clear() calls during logout.":T==="asyncstorage"?"Settings may be lost if AsyncStorage is cleared during logout.":T==="localstorage"?"Settings are saved in this browser. Clearing site data removes them.":T==="memory"?"Settings are stored in memory only and will be lost on app restart.":"Checking storage backend\u2026"}),T==="asyncstorage"&&e(c,{style:[o.settingRowBodyText,o.bodyWarning],children:"Install expo-file-system to persist settings through logout flows."}),T==="memory"&&e(c,{style:[o.settingRowBodyText,o.bodyDanger],children:"No persistent storage available \u2014 install expo-file-system (best) or @react-native-async-storage/async-storage."})]}),e(ht,{}),i(l,{style:o.storageExpanded,children:[i(l,{style:o.storageExpandedHeader,children:[e(c,{style:o.storageExpandedTitle,children:"SAVED SETTINGS"}),e(c,{style:o.storageExpandedCount,children:le?"\u2026":`${Y.length} keys`})]}),le?e(c,{style:o.storageKeyEmpty,children:"Loading\u2026"}):Y.length===0?e(c,{style:o.storageKeyEmpty,children:"No settings saved yet"}):e(be,{keyboardShouldPersistTaps:"handled",style:o.storageKeysList,nestedScrollEnabled:true,showsVerticalScrollIndicator:true,children:Y.map(t=>e(l,{style:o.storageKeyItem,children:e(c,{style:o.storageKeyText,numberOfLines:1,children:t.replace("@react_buoy_","")})},t))})]}),e(l,{style:o.cardButtonWrap,children:e(Z,{label:G?"Cleared":U?"Clearing\u2026":"Clear All Settings",variant:G?"secondary":"destructive",size:"md",disabled:U,onPress:_e,icon:G?e(ve,{size:15,color:n.color.accent}):e(ct,{size:15,color:U?n.color.textTertiary:n.color.danger})})})]})]})),w&&w.state!=="idle"&&B("Desktop Sync",i(R,{glass:true,children:[i(j,{activeOpacity:.7,onPress:()=>fe("desktopSync"),accessibilityLabel:"Buoy Desktop",style:o.settingRow,children:[e(l,{style:o.rowInfo,children:e(c,{style:o.rowLabel,children:"Buoy Desktop"})}),w.state==="connected"?e(v,{label:"Connected",tone:"accent"}):w.state==="connecting"?e(v,{label:"Connecting\u2026",tone:"neutral"}):e(v,{label:"Retrying",tone:"warning"}),_.has("desktopSync")?e(Te,{size:16,color:n.color.textTertiary}):e(we,{size:16,color:n.color.textTertiary})]}),_.has("desktopSync")&&i(l,{style:o.settingRowBody,children:[i(c,{style:o.settingRowBodyText,children:[w.state==="connected"?"Streaming tool data to Buoy Desktop at ":"Trying to reach Buoy Desktop at ",e(c,{style:o.footnoteMono,children:w.targetURL??"(unknown URL)"}),w.state!=="connected"&&" \u2014 is the desktop app running? Override with the externalSync socketURL option if it runs elsewhere."]}),w.state==="retrying"&&w.lastError&&i(c,{style:[o.settingRowBodyText,o.bodyWarning],children:["Last error: ",w.lastError]})]})]})),B("Modal Behavior",e(R,{glass:true,children:i(X,{children:[pe("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."),It(Ze.OS==="web")?pe("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]})}))]}),E==="pro"&&i(H,{children:[B("License",i(R,{glass:true,children:[i(l,{style:o.settingRow,children:[e(l,{style:o.rowInfo,children:e(c,{style:o.rowLabel,children:"License Status"})}),e(l,{testID:"buoy-settings-license-status",accessibilityLabel:k?"License: Active":"License: Free",children:k?e(v,{label:"Active",tone:"accent"}):e(v,{label:"Free",tone:"neutral"})})]}),I?.tierSource==="session"?i(l,{style:o.settingRow,children:[e(l,{style:o.rowInfo,children:e(c,{style:o.rowLabel,children:"Signed in with Buoy"})}),e(Z,{label:"Sign out",variant:"secondary",size:"md",onPress:()=>void lt(),testID:"buoy-settings-signout"})]}):null,I?.teamRole?e(l,{style:o.settingRow,testID:"buoy-settings-team-role",children:i(l,{style:o.rowInfo,children:[i(c,{style:o.rowLabel,children:["Role: ",I.teamRole]}),e(c,{style:o.rowCaption,children:I.allowedTools?"Your team picks the tools you see.":"You see all tools."})]})}):null]}),e(xe,{children:k?"You have full access to all Buoy DevTools features.":J?Me?`Couldn't reach the license server (${J}). A VPN or corporate proxy can block buoy.gg \u2014 turn it off and reload. Your key hasn't been rejected.`:`License check failed: ${J}.`:"Upgrade to Pro to unlock all features and support development."})),!k&&i(H,{children:[B("Pro Features",e(R,{glass:true,children:e(X,{children:["Advanced Settings","Priority Support"].map(t=>i(l,{style:o.featureRow,children:[e(ve,{size:16,color:n.color.accent}),e(c,{style:o.rowLabel,children:t})]},t))})})),e(Z,{label:"Upgrade to Pro",variant:"primary",size:"lg",onPress:()=>re(true)})]})]})]}),e(dt,{visible:Fe,onClose:()=>re(false)})]});return e(xt,{visible:y,onClose:h,zIndex:p,variant:"night",header:{showToggleButton:false,customContent:e(l,{style:o.headerRow,children:e(yt,{glass:true,tabs:[{key:"floating",label:"Floating"},{key:"settings",label:"Settings"},{key:"pro",label:"Pro"}],activeKey:E,onChange:t=>ne(t)})})},initialMode:"bottomSheet",onModeChange:Je,persistenceKey:ee.settings.root(),enablePersistence:true,maxHeight:ge-de.top,initialHeight:Ae,initialFloatingPosition:{x:(ue-je)/2,y:de.top+20},enableGlitchEffects:true,children:$e()})};const Rt={dialTools:{},floatingTools:{environment:false},globalSettings:{enableSharedModalDimensions:false}};const Et=(y,h)=>{const a=new Set(y??[]);const f=new Set(h??[]);const d={};for(const p of f){d[p]=true}const g={environment:a.has("environment")};for(const p of a){if(p!=="environment"){g[p]=true}}return{dialTools:V(d),floatingTools:g,globalSettings:{enableSharedModalDimensions:false}}};let M=null;let te=null;let De=null;const Re=(y,h)=>JSON.stringify(y)===JSON.stringify(h);N.addListener(y=>{if(y)M=y});export const useDevToolsSettings=()=>{const{defaultFloatingTools:y,defaultDialTools:h}=Le();const a=A(()=>{if(!y&&!h){return Rt}return Et(y,h)},[y,h]);const[f,d]=S(a);const g=W(async()=>{try{const m=await D.getItem(O);if(m){const x=JSON.parse(m);const u=Be(a,x);d(u);return}d(a)}catch(m){console.error("[Buoy]","Failed to load dev tools settings:",m);d(a)}},[a]);C(()=>zt(m=>{if(m.includes(O))void g()}),[g]);C(()=>{g();const m=N.addListener(x=>{try{if(x){d(x)}}catch(u){}});return()=>{m()}},[g]);const p=W(()=>{g()},[g]);return{settings:f,refreshSettings:p}};const o=Xe.create({container:{flex:1,backgroundColor:"transparent"},headerRow:{flexDirection:"row",alignItems:"center",paddingLeft:n.gutter,paddingRight:n.gutter,paddingBottom:8},scrollContent:{flex:1},scrollContainer:{paddingHorizontal:n.gutter,paddingTop:8,paddingBottom:24,gap:n.groupGap},toolRow:{flexDirection:"row",alignItems:"center",gap:12,paddingHorizontal:n.rowPadH,paddingVertical:12},settingRow:{flexDirection:"row",alignItems:"center",gap:10,paddingHorizontal:n.rowPadH,paddingVertical:n.rowPadV,minHeight:52},featureRow:{flexDirection:"row",alignItems:"center",gap:10,paddingHorizontal:n.rowPadH,paddingVertical:12},rowDisabled:{opacity:.4},toolIconSlot:{width:24,alignItems:"center"},rowInfo:{flex:1,gap:2},rowLabel:{color:n.color.text,fontSize:n.font.row,fontWeight:"500"},rowCaption:{color:n.color.textTertiary,fontSize:n.font.label},settingRowBody:{paddingHorizontal:n.rowPadH,paddingBottom:n.rowPadV,gap:6},settingRowBodyText:{color:n.color.textSecondary,fontSize:n.font.caption,lineHeight:n.font.caption*1.45},settingRowBodyHint:{color:n.color.textTertiary,fontSize:n.font.caption,lineHeight:n.font.caption*1.45},bodyWarning:{color:n.color.warning},bodyDanger:{color:n.color.danger},cardButtonWrap:{paddingHorizontal:n.cardPad,paddingTop:10,paddingBottom:n.cardPad},storageExpanded:{paddingHorizontal:n.rowPadH,paddingVertical:12,gap:8},storageExpandedHeader:{flexDirection:"row",alignItems:"center"},storageExpandedTitle:{flex:1,color:n.color.textSecondary,fontSize:n.font.micro,fontWeight:"600",letterSpacing:.5},storageExpandedCount:{color:n.color.textTertiary,fontSize:n.font.micro},storageKeysList:{maxHeight:150},storageKeyItem:{backgroundColor:n.color.glassElevated,borderRadius:n.radius.segment,paddingHorizontal:10,paddingVertical:7,marginBottom:4},storageKeyText:{color:n.color.textSecondary,fontSize:n.font.micro,fontFamily:Ie},storageKeyEmpty:{color:n.color.textTertiary,fontSize:n.font.caption,fontStyle:"italic"},footnoteMono:{fontFamily:Ie,fontSize:n.font.label,color:n.color.textSecondary}});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";import{FloatingToolHost as
|
|
1
|
+
"use strict";import{FloatingToolHost as ge}from"@buoy-gg/shared-ui";import{AccountSetup as ye,setBuoyAppId as pe,startSettingsSync as de}from"@buoy-gg/shared-ui";import Ke,{useMemo as t,useCallback as me,useEffect as f}from"react";import{View as X,StyleSheet as Y}from"react-native";import{AppHostProvider as fe}from"./AppHost";import{TeamToolCloser as be}from"./TeamToolCloser.js";import{NO_TEAM_TOOLS_NOTE as ve}from"./teamToolsNote.js";import{FloatingMenu as he}from"./FloatingMenu.js";import{AppOverlay as Oe}from"./AppHost";import{ToolOpenerBridge as Te}from"./ToolOpenerBridge.js";import{autoDiscoverPresets as Ae,autoDiscoverPresetsWithCustom as Re}from"./autoDiscoverPresets.js";import{sendInstallPing as qe}from"../telemetry/installPing.js";import{defaultLicenseKey as Ie,isTelemetryEnabled as _e}from"../Buoy.js";import{renderAppIcon as Ee}from"./AppIcon";import{DevToolsVisibilityProvider as ke}from"./DevToolsVisibilityContext.js";import{reportOptionalRequireError as o}from"./optionalRequire.js";import{HintsProvider as xe,normalizeEnvironment as Pe}from"@buoy-gg/shared-ui";import{MinimizedToolsProvider as Se}from"./MinimizedToolsContext.js";import{validateDialConfig as De}from"./defaultConfig.js";import{DefaultConfigProvider as Le}from"./DefaultConfigContext.js";import{LicenseManager as Me,useProAccess as Ce,useLicense as ze,sameLicenseKey as je}from"@buoy-gg/license";import*as we from"@buoy-gg/license";import{filterTeamTools as Be}from"@buoy-gg/floating-tools-core";import{BuoySignIn as Z}from"./BuoySignIn";import{AutoExternalSync as ee,ToolRegistryPublisher as Fe,isExternalSyncAvailable as He}from"./autoExternalSync.js";import{externalSyncOptions as w,releaseTransportProblem as Ne,shouldMountExternalSync as Ve}from"./externalSyncGate.js";import{jsx as r,Fragment as E,jsxs as b}from"react/jsx-runtime";let re=null;function Ue(i){if(!i||i===re)return;re=i;console.warn("[Buoy]",i)}function te(i){if(i&&typeof i==="object"&&i.appId)return i.appId;try{const{Platform:s}=require("react-native");const u=require("expo-constants");const l=(u?.default??u)?.expoConfig;const v=s.OS==="android"?l?.android?.package:l?.ios?.bundleIdentifier;if(typeof v==="string"&&v)return v}catch{}try{const s=require("expo-application");const u=(s?.default??s)?.applicationId;if(typeof u==="string"&&u)return u}catch{}return null}export const FloatingDevTools=({apps:i,requiredEnvVars:s,requiredStorageKeys:u,askBuoy:l,children:v,disableHints:oe=false,defaultFloatingTools:ne,defaultDialTools:O,requireLicense:Qe,licenseKey:T,zustandStores:k,environment:ie,externalSync:A=true,headless:x=false,signIn:R,...B})=>{const se=ie??Pe(process.env.NODE_ENV??"dev");const{isLicensed:q}=Ce();const{licenseKey:P,isInitialized:F,tier:I,access:c,allowedTools:_}=ze();const ue=T===void 0||je(T,P);const S=ue&&c.status==="admitted";f(()=>{if(!F||c.status==="initializing")return;void qe({tier:c.status==="admitted"?I:"locked",enabled:_e()})},[F,c.status,I]);const h=R?te(R):null;f(()=>{if(!h)return;const e=we.SessionManager;if(!e)return;e.configure({audience:`app:${h}`});void e.load().catch(()=>{})},[h]);f(()=>{pe(h??te(true))},[h]);f(()=>{void Me.configure(T??Ie()).catch(()=>{})},[T]);f(()=>{if(S)de()},[S]);f(()=>{if(!k||c.status==="locked")return;try{const{watchStores:e}=require("@buoy-gg/zustand");return e(k)}catch(e){o("@buoy-gg/zustand",e)}},[k,c.status]);const ce=t(()=>{if(O){return De(O)}return O},[O]);const D=t(()=>{const e=[];if(s&&s.length>0){try{const{createEnvTool:n,createEnvVarConfig:j}=require("@buoy-gg/env");e.push(n({requiredEnvVars:j(s)}))}catch(n){o("@buoy-gg/env",n)}}if(u&&u.length>0){try{const{createStorageTool:n}=require("@buoy-gg/storage");e.push(n({requiredStorageKeys:u}))}catch(n){o("@buoy-gg/storage",n)}}if(l){try{const{createAskBuoyTool:n}=require("@buoy-gg/ask-buoy");e.push(n(l))}catch(n){o("@buoy-gg/ask-buoy",n)}}return e},[s,u,l]);const L=t(()=>{if(!i&&D.length===0)return void 0;return[...i||[],...D]},[i,D]);const a=t(()=>L?Re(L):Ae(),[L]);const M=t(()=>a.filter(e=>e.sync),[a]);const le=t(()=>Be(a,_),[a,_]);const H=t(()=>{try{const{DebugBordersStandaloneOverlay:e}=require("@buoy-gg/debug-borders");return e}catch(e){o("@buoy-gg/debug-borders",e);return null}},[]);const N=t(()=>{try{const{HighlightUpdatesOverlay:e}=require("@buoy-gg/highlight-updates");return e}catch(e){o("@buoy-gg/highlight-updates",e);return null}},[]);const V=t(()=>{try{const{ImageOverlayStandalone:e}=require("@buoy-gg/image-overlay");return e}catch(e){o("@buoy-gg/image-overlay",e);return null}},[]);const U=t(()=>{try{const{PerfMonitorOverlay:e}=require("@buoy-gg/perf-monitor");return e}catch(e){o("@buoy-gg/perf-monitor",e);return null}},[]);const J=t(()=>{try{const{JsTopHudOverlay:e}=require("@buoy-gg/js-top");return e}catch(e){o("@buoy-gg/js-top",e);return null}},[]);const g=t(()=>{try{const{RouteTracker:e}=require("@buoy-gg/route-events");return e}catch(e){o("@buoy-gg/route-events",e);return null}},[]);const y=t(()=>{try{const{ReactQueryTracker:e}=require("@buoy-gg/react-query");return e}catch(e){o("@buoy-gg/react-query",e);return null}},[]);const Q=t(()=>{try{const{ImpersonateOverlay:e}=require("@buoy-gg/impersonate");return e}catch(e){o("@buoy-gg/impersonate",e);return null}},[]);const W=t(()=>{try{const{BugLinksOverlay:e}=require("@buoy-gg/bug-links");return e??null}catch(e){o("@buoy-gg/bug-links",e);return null}},[]);const $=t(()=>{try{const{ScenariosOverlay:e}=require("@buoy-gg/scenarios");return e}catch(e){o("@buoy-gg/scenarios",e);return null}},[]);const p=t(()=>{try{const{ReduxAutoInstrument:e}=require("@buoy-gg/redux");return e??null}catch(e){o("@buoy-gg/redux",e);return null}},[]);const d=t(()=>{try{const{ConsoleRoot:e}=require("@buoy-gg/console");return e??null}catch(e){o("@buoy-gg/console",e);return null}},[]);const m=t(()=>{try{const{OtaInspectorRoot:e}=require("@buoy-gg/ota-inspector");return e??null}catch(e){o("@buoy-gg/ota-inspector",e);return null}},[]);const ae=me(e=>{const n=a.find(j=>j.id===e);if(!n)return null;return Ee(n.icon,{slot:"dial",size:20,color:n.color})},[a]);const C=typeof __DEV__!=="undefined"&&__DEV__;if(!C&&!q){return R&&!x?r(Z,{needsPlan:true}):null}const G=Ve({isDevelopment:C,isLicensed:q,externalSync:A,isAvailable:He()});const z=w(A);if(!C&&z?.enableInRelease){Ue(Ne(z.socketURL,z))}const K=r(Fe,{requiredEnvVars:s,customApps:M});if(!S){return b(E,{children:[c.status==="initializing"&&b(E,{children:[p&&r(p,{}),d&&r(d,{}),m&&r(m,{}),g&&r(g,{}),y&&r(y,{})]}),!x&&(R?r(Z,{}):r(ye,{}))]})}if(x){return b(E,{children:[p&&r(p,{}),d&&r(d,{}),m&&r(m,{}),g&&r(g,{}),y&&r(y,{}),K,G&&r(ee,{options:w(A),requiredEnvVars:s,isPro:q,tier:I,licenseKey:P,customApps:M})]})}return r(Le,{defaultFloatingTools:ne,defaultDialTools:ce,children:r(xe,{disableHints:oe,children:r(X,{style:Je.container,pointerEvents:"box-none",__buoyDevToolsRoot:true,children:b(ke,{children:[V&&r(X,{style:Y.absoluteFill,pointerEvents:"box-none",collapsable:false,children:r(V,{})}),r(fe,{children:b(Se,{getToolIcon:ae,children:[r(he,{...B,apps:le,emptyNote:_?ve:void 0,environment:se}),B.hidden?null:b(E,{children:[r(Oe,{}),r(ge,{})]}),r(Te,{}),r(be,{allowedTools:_??null})]})}),v,H&&r(H,{}),N&&r(N,{}),U&&r(U,{}),J&&r(J,{}),Q&&r(Q,{}),W&&r(W,{}),$&&r($,{}),p&&r(p,{}),d&&r(d,{}),m&&r(m,{}),g&&r(g,{}),y&&r(y,{}),K,G&&r(ee,{options:w(A),requiredEnvVars:s,isPro:q,tier:I,licenseKey:P,customApps:M})]})})})})};const Je=Y.create({container:{position:"absolute",top:0,left:0,right:0,bottom:0,zIndex:9999}});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";import{BuoyPortal as ke,FloatingToolHost as xe}from"@buoy-gg/shared-ui/floating";import*as Re from"@buoy-gg/license";import{LicenseManager as Be,useLicense as de,sameLicenseKey as Le,resolveDevBuild as Fe,capacitorDebug as je,isCapacitorNative as ue,loadCapacitorAppHost as fe}from"@buoy-gg/license";import{AccountSetup as Ne,HintsProvider as Ve,normalizeEnvironment as ze,registerToolOpener as pe,setBuoyAppId as H,startSettingsSync as Ke}from"@buoy-gg/shared-ui";import{useState as U,useMemo as g,useCallback as D,useEffect as d,useRef as me}from"react";import{useSettings as We,getToolLabel as R,getToolDescription as He,getToolColor as ge}from"@buoy-gg/floating-tools-react";import{persistentStorage as h,devToolsStorageKeys as B,EnvironmentIndicator as Ue,EnvironmentSelectorInline as $e}from"@buoy-gg/shared-ui";import{autoDiscoverWithCustom as Ye,getToolsBySlot as Te}from"../utils/autoDiscoverPresets.web.js";import{filterTeamTools as Ge,isTeamToolAllowed as Qe}from"@buoy-gg/floating-tools-core";import{NO_TEAM_TOOLS_NOTE as Je}from"./teamToolsNote.js";import{FloatingTools as Xe,UserStatus as Ze}from"./floatingTools.web.js";import{DialMenu as qe}from"./dial/DialDevTools.web.js";import{getRankedToolIds as en,recordToolUsage as nn}from"./dial/dialUsageStore.js";import{OnboardingTooltip as on}from"./dial/OnboardingTooltip.web.js";import{SettingsModal as tn}from"./DevToolsSettingsModal.web.js";import{AppHostProvider as sn,AppOverlay as rn,useAppHost as ve}from"./AppHost.web.js";import{MinimizedToolsStack as ln}from"./MinimizedToolsStack.web.js";import{createWebTools as an}from"../utils/createWebTools.js";import{BrowserToolRuntime as cn}from"./BrowserToolRuntime.js";import{clearReleaseOptIn as dn,markReleaseOptIn as un}from"../releaseOptIn.js";import{BuoySignIn as fn}from"./BuoySignIn.web.js";import{defaultLicenseKey as pn}from"../Buoy.js";import{BuoySignIn as ye}from"./BuoyCodeSignIn.js";import{DevToolsVisibilityProvider as mn,useDevToolsVisibility as gn}from"./DevToolsVisibilityContext.js";import{createWebTool as $}from"../utils/createWebTool.js";import{DefaultConfigProvider as Tn}from"./DefaultConfigContext.js";import{useDevToolsSettings as vn}from"./DevToolsSettingsModal.shared.js";import{validateDialConfig as he}from"./defaultConfig.js";import{installedTools as yn,installedToolsFound as hn}from"../installedTools.js";import{jsx as t,jsxs as _,Fragment as Y}from"react/jsx-runtime";const be={};const Oe="@react_buoy_floating_menu_tooltip_shown";const bn=h;function On({size:n=14,color:i="#20C997"}){const s=Math.max(2,n/4);const l=Math.max(1,n/16);return t("div",{style:{display:"grid",gridTemplateColumns:`repeat(3, ${s}px)`,gap:l,width:n,height:n,alignContent:"center",justifyContent:"center"},children:Array.from({length:9}).map((a,r)=>t("div",{style:{width:s,height:s,borderRadius:s/2,backgroundColor:i}},r))})}function Sn(n){const{defaultFloatingTools:i,defaultDialTools:s,disableHints:l=false,children:a}=n;const r=g(()=>s?he(s):s,[s]);return t(Tn,{defaultFloatingTools:i,defaultDialTools:r,children:t(Ve,{disableHints:l,children:_(mn,{children:[t(sn,{children:t(wn,{...n})}),a]})})})}const In=["ReduxAutoInstrument","ConsoleRoot","RouteTracker","ReactQueryTracker"];function Cn({modules:n=be}){return t(Y,{children:Object.entries(n).flatMap(([i,s])=>In.map(l=>{const a=s[l];return a?t(a,{},`${i}:${l}`):null}))})}function Dn(){const{openApps:n,restore:i}=ve();d(()=>pe(s=>{const l=n.find(a=>a.id===s);if(!l)return false;i(l.instanceId);return true}),[n,i]);return null}function An(){const n=je();const i=n===null?process.env.NODE_ENV:n?"development":"production";return ze(i??"dev")}function En(n,i,s,l){const a=M=>Object.entries(n).find(([v])=>v.replace(/^@buoy-gg\//,"").replace(/\/web$/,"")===M)?.[1];const r=[];const c=a("env");if(i?.length&&c?.createEnvTool&&c.createEnvVarConfig){r.push($(c.createEnvTool({requiredEnvVars:c.createEnvVarConfig(i)})))}const p=a("storage");if(s?.length&&p?.createStorageTool){r.push($(p.createStorageTool({requiredStorageKeys:s})))}const A=a("ask-buoy");const b=l==="hosted"?A?.hostedAskBuoy?.():l;if(b&&A?.createAskBuoyTool)r.push($(A.createAskBuoyTool(b)));return r}function wn({environment:n,userRole:i="admin",availableEnvironments:s,onEnvironmentSwitch:l,apps:a,modules:r=be,externalSync:c,requiredEnvVars:p,sentryGetClient:A,disableHints:b=false,headless:M=false,hidden:v=false,defaultFloatingTools:Ie,defaultDialTools:L,zustandStores:F,requiredStorageKeys:G,askBuoy:Q}){const j=n??An();const Ce=g(()=>L?he(L):void 0,[L]);const[m,E]=U(false);const[O,P]=U(false);const N=me(false);const T=ve();const J=g(()=>En(r,p,G,Q),[r,p,G,Q]);const{allowedTools:S}=de();const f=g(()=>Ge(Ye([...an(r),...a??[],...J]),S),[a,r,J,S]);const{openApps:X,close:Z}=T;d(()=>{if(!S)return;for(const e of X){if(!Qe(e.id,S))Z(e.instanceId)}},[X,S,Z]);const V=g(()=>Object.entries(r).find(([e])=>e.replace(/^@buoy-gg\//,"").replace(/\/web$/,"")==="zustand")?.[1],[r]);d(()=>{if(!F||typeof V?.watchStores!=="function")return;const e=V.watchStores(F);return typeof e==="function"?e:void 0},[F,V]);const k=gn();const q=T.openApps.some(e=>!e.minimized);d(()=>{k.setDialOpen(m)},[m,k.setDialOpen]);d(()=>{k.setToolOpen(q||O)},[q,O,k.setToolOpen]);const{registerApps:ee}=T;d(()=>{ee(f.map(e=>{const o=e.icon;return{...e,icon:typeof o==="function"?({size:u})=>o(u):o}}))},[ee,f]);const De=g(()=>f.map(e=>({id:e.id,name:e.name,description:e.description,slot:e.slot})),[f]);We({availableTools:De,storage:bn});d(()=>{let e=false;const o=async()=>{const[u,y]=await Promise.all([h.getItem(B.dial.isOpen()),h.getItem(B.settings.modalOpen())]);if(e)return;if(u==="true")E(true);if(y==="true"){E(true);P(true)}N.current=true};void o();return()=>{e=true}},[]);d(()=>{if(!N.current)return;void h.setItem(B.dial.isOpen(),m?"true":"false")},[m]);d(()=>{if(!N.current)return;void h.setItem(B.settings.modalOpen(),O?"true":"false")},[O]);const w=D(e=>{void nn(e.id);if(e.launchMode==="toggle-only"){e.onPress?.();return}if(e.component){const o=typeof e.icon==="function"?e.icon(20):e.icon;T.open({id:e.id,title:e.name||R(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||ge(e.id)})}else{e.onPress?.()}},[T]);const ne=me({tools:f,openApps:T.openApps,openTool:w});ne.current={tools:f,openApps:T.openApps,openTool:w};d(()=>pe(e=>{const{tools:o,openApps:u,openTool:y}=ne.current;if(u.some(W=>W.id===e))return false;const K=o.find(W=>W.id===e);if(!K||K.launchMode==="toggle-only")return false;y(K);return true}),[]);const x=g(()=>{const e=Te(f,"dial");return e.map(o=>{const u=o.color||ge(o.id);let y;if(typeof o.icon==="string"){y=o.icon}else if(typeof o.icon==="function"){y=o.icon(32)}else{y=null}return{id:o.id,name:o.name||R(o.id),icon:y,unavailable:!o.component&&!o.onPress,color:u,onPress:()=>{w(o);E(false)}}})},[f,w]);const oe=g(()=>{if(!m)return x;const e=new Map(x.map(o=>[o.id,o]));return en(x.map(o=>o.id)).map(o=>e.get(o)).filter(o=>Boolean(o))},[m,x]);const{settings:z}=vn();const Ae=g(()=>Te(f,"row").filter(e=>(z.floatingTools[e.id]??false)===true&&(e.component||e.onPress)),[f,z.floatingTools]);const Ee=g(()=>f.map(e=>({id:e.id,name:e.name||R(e.id),description:e.description||He(e.id),slot:e.slot,icon:e.icon,color:e.color})),[f]);const[we,te]=U(false);const ie=T.openApps.some(e=>!e.minimized);d(()=>{if(b)return;let e=false;const o=setTimeout(async()=>{const u=await h.getItem(Oe);if(!e&&!u)te(true)},1e3);return()=>{e=true;clearTimeout(o)}},[b]);const I=D(()=>{te(false);void h.setItem(Oe,"true")},[]);const se=D(()=>{I();E(true)},[I]);const _e=D(()=>{E(false);P(false)},[]);const Me=D(()=>{P(e=>!e)},[]);const Pe=D(()=>P(false),[]);const re=Boolean(s?.length&&l);const le=z.floatingTools.environment!==false;const C=we&&!m&&!ie&&!v;d(()=>{if(!C)return;const e=u=>{if(!(u.target instanceof Element)||!u.target.closest("[data-buoy-root]"))I()};const o=u=>{if(u.key==="Escape")I()};document.addEventListener("pointerdown",e,true);document.addEventListener("keydown",o);return()=>{document.removeEventListener("pointerdown",e,true);document.removeEventListener("keydown",o)}},[C,I]);const ae=T.openApps.some(e=>e.minimized&&e.launchMode!=="toggle-only");const ce=t(cn,{modules:r,apps:a,requiredEnvVars:p,externalSync:c,headless:M,sentryGetClient:A});if(M)return ce;return _("div",{"data-buoy-root":"",style:{display:"contents"},children:[ce,t(Dn,{}),C&&t("div",{style:{position:"fixed",inset:0,backgroundColor:"rgba(0,0,0,0.85)",zIndex:1e4,pointerEvents:"none"}}),t("div",{style:v?{visibility:"hidden"}:{display:"contents"},"aria-hidden":v||void 0,children:_(Xe,{enablePositionPersistence:!C,pushToSide:m||ie,suspendPointerEvents:m,centerOnboarding:C,minimizedStack:ae?t(ln,{}):void 0,hasMinimizedStack:ae,children:[j&&le&&!re&&t(Ue,{environment:j}),re&&le&&t($e,{currentEnvironment:j??"local",availableEnvironments:s,onSelect:l}),i?t(Ze,{userRole:i,onPress:se}):t("button",{"aria-label":"Open dev tools",onClick:se,style:{display:"flex",alignItems:"center",justifyContent:"center",padding:"6px 8px",background:"none",border:"none",cursor:"pointer"},children:t(On,{})}),Ae.map(e=>t("button",{"aria-label":e.name||R(e.id),title:e.description,onClick:()=>w(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))]})}),C&&t(on,{title:"Welcome to Buoy!",message:"Grab and position this menu wherever you want, then tap the icon to open your tools.",onDismiss:I}),m&&!v&&t(qe,{icons:oe,onClose:_e,centerLabel:"BUOY",onCenterPress:Me,settingsOpen:O,hintsDisabled:b,emptyNote:S&&oe.length===0?Je:void 0}),O&&!v&&t(tn,{visible:true,onClose:Pe,availableTools:Ee,defaultFloatingTools:Ie,defaultDialTools:Ce,onSettingsChange:e=>{}}),!v&&_(Y,{children:[t(rn,{}),t(xe,{})]})]})}function _n(n){const i=n&&typeof n==="object"?n.appId:void 0;const s=!!n;d(()=>{if(!s)return;let l=false;const a=Re.SessionManager;if(!a)return;const r=c=>{if(l||!c)return;a.configure({audience:`app:${c}`});void a.load().catch(()=>{})};if(i)r(i);else void fe().then(c=>r(c?.bundleId)).catch(()=>{});return()=>{l=true}},[s,i])}function Mn(n){const i=n&&typeof n==="object"?n.appId:void 0;d(()=>{let s=false;if(i){H(i)}else if(ue()){void fe().then(l=>{if(!s)H(l?.bundleId)}).catch(()=>{})}else if(typeof location!=="undefined"&&location.origin&&location.origin!=="null"){H(location.origin)}return()=>{s=true}},[i])}let Se=false;function Pn(n){if(n.modules)return n;if(!hn&&!Se&&typeof console!=="undefined"){Se=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:yn}}export function FloatingDevTools(n){return t(ke,{children:t(kn,{...Pn(n)})})}function kn(n){const{access:i,isPro:s,licenseKey:l}=de();d(()=>{void Be.configure(n.licenseKey??pn())},[n.licenseKey]);const a=n.licenseKey===void 0||Le(n.licenseKey,l);const r=Fe(typeof __DEV__!=="undefined"?__DEV__:process.env.NODE_ENV!=="production");const c=a&&i.status==="admitted";d(()=>{if(c)Ke()},[c]);d(()=>{if(r||i.status==="initializing")return;if(s&&c)un();else dn()},[r,s,c,i.status]);const p=ue();_n(p?n.signIn:void 0);Mn(n.signIn);if(!r&&!s){if(!n.signIn||n.headless)return null;return p?t(ye,{needsPlan:true}):t(fn,{})}if(!c){return _(Y,{children:[i.status==="initializing"&&t(Cn,{modules:n.modules}),n.headless?null:n.signIn&&p?t(ye,{}):t(Ne,{})]})}return t(Sn,{...n})}
|
|
1
|
+
"use strict";import{BuoyPortal as xe,FloatingToolHost as Re}from"@buoy-gg/shared-ui/floating";import*as Be from"@buoy-gg/license";import{LicenseManager as Le,useLicense as ue,sameLicenseKey as Fe,resolveDevBuild as je,capacitorDebug as Ne,isCapacitorNative as fe,loadCapacitorAppHost as pe}from"@buoy-gg/license";import{AccountSetup as Ve,HintsProvider as ze,normalizeEnvironment as Ke,registerToolOpener as me,setBuoyAppId as U,startSettingsSync as We}from"@buoy-gg/shared-ui";import{useState as R,useMemo as g,useCallback as D,useEffect as c,useRef as ge}from"react";import{useSettings as He,getToolLabel as B,getToolDescription as Ue,getToolColor as Te}from"@buoy-gg/floating-tools-react";import{persistentStorage as h,devToolsStorageKeys as L,EnvironmentIndicator as $e,EnvironmentSelectorInline as Ye}from"@buoy-gg/shared-ui";import{autoDiscoverWithCustom as Ge,getToolsBySlot as ye}from"../utils/autoDiscoverPresets.web.js";import{filterTeamTools as Qe,isTeamToolAllowed as Je}from"@buoy-gg/floating-tools-core";import{NO_TEAM_TOOLS_NOTE as Xe}from"./teamToolsNote.js";import{FloatingTools as Ze,UserStatus as qe}from"./floatingTools.web.js";import{DialMenu as en}from"./dial/DialDevTools.web.js";import{getRankedToolIds as nn,recordToolUsage as on}from"./dial/dialUsageStore.js";import{OnboardingTooltip as tn}from"./dial/OnboardingTooltip.web.js";import{SettingsModal as sn}from"./DevToolsSettingsModal.web.js";import{AppHostProvider as rn,AppOverlay as an,useAppHost as ve}from"./AppHost.web.js";import{MinimizedToolsStack as ln}from"./MinimizedToolsStack.web.js";import{toggleStateManager as cn}from"./ToggleStateManager.js";import{createWebTools as dn}from"../utils/createWebTools.js";import{BrowserToolRuntime as un}from"./BrowserToolRuntime.js";import{clearReleaseOptIn as fn,markReleaseOptIn as pn}from"../releaseOptIn.js";import{BuoySignIn as mn}from"./BuoySignIn.web.js";import{defaultLicenseKey as gn}from"../Buoy.js";import{BuoySignIn as he}from"./BuoyCodeSignIn.js";import{DevToolsVisibilityProvider as Tn,useDevToolsVisibility as yn}from"./DevToolsVisibilityContext.js";import{createWebTool as $}from"../utils/createWebTool.js";import{DefaultConfigProvider as vn}from"./DefaultConfigContext.js";import{useDevToolsSettings as hn}from"./DevToolsSettingsModal.shared.js";import{validateDialConfig as be}from"./defaultConfig.js";import{installedTools as bn,installedToolsFound as On}from"../installedTools.js";import{jsx as i,jsxs as _,Fragment as Y}from"react/jsx-runtime";const Oe={};const Se="@react_buoy_floating_menu_tooltip_shown";const Sn=h;function In({size:n=14,color:t="#20C997"}){const s=Math.max(2,n/4);const a=Math.max(1,n/16);return i("div",{style:{display:"grid",gridTemplateColumns:`repeat(3, ${s}px)`,gap:a,width:n,height:n,alignContent:"center",justifyContent:"center"},children:Array.from({length:9}).map((l,r)=>i("div",{style:{width:s,height:s,borderRadius:s/2,backgroundColor:t}},r))})}function Cn(n){const{defaultFloatingTools:t,defaultDialTools:s,disableHints:a=false,children:l}=n;const r=g(()=>s?be(s):s,[s]);return i(vn,{defaultFloatingTools:t,defaultDialTools:r,children:i(ze,{disableHints:a,children:_(Tn,{children:[i(rn,{children:i(kn,{...n})}),l]})})})}const Dn=["ReduxAutoInstrument","ConsoleRoot","RouteTracker","ReactQueryTracker"];function An({modules:n=Oe}){return i(Y,{children:Object.entries(n).flatMap(([t,s])=>Dn.map(a=>{const l=s[a];return l?i(l,{},`${t}:${a}`):null}))})}function En(){const{openApps:n,restore:t}=ve();c(()=>me(s=>{const a=n.find(l=>l.id===s);if(!a)return false;t(a.instanceId);return true}),[n,t]);return null}function wn(){const n=Ne();const t=n===null?process.env.NODE_ENV:n?"development":"production";return Ke(t??"dev")}function _n(n,t,s,a){const l=M=>Object.entries(n).find(([y])=>y.replace(/^@buoy-gg\//,"").replace(/\/web$/,"")===M)?.[1];const r=[];const d=l("env");if(t?.length&&d?.createEnvTool&&d.createEnvVarConfig){r.push($(d.createEnvTool({requiredEnvVars:d.createEnvVarConfig(t)})))}const p=l("storage");if(s?.length&&p?.createStorageTool){r.push($(p.createStorageTool({requiredStorageKeys:s})))}const A=l("ask-buoy");const b=a==="hosted"?A?.hostedAskBuoy?.():a;if(b&&A?.createAskBuoyTool)r.push($(A.createAskBuoyTool(b)));return r}function Mn(n){if(n.launchMode!=="toggle-only")return void 0;const t=n.isOn;return typeof t==="function"?t():void 0}function kn({environment:n,userRole:t="admin",availableEnvironments:s,onEnvironmentSwitch:a,apps:l,modules:r=Oe,externalSync:d,requiredEnvVars:p,sentryGetClient:A,disableHints:b=false,headless:M=false,hidden:y=false,defaultFloatingTools:Ce,defaultDialTools:F,zustandStores:j,requiredStorageKeys:G,askBuoy:Q}){const N=n??wn();const De=g(()=>F?be(F):void 0,[F]);const[m,E]=R(false);const[O,k]=R(false);const[,J]=R(0);c(()=>cn.subscribe(()=>J(e=>e+1)),[]);const V=ge(false);const T=ve();const X=g(()=>_n(r,p,G,Q),[r,p,G,Q]);const{allowedTools:S}=ue();const f=g(()=>Qe(Ge([...dn(r),...l??[],...X]),S),[l,r,X,S]);const{openApps:Z,close:q}=T;c(()=>{if(!S)return;for(const e of Z){if(!Je(e.id,S))q(e.instanceId)}},[Z,S,q]);const z=g(()=>Object.entries(r).find(([e])=>e.replace(/^@buoy-gg\//,"").replace(/\/web$/,"")==="zustand")?.[1],[r]);c(()=>{if(!j||typeof z?.watchStores!=="function")return;const e=z.watchStores(j);return typeof e==="function"?e:void 0},[j,z]);const P=yn();const ee=T.openApps.some(e=>!e.minimized);c(()=>{P.setDialOpen(m)},[m,P.setDialOpen]);c(()=>{P.setToolOpen(ee||O)},[ee,O,P.setToolOpen]);const{registerApps:ne}=T;c(()=>{ne(f.map(e=>{const o=e.icon;return{...e,icon:typeof o==="function"?({size:u})=>o(u):o}}))},[ne,f]);const Ae=g(()=>f.map(e=>({id:e.id,name:e.name,description:e.description,slot:e.slot})),[f]);He({availableTools:Ae,storage:Sn});c(()=>{let e=false;const o=async()=>{const[u,v]=await Promise.all([h.getItem(L.dial.isOpen()),h.getItem(L.settings.modalOpen())]);if(e)return;if(u==="true")E(true);if(v==="true"){E(true);k(true)}V.current=true};void o();return()=>{e=true}},[]);c(()=>{if(!V.current)return;void h.setItem(L.dial.isOpen(),m?"true":"false")},[m]);c(()=>{if(!V.current)return;void h.setItem(L.settings.modalOpen(),O?"true":"false")},[O]);const w=D(e=>{void on(e.id);if(e.launchMode==="toggle-only"){e.onPress?.();J(o=>o+1);return}if(e.component){const o=typeof e.icon==="function"?e.icon(20):e.icon;T.open({id:e.id,title:e.name||B(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||Te(e.id)})}else{e.onPress?.()}},[T]);const oe=ge({tools:f,openApps:T.openApps,openTool:w});oe.current={tools:f,openApps:T.openApps,openTool:w};c(()=>me(e=>{const{tools:o,openApps:u,openTool:v}=oe.current;if(u.some(H=>H.id===e))return false;const W=o.find(H=>H.id===e);if(!W||W.launchMode==="toggle-only")return false;v(W);return true}),[]);const x=g(()=>{const e=ye(f,"dial");return e.map(o=>{const u=o.color||Te(o.id);let v;if(typeof o.icon==="string"){v=o.icon}else if(typeof o.icon==="function"){v=o.icon(32)}else{v=null}return{id:o.id,name:o.name||B(o.id),icon:v,unavailable:!o.component&&!o.onPress,color:u,onPress:()=>{w(o);E(false)}}})},[f,w]);const te=g(()=>{if(!m)return x;const e=new Map(x.map(o=>[o.id,o]));return nn(x.map(o=>o.id)).map(o=>e.get(o)).filter(o=>Boolean(o))},[m,x]);const{settings:K}=hn();const Ee=g(()=>ye(f,"row").filter(e=>(K.floatingTools[e.id]??false)===true&&(e.component||e.onPress)),[f,K.floatingTools]);const we=g(()=>f.map(e=>({id:e.id,name:e.name||B(e.id),description:e.description||Ue(e.id),slot:e.slot,icon:e.icon,color:e.color})),[f]);const[_e,ie]=R(false);const se=T.openApps.some(e=>!e.minimized);c(()=>{if(b)return;let e=false;const o=setTimeout(async()=>{const u=await h.getItem(Se);if(!e&&!u)ie(true)},1e3);return()=>{e=true;clearTimeout(o)}},[b]);const I=D(()=>{ie(false);void h.setItem(Se,"true")},[]);const re=D(()=>{I();E(true)},[I]);const Me=D(()=>{E(false);k(false)},[]);const ke=D(()=>{k(e=>!e)},[]);const Pe=D(()=>k(false),[]);const ae=Boolean(s?.length&&a);const le=K.floatingTools.environment!==false;const C=_e&&!m&&!se&&!y;c(()=>{if(!C)return;const e=u=>{if(!(u.target instanceof Element)||!u.target.closest("[data-buoy-root]"))I()};const o=u=>{if(u.key==="Escape")I()};document.addEventListener("pointerdown",e,true);document.addEventListener("keydown",o);return()=>{document.removeEventListener("pointerdown",e,true);document.removeEventListener("keydown",o)}},[C,I]);const ce=T.openApps.some(e=>e.minimized&&e.launchMode!=="toggle-only");const de=i(un,{modules:r,apps:l,requiredEnvVars:p,externalSync:d,headless:M,sentryGetClient:A});if(M)return de;return _("div",{"data-buoy-root":"",style:{display:"contents"},children:[de,i(En,{}),C&&i("div",{style:{position:"fixed",inset:0,backgroundColor:"rgba(0,0,0,0.85)",zIndex:1e4,pointerEvents:"none"}}),i("div",{style:y?{visibility:"hidden"}:{display:"contents"},"aria-hidden":y||void 0,children:_(Ze,{enablePositionPersistence:!C,pushToSide:m||se,suspendPointerEvents:m,centerOnboarding:C,minimizedStack:ce?i(ln,{}):void 0,hasMinimizedStack:ce,children:[N&&le&&!ae&&i($e,{environment:N}),ae&&le&&i(Ye,{currentEnvironment:N??"local",availableEnvironments:s,onSelect:a}),t?i(qe,{userRole:t,onPress:re}):i("button",{"aria-label":"Open dev tools",onClick:re,style:{display:"flex",alignItems:"center",justifyContent:"center",padding:"6px 8px",background:"none",border:"none",cursor:"pointer"},children:i(In,{})}),Ee.map(e=>i("button",{"aria-label":e.name||B(e.id),"aria-pressed":Mn(e),title:e.description,onClick:()=>w(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))]})}),C&&i(tn,{title:"Welcome to Buoy!",message:"Grab and position this menu wherever you want, then tap the icon to open your tools.",onDismiss:I}),m&&!y&&i(en,{icons:te,onClose:Me,centerLabel:"BUOY",onCenterPress:ke,settingsOpen:O,hintsDisabled:b,emptyNote:S&&te.length===0?Xe:void 0}),O&&!y&&i(sn,{visible:true,onClose:Pe,availableTools:we,defaultFloatingTools:Ce,defaultDialTools:De,onSettingsChange:e=>{}}),!y&&_(Y,{children:[i(an,{}),i(Re,{})]})]})}function Pn(n){const t=n&&typeof n==="object"?n.appId:void 0;const s=!!n;c(()=>{if(!s)return;let a=false;const l=Be.SessionManager;if(!l)return;const r=d=>{if(a||!d)return;l.configure({audience:`app:${d}`});void l.load().catch(()=>{})};if(t)r(t);else void pe().then(d=>r(d?.bundleId)).catch(()=>{});return()=>{a=true}},[s,t])}function xn(n){const t=n&&typeof n==="object"?n.appId:void 0;c(()=>{let s=false;if(t){U(t)}else if(fe()){void pe().then(a=>{if(!s)U(a?.bundleId)}).catch(()=>{})}else if(typeof location!=="undefined"&&location.origin&&location.origin!=="null"){U(location.origin)}return()=>{s=true}},[t])}let Ie=false;function Rn(n){if(n.modules)return n;if(!On&&!Ie&&typeof console!=="undefined"){Ie=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:bn}}export function FloatingDevTools(n){return i(xe,{children:i(Bn,{...Rn(n)})})}function Bn(n){const{access:t,isPro:s,licenseKey:a}=ue();c(()=>{void Le.configure(n.licenseKey??gn())},[n.licenseKey]);const l=n.licenseKey===void 0||Fe(n.licenseKey,a);const r=je(typeof __DEV__!=="undefined"?__DEV__:process.env.NODE_ENV!=="production");const d=l&&t.status==="admitted";c(()=>{if(d)We()},[d]);c(()=>{if(r||t.status==="initializing")return;if(s&&d)pn();else fn()},[r,s,d,t.status]);const p=fe();Pn(p?n.signIn:void 0);xn(n.signIn);if(!r&&!s){if(!n.signIn||n.headless)return null;return p?i(he,{needsPlan:true}):i(mn,{})}if(!d){return _(Y,{children:[t.status==="initializing"&&i(An,{modules:n.modules}),n.headless?null:n.signIn&&p?i(he,{}):i(Ve,{})]})}return i(Cn,{...n})}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";import{reportOptionalRequireError as r}from"./optionalRequire.js";export function autoDiscoverPresets(){const u=[];const n=[{name:"@buoy-gg/env",loader:()=>{try{const{envToolPreset:e}=require("@buoy-gg/env");return e}catch(e){r("@buoy-gg/env",e);return null}}},{name:"@buoy-gg/network",loader:()=>{try{const{networkToolPreset:e}=require("@buoy-gg/network");return e}catch(e){r("@buoy-gg/network",e);return null}}},{name:"@buoy-gg/storage",loader:()=>{try{const{storageToolPreset:e}=require("@buoy-gg/storage");return e}catch(e){r("@buoy-gg/storage",e);return null}}},{name:"@buoy-gg/react-query",loader:()=>{try{const{reactQueryToolPreset:e,wifiTogglePreset:o}=require("@buoy-gg/react-query");return[e,o]}catch(e){r("@buoy-gg/react-query",e);return null}}},{name:"@buoy-gg/route-events",loader:()=>{try{const{routeEventsToolPreset:e}=require("@buoy-gg/route-events");return e}catch(e){r("@buoy-gg/route-events",e);return null}}},{name:"@buoy-gg/debug-borders",loader:()=>{try{const{debugBordersToolPreset:e}=require("@buoy-gg/debug-borders");return e}catch(e){r("@buoy-gg/debug-borders",e);return null}}},{name:"@buoy-gg/highlight-updates",loader:()=>{try{const{highlightUpdatesPreset:e,highlightUpdatesModalPreset:o}=require("@buoy-gg/highlight-updates");return[o,e]}catch(e){r("@buoy-gg/highlight-updates",e);return null}}},{name:"@buoy-gg/console",loader:()=>{try{const{consoleToolPreset:e}=require("@buoy-gg/console");return e}catch(e){r("@buoy-gg/console",e);return null}}},{name:"@buoy-gg/notifications",loader:()=>{try{return require("@buoy-gg/notifications").notificationToolPreset}catch(e){r("@buoy-gg/notifications",e);return null}}},{name:"@buoy-gg/sentry",loader:()=>{try{const{sentryToolPreset:e}=require("@buoy-gg/sentry");return e}catch(e){r("@buoy-gg/sentry",e);return null}}},{name:"@buoy-gg/time-machine",loader:()=>{try{const{timeMachineToolPreset:e}=require("@buoy-gg/time-machine");return e}catch(e){r("@buoy-gg/time-machine",e);return null}}},{name:"@buoy-gg/clock",loader:()=>{try{const{clockToolPreset:e}=require("@buoy-gg/clock");return e}catch(e){r("@buoy-gg/clock",e);return null}}},{name:"@buoy-gg/lifecycle",loader:()=>{try{const{lifecycleToolPreset:e}=require("@buoy-gg/lifecycle");return e}catch(e){r("@buoy-gg/lifecycle",e);return null}}},{name:"@buoy-gg/location",loader:()=>{try{const{locationToolPreset:e}=require("@buoy-gg/location");return e}catch(e){r("@buoy-gg/location",e);return null}}},{name:"@buoy-gg/permissions",loader:()=>{try{const{permissionsToolPreset:e}=require("@buoy-gg/permissions");return e}catch(e){r("@buoy-gg/permissions",e);return null}}},{name:"@buoy-gg/scenarios",loader:()=>{try{const{scenariosToolPreset:e}=require("@buoy-gg/scenarios");return e}catch(e){r("@buoy-gg/scenarios",e);return null}}},{name:"@buoy-gg/ask-buoy",loader:()=>{try{const{askBuoyToolPreset:e}=require("@buoy-gg/ask-buoy");return e}catch(e){r("@buoy-gg/ask-buoy",e);return null}}},{name:"@buoy-gg/redux",loader:()=>{try{const{reduxToolPreset:e}=require("@buoy-gg/redux");return e}catch(e){r("@buoy-gg/redux",e);return null}}},{name:"@buoy-gg/zustand",loader:()=>{try{const{zustandToolPreset:e}=require("@buoy-gg/zustand");return e}catch(e){r("@buoy-gg/zustand",e);return null}}},{name:"@buoy-gg/events",loader:()=>{try{const{eventsToolPreset:e}=require("@buoy-gg/events");return e}catch(e){r("@buoy-gg/events",e);return null}}},{name:"@buoy-gg/jotai",loader:()=>{try{const{jotaiToolPreset:e}=require("@buoy-gg/jotai");return e}catch(e){r("@buoy-gg/jotai",e);return null}}},{name:"@buoy-gg/image-overlay",loader:()=>{try{const{imageOverlayToolPreset:e}=require("@buoy-gg/image-overlay");return e}catch(e){r("@buoy-gg/image-overlay",e);return null}}},{name:"@buoy-gg/perf-monitor",loader:()=>{try{const{perfMonitorPreset:e,perfMonitorModalPreset:o}=require("@buoy-gg/perf-monitor");return[e,o]}catch(e){r("@buoy-gg/perf-monitor",e);return null}}},{name:"@buoy-gg/js-top",loader:()=>{try{const{jsTopPreset:e,jsTopModalPreset:o}=require("@buoy-gg/js-top");return[o,e]}catch(e){r("@buoy-gg/js-top",e);return null}}},{name:"@buoy-gg/images",loader:()=>{try{const{imagesToolPreset:e}=require("@buoy-gg/images");return e}catch(e){r("@buoy-gg/images",e);return null}}},{name:"@buoy-gg/assets",loader:()=>{try{const{assetsToolPreset:e}=require("@buoy-gg/assets");return e}catch(e){r("@buoy-gg/assets",e);return null}}}];for(const{name:e,loader:o}of n){try{const t=o();if(t){if(Array.isArray(t)){u.push(...t)}else{u.push(t)}}}catch(t){r(e,t)}}return u}export function autoDiscoverPresetsWithCustom(u){const n=autoDiscoverPresets();const e=new Set(u.map(t=>t.id));const o=n.filter(t=>!e.has(t.id));return[...u,...o]}
|
|
1
|
+
"use strict";import{reportOptionalRequireError as r}from"./optionalRequire.js";export function autoDiscoverPresets(){const u=[];const n=[{name:"@buoy-gg/env",loader:()=>{try{const{envToolPreset:e}=require("@buoy-gg/env");return e}catch(e){r("@buoy-gg/env",e);return null}}},{name:"@buoy-gg/network",loader:()=>{try{const{networkToolPreset:e}=require("@buoy-gg/network");return e}catch(e){r("@buoy-gg/network",e);return null}}},{name:"@buoy-gg/storage",loader:()=>{try{const{storageToolPreset:e}=require("@buoy-gg/storage");return e}catch(e){r("@buoy-gg/storage",e);return null}}},{name:"@buoy-gg/react-query",loader:()=>{try{const{reactQueryToolPreset:e,wifiTogglePreset:o}=require("@buoy-gg/react-query");return[e,o]}catch(e){r("@buoy-gg/react-query",e);return null}}},{name:"@buoy-gg/route-events",loader:()=>{try{const{routeEventsToolPreset:e}=require("@buoy-gg/route-events");return e}catch(e){r("@buoy-gg/route-events",e);return null}}},{name:"@buoy-gg/debug-borders",loader:()=>{try{const{debugBordersToolPreset:e}=require("@buoy-gg/debug-borders");return e}catch(e){r("@buoy-gg/debug-borders",e);return null}}},{name:"@buoy-gg/highlight-updates",loader:()=>{try{const{highlightUpdatesPreset:e,highlightUpdatesModalPreset:o}=require("@buoy-gg/highlight-updates");return[o,e]}catch(e){r("@buoy-gg/highlight-updates",e);return null}}},{name:"@buoy-gg/console",loader:()=>{try{const{consoleToolPreset:e}=require("@buoy-gg/console");return e}catch(e){r("@buoy-gg/console",e);return null}}},{name:"@buoy-gg/notifications",loader:()=>{try{return require("@buoy-gg/notifications").notificationToolPreset}catch(e){r("@buoy-gg/notifications",e);return null}}},{name:"@buoy-gg/sentry",loader:()=>{try{const{sentryToolPreset:e}=require("@buoy-gg/sentry");return e}catch(e){r("@buoy-gg/sentry",e);return null}}},{name:"@buoy-gg/time-machine",loader:()=>{try{const{timeMachineToolPreset:e}=require("@buoy-gg/time-machine");return e}catch(e){r("@buoy-gg/time-machine",e);return null}}},{name:"@buoy-gg/clock",loader:()=>{try{const{clockToolPreset:e}=require("@buoy-gg/clock");return e}catch(e){r("@buoy-gg/clock",e);return null}}},{name:"@buoy-gg/bug-links",loader:()=>{try{const{reportBugToolPreset:e,bugLinksToolPreset:o}=require("@buoy-gg/bug-links");return[e,o]}catch(e){r("@buoy-gg/bug-links",e);return null}}},{name:"@buoy-gg/memory-leaks",loader:()=>{try{const{memoryLeaksToolPreset:e}=require("@buoy-gg/memory-leaks");return e}catch(e){r("@buoy-gg/memory-leaks",e);return null}}},{name:"@buoy-gg/lifecycle",loader:()=>{try{const{lifecycleToolPreset:e}=require("@buoy-gg/lifecycle");return e}catch(e){r("@buoy-gg/lifecycle",e);return null}}},{name:"@buoy-gg/ota-inspector",loader:()=>{try{const{otaInspectorToolPreset:e}=require("@buoy-gg/ota-inspector");return e}catch(e){r("@buoy-gg/ota-inspector",e);return null}}},{name:"@buoy-gg/location",loader:()=>{try{const{locationToolPreset:e}=require("@buoy-gg/location");return e}catch(e){r("@buoy-gg/location",e);return null}}},{name:"@buoy-gg/permissions",loader:()=>{try{const{permissionsToolPreset:e}=require("@buoy-gg/permissions");return e}catch(e){r("@buoy-gg/permissions",e);return null}}},{name:"@buoy-gg/scenarios",loader:()=>{try{const{scenariosToolPreset:e}=require("@buoy-gg/scenarios");return e}catch(e){r("@buoy-gg/scenarios",e);return null}}},{name:"@buoy-gg/ask-buoy",loader:()=>{try{const{askBuoyToolPreset:e}=require("@buoy-gg/ask-buoy");return e}catch(e){r("@buoy-gg/ask-buoy",e);return null}}},{name:"@buoy-gg/redux",loader:()=>{try{const{reduxToolPreset:e}=require("@buoy-gg/redux");return e}catch(e){r("@buoy-gg/redux",e);return null}}},{name:"@buoy-gg/zustand",loader:()=>{try{const{zustandToolPreset:e}=require("@buoy-gg/zustand");return e}catch(e){r("@buoy-gg/zustand",e);return null}}},{name:"@buoy-gg/events",loader:()=>{try{const{eventsToolPreset:e}=require("@buoy-gg/events");return e}catch(e){r("@buoy-gg/events",e);return null}}},{name:"@buoy-gg/jotai",loader:()=>{try{const{jotaiToolPreset:e}=require("@buoy-gg/jotai");return e}catch(e){r("@buoy-gg/jotai",e);return null}}},{name:"@buoy-gg/image-overlay",loader:()=>{try{const{imageOverlayToolPreset:e}=require("@buoy-gg/image-overlay");return e}catch(e){r("@buoy-gg/image-overlay",e);return null}}},{name:"@buoy-gg/perf-monitor",loader:()=>{try{const{perfMonitorPreset:e,perfMonitorModalPreset:o}=require("@buoy-gg/perf-monitor");return[e,o]}catch(e){r("@buoy-gg/perf-monitor",e);return null}}},{name:"@buoy-gg/js-top",loader:()=>{try{const{jsTopPreset:e,jsTopModalPreset:o}=require("@buoy-gg/js-top");return[o,e]}catch(e){r("@buoy-gg/js-top",e);return null}}},{name:"@buoy-gg/images",loader:()=>{try{const{imagesToolPreset:e}=require("@buoy-gg/images");return e}catch(e){r("@buoy-gg/images",e);return null}}},{name:"@buoy-gg/assets",loader:()=>{try{const{assetsToolPreset:e}=require("@buoy-gg/assets");return e}catch(e){r("@buoy-gg/assets",e);return null}}}];for(const{name:e,loader:o}of n){try{const t=o();if(t){if(Array.isArray(t)){u.push(...t)}else{u.push(t)}}}catch(t){r(e,t)}}return u}export function autoDiscoverPresetsWithCustom(u){const n=autoDiscoverPresets();const e=new Set(u.map(t=>t.id));const o=n.filter(t=>!e.has(t.id));return[...u,...o]}
|