diff --git a/src/lib/components/AccordionContainer.svelte b/src/lib/components/AccordionContainer.svelte index 7b2b6c0..2a1718f 100644 --- a/src/lib/components/AccordionContainer.svelte +++ b/src/lib/components/AccordionContainer.svelte @@ -12,7 +12,7 @@ import {cubicIn} from 'svelte/easing'; import { flip } from 'svelte/animate'; import { type ContainerLayout, type WidgetLayout, type IDragItem } from "$lib/stores/layoutStates"; - import { startDrag, stopDrag } from "$lib/utils" + import { startDrag, stopDrag, vibrateIfPossible } from "$lib/utils" import { writable, type Writable } from "svelte/store"; import { isHidden } from "$lib/widgets/utils"; import { handleContainerConsider, handleContainerFinalize } from "./utils"; @@ -56,7 +56,7 @@ }; function handleClick(e: CustomEvent) { - navigator.vibrate(20) + vibrateIfPossible(20) $isOpen = e.detail } diff --git a/src/lib/components/TabsContainer.svelte b/src/lib/components/TabsContainer.svelte index be11e50..11a0c6f 100644 --- a/src/lib/components/TabsContainer.svelte +++ b/src/lib/components/TabsContainer.svelte @@ -12,7 +12,7 @@ import {cubicIn} from 'svelte/easing'; import { flip } from 'svelte/animate'; import { type ContainerLayout, type WidgetLayout, type IDragItem, type WritableLayoutStateStore } from "$lib/stores/layoutStates"; - import { startDrag, stopDrag } from "$lib/utils" + import { startDrag, stopDrag, vibrateIfPossible } from "$lib/utils" import type { Writable } from "svelte/store"; import { isHidden } from "$lib/widgets/utils"; import { handleContainerConsider, handleContainerFinalize } from "./utils"; @@ -62,7 +62,7 @@ } function handleSelect() { - navigator.vibrate(20) + vibrateIfPossible(20) } function _startDrag(e: MouseEvent | TouchEvent) { diff --git a/src/lib/utils.ts b/src/lib/utils.ts index 7b1df82..fa23cc9 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -828,3 +828,9 @@ const MOBILE_USER_AGENTS = ["iPhone", "iPad", "Android", "BlackBerry", "WebOs"]. export function isMobileBrowser(userAgent: string): boolean { return MOBILE_USER_AGENTS.some(a => userAgent.match(a)) } + +export function vibrateIfPossible(strength: number | Array) { + if (window.navigator.vibrate) { + window.navigator.vibrate(strength); + } +} diff --git a/src/lib/widgets/ButtonWidget.svelte b/src/lib/widgets/ButtonWidget.svelte index c02b45f..57979a0 100644 --- a/src/lib/widgets/ButtonWidget.svelte +++ b/src/lib/widgets/ButtonWidget.svelte @@ -3,6 +3,7 @@ import { Button } from "@gradio/button"; import { get, type Writable, writable } from "svelte/store"; import { isDisabled } from "./utils" + import { vibrateIfPossible } from "$lib/utils"; import type { ComfyButtonNode } from "$lib/nodes/widgets"; export let widget: WidgetLayout | null = null; @@ -24,7 +25,7 @@ function onClick(e: MouseEvent) { node.onClick(); - navigator.vibrate(20) + vibrateIfPossible(20) } const style = { diff --git a/src/lib/widgets/CheckboxWidget.svelte b/src/lib/widgets/CheckboxWidget.svelte index 7065100..fc86be6 100644 --- a/src/lib/widgets/CheckboxWidget.svelte +++ b/src/lib/widgets/CheckboxWidget.svelte @@ -4,6 +4,7 @@ import { Checkbox } from "@gradio/form"; import { get, type Writable, writable } from "svelte/store"; import { isDisabled } from "./utils" + import { vibrateIfPossible } from "$lib/utils"; import type { SelectData } from "@gradio/utils"; import type { ComfyCheckboxNode } from "$lib/nodes/widgets"; @@ -11,7 +12,7 @@ export let isMobile: boolean = false; let node: ComfyCheckboxNode | null = null; let nodeValue: Writable | null = null; - let attrsChanged: Writable | null = null; + let attrsChanged: Wrivtable | null = null; $: widget && setNodeValue(widget); @@ -25,7 +26,7 @@ function onSelect(e: CustomEvent) { $nodeValue = e.detail.selected - navigator.vibrate(20) + vibrateIfPossible(20) } diff --git a/src/lib/widgets/ComboWidget.svelte b/src/lib/widgets/ComboWidget.svelte index 5a64a58..c5369d9 100644 --- a/src/lib/widgets/ComboWidget.svelte +++ b/src/lib/widgets/ComboWidget.svelte @@ -8,7 +8,7 @@ import { type WidgetLayout } from "$lib/stores/layoutStates"; import { get, writable, type Writable } from "svelte/store"; import { isDisabled } from "./utils" - import { clamp, getSafetensorsMetadata } from '$lib/utils'; + import { clamp, getSafetensorsMetadata, vibrateIfPossible } from '$lib/utils'; export let widget: WidgetLayout | null = null; export let isMobile: boolean = false; let node: ComfyComboNode | null = null; @@ -70,7 +70,7 @@ function onFocus() { // console.warn("FOCUS") if (listOpen) { - navigator.vibrate(20) + vibrateIfPossible(20) } } @@ -86,7 +86,7 @@ function handleSelect(index: number) { // console.warn("SEL", index) - navigator.vibrate(20) + vibrateIfPossible(20) const item = $valuesForCombo[index] activeIndex = index; $nodeValue = item.value diff --git a/src/lib/widgets/NumberWidget.svelte b/src/lib/widgets/NumberWidget.svelte index 0225fec..9475569 100644 --- a/src/lib/widgets/NumberWidget.svelte +++ b/src/lib/widgets/NumberWidget.svelte @@ -3,7 +3,7 @@ import { type WidgetLayout } from "$lib/stores/layoutStates"; import { Range } from "$lib/components/gradio/form"; import { get, type Writable } from "svelte/store"; - import { debounce } from "$lib/utils"; + import { debounce, vibrateIfPossible } from "$lib/utils"; import interfaceState from "$lib/stores/interfaceState"; import { isDisabled } from "./utils" export let widget: WidgetLayout | null = null; @@ -96,7 +96,7 @@ lastDisplayValue = option; canVibrate = false; setTimeout(() => { canVibrate = true }, 30) - navigator.vibrate(10) + vibrateIfPossible(10) } } diff --git a/src/lib/widgets/RadioWidget.svelte b/src/lib/widgets/RadioWidget.svelte index 4c4b217..255e51e 100644 --- a/src/lib/widgets/RadioWidget.svelte +++ b/src/lib/widgets/RadioWidget.svelte @@ -5,7 +5,7 @@ import { get, type Writable, writable } from "svelte/store"; import { isDisabled } from "./utils" import type { SelectData } from "@gradio/utils"; - import { clamp } from "$lib/utils"; + import { clamp, vibrateIfPossible } from "$lib/utils"; import type { ComfyRadioNode } from "$lib/nodes/widgets"; export let widget: WidgetLayout | null = null; @@ -34,7 +34,7 @@ function onSelect(e: CustomEvent) { node.setValue(e.detail.value) node.index = e.detail.index as number - navigator.vibrate(20) + vibrateIfPossible(20) } diff --git a/src/mobile/GenToolbar.svelte b/src/mobile/GenToolbar.svelte index 2abf932..9c09d65 100644 --- a/src/mobile/GenToolbar.svelte +++ b/src/mobile/GenToolbar.svelte @@ -1,6 +1,7 @@ diff --git a/src/mobile/MainToolbar.svelte b/src/mobile/MainToolbar.svelte index 1a59173..57cc480 100644 --- a/src/mobile/MainToolbar.svelte +++ b/src/mobile/MainToolbar.svelte @@ -2,7 +2,7 @@ import ComfyApp, { type SerializedAppState } from "$lib/components/ComfyApp"; import queueState from "$lib/stores/queueState"; import workflowState, { ComfyBoxWorkflow } from "$lib/stores/workflowState"; - import { getNodeInfo } from "$lib/utils" + import { getNodeInfo, vibrateIfPossible } from "$lib/utils" import { LayoutTextSidebarReverse, Image, Grid } from "svelte-bootstrap-icons"; import { Link, Toolbar } from "framework7-svelte" @@ -21,12 +21,12 @@ $: workflow = $workflowState.activeWorkflow; function queuePrompt() { - navigator.vibrate(20) + vibrateIfPossible(20) app.runDefaultQueueAction() } async function refreshCombos() { - navigator.vibrate(20) + vibrateIfPossible(20) await app.refreshComboInNodes() } @@ -34,7 +34,7 @@ if (!fileInput) return; - navigator.vibrate(20) + vibrateIfPossible(20) app.querySave() } @@ -42,7 +42,7 @@ if (!fileInput) return; - navigator.vibrate(20) + vibrateIfPossible(20) fileInput.value = null; fileInput.click(); } @@ -52,7 +52,7 @@ } function doSaveLocal(): void { - navigator.vibrate(20) + vibrateIfPossible(20) app.saveStateToLocalStorage(); } diff --git a/src/mobile/routes/workflow.svelte b/src/mobile/routes/workflow.svelte index 4cc6dcb..1d7f8d0 100644 --- a/src/mobile/routes/workflow.svelte +++ b/src/mobile/routes/workflow.svelte @@ -34,12 +34,12 @@ } async function refreshCombos() { - navigator.vibrate(20) + vibrateIfPossible(20) await app.refreshComboInNodes() } function doSaveLocal(): void { - navigator.vibrate(20) + vibrateIfPossible(20) app.saveStateToLocalStorage(); } diff --git a/src/mobile/routes/workflows.svelte b/src/mobile/routes/workflows.svelte index 5b423e3..d099872 100644 --- a/src/mobile/routes/workflows.svelte +++ b/src/mobile/routes/workflows.svelte @@ -3,6 +3,7 @@ import workflowState, { ComfyBoxWorkflow, type WorkflowInstID } from "$lib/stores/workflowState"; import { onMount } from "svelte"; import interfaceState from "$lib/stores/interfaceState"; + import { vibrateIfPossible } from "$lib/utils"; import { f7 } from 'framework7-svelte'; import { XCircle } from 'svelte-bootstrap-icons'; @@ -31,7 +32,7 @@ if (!fileInput) return; - navigator.vibrate(20) + vibrateIfPossible(20); fileInput.value = null; fileInput.click(); }