@buoy-gg/core 7.0.41 → 7.0.43
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -95
- package/bin/buoy.js +19 -340
- package/lib/commonjs/Buoy.js +1 -107
- package/lib/commonjs/browserRegister.js +1 -48
- package/lib/commonjs/browserRegister.server.js +1 -10
- package/lib/commonjs/earlyHookScript.js +1 -0
- package/lib/commonjs/earlyNetwork.js +1 -0
- package/lib/commonjs/floatingMenu/AppHost.js +1 -460
- package/lib/commonjs/floatingMenu/AppHost.web.js +1 -376
- package/lib/commonjs/floatingMenu/AppHostLogic.js +1 -50
- package/lib/commonjs/floatingMenu/AppIcon.js +1 -91
- package/lib/commonjs/floatingMenu/AppIcon.web.js +1 -53
- package/lib/commonjs/floatingMenu/BrowserToolRuntime.js +1 -150
- package/lib/commonjs/floatingMenu/DefaultConfigContext.js +1 -45
- package/lib/commonjs/floatingMenu/DevToolsSettingsModal.js +1 -18
- package/lib/commonjs/floatingMenu/DevToolsSettingsModal.shared.js +1 -1114
- package/lib/commonjs/floatingMenu/DevToolsSettingsModal.web.js +1 -48
- package/lib/commonjs/floatingMenu/DevToolsVisibilityContext.js +1 -49
- package/lib/commonjs/floatingMenu/FloatingDevTools.js +1 -559
- package/lib/commonjs/floatingMenu/FloatingDevTools.web.js +1 -415
- package/lib/commonjs/floatingMenu/FloatingMenu.js +1 -371
- package/lib/commonjs/floatingMenu/MinimizedToolsContext.js +1 -274
- package/lib/commonjs/floatingMenu/MinimizedToolsStack.js +1 -288
- package/lib/commonjs/floatingMenu/MinimizedToolsStack.web.js +1 -377
- package/lib/commonjs/floatingMenu/ToggleStateManager.js +1 -36
- package/lib/commonjs/floatingMenu/ToolHost.js +1 -281
- package/lib/commonjs/floatingMenu/ToolOpenerBridge.js +1 -41
- package/lib/commonjs/floatingMenu/autoDiscoverPresets.js +1 -471
- package/lib/commonjs/floatingMenu/autoExternalSync.js +1 -443
- package/lib/commonjs/floatingMenu/defaultConfig.js +1 -167
- package/lib/commonjs/floatingMenu/deviceIdentity.js +1 -173
- package/lib/commonjs/floatingMenu/dial/DialDevTools.js +1 -904
- package/lib/commonjs/floatingMenu/dial/DialDevTools.web.js +1 -895
- package/lib/commonjs/floatingMenu/dial/DialHyperspace.js +1 -177
- package/lib/commonjs/floatingMenu/dial/DialIcon.js +1 -304
- package/lib/commonjs/floatingMenu/dial/DialPagination.js +1 -165
- package/lib/commonjs/floatingMenu/dial/DialSnow.js +1 -92
- package/lib/commonjs/floatingMenu/dial/OnboardingTooltip.js +1 -246
- package/lib/commonjs/floatingMenu/dial/OnboardingTooltip.web.js +2 -147
- package/lib/commonjs/floatingMenu/dial/dialUsageStore.js +1 -93
- package/lib/commonjs/floatingMenu/dial/onboardingConstants.js +1 -42
- package/lib/commonjs/floatingMenu/dial/onboardingConstants.web.js +1 -42
- package/lib/commonjs/floatingMenu/externalSyncGate.js +1 -49
- package/lib/commonjs/floatingMenu/floatingTools.js +1 -42
- package/lib/commonjs/floatingMenu/floatingTools.web.js +1 -30
- package/lib/commonjs/floatingMenu/optionalRequire.js +1 -37
- package/lib/commonjs/floatingMenu/settingsBus.js +1 -12
- package/lib/commonjs/floatingMenu/sync/appSyncAdapter.js +1 -115
- package/lib/commonjs/floatingMenu/types.js +1 -5
- package/lib/commonjs/floatingMenu/useDesktopSyncStatus.js +1 -28
- package/lib/commonjs/floatingMenu/useDesktopSyncStatus.web.js +1 -14
- package/lib/commonjs/index.js +1 -291
- package/lib/commonjs/index.web.js +1 -241
- package/lib/commonjs/reactDevtoolsTypes.js +1 -1
- package/lib/commonjs/releaseOptIn.js +1 -0
- package/lib/commonjs/telemetry/installPing.js +1 -131
- package/lib/commonjs/toolkit.js +1 -584
- package/lib/commonjs/toolkitComponents.js +1 -241
- package/lib/commonjs/utils/autoDiscoverPresets.web.js +1 -46
- package/lib/commonjs/utils/createWebTool.js +1 -20
- package/lib/commonjs/utils/createWebTools.js +1 -30
- package/lib/commonjs/version.js +1 -18
- package/lib/module/Buoy.js +1 -102
- package/lib/module/browserRegister.js +1 -44
- package/lib/module/browserRegister.server.js +1 -6
- package/lib/module/earlyHookScript.js +1 -0
- package/lib/module/earlyNetwork.js +1 -0
- package/lib/module/floatingMenu/AppHost.js +1 -452
- package/lib/module/floatingMenu/AppHost.web.js +1 -368
- package/lib/module/floatingMenu/AppHostLogic.js +1 -45
- package/lib/module/floatingMenu/AppIcon.js +1 -84
- package/lib/module/floatingMenu/AppIcon.web.js +1 -47
- package/lib/module/floatingMenu/BrowserToolRuntime.js +1 -146
- package/lib/module/floatingMenu/DefaultConfigContext.js +1 -39
- package/lib/module/floatingMenu/DevToolsSettingsModal.js +1 -3
- package/lib/module/floatingMenu/DevToolsSettingsModal.shared.js +1 -1110
- package/lib/module/floatingMenu/DevToolsSettingsModal.web.js +1 -44
- package/lib/module/floatingMenu/DevToolsVisibilityContext.js +1 -44
- package/lib/module/floatingMenu/FloatingDevTools.js +1 -556
- package/lib/module/floatingMenu/FloatingDevTools.web.js +1 -412
- package/lib/module/floatingMenu/FloatingMenu.js +1 -366
- package/lib/module/floatingMenu/MinimizedToolsContext.js +1 -266
- package/lib/module/floatingMenu/MinimizedToolsStack.js +1 -285
- package/lib/module/floatingMenu/MinimizedToolsStack.web.js +1 -374
- package/lib/module/floatingMenu/ToggleStateManager.js +1 -32
- package/lib/module/floatingMenu/ToolHost.js +1 -273
- package/lib/module/floatingMenu/ToolOpenerBridge.js +1 -37
- package/lib/module/floatingMenu/autoDiscoverPresets.js +1 -467
- package/lib/module/floatingMenu/autoExternalSync.js +1 -436
- package/lib/module/floatingMenu/defaultConfig.js +1 -158
- package/lib/module/floatingMenu/deviceIdentity.js +1 -163
- package/lib/module/floatingMenu/dial/DialDevTools.js +1 -900
- package/lib/module/floatingMenu/dial/DialDevTools.web.js +1 -891
- package/lib/module/floatingMenu/dial/DialHyperspace.js +1 -173
- package/lib/module/floatingMenu/dial/DialIcon.js +1 -301
- package/lib/module/floatingMenu/dial/DialPagination.js +1 -160
- package/lib/module/floatingMenu/dial/DialSnow.js +1 -90
- package/lib/module/floatingMenu/dial/OnboardingTooltip.js +1 -240
- package/lib/module/floatingMenu/dial/OnboardingTooltip.web.js +2 -142
- package/lib/module/floatingMenu/dial/dialUsageStore.js +1 -85
- package/lib/module/floatingMenu/dial/onboardingConstants.js +1 -3
- package/lib/module/floatingMenu/dial/onboardingConstants.web.js +1 -3
- package/lib/module/floatingMenu/externalSyncGate.js +1 -44
- package/lib/module/floatingMenu/floatingTools.js +1 -27
- package/lib/module/floatingMenu/floatingTools.web.js +1 -3
- package/lib/module/floatingMenu/optionalRequire.js +1 -33
- package/lib/module/floatingMenu/settingsBus.js +1 -3
- package/lib/module/floatingMenu/sync/appSyncAdapter.js +1 -112
- package/lib/module/floatingMenu/types.js +1 -3
- package/lib/module/floatingMenu/useDesktopSyncStatus.js +1 -25
- package/lib/module/floatingMenu/useDesktopSyncStatus.web.js +1 -10
- package/lib/module/index.js +1 -41
- package/lib/module/index.web.js +1 -36
- package/lib/module/reactDevtoolsTypes.js +1 -1
- package/lib/module/releaseOptIn.js +1 -0
- package/lib/module/telemetry/installPing.js +1 -127
- package/lib/module/toolkit.js +1 -62
- package/lib/module/toolkitComponents.js +1 -230
- package/lib/module/utils/autoDiscoverPresets.web.js +1 -38
- package/lib/module/utils/createWebTool.js +1 -17
- package/lib/module/utils/createWebTools.js +1 -25
- package/lib/module/version.js +1 -14
- package/lib/typescript/commonjs/browserRegister.d.ts +9 -1
- package/lib/typescript/commonjs/browserRegister.server.d.ts +1 -0
- package/lib/typescript/commonjs/earlyHookScript.d.ts +12 -0
- package/lib/typescript/commonjs/earlyNetwork.d.ts +52 -0
- package/lib/typescript/commonjs/floatingMenu/defaultConfig.d.ts +1 -1
- package/lib/typescript/commonjs/index.web.d.ts +1 -0
- package/lib/typescript/commonjs/releaseOptIn.d.ts +4 -0
- package/lib/typescript/commonjs/version.d.ts +1 -1
- package/lib/typescript/module/browserRegister.d.ts +9 -1
- package/lib/typescript/module/browserRegister.server.d.ts +1 -0
- package/lib/typescript/module/earlyHookScript.d.ts +12 -0
- package/lib/typescript/module/earlyNetwork.d.ts +52 -0
- package/lib/typescript/module/floatingMenu/defaultConfig.d.ts +1 -1
- package/lib/typescript/module/index.web.d.ts +1 -0
- package/lib/typescript/module/releaseOptIn.d.ts +4 -0
- package/lib/typescript/module/version.d.ts +1 -1
- package/lib/web/chunks/chunk-5SGL6QL4.mjs +1 -0
- package/lib/web/chunks/chunk-FROELTJH.mjs +1 -0
- package/lib/web/chunks/chunk-QZDVCMCT.mjs +1 -2
- package/lib/web/chunks/chunk-R7RGRTY5.mjs +1 -2
- package/lib/web/index.mjs +2 -3
- package/lib/web/register-server.mjs +1 -2
- package/lib/web/register.mjs +1 -2
- package/lib/web/toolkit.mjs +1 -2
- package/package.json +6 -9
- package/lib/typescript/commonjs/Buoy.d.ts.map +0 -1
- package/lib/typescript/commonjs/browserRegister.d.ts.map +0 -1
- package/lib/typescript/commonjs/browserRegister.server.d.ts.map +0 -1
- package/lib/typescript/commonjs/floatingMenu/AppHost.d.ts.map +0 -1
- package/lib/typescript/commonjs/floatingMenu/AppHost.web.d.ts.map +0 -1
- package/lib/typescript/commonjs/floatingMenu/AppHostLogic.d.ts.map +0 -1
- package/lib/typescript/commonjs/floatingMenu/AppIcon.d.ts.map +0 -1
- package/lib/typescript/commonjs/floatingMenu/AppIcon.web.d.ts.map +0 -1
- package/lib/typescript/commonjs/floatingMenu/BrowserToolRuntime.d.ts.map +0 -1
- package/lib/typescript/commonjs/floatingMenu/DefaultConfigContext.d.ts.map +0 -1
- package/lib/typescript/commonjs/floatingMenu/DevToolsSettingsModal.d.ts.map +0 -1
- package/lib/typescript/commonjs/floatingMenu/DevToolsSettingsModal.shared.d.ts.map +0 -1
- package/lib/typescript/commonjs/floatingMenu/DevToolsSettingsModal.web.d.ts.map +0 -1
- package/lib/typescript/commonjs/floatingMenu/DevToolsVisibilityContext.d.ts.map +0 -1
- package/lib/typescript/commonjs/floatingMenu/FloatingDevTools.d.ts.map +0 -1
- package/lib/typescript/commonjs/floatingMenu/FloatingDevTools.web.d.ts.map +0 -1
- package/lib/typescript/commonjs/floatingMenu/FloatingMenu.d.ts.map +0 -1
- package/lib/typescript/commonjs/floatingMenu/MinimizedToolsContext.d.ts.map +0 -1
- package/lib/typescript/commonjs/floatingMenu/MinimizedToolsStack.d.ts.map +0 -1
- package/lib/typescript/commonjs/floatingMenu/MinimizedToolsStack.web.d.ts.map +0 -1
- package/lib/typescript/commonjs/floatingMenu/ToggleStateManager.d.ts.map +0 -1
- package/lib/typescript/commonjs/floatingMenu/ToolHost.d.ts.map +0 -1
- package/lib/typescript/commonjs/floatingMenu/ToolOpenerBridge.d.ts.map +0 -1
- package/lib/typescript/commonjs/floatingMenu/autoDiscoverPresets.d.ts.map +0 -1
- package/lib/typescript/commonjs/floatingMenu/autoExternalSync.d.ts.map +0 -1
- package/lib/typescript/commonjs/floatingMenu/defaultConfig.d.ts.map +0 -1
- package/lib/typescript/commonjs/floatingMenu/deviceIdentity.d.ts.map +0 -1
- package/lib/typescript/commonjs/floatingMenu/dial/DialDevTools.d.ts.map +0 -1
- package/lib/typescript/commonjs/floatingMenu/dial/DialDevTools.web.d.ts.map +0 -1
- package/lib/typescript/commonjs/floatingMenu/dial/DialHyperspace.d.ts.map +0 -1
- package/lib/typescript/commonjs/floatingMenu/dial/DialIcon.d.ts.map +0 -1
- package/lib/typescript/commonjs/floatingMenu/dial/DialPagination.d.ts.map +0 -1
- package/lib/typescript/commonjs/floatingMenu/dial/DialSnow.d.ts.map +0 -1
- package/lib/typescript/commonjs/floatingMenu/dial/OnboardingTooltip.d.ts.map +0 -1
- package/lib/typescript/commonjs/floatingMenu/dial/OnboardingTooltip.web.d.ts.map +0 -1
- package/lib/typescript/commonjs/floatingMenu/dial/dialUsageStore.d.ts.map +0 -1
- package/lib/typescript/commonjs/floatingMenu/dial/onboardingConstants.d.ts.map +0 -1
- package/lib/typescript/commonjs/floatingMenu/dial/onboardingConstants.web.d.ts.map +0 -1
- package/lib/typescript/commonjs/floatingMenu/externalSyncGate.d.ts.map +0 -1
- package/lib/typescript/commonjs/floatingMenu/floatingTools.d.ts.map +0 -1
- package/lib/typescript/commonjs/floatingMenu/floatingTools.web.d.ts.map +0 -1
- package/lib/typescript/commonjs/floatingMenu/optionalRequire.d.ts.map +0 -1
- package/lib/typescript/commonjs/floatingMenu/settingsBus.d.ts.map +0 -1
- package/lib/typescript/commonjs/floatingMenu/sync/appSyncAdapter.d.ts.map +0 -1
- package/lib/typescript/commonjs/floatingMenu/types.d.ts.map +0 -1
- package/lib/typescript/commonjs/floatingMenu/useDesktopSyncStatus.d.ts.map +0 -1
- package/lib/typescript/commonjs/floatingMenu/useDesktopSyncStatus.web.d.ts.map +0 -1
- package/lib/typescript/commonjs/index.d.ts.map +0 -1
- package/lib/typescript/commonjs/index.web.d.ts.map +0 -1
- package/lib/typescript/commonjs/reactDevtoolsTypes.d.ts.map +0 -1
- package/lib/typescript/commonjs/telemetry/installPing.d.ts.map +0 -1
- package/lib/typescript/commonjs/toolkit.d.ts.map +0 -1
- package/lib/typescript/commonjs/toolkitComponents.d.ts.map +0 -1
- package/lib/typescript/commonjs/utils/autoDiscoverPresets.web.d.ts.map +0 -1
- package/lib/typescript/commonjs/utils/createWebTool.d.ts.map +0 -1
- package/lib/typescript/commonjs/utils/createWebTools.d.ts.map +0 -1
- package/lib/typescript/commonjs/version.d.ts.map +0 -1
- package/lib/typescript/module/Buoy.d.ts.map +0 -1
- package/lib/typescript/module/browserRegister.d.ts.map +0 -1
- package/lib/typescript/module/browserRegister.server.d.ts.map +0 -1
- package/lib/typescript/module/floatingMenu/AppHost.d.ts.map +0 -1
- package/lib/typescript/module/floatingMenu/AppHost.web.d.ts.map +0 -1
- package/lib/typescript/module/floatingMenu/AppHostLogic.d.ts.map +0 -1
- package/lib/typescript/module/floatingMenu/AppIcon.d.ts.map +0 -1
- package/lib/typescript/module/floatingMenu/AppIcon.web.d.ts.map +0 -1
- package/lib/typescript/module/floatingMenu/BrowserToolRuntime.d.ts.map +0 -1
- package/lib/typescript/module/floatingMenu/DefaultConfigContext.d.ts.map +0 -1
- package/lib/typescript/module/floatingMenu/DevToolsSettingsModal.d.ts.map +0 -1
- package/lib/typescript/module/floatingMenu/DevToolsSettingsModal.shared.d.ts.map +0 -1
- package/lib/typescript/module/floatingMenu/DevToolsSettingsModal.web.d.ts.map +0 -1
- package/lib/typescript/module/floatingMenu/DevToolsVisibilityContext.d.ts.map +0 -1
- package/lib/typescript/module/floatingMenu/FloatingDevTools.d.ts.map +0 -1
- package/lib/typescript/module/floatingMenu/FloatingDevTools.web.d.ts.map +0 -1
- package/lib/typescript/module/floatingMenu/FloatingMenu.d.ts.map +0 -1
- package/lib/typescript/module/floatingMenu/MinimizedToolsContext.d.ts.map +0 -1
- package/lib/typescript/module/floatingMenu/MinimizedToolsStack.d.ts.map +0 -1
- package/lib/typescript/module/floatingMenu/MinimizedToolsStack.web.d.ts.map +0 -1
- package/lib/typescript/module/floatingMenu/ToggleStateManager.d.ts.map +0 -1
- package/lib/typescript/module/floatingMenu/ToolHost.d.ts.map +0 -1
- package/lib/typescript/module/floatingMenu/ToolOpenerBridge.d.ts.map +0 -1
- package/lib/typescript/module/floatingMenu/autoDiscoverPresets.d.ts.map +0 -1
- package/lib/typescript/module/floatingMenu/autoExternalSync.d.ts.map +0 -1
- package/lib/typescript/module/floatingMenu/defaultConfig.d.ts.map +0 -1
- package/lib/typescript/module/floatingMenu/deviceIdentity.d.ts.map +0 -1
- package/lib/typescript/module/floatingMenu/dial/DialDevTools.d.ts.map +0 -1
- package/lib/typescript/module/floatingMenu/dial/DialDevTools.web.d.ts.map +0 -1
- package/lib/typescript/module/floatingMenu/dial/DialHyperspace.d.ts.map +0 -1
- package/lib/typescript/module/floatingMenu/dial/DialIcon.d.ts.map +0 -1
- package/lib/typescript/module/floatingMenu/dial/DialPagination.d.ts.map +0 -1
- package/lib/typescript/module/floatingMenu/dial/DialSnow.d.ts.map +0 -1
- package/lib/typescript/module/floatingMenu/dial/OnboardingTooltip.d.ts.map +0 -1
- package/lib/typescript/module/floatingMenu/dial/OnboardingTooltip.web.d.ts.map +0 -1
- package/lib/typescript/module/floatingMenu/dial/dialUsageStore.d.ts.map +0 -1
- package/lib/typescript/module/floatingMenu/dial/onboardingConstants.d.ts.map +0 -1
- package/lib/typescript/module/floatingMenu/dial/onboardingConstants.web.d.ts.map +0 -1
- package/lib/typescript/module/floatingMenu/externalSyncGate.d.ts.map +0 -1
- package/lib/typescript/module/floatingMenu/floatingTools.d.ts.map +0 -1
- package/lib/typescript/module/floatingMenu/floatingTools.web.d.ts.map +0 -1
- package/lib/typescript/module/floatingMenu/optionalRequire.d.ts.map +0 -1
- package/lib/typescript/module/floatingMenu/settingsBus.d.ts.map +0 -1
- package/lib/typescript/module/floatingMenu/sync/appSyncAdapter.d.ts.map +0 -1
- package/lib/typescript/module/floatingMenu/types.d.ts.map +0 -1
- package/lib/typescript/module/floatingMenu/useDesktopSyncStatus.d.ts.map +0 -1
- package/lib/typescript/module/floatingMenu/useDesktopSyncStatus.web.d.ts.map +0 -1
- package/lib/typescript/module/index.d.ts.map +0 -1
- package/lib/typescript/module/index.web.d.ts.map +0 -1
- package/lib/typescript/module/reactDevtoolsTypes.d.ts.map +0 -1
- package/lib/typescript/module/telemetry/installPing.d.ts.map +0 -1
- package/lib/typescript/module/toolkit.d.ts.map +0 -1
- package/lib/typescript/module/toolkitComponents.d.ts.map +0 -1
- package/lib/typescript/module/utils/autoDiscoverPresets.web.d.ts.map +0 -1
- package/lib/typescript/module/utils/createWebTool.d.ts.map +0 -1
- package/lib/typescript/module/utils/createWebTools.d.ts.map +0 -1
- package/lib/typescript/module/version.d.ts.map +0 -1
- package/lib/web/chunks/chunk-5NZOQR6Q.mjs +0 -2
- package/lib/web/chunks/chunk-CGDSLLZF.mjs +0 -2
- package/lib/web/chunks/chunk-DCJDUSNR.mjs +0 -2
- package/lib/web/chunks/chunk-IDSHFS6G.mjs +0 -2
- package/lib/web/chunks/chunk-JOAMJGCS.mjs +0 -2
- package/lib/web/chunks/chunk-KYKZ2N52.mjs +0 -2
- package/lib/web/chunks/chunk-NGM7JGGS.mjs +0 -2
- package/lib/web/chunks/chunk-Z3XWDDIO.mjs +0 -2
- package/lib/web/chunks/chunk-ZTGQ6TTY.mjs +0 -2
|
@@ -1,90 +1 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* DialSnow — pale particles drifting down inside the open dial's face, built
|
|
5
|
-
* from the shared background primitives (packages/shared/src/ui/backgrounds).
|
|
6
|
-
*
|
|
7
|
-
* Same performance contract as the backgrounds: the loop is native-driven
|
|
8
|
-
* (useLoop hands the whole animation to the UI thread once — zero JS work per
|
|
9
|
-
* frame), the flakes are one rasterized texture, and the scatter table is
|
|
10
|
-
* generated at module load. Cost while the dial is open: 1 animated node and
|
|
11
|
-
* ~24 static views, mounted only for the dial's lifetime.
|
|
12
|
-
*
|
|
13
|
-
* Rendered inside the circle's `overflow: "hidden"` background. The dial is
|
|
14
|
-
* fixed-size (never user-resized), so sizing geometry from the passed circle
|
|
15
|
-
* size is correct here.
|
|
16
|
-
*/
|
|
17
|
-
|
|
18
|
-
import { memo } from "react";
|
|
19
|
-
import { Animated, View } from "react-native";
|
|
20
|
-
import { RasterLayer, scatter, useLoop, withBgAlpha } from "@buoy-gg/shared-ui";
|
|
21
|
-
|
|
22
|
-
/** Pale mint-ice flake tint — sits quietly on the dial's dark face. */
|
|
23
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
24
|
-
const SNOW_COLOR = "#A8E0D2";
|
|
25
|
-
|
|
26
|
-
/** Stride 3: x, y, size — fixed seed so the flurry is identical every open. */
|
|
27
|
-
const SNOW_COUNT = 12;
|
|
28
|
-
const SNOW_TABLE = scatter(0x5ea1, SNOW_COUNT * 3);
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* The two-copy tiling trick from the backdrops: everything drawn twice one
|
|
32
|
-
* height apart, translated a full height per loop, so the seam never shows.
|
|
33
|
-
* Sway is keyframed onto the SAME loop value.
|
|
34
|
-
*/
|
|
35
|
-
export const DialSnow = /*#__PURE__*/memo(function DialSnow({
|
|
36
|
-
size
|
|
37
|
-
}) {
|
|
38
|
-
const t = useLoop(26000);
|
|
39
|
-
const translateY = t.interpolate({
|
|
40
|
-
inputRange: [0, 1],
|
|
41
|
-
outputRange: [0, size]
|
|
42
|
-
});
|
|
43
|
-
const translateX = t.interpolate({
|
|
44
|
-
inputRange: [0, 0.25, 0.5, 0.75, 1],
|
|
45
|
-
outputRange: [0, 5, 0, -5, 0]
|
|
46
|
-
});
|
|
47
|
-
const flakes = [];
|
|
48
|
-
for (let i = 0; i < SNOW_COUNT; i++) {
|
|
49
|
-
const x = SNOW_TABLE[i * 3] * size;
|
|
50
|
-
const y = SNOW_TABLE[i * 3 + 1] * size;
|
|
51
|
-
// Bigger flakes read nearer, so they get more alpha too.
|
|
52
|
-
const dia = 1.4 + SNOW_TABLE[i * 3 + 2] * 1.2;
|
|
53
|
-
const alpha = 0.28 + SNOW_TABLE[i * 3 + 2] * 0.18;
|
|
54
|
-
for (let copy = 0; copy < 2; copy++) {
|
|
55
|
-
flakes.push(/*#__PURE__*/_jsx(View, {
|
|
56
|
-
style: {
|
|
57
|
-
position: "absolute",
|
|
58
|
-
left: x - dia / 2,
|
|
59
|
-
top: y + copy * size - dia / 2,
|
|
60
|
-
width: dia,
|
|
61
|
-
height: dia,
|
|
62
|
-
borderRadius: dia / 2,
|
|
63
|
-
backgroundColor: withBgAlpha(SNOW_COLOR, alpha)
|
|
64
|
-
}
|
|
65
|
-
}, `${i}-${copy}`));
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
return /*#__PURE__*/_jsx(Animated.View, {
|
|
69
|
-
style: {
|
|
70
|
-
position: "absolute",
|
|
71
|
-
left: 0,
|
|
72
|
-
top: -size,
|
|
73
|
-
width: size,
|
|
74
|
-
height: size * 2,
|
|
75
|
-
transform: [{
|
|
76
|
-
translateY
|
|
77
|
-
}, {
|
|
78
|
-
translateX
|
|
79
|
-
}]
|
|
80
|
-
},
|
|
81
|
-
pointerEvents: "none",
|
|
82
|
-
children: /*#__PURE__*/_jsx(RasterLayer, {
|
|
83
|
-
style: {
|
|
84
|
-
width: size,
|
|
85
|
-
height: size * 2
|
|
86
|
-
},
|
|
87
|
-
children: flakes
|
|
88
|
-
})
|
|
89
|
-
});
|
|
90
|
-
});
|
|
1
|
+
"use strict";import{memo as f}from"react";import{Animated as d,View as g}from"react-native";import{RasterLayer as w,scatter as R,useLoop as y,withBgAlpha as O}from"@buoy-gg/shared-ui";import{jsx as a}from"react/jsx-runtime";const x="#A8E0D2";const l=12;const r=R(24225,l*3);export const DialSnow=f(function S({size:t}){const s=y(26e3);const p=s.interpolate({inputRange:[0,1],outputRange:[0,t]});const c=s.interpolate({inputRange:[0,.25,.5,.75,1],outputRange:[0,5,0,-5,0]});const i=[];for(let o=0;o<l;o++){const h=r[o*3]*t;const u=r[o*3+1]*t;const n=1.4+r[o*3+2]*1.2;const m=.28+r[o*3+2]*.18;for(let e=0;e<2;e++){i.push(a(g,{style:{position:"absolute",left:h-n/2,top:u+e*t-n/2,width:n,height:n,borderRadius:n/2,backgroundColor:O(x,m)}},`${o}-${e}`))}}return a(d.View,{style:{position:"absolute",left:0,top:-t,width:t,height:t*2,transform:[{translateY:p},{translateX:c}]},pointerEvents:"none",children:a(w,{style:{width:t,height:t*2},children:i})})});
|
|
@@ -1,240 +1 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
import { useEffect, useRef } from "react";
|
|
4
|
-
import { Animated, Pressable, StyleSheet, Text, View, Easing } from "react-native";
|
|
5
|
-
import { absoluteFill, monoFont } from "@buoy-gg/shared-ui";
|
|
6
|
-
// dialColors comes from floating-tools-core — the shared-ui export of the same
|
|
7
|
-
// name is a stale legacy copy and must not be used here.
|
|
8
|
-
import { dialColors } from "@buoy-gg/floating-tools-core";
|
|
9
|
-
import { calculateTooltipPosition, ARROW_BOTTOM_OFFSET, ARROW_HEIGHT } from "./onboardingConstants";
|
|
10
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
11
|
-
export const OnboardingTooltip = ({
|
|
12
|
-
visible,
|
|
13
|
-
onDismiss,
|
|
14
|
-
title = "Welcome to Buoy!",
|
|
15
|
-
message = "Tap the center button to configure and add tools to your dial menu."
|
|
16
|
-
}) => {
|
|
17
|
-
const fadeAnim = useRef(new Animated.Value(0)).current;
|
|
18
|
-
const scaleAnim = useRef(new Animated.Value(0.8)).current;
|
|
19
|
-
const pulseAnim = useRef(new Animated.Value(1)).current;
|
|
20
|
-
const arrowBounceAnim = useRef(new Animated.Value(0)).current;
|
|
21
|
-
useEffect(() => {
|
|
22
|
-
if (visible) {
|
|
23
|
-
// Entrance animation
|
|
24
|
-
Animated.parallel([Animated.timing(fadeAnim, {
|
|
25
|
-
toValue: 1,
|
|
26
|
-
duration: 300,
|
|
27
|
-
easing: Easing.out(Easing.ease),
|
|
28
|
-
useNativeDriver: true
|
|
29
|
-
}), Animated.spring(scaleAnim, {
|
|
30
|
-
toValue: 1,
|
|
31
|
-
damping: 12,
|
|
32
|
-
stiffness: 150,
|
|
33
|
-
useNativeDriver: true
|
|
34
|
-
})]).start();
|
|
35
|
-
|
|
36
|
-
// Continuous pulse animation for the tooltip
|
|
37
|
-
Animated.loop(Animated.sequence([Animated.timing(pulseAnim, {
|
|
38
|
-
toValue: 1.02,
|
|
39
|
-
duration: 1500,
|
|
40
|
-
easing: Easing.inOut(Easing.ease),
|
|
41
|
-
useNativeDriver: true
|
|
42
|
-
}), Animated.timing(pulseAnim, {
|
|
43
|
-
toValue: 1,
|
|
44
|
-
duration: 1500,
|
|
45
|
-
easing: Easing.inOut(Easing.ease),
|
|
46
|
-
useNativeDriver: true
|
|
47
|
-
})])).start();
|
|
48
|
-
|
|
49
|
-
// Bouncing arrow animation
|
|
50
|
-
Animated.loop(Animated.sequence([Animated.timing(arrowBounceAnim, {
|
|
51
|
-
toValue: -8,
|
|
52
|
-
duration: 800,
|
|
53
|
-
easing: Easing.inOut(Easing.ease),
|
|
54
|
-
useNativeDriver: true
|
|
55
|
-
}), Animated.timing(arrowBounceAnim, {
|
|
56
|
-
toValue: 0,
|
|
57
|
-
duration: 800,
|
|
58
|
-
easing: Easing.inOut(Easing.ease),
|
|
59
|
-
useNativeDriver: true
|
|
60
|
-
})])).start();
|
|
61
|
-
} else {
|
|
62
|
-
// Exit animation
|
|
63
|
-
Animated.parallel([Animated.timing(fadeAnim, {
|
|
64
|
-
toValue: 0,
|
|
65
|
-
duration: 200,
|
|
66
|
-
easing: Easing.in(Easing.ease),
|
|
67
|
-
useNativeDriver: true
|
|
68
|
-
}), Animated.timing(scaleAnim, {
|
|
69
|
-
toValue: 0.8,
|
|
70
|
-
duration: 200,
|
|
71
|
-
easing: Easing.in(Easing.ease),
|
|
72
|
-
useNativeDriver: true
|
|
73
|
-
})]).start();
|
|
74
|
-
}
|
|
75
|
-
}, [visible]);
|
|
76
|
-
if (!visible) {
|
|
77
|
-
return null;
|
|
78
|
-
}
|
|
79
|
-
return /*#__PURE__*/_jsx(Animated.View, {
|
|
80
|
-
style: [styles.container, {
|
|
81
|
-
opacity: fadeAnim,
|
|
82
|
-
transform: [{
|
|
83
|
-
scale: scaleAnim
|
|
84
|
-
}]
|
|
85
|
-
}],
|
|
86
|
-
pointerEvents: "box-none",
|
|
87
|
-
children: /*#__PURE__*/_jsx(Animated.View, {
|
|
88
|
-
style: [styles.tooltipContainer, {
|
|
89
|
-
transform: [{
|
|
90
|
-
scale: pulseAnim
|
|
91
|
-
}]
|
|
92
|
-
}],
|
|
93
|
-
children: /*#__PURE__*/_jsxs(View, {
|
|
94
|
-
style: styles.tooltip,
|
|
95
|
-
children: [/*#__PURE__*/_jsx(View, {
|
|
96
|
-
style: styles.glowEffect
|
|
97
|
-
}), /*#__PURE__*/_jsxs(View, {
|
|
98
|
-
style: styles.content,
|
|
99
|
-
children: [/*#__PURE__*/_jsx(Text, {
|
|
100
|
-
style: styles.title,
|
|
101
|
-
children: title
|
|
102
|
-
}), /*#__PURE__*/_jsx(Text, {
|
|
103
|
-
style: styles.message,
|
|
104
|
-
children: message
|
|
105
|
-
}), /*#__PURE__*/_jsx(Pressable, {
|
|
106
|
-
onPress: onDismiss,
|
|
107
|
-
style: ({
|
|
108
|
-
pressed
|
|
109
|
-
}) => [styles.button, pressed && styles.buttonPressed],
|
|
110
|
-
children: /*#__PURE__*/_jsx(View, {
|
|
111
|
-
style: styles.buttonGradient,
|
|
112
|
-
children: /*#__PURE__*/_jsx(Text, {
|
|
113
|
-
style: styles.buttonText,
|
|
114
|
-
children: "Got it!"
|
|
115
|
-
})
|
|
116
|
-
})
|
|
117
|
-
})]
|
|
118
|
-
}), /*#__PURE__*/_jsx(Animated.View, {
|
|
119
|
-
style: [styles.arrowContainer, {
|
|
120
|
-
transform: [{
|
|
121
|
-
translateY: arrowBounceAnim
|
|
122
|
-
}]
|
|
123
|
-
}],
|
|
124
|
-
children: /*#__PURE__*/_jsx(View, {
|
|
125
|
-
style: styles.arrow
|
|
126
|
-
})
|
|
127
|
-
})]
|
|
128
|
-
})
|
|
129
|
-
})
|
|
130
|
-
});
|
|
131
|
-
};
|
|
132
|
-
const styles = StyleSheet.create({
|
|
133
|
-
container: {
|
|
134
|
-
...absoluteFill,
|
|
135
|
-
alignItems: "center",
|
|
136
|
-
justifyContent: "center",
|
|
137
|
-
pointerEvents: "box-none"
|
|
138
|
-
},
|
|
139
|
-
tooltipContainer: {
|
|
140
|
-
position: "absolute",
|
|
141
|
-
bottom: calculateTooltipPosition(),
|
|
142
|
-
alignItems: "center",
|
|
143
|
-
maxWidth: 280
|
|
144
|
-
},
|
|
145
|
-
tooltip: {
|
|
146
|
-
backgroundColor: dialColors.dialBackground,
|
|
147
|
-
borderRadius: 16,
|
|
148
|
-
borderWidth: 1,
|
|
149
|
-
borderColor: dialColors.dialBorder,
|
|
150
|
-
padding: 20,
|
|
151
|
-
shadowColor: dialColors.dialShadow,
|
|
152
|
-
shadowOffset: {
|
|
153
|
-
width: 0,
|
|
154
|
-
height: 0
|
|
155
|
-
},
|
|
156
|
-
shadowOpacity: 0.6,
|
|
157
|
-
shadowRadius: 20,
|
|
158
|
-
elevation: 10
|
|
159
|
-
},
|
|
160
|
-
glowEffect: {
|
|
161
|
-
position: "absolute",
|
|
162
|
-
top: -4,
|
|
163
|
-
left: -4,
|
|
164
|
-
right: -4,
|
|
165
|
-
bottom: -4,
|
|
166
|
-
borderRadius: 18,
|
|
167
|
-
backgroundColor: "#FFFFFF",
|
|
168
|
-
opacity: 0.06
|
|
169
|
-
},
|
|
170
|
-
content: {
|
|
171
|
-
alignItems: "center",
|
|
172
|
-
gap: 12
|
|
173
|
-
},
|
|
174
|
-
title: {
|
|
175
|
-
color: dialColors.accent,
|
|
176
|
-
fontSize: 16,
|
|
177
|
-
fontWeight: "900",
|
|
178
|
-
fontFamily: monoFont,
|
|
179
|
-
letterSpacing: 1,
|
|
180
|
-
textAlign: "center",
|
|
181
|
-
textTransform: "uppercase"
|
|
182
|
-
},
|
|
183
|
-
message: {
|
|
184
|
-
color: dialColors.centerText,
|
|
185
|
-
fontSize: 13,
|
|
186
|
-
lineHeight: 20,
|
|
187
|
-
textAlign: "center",
|
|
188
|
-
fontFamily: monoFont
|
|
189
|
-
},
|
|
190
|
-
button: {
|
|
191
|
-
marginTop: 8,
|
|
192
|
-
borderRadius: 8,
|
|
193
|
-
overflow: "hidden"
|
|
194
|
-
},
|
|
195
|
-
buttonPressed: {
|
|
196
|
-
opacity: 0.7,
|
|
197
|
-
transform: [{
|
|
198
|
-
scale: 0.96
|
|
199
|
-
}]
|
|
200
|
-
},
|
|
201
|
-
// Night primary button — accent fill takes dark ink.
|
|
202
|
-
buttonGradient: {
|
|
203
|
-
backgroundColor: dialColors.accent,
|
|
204
|
-
paddingHorizontal: 24,
|
|
205
|
-
paddingVertical: 10,
|
|
206
|
-
alignItems: "center"
|
|
207
|
-
},
|
|
208
|
-
buttonText: {
|
|
209
|
-
color: "#000000",
|
|
210
|
-
fontSize: 14,
|
|
211
|
-
fontWeight: "900",
|
|
212
|
-
fontFamily: monoFont,
|
|
213
|
-
letterSpacing: 1.5,
|
|
214
|
-
textTransform: "uppercase"
|
|
215
|
-
},
|
|
216
|
-
arrowContainer: {
|
|
217
|
-
position: "absolute",
|
|
218
|
-
bottom: ARROW_BOTTOM_OFFSET,
|
|
219
|
-
left: 0,
|
|
220
|
-
right: 0,
|
|
221
|
-
alignItems: "center"
|
|
222
|
-
},
|
|
223
|
-
arrow: {
|
|
224
|
-
width: 0,
|
|
225
|
-
height: 0,
|
|
226
|
-
borderLeftWidth: 12,
|
|
227
|
-
borderRightWidth: 12,
|
|
228
|
-
borderTopWidth: ARROW_HEIGHT,
|
|
229
|
-
borderLeftColor: "transparent",
|
|
230
|
-
borderRightColor: "transparent",
|
|
231
|
-
borderTopColor: dialColors.accent,
|
|
232
|
-
shadowColor: dialColors.dialShadow,
|
|
233
|
-
shadowOffset: {
|
|
234
|
-
width: 0,
|
|
235
|
-
height: 0
|
|
236
|
-
},
|
|
237
|
-
shadowOpacity: 0.5,
|
|
238
|
-
shadowRadius: 10
|
|
239
|
-
}
|
|
240
|
-
});
|
|
1
|
+
"use strict";import{useEffect as y,useRef as a}from"react";import{Animated as e,Pressable as v,StyleSheet as V,Text as g,View as i,Easing as t}from"react-native";import{absoluteFill as x,monoFont as m}from"@buoy-gg/shared-ui";import{dialColors as n}from"@buoy-gg/floating-tools-core";import{calculateTooltipPosition as T,ARROW_BOTTOM_OFFSET as C,ARROW_HEIGHT as O}from"./onboardingConstants";import{jsx as r,jsxs as p}from"react/jsx-runtime";export const OnboardingTooltip=({visible:s,onDismiss:h,title:f="Welcome to Buoy!",message:b="Tap the center button to configure and add tools to your dial menu."})=>{const l=a(new e.Value(0)).current;const u=a(new e.Value(.8)).current;const d=a(new e.Value(1)).current;const c=a(new e.Value(0)).current;y(()=>{if(s){e.parallel([e.timing(l,{toValue:1,duration:300,easing:t.out(t.ease),useNativeDriver:true}),e.spring(u,{toValue:1,damping:12,stiffness:150,useNativeDriver:true})]).start();e.loop(e.sequence([e.timing(d,{toValue:1.02,duration:1500,easing:t.inOut(t.ease),useNativeDriver:true}),e.timing(d,{toValue:1,duration:1500,easing:t.inOut(t.ease),useNativeDriver:true})])).start();e.loop(e.sequence([e.timing(c,{toValue:-8,duration:800,easing:t.inOut(t.ease),useNativeDriver:true}),e.timing(c,{toValue:0,duration:800,easing:t.inOut(t.ease),useNativeDriver:true})])).start()}else{e.parallel([e.timing(l,{toValue:0,duration:200,easing:t.in(t.ease),useNativeDriver:true}),e.timing(u,{toValue:.8,duration:200,easing:t.in(t.ease),useNativeDriver:true})]).start()}},[s]);if(!s){return null}return r(e.View,{style:[o.container,{opacity:l,transform:[{scale:u}]}],pointerEvents:"box-none",children:r(e.View,{style:[o.tooltipContainer,{transform:[{scale:d}]}],children:p(i,{style:o.tooltip,children:[r(i,{style:o.glowEffect}),p(i,{style:o.content,children:[r(g,{style:o.title,children:f}),r(g,{style:o.message,children:b}),r(v,{onPress:h,style:({pressed:w})=>[o.button,w&&o.buttonPressed],children:r(i,{style:o.buttonGradient,children:r(g,{style:o.buttonText,children:"Got it!"})})})]}),r(e.View,{style:[o.arrowContainer,{transform:[{translateY:c}]}],children:r(i,{style:o.arrow})})]})})})};const o=V.create({container:{...x,alignItems:"center",justifyContent:"center",pointerEvents:"box-none"},tooltipContainer:{position:"absolute",bottom:T(),alignItems:"center",maxWidth:280},tooltip:{backgroundColor:n.dialBackground,borderRadius:16,borderWidth:1,borderColor:n.dialBorder,padding:20,shadowColor:n.dialShadow,shadowOffset:{width:0,height:0},shadowOpacity:.6,shadowRadius:20,elevation:10},glowEffect:{position:"absolute",top:-4,left:-4,right:-4,bottom:-4,borderRadius:18,backgroundColor:"#FFFFFF",opacity:.06},content:{alignItems:"center",gap:12},title:{color:n.accent,fontSize:16,fontWeight:"900",fontFamily:m,letterSpacing:1,textAlign:"center",textTransform:"uppercase"},message:{color:n.centerText,fontSize:13,lineHeight:20,textAlign:"center",fontFamily:m},button:{marginTop:8,borderRadius:8,overflow:"hidden"},buttonPressed:{opacity:.7,transform:[{scale:.96}]},buttonGradient:{backgroundColor:n.accent,paddingHorizontal:24,paddingVertical:10,alignItems:"center"},buttonText:{color:"#000000",fontSize:14,fontWeight:"900",fontFamily:m,letterSpacing:1.5,textTransform:"uppercase"},arrowContainer:{position:"absolute",bottom:C,left:0,right:0,alignItems:"center"},arrow:{width:0,height:0,borderLeftWidth:12,borderRightWidth:12,borderTopWidth:O,borderLeftColor:"transparent",borderRightColor:"transparent",borderTopColor:n.accent,shadowColor:n.dialShadow,shadowOffset:{width:0,height:0},shadowOpacity:.5,shadowRadius:10}});
|
|
@@ -1,21 +1,4 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* OnboardingTooltip — Web twin of OnboardingTooltip.tsx.
|
|
5
|
-
* Centered glowing card with a down-pointing arrow, pulse loop, bouncing
|
|
6
|
-
* arrow, and a "Got it!" button. Rendered over a dark backdrop by callers.
|
|
7
|
-
* All values annotated with the native tokens they mirror.
|
|
8
|
-
*/
|
|
9
|
-
import { useEffect, useState } from 'react';
|
|
10
|
-
import { dialColors, withAlpha } from '@buoy-gg/floating-tools-react';
|
|
11
|
-
import { ARROW_BOTTOM_OFFSET, ARROW_HEIGHT, calculateTooltipPosition } from "./onboardingConstants.web.js";
|
|
12
|
-
import { monoFont } from "@buoy-gg/shared-ui";
|
|
13
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
14
|
-
let onboardingKeyframesInjected = false;
|
|
15
|
-
function injectOnboardingKeyframes() {
|
|
16
|
-
if (onboardingKeyframesInjected || typeof document === 'undefined') return;
|
|
17
|
-
const style = document.createElement('style');
|
|
18
|
-
style.textContent = `
|
|
1
|
+
"use strict";import{useEffect as g,useState as l}from"react";import{dialColors as e,withAlpha as d}from"@buoy-gg/floating-tools-react";import{ARROW_BOTTOM_OFFSET as h,ARROW_HEIGHT as F,calculateTooltipPosition as O}from"./onboardingConstants.web.js";import{monoFont as c}from"@buoy-gg/shared-ui";import{jsx as t,jsxs as p}from"react/jsx-runtime";let f=false;function A(){if(f||typeof document==="undefined")return;const o=document.createElement("style");o.textContent=`
|
|
19
2
|
@keyframes buoyOnboardPulse {
|
|
20
3
|
0%, 100% { transform: scale(1); }
|
|
21
4
|
50% { transform: scale(1.02); }
|
|
@@ -24,127 +7,4 @@ function injectOnboardingKeyframes() {
|
|
|
24
7
|
0%, 100% { transform: translateY(0); }
|
|
25
8
|
50% { transform: translateY(-8px); }
|
|
26
9
|
}
|
|
27
|
-
`;
|
|
28
|
-
document.head.appendChild(style);
|
|
29
|
-
onboardingKeyframesInjected = true;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
// The single brand accent (night accent, #20C997)
|
|
33
|
-
const PRIMARY = dialColors.accent;
|
|
34
|
-
export function OnboardingTooltip({
|
|
35
|
-
title,
|
|
36
|
-
message,
|
|
37
|
-
onDismiss,
|
|
38
|
-
showArrow = true
|
|
39
|
-
}) {
|
|
40
|
-
const [entered, setEntered] = useState(false);
|
|
41
|
-
const [buttonPressed, setButtonPressed] = useState(false);
|
|
42
|
-
useEffect(() => {
|
|
43
|
-
injectOnboardingKeyframes();
|
|
44
|
-
const raf = requestAnimationFrame(() => setEntered(true));
|
|
45
|
-
return () => cancelAnimationFrame(raf);
|
|
46
|
-
}, []);
|
|
47
|
-
const monoLabel = {
|
|
48
|
-
fontFamily: monoFont,
|
|
49
|
-
textTransform: 'uppercase'
|
|
50
|
-
};
|
|
51
|
-
return /*#__PURE__*/_jsx("div", {
|
|
52
|
-
style: {
|
|
53
|
-
position: 'fixed',
|
|
54
|
-
left: '50%',
|
|
55
|
-
bottom: calculateTooltipPosition(),
|
|
56
|
-
transform: `translateX(-50%) scale(${entered ? 1 : 0.8})`,
|
|
57
|
-
opacity: entered ? 1 : 0,
|
|
58
|
-
// native: fade 300ms + spring scale .8→1
|
|
59
|
-
transition: 'transform 300ms cubic-bezier(0.34, 1.3, 0.64, 1), opacity 300ms ease',
|
|
60
|
-
zIndex: 10002,
|
|
61
|
-
pointerEvents: 'auto'
|
|
62
|
-
},
|
|
63
|
-
children: /*#__PURE__*/_jsxs("div", {
|
|
64
|
-
style: {
|
|
65
|
-
position: 'relative',
|
|
66
|
-
animation: entered ? 'buoyOnboardPulse 3s ease-in-out infinite' : 'none'
|
|
67
|
-
},
|
|
68
|
-
children: [/*#__PURE__*/_jsx("div", {
|
|
69
|
-
style: {
|
|
70
|
-
position: 'absolute',
|
|
71
|
-
inset: -4,
|
|
72
|
-
borderRadius: 18,
|
|
73
|
-
backgroundColor: '#FFFFFF',
|
|
74
|
-
opacity: 0.06
|
|
75
|
-
}
|
|
76
|
-
}), /*#__PURE__*/_jsxs("div", {
|
|
77
|
-
style: {
|
|
78
|
-
position: 'relative',
|
|
79
|
-
maxWidth: 280,
|
|
80
|
-
backgroundColor: dialColors.dialBackground,
|
|
81
|
-
borderRadius: 16,
|
|
82
|
-
border: `1px solid ${dialColors.dialBorder}`,
|
|
83
|
-
padding: 20,
|
|
84
|
-
boxShadow: `0 0 20px ${withAlpha(dialColors.dialShadow, 0.6)}`,
|
|
85
|
-
display: 'flex',
|
|
86
|
-
flexDirection: 'column',
|
|
87
|
-
alignItems: 'center',
|
|
88
|
-
gap: 8
|
|
89
|
-
},
|
|
90
|
-
children: [/*#__PURE__*/_jsx("span", {
|
|
91
|
-
style: {
|
|
92
|
-
...monoLabel,
|
|
93
|
-
fontSize: 16,
|
|
94
|
-
fontWeight: 900,
|
|
95
|
-
letterSpacing: 1,
|
|
96
|
-
color: PRIMARY,
|
|
97
|
-
textAlign: 'center'
|
|
98
|
-
},
|
|
99
|
-
children: title
|
|
100
|
-
}), /*#__PURE__*/_jsx("span", {
|
|
101
|
-
style: {
|
|
102
|
-
fontFamily: monoFont,
|
|
103
|
-
fontSize: 13,
|
|
104
|
-
lineHeight: '20px',
|
|
105
|
-
color: dialColors.centerText,
|
|
106
|
-
textAlign: 'center'
|
|
107
|
-
},
|
|
108
|
-
children: message
|
|
109
|
-
}), /*#__PURE__*/_jsx("button", {
|
|
110
|
-
onClick: onDismiss,
|
|
111
|
-
onMouseDown: () => setButtonPressed(true),
|
|
112
|
-
onMouseUp: () => setButtonPressed(false),
|
|
113
|
-
onMouseLeave: () => setButtonPressed(false),
|
|
114
|
-
style: {
|
|
115
|
-
...monoLabel,
|
|
116
|
-
marginTop: 8,
|
|
117
|
-
borderRadius: 8,
|
|
118
|
-
// night primary button — accent fill takes dark ink
|
|
119
|
-
border: 'none',
|
|
120
|
-
backgroundColor: PRIMARY,
|
|
121
|
-
padding: '10px 24px',
|
|
122
|
-
fontSize: 14,
|
|
123
|
-
fontWeight: 900,
|
|
124
|
-
letterSpacing: 1.5,
|
|
125
|
-
color: '#000000',
|
|
126
|
-
cursor: 'pointer',
|
|
127
|
-
opacity: buttonPressed ? 0.7 : 1,
|
|
128
|
-
transform: buttonPressed ? 'scale(0.96)' : 'scale(1)',
|
|
129
|
-
transition: 'transform 100ms ease, opacity 100ms ease'
|
|
130
|
-
},
|
|
131
|
-
children: "Got it!"
|
|
132
|
-
})]
|
|
133
|
-
}), showArrow && /*#__PURE__*/_jsx("div", {
|
|
134
|
-
style: {
|
|
135
|
-
position: 'absolute',
|
|
136
|
-
left: '50%',
|
|
137
|
-
bottom: ARROW_BOTTOM_OFFSET,
|
|
138
|
-
marginLeft: -12,
|
|
139
|
-
width: 0,
|
|
140
|
-
height: 0,
|
|
141
|
-
borderLeft: '12px solid transparent',
|
|
142
|
-
borderRight: '12px solid transparent',
|
|
143
|
-
borderTop: `${ARROW_HEIGHT}px solid ${PRIMARY}`,
|
|
144
|
-
filter: `drop-shadow(0 0 10px ${withAlpha(dialColors.dialShadow, 0.5)})`,
|
|
145
|
-
animation: entered ? 'buoyOnboardArrowBounce 1.6s ease-in-out infinite' : 'none'
|
|
146
|
-
}
|
|
147
|
-
})]
|
|
148
|
-
})
|
|
149
|
-
});
|
|
150
|
-
}
|
|
10
|
+
`;document.head.appendChild(o);f=true}const i=e.accent;export function OnboardingTooltip({title:o,message:m,onDismiss:u,showArrow:b=true}){const[n,y]=l(false);const[a,r]=l(false);g(()=>{A();const x=requestAnimationFrame(()=>y(true));return()=>cancelAnimationFrame(x)},[]);const s={fontFamily:c,textTransform:"uppercase"};return t("div",{style:{position:"fixed",left:"50%",bottom:O(),transform:`translateX(-50%) scale(${n?1:.8})`,opacity:n?1:0,transition:"transform 300ms cubic-bezier(0.34, 1.3, 0.64, 1), opacity 300ms ease",zIndex:10002,pointerEvents:"auto"},children:p("div",{style:{position:"relative",animation:n?"buoyOnboardPulse 3s ease-in-out infinite":"none"},children:[t("div",{style:{position:"absolute",inset:-4,borderRadius:18,backgroundColor:"#FFFFFF",opacity:.06}}),p("div",{style:{position:"relative",maxWidth:280,backgroundColor:e.dialBackground,borderRadius:16,border:`1px solid ${e.dialBorder}`,padding:20,boxShadow:`0 0 20px ${d(e.dialShadow,.6)}`,display:"flex",flexDirection:"column",alignItems:"center",gap:8},children:[t("span",{style:{...s,fontSize:16,fontWeight:900,letterSpacing:1,color:i,textAlign:"center"},children:o}),t("span",{style:{fontFamily:c,fontSize:13,lineHeight:"20px",color:e.centerText,textAlign:"center"},children:m}),t("button",{onClick:u,onMouseDown:()=>r(true),onMouseUp:()=>r(false),onMouseLeave:()=>r(false),style:{...s,marginTop:8,borderRadius:8,border:"none",backgroundColor:i,padding:"10px 24px",fontSize:14,fontWeight:900,letterSpacing:1.5,color:"#000000",cursor:"pointer",opacity:a?.7:1,transform:a?"scale(0.96)":"scale(1)",transition:"transform 100ms ease, opacity 100ms ease"},children:"Got it!"})]}),b&&t("div",{style:{position:"absolute",left:"50%",bottom:h,marginLeft:-12,width:0,height:0,borderLeft:"12px solid transparent",borderRight:"12px solid transparent",borderTop:`${F}px solid ${i}`,filter:`drop-shadow(0 0 10px ${d(e.dialShadow,.5)})`,animation:n?"buoyOnboardArrowBounce 1.6s ease-in-out infinite":"none"}})]})})}
|
|
@@ -1,85 +1 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Persists dial usage and orders tools by their last launch.
|
|
5
|
-
* The cache loads on import so opening the dial can rank tools synchronously.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import { persistentStorage, devToolsStorageKeys } from "@buoy-gg/shared-ui";
|
|
9
|
-
import { recordUsage, pruneUsage } from "@buoy-gg/floating-tools-core";
|
|
10
|
-
const STORAGE_KEY = devToolsStorageKeys.dial.usage();
|
|
11
|
-
let cache = {};
|
|
12
|
-
let loaded = false;
|
|
13
|
-
let loadPromise = null;
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Load persisted usage data into the in-memory cache. Safe to call multiple
|
|
17
|
-
* times — the underlying read happens only once.
|
|
18
|
-
*/
|
|
19
|
-
export function loadDialUsage() {
|
|
20
|
-
if (loadPromise) return loadPromise;
|
|
21
|
-
loadPromise = (async () => {
|
|
22
|
-
try {
|
|
23
|
-
const raw = await persistentStorage.getItem(STORAGE_KEY);
|
|
24
|
-
if (raw) {
|
|
25
|
-
const parsed = JSON.parse(raw);
|
|
26
|
-
if (parsed && typeof parsed === "object") {
|
|
27
|
-
cache = parsed;
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
} catch {
|
|
31
|
-
// Ignore — start with an empty usage map.
|
|
32
|
-
} finally {
|
|
33
|
-
loaded = true;
|
|
34
|
-
}
|
|
35
|
-
})();
|
|
36
|
-
return loadPromise;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
// Kick off the load as soon as this module is imported.
|
|
40
|
-
void loadDialUsage();
|
|
41
|
-
|
|
42
|
-
/** Whether the usage cache has finished loading from storage. */
|
|
43
|
-
export function isDialUsageLoaded() {
|
|
44
|
-
return loaded;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/** Most recently opened first; unused tools keep registration order. */
|
|
48
|
-
export function getRankedToolIds(orderedIds) {
|
|
49
|
-
return orderedIds.map((id, index) => ({
|
|
50
|
-
id,
|
|
51
|
-
index,
|
|
52
|
-
lastUsed: cache[id]?.lastUsed ?? 0
|
|
53
|
-
})).sort((a, b) => b.lastUsed - a.lastUsed || a.index - b.index).map(({
|
|
54
|
-
id
|
|
55
|
-
}) => id);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* Record a single press of a tool and persist the updated usage map.
|
|
60
|
-
*
|
|
61
|
-
* @param id - Tool id that was pressed
|
|
62
|
-
*/
|
|
63
|
-
export async function recordToolUsage(id) {
|
|
64
|
-
if (!id) return;
|
|
65
|
-
if (!loaded) await loadDialUsage();
|
|
66
|
-
|
|
67
|
-
// Preserve launch order even when presses share a timestamp or the clock moves back.
|
|
68
|
-
const now = Math.max(Date.now(), ...Object.values(cache).map(entry => entry.lastUsed + 1));
|
|
69
|
-
cache = pruneUsage(recordUsage(cache, id, now), now);
|
|
70
|
-
try {
|
|
71
|
-
await persistentStorage.setItem(STORAGE_KEY, JSON.stringify(cache));
|
|
72
|
-
} catch {
|
|
73
|
-
// Ignore persistence failure — the in-memory cache is still updated.
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
/** Clear all usage data (in-memory and persisted). */
|
|
78
|
-
export async function resetDialUsage() {
|
|
79
|
-
cache = {};
|
|
80
|
-
try {
|
|
81
|
-
await persistentStorage.removeItem(STORAGE_KEY);
|
|
82
|
-
} catch {
|
|
83
|
-
// Ignore — the in-memory cache is already cleared.
|
|
84
|
-
}
|
|
85
|
-
}
|
|
1
|
+
"use strict";import{persistentStorage as r,devToolsStorageKeys as c}from"@buoy-gg/shared-ui";import{recordUsage as l,pruneUsage as d}from"@buoy-gg/floating-tools-core";const n=c.dial.usage();let a={};let i=false;let o=null;export function loadDialUsage(){if(o)return o;o=(async()=>{try{const t=await r.getItem(n);if(t){const e=JSON.parse(t);if(e&&typeof e==="object"){a=e}}}catch{}finally{i=true}})();return o}void loadDialUsage();export function isDialUsageLoaded(){return i}export function getRankedToolIds(t){return t.map((e,s)=>({id:e,index:s,lastUsed:a[e]?.lastUsed??0})).sort((e,s)=>s.lastUsed-e.lastUsed||e.index-s.index).map(({id:e})=>e)}export async function recordToolUsage(t){if(!t)return;if(!i)await loadDialUsage();const e=Math.max(Date.now(),...Object.values(a).map(s=>s.lastUsed+1));a=d(l(a,t,e),e);try{await r.setItem(n,JSON.stringify(a))}catch{}}export async function resetDialUsage(){a={};try{await r.removeItem(n)}catch{}}
|
|
@@ -1,3 +1 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
export { ARROW_BOTTOM_OFFSET, ARROW_HEIGHT, SPACING_GAP, getScreenCenterY, calculateTooltipPosition, calculateTargetPosition } from "@buoy-gg/shared-ui";
|
|
1
|
+
"use strict";export{ARROW_BOTTOM_OFFSET,ARROW_HEIGHT,SPACING_GAP,getScreenCenterY,calculateTooltipPosition,calculateTargetPosition}from"@buoy-gg/shared-ui";
|
|
@@ -1,3 +1 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
export { ARROW_BOTTOM_OFFSET, ARROW_HEIGHT, SPACING_GAP, getScreenCenterY, calculateTooltipPosition, calculateTargetPosition } from "@buoy-gg/shared-ui/floating";
|
|
1
|
+
"use strict";export{ARROW_BOTTOM_OFFSET,ARROW_HEIGHT,SPACING_GAP,getScreenCenterY,calculateTooltipPosition,calculateTargetPosition}from"@buoy-gg/shared-ui/floating";
|
|
@@ -1,44 +1 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Decides whether FloatingDevTools mounts <AutoExternalSync /> — i.e. whether
|
|
5
|
-
* this build is allowed to dial the Buoy Desktop broker.
|
|
6
|
-
*
|
|
7
|
-
* Kept as a pure function in its own module (no react-native / no guarded
|
|
8
|
-
* requires) so the rule is unit-testable: the gate used to be an inline
|
|
9
|
-
* `isDevelopment && ...` in JSX, which silently made release builds unable to
|
|
10
|
-
* reach the desktop dashboard or MCP with no way to opt in from app code.
|
|
11
|
-
*
|
|
12
|
-
* The rule has two halves that must BOTH hold in a release build, because a
|
|
13
|
-
* shipped app must never contact a broker on an end user's device:
|
|
14
|
-
* 1. a real Pro license (never the Weekend Pass — see useProAccess), and
|
|
15
|
-
* 2. an EXPLICIT opt-in from app code (`externalSync.enableInRelease`).
|
|
16
|
-
* Dev builds keep the zero-config behavior: sync is on unless turned off.
|
|
17
|
-
*/
|
|
18
|
-
|
|
19
|
-
/** The options object from the prop, or undefined when it's a boolean. */
|
|
20
|
-
export function externalSyncOptions(externalSync) {
|
|
21
|
-
return typeof externalSync === "object" && externalSync !== null ? externalSync : undefined;
|
|
22
|
-
}
|
|
23
|
-
export function shouldMountExternalSync({
|
|
24
|
-
isDevelopment,
|
|
25
|
-
isLicensed,
|
|
26
|
-
externalSync,
|
|
27
|
-
isAvailable
|
|
28
|
-
}) {
|
|
29
|
-
// Turned off outright, or the package isn't installed — nothing to mount.
|
|
30
|
-
if (externalSync === false) return false;
|
|
31
|
-
if (!isAvailable) return false;
|
|
32
|
-
|
|
33
|
-
// Dev builds: zero-config, on by default (historical behavior).
|
|
34
|
-
if (isDevelopment) return true;
|
|
35
|
-
|
|
36
|
-
// Release builds: opt-in only, and Pro only. `enableInRelease` has to be set
|
|
37
|
-
// by the app itself, so an app that just ships FloatingDevTools with a Pro
|
|
38
|
-
// key still never opens a socket on a customer's phone.
|
|
39
|
-
//
|
|
40
|
-
// The `isLicensed` half is belt-and-braces: FloatingDevTools already renders
|
|
41
|
-
// nothing at all for an unlicensed release build. Keep it anyway so this rule
|
|
42
|
-
// stands on its own and can't be broken by a change to that earlier return.
|
|
43
|
-
return isLicensed && externalSyncOptions(externalSync)?.enableInRelease === true;
|
|
44
|
-
}
|
|
1
|
+
"use strict";export function externalSyncOptions(e){return typeof e==="object"&&e!==null?e:void 0}export function shouldMountExternalSync({isDevelopment:e,isLicensed:n,externalSync:t,isAvailable:r}){if(t===false)return false;if(!r)return false;if(e)return true;return n&&externalSyncOptions(t)?.enableInRelease===true}
|
|
@@ -1,27 +1 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
import { useCallback } from "react";
|
|
4
|
-
import { FloatingTool } from "@buoy-gg/shared-ui";
|
|
5
|
-
import { MinimizedToolsStack } from "./MinimizedToolsStack";
|
|
6
|
-
import { useMinimizedTools } from "./MinimizedToolsContext.js";
|
|
7
|
-
import { useAppHost } from "./AppHost";
|
|
8
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
9
|
-
export { FloatingToolDivider as Divider, FloatingToolUserStatus as UserStatus } from "@buoy-gg/shared-ui";
|
|
10
|
-
/** The DevTools content adapter. All floating behavior lives in shared UI. */
|
|
11
|
-
export function FloatingTools(props) {
|
|
12
|
-
const {
|
|
13
|
-
minimizedTools
|
|
14
|
-
} = useMinimizedTools();
|
|
15
|
-
const {
|
|
16
|
-
restore
|
|
17
|
-
} = useAppHost();
|
|
18
|
-
const onRestore = useCallback(tool => restore(tool.instanceId, tool.modalState), [restore]);
|
|
19
|
-
return /*#__PURE__*/_jsx(FloatingTool, {
|
|
20
|
-
...props,
|
|
21
|
-
hasMinimizedStack: minimizedTools.length > 0,
|
|
22
|
-
minimizedStack: minimizedTools.length ? /*#__PURE__*/_jsx(MinimizedToolsStack, {
|
|
23
|
-
onRestore: onRestore,
|
|
24
|
-
containerWidth: 32
|
|
25
|
-
}) : undefined
|
|
26
|
-
});
|
|
27
|
-
}
|
|
1
|
+
"use strict";import{useCallback as n}from"react";import{FloatingTool as m}from"@buoy-gg/shared-ui";import{MinimizedToolsStack as a}from"./MinimizedToolsStack";import{useMinimizedTools as l}from"./MinimizedToolsContext.js";import{useAppHost as d}from"./AppHost";import{jsx as e}from"react/jsx-runtime";export{FloatingToolDivider as Divider,FloatingToolUserStatus as UserStatus}from"@buoy-gg/shared-ui";export function FloatingTools(r){const{minimizedTools:o}=l();const{restore:t}=d();const s=n(i=>t(i.instanceId,i.modalState),[t]);return e(m,{...r,hasMinimizedStack:o.length>0,minimizedStack:o.length?e(a,{onRestore:s,containerWidth:32}):void 0})}
|
|
@@ -1,3 +1 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
export { FloatingTool as FloatingTools, FloatingToolDivider as Divider, FloatingToolUserStatus as UserStatus, getBubbleAnchorPosition } from "@buoy-gg/shared-ui/floating";
|
|
1
|
+
"use strict";export{FloatingTool as FloatingTools,FloatingToolDivider as Divider,FloatingToolUserStatus as UserStatus,getBubbleAnchorPosition}from"@buoy-gg/shared-ui/floating";
|