From 3f49ced8b2cb960a93d647616f9af6c715d661ad Mon Sep 17 00:00:00 2001 From: Mike Tasset Date: Tue, 29 Jul 2025 15:59:44 +0200 Subject: [PATCH] Updated tooltips --- .../components/viewer/controls/Bottom.vue | 3 +- .../components/viewer/controls/Left.vue | 32 +++++------ .../components/viewer/controls/Right.vue | 15 +++-- .../components/viewer/measurements/Menu.vue | 4 +- .../components/viewer/view-modes/Menu.vue | 12 +--- packages/frontend-2/composables/tooltips.ts | 57 +++++++++++++++++++ 6 files changed, 88 insertions(+), 35 deletions(-) create mode 100644 packages/frontend-2/composables/tooltips.ts diff --git a/packages/frontend-2/components/viewer/controls/Bottom.vue b/packages/frontend-2/components/viewer/controls/Bottom.vue index 217768035..426f7f766 100644 --- a/packages/frontend-2/components/viewer/controls/Bottom.vue +++ b/packages/frontend-2/components/viewer/controls/Bottom.vue @@ -7,7 +7,7 @@ (ActivePanel.none) const panels = shallowRef({ diff --git a/packages/frontend-2/components/viewer/controls/Left.vue b/packages/frontend-2/components/viewer/controls/Left.vue index 88f48f33e..7534213ba 100644 --- a/packages/frontend-2/components/viewer/controls/Left.vue +++ b/packages/frontend-2/components/viewer/controls/Left.vue @@ -10,37 +10,36 @@ ]" >
- - - - - - - (), { const { zoomExtentsOrSelection } = useCameraUtilities() const { registerShortcuts, getShortcutDisplayText, shortcuts } = useViewerShortcuts() const mixpanel = useMixpanel() +const { getTooltipProps } = useSmartTooltipDelay() const activePanel = ref('none') const menuContainer = ref>(null) diff --git a/packages/frontend-2/components/viewer/measurements/Menu.vue b/packages/frontend-2/components/viewer/measurements/Menu.vue index f24c77cd5..5cf45ba91 100644 --- a/packages/frontend-2/components/viewer/measurements/Menu.vue +++ b/packages/frontend-2/components/viewer/measurements/Menu.vue @@ -47,7 +47,7 @@ { setMeasurementOptions({ ...measurementOptions.value, diff --git a/packages/frontend-2/components/viewer/view-modes/Menu.vue b/packages/frontend-2/components/viewer/view-modes/Menu.vue index c983ff782..0e9631310 100644 --- a/packages/frontend-2/components/viewer/view-modes/Menu.vue +++ b/packages/frontend-2/components/viewer/view-modes/Menu.vue @@ -67,7 +67,7 @@ @@ -109,8 +109,9 @@ const { setEdgesColor, edgesColor } = useViewModeUtilities() -const { registerShortcuts } = useViewerShortcuts() +const { registerShortcuts, getShortcutDisplayText } = useViewerShortcuts() const { isLightTheme } = useTheme() +const { getTooltipProps } = useSmartTooltipDelay() const showSettings = ref(false) @@ -126,10 +127,6 @@ const isActiveMode = (mode: ViewMode) => mode === currentViewMode.value const viewModeShortcuts = Object.values(ViewModeShortcuts) -const emit = defineEmits<{ - (e: 'force-close-others'): void -}>() - const edgesColorOptions = computed(() => [ isLightTheme.value || currentViewMode.value !== ViewMode.PEN ? 0x1a1a1a : 0xffffff, // black or white 0x3b82f6, // blue-500 @@ -143,9 +140,6 @@ const handleViewModeChange = (mode: ViewMode, isShortcut = false) => { setViewMode(mode) if (isShortcut) { - if (!open.value) { - emit('force-close-others') - } open.value = true } } diff --git a/packages/frontend-2/composables/tooltips.ts b/packages/frontend-2/composables/tooltips.ts new file mode 100644 index 000000000..a13c27b04 --- /dev/null +++ b/packages/frontend-2/composables/tooltips.ts @@ -0,0 +1,57 @@ +import type { MaybeNullOrUndefined } from '@speckle/shared' + +/** + * Smart tooltip delay composable + * + * Provides sophisticated tooltip behavior where: + * - First tooltip shows after a configurable delay (default 1 second) + * - Subsequent tooltips show instantly once user has shown intent + * - State resets after a period of inactivity (default 3 seconds) + */ + +export function useSmartTooltipDelay() { + const initialDelay = 1000 + const resetAfter = 3000 + + const hasShownAny = ref(false) + const resetTimer = ref(null) + + const getTooltipProps = ( + content?: MaybeNullOrUndefined, + additionalProps: Record = {} + ) => ({ + content, + delay: hasShownAny.value ? 0 : initialDelay, + onShow: () => { + hasShownAny.value = true + if (resetTimer.value) { + clearTimeout(resetTimer.value) + } + resetTimer.value = setTimeout(() => { + hasShownAny.value = false + }, resetAfter) + }, + ...additionalProps + }) + + const cleanup = () => { + if (resetTimer.value) { + clearTimeout(resetTimer.value) + resetTimer.value = null + } + } + + const reset = () => { + cleanup() + hasShownAny.value = false + } + + onUnmounted(() => { + cleanup() + }) + + return { + getTooltipProps, + reset + } +}