@buoy-gg/clock 7.0.56 → 7.0.58
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.readSavedSync=readSavedSync;function readSavedSync(){return void 0}
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.readSavedSync=readSavedSync;var _persistence=require("./persistence");function readSavedSync(){try{const e=globalThis.localStorage;if(!e)return void 0;return(0,_persistence.parseSaved)(e.getItem(_persistence.CLOCK_STORAGE_KEY))}catch{return void 0}}
|
package/lib/commonjs/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"CLOCK_CHIP_ID",{enumerable:true,get:function(){return _ClockChip.CLOCK_CHIP_ID}});Object.defineProperty(exports,"CLOCK_TOOL_ICON_COLOR",{enumerable:true,get:function(){return _sharedUi.CLOCK_TOOL_ICON_COLOR}});Object.defineProperty(exports,"ClockBody",{enumerable:true,get:function(){return _ClockBody.ClockBody}});Object.defineProperty(exports,"ClockChip",{enumerable:true,get:function(){return _ClockChip.ClockChip}});Object.defineProperty(exports,"ClockToolIcon",{enumerable:true,get:function(){return _sharedUi.ClockToolIcon}});Object.defineProperty(exports,"ClockToolView",{enumerable:true,get:function(){return _ClockToolView.ClockToolView}});Object.defineProperty(exports,"TIME_PRESETS",{enumerable:true,get:function(){return _clockMath.TIME_PRESETS}});Object.defineProperty(exports,"bootClock",{enumerable:true,get:function(){return _clockStore.bootClock}});Object.defineProperty(exports,"clockSyncAdapter",{enumerable:true,get:function(){return _clockSyncAdapter.clockSyncAdapter}});Object.defineProperty(exports,"clockToolPreset",{enumerable:true,get:function(){return _preset.clockToolPreset}});Object.defineProperty(exports,"createClockTool",{enumerable:true,get:function(){return _preset.createClockTool}});Object.defineProperty(exports,"failNextRequest",{enumerable:true,get:function(){return _tokenActions.failNextRequest}});Object.defineProperty(exports,"formatDuration",{enumerable:true,get:function(){return _clockMath.formatDuration}});Object.defineProperty(exports,"freeze",{enumerable:true,get:function(){return _clockStore.freeze}});Object.defineProperty(exports,"getClockSnapshot",{enumerable:true,get:function(){return _clockStore.getClockSnapshot}});Object.defineProperty(exports,"getTokenReport",{enumerable:true,get:function(){return _tokenStore.getTokenReport}});Object.defineProperty(exports,"inspectToken",{enumerable:true,get:function(){return _decode.inspectToken}});Object.defineProperty(exports,"isClockOverridden",{enumerable:true,get:function(){return _clockStore.isClockOverridden}});Object.defineProperty(exports,"jumpToTokenExpiry",{enumerable:true,get:function(){return _tokenActions.jumpToTokenExpiry}});Object.defineProperty(exports,"openClockChip",{enumerable:true,get:function(){return _ClockChip.openClockChip}});Object.defineProperty(exports,"parseDuration",{enumerable:true,get:function(){return _clockMath.parseDuration}});Object.defineProperty(exports,"previewJump",{enumerable:true,get:function(){return _clockStore.previewJump}});Object.defineProperty(exports,"realNow",{enumerable:true,get:function(){return _patches.realNow}});Object.defineProperty(exports,"reset",{enumerable:true,get:function(){return _clockStore.reset}});Object.defineProperty(exports,"resume",{enumerable:true,get:function(){return _clockStore.resume}});Object.defineProperty(exports,"setRate",{enumerable:true,get:function(){return _clockStore.setRate}});Object.defineProperty(exports,"setTime",{enumerable:true,get:function(){return _clockStore.setTime}});Object.defineProperty(exports,"shift",{enumerable:true,get:function(){return _clockStore.shift}});Object.defineProperty(exports,"startTokenWatch",{enumerable:true,get:function(){return _tokenStore.startTokenWatch}});Object.defineProperty(exports,"stopTokenCheck",{enumerable:true,get:function(){return _tokenActions.stopTokenCheck}});Object.defineProperty(exports,"subscribeClock",{enumerable:true,get:function(){return _clockStore.subscribeClock}});Object.defineProperty(exports,"tokenFingerprint",{enumerable:true,get:function(){return _decode.fingerprint}});Object.defineProperty(exports,"updateSettings",{enumerable:true,get:function(){return _clockStore.updateSettings}});Object.defineProperty(exports,"useLiveClock",{enumerable:true,get:function(){return _useLiveClock.useLiveClock}});Object.defineProperty(exports,"virtualNow",{enumerable:true,get:function(){return _clockStore.virtualNow}});Object.defineProperty(exports,"withRealClock",{enumerable:true,get:function(){return _patches.withRealClock}});var _reactNative=require("react-native");var _clockStore=require("./engine/clockStore");var _patches=require("./engine/patches");var _ClockChip=require("./components/ClockChip");var _preset=require("./preset");var _ClockBody=require("./components/ClockBody");var _ClockToolView=require("./components/ClockToolView");var _useLiveClock=require("./components/useLiveClock");var _sharedUi=require("@buoy-gg/shared-ui");var _clockSyncAdapter=require("./sync/clockSyncAdapter");var _clockMath=require("./engine/clockMath");var _tokenStore=require("./tokens/tokenStore");var _tokenActions=require("./tokens/tokenActions");var _decode=require("./tokens/decode");const isReactNativeRuntime=typeof navigator!=="undefined"&&navigator.product==="ReactNative";if(isReactNativeRuntime){(0,_patches.installAnimatedRealClock)(_reactNative.Animated);(0,_ClockChip.watchClockChip)();if(typeof __DEV__!=="undefined"&&__DEV__)(0,_clockStore.bootClock)()}
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"CLOCK_CHIP_ID",{enumerable:true,get:function(){return _ClockChip.CLOCK_CHIP_ID}});Object.defineProperty(exports,"CLOCK_TOOL_ICON_COLOR",{enumerable:true,get:function(){return _sharedUi.CLOCK_TOOL_ICON_COLOR}});Object.defineProperty(exports,"ClockBody",{enumerable:true,get:function(){return _ClockBody.ClockBody}});Object.defineProperty(exports,"ClockChip",{enumerable:true,get:function(){return _ClockChip.ClockChip}});Object.defineProperty(exports,"ClockToolIcon",{enumerable:true,get:function(){return _sharedUi.ClockToolIcon}});Object.defineProperty(exports,"ClockToolView",{enumerable:true,get:function(){return _ClockToolView.ClockToolView}});Object.defineProperty(exports,"TIME_PRESETS",{enumerable:true,get:function(){return _clockMath.TIME_PRESETS}});Object.defineProperty(exports,"bootClock",{enumerable:true,get:function(){return _clockStore.bootClock}});Object.defineProperty(exports,"clockSyncAdapter",{enumerable:true,get:function(){return _clockSyncAdapter.clockSyncAdapter}});Object.defineProperty(exports,"clockToolPreset",{enumerable:true,get:function(){return _preset.clockToolPreset}});Object.defineProperty(exports,"createClockTool",{enumerable:true,get:function(){return _preset.createClockTool}});Object.defineProperty(exports,"failNextRequest",{enumerable:true,get:function(){return _tokenActions.failNextRequest}});Object.defineProperty(exports,"formatDuration",{enumerable:true,get:function(){return _clockMath.formatDuration}});Object.defineProperty(exports,"freeze",{enumerable:true,get:function(){return _clockStore.freeze}});Object.defineProperty(exports,"getClockSnapshot",{enumerable:true,get:function(){return _clockStore.getClockSnapshot}});Object.defineProperty(exports,"getTokenReport",{enumerable:true,get:function(){return _tokenStore.getTokenReport}});Object.defineProperty(exports,"inspectToken",{enumerable:true,get:function(){return _decode.inspectToken}});Object.defineProperty(exports,"isClockOverridden",{enumerable:true,get:function(){return _clockStore.isClockOverridden}});Object.defineProperty(exports,"jumpToTokenExpiry",{enumerable:true,get:function(){return _tokenActions.jumpToTokenExpiry}});Object.defineProperty(exports,"openClockChip",{enumerable:true,get:function(){return _ClockChip.openClockChip}});Object.defineProperty(exports,"parseDuration",{enumerable:true,get:function(){return _clockMath.parseDuration}});Object.defineProperty(exports,"previewJump",{enumerable:true,get:function(){return _clockStore.previewJump}});Object.defineProperty(exports,"realNow",{enumerable:true,get:function(){return _patches.realNow}});Object.defineProperty(exports,"reset",{enumerable:true,get:function(){return _clockStore.reset}});Object.defineProperty(exports,"resume",{enumerable:true,get:function(){return _clockStore.resume}});Object.defineProperty(exports,"setRate",{enumerable:true,get:function(){return _clockStore.setRate}});Object.defineProperty(exports,"setTime",{enumerable:true,get:function(){return _clockStore.setTime}});Object.defineProperty(exports,"shift",{enumerable:true,get:function(){return _clockStore.shift}});Object.defineProperty(exports,"startTokenWatch",{enumerable:true,get:function(){return _tokenStore.startTokenWatch}});Object.defineProperty(exports,"stopTokenCheck",{enumerable:true,get:function(){return _tokenActions.stopTokenCheck}});Object.defineProperty(exports,"subscribeClock",{enumerable:true,get:function(){return _clockStore.subscribeClock}});Object.defineProperty(exports,"tokenFingerprint",{enumerable:true,get:function(){return _decode.fingerprint}});Object.defineProperty(exports,"updateSettings",{enumerable:true,get:function(){return _clockStore.updateSettings}});Object.defineProperty(exports,"useLiveClock",{enumerable:true,get:function(){return _useLiveClock.useLiveClock}});Object.defineProperty(exports,"virtualNow",{enumerable:true,get:function(){return _clockStore.virtualNow}});Object.defineProperty(exports,"withRealClock",{enumerable:true,get:function(){return _patches.withRealClock}});var _reactNative=require("react-native");var _clockStore=require("./engine/clockStore");var _patches=require("./engine/patches");var _ClockChip=require("./components/ClockChip");var _preset=require("./preset");var _ClockBody=require("./components/ClockBody");var _ClockToolView=require("./components/ClockToolView");var _useLiveClock=require("./components/useLiveClock");var _sharedUi=require("@buoy-gg/shared-ui");var _clockSyncAdapter=require("./sync/clockSyncAdapter");var _clockMath=require("./engine/clockMath");var _tokenStore=require("./tokens/tokenStore");var _tokenActions=require("./tokens/tokenActions");var _decode=require("./tokens/decode");const isReactNativeRuntime=typeof navigator!=="undefined"&&navigator.product==="ReactNative";const isCapacitorShell=(()=>{try{const e=globalThis.Capacitor;return e?.isNativePlatform?.()===true}catch{return false}})();if(isReactNativeRuntime||isCapacitorShell){(0,_patches.installAnimatedRealClock)(_reactNative.Animated);(0,_ClockChip.watchClockChip)();if(typeof __DEV__!=="undefined"&&__DEV__)(0,_clockStore.bootClock)()}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";export function readSavedSync(){return void 0}
|
|
1
|
+
"use strict";import{CLOCK_STORAGE_KEY as r,parseSaved as t}from"./persistence";export function readSavedSync(){try{const e=globalThis.localStorage;if(!e)return void 0;return t(e.getItem(r))}catch{return void 0}}
|
package/lib/module/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";import{Animated as
|
|
1
|
+
"use strict";import{Animated as e}from"react-native";import{bootClock as t}from"./engine/clockStore";import{installAnimatedRealClock as r}from"./engine/patches";import{watchClockChip as i}from"./components/ClockChip";const p=typeof navigator!=="undefined"&&navigator.product==="ReactNative";const a=(()=>{try{const o=globalThis.Capacitor;return o?.isNativePlatform?.()===true}catch{return false}})();if(p||a){r(e);i();if(typeof __DEV__!=="undefined"&&__DEV__)t()}export{clockToolPreset,createClockTool}from"./preset";export{ClockBody}from"./components/ClockBody";export{ClockToolView}from"./components/ClockToolView";export{ClockChip,openClockChip,CLOCK_CHIP_ID}from"./components/ClockChip";export{useLiveClock}from"./components/useLiveClock";export{ClockToolIcon,CLOCK_TOOL_ICON_COLOR}from"@buoy-gg/shared-ui";export{clockSyncAdapter}from"./sync/clockSyncAdapter";export{bootClock,setTime,shift,freeze,resume,setRate,reset,updateSettings,virtualNow,isClockOverridden,getClockSnapshot,subscribeClock,previewJump}from"./engine/clockStore";export{realNow,withRealClock}from"./engine/patches";export{parseDuration,formatDuration,TIME_PRESETS}from"./engine/clockMath";export{startTokenWatch,getTokenReport}from"./tokens/tokenStore";export{jumpToTokenExpiry,failNextRequest,stopTokenCheck}from"./tokens/tokenActions";export{inspectToken,fingerprint as tokenFingerprint}from"./tokens/decode";
|
|
@@ -1,4 +1,9 @@
|
|
|
1
|
-
import type
|
|
2
|
-
/**
|
|
1
|
+
import { type SavedClock } from "./persistence";
|
|
2
|
+
/**
|
|
3
|
+
* The saved override, read synchronously. The web build's persistentStorage
|
|
4
|
+
* writes plain `localStorage`, which a page can read at once, so a saved
|
|
5
|
+
* override is in place before the app's own modules read the clock (the
|
|
6
|
+
* Capacitor case). `undefined` when there is no `localStorage`.
|
|
7
|
+
*/
|
|
3
8
|
export declare function readSavedSync(): SavedClock | null | undefined;
|
|
4
9
|
//# sourceMappingURL=readSavedSync.web.d.ts.map
|
package/lib/web/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";var ht=Object.defineProperty;var Fr=Object.getOwnPropertyDescriptor;var Br=Object.getOwnPropertyNames;var Ur=Object.prototype.hasOwnProperty;var Hr=(e,t)=>{for(var r in t)ht(e,r,{get:t[r],enumerable:true})},mt=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Br(t))!Ur.call(e,o)&&o!==r&&ht(e,o,{get:()=>t[o],enumerable:!(n=Fr(t,o))||n.enumerable});return e},Vr=(e,t,r)=>(mt(e,t,"default"),r&&mt(r,t,"default"));var gt=process.env.NODE_ENV!=="production";typeof window<"u"&&typeof globalThis.global>"u"&&(globalThis.global=globalThis);var yt={};Hr(yt,{AccessibilityInfo:()=>Kr,ActivityIndicator:()=>Un,Alert:()=>Wn,Animated:()=>bt,AppRegistry:()=>Yr,AppState:()=>Gr,Appearance:()=>Zr,BackHandler:()=>Xr,Button:()=>Hn,CheckBox:()=>mn,Clipboard:()=>Qr,DeviceEventEmitter:()=>Dn,Dimensions:()=>en,Easing:()=>tn,FlatList:()=>gn,I18nManager:()=>rn,Image:()=>yn,ImageBackground:()=>bn,InteractionManager:()=>on,Keyboard:()=>nn,KeyboardAvoidingView:()=>kn,LayoutAnimation:()=>sn,Linking:()=>an,LogBox:()=>On,Modal:()=>Fn,NativeEventEmitter:()=>ln,NativeModules:()=>qr,PanResponder:()=>cn,Picker:()=>xn,PixelRatio:()=>un,Platform:()=>dn,Pressable:()=>_n,ProgressBar:()=>vn,RefreshControl:()=>wn,SafeAreaView:()=>Tn,ScrollView:()=>xt,SectionList:()=>An,Share:()=>fn,StatusBar:()=>Sn,StyleSheet:()=>Y,Switch:()=>Bn,Text:()=>w,TextInput:()=>kt,Touchable:()=>$n,TouchableHighlight:()=>jn,TouchableNativeFeedback:()=>In,TouchableOpacity:()=>B,TouchableWithoutFeedback:()=>Mn,UIManager:()=>pn,Vibration:()=>hn,View:()=>m,VirtualizedList:()=>Rn,YellowBox:()=>Cn,findNodeHandle:()=>Vn,unstable_createElement:()=>Jr,useColorScheme:()=>Pn,useLocaleContext:()=>En,useWindowDimensions:()=>zn});Vr(yt,Wr);import*as Wr from"react-native-web";import{unstable_createElement as Jr,NativeModules as qr,AccessibilityInfo as Kr,Animated as bt,Appearance as Zr,AppRegistry as Yr,AppState as Gr,BackHandler as Xr,Clipboard as Qr,Dimensions as en,Easing as tn,I18nManager as rn,Keyboard as nn,InteractionManager as on,LayoutAnimation as sn,Linking as an,NativeEventEmitter as ln,PanResponder as cn,PixelRatio as un,Platform as dn,Share as fn,StyleSheet as Y,UIManager as pn,Vibration as hn,CheckBox as mn,FlatList as gn,Image as yn,ImageBackground as bn,KeyboardAvoidingView as kn,Picker as xn,ProgressBar as vn,RefreshControl as wn,SafeAreaView as Tn,SectionList as An,StatusBar as Sn,Touchable as $n,TouchableNativeFeedback as In,VirtualizedList as Rn,YellowBox as Cn,LogBox as On,DeviceEventEmitter as Dn,useColorScheme as Pn,useLocaleContext as En,useWindowDimensions as zn}from"react-native-web";import*as O from"react-native-web";import{createElement as Nn,forwardRef as Ln}from"react";function P(e){let t=Ln((n,o)=>{let{accessibilityState:i,accessibilityValue:s,...a}=n;for(let l of["busy","checked","disabled","expanded","selected"])i?.[l]!==void 0&&a[`aria-${l}`]===void 0&&(a[`aria-${l}`]=i[l]);for(let[l,c]of Object.entries({min:"valuemin",max:"valuemax",now:"valuenow",text:"valuetext"}))s?.[l]!==void 0&&a[`aria-${c}`]===void 0&&(a[`aria-${c}`]=s[l]);return Nn(e,{...a,ref:o})}),r=e.State;return r&&Object.assign(t,{State:r}),t.displayName=e.displayName??e.name??"NativeWebView",t}var m=P(O.View),w=P(O.Text),kt=P(O.TextInput),B=P(O.TouchableOpacity),jn=P(O.TouchableHighlight),Mn=P(O.TouchableWithoutFeedback),_n=P(O.Pressable),xt=P(O.ScrollView),Fn=P(O.Modal),Bn=P(O.Switch),Un=P(O.ActivityIndicator),Hn=P(O.Button),Vn=O.findNodeHandle,Wn={alert(e,t,r,n){if(typeof document>"u")return;let o=document.createElement("dialog");o.dataset.buoyRoot="",o.setAttribute("aria-label",e),o.style.cssText="position:fixed;inset:0;margin:auto;width:min(440px,90vw);padding:24px;border:1px solid #475569;border-radius:14px;background:#17212e;color:#f1f5f9;font:14px system-ui;box-shadow:0 20px 80px #0008;z-index:2147483647";let i=document.createElement("h2");if(i.textContent=e,i.style.cssText="font-size:18px;margin:0 0 12px",o.appendChild(i),t){let c=document.createElement("p");c.textContent=t,c.style.cssText="line-height:1.5;white-space:pre-wrap;margin:0 0 20px",o.appendChild(c)}let s=document.createElement("div");s.style.cssText="display:flex;justify-content:flex-end;flex-wrap:wrap;gap:8px";let a=r?.length?r:[{text:"OK"}],l=()=>{o.close?.(),o.remove()};for(let c of a){let d=document.createElement("button");d.type="button",d.textContent=c.text??"OK",d.style.cssText=`padding:9px 14px;border:1px solid #64748b;border-radius:7px;color:white;background:${c.style==="destructive"?"#a52b38":"#283a4d"};cursor:pointer;font:inherit`,d.onclick=()=>{l(),c.onPress?.()},s.appendChild(d)}o.addEventListener("cancel",c=>{c.preventDefault(),n?.cancelable!==false&&(l(),n?.onDismiss?.())}),o.appendChild(s),document.body.appendChild(o),o.showModal?o.showModal():o.setAttribute("open","")}};var Ce=Object.freeze({mode:"real",anchorReal:0,anchorVirtual:0,rate:1}),Oe=.1,De=86400,Jn=864e13;function M(e,t){return e.mode==="real"?t:e.mode==="frozen"?e.anchorVirtual:e.anchorVirtual+(t-e.anchorReal)*e.rate}function qn(e,t){return M(e,t)-t}function G(e){if(!Number.isFinite(e)||Math.abs(e)>Jn)throw new RangeError(`Not a valid time: ${e}`);return Math.round(e)}function Pe(e,t,r,n=false){return{mode:n?"frozen":"running",anchorReal:t,anchorVirtual:G(r),rate:e.mode==="real"?1:e.rate}}function Kn(e,t,r){if(!Number.isFinite(r))throw new RangeError("Jump must be a number of ms");return Pe(e,t,M(e,t)+r,e.mode==="frozen")}function Zn(e,t,r){return Pe(e,t,r??M(e,t),true)}function Yn(e,t){return e.mode!=="frozen"?e:{...e,mode:"running",anchorReal:t}}function Gn(e,t,r){if(!Number.isFinite(r)||r<Oe||r>De)throw new RangeError(`Speed must be between ${Oe}\xD7 and ${De}\xD7`);return e.mode==="real"&&r===1?e:{mode:"running",anchorReal:t,anchorVirtual:G(M(e,t)),rate:r}}function vt(e){let t=e;return!!t&&(t.mode==="real"||t.mode==="running"||t.mode==="frozen")&&Number.isFinite(t.anchorReal)&&Number.isFinite(t.anchorVirtual)&&Number.isFinite(t.rate)&&t.rate>=Oe&&t.rate<=De}var Xn={ms:1,millisecond:1,milliseconds:1,s:1e3,sec:1e3,secs:1e3,second:1e3,seconds:1e3,m:6e4,min:6e4,mins:6e4,minute:6e4,minutes:6e4,h:36e5,hr:36e5,hrs:36e5,hour:36e5,hours:36e5,d:864e5,day:864e5,days:864e5,w:6048e5,wk:6048e5,week:6048e5,weeks:6048e5,mo:30*864e5,month:30*864e5,months:30*864e5,y:365*864e5,yr:365*864e5,year:365*864e5,years:365*864e5};function Ee(e){if(typeof e=="number"){if(!Number.isFinite(e))throw new RangeError("Duration must be finite");return Math.round(e)}let t=String(e).trim().toLowerCase();if(!t)throw new RangeError("Duration is empty");let r=1;if((t[0]==="+"||t[0]==="-"||t[0]==="\u2212")&&(r=t[0]==="+"?1:-1,t=t.slice(1).trim()),/^\d+(\.\d+)?$/.test(t))return r*Math.round(Number(t));let n=/(\d+(?:\.\d+)?)\s*([a-z]+)/g,o=0,i="",s;for(;s=n.exec(t);){let a=Xn[s[2]];if(a===void 0)throw new RangeError(`Unknown time unit "${s[2]}" in "${e}"`);o+=Number(s[1])*a,i+=s[0]}if(!i||i.replace(/\s/g,"")!==t.replace(/[\s,]/g,""))throw new RangeError(`Could not read "${e}" as a duration. Try "+1d", "-2h30m" or "90s".`);return r*Math.round(o)}function te(e,{signed:t=true}={}){let r=e<0?"\u2212":"+",n=Math.abs(Math.round(e));if(n<1e3)return t&&n>0?`${r}${n}ms`:"0s";let o=[],i=[["y",365*864e5],["d",864e5],["h",36e5],["m",6e4],["s",1e3]];for(let[s,a]of i)if(n>=a&&(o.push(`${Math.floor(n/a)}${s}`),n%=a),o.length===2)break;return`${t?r:""}${o.join(" ")}`}function wt(e,t,r){if(typeof e=="number")return G(e);let n=String(e).trim();if(!n)throw new RangeError("Time is empty");if(/^now$/i.test(n))return t;if(/^[+\-−]/.test(n))return G(t+Ee(n));if(/^\d{11,}$/.test(n))return G(Number(n));let o=n.replace(/^(\d{4}-\d{2}-\d{2})[ ](\d{2}:\d{2})/,"$1T$2"),i=r(o);if(!Number.isFinite(i))throw new RangeError(`Could not read "${e}" as a time. Use ISO 8601 like 2026-12-31T23:59:50, epoch ms, or "+1d".`);return G(i)}var ze=1e4,Tt=[{id:"midnight",label:"Before midnight",hint:"23:59:50 tonight",at(e,t){let r=new t(e);return r.setHours(24,0,0,0),r.getTime()-ze}},{id:"month-end",label:"Month end",hint:"last day, 23:59:50",at(e,t){let r=new t(e);return r.setMonth(r.getMonth()+1,1),r.setHours(0,0,0,0),r.getTime()-ze}},{id:"year-end",label:"New Year's Eve",hint:"Dec 31, 23:59:50",at(e,t){let r=new t(e);return r.setFullYear(r.getFullYear()+1,0,1),r.setHours(0,0,0,0),r.getTime()-ze}},{id:"tomorrow-9",label:"Tomorrow 9 AM",hint:"start of a business day",at(e,t){let r=new t(e);return r.setDate(r.getDate()+1),r.setHours(9,0,0,0),r.getTime()}},{id:"leap-day",label:"Leap day",hint:"next Feb 29, 09:00",at(e,t){let r=new t(e).getFullYear();for(;;){let n=r%4===0&&r%100!==0||r%400===0,o=new t(r,1,29,9,0,0,0).getTime();if(n&&o>e)return o;r+=1}}}],Cs=[{label:"1m",ms:6e4},{label:"15m",ms:15*6e4},{label:"1h",ms:36e5},{label:"1d",ms:864e5},{label:"7d",ms:7*864e5},{label:"30d",ms:30*864e5},{label:"1y",ms:365*864e5}];function At(e){return e===3600?"1h/s":e===600?"10m/s":e===60?"1m/s":`${Number.isInteger(e)?e:e.toFixed(1)}\xD7`}var E=globalThis,pe="__buoyClock",A=E.__buoyRealDate??(Date[pe]?Date.__buoyRealDate:Date);E.__buoyRealDate=A;var St=A.now.bind(A);function S(){return St()}E.__buoyRealNow=S;var Ne=null,Le=0;function he(){let e=St();return!Ne||Le>0?e:Ne(e)}function $t(e){Ne=e}function je(e){Le+=1;try{return e()}finally{Le-=1}}E.__buoyWithRealClock=je;function _(...e){let t=new.target;return t?Reflect.construct(A,e.length===0?[he()]:e,t):new A(he()).toString()}_.prototype=A.prototype;Object.defineProperty(_,"name",{value:"Date"});Object.defineProperty(_,"length",{value:7});Object.defineProperty(_,"now",{value:function(){return he()},writable:true,configurable:true});Object.defineProperty(_,"parse",{value:A.parse,writable:true,configurable:true});Object.defineProperty(_,"UTC",{value:A.UTC,writable:true,configurable:true});Object.defineProperty(_,pe,{value:true});Object.defineProperty(_,"__buoyRealDate",{value:A});var re=_,me=false,ge;function Qn(){return me&&E.Date===re}function eo(){if(E.Date===re){me=true;return}let e=Object.getOwnPropertyDescriptor(E,"Date");Object.defineProperty(E,"Date",{value:re,writable:e?.writable??true,enumerable:e?.enumerable??false,configurable:true}),ge=Object.getOwnPropertyDescriptor(A.prototype,"constructor");try{Object.defineProperty(A.prototype,"constructor",{value:re,writable:true,enumerable:false,configurable:true})}catch{}me=true}function to(){if(E.Date===re){let e=Object.getOwnPropertyDescriptor(E,"Date");Object.defineProperty(E,"Date",{value:A,writable:e?.writable??true,enumerable:e?.enumerable??false,configurable:true})}if(ge){try{Object.defineProperty(A.prototype,"constructor",ge)}catch{}ge=void 0}me=false}var ne=[];function It(e){return function(t,...r){return e.call(this,t===void 0?he():t,...r)}}function ro(){if(ne.length)return;let e=E.Intl?.DateTimeFormat?.prototype;if(e)for(let t of["format","formatToParts"]){let r=Object.getOwnPropertyDescriptor(e,t);if(!(!r||!r.configurable))try{if(typeof r.get=="function"){let n=r.get;Object.defineProperty(e,t,{...r,get(){return It(n.call(this))}})}else if(typeof r.value=="function")Object.defineProperty(e,t,{...r,value:It(r.value)});else continue;ne.push({proto:e,name:t,original:r})}catch{}}}function no(){for(let{proto:e,name:t,original:r}of ne)try{Object.defineProperty(e,t,r)}catch{}ne=[]}function oo(){return ne.length>0}function io(){eo(),ro()}function so(){to(),no()}var Me=false;function ao(e){let t=Object.getPrototypeOf(e);for(;t&&t!==Object.prototype;){if(!Object.prototype.hasOwnProperty.call(t,pe)){for(let r of["start","onUpdate"]){let n=Object.getOwnPropertyDescriptor(t,r);if(n&&typeof n.value=="function"){let o=n.value;t[r]=function(...i){return je(()=>o.apply(this,i))}}}try{Object.defineProperty(t,pe,{value:true})}catch{return}}t=Object.getPrototypeOf(t)}}function lo(e){if(Me)return true;try{let t=e;if(typeof t?.Value!="function")return false;let r=Object.getPrototypeOf(new t.Value(0)),n=r?.animate;return typeof n!="function"?false:(r.animate=function(o,...i){return o&&typeof o=="object"&&ao(o),n.call(this,o,...i)},Me=true,true)}catch{return false}}function co(){return Me}var oe=globalThis,Rt="__buoyClockTimer",z=new Map,J=null,uo={},Ct=0,q=()=>S()+Ct;function fo(e){(J?.setTimeout??setTimeout)(()=>{throw e},0)}function Ot(e){let t=Number(e);return Number.isFinite(t)&&t>0?t:0}function po(){return J!==null}function Dt(){if(J)return true;let{setTimeout:e,clearTimeout:t,setInterval:r,clearInterval:n}=oe;if(typeof e!="function"||typeof t!="function")return false;if(e[Rt])return true;uo={setTimeout:e,clearTimeout:t,setInterval:r,clearInterval:n},J={setTimeout:e.bind(globalThis),clearTimeout:t.bind(globalThis),setInterval:(typeof r=="function"?r:e).bind(globalThis),clearInterval:(typeof n=="function"?n:t).bind(globalThis)};let o=J,i=function(d,v,...b){if(typeof d!="function")return o.setTimeout(d,v,...b);let I=Ot(v),k,C=function(){return z.delete(k),d.apply(this,b)};return k=o.setTimeout(C,v),z.set(k,{kind:"timeout",callback:d,args:b,delay:I,due:q()+I,realHandle:k,run:C}),k},s=function(d,v,...b){if(typeof d!="function")return o.setInterval(d,v,...b);let I=Ot(v),k,C=function(){let L=z.get(k);return L&&(L.due=q()+I),d.apply(this,b)};return k=o.setInterval(C,v),z.set(k,{kind:"interval",callback:d,args:b,delay:I,due:q()+I,realHandle:k,run:C}),k},a=(d,v)=>{let b=z.get(d);return b?(z.delete(d),b.kind==="interval"?o.clearInterval(b.realHandle):o.clearTimeout(b.realHandle)):v(d)},l=function(d){return a(d,o.clearTimeout)},c=function(d){return a(d,o.clearInterval)};globalThis.__buoyRealTimers={setTimeout:o.setTimeout,clearTimeout:l,setInterval:o.setInterval,clearInterval:c};for(let d of[i,s,l,c])Object.defineProperty(d,Rt,{value:true});return oe.setTimeout=i,oe.clearTimeout=l,oe.setInterval=s,oe.clearInterval=c,true}function ho(){let e=q(),t=0,r=0,n=null;for(let o of z.values())if(o.kind==="interval")r+=1;else{t+=1;let i=Math.max(0,o.due-e);(n===null||i<n)&&(n=i)}return{total:t+r,timeouts:t,intervals:r,nextTimeoutInMs:n}}function mo(e){let t=q(),r=0;for(let n of z.values())n.due-t<=e&&(r+=1);return r}function go(e){if(!J||!(e>0))return 0;let t=J;Ct+=e;let r=q(),n=[...z.entries()].filter(([,s])=>s.due<=r).sort((s,a)=>s[1].due-a[1].due),o=0;for(let[s,a]of n)if(z.has(s)){a.kind==="timeout"?(z.delete(s),t.clearTimeout(a.realHandle)):a.due=r+a.delay;try{a.callback(...a.args)}catch(l){fo(l)}o+=1}let i=q();for(let s of z.values())s.kind==="timeout"&&(t.clearTimeout(s.realHandle),s.realHandle=t.setTimeout(s.run,Math.max(0,s.due-i)));return o}import{devToolsStorageKeys as yo,persistentStorage as Pt}from"@buoy-gg/shared-ui/web";var ie={persist:true,showChip:true,fireTimersOnJump:true},bo=2*6e4,Et=yo.clock.state();function ko(e){if(!e)return null;try{let t=JSON.parse(e);if(!t||t.v!==1)return null;let r=t.settings??{},n=t.reload&&vt(t.reload.anchor)&&typeof t.reload.at=="number"?{anchor:t.reload.anchor,at:t.reload.at}:void 0;return{v:1,anchor:vt(t.anchor)?t.anchor:null,...n?{reload:n}:{},settings:{persist:typeof r.persist=="boolean"?r.persist:ie.persist,showChip:typeof r.showChip=="boolean"?r.showChip:ie.showChip,fireTimersOnJump:typeof r.fireTimersOnJump=="boolean"?r.fireTimersOnJump:ie.fireTimersOnJump}}}catch{return null}}async function xo(){try{return ko(await Pt.getItem(Et))}catch{return null}}var _e=Promise.resolve();function Fe(e){let t=JSON.stringify(e);return _e=_e.then(()=>Pt.setItem(Et,t)).catch(()=>{}),_e.then(()=>{})}import{dispatchToolAction as vo}from"@buoy-gg/shared-ui/web";import{loadToolModule as wo}from"@buoy-gg/shared-ui/web/utils";var zt="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",ye={};for(let e=0;e<zt.length;e++)ye[zt[e]]=e;ye["-"]=62;ye._=63;function Be(e){let t=e.replace(/=+$/,""),r=[],n=0,o=0;for(let i=0;i<t.length;i++){let s=ye[t[i]];if(s===void 0)return null;n=n<<6|s,o+=6,o>=8&&(o-=8,r.push(n>>o&255))}return r}function To(e){let t="";for(let r=0;r<e.length;){let n=e[r],o,i;if(n<128)o=n,i=0;else if(n>=192&&n<224)o=n&31,i=1;else if(n>=224&&n<240)o=n&15,i=2;else if(n>=240&&n<248)o=n&7,i=3;else return null;for(let s=1;s<=i;s++){let a=e[r+s];if(a===void 0||(a&192)!==128)return null;o=o<<6|a&63}t+=String.fromCodePoint(o),r+=i+1}return t}function Ue(e){let t=Be(e);return t?Nt(t):null}function Nt(e){let t=To(e);if(!t||t[0]!=="{")return null;try{let r=JSON.parse(t);return r&&typeof r=="object"&&!Array.isArray(r)?r:null}catch{return null}}function He(e){let t=typeof e=="string"&&e.trim()!==""?Number(e):e;return typeof t=="number"&&Number.isFinite(t)&&t>0?t*1e3:void 0}function se(e,t){if(typeof e=="number"&&Number.isFinite(e)&&e>0)return e<1e11?e*1e3:e;if(typeof e=="string"&&e.trim()!==""){let r=e.trim();if(/^\d+(\.\d+)?$/.test(r))return se(Number(r),t);let n=t(r);return Number.isFinite(n)?n:void 0}}function Ao(e){let t=typeof e=="string"&&/^\d+(\.\d+)?$/.test(e.trim())?Number(e):e;return typeof t=="number"&&Number.isFinite(t)&&t>0?t:void 0}var So=/^[A-Za-z0-9_-]{2,}\.[A-Za-z0-9_-]{2,}\.[A-Za-z0-9_-]*$/,$o=/^[A-Za-z0-9_-]{2,}\.[A-Za-z0-9_-]*\.[A-Za-z0-9_-]*\.[A-Za-z0-9_-]{2,}\.[A-Za-z0-9_-]*$/,Lt=/^v([1-4])\.(local|public)\.([A-Za-z0-9_-]+)(?:\.([A-Za-z0-9_-]+))?$/,Io={1:256,2:64,3:96,4:64};function U(e){if(typeof e=="string"&&e)return e;if(Array.isArray(e)){let t=e.filter(r=>typeof r=="string");return t.length?t.join(", "):void 0}}function Ro(e,t){let r=e.iss??"",n=e.use;if(r.includes("securetoken.google.com"))return"Firebase ID token";if(r.includes("firebaseappcheck"))return"Firebase App Check token";if(r.includes("cognito-idp"))return n?`Cognito ${n} token`:"Cognito token";if(r.includes("appleid.apple.com"))return"Sign in with Apple token";if(r.includes("accounts.google.com"))return"Google ID token";if(r.includes(".auth0.com")||r.includes("auth0"))return"Auth0 token";if(r.includes("clerk"))return"Clerk session token";if(r.includes("supabase")||r.includes("/auth/v1"))return"Supabase access token";if(r.includes("okta"))return"Okta token";if(r.includes("/realms/"))return"Keycloak token";if(r.includes("login.microsoftonline.com")||r.includes("sts.windows.net"))return"Microsoft Entra token";let o=typeof t?.typ=="string"?t.typ.toLowerCase():"";if(o==="at+jwt"||o==="application/at+jwt")return"OAuth access token"}function Co(e,t){let r={iss:U(e.iss),aud:U(e.aud),sub:U(e.sub),scope:U(e.scope??e.scp),use:U(e.token_use)},n=He(e.exp);return{claims:r,issuedAt:He(e.iat),notBefore:He(e.nbf),expiresAt:n,expirySource:n?t:void 0}}function Oo(e){let[t,r]=e.split("."),n=Ue(t);if(!n||typeof n.alg!="string"&&typeof n.typ!="string")return null;let o=Ue(r);if(!o)return null;let i=typeof n.alg=="string"?n.alg:void 0,s=Co(o,"exp claim");return s.claims.alg=i,!s.claims.use&&typeof n.typ=="string"&&n.typ.toUpperCase()!=="JWT"&&(s.claims.use=n.typ),{format:"jwt",formatLabel:i?`JWT \xB7 ${i}`:"JWT",hint:Ro(s.claims,n),...s}}function Do(e){let t=Ue(e.split(".")[0]);return!t||typeof t.enc!="string"?null:{format:"jwe",formatLabel:"Encrypted JWT",claims:{alg:typeof t.alg=="string"?t.alg:void 0}}}function Po(e,t){let r=Lt.exec(e);if(!r)return null;let[,n,o,i]=r;if(o==="local")return{format:"paseto-local",formatLabel:`PASETO v${n} (encrypted)`,claims:{}};let s=Be(i),a=Io[n],l=s&&s.length>a?Nt(s.slice(0,s.length-a)):null,c={format:"paseto-public",formatLabel:`PASETO v${n}`,claims:{}};return l&&(c.claims={iss:U(l.iss),aud:U(l.aud),sub:U(l.sub)},c.issuedAt=se(l.iat,t),c.notBefore=se(l.nbf,t),c.expiresAt=se(l.exp,t),c.expiresAt&&(c.expirySource="exp claim")),c}function Eo(e){if(!e.startsWith("gAAAAA")||e.length<76)return null;let t=Be(e);if(!t||t[0]!==128||t.length<73||(t.length-57)%16!==0)return null;let r=0;for(let n=1;n<=8;n++)r=r*256+t[n];return r<978307200||r>4102444800?null:{format:"fernet",formatLabel:"Fernet",claims:{},issuedAt:r*1e3}}var zo=[{test:/^ya29\./,hint:"Google OAuth access token"},{test:/^gh[opsu]_/,hint:"GitHub token"},{test:/^github_pat_/,hint:"GitHub token"},{test:/^xox[abeprs]-/,hint:"Slack token"},{test:/^EAA[A-Za-z0-9]{40,}/,hint:"Facebook access token"},{test:/^shp(at|ca|pa|ss)_/,hint:"Shopify token"},{test:/^(sk|rk|pk)_(live|test)_/,hint:"Stripe API key",neverExpires:true},{test:/^AIza[0-9A-Za-z_-]{35}$/,hint:"Google API key",neverExpires:true}];function be(e,t=Date.parse){let r=e.trim().replace(/^"(.*)"$/,"$1");if(r.length<16||/\s/.test(r))return null;if(So.test(r)){let i=Oo(r);if(i)return i}if($o.test(r)){let i=Do(r);if(i)return i}if(r.startsWith("v")&&Lt.test(r)){let i=Po(r,t);if(i)return i}let n=Eo(r);if(n)return n;let o=zo.find(i=>i.test.test(r));return{format:"opaque",formatLabel:"Opaque",hint:o?.hint,neverExpires:o?.neverExpires,claims:{}}}function No(e){return!!e&&e.format!=="opaque"}function H(e){let t=2166136261;for(let r=0;r<e.length;r++)t^=e.charCodeAt(r),t=Math.imul(t,16777619)>>>0;return t.toString(16).padStart(8,"0")}function Ve(e){let t=/^([a-z][a-z0-9+.-]*:\/\/[^/?#]+)/i.exec(e);return t?t[1].toLowerCase():null}function Lo(e){let t=Ve(e);return t?t.replace(/^[a-z][a-z0-9+.-]*:\/\//,""):"unknown"}function We(e){return e.replace(/^[a-z][a-z0-9+.-]*:\/\/[^/?#]+/i,"").split(/[?#]/)[0]||"/"}function jo(e){let t=e.split("#")[0].split("?")[1];if(!t)return[];let r=[];for(let n of t.split("&")){let o=n.indexOf("=");if(!(o<=0))try{r.push([decodeURIComponent(n.slice(0,o)),decodeURIComponent(n.slice(o+1))])}catch{}}return r}var Je=/(token|jwt|session|auth|appcheck|api[-_]?key|apikey|credential|bearer)/i,Mo=new Set(["authorization","cookie","dpop","idempotency-key","x-request-id","x-correlation-id","www-authenticate","proxy-authenticate","x-csrf-token","x-xsrf-token"]),jt=new Set(["access_token","accesstoken","id_token","token","auth","auth_token","jwt","session","session_token"]),_o=new Set(["bearer","token","jwt","dpop","oauth","firebase"]);function Mt(e){let t={};if(!e)return t;for(let[r,n]of Object.entries(e))typeof n=="string"?t[r.toLowerCase()]=n:Array.isArray(n)&&(t[r.toLowerCase()]=n.join(", "));return t}function Fo(e){let t=[];for(let r of e.split(";")){let n=r.indexOf("=");n<=0||t.push([r.slice(0,n).trim(),r.slice(n+1).trim()])}return t}function ae(e,t,r){let n=be(e,r);return n&&(No(n)||n.hint||t)?n:null}function _t(e,t){let r=[],n=Mt(e.requestHeaders),o=n.authorization;if(o){let i=/^(\S+)\s+(\S+)$/.exec(o.trim()),s=i?i[1]:void 0,a=i?i[2]:o.trim();if(!s||_o.has(s.toLowerCase())){let l=ae(a,true,t);l&&r.push({location:"authorization",name:"Authorization",scheme:s,fp:H(a),info:l})}}for(let[i,s]of Object.entries(n)){if(Mo.has(i)||!Je.test(i))continue;let a=s.replace(/^bearer\s+/i,""),l=ae(a,true,t);l&&r.push({location:"header",name:i,fp:H(a),info:l})}if(n.cookie)for(let[i,s]of Fo(n.cookie)){let a=ae(s,Je.test(i)||/^(sid|sess)/i.test(i),t);a&&r.push({location:"cookie",name:i,fp:H(s),info:a})}for(let[i,s]of jo(e.url)){let a=ae(s,jt.has(i.toLowerCase()),t);a&&jt.has(i.toLowerCase())&&r.push({location:"query",name:i,fp:H(s),info:a})}return r}var Bo=/^(access_?token|accesstoken|token|jwt|auth_?token|session_?token|sessiontoken)$/i,Ft=/^(id_?token|idtoken)$/i,ke=/^(refresh_?token|refreshtoken)$/i,Uo=["expires_in","expiresIn","ExpiresIn","expires","ttl"],Ho=["expires_at","expiresAt","ExpiresAt","expiration","Expiration","expiry","expirationTime","expiration_time","access_token_expires_at","accessTokenExpiresAt","accessTokenExpiry"],Vo=["refresh_expires_in","refresh_token_expires_in","refreshTokenExpiresIn","refreshExpiresIn"],Wo=["refresh_expires_at","refreshTokenExpiresAt","refresh_token_expires_at"];function Jo(e){if(typeof e!="string")return e;let t=e.trim();if(!(t.startsWith("{")||t.startsWith("[")))return null;try{return JSON.parse(t)}catch{return null}}function qe(e,t,r){if(t>4||!e||typeof e!="object")return;if(Array.isArray(e)){for(let o of e.slice(0,5))qe(o,t+1,r);return}let n=e;for(let[o,i]of Object.entries(n))typeof i=="string"&&(Bo.test(o)||Ft.test(o)||ke.test(o))?r.push({key:o,value:i,holder:n}):i&&typeof i=="object"&&qe(i,t+1,r)}function qo(e){return ke.test(e)?"refresh":Ft.test(e)?"id":/session/i.test(e)?"session":"access"}function Bt(e,t,r,n,o){for(let i of t){let s=Ao(e[i]);if(s!==void 0)return{expiresAt:n+s*1e3,source:i,lifetimeMs:s*1e3}}for(let i of r){let s=se(e[i],o);if(s!==void 0)return{expiresAt:s,source:i}}return{}}function Ko(e){let t=e["set-cookie"];return t?t.split(/,(?=\s*[A-Za-z0-9!#$%&'*+.^_`|~-]+=)/).map(r=>r.trim()):[]}function Zo(e,t){if(e.status===void 0||e.status>=400)return[];let r=`${e.method.toUpperCase()} ${We(e.url)}`,n=e.timestamp+(e.duration??0),o=[],i=Jo(e.responseData);if(i){let a=[];qe(i,0,a);let l=new Map;for(let c of a.filter(d=>ke.test(d.key))){let d=be(c.value,t);if(!d)continue;let v=Bt(c.holder,Vo,Wo,n,t);l.set(c.holder,{fp:H(c.value),expiresAt:d.expiresAt??v.expiresAt,formatLabel:d.formatLabel})}for(let c of a){if(ke.test(c.key))continue;let d=be(c.value,t);if(!d)continue;let v=Bt(c.holder,Uo,Ho,n,t);o.push({fp:H(c.value),info:d,role:qo(c.key),expiresAt:v.expiresAt,expirySource:v.source,lifetimeMs:v.lifetimeMs,issuedBy:r,refresh:l.get(c.holder)})}}let s=Mt(e.responseHeaders);for(let a of Ko(s)){let[l,...c]=a.split(";"),d=l.indexOf("=");if(d<=0)continue;let v=l.slice(0,d).trim(),b=l.slice(d+1).trim(),I=ae(b,Je.test(v)||/^(sid|sess)/i.test(v),t);if(!I||b===""||b.toLowerCase()==="deleted")continue;let k,C,L;for(let jr of c){let[Mr,..._r]=jr.split("="),ft=Mr.trim().toLowerCase(),Re=_r.join("=").trim();if(ft==="max-age"&&/^-?\d+$/.test(Re))L=Number(Re)*1e3,k=n+L,C="Max-Age";else if(ft==="expires"&&C!=="Max-Age"){let pt=t(Re);Number.isFinite(pt)&&(k=pt,C="Expires")}}o.push({fp:H(b),info:I,role:"cookie",cookie:v,expiresAt:I.expiresAt??k,expirySource:I.expiresAt?I.expirySource:C,lifetimeMs:I.expiresAt?void 0:L,issuedBy:r})}return o}var Ke=e=>A.parse(e),Ut=4,Ht=2e4,Yo=8,Go=8,Xo=200,Qo=1e3,D=new Map,X=new Map,ei=new Set,ti=new Set,Vt=new Set,ri=/(token|refresh|oauth|session|auth\/)/i,p=null,xe=true,Ze=null,Ye=new Set,Ge=false;function le(){Ge||(Ge=true,Promise.resolve().then(()=>{Ge=false,Ye.forEach(e=>e())}))}function ni(e){return Ye.add(e),()=>{Ye.delete(e)}}function Wt(e,t){if(e.has(t))return false;if(e.size>=Qo){let r=e.values().next().value;r!==void 0&&e.delete(r)}return e.add(t),true}function Xe(e,t){return`${e}|${t.location}:${t.name.toLowerCase()}`}function Jt(e,t){let r=t?.lifetimeMs!==void 0&&t.expiresAt!==void 0,n=r?t.expiresAt:e.expiresAt??t?.expiresAt,o=e.expiresAt??(r?t.observedReal+t.lifetimeMs:t?.expiresAt),i=r?t.expirySource:e.expiresAt?e.expirySource:t?.expirySource,s=r?t.lifetimeMs:e.expiresAt!==void 0&&e.issuedAt!==void 0?e.expiresAt-e.issuedAt:void 0;return{expiresAt:n,serverExpiresAt:o,source:i,lifetimeMs:s}}function Qe(e,t,r,n,o){let i=X.get(t),s=Jt(r,i),a=e.fp!==t;a&&(e.history.unshift({fp:e.fp,firstSeenReal:e.firstSeenReal,expiresAt:e.expiresAt}),e.history.length=Math.min(e.history.length,Go),e.fp=t,e.firstSeenReal=n,e.firstSeenApp=o,e.uses=0,e.expiredSends=0,e.rejected=0),e.info=r,e.role=i?.role??(a?void 0:e.role),e.issuedBy=i?.issuedBy??(a?void 0:e.issuedBy),e.refresh=i?.refresh??(a?void 0:e.refresh),e.expiresAt=s.expiresAt,e.serverExpiresAt=s.serverExpiresAt,e.expirySource=s.source,e.lifetimeMs=s.lifetimeMs,a&&oi(e,n)}function qt(e,t,r,n,o){let i=X.get(r.fp),s=Jt(r.info,i);return{key:e,origin:t,host:Lo(t),location:r.location,name:r.name,scheme:r.scheme,fp:r.fp,info:r.info,role:i?.role,issuedBy:i?.issuedBy,refresh:i?.refresh,expiresAt:s.expiresAt,serverExpiresAt:s.serverExpiresAt,expirySource:s.source,lifetimeMs:s.lifetimeMs,firstSeenReal:n,firstSeenApp:o,lastUsedReal:n,lastUsedApp:o,uses:0,expiredSends:0,rejected:0,history:[]}}function Kt(){if(D.size<=Yo)return;let e=null;for(let t of D.values())(!e||t.lastUsedReal<e.lastUsedReal)&&(e=t);e&&e.key!==p?.tokenId&&D.delete(e.key)}function oi(e,t){!p||p.tokenId!==e.key||(p.newTokens+=1,p.status==="waiting"&&(p.status="refreshed",p.refreshedAt=t,p.ruleId&&p.forcedAt===void 0&&vo("network","deleteOverrideRule",{id:p.ruleId}).catch(()=>{})),p.newTokens>=Ut&&t-(p.refreshedAt??t)<=Ht&&(p.status="loop"))}function ii(e){let t=Ve(e.url);if(!t)return;let r=_t(e,Ke);if(r.length===0)return;let n=S(),o=e.timestamp;for(let i of r){let s=Xe(t,i),a=D.get(s);a?Qe(a,i.fp,i.info,n,o):(a=qt(s,t,i,n,o),D.set(s,a),Kt()),a.uses+=1,a.lastUsedReal=n,a.lastUsedApp=o,a.expiresAt!==void 0&&o>=a.expiresAt&&(a.expiredSends+=1),p&&p.tokenId===s&&p.forcedAt!==void 0&&i.fp===p.startFp&&(p.staleAfterFailure+=1)}le()}function si(e){let t=Ve(e.url);if(!t)return;let r=S(),n=false;if(e.status===401||e.status===403)for(let i of _t(e,Ke)){let s=D.get(Xe(t,i));s&&s.fp===i.fp&&(s.rejected+=1,n=true)}let o=!!p?.ruleId&&e.override?.ruleId===p.ruleId;if(p&&(e.status??0)>=400&&!o){let i=`${e.method.toUpperCase()} ${We(e.url)}`;(Vt.has(i)||e.method.toUpperCase()==="POST"&&ri.test(We(e.url)))&&(p.failedRefreshes+=1,p.lastRefreshError=`${e.status} ${i}`,n=true)}p?.ruleId&&e.override?.ruleId===p.ruleId&&p.forcedAt===void 0&&(p.forcedAt=r,n=true);for(let i of Zo(e,Ke)){if(Vt.add(i.issuedBy),X.set(i.fp,{...i,observedReal:r}),X.size>Xo){let s=X.keys().next().value;s!==void 0&&X.delete(s)}if(n=true,i.cookie){let s={location:"cookie",name:i.cookie,fp:i.fp,info:i.info},a=Xe(t,s),l=D.get(a);l?Qe(l,i.fp,i.info,r,e.timestamp):(D.set(a,qt(a,t,s,r,e.timestamp)),Kt());continue}for(let s of D.values())s.fp===i.fp&&Qe(s,i.fp,s.info,r,s.lastUsedApp)}n&&le()}function ai(e){let t=e;!t||typeof t.id!="string"||typeof t.url!="string"||(Wt(ei,t.id)&&ii(t),t.status!==void 0&&Wt(ti,t.id)&&si(t))}function ve(){if(Ze)return true;try{let{networkEventStore:e}=wo("@buoy-gg/network");if(!e?.onEvent)throw new Error("no event store");Ze=e.onEvent(ai,true),xe=true}catch{xe=false}return le(),xe}function Zt(e,t,r){let n=D.get(t);if(!n)throw new Error(`No token row "${t}".`);return p={kind:e,tokenId:t,startedAt:S(),startFp:n.fp,ruleId:r,status:"waiting",newTokens:0,staleAfterFailure:0,failedRefreshes:0},le(),p}function li(){p=null,le()}function ci(e){return e.location==="cookie"?`${e.name} cookie`:e.location==="query"?`${e.name} parameter`:e.location==="header"?`${e.name} header`:e.role==="id"||e.info.claims.use==="id"?"ID token":"Access token"}function ui(e,t){let r=[e.firstSeenReal,...e.history.map(o=>o.firstSeenReal)].slice(0,-1).filter(o=>t-o<=Ht).length,n=e.info.issuedAt;return{id:e.key,label:ci(e),host:e.host,location:e.location,name:e.name,scheme:e.scheme,format:e.info.format,formatLabel:e.info.formatLabel,hint:e.info.hint,claims:e.info.claims,fingerprint:e.fp,issuedAt:n,notBefore:e.info.notBefore,expiresAt:e.expiresAt,serverExpiresAt:e.serverExpiresAt,expirySource:e.expirySource,lifetimeMs:e.lifetimeMs,neverExpires:e.info.neverExpires,issuedBy:e.issuedBy,refresh:e.refresh?{expiresAt:e.refresh.expiresAt,formatLabel:e.refresh.formatLabel}:void 0,firstUsed:e.firstSeenApp,lastUsed:e.lastUsedApp,lastUsedReal:e.lastUsedReal,uses:e.uses,refreshes:e.history.length,lastRefreshAt:e.history.length?e.firstSeenReal:void 0,recentRefreshes:r,looping:r>=Ut,expiredSends:e.expiredSends,rejected:e.rejected}}function we(){let e=S(),t=[...D.values()].sort((r,n)=>n.lastUsedReal-r.lastUsedReal).map(r=>ui(r,e));if(p?.status==="refreshed"){let r=D.get(p.tokenId);r&&(p.newLifetimeMs=r.lifetimeMs,p.newIssuedBy=r.issuedBy)}return{available:xe,watching:Ze!==null,tokens:t,check:p?{...p}:null}}function di(e){let t=we();return e?t.tokens.find(r=>r.id===e||r.fingerprint===e)??null:t.tokens.find(r=>r.expiresAt!==void 0)??t.tokens[0]??null}function fi(e){return D.get(e)?.origin??null}import{isProNow as Yt}from"@buoy-gg/shared-ui/web";var f={anchor:Ce,settings:ie,lastJump:null,changedAt:null,hydrated:false},et=new Set,Te=null;function Gt(){Te=null,et.forEach(e=>e())}ni(Gt);function ce(e){return et.add(e),()=>{et.delete(e)}}function pi(){return f.settings}function Xt(){return M(f.anchor,S())}function Qt(){return f.anchor.mode!=="real"}function hi(e){if(e.mode==="real"){$t(null),so();return}Dt(),$t(t=>M(f.anchor,t)),io()}function mi(){let e={v:1,anchor:f.settings.persist&&Yt()?f.anchor:null,settings:f.settings};Fe(e)}function er(){let e={v:1,anchor:f.settings.persist&&Yt()?f.anchor:null,settings:f.settings};return f.settings.persist&&f.anchor.mode!=="real"&&(e.reload={anchor:f.anchor,at:S()}),Fe(e)}function Q(e,{save:t=true}={}){f={...f,...e},e.anchor&&hi(f.anchor),t&&mi(),Gt()}function ee(e,t=f.lastJump){Q({anchor:e,lastJump:t,changedAt:S(),hydrated:true})}var tr=e=>A.parse(e);function rr(e,t=false){let r=S(),n=M(f.anchor,r),o=wt(e,n,tr),i=o-n;return ee(Pe(f.anchor,r,o,t),{byMs:i,firedTimers:0,at:r}),R()}function tt(e,t){let r=Ee(e),n=S(),o=Kn(f.anchor,n,r),i=(t??f.settings.fireTimersOnJump)&&r>0;if(ee(o,{byMs:r,firedTimers:0,at:n}),i){let s=go(r);s>0&&Q({lastJump:{byMs:r,firedTimers:s,at:n}},{save:false})}return R()}function rt(e){let t=S(),r=M(f.anchor,t),n=e===void 0||e===""?r:wt(e,r,tr);return ee(Zn(f.anchor,t,n)),R()}function nt(){return f.anchor.mode==="frozen"&&ee(Yn(f.anchor,S())),R()}function nr(e){return ee(Gn(f.anchor,S(),Number(e))),R()}function ot(){return ee(Ce,null),R()}function or(e){let t={...f.settings};for(let r of Object.keys(ie))typeof e[r]=="boolean"&&(t[r]=e[r]);return Q({settings:t}),R()}function gi(e){return e>0?mo(e):0}var ir=false;function sr(e){if(!e){Q({hydrated:true},{save:false});return}let t=e.reload?S()-e.reload.at:1/0,r=t>=0&&t<bo?e.reload?.anchor:void 0;e.reload&&Fe({v:1,anchor:e.anchor,settings:e.settings});let n=e.anchor??r??null;Q({settings:e.settings,anchor:n??Ce,changedAt:n?S():null,hydrated:true},{save:false})}function it(){if(ir)return;ir=true,Dt();let e=void 0;if(e!==void 0){sr(e);return}xo().then(t=>{f.changedAt===null?sr(t):Q({hydrated:true},{save:false})})}function yi(){try{return Intl.DateTimeFormat().resolvedOptions().timeZone??"unknown"}catch{return"unknown"}}function R(){let e=S(),t=M(f.anchor,e);return{mode:f.anchor.mode,active:f.anchor.mode!=="real",rate:f.anchor.rate,virtualNow:t,virtualIso:new A(t).toISOString(),realNow:e,offsetMs:qn(f.anchor,e),timeZone:yi(),timers:ho(),lastJump:f.lastJump,changedAt:f.changedAt,settings:f.settings,hydrated:f.hydrated,tokens:we(),patched:{date:Qn(),intl:oo(),timers:po(),animatedOnRealClock:co()}}}function ar(){return Te||(Te=R()),Te}import{useSyncExternalStore as bi}from"react";import{ClockToolIcon as lr,FloatingTool as ki,Pause as xi,Play as vi,X as wi,dismissFloatingTool as Ti,getFloatingTools as Ai,getUseIsPro as Si,night as ue,openFloatingTool as cr}from"@buoy-gg/shared-ui/web";import{useEffect as $i,useState as Ii}from"react";function V(e,t=250){let[,r]=Ii(0);$i(()=>{let s=setInterval(()=>r(a=>a+1),t);return()=>clearInterval(s)},[t]);let n=S();if(!e)return{virtual:n,real:n};let o=n-e.realNow,i=e.mode==="real"?1:e.rate;return{virtual:e.mode==="frozen"?e.virtualNow:e.virtualNow+o*i,real:n}}var F=e=>String(e).padStart(2,"0");function de(e){let t=new A(e);return`${F(t.getHours())}:${F(t.getMinutes())}:${F(t.getSeconds())}`}var Ri=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],ur=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function Ci(e){let t=new A(e);return`${Ri[t.getDay()]}, ${ur[t.getMonth()]} ${t.getDate()}, ${t.getFullYear()}`}function Ae(e,t=true){let r=new A(e),n=t?de(e):`${F(r.getHours())}:${F(r.getMinutes())}`;return`${ur[r.getMonth()]} ${r.getDate()} \xB7 ${n}`}function dr(e){let t=new A(e);return`${t.getFullYear()}-${F(t.getMonth()+1)}-${F(t.getDate())} ${F(t.getHours())}:${F(t.getMinutes())}`}function Oi(e){if(Math.abs(e)<1e3)return"matches real time";let t=te(Math.abs(e),{signed:false});return e>0?`${t} ahead of real time`:`${t} behind real time`}function fr(e){return e.mode==="real"?{label:"Real time",tone:"neutral"}:e.mode==="frozen"?{label:"Frozen",tone:"info"}:e.rate!==1?{label:`${At(e.rate)} speed`,tone:"warning"}:{label:"Overridden",tone:"accent"}}function Di(e){return`clock-jump-${e<0?"minus":"plus"}-${te(Math.abs(e),{signed:false}).replace(/\s/g,"")}`}import{jsx as N,jsxs as st}from"react/jsx-runtime";var Se="clock-chip",pr={id:Se,render:e=>N(mr,{...e})},Pi=()=>Ai().some(e=>e.id===Se);function Ei(){cr(pr)}var hr=false;function zi(){if(hr)return;hr=true;let e=false,t=()=>{let r=Qt()&&pi().showChip;r&&!e?cr(pr):!r&&Pi()&&Ti(Se),e=r};ce(t),t()}function mr({id:e,revealToken:t}){let r=bi(ce,ar,ar),{virtual:n,real:o}=V(r),i=r.mode==="frozen",s=Si()(),a=i||s,l=fr(r),c=n-o,d=`${Math.abs(c)<1e3?"0s":te(c)} \xB7 ${l.label.toLowerCase()}`;return N(ki,{id:e,revealToken:t,variant:"strip",dragFromSurface:true,defaultPlacement:"top",accessibilityLabel:`Move or hide the clock chip. App time ${Ae(n)}`,handleAdornment:N(lr,{size:12}),children:st(m,{style:K.row,children:[N(lr,{size:18}),st(m,{style:K.text,children:[N(w,{style:K.time,numberOfLines:1,testID:"clock-chip-time",children:Ae(n)}),N(w,{style:K.detail,numberOfLines:1,testID:"clock-chip-detail",children:d})]}),a?st(B,{testID:i?"clock-chip-resume":"clock-chip-freeze",accessibilityRole:"button",accessibilityLabel:i?"Resume the app clock":"Freeze the app clock",onPress:()=>i?nt():rt(),style:K.button,hitSlop:{top:8,bottom:8,left:4,right:4},children:[i?N(vi,{size:16,color:ue.color.accent}):null,i?null:N(xi,{size:16,color:ue.color.text})]}):null,a?N(m,{style:K.separator}):null,N(B,{testID:"clock-chip-reset",accessibilityRole:"button",accessibilityLabel:"Back to real time",onPress:()=>ot(),style:K.button,hitSlop:{top:8,bottom:8,left:4,right:8},children:N(wi,{size:16,color:ue.color.textSecondary})})]})})}var K=Y.create({row:{flexDirection:"row",alignItems:"center",gap:10,paddingLeft:10,paddingRight:4,paddingVertical:6,minWidth:220},text:{flexShrink:1,minWidth:120},time:{color:"#F59E0B",fontSize:14,fontWeight:"600",fontVariant:["tabular-nums"]},detail:{color:ue.color.textSecondary,fontSize:11,fontVariant:["tabular-nums"]},button:{width:32,height:32,alignItems:"center",justifyContent:"center",borderRadius:16},separator:{width:Y.hairlineWidth,height:20,backgroundColor:ue.color.separator}});import{ClockToolIcon as Ni,CLOCK_TOOL_ICON_COLOR as Li,createToolFactory as ji,defineToolPreset as Mi}from"@buoy-gg/shared-ui/web";import{useEffect as gr,useState as _i}from"react";import{reloadApp as Fi}from"@buoy-gg/shared-ui/web";import{createSyncAdapter as Bi}from"@buoy-gg/shared-ui/web";import{dispatchToolAction as yr}from"@buoy-gg/shared-ui/web";var br="No sign-in token seen yet. Use the app so it sends a signed-in request, then try again. Tokens are read from the Network tool's captured requests.";function kr(e){ve();let t=di(e);if(!t)throw new Error(e?`No token "${e}". Read getState for the current ids.`:br);return t}function xr(e,t=1e4){let r=kr(e);if(r.expiresAt===void 0)throw new Error(r.neverExpires?`${r.label} for ${r.host} is ${r.hint??"a key"} and never expires.`:`${r.label} for ${r.host} (${r.formatLabel}) has no expiry Buoy can read. Use failNextRequest to test the refresh instead.`);let n=r.expiresAt-Math.max(0,t)-Xt();if(n<=0)throw new Error(`${r.label} for ${r.host} has already expired on the app's clock. Go back to real time, or use failNextRequest.`);return tt(n),Zt("expiry",r.id),R()}async function vr(e,t=401,r=1){let n=kr(e),o=fi(n.id);if(!o)throw new Error(br);await wr();let i=t===403?403:401,s=n.location==="authorization"||n.location==="header"?{urlPattern:`${o}/*`,requireHeader:n.name.toLowerCase()}:n.location==="query"?{urlPattern:`${o}/*${n.name}=*`}:{urlPattern:`${o}/*`},a=await yr("network","upsertOverrideRule",{name:"Clock: force a token refresh",...s,kind:"respond",status:i,headers:{"content-type":"application/json","www-authenticate":'Bearer error="invalid_token", error_description="The access token expired"'},body:JSON.stringify({error:"invalid_token",error_description:"The access token expired (forced by Buoy Clock to test token refresh)"}),times:Math.max(1,Math.min(10,Math.round(r)))}).catch(l=>{let c=l instanceof Error?l.message:String(l);throw new Error(c.includes("Unknown tool")?"Failing a request needs the Network tool (@buoy-gg/network).":c)});if(!a?.ok||!a.rule)throw new Error(a?.error??"Network did not add the override.");return Zt("401",n.id,a.rule.id),R()}async function wr(){let e=we().check;e?.ruleId&&e.forcedAt===void 0&&await yr("network","deleteOverrideRule",{id:e.ruleId}).catch(()=>{})}async function Tr(){return await wr(),li(),R()}function Z(e){return e&&typeof e=="object"?e:{}}function at(e,...t){for(let r of t){let n=e[r];if(typeof n=="string"||typeof n=="number")return n}}function fe(e,t){let r=e[t];if(typeof r=="boolean")return r;if(r==="true")return true;if(r==="false")return false}var Ar=Bi({version:1,getSnapshot(){return R()},subscribe(e){return ce(e)},actions:{getState(){return ve(),R()},setTime(e){let t=Z(e),r=at(t,"time","at","date","iso");if(r===void 0)throw new Error('setTime needs `time`: ISO 8601 ("2026-12-31T23:59:50"), epoch ms, or relative ("+1d").');return rr(r,fe(t,"freeze")??false)},shift(e){let t=Z(e),r=at(t,"by","ms","duration","delta");if(r===void 0)throw new Error('shift needs `by`: a duration like "+1d", "-2h30m", "90s", or ms.');return tt(r,fe(t,"fireTimers"))},freeze(e){return rt(at(Z(e),"time","at"))},resume(){return nt()},setRate(e){let t=Z(e),r=Number(t.rate??t.speed);if(!Number.isFinite(r))throw new Error("setRate needs a numeric `rate` (1 = normal speed).");return nr(r)},reset(){return ot()},updateSettings(e){let t=Z(e);return or({persist:fe(t,"persist"),showChip:fe(t,"showChip"),fireTimersOnJump:fe(t,"fireTimersOnJump")})},jumpToTokenExpiry(e){let t=Z(e),r=typeof t.token=="string"?t.token:typeof t.id=="string"?t.id:void 0,n=Number(t.leadMs??t.lead??1e4);return xr(r,Number.isFinite(n)?n:1e4)},failNextRequest(e){let t=Z(e),r=typeof t.token=="string"?t.token:typeof t.id=="string"?t.id:void 0,n=Number(t.status??401),o=Number(t.times??1);return vr(r,n,Number.isFinite(o)?o:1)},stopTokenCheck(){return Tr()},async holdForReload(){return await er(),R()}}});import{useState as $e}from"react";import{ChevronRight as Ui,NightButton as Hi,NightCard as Ie,NightChip as Vi,NightFootnote as lt,NightRows as ct,NightSectionLabel as Sr,NightSegmented as Wi,NightSwitch as $r,ProBadge as Ji,ProUpgradeModal as qi,getUseIsPro as Ki,monoFont as Zi,night as y,useSafeAreaInsets as Yi}from"@buoy-gg/shared-ui/web";import{ChevronRight as Gi,NightButton as Ir,NightCard as Xi,NightFootnote as Qi,NightRows as es,NightSectionLabel as ts,ProBadge as rs,night as x}from"@buoy-gg/shared-ui/web";import{jsx as T,jsxs as j}from"react/jsx-runtime";var W=e=>te(Math.abs(e),{signed:false});function ns({snapshot:e,run:t,openId:r,onToggle:n,isPro:o,onUpgrade:i}){let s=e.tokens;return j(m,{children:[T(ts,{children:s.tokens.length>1?"Sign-in tokens":"Sign-in token"}),T(Xi,{children:j(es,{children:[s.tokens.map((a,l)=>j(m,{children:[T(os,{token:a,snapshot:e,index:l,open:r===a.id,onPress:()=>n(a.id)}),r===a.id?T(is,{token:a,snapshot:e,run:o?t:()=>i("Sign-in token tests"),isPro:o}):null]},a.id)),s.tokens.length===0?T(m,{style:g.row,testID:"clock-token-empty",children:T(w,{style:g.emptyText,children:s.available?"No token seen yet":"Needs the Network tool"})},"empty"):null]})}),T(as,{check:s.check,tokens:s.tokens,snapshot:e,run:t}),s.tokens.length===0?T(Qi,{children:s.available?"Tokens show up here when the app sends a signed-in request.":"Install @buoy-gg/network so the Clock tool can read the app's tokens."}):null]})}function os({token:e,snapshot:t,index:r,open:n,onPress:o}){let{virtual:i}=V(t,1e3),s=e.expiresAt!==void 0?e.expiresAt-i:void 0,a=e.neverExpires?"No expiry":s===void 0?"Unknown":s<=0?"Expired":W(s),l=s!==void 0&&s<=0?g.valueDanger:s!==void 0&&s<6e4?g.valueWarning:null;return j(B,{testID:`clock-token-${r}`,accessibilityRole:"button",accessibilityLabel:`${e.label} for ${e.host}: ${s!==void 0&&s>0?`expires in ${a}`:a}`,accessibilityState:{expanded:n},activeOpacity:.6,onPress:o,style:g.row,children:[j(m,{style:g.rowText,children:[T(w,{style:g.rowTitle,numberOfLines:1,children:e.label}),T(w,{style:g.rowSubtitle,numberOfLines:1,children:`${e.host} \xB7 ${e.hint??e.formatLabel}`})]}),j(m,{style:g.rowRight,children:[T(w,{style:[g.value,l],testID:`clock-token-${r}-left`,children:a}),T(m,{style:n?g.chevronOpen:null,children:T(Gi,{size:16,color:x.color.textTertiary})})]})]})}function is({token:e,snapshot:t,run:r,isPro:n}){let{virtual:o,real:i}=V(t,1e3),s=ss(e,o,i),a=e.expiresAt!==void 0&&e.expiresAt-o>1e4;return j(m,{style:g.detail,testID:"clock-token-detail",children:[s.map(l=>T(w,{style:[g.detailLine,l.tone==="warn"?g.warn:null,l.tone==="bad"?g.bad:null],children:l.text},l.text)),j(m,{style:g.buttons,children:[T(m,{style:g.button,children:T(Ir,{label:"Jump to Expiry",testID:"clock-token-jump",accessibilityLabel:"Jump the app's clock to ten seconds before this token expires",size:"md",disabled:!a,onPress:()=>r("jumpToTokenExpiry",{token:e.id})})}),T(m,{style:g.button,children:T(Ir,{label:"Fail Next Request",testID:"clock-token-fail",accessibilityLabel:"Answer the app's next request to this API with 401",size:"md",onPress:()=>r("failNextRequest",{token:e.id})})})]}),n?null:j(m,{style:g.proLine,children:[T(rs,{}),T(w,{style:[g.hint,g.proHint],children:"Jump to Expiry and Fail Next Request are part of Buoy Pro."})]}),T(w,{style:g.hint,children:a||e.expiresAt===void 0?"Jump tests an app that refreshes before expiry. Fail tests one that refreshes after a 401.":"This token has already expired on the app's clock. Use Real Time to jump to it again."})]})}function ss(e,t,r){let n=[];if(e.expiresAt!==void 0){if(n.push({text:`Expires ${Ae(e.expiresAt)}`}),e.lifetimeMs!==void 0&&e.lifetimeMs>0&&n.push({text:`Lasts ${W(e.lifetimeMs)}${e.expirySource?`, from ${e.expirySource}`:""}`}),e.serverExpiresAt!==void 0){let o=e.expiresAt-t,i=e.serverExpiresAt-r;Math.abs(o-i)>2e3&&n.push({text:i>0?`The server still accepts it for ${W(i)}`:`The server stopped accepting it ${W(i)} ago`})}}else e.neverExpires||n.push({text:"The token doesn't say when it expires, and no login response did either."});if(e.hint&&n.push({text:e.formatLabel}),e.issuedBy&&n.push({text:`Issued by ${e.issuedBy}`}),e.refresh?.expiresAt!==void 0){let o=e.refresh.expiresAt-t;n.push({text:o>0?`Refresh token expires in ${W(o)}`:"Refresh token expired"})}return e.refreshes>0&&e.lastRefreshAt!==void 0&&n.push({text:`Refreshed ${e.refreshes===1?"once":`${e.refreshes} times`}, last at ${de(e.lastRefreshAt)}`}),n.push({text:`Sent with ${e.uses} request${e.uses===1?"":"s"}`}),e.expiredSends>0&&n.push({text:`Sent ${e.expiredSends} time${e.expiredSends===1?"":"s"} after it expired on the app's clock`,tone:"warn"}),e.rejected>0&&n.push({text:`Rejected by the server ${e.rejected} time${e.rejected===1?"":"s"}`,tone:"warn"}),e.looping&&n.push({text:`Refresh loop: ${e.recentRefreshes} new tokens in 20s`,tone:"bad"}),n}function as({check:e,tokens:t,snapshot:r,run:n}){let{virtual:o,real:i}=V(r,1e3);if(!e)return null;let s=t.find(c=>c.id===e.tokenId),{text:a,tone:l}=ls(e,s,o,i);return j(m,{style:g.check,children:[T(w,{style:[g.checkText,l==="good"?g.good:null,l==="bad"?g.bad:null,l==="warn"?g.warn:null],testID:"clock-token-check",children:a}),T(B,{testID:"clock-token-check-done",accessibilityRole:"button",accessibilityLabel:e.status==="waiting"?"Stop the refresh check":"Dismiss",onPress:()=>n("stopTokenCheck"),hitSlop:{top:8,bottom:8,left:8,right:8},children:T(w,{style:g.checkDone,children:e.status==="waiting"?"Stop":"Done"})})]})}function ls(e,t,r,n){if(e.status==="loop")return{text:`Refresh loop: ${e.newTokens} new tokens since the check started. The new tokens may already look expired to the app's clock.`,tone:"bad"};if(e.status==="refreshed"){let a=e.newIssuedBy?` by ${e.newIssuedBy}`:"",l=e.newLifetimeMs&&e.newLifetimeMs>0?`. The new token lasts ${W(e.newLifetimeMs)}`:"",c=e.kind==="401"&&e.forcedAt!==void 0?"The app got the 401 and refreshed":"Refreshed",d=e.failedRefreshes>0?` ${e.failedRefreshes===1?"One token request":`${e.failedRefreshes} token requests`} failed first (${e.lastRefreshError}).`:"";return{text:`${c} at ${de(e.refreshedAt??n)}${a}${l}.${d}`,tone:d?"warn":"good"}}let o=n-e.startedAt,i=(e.staleAfterFailure>0?` It sent the old token again ${e.staleAfterFailure} time${e.staleAfterFailure===1?"":"s"}.`:"")+(e.failedRefreshes>0?` Its token request failed (${e.lastRefreshError}).`:"");if(o>6e4)return{text:`No new token after ${W(o)}. The app may refresh on its next action, or not at all.${i}`,tone:"warn"};if(e.kind==="401")return e.forcedAt===void 0?{text:`The next request to ${t?.host??"the API"} will get a 401. Use the app to send one.`}:{text:`The app got the 401. Waiting for a new token\u2026${i}`,tone:i?"warn":void 0};let s=t?.expiresAt!==void 0?t.expiresAt-r:void 0;return s!==void 0&&s>0?{text:`Expires in ${W(s)} on the app's clock. Waiting for a new token\u2026`}:{text:"Expired on the app's clock. Waiting for the app's next request\u2026"}}var g=Y.create({row:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",gap:12,minHeight:56,paddingHorizontal:x.rowPadH,paddingVertical:10},rowText:{flex:1,minWidth:0},rowTitle:{color:x.color.text,fontSize:x.font.row},rowSubtitle:{color:x.color.textTertiary,fontSize:x.font.caption,marginTop:2},rowRight:{flexDirection:"row",alignItems:"center",gap:6},value:{color:x.color.textSecondary,fontSize:x.font.row,fontVariant:["tabular-nums"]},valueWarning:{color:x.color.warning},valueDanger:{color:x.color.danger},chevronOpen:{transform:[{rotate:"90deg"}]},emptyText:{color:x.color.textSecondary,fontSize:x.font.row},detail:{paddingHorizontal:x.rowPadH,paddingBottom:14,gap:4},detailLine:{color:x.color.textSecondary,fontSize:x.font.caption},buttons:{flexDirection:"row",gap:8,marginTop:8},button:{flex:1},hint:{color:x.color.textTertiary,fontSize:x.font.caption,marginTop:6},proLine:{flexDirection:"row",alignItems:"center",gap:8,marginTop:6},proHint:{marginTop:0,flexShrink:1},check:{flexDirection:"row",alignItems:"flex-start",gap:12,marginTop:8,marginHorizontal:x.labelInset},checkText:{flex:1,color:x.color.textSecondary,fontSize:x.font.caption,lineHeight:18},checkDone:{color:x.color.accent,fontSize:x.font.caption,fontWeight:"600"},good:{color:x.color.accent},warn:{color:x.color.warning},bad:{color:x.color.danger}});import{jsx as u,jsxs as $}from"react/jsx-runtime";var Rr="#F59E0B";function Cr({snapshot:e,onAction:t,onReload:r}){let n=Yi({minBottom:16}),[o,i]=$e(null),[s,a]=$e(null),l=Ki()(),[c,d]=$e(null),v=k=>d(k),b=(k,C)=>{i(null),t(k,C).catch(L=>{i(L instanceof Error?L.message:String(L))})},I=k=>a(C=>C===k?null:k);return e?$(xt,{style:h.fill,contentContainerStyle:[h.content,{paddingBottom:n.bottom}],testID:"clock-scroll",keyboardShouldPersistTaps:"handled",children:[u(cs,{snapshot:e}),o?u(lt,{tone:"danger",centered:true,children:u(w,{testID:"clock-error",children:o})}):null,$(m,{children:[u(Sr,{children:"Jump ahead"}),u(ds,{run:b})]}),$(m,{children:[u(Ie,{children:$(ct,{children:[$(m,{children:[u(Dr,{title:"Date & Time",testID:"clock-date-row",open:s==="date",onPress:()=>I("date"),value:u(fs,{snapshot:e})}),s==="date"?u(hs,{snapshot:e,run:b,onDone:()=>a(null)}):null]},"date"),$(m,{style:h.row,children:[u(ut,{title:"Freeze",isPro:l}),u($r,{value:e.mode==="frozen",testID:"clock-freeze",accessibilityLabel:"Freeze the clock",onValueChange:k=>k&&!l?v("Freeze"):b(k?"freeze":"resume")})]},"freeze"),$(m,{children:[u(Dr,{title:"Speed",pro:!l,testID:"clock-speed-row",open:s==="speed",onPress:()=>l?I("speed"):v("Speed"),value:u(w,{style:h.rowValue,children:zr(e)})}),s==="speed"?u(ms,{snapshot:e,run:b}):null]},"speed")]})}),u(lt,{children:"Only this app's clock changes. Screens pick up the new time when they next render, or all at once when you reload."})]}),e.tokens?u(ns,{snapshot:e,run:b,openId:s,onToggle:I,isPro:l,onUpgrade:v}):null,u(Ie,{children:$(ct,{children:[r?u(Pr,{label:"Reload App",testID:"clock-reload",onPress:r},"reload"):null,u(Pr,{label:"Use Real Time",accessibilityLabel:"Reset to real time",testID:"clock-reset",destructive:true,disabled:e.mode==="real",onPress:()=>b("reset")},"reset")]})}),$(m,{children:[u(Sr,{children:"Options"}),u(ys,{settings:e.settings,run:b,isPro:l,onUpgrade:v})]}),u(qi,{visible:c!==null&&!l,onClose:()=>d(null),featureName:c??void 0})]}):u(m,{style:h.waiting,testID:"clock-waiting",children:u(lt,{centered:true,children:"Waiting for the app's clock\u2026"})})}function ut({title:e,isPro:t}){return $(m,{style:h.titleRow,children:[u(w,{style:h.rowTitle,children:e}),t?null:u(Ji,{})]})}function cs({snapshot:e}){let{virtual:t,real:r}=V(e),n=fr(e),o=e.mode!=="real",i=Oi(t-r),s=e.mode==="frozen"?" \xB7 Frozen":o&&e.rate!==1?` \xB7 ${zr(e)}`:"";return $(m,{style:h.hero,children:[u(w,{style:[h.heroTime,o?h.heroTimeActive:null],testID:"clock-hero-time",accessibilityLabel:`App clock ${de(t)}`,children:de(t)}),u(w,{style:h.heroDate,testID:"clock-hero-date",children:Ci(t)}),u(m,{testID:"clock-status",accessibilityLabel:`Clock status: ${n.label}${o?`, ${i}`:""}`,children:u(w,{style:[h.heroStatus,o?h.heroStatusActive:null],testID:"clock-offset",children:o?`${i}${s}`:"Real time"})})]})}var Or=36e5,dt=24*Or,us=[{ms:Or,unit:"hour"},{ms:dt,unit:"day"},{ms:7*dt,unit:"week"},{ms:30*dt,unit:"month"}];function ds({run:e}){return u(Ie,{style:h.jumpBar,children:us.map((t,r)=>$(B,{testID:Di(t.ms),accessibilityRole:"button",accessibilityLabel:`Jump ahead one ${t.unit}`,activeOpacity:.6,onPress:()=>e("shift",{by:t.ms}),style:[h.jump,r>0?h.jumpDivider:null],children:[u(w,{style:h.jumpAmount,children:"+1"}),u(w,{style:h.jumpUnit,children:t.unit})]},t.unit))})}function Dr({title:e,pro:t,value:r,open:n,onPress:o,testID:i}){return $(B,{testID:i,accessibilityRole:"button",accessibilityLabel:e,accessibilityState:{expanded:n},activeOpacity:.6,onPress:o,style:h.row,children:[u(ut,{title:e,isPro:!t}),$(m,{style:h.rowRight,children:[r,u(m,{style:n?h.chevronOpen:null,children:u(Ui,{size:16,color:y.color.textTertiary})})]})]})}function fs({snapshot:e}){let{virtual:t}=V(e,1e3);return u(w,{style:[h.rowValue,h.tabular],numberOfLines:1,children:Ae(t,false)})}function Pr({label:e,onPress:t,testID:r,destructive:n,disabled:o,accessibilityLabel:i}){return u(B,{testID:r,accessibilityRole:"button",accessibilityLabel:i??e,accessibilityState:{disabled:!!o},activeOpacity:.6,disabled:o,onPress:t,style:[h.row,o?h.rowDisabled:null],children:u(w,{style:[h.actionLabel,n?h.actionDestructive:null],children:e})})}var ps=Tt.filter(e=>["midnight","month-end","year-end"].includes(e.id));function hs({snapshot:e,run:t,onDone:r}){let[n,o]=$e(""),{virtual:i}=V(e,1e3),s=()=>n.trim()||dr(i),a=e.mode==="frozen",l=c=>{t("setTime",{time:c,freeze:a}),r()};return $(m,{style:h.editor,children:[$(m,{style:h.inputRow,children:[u(kt,{testID:"clock-time-input",accessibilityLabel:"Date and time",value:n,onChangeText:o,placeholder:dr(i),placeholderTextColor:y.color.placeholder,autoCapitalize:"none",autoCorrect:false,returnKeyType:"done",onSubmitEditing:()=>l(s()),style:h.input}),u(Hi,{label:"Set",testID:"clock-time-apply",accessibilityLabel:"Set this time",size:"md",variant:"primary",fullWidth:false,onPress:()=>l(s())})]}),u(w,{style:h.hint,children:"Year-month-day and 24-hour time, or +3d, -2h"}),u(m,{style:h.presets,children:ps.map(c=>u(Vi,{label:c.label,testID:`clock-preset-${c.id}`,onPress:()=>l(c.at(i,A))},c.id))})]})}var Er=[{key:"1",label:"Normal"},{key:"10",label:"10\xD7"},{key:"60",label:"1 min/s"},{key:"3600",label:"1 hr/s"}];function zr(e){return e.mode==="real"||e.rate===1?"Normal":Er.find(t=>Number(t.key)===e.rate)?.label??At(e.rate)}function ms({snapshot:e,run:t}){let r=e.mode==="real"?"1":String(e.rate);return $(m,{style:h.editor,children:[u(m,{style:h.segmentRow,children:u(Wi,{tabs:Er,activeKey:r,size:"sm",testIDPrefix:"clock-speed",onChange:n=>t("setRate",{rate:Number(n)})})}),u(w,{style:h.hint,children:"Taps, animations and timers keep real speed."})]})}var gs=[{key:"showChip",title:"Show Floating Clock"},{key:"persist",title:"Keep After Reload",pro:true}];function ys({settings:e,run:t,isPro:r,onUpgrade:n}){return u(Ie,{children:u(ct,{children:gs.map(o=>{let i=!!o.pro&&!r;return $(m,{style:h.row,children:[u(ut,{title:o.title,isPro:!i}),u($r,{value:i?false:e[o.key],testID:`clock-setting-${o.key}`,accessibilityLabel:o.title,onValueChange:s=>i?n(o.title):t("updateSettings",{[o.key]:s})})]},o.key)})})})}var h=Y.create({fill:{flex:1},content:{paddingHorizontal:y.gutter,paddingTop:8,gap:y.groupGap},waiting:{flex:1,alignItems:"center",justifyContent:"center",padding:24},hero:{alignItems:"center",paddingTop:12},heroTime:{color:y.color.text,fontSize:56,fontWeight:"200",fontVariant:["tabular-nums"],letterSpacing:1},heroTimeActive:{color:Rr},heroDate:{color:y.color.text,fontSize:17,fontWeight:"500",marginTop:2},heroStatus:{color:y.color.textTertiary,fontSize:y.font.caption,fontWeight:"500",marginTop:6},heroStatusActive:{color:y.color.textSecondary},jumpBar:{flexDirection:"row"},jump:{flex:1,alignItems:"center",paddingVertical:12},jumpDivider:{borderLeftWidth:Y.hairlineWidth,borderLeftColor:y.color.separator},jumpAmount:{color:Rr,fontSize:17,fontWeight:"600",fontVariant:["tabular-nums"]},jumpUnit:{color:y.color.textSecondary,fontSize:y.font.caption,marginTop:1},row:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",gap:12,minHeight:50,paddingHorizontal:y.rowPadH,paddingVertical:10},rowDisabled:{opacity:.4},rowTitle:{color:y.color.text,fontSize:y.font.row},titleRow:{flexDirection:"row",alignItems:"center",gap:8,flexShrink:1},rowRight:{flexDirection:"row",alignItems:"center",gap:6,flexShrink:1},rowValue:{color:y.color.textSecondary,fontSize:y.font.row},tabular:{fontVariant:["tabular-nums"]},chevronOpen:{transform:[{rotate:"90deg"}]},actionLabel:{color:y.color.accent,fontSize:y.font.row},actionDestructive:{color:y.color.danger},editor:{paddingHorizontal:y.rowPadH,paddingBottom:14,gap:10},inputRow:{flexDirection:"row",alignItems:"center",gap:8},input:{flex:1,color:y.color.text,fontFamily:Zi,fontSize:15,backgroundColor:y.color.bg,borderRadius:y.radius.input,borderWidth:1,borderColor:y.color.border,paddingHorizontal:12,paddingVertical:8},hint:{color:y.color.textTertiary,fontSize:y.font.caption},presets:{flexDirection:"row",flexWrap:"wrap",gap:6},segmentRow:{flexDirection:"row"}});import{jsx as bs}from"react/jsx-runtime";var ks=Ar.actions;async function xs(e,t){let r=ks[e];if(!r)throw new Error(`Unknown clock action: ${e}`);return r(t)}function vs(){er().then(()=>Fi("auto","buoy clock")).catch(()=>{})}function Nr(){gr(()=>{it(),ve()},[]);let[e,t]=_i(R);return gr(()=>ce(()=>t(R())),[]),bs(Cr,{snapshot:e,onAction:xs,onReload:vs})}import{jsx as ws}from"react/jsx-runtime";var Lr=Mi({id:"clock",name:"CLOCK",description:"Travel to any date, freeze or speed up the app's clock",slot:"both",color:Li,icon:({size:e,color:t})=>ws(Ni,{size:e,color:t}),component:Nr,modal:{subtitle:"override the app's date & time"}}),Ts=ji(Lr);import{ClockToolIcon as As,CLOCK_TOOL_ICON_COLOR as Ss}from"@buoy-gg/shared-ui/web";var $s=typeof navigator<"u"&&navigator.product==="ReactNative";$s&&(lo(bt),zi(),typeof gt<"u"&>&&it());export{Se as CLOCK_CHIP_ID,Ss as CLOCK_TOOL_ICON_COLOR,Nr as ClockBody,mr as ClockChip,As as ClockToolIcon,Cr as ClockToolView,Tt as TIME_PRESETS,it as bootClock,Ar as clockSyncAdapter,Lr as clockToolPreset,Ts as createClockTool,vr as failNextRequest,te as formatDuration,rt as freeze,R as getClockSnapshot,we as getTokenReport,be as inspectToken,Qt as isClockOverridden,xr as jumpToTokenExpiry,Ei as openClockChip,Ee as parseDuration,gi as previewJump,S as realNow,ot as reset,nt as resume,nr as setRate,rr as setTime,tt as shift,ve as startTokenWatch,Tr as stopTokenCheck,ce as subscribeClock,H as tokenFingerprint,or as updateSettings,V as useLiveClock,Xt as virtualNow,je as withRealClock};
|
|
1
|
+
"use client";var mt=Object.defineProperty;var Br=Object.getOwnPropertyDescriptor;var Ur=Object.getOwnPropertyNames;var Hr=Object.prototype.hasOwnProperty;var Vr=(e,t)=>{for(var r in t)mt(e,r,{get:t[r],enumerable:true})},gt=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Ur(t))!Hr.call(e,o)&&o!==r&&mt(e,o,{get:()=>t[o],enumerable:!(n=Br(t,o))||n.enumerable});return e},Wr=(e,t,r)=>(gt(e,t,"default"),r&>(r,t,"default"));var yt=(()=>{try{let e=globalThis.Capacitor;if(e&&typeof e.isNativePlatform=="function"&&e.isNativePlatform())return e.DEBUG===true}catch{}return process.env.NODE_ENV!=="production"})();typeof window<"u"&&typeof globalThis.global>"u"&&(globalThis.global=globalThis);var bt={};Vr(bt,{AccessibilityInfo:()=>Zr,ActivityIndicator:()=>Hn,Alert:()=>Jn,Animated:()=>kt,AppRegistry:()=>Gr,AppState:()=>Xr,Appearance:()=>Yr,BackHandler:()=>Qr,Button:()=>Vn,CheckBox:()=>gn,Clipboard:()=>en,DeviceEventEmitter:()=>Pn,Dimensions:()=>tn,Easing:()=>rn,FlatList:()=>yn,I18nManager:()=>nn,Image:()=>bn,ImageBackground:()=>kn,InteractionManager:()=>an,Keyboard:()=>on,KeyboardAvoidingView:()=>xn,LayoutAnimation:()=>sn,Linking:()=>ln,LogBox:()=>On,Modal:()=>Bn,NativeEventEmitter:()=>cn,NativeModules:()=>Kr,PanResponder:()=>un,Picker:()=>vn,PixelRatio:()=>fn,Platform:()=>dn,Pressable:()=>Fn,ProgressBar:()=>wn,RefreshControl:()=>Tn,SafeAreaView:()=>An,ScrollView:()=>vt,SectionList:()=>Sn,Share:()=>pn,StatusBar:()=>$n,StyleSheet:()=>Y,Switch:()=>Un,Text:()=>w,TextInput:()=>xt,Touchable:()=>In,TouchableHighlight:()=>Mn,TouchableNativeFeedback:()=>Rn,TouchableOpacity:()=>B,TouchableWithoutFeedback:()=>_n,UIManager:()=>hn,Vibration:()=>mn,View:()=>m,VirtualizedList:()=>Cn,YellowBox:()=>Dn,findNodeHandle:()=>Wn,unstable_createElement:()=>qr,useColorScheme:()=>Nn,useLocaleContext:()=>En,useWindowDimensions:()=>zn});Wr(bt,Jr);import*as Jr from"react-native-web";import{unstable_createElement as qr,NativeModules as Kr,AccessibilityInfo as Zr,Animated as kt,Appearance as Yr,AppRegistry as Gr,AppState as Xr,BackHandler as Qr,Clipboard as en,Dimensions as tn,Easing as rn,I18nManager as nn,Keyboard as on,InteractionManager as an,LayoutAnimation as sn,Linking as ln,NativeEventEmitter as cn,PanResponder as un,PixelRatio as fn,Platform as dn,Share as pn,StyleSheet as Y,UIManager as hn,Vibration as mn,CheckBox as gn,FlatList as yn,Image as bn,ImageBackground as kn,KeyboardAvoidingView as xn,Picker as vn,ProgressBar as wn,RefreshControl as Tn,SafeAreaView as An,SectionList as Sn,StatusBar as $n,Touchable as In,TouchableNativeFeedback as Rn,VirtualizedList as Cn,YellowBox as Dn,LogBox as On,DeviceEventEmitter as Pn,useColorScheme as Nn,useLocaleContext as En,useWindowDimensions as zn}from"react-native-web";import*as D from"react-native-web";import{createElement as Ln,forwardRef as jn}from"react";function P(e){let t=jn((n,o)=>{let{accessibilityState:i,accessibilityValue:a,...s}=n;for(let l of["busy","checked","disabled","expanded","selected"])i?.[l]!==void 0&&s[`aria-${l}`]===void 0&&(s[`aria-${l}`]=i[l]);for(let[l,c]of Object.entries({min:"valuemin",max:"valuemax",now:"valuenow",text:"valuetext"}))a?.[l]!==void 0&&s[`aria-${c}`]===void 0&&(s[`aria-${c}`]=a[l]);return Ln(e,{...s,ref:o})}),r=e.State;return r&&Object.assign(t,{State:r}),t.displayName=e.displayName??e.name??"NativeWebView",t}var m=P(D.View),w=P(D.Text),xt=P(D.TextInput),B=P(D.TouchableOpacity),Mn=P(D.TouchableHighlight),_n=P(D.TouchableWithoutFeedback),Fn=P(D.Pressable),vt=P(D.ScrollView),Bn=P(D.Modal),Un=P(D.Switch),Hn=P(D.ActivityIndicator),Vn=P(D.Button),Wn=D.findNodeHandle,Jn={alert(e,t,r,n){if(typeof document>"u")return;let o=document.createElement("dialog");o.dataset.buoyRoot="",o.setAttribute("aria-label",e),o.style.cssText="position:fixed;inset:0;margin:auto;width:min(440px,90vw);padding:24px;border:1px solid #475569;border-radius:14px;background:#17212e;color:#f1f5f9;font:14px system-ui;box-shadow:0 20px 80px #0008;z-index:2147483647";let i=document.createElement("h2");if(i.textContent=e,i.style.cssText="font-size:18px;margin:0 0 12px",o.appendChild(i),t){let c=document.createElement("p");c.textContent=t,c.style.cssText="line-height:1.5;white-space:pre-wrap;margin:0 0 20px",o.appendChild(c)}let a=document.createElement("div");a.style.cssText="display:flex;justify-content:flex-end;flex-wrap:wrap;gap:8px";let s=r?.length?r:[{text:"OK"}],l=()=>{o.close?.(),o.remove()};for(let c of s){let f=document.createElement("button");f.type="button",f.textContent=c.text??"OK",f.style.cssText=`padding:9px 14px;border:1px solid #64748b;border-radius:7px;color:white;background:${c.style==="destructive"?"#a52b38":"#283a4d"};cursor:pointer;font:inherit`,f.onclick=()=>{l(),c.onPress?.()},a.appendChild(f)}o.addEventListener("cancel",c=>{c.preventDefault(),n?.cancelable!==false&&(l(),n?.onDismiss?.())}),o.appendChild(a),document.body.appendChild(o),o.showModal?o.showModal():o.setAttribute("open","")}};var Ce=Object.freeze({mode:"real",anchorReal:0,anchorVirtual:0,rate:1}),De=.1,Oe=86400,qn=864e13;function M(e,t){return e.mode==="real"?t:e.mode==="frozen"?e.anchorVirtual:e.anchorVirtual+(t-e.anchorReal)*e.rate}function Kn(e,t){return M(e,t)-t}function G(e){if(!Number.isFinite(e)||Math.abs(e)>qn)throw new RangeError(`Not a valid time: ${e}`);return Math.round(e)}function Pe(e,t,r,n=false){return{mode:n?"frozen":"running",anchorReal:t,anchorVirtual:G(r),rate:e.mode==="real"?1:e.rate}}function Zn(e,t,r){if(!Number.isFinite(r))throw new RangeError("Jump must be a number of ms");return Pe(e,t,M(e,t)+r,e.mode==="frozen")}function Yn(e,t,r){return Pe(e,t,r??M(e,t),true)}function Gn(e,t){return e.mode!=="frozen"?e:{...e,mode:"running",anchorReal:t}}function Xn(e,t,r){if(!Number.isFinite(r)||r<De||r>Oe)throw new RangeError(`Speed must be between ${De}\xD7 and ${Oe}\xD7`);return e.mode==="real"&&r===1?e:{mode:"running",anchorReal:t,anchorVirtual:G(M(e,t)),rate:r}}function wt(e){let t=e;return!!t&&(t.mode==="real"||t.mode==="running"||t.mode==="frozen")&&Number.isFinite(t.anchorReal)&&Number.isFinite(t.anchorVirtual)&&Number.isFinite(t.rate)&&t.rate>=De&&t.rate<=Oe}var Qn={ms:1,millisecond:1,milliseconds:1,s:1e3,sec:1e3,secs:1e3,second:1e3,seconds:1e3,m:6e4,min:6e4,mins:6e4,minute:6e4,minutes:6e4,h:36e5,hr:36e5,hrs:36e5,hour:36e5,hours:36e5,d:864e5,day:864e5,days:864e5,w:6048e5,wk:6048e5,week:6048e5,weeks:6048e5,mo:30*864e5,month:30*864e5,months:30*864e5,y:365*864e5,yr:365*864e5,year:365*864e5,years:365*864e5};function Ne(e){if(typeof e=="number"){if(!Number.isFinite(e))throw new RangeError("Duration must be finite");return Math.round(e)}let t=String(e).trim().toLowerCase();if(!t)throw new RangeError("Duration is empty");let r=1;if((t[0]==="+"||t[0]==="-"||t[0]==="\u2212")&&(r=t[0]==="+"?1:-1,t=t.slice(1).trim()),/^\d+(\.\d+)?$/.test(t))return r*Math.round(Number(t));let n=/(\d+(?:\.\d+)?)\s*([a-z]+)/g,o=0,i="",a;for(;a=n.exec(t);){let s=Qn[a[2]];if(s===void 0)throw new RangeError(`Unknown time unit "${a[2]}" in "${e}"`);o+=Number(a[1])*s,i+=a[0]}if(!i||i.replace(/\s/g,"")!==t.replace(/[\s,]/g,""))throw new RangeError(`Could not read "${e}" as a duration. Try "+1d", "-2h30m" or "90s".`);return r*Math.round(o)}function te(e,{signed:t=true}={}){let r=e<0?"\u2212":"+",n=Math.abs(Math.round(e));if(n<1e3)return t&&n>0?`${r}${n}ms`:"0s";let o=[],i=[["y",365*864e5],["d",864e5],["h",36e5],["m",6e4],["s",1e3]];for(let[a,s]of i)if(n>=s&&(o.push(`${Math.floor(n/s)}${a}`),n%=s),o.length===2)break;return`${t?r:""}${o.join(" ")}`}function Tt(e,t,r){if(typeof e=="number")return G(e);let n=String(e).trim();if(!n)throw new RangeError("Time is empty");if(/^now$/i.test(n))return t;if(/^[+\-−]/.test(n))return G(t+Ne(n));if(/^\d{11,}$/.test(n))return G(Number(n));let o=n.replace(/^(\d{4}-\d{2}-\d{2})[ ](\d{2}:\d{2})/,"$1T$2"),i=r(o);if(!Number.isFinite(i))throw new RangeError(`Could not read "${e}" as a time. Use ISO 8601 like 2026-12-31T23:59:50, epoch ms, or "+1d".`);return G(i)}var Ee=1e4,At=[{id:"midnight",label:"Before midnight",hint:"23:59:50 tonight",at(e,t){let r=new t(e);return r.setHours(24,0,0,0),r.getTime()-Ee}},{id:"month-end",label:"Month end",hint:"last day, 23:59:50",at(e,t){let r=new t(e);return r.setMonth(r.getMonth()+1,1),r.setHours(0,0,0,0),r.getTime()-Ee}},{id:"year-end",label:"New Year's Eve",hint:"Dec 31, 23:59:50",at(e,t){let r=new t(e);return r.setFullYear(r.getFullYear()+1,0,1),r.setHours(0,0,0,0),r.getTime()-Ee}},{id:"tomorrow-9",label:"Tomorrow 9 AM",hint:"start of a business day",at(e,t){let r=new t(e);return r.setDate(r.getDate()+1),r.setHours(9,0,0,0),r.getTime()}},{id:"leap-day",label:"Leap day",hint:"next Feb 29, 09:00",at(e,t){let r=new t(e).getFullYear();for(;;){let n=r%4===0&&r%100!==0||r%400===0,o=new t(r,1,29,9,0,0,0).getTime();if(n&&o>e)return o;r+=1}}}],Oa=[{label:"1m",ms:6e4},{label:"15m",ms:15*6e4},{label:"1h",ms:36e5},{label:"1d",ms:864e5},{label:"7d",ms:7*864e5},{label:"30d",ms:30*864e5},{label:"1y",ms:365*864e5}];function St(e){return e===3600?"1h/s":e===600?"10m/s":e===60?"1m/s":`${Number.isInteger(e)?e:e.toFixed(1)}\xD7`}var N=globalThis,pe="__buoyClock",A=N.__buoyRealDate??(Date[pe]?Date.__buoyRealDate:Date);N.__buoyRealDate=A;var $t=A.now.bind(A);function S(){return $t()}N.__buoyRealNow=S;var ze=null,Le=0;function he(){let e=$t();return!ze||Le>0?e:ze(e)}function It(e){ze=e}function je(e){Le+=1;try{return e()}finally{Le-=1}}N.__buoyWithRealClock=je;function _(...e){let t=new.target;return t?Reflect.construct(A,e.length===0?[he()]:e,t):new A(he()).toString()}_.prototype=A.prototype;Object.defineProperty(_,"name",{value:"Date"});Object.defineProperty(_,"length",{value:7});Object.defineProperty(_,"now",{value:function(){return he()},writable:true,configurable:true});Object.defineProperty(_,"parse",{value:A.parse,writable:true,configurable:true});Object.defineProperty(_,"UTC",{value:A.UTC,writable:true,configurable:true});Object.defineProperty(_,pe,{value:true});Object.defineProperty(_,"__buoyRealDate",{value:A});var re=_,me=false,ge;function eo(){return me&&N.Date===re}function to(){if(N.Date===re){me=true;return}let e=Object.getOwnPropertyDescriptor(N,"Date");Object.defineProperty(N,"Date",{value:re,writable:e?.writable??true,enumerable:e?.enumerable??false,configurable:true}),ge=Object.getOwnPropertyDescriptor(A.prototype,"constructor");try{Object.defineProperty(A.prototype,"constructor",{value:re,writable:true,enumerable:false,configurable:true})}catch{}me=true}function ro(){if(N.Date===re){let e=Object.getOwnPropertyDescriptor(N,"Date");Object.defineProperty(N,"Date",{value:A,writable:e?.writable??true,enumerable:e?.enumerable??false,configurable:true})}if(ge){try{Object.defineProperty(A.prototype,"constructor",ge)}catch{}ge=void 0}me=false}var ne=[];function Rt(e){return function(t,...r){return e.call(this,t===void 0?he():t,...r)}}function no(){if(ne.length)return;let e=N.Intl?.DateTimeFormat?.prototype;if(e)for(let t of["format","formatToParts"]){let r=Object.getOwnPropertyDescriptor(e,t);if(!(!r||!r.configurable))try{if(typeof r.get=="function"){let n=r.get;Object.defineProperty(e,t,{...r,get(){return Rt(n.call(this))}})}else if(typeof r.value=="function")Object.defineProperty(e,t,{...r,value:Rt(r.value)});else continue;ne.push({proto:e,name:t,original:r})}catch{}}}function oo(){for(let{proto:e,name:t,original:r}of ne)try{Object.defineProperty(e,t,r)}catch{}ne=[]}function io(){return ne.length>0}function ao(){to(),no()}function so(){ro(),oo()}var Me=false;function lo(e){let t=Object.getPrototypeOf(e);for(;t&&t!==Object.prototype;){if(!Object.prototype.hasOwnProperty.call(t,pe)){for(let r of["start","onUpdate"]){let n=Object.getOwnPropertyDescriptor(t,r);if(n&&typeof n.value=="function"){let o=n.value;t[r]=function(...i){return je(()=>o.apply(this,i))}}}try{Object.defineProperty(t,pe,{value:true})}catch{return}}t=Object.getPrototypeOf(t)}}function co(e){if(Me)return true;try{let t=e;if(typeof t?.Value!="function")return false;let r=Object.getPrototypeOf(new t.Value(0)),n=r?.animate;return typeof n!="function"?false:(r.animate=function(o,...i){return o&&typeof o=="object"&&lo(o),n.call(this,o,...i)},Me=true,true)}catch{return false}}function uo(){return Me}var oe=globalThis,Ct="__buoyClockTimer",E=new Map,J=null,fo={},Dt=0,q=()=>S()+Dt;function po(e){(J?.setTimeout??setTimeout)(()=>{throw e},0)}function Ot(e){let t=Number(e);return Number.isFinite(t)&&t>0?t:0}function ho(){return J!==null}function Pt(){if(J)return true;let{setTimeout:e,clearTimeout:t,setInterval:r,clearInterval:n}=oe;if(typeof e!="function"||typeof t!="function")return false;if(e[Ct])return true;fo={setTimeout:e,clearTimeout:t,setInterval:r,clearInterval:n},J={setTimeout:e.bind(globalThis),clearTimeout:t.bind(globalThis),setInterval:(typeof r=="function"?r:e).bind(globalThis),clearInterval:(typeof n=="function"?n:t).bind(globalThis)};let o=J,i=function(f,v,...b){if(typeof f!="function")return o.setTimeout(f,v,...b);let I=Ot(v),k,C=function(){return E.delete(k),f.apply(this,b)};return k=o.setTimeout(C,v),E.set(k,{kind:"timeout",callback:f,args:b,delay:I,due:q()+I,realHandle:k,run:C}),k},a=function(f,v,...b){if(typeof f!="function")return o.setInterval(f,v,...b);let I=Ot(v),k,C=function(){let L=E.get(k);return L&&(L.due=q()+I),f.apply(this,b)};return k=o.setInterval(C,v),E.set(k,{kind:"interval",callback:f,args:b,delay:I,due:q()+I,realHandle:k,run:C}),k},s=(f,v)=>{let b=E.get(f);return b?(E.delete(f),b.kind==="interval"?o.clearInterval(b.realHandle):o.clearTimeout(b.realHandle)):v(f)},l=function(f){return s(f,o.clearTimeout)},c=function(f){return s(f,o.clearInterval)};globalThis.__buoyRealTimers={setTimeout:o.setTimeout,clearTimeout:l,setInterval:o.setInterval,clearInterval:c};for(let f of[i,a,l,c])Object.defineProperty(f,Ct,{value:true});return oe.setTimeout=i,oe.clearTimeout=l,oe.setInterval=a,oe.clearInterval=c,true}function mo(){let e=q(),t=0,r=0,n=null;for(let o of E.values())if(o.kind==="interval")r+=1;else{t+=1;let i=Math.max(0,o.due-e);(n===null||i<n)&&(n=i)}return{total:t+r,timeouts:t,intervals:r,nextTimeoutInMs:n}}function go(e){let t=q(),r=0;for(let n of E.values())n.due-t<=e&&(r+=1);return r}function yo(e){if(!J||!(e>0))return 0;let t=J;Dt+=e;let r=q(),n=[...E.entries()].filter(([,a])=>a.due<=r).sort((a,s)=>a[1].due-s[1].due),o=0;for(let[a,s]of n)if(E.has(a)){s.kind==="timeout"?(E.delete(a),t.clearTimeout(s.realHandle)):s.due=r+s.delay;try{s.callback(...s.args)}catch(l){po(l)}o+=1}let i=q();for(let a of E.values())a.kind==="timeout"&&(t.clearTimeout(a.realHandle),a.realHandle=t.setTimeout(a.run,Math.max(0,a.due-i)));return o}import{devToolsStorageKeys as bo,persistentStorage as Nt}from"@buoy-gg/shared-ui/web";function ko(){try{let e=globalThis.localStorage;return e?Et(e.getItem(_e)):void 0}catch{return}}var ie={persist:true,showChip:true,fireTimersOnJump:true},xo=2*6e4,_e=bo.clock.state();function Et(e){if(!e)return null;try{let t=JSON.parse(e);if(!t||t.v!==1)return null;let r=t.settings??{},n=t.reload&&wt(t.reload.anchor)&&typeof t.reload.at=="number"?{anchor:t.reload.anchor,at:t.reload.at}:void 0;return{v:1,anchor:wt(t.anchor)?t.anchor:null,...n?{reload:n}:{},settings:{persist:typeof r.persist=="boolean"?r.persist:ie.persist,showChip:typeof r.showChip=="boolean"?r.showChip:ie.showChip,fireTimersOnJump:typeof r.fireTimersOnJump=="boolean"?r.fireTimersOnJump:ie.fireTimersOnJump}}}catch{return null}}async function vo(){try{return Et(await Nt.getItem(_e))}catch{return null}}var Fe=Promise.resolve();function Be(e){let t=JSON.stringify(e);return Fe=Fe.then(()=>Nt.setItem(_e,t)).catch(()=>{}),Fe.then(()=>{})}import{dispatchToolAction as wo}from"@buoy-gg/shared-ui/web";import{loadToolModule as To}from"@buoy-gg/shared-ui/web/utils";var zt="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",ye={};for(let e=0;e<zt.length;e++)ye[zt[e]]=e;ye["-"]=62;ye._=63;function Ue(e){let t=e.replace(/=+$/,""),r=[],n=0,o=0;for(let i=0;i<t.length;i++){let a=ye[t[i]];if(a===void 0)return null;n=n<<6|a,o+=6,o>=8&&(o-=8,r.push(n>>o&255))}return r}function Ao(e){let t="";for(let r=0;r<e.length;){let n=e[r],o,i;if(n<128)o=n,i=0;else if(n>=192&&n<224)o=n&31,i=1;else if(n>=224&&n<240)o=n&15,i=2;else if(n>=240&&n<248)o=n&7,i=3;else return null;for(let a=1;a<=i;a++){let s=e[r+a];if(s===void 0||(s&192)!==128)return null;o=o<<6|s&63}t+=String.fromCodePoint(o),r+=i+1}return t}function He(e){let t=Ue(e);return t?Lt(t):null}function Lt(e){let t=Ao(e);if(!t||t[0]!=="{")return null;try{let r=JSON.parse(t);return r&&typeof r=="object"&&!Array.isArray(r)?r:null}catch{return null}}function Ve(e){let t=typeof e=="string"&&e.trim()!==""?Number(e):e;return typeof t=="number"&&Number.isFinite(t)&&t>0?t*1e3:void 0}function ae(e,t){if(typeof e=="number"&&Number.isFinite(e)&&e>0)return e<1e11?e*1e3:e;if(typeof e=="string"&&e.trim()!==""){let r=e.trim();if(/^\d+(\.\d+)?$/.test(r))return ae(Number(r),t);let n=t(r);return Number.isFinite(n)?n:void 0}}function So(e){let t=typeof e=="string"&&/^\d+(\.\d+)?$/.test(e.trim())?Number(e):e;return typeof t=="number"&&Number.isFinite(t)&&t>0?t:void 0}var $o=/^[A-Za-z0-9_-]{2,}\.[A-Za-z0-9_-]{2,}\.[A-Za-z0-9_-]*$/,Io=/^[A-Za-z0-9_-]{2,}\.[A-Za-z0-9_-]*\.[A-Za-z0-9_-]*\.[A-Za-z0-9_-]{2,}\.[A-Za-z0-9_-]*$/,jt=/^v([1-4])\.(local|public)\.([A-Za-z0-9_-]+)(?:\.([A-Za-z0-9_-]+))?$/,Ro={1:256,2:64,3:96,4:64};function U(e){if(typeof e=="string"&&e)return e;if(Array.isArray(e)){let t=e.filter(r=>typeof r=="string");return t.length?t.join(", "):void 0}}function Co(e,t){let r=e.iss??"",n=e.use;if(r.includes("securetoken.google.com"))return"Firebase ID token";if(r.includes("firebaseappcheck"))return"Firebase App Check token";if(r.includes("cognito-idp"))return n?`Cognito ${n} token`:"Cognito token";if(r.includes("appleid.apple.com"))return"Sign in with Apple token";if(r.includes("accounts.google.com"))return"Google ID token";if(r.includes(".auth0.com")||r.includes("auth0"))return"Auth0 token";if(r.includes("clerk"))return"Clerk session token";if(r.includes("supabase")||r.includes("/auth/v1"))return"Supabase access token";if(r.includes("okta"))return"Okta token";if(r.includes("/realms/"))return"Keycloak token";if(r.includes("login.microsoftonline.com")||r.includes("sts.windows.net"))return"Microsoft Entra token";let o=typeof t?.typ=="string"?t.typ.toLowerCase():"";if(o==="at+jwt"||o==="application/at+jwt")return"OAuth access token"}function Do(e,t){let r={iss:U(e.iss),aud:U(e.aud),sub:U(e.sub),scope:U(e.scope??e.scp),use:U(e.token_use)},n=Ve(e.exp);return{claims:r,issuedAt:Ve(e.iat),notBefore:Ve(e.nbf),expiresAt:n,expirySource:n?t:void 0}}function Oo(e){let[t,r]=e.split("."),n=He(t);if(!n||typeof n.alg!="string"&&typeof n.typ!="string")return null;let o=He(r);if(!o)return null;let i=typeof n.alg=="string"?n.alg:void 0,a=Do(o,"exp claim");return a.claims.alg=i,!a.claims.use&&typeof n.typ=="string"&&n.typ.toUpperCase()!=="JWT"&&(a.claims.use=n.typ),{format:"jwt",formatLabel:i?`JWT \xB7 ${i}`:"JWT",hint:Co(a.claims,n),...a}}function Po(e){let t=He(e.split(".")[0]);return!t||typeof t.enc!="string"?null:{format:"jwe",formatLabel:"Encrypted JWT",claims:{alg:typeof t.alg=="string"?t.alg:void 0}}}function No(e,t){let r=jt.exec(e);if(!r)return null;let[,n,o,i]=r;if(o==="local")return{format:"paseto-local",formatLabel:`PASETO v${n} (encrypted)`,claims:{}};let a=Ue(i),s=Ro[n],l=a&&a.length>s?Lt(a.slice(0,a.length-s)):null,c={format:"paseto-public",formatLabel:`PASETO v${n}`,claims:{}};return l&&(c.claims={iss:U(l.iss),aud:U(l.aud),sub:U(l.sub)},c.issuedAt=ae(l.iat,t),c.notBefore=ae(l.nbf,t),c.expiresAt=ae(l.exp,t),c.expiresAt&&(c.expirySource="exp claim")),c}function Eo(e){if(!e.startsWith("gAAAAA")||e.length<76)return null;let t=Ue(e);if(!t||t[0]!==128||t.length<73||(t.length-57)%16!==0)return null;let r=0;for(let n=1;n<=8;n++)r=r*256+t[n];return r<978307200||r>4102444800?null:{format:"fernet",formatLabel:"Fernet",claims:{},issuedAt:r*1e3}}var zo=[{test:/^ya29\./,hint:"Google OAuth access token"},{test:/^gh[opsu]_/,hint:"GitHub token"},{test:/^github_pat_/,hint:"GitHub token"},{test:/^xox[abeprs]-/,hint:"Slack token"},{test:/^EAA[A-Za-z0-9]{40,}/,hint:"Facebook access token"},{test:/^shp(at|ca|pa|ss)_/,hint:"Shopify token"},{test:/^(sk|rk|pk)_(live|test)_/,hint:"Stripe API key",neverExpires:true},{test:/^AIza[0-9A-Za-z_-]{35}$/,hint:"Google API key",neverExpires:true}];function be(e,t=Date.parse){let r=e.trim().replace(/^"(.*)"$/,"$1");if(r.length<16||/\s/.test(r))return null;if($o.test(r)){let i=Oo(r);if(i)return i}if(Io.test(r)){let i=Po(r);if(i)return i}if(r.startsWith("v")&&jt.test(r)){let i=No(r,t);if(i)return i}let n=Eo(r);if(n)return n;let o=zo.find(i=>i.test.test(r));return{format:"opaque",formatLabel:"Opaque",hint:o?.hint,neverExpires:o?.neverExpires,claims:{}}}function Lo(e){return!!e&&e.format!=="opaque"}function H(e){let t=2166136261;for(let r=0;r<e.length;r++)t^=e.charCodeAt(r),t=Math.imul(t,16777619)>>>0;return t.toString(16).padStart(8,"0")}function We(e){let t=/^([a-z][a-z0-9+.-]*:\/\/[^/?#]+)/i.exec(e);return t?t[1].toLowerCase():null}function jo(e){let t=We(e);return t?t.replace(/^[a-z][a-z0-9+.-]*:\/\//,""):"unknown"}function Je(e){return e.replace(/^[a-z][a-z0-9+.-]*:\/\/[^/?#]+/i,"").split(/[?#]/)[0]||"/"}function Mo(e){let t=e.split("#")[0].split("?")[1];if(!t)return[];let r=[];for(let n of t.split("&")){let o=n.indexOf("=");if(!(o<=0))try{r.push([decodeURIComponent(n.slice(0,o)),decodeURIComponent(n.slice(o+1))])}catch{}}return r}var qe=/(token|jwt|session|auth|appcheck|api[-_]?key|apikey|credential|bearer)/i,_o=new Set(["authorization","cookie","dpop","idempotency-key","x-request-id","x-correlation-id","www-authenticate","proxy-authenticate","x-csrf-token","x-xsrf-token"]),Mt=new Set(["access_token","accesstoken","id_token","token","auth","auth_token","jwt","session","session_token"]),Fo=new Set(["bearer","token","jwt","dpop","oauth","firebase"]);function _t(e){let t={};if(!e)return t;for(let[r,n]of Object.entries(e))typeof n=="string"?t[r.toLowerCase()]=n:Array.isArray(n)&&(t[r.toLowerCase()]=n.join(", "));return t}function Bo(e){let t=[];for(let r of e.split(";")){let n=r.indexOf("=");n<=0||t.push([r.slice(0,n).trim(),r.slice(n+1).trim()])}return t}function se(e,t,r){let n=be(e,r);return n&&(Lo(n)||n.hint||t)?n:null}function Ft(e,t){let r=[],n=_t(e.requestHeaders),o=n.authorization;if(o){let i=/^(\S+)\s+(\S+)$/.exec(o.trim()),a=i?i[1]:void 0,s=i?i[2]:o.trim();if(!a||Fo.has(a.toLowerCase())){let l=se(s,true,t);l&&r.push({location:"authorization",name:"Authorization",scheme:a,fp:H(s),info:l})}}for(let[i,a]of Object.entries(n)){if(_o.has(i)||!qe.test(i))continue;let s=a.replace(/^bearer\s+/i,""),l=se(s,true,t);l&&r.push({location:"header",name:i,fp:H(s),info:l})}if(n.cookie)for(let[i,a]of Bo(n.cookie)){let s=se(a,qe.test(i)||/^(sid|sess)/i.test(i),t);s&&r.push({location:"cookie",name:i,fp:H(a),info:s})}for(let[i,a]of Mo(e.url)){let s=se(a,Mt.has(i.toLowerCase()),t);s&&Mt.has(i.toLowerCase())&&r.push({location:"query",name:i,fp:H(a),info:s})}return r}var Uo=/^(access_?token|accesstoken|token|jwt|auth_?token|session_?token|sessiontoken)$/i,Bt=/^(id_?token|idtoken)$/i,ke=/^(refresh_?token|refreshtoken)$/i,Ho=["expires_in","expiresIn","ExpiresIn","expires","ttl"],Vo=["expires_at","expiresAt","ExpiresAt","expiration","Expiration","expiry","expirationTime","expiration_time","access_token_expires_at","accessTokenExpiresAt","accessTokenExpiry"],Wo=["refresh_expires_in","refresh_token_expires_in","refreshTokenExpiresIn","refreshExpiresIn"],Jo=["refresh_expires_at","refreshTokenExpiresAt","refresh_token_expires_at"];function qo(e){if(typeof e!="string")return e;let t=e.trim();if(!(t.startsWith("{")||t.startsWith("[")))return null;try{return JSON.parse(t)}catch{return null}}function Ke(e,t,r){if(t>4||!e||typeof e!="object")return;if(Array.isArray(e)){for(let o of e.slice(0,5))Ke(o,t+1,r);return}let n=e;for(let[o,i]of Object.entries(n))typeof i=="string"&&(Uo.test(o)||Bt.test(o)||ke.test(o))?r.push({key:o,value:i,holder:n}):i&&typeof i=="object"&&Ke(i,t+1,r)}function Ko(e){return ke.test(e)?"refresh":Bt.test(e)?"id":/session/i.test(e)?"session":"access"}function Ut(e,t,r,n,o){for(let i of t){let a=So(e[i]);if(a!==void 0)return{expiresAt:n+a*1e3,source:i,lifetimeMs:a*1e3}}for(let i of r){let a=ae(e[i],o);if(a!==void 0)return{expiresAt:a,source:i}}return{}}function Zo(e){let t=e["set-cookie"];return t?t.split(/,(?=\s*[A-Za-z0-9!#$%&'*+.^_`|~-]+=)/).map(r=>r.trim()):[]}function Yo(e,t){if(e.status===void 0||e.status>=400)return[];let r=`${e.method.toUpperCase()} ${Je(e.url)}`,n=e.timestamp+(e.duration??0),o=[],i=qo(e.responseData);if(i){let s=[];Ke(i,0,s);let l=new Map;for(let c of s.filter(f=>ke.test(f.key))){let f=be(c.value,t);if(!f)continue;let v=Ut(c.holder,Wo,Jo,n,t);l.set(c.holder,{fp:H(c.value),expiresAt:f.expiresAt??v.expiresAt,formatLabel:f.formatLabel})}for(let c of s){if(ke.test(c.key))continue;let f=be(c.value,t);if(!f)continue;let v=Ut(c.holder,Ho,Vo,n,t);o.push({fp:H(c.value),info:f,role:Ko(c.key),expiresAt:v.expiresAt,expirySource:v.source,lifetimeMs:v.lifetimeMs,issuedBy:r,refresh:l.get(c.holder)})}}let a=_t(e.responseHeaders);for(let s of Zo(a)){let[l,...c]=s.split(";"),f=l.indexOf("=");if(f<=0)continue;let v=l.slice(0,f).trim(),b=l.slice(f+1).trim(),I=se(b,qe.test(v)||/^(sid|sess)/i.test(v),t);if(!I||b===""||b.toLowerCase()==="deleted")continue;let k,C,L;for(let Mr of c){let[_r,...Fr]=Mr.split("="),pt=_r.trim().toLowerCase(),Re=Fr.join("=").trim();if(pt==="max-age"&&/^-?\d+$/.test(Re))L=Number(Re)*1e3,k=n+L,C="Max-Age";else if(pt==="expires"&&C!=="Max-Age"){let ht=t(Re);Number.isFinite(ht)&&(k=ht,C="Expires")}}o.push({fp:H(b),info:I,role:"cookie",cookie:v,expiresAt:I.expiresAt??k,expirySource:I.expiresAt?I.expirySource:C,lifetimeMs:I.expiresAt?void 0:L,issuedBy:r})}return o}var Ze=e=>A.parse(e),Ht=4,Vt=2e4,Go=8,Xo=8,Qo=200,ei=1e3,O=new Map,X=new Map,ti=new Set,ri=new Set,Wt=new Set,ni=/(token|refresh|oauth|session|auth\/)/i,p=null,xe=true,Ye=null,Ge=new Set,Xe=false;function le(){Xe||(Xe=true,Promise.resolve().then(()=>{Xe=false,Ge.forEach(e=>e())}))}function oi(e){return Ge.add(e),()=>{Ge.delete(e)}}function Jt(e,t){if(e.has(t))return false;if(e.size>=ei){let r=e.values().next().value;r!==void 0&&e.delete(r)}return e.add(t),true}function Qe(e,t){return`${e}|${t.location}:${t.name.toLowerCase()}`}function qt(e,t){let r=t?.lifetimeMs!==void 0&&t.expiresAt!==void 0,n=r?t.expiresAt:e.expiresAt??t?.expiresAt,o=e.expiresAt??(r?t.observedReal+t.lifetimeMs:t?.expiresAt),i=r?t.expirySource:e.expiresAt?e.expirySource:t?.expirySource,a=r?t.lifetimeMs:e.expiresAt!==void 0&&e.issuedAt!==void 0?e.expiresAt-e.issuedAt:void 0;return{expiresAt:n,serverExpiresAt:o,source:i,lifetimeMs:a}}function et(e,t,r,n,o){let i=X.get(t),a=qt(r,i),s=e.fp!==t;s&&(e.history.unshift({fp:e.fp,firstSeenReal:e.firstSeenReal,expiresAt:e.expiresAt}),e.history.length=Math.min(e.history.length,Xo),e.fp=t,e.firstSeenReal=n,e.firstSeenApp=o,e.uses=0,e.expiredSends=0,e.rejected=0),e.info=r,e.role=i?.role??(s?void 0:e.role),e.issuedBy=i?.issuedBy??(s?void 0:e.issuedBy),e.refresh=i?.refresh??(s?void 0:e.refresh),e.expiresAt=a.expiresAt,e.serverExpiresAt=a.serverExpiresAt,e.expirySource=a.source,e.lifetimeMs=a.lifetimeMs,s&&ii(e,n)}function Kt(e,t,r,n,o){let i=X.get(r.fp),a=qt(r.info,i);return{key:e,origin:t,host:jo(t),location:r.location,name:r.name,scheme:r.scheme,fp:r.fp,info:r.info,role:i?.role,issuedBy:i?.issuedBy,refresh:i?.refresh,expiresAt:a.expiresAt,serverExpiresAt:a.serverExpiresAt,expirySource:a.source,lifetimeMs:a.lifetimeMs,firstSeenReal:n,firstSeenApp:o,lastUsedReal:n,lastUsedApp:o,uses:0,expiredSends:0,rejected:0,history:[]}}function Zt(){if(O.size<=Go)return;let e=null;for(let t of O.values())(!e||t.lastUsedReal<e.lastUsedReal)&&(e=t);e&&e.key!==p?.tokenId&&O.delete(e.key)}function ii(e,t){!p||p.tokenId!==e.key||(p.newTokens+=1,p.status==="waiting"&&(p.status="refreshed",p.refreshedAt=t,p.ruleId&&p.forcedAt===void 0&&wo("network","deleteOverrideRule",{id:p.ruleId}).catch(()=>{})),p.newTokens>=Ht&&t-(p.refreshedAt??t)<=Vt&&(p.status="loop"))}function ai(e){let t=We(e.url);if(!t)return;let r=Ft(e,Ze);if(r.length===0)return;let n=S(),o=e.timestamp;for(let i of r){let a=Qe(t,i),s=O.get(a);s?et(s,i.fp,i.info,n,o):(s=Kt(a,t,i,n,o),O.set(a,s),Zt()),s.uses+=1,s.lastUsedReal=n,s.lastUsedApp=o,s.expiresAt!==void 0&&o>=s.expiresAt&&(s.expiredSends+=1),p&&p.tokenId===a&&p.forcedAt!==void 0&&i.fp===p.startFp&&(p.staleAfterFailure+=1)}le()}function si(e){let t=We(e.url);if(!t)return;let r=S(),n=false;if(e.status===401||e.status===403)for(let i of Ft(e,Ze)){let a=O.get(Qe(t,i));a&&a.fp===i.fp&&(a.rejected+=1,n=true)}let o=!!p?.ruleId&&e.override?.ruleId===p.ruleId;if(p&&(e.status??0)>=400&&!o){let i=`${e.method.toUpperCase()} ${Je(e.url)}`;(Wt.has(i)||e.method.toUpperCase()==="POST"&&ni.test(Je(e.url)))&&(p.failedRefreshes+=1,p.lastRefreshError=`${e.status} ${i}`,n=true)}p?.ruleId&&e.override?.ruleId===p.ruleId&&p.forcedAt===void 0&&(p.forcedAt=r,n=true);for(let i of Yo(e,Ze)){if(Wt.add(i.issuedBy),X.set(i.fp,{...i,observedReal:r}),X.size>Qo){let a=X.keys().next().value;a!==void 0&&X.delete(a)}if(n=true,i.cookie){let a={location:"cookie",name:i.cookie,fp:i.fp,info:i.info},s=Qe(t,a),l=O.get(s);l?et(l,i.fp,i.info,r,e.timestamp):(O.set(s,Kt(s,t,a,r,e.timestamp)),Zt());continue}for(let a of O.values())a.fp===i.fp&&et(a,i.fp,a.info,r,a.lastUsedApp)}n&&le()}function li(e){let t=e;!t||typeof t.id!="string"||typeof t.url!="string"||(Jt(ti,t.id)&&ai(t),t.status!==void 0&&Jt(ri,t.id)&&si(t))}function ve(){if(Ye)return true;try{let{networkEventStore:e}=To("@buoy-gg/network");if(!e?.onEvent)throw new Error("no event store");Ye=e.onEvent(li,true),xe=true}catch{xe=false}return le(),xe}function Yt(e,t,r){let n=O.get(t);if(!n)throw new Error(`No token row "${t}".`);return p={kind:e,tokenId:t,startedAt:S(),startFp:n.fp,ruleId:r,status:"waiting",newTokens:0,staleAfterFailure:0,failedRefreshes:0},le(),p}function ci(){p=null,le()}function ui(e){return e.location==="cookie"?`${e.name} cookie`:e.location==="query"?`${e.name} parameter`:e.location==="header"?`${e.name} header`:e.role==="id"||e.info.claims.use==="id"?"ID token":"Access token"}function fi(e,t){let r=[e.firstSeenReal,...e.history.map(o=>o.firstSeenReal)].slice(0,-1).filter(o=>t-o<=Vt).length,n=e.info.issuedAt;return{id:e.key,label:ui(e),host:e.host,location:e.location,name:e.name,scheme:e.scheme,format:e.info.format,formatLabel:e.info.formatLabel,hint:e.info.hint,claims:e.info.claims,fingerprint:e.fp,issuedAt:n,notBefore:e.info.notBefore,expiresAt:e.expiresAt,serverExpiresAt:e.serverExpiresAt,expirySource:e.expirySource,lifetimeMs:e.lifetimeMs,neverExpires:e.info.neverExpires,issuedBy:e.issuedBy,refresh:e.refresh?{expiresAt:e.refresh.expiresAt,formatLabel:e.refresh.formatLabel}:void 0,firstUsed:e.firstSeenApp,lastUsed:e.lastUsedApp,lastUsedReal:e.lastUsedReal,uses:e.uses,refreshes:e.history.length,lastRefreshAt:e.history.length?e.firstSeenReal:void 0,recentRefreshes:r,looping:r>=Ht,expiredSends:e.expiredSends,rejected:e.rejected}}function we(){let e=S(),t=[...O.values()].sort((r,n)=>n.lastUsedReal-r.lastUsedReal).map(r=>fi(r,e));if(p?.status==="refreshed"){let r=O.get(p.tokenId);r&&(p.newLifetimeMs=r.lifetimeMs,p.newIssuedBy=r.issuedBy)}return{available:xe,watching:Ye!==null,tokens:t,check:p?{...p}:null}}function di(e){let t=we();return e?t.tokens.find(r=>r.id===e||r.fingerprint===e)??null:t.tokens.find(r=>r.expiresAt!==void 0)??t.tokens[0]??null}function pi(e){return O.get(e)?.origin??null}import{isProNow as Gt}from"@buoy-gg/shared-ui/web";var d={anchor:Ce,settings:ie,lastJump:null,changedAt:null,hydrated:false},tt=new Set,Te=null;function Xt(){Te=null,tt.forEach(e=>e())}oi(Xt);function ce(e){return tt.add(e),()=>{tt.delete(e)}}function hi(){return d.settings}function Qt(){return M(d.anchor,S())}function er(){return d.anchor.mode!=="real"}function mi(e){if(e.mode==="real"){It(null),so();return}Pt(),It(t=>M(d.anchor,t)),ao()}function gi(){let e={v:1,anchor:d.settings.persist&&Gt()?d.anchor:null,settings:d.settings};Be(e)}function tr(){let e={v:1,anchor:d.settings.persist&&Gt()?d.anchor:null,settings:d.settings};return d.settings.persist&&d.anchor.mode!=="real"&&(e.reload={anchor:d.anchor,at:S()}),Be(e)}function Q(e,{save:t=true}={}){d={...d,...e},e.anchor&&mi(d.anchor),t&&gi(),Xt()}function ee(e,t=d.lastJump){Q({anchor:e,lastJump:t,changedAt:S(),hydrated:true})}var rr=e=>A.parse(e);function nr(e,t=false){let r=S(),n=M(d.anchor,r),o=Tt(e,n,rr),i=o-n;return ee(Pe(d.anchor,r,o,t),{byMs:i,firedTimers:0,at:r}),R()}function rt(e,t){let r=Ne(e),n=S(),o=Zn(d.anchor,n,r),i=(t??d.settings.fireTimersOnJump)&&r>0;if(ee(o,{byMs:r,firedTimers:0,at:n}),i){let a=yo(r);a>0&&Q({lastJump:{byMs:r,firedTimers:a,at:n}},{save:false})}return R()}function nt(e){let t=S(),r=M(d.anchor,t),n=e===void 0||e===""?r:Tt(e,r,rr);return ee(Yn(d.anchor,t,n)),R()}function ot(){return d.anchor.mode==="frozen"&&ee(Gn(d.anchor,S())),R()}function or(e){return ee(Xn(d.anchor,S(),Number(e))),R()}function it(){return ee(Ce,null),R()}function ir(e){let t={...d.settings};for(let r of Object.keys(ie))typeof e[r]=="boolean"&&(t[r]=e[r]);return Q({settings:t}),R()}function yi(e){return e>0?go(e):0}var ar=false;function sr(e){if(!e){Q({hydrated:true},{save:false});return}let t=e.reload?S()-e.reload.at:1/0,r=t>=0&&t<xo?e.reload?.anchor:void 0;e.reload&&Be({v:1,anchor:e.anchor,settings:e.settings});let n=e.anchor??r??null;Q({settings:e.settings,anchor:n??Ce,changedAt:n?S():null,hydrated:true},{save:false})}function at(){if(ar)return;ar=true,Pt();let e=ko();if(e!==void 0){sr(e);return}vo().then(t=>{d.changedAt===null?sr(t):Q({hydrated:true},{save:false})})}function bi(){try{return Intl.DateTimeFormat().resolvedOptions().timeZone??"unknown"}catch{return"unknown"}}function R(){let e=S(),t=M(d.anchor,e);return{mode:d.anchor.mode,active:d.anchor.mode!=="real",rate:d.anchor.rate,virtualNow:t,virtualIso:new A(t).toISOString(),realNow:e,offsetMs:Kn(d.anchor,e),timeZone:bi(),timers:mo(),lastJump:d.lastJump,changedAt:d.changedAt,settings:d.settings,hydrated:d.hydrated,tokens:we(),patched:{date:eo(),intl:io(),timers:ho(),animatedOnRealClock:uo()}}}function lr(){return Te||(Te=R()),Te}import{useSyncExternalStore as ki}from"react";import{ClockToolIcon as cr,FloatingTool as xi,Pause as vi,Play as wi,X as Ti,dismissFloatingTool as Ai,getFloatingTools as Si,getUseIsPro as $i,night as ue,openFloatingTool as ur}from"@buoy-gg/shared-ui/web";import{useEffect as Ii,useState as Ri}from"react";function V(e,t=250){let[,r]=Ri(0);Ii(()=>{let a=setInterval(()=>r(s=>s+1),t);return()=>clearInterval(a)},[t]);let n=S();if(!e)return{virtual:n,real:n};let o=n-e.realNow,i=e.mode==="real"?1:e.rate;return{virtual:e.mode==="frozen"?e.virtualNow:e.virtualNow+o*i,real:n}}var F=e=>String(e).padStart(2,"0");function fe(e){let t=new A(e);return`${F(t.getHours())}:${F(t.getMinutes())}:${F(t.getSeconds())}`}var Ci=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],fr=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function Di(e){let t=new A(e);return`${Ci[t.getDay()]}, ${fr[t.getMonth()]} ${t.getDate()}, ${t.getFullYear()}`}function Ae(e,t=true){let r=new A(e),n=t?fe(e):`${F(r.getHours())}:${F(r.getMinutes())}`;return`${fr[r.getMonth()]} ${r.getDate()} \xB7 ${n}`}function dr(e){let t=new A(e);return`${t.getFullYear()}-${F(t.getMonth()+1)}-${F(t.getDate())} ${F(t.getHours())}:${F(t.getMinutes())}`}function Oi(e){if(Math.abs(e)<1e3)return"matches real time";let t=te(Math.abs(e),{signed:false});return e>0?`${t} ahead of real time`:`${t} behind real time`}function pr(e){return e.mode==="real"?{label:"Real time",tone:"neutral"}:e.mode==="frozen"?{label:"Frozen",tone:"info"}:e.rate!==1?{label:`${St(e.rate)} speed`,tone:"warning"}:{label:"Overridden",tone:"accent"}}function Pi(e){return`clock-jump-${e<0?"minus":"plus"}-${te(Math.abs(e),{signed:false}).replace(/\s/g,"")}`}import{jsx as z,jsxs as st}from"react/jsx-runtime";var Se="clock-chip",hr={id:Se,render:e=>z(gr,{...e})},Ni=()=>Si().some(e=>e.id===Se);function Ei(){ur(hr)}var mr=false;function zi(){if(mr)return;mr=true;let e=false,t=()=>{let r=er()&&hi().showChip;r&&!e?ur(hr):!r&&Ni()&&Ai(Se),e=r};ce(t),t()}function gr({id:e,revealToken:t}){let r=ki(ce,lr,lr),{virtual:n,real:o}=V(r),i=r.mode==="frozen",a=$i()(),s=i||a,l=pr(r),c=n-o,f=`${Math.abs(c)<1e3?"0s":te(c)} \xB7 ${l.label.toLowerCase()}`;return z(xi,{id:e,revealToken:t,variant:"strip",dragFromSurface:true,defaultPlacement:"top",accessibilityLabel:`Move or hide the clock chip. App time ${Ae(n)}`,handleAdornment:z(cr,{size:12}),children:st(m,{style:K.row,children:[z(cr,{size:18}),st(m,{style:K.text,children:[z(w,{style:K.time,numberOfLines:1,testID:"clock-chip-time",children:Ae(n)}),z(w,{style:K.detail,numberOfLines:1,testID:"clock-chip-detail",children:f})]}),s?st(B,{testID:i?"clock-chip-resume":"clock-chip-freeze",accessibilityRole:"button",accessibilityLabel:i?"Resume the app clock":"Freeze the app clock",onPress:()=>i?ot():nt(),style:K.button,hitSlop:{top:8,bottom:8,left:4,right:4},children:[i?z(wi,{size:16,color:ue.color.accent}):null,i?null:z(vi,{size:16,color:ue.color.text})]}):null,s?z(m,{style:K.separator}):null,z(B,{testID:"clock-chip-reset",accessibilityRole:"button",accessibilityLabel:"Back to real time",onPress:()=>it(),style:K.button,hitSlop:{top:8,bottom:8,left:4,right:8},children:z(Ti,{size:16,color:ue.color.textSecondary})})]})})}var K=Y.create({row:{flexDirection:"row",alignItems:"center",gap:10,paddingLeft:10,paddingRight:4,paddingVertical:6,minWidth:220},text:{flexShrink:1,minWidth:120},time:{color:"#F59E0B",fontSize:14,fontWeight:"600",fontVariant:["tabular-nums"]},detail:{color:ue.color.textSecondary,fontSize:11,fontVariant:["tabular-nums"]},button:{width:32,height:32,alignItems:"center",justifyContent:"center",borderRadius:16},separator:{width:Y.hairlineWidth,height:20,backgroundColor:ue.color.separator}});import{ClockToolIcon as Li,CLOCK_TOOL_ICON_COLOR as ji,createToolFactory as Mi,defineToolPreset as _i}from"@buoy-gg/shared-ui/web";import{useEffect as yr,useState as Fi}from"react";import{reloadApp as Bi}from"@buoy-gg/shared-ui/web";import{createSyncAdapter as Ui}from"@buoy-gg/shared-ui/web";import{dispatchToolAction as br}from"@buoy-gg/shared-ui/web";var kr="No sign-in token seen yet. Use the app so it sends a signed-in request, then try again. Tokens are read from the Network tool's captured requests.";function xr(e){ve();let t=di(e);if(!t)throw new Error(e?`No token "${e}". Read getState for the current ids.`:kr);return t}function vr(e,t=1e4){let r=xr(e);if(r.expiresAt===void 0)throw new Error(r.neverExpires?`${r.label} for ${r.host} is ${r.hint??"a key"} and never expires.`:`${r.label} for ${r.host} (${r.formatLabel}) has no expiry Buoy can read. Use failNextRequest to test the refresh instead.`);let n=r.expiresAt-Math.max(0,t)-Qt();if(n<=0)throw new Error(`${r.label} for ${r.host} has already expired on the app's clock. Go back to real time, or use failNextRequest.`);return rt(n),Yt("expiry",r.id),R()}async function wr(e,t=401,r=1){let n=xr(e),o=pi(n.id);if(!o)throw new Error(kr);await Tr();let i=t===403?403:401,a=n.location==="authorization"||n.location==="header"?{urlPattern:`${o}/*`,requireHeader:n.name.toLowerCase()}:n.location==="query"?{urlPattern:`${o}/*${n.name}=*`}:{urlPattern:`${o}/*`},s=await br("network","upsertOverrideRule",{name:"Clock: force a token refresh",...a,kind:"respond",status:i,headers:{"content-type":"application/json","www-authenticate":'Bearer error="invalid_token", error_description="The access token expired"'},body:JSON.stringify({error:"invalid_token",error_description:"The access token expired (forced by Buoy Clock to test token refresh)"}),times:Math.max(1,Math.min(10,Math.round(r)))}).catch(l=>{let c=l instanceof Error?l.message:String(l);throw new Error(c.includes("Unknown tool")?"Failing a request needs the Network tool (@buoy-gg/network).":c)});if(!s?.ok||!s.rule)throw new Error(s?.error??"Network did not add the override.");return Yt("401",n.id,s.rule.id),R()}async function Tr(){let e=we().check;e?.ruleId&&e.forcedAt===void 0&&await br("network","deleteOverrideRule",{id:e.ruleId}).catch(()=>{})}async function Ar(){return await Tr(),ci(),R()}function Z(e){return e&&typeof e=="object"?e:{}}function lt(e,...t){for(let r of t){let n=e[r];if(typeof n=="string"||typeof n=="number")return n}}function de(e,t){let r=e[t];if(typeof r=="boolean")return r;if(r==="true")return true;if(r==="false")return false}var Sr=Ui({version:1,getSnapshot(){return R()},subscribe(e){return ce(e)},actions:{getState(){return ve(),R()},setTime(e){let t=Z(e),r=lt(t,"time","at","date","iso");if(r===void 0)throw new Error('setTime needs `time`: ISO 8601 ("2026-12-31T23:59:50"), epoch ms, or relative ("+1d").');return nr(r,de(t,"freeze")??false)},shift(e){let t=Z(e),r=lt(t,"by","ms","duration","delta");if(r===void 0)throw new Error('shift needs `by`: a duration like "+1d", "-2h30m", "90s", or ms.');return rt(r,de(t,"fireTimers"))},freeze(e){return nt(lt(Z(e),"time","at"))},resume(){return ot()},setRate(e){let t=Z(e),r=Number(t.rate??t.speed);if(!Number.isFinite(r))throw new Error("setRate needs a numeric `rate` (1 = normal speed).");return or(r)},reset(){return it()},updateSettings(e){let t=Z(e);return ir({persist:de(t,"persist"),showChip:de(t,"showChip"),fireTimersOnJump:de(t,"fireTimersOnJump")})},jumpToTokenExpiry(e){let t=Z(e),r=typeof t.token=="string"?t.token:typeof t.id=="string"?t.id:void 0,n=Number(t.leadMs??t.lead??1e4);return vr(r,Number.isFinite(n)?n:1e4)},failNextRequest(e){let t=Z(e),r=typeof t.token=="string"?t.token:typeof t.id=="string"?t.id:void 0,n=Number(t.status??401),o=Number(t.times??1);return wr(r,n,Number.isFinite(o)?o:1)},stopTokenCheck(){return Ar()},async holdForReload(){return await tr(),R()}}});import{useState as $e}from"react";import{ChevronRight as Hi,NightButton as Vi,NightCard as Ie,NightChip as Wi,NightFootnote as ct,NightRows as ut,NightSectionLabel as $r,NightSegmented as Ji,NightSwitch as Ir,ProBadge as qi,ProUpgradeModal as Ki,getUseIsPro as Zi,monoFont as Yi,night as y,useSafeAreaInsets as Gi}from"@buoy-gg/shared-ui/web";import{ChevronRight as Xi,NightButton as Rr,NightCard as Qi,NightFootnote as ea,NightRows as ta,NightSectionLabel as ra,ProBadge as na,night as x}from"@buoy-gg/shared-ui/web";import{jsx as T,jsxs as j}from"react/jsx-runtime";var W=e=>te(Math.abs(e),{signed:false});function oa({snapshot:e,run:t,openId:r,onToggle:n,isPro:o,onUpgrade:i}){let a=e.tokens;return j(m,{children:[T(ra,{children:a.tokens.length>1?"Sign-in tokens":"Sign-in token"}),T(Qi,{children:j(ta,{children:[a.tokens.map((s,l)=>j(m,{children:[T(ia,{token:s,snapshot:e,index:l,open:r===s.id,onPress:()=>n(s.id)}),r===s.id?T(aa,{token:s,snapshot:e,run:o?t:()=>i("Sign-in token tests"),isPro:o}):null]},s.id)),a.tokens.length===0?T(m,{style:g.row,testID:"clock-token-empty",children:T(w,{style:g.emptyText,children:a.available?"No token seen yet":"Needs the Network tool"})},"empty"):null]})}),T(la,{check:a.check,tokens:a.tokens,snapshot:e,run:t}),a.tokens.length===0?T(ea,{children:a.available?"Tokens show up here when the app sends a signed-in request.":"Install @buoy-gg/network so the Clock tool can read the app's tokens."}):null]})}function ia({token:e,snapshot:t,index:r,open:n,onPress:o}){let{virtual:i}=V(t,1e3),a=e.expiresAt!==void 0?e.expiresAt-i:void 0,s=e.neverExpires?"No expiry":a===void 0?"Unknown":a<=0?"Expired":W(a),l=a!==void 0&&a<=0?g.valueDanger:a!==void 0&&a<6e4?g.valueWarning:null;return j(B,{testID:`clock-token-${r}`,accessibilityRole:"button",accessibilityLabel:`${e.label} for ${e.host}: ${a!==void 0&&a>0?`expires in ${s}`:s}`,accessibilityState:{expanded:n},activeOpacity:.6,onPress:o,style:g.row,children:[j(m,{style:g.rowText,children:[T(w,{style:g.rowTitle,numberOfLines:1,children:e.label}),T(w,{style:g.rowSubtitle,numberOfLines:1,children:`${e.host} \xB7 ${e.hint??e.formatLabel}`})]}),j(m,{style:g.rowRight,children:[T(w,{style:[g.value,l],testID:`clock-token-${r}-left`,children:s}),T(m,{style:n?g.chevronOpen:null,children:T(Xi,{size:16,color:x.color.textTertiary})})]})]})}function aa({token:e,snapshot:t,run:r,isPro:n}){let{virtual:o,real:i}=V(t,1e3),a=sa(e,o,i),s=e.expiresAt!==void 0&&e.expiresAt-o>1e4;return j(m,{style:g.detail,testID:"clock-token-detail",children:[a.map(l=>T(w,{style:[g.detailLine,l.tone==="warn"?g.warn:null,l.tone==="bad"?g.bad:null],children:l.text},l.text)),j(m,{style:g.buttons,children:[T(m,{style:g.button,children:T(Rr,{label:"Jump to Expiry",testID:"clock-token-jump",accessibilityLabel:"Jump the app's clock to ten seconds before this token expires",size:"md",disabled:!s,onPress:()=>r("jumpToTokenExpiry",{token:e.id})})}),T(m,{style:g.button,children:T(Rr,{label:"Fail Next Request",testID:"clock-token-fail",accessibilityLabel:"Answer the app's next request to this API with 401",size:"md",onPress:()=>r("failNextRequest",{token:e.id})})})]}),n?null:j(m,{style:g.proLine,children:[T(na,{}),T(w,{style:[g.hint,g.proHint],children:"Jump to Expiry and Fail Next Request are part of Buoy Pro."})]}),T(w,{style:g.hint,children:s||e.expiresAt===void 0?"Jump tests an app that refreshes before expiry. Fail tests one that refreshes after a 401.":"This token has already expired on the app's clock. Use Real Time to jump to it again."})]})}function sa(e,t,r){let n=[];if(e.expiresAt!==void 0){if(n.push({text:`Expires ${Ae(e.expiresAt)}`}),e.lifetimeMs!==void 0&&e.lifetimeMs>0&&n.push({text:`Lasts ${W(e.lifetimeMs)}${e.expirySource?`, from ${e.expirySource}`:""}`}),e.serverExpiresAt!==void 0){let o=e.expiresAt-t,i=e.serverExpiresAt-r;Math.abs(o-i)>2e3&&n.push({text:i>0?`The server still accepts it for ${W(i)}`:`The server stopped accepting it ${W(i)} ago`})}}else e.neverExpires||n.push({text:"The token doesn't say when it expires, and no login response did either."});if(e.hint&&n.push({text:e.formatLabel}),e.issuedBy&&n.push({text:`Issued by ${e.issuedBy}`}),e.refresh?.expiresAt!==void 0){let o=e.refresh.expiresAt-t;n.push({text:o>0?`Refresh token expires in ${W(o)}`:"Refresh token expired"})}return e.refreshes>0&&e.lastRefreshAt!==void 0&&n.push({text:`Refreshed ${e.refreshes===1?"once":`${e.refreshes} times`}, last at ${fe(e.lastRefreshAt)}`}),n.push({text:`Sent with ${e.uses} request${e.uses===1?"":"s"}`}),e.expiredSends>0&&n.push({text:`Sent ${e.expiredSends} time${e.expiredSends===1?"":"s"} after it expired on the app's clock`,tone:"warn"}),e.rejected>0&&n.push({text:`Rejected by the server ${e.rejected} time${e.rejected===1?"":"s"}`,tone:"warn"}),e.looping&&n.push({text:`Refresh loop: ${e.recentRefreshes} new tokens in 20s`,tone:"bad"}),n}function la({check:e,tokens:t,snapshot:r,run:n}){let{virtual:o,real:i}=V(r,1e3);if(!e)return null;let a=t.find(c=>c.id===e.tokenId),{text:s,tone:l}=ca(e,a,o,i);return j(m,{style:g.check,children:[T(w,{style:[g.checkText,l==="good"?g.good:null,l==="bad"?g.bad:null,l==="warn"?g.warn:null],testID:"clock-token-check",children:s}),T(B,{testID:"clock-token-check-done",accessibilityRole:"button",accessibilityLabel:e.status==="waiting"?"Stop the refresh check":"Dismiss",onPress:()=>n("stopTokenCheck"),hitSlop:{top:8,bottom:8,left:8,right:8},children:T(w,{style:g.checkDone,children:e.status==="waiting"?"Stop":"Done"})})]})}function ca(e,t,r,n){if(e.status==="loop")return{text:`Refresh loop: ${e.newTokens} new tokens since the check started. The new tokens may already look expired to the app's clock.`,tone:"bad"};if(e.status==="refreshed"){let s=e.newIssuedBy?` by ${e.newIssuedBy}`:"",l=e.newLifetimeMs&&e.newLifetimeMs>0?`. The new token lasts ${W(e.newLifetimeMs)}`:"",c=e.kind==="401"&&e.forcedAt!==void 0?"The app got the 401 and refreshed":"Refreshed",f=e.failedRefreshes>0?` ${e.failedRefreshes===1?"One token request":`${e.failedRefreshes} token requests`} failed first (${e.lastRefreshError}).`:"";return{text:`${c} at ${fe(e.refreshedAt??n)}${s}${l}.${f}`,tone:f?"warn":"good"}}let o=n-e.startedAt,i=(e.staleAfterFailure>0?` It sent the old token again ${e.staleAfterFailure} time${e.staleAfterFailure===1?"":"s"}.`:"")+(e.failedRefreshes>0?` Its token request failed (${e.lastRefreshError}).`:"");if(o>6e4)return{text:`No new token after ${W(o)}. The app may refresh on its next action, or not at all.${i}`,tone:"warn"};if(e.kind==="401")return e.forcedAt===void 0?{text:`The next request to ${t?.host??"the API"} will get a 401. Use the app to send one.`}:{text:`The app got the 401. Waiting for a new token\u2026${i}`,tone:i?"warn":void 0};let a=t?.expiresAt!==void 0?t.expiresAt-r:void 0;return a!==void 0&&a>0?{text:`Expires in ${W(a)} on the app's clock. Waiting for a new token\u2026`}:{text:"Expired on the app's clock. Waiting for the app's next request\u2026"}}var g=Y.create({row:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",gap:12,minHeight:56,paddingHorizontal:x.rowPadH,paddingVertical:10},rowText:{flex:1,minWidth:0},rowTitle:{color:x.color.text,fontSize:x.font.row},rowSubtitle:{color:x.color.textTertiary,fontSize:x.font.caption,marginTop:2},rowRight:{flexDirection:"row",alignItems:"center",gap:6},value:{color:x.color.textSecondary,fontSize:x.font.row,fontVariant:["tabular-nums"]},valueWarning:{color:x.color.warning},valueDanger:{color:x.color.danger},chevronOpen:{transform:[{rotate:"90deg"}]},emptyText:{color:x.color.textSecondary,fontSize:x.font.row},detail:{paddingHorizontal:x.rowPadH,paddingBottom:14,gap:4},detailLine:{color:x.color.textSecondary,fontSize:x.font.caption},buttons:{flexDirection:"row",gap:8,marginTop:8},button:{flex:1},hint:{color:x.color.textTertiary,fontSize:x.font.caption,marginTop:6},proLine:{flexDirection:"row",alignItems:"center",gap:8,marginTop:6},proHint:{marginTop:0,flexShrink:1},check:{flexDirection:"row",alignItems:"flex-start",gap:12,marginTop:8,marginHorizontal:x.labelInset},checkText:{flex:1,color:x.color.textSecondary,fontSize:x.font.caption,lineHeight:18},checkDone:{color:x.color.accent,fontSize:x.font.caption,fontWeight:"600"},good:{color:x.color.accent},warn:{color:x.color.warning},bad:{color:x.color.danger}});import{jsx as u,jsxs as $}from"react/jsx-runtime";var Cr="#F59E0B";function Dr({snapshot:e,onAction:t,onReload:r}){let n=Gi({minBottom:16}),[o,i]=$e(null),[a,s]=$e(null),l=Zi()(),[c,f]=$e(null),v=k=>f(k),b=(k,C)=>{i(null),t(k,C).catch(L=>{i(L instanceof Error?L.message:String(L))})},I=k=>s(C=>C===k?null:k);return e?$(vt,{style:h.fill,contentContainerStyle:[h.content,{paddingBottom:n.bottom}],testID:"clock-scroll",keyboardShouldPersistTaps:"handled",children:[u(ua,{snapshot:e}),o?u(ct,{tone:"danger",centered:true,children:u(w,{testID:"clock-error",children:o})}):null,$(m,{children:[u($r,{children:"Jump ahead"}),u(da,{run:b})]}),$(m,{children:[u(Ie,{children:$(ut,{children:[$(m,{children:[u(Pr,{title:"Date & Time",testID:"clock-date-row",open:a==="date",onPress:()=>I("date"),value:u(pa,{snapshot:e})}),a==="date"?u(ma,{snapshot:e,run:b,onDone:()=>s(null)}):null]},"date"),$(m,{style:h.row,children:[u(ft,{title:"Freeze",isPro:l}),u(Ir,{value:e.mode==="frozen",testID:"clock-freeze",accessibilityLabel:"Freeze the clock",onValueChange:k=>k&&!l?v("Freeze"):b(k?"freeze":"resume")})]},"freeze"),$(m,{children:[u(Pr,{title:"Speed",pro:!l,testID:"clock-speed-row",open:a==="speed",onPress:()=>l?I("speed"):v("Speed"),value:u(w,{style:h.rowValue,children:zr(e)})}),a==="speed"?u(ga,{snapshot:e,run:b}):null]},"speed")]})}),u(ct,{children:"Only this app's clock changes. Screens pick up the new time when they next render, or all at once when you reload."})]}),e.tokens?u(oa,{snapshot:e,run:b,openId:a,onToggle:I,isPro:l,onUpgrade:v}):null,u(Ie,{children:$(ut,{children:[r?u(Nr,{label:"Reload App",testID:"clock-reload",onPress:r},"reload"):null,u(Nr,{label:"Use Real Time",accessibilityLabel:"Reset to real time",testID:"clock-reset",destructive:true,disabled:e.mode==="real",onPress:()=>b("reset")},"reset")]})}),$(m,{children:[u($r,{children:"Options"}),u(ba,{settings:e.settings,run:b,isPro:l,onUpgrade:v})]}),u(Ki,{visible:c!==null&&!l,onClose:()=>f(null),featureName:c??void 0})]}):u(m,{style:h.waiting,testID:"clock-waiting",children:u(ct,{centered:true,children:"Waiting for the app's clock\u2026"})})}function ft({title:e,isPro:t}){return $(m,{style:h.titleRow,children:[u(w,{style:h.rowTitle,children:e}),t?null:u(qi,{})]})}function ua({snapshot:e}){let{virtual:t,real:r}=V(e),n=pr(e),o=e.mode!=="real",i=Oi(t-r),a=e.mode==="frozen"?" \xB7 Frozen":o&&e.rate!==1?` \xB7 ${zr(e)}`:"";return $(m,{style:h.hero,children:[u(w,{style:[h.heroTime,o?h.heroTimeActive:null],testID:"clock-hero-time",accessibilityLabel:`App clock ${fe(t)}`,children:fe(t)}),u(w,{style:h.heroDate,testID:"clock-hero-date",children:Di(t)}),u(m,{testID:"clock-status",accessibilityLabel:`Clock status: ${n.label}${o?`, ${i}`:""}`,children:u(w,{style:[h.heroStatus,o?h.heroStatusActive:null],testID:"clock-offset",children:o?`${i}${a}`:"Real time"})})]})}var Or=36e5,dt=24*Or,fa=[{ms:Or,unit:"hour"},{ms:dt,unit:"day"},{ms:7*dt,unit:"week"},{ms:30*dt,unit:"month"}];function da({run:e}){return u(Ie,{style:h.jumpBar,children:fa.map((t,r)=>$(B,{testID:Pi(t.ms),accessibilityRole:"button",accessibilityLabel:`Jump ahead one ${t.unit}`,activeOpacity:.6,onPress:()=>e("shift",{by:t.ms}),style:[h.jump,r>0?h.jumpDivider:null],children:[u(w,{style:h.jumpAmount,children:"+1"}),u(w,{style:h.jumpUnit,children:t.unit})]},t.unit))})}function Pr({title:e,pro:t,value:r,open:n,onPress:o,testID:i}){return $(B,{testID:i,accessibilityRole:"button",accessibilityLabel:e,accessibilityState:{expanded:n},activeOpacity:.6,onPress:o,style:h.row,children:[u(ft,{title:e,isPro:!t}),$(m,{style:h.rowRight,children:[r,u(m,{style:n?h.chevronOpen:null,children:u(Hi,{size:16,color:y.color.textTertiary})})]})]})}function pa({snapshot:e}){let{virtual:t}=V(e,1e3);return u(w,{style:[h.rowValue,h.tabular],numberOfLines:1,children:Ae(t,false)})}function Nr({label:e,onPress:t,testID:r,destructive:n,disabled:o,accessibilityLabel:i}){return u(B,{testID:r,accessibilityRole:"button",accessibilityLabel:i??e,accessibilityState:{disabled:!!o},activeOpacity:.6,disabled:o,onPress:t,style:[h.row,o?h.rowDisabled:null],children:u(w,{style:[h.actionLabel,n?h.actionDestructive:null],children:e})})}var ha=At.filter(e=>["midnight","month-end","year-end"].includes(e.id));function ma({snapshot:e,run:t,onDone:r}){let[n,o]=$e(""),{virtual:i}=V(e,1e3),a=()=>n.trim()||dr(i),s=e.mode==="frozen",l=c=>{t("setTime",{time:c,freeze:s}),r()};return $(m,{style:h.editor,children:[$(m,{style:h.inputRow,children:[u(xt,{testID:"clock-time-input",accessibilityLabel:"Date and time",value:n,onChangeText:o,placeholder:dr(i),placeholderTextColor:y.color.placeholder,autoCapitalize:"none",autoCorrect:false,returnKeyType:"done",onSubmitEditing:()=>l(a()),style:h.input}),u(Vi,{label:"Set",testID:"clock-time-apply",accessibilityLabel:"Set this time",size:"md",variant:"primary",fullWidth:false,onPress:()=>l(a())})]}),u(w,{style:h.hint,children:"Year-month-day and 24-hour time, or +3d, -2h"}),u(m,{style:h.presets,children:ha.map(c=>u(Wi,{label:c.label,testID:`clock-preset-${c.id}`,onPress:()=>l(c.at(i,A))},c.id))})]})}var Er=[{key:"1",label:"Normal"},{key:"10",label:"10\xD7"},{key:"60",label:"1 min/s"},{key:"3600",label:"1 hr/s"}];function zr(e){return e.mode==="real"||e.rate===1?"Normal":Er.find(t=>Number(t.key)===e.rate)?.label??St(e.rate)}function ga({snapshot:e,run:t}){let r=e.mode==="real"?"1":String(e.rate);return $(m,{style:h.editor,children:[u(m,{style:h.segmentRow,children:u(Ji,{tabs:Er,activeKey:r,size:"sm",testIDPrefix:"clock-speed",onChange:n=>t("setRate",{rate:Number(n)})})}),u(w,{style:h.hint,children:"Taps, animations and timers keep real speed."})]})}var ya=[{key:"showChip",title:"Show Floating Clock"},{key:"persist",title:"Keep After Reload",pro:true}];function ba({settings:e,run:t,isPro:r,onUpgrade:n}){return u(Ie,{children:u(ut,{children:ya.map(o=>{let i=!!o.pro&&!r;return $(m,{style:h.row,children:[u(ft,{title:o.title,isPro:!i}),u(Ir,{value:i?false:e[o.key],testID:`clock-setting-${o.key}`,accessibilityLabel:o.title,onValueChange:a=>i?n(o.title):t("updateSettings",{[o.key]:a})})]},o.key)})})})}var h=Y.create({fill:{flex:1},content:{paddingHorizontal:y.gutter,paddingTop:8,gap:y.groupGap},waiting:{flex:1,alignItems:"center",justifyContent:"center",padding:24},hero:{alignItems:"center",paddingTop:12},heroTime:{color:y.color.text,fontSize:56,fontWeight:"200",fontVariant:["tabular-nums"],letterSpacing:1},heroTimeActive:{color:Cr},heroDate:{color:y.color.text,fontSize:17,fontWeight:"500",marginTop:2},heroStatus:{color:y.color.textTertiary,fontSize:y.font.caption,fontWeight:"500",marginTop:6},heroStatusActive:{color:y.color.textSecondary},jumpBar:{flexDirection:"row"},jump:{flex:1,alignItems:"center",paddingVertical:12},jumpDivider:{borderLeftWidth:Y.hairlineWidth,borderLeftColor:y.color.separator},jumpAmount:{color:Cr,fontSize:17,fontWeight:"600",fontVariant:["tabular-nums"]},jumpUnit:{color:y.color.textSecondary,fontSize:y.font.caption,marginTop:1},row:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",gap:12,minHeight:50,paddingHorizontal:y.rowPadH,paddingVertical:10},rowDisabled:{opacity:.4},rowTitle:{color:y.color.text,fontSize:y.font.row},titleRow:{flexDirection:"row",alignItems:"center",gap:8,flexShrink:1},rowRight:{flexDirection:"row",alignItems:"center",gap:6,flexShrink:1},rowValue:{color:y.color.textSecondary,fontSize:y.font.row},tabular:{fontVariant:["tabular-nums"]},chevronOpen:{transform:[{rotate:"90deg"}]},actionLabel:{color:y.color.accent,fontSize:y.font.row},actionDestructive:{color:y.color.danger},editor:{paddingHorizontal:y.rowPadH,paddingBottom:14,gap:10},inputRow:{flexDirection:"row",alignItems:"center",gap:8},input:{flex:1,color:y.color.text,fontFamily:Yi,fontSize:15,backgroundColor:y.color.bg,borderRadius:y.radius.input,borderWidth:1,borderColor:y.color.border,paddingHorizontal:12,paddingVertical:8},hint:{color:y.color.textTertiary,fontSize:y.font.caption},presets:{flexDirection:"row",flexWrap:"wrap",gap:6},segmentRow:{flexDirection:"row"}});import{jsx as ka}from"react/jsx-runtime";var xa=Sr.actions;async function va(e,t){let r=xa[e];if(!r)throw new Error(`Unknown clock action: ${e}`);return r(t)}function wa(){tr().then(()=>Bi("auto","buoy clock")).catch(()=>{})}function Lr(){yr(()=>{at(),ve()},[]);let[e,t]=Fi(R);return yr(()=>ce(()=>t(R())),[]),ka(Dr,{snapshot:e,onAction:va,onReload:wa})}import{jsx as Ta}from"react/jsx-runtime";var jr=_i({id:"clock",name:"CLOCK",description:"Travel to any date, freeze or speed up the app's clock",slot:"both",color:ji,icon:({size:e,color:t})=>Ta(Li,{size:e,color:t}),component:Lr,modal:{subtitle:"override the app's date & time"}}),Aa=Mi(jr);import{ClockToolIcon as Sa,CLOCK_TOOL_ICON_COLOR as $a}from"@buoy-gg/shared-ui/web";var Ia=typeof navigator<"u"&&navigator.product==="ReactNative",Ra=(()=>{try{return globalThis.Capacitor?.isNativePlatform?.()===true}catch{return false}})();(Ia||Ra)&&(co(kt),zi(),typeof yt<"u"&&yt&&at());export{Se as CLOCK_CHIP_ID,$a as CLOCK_TOOL_ICON_COLOR,Lr as ClockBody,gr as ClockChip,Sa as ClockToolIcon,Dr as ClockToolView,At as TIME_PRESETS,at as bootClock,Sr as clockSyncAdapter,jr as clockToolPreset,Aa as createClockTool,wr as failNextRequest,te as formatDuration,nt as freeze,R as getClockSnapshot,we as getTokenReport,be as inspectToken,er as isClockOverridden,vr as jumpToTokenExpiry,Ei as openClockChip,Ne as parseDuration,yi as previewJump,S as realNow,it as reset,ot as resume,or as setRate,nr as setTime,rt as shift,ve as startTokenWatch,Ar as stopTokenCheck,ce as subscribeClock,H as tokenFingerprint,ir as updateSettings,V as useLiveClock,Qt as virtualNow,je as withRealClock};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@buoy-gg/clock",
|
|
3
|
-
"version": "7.0.
|
|
3
|
+
"version": "7.0.58",
|
|
4
4
|
"description": "Clock override for React Native: travel to any date, freeze or speed up time, and jump ahead while firing due timers. Test expirations, countdowns and renewals without touching the device clock.",
|
|
5
5
|
"main": "lib/commonjs/index.js",
|
|
6
6
|
"module": "lib/module/index.js",
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"./lib/web/**/*.mjs"
|
|
18
18
|
],
|
|
19
19
|
"dependencies": {
|
|
20
|
-
"@buoy-gg/shared-ui": "^7.0.
|
|
20
|
+
"@buoy-gg/shared-ui": "^7.0.58"
|
|
21
21
|
},
|
|
22
22
|
"peerDependencies": {
|
|
23
23
|
"react": "*"
|