chore(stage-web): added Web Haptics devtools (#1736)
This commit is contained in:
@@ -0,0 +1,77 @@
|
||||
<script setup lang="ts">
|
||||
import { Button } from '@proj-airi/ui'
|
||||
import { useWebHaptics } from 'web-haptics/vue'
|
||||
|
||||
const presetButtons = [
|
||||
{
|
||||
name: 'success',
|
||||
label: 'Success',
|
||||
icon: 'i-solar:check-circle-bold-duotone',
|
||||
variant: 'primary',
|
||||
},
|
||||
{
|
||||
name: 'nudge',
|
||||
label: 'Nudge',
|
||||
icon: 'i-solar:hand-stars-bold-duotone',
|
||||
variant: 'caution',
|
||||
},
|
||||
{
|
||||
name: 'error',
|
||||
label: 'Error',
|
||||
icon: 'i-solar:danger-triangle-bold-duotone',
|
||||
variant: 'danger',
|
||||
},
|
||||
{
|
||||
name: 'buzz',
|
||||
label: 'Buzz',
|
||||
icon: 'i-solar:alarm-bold-duotone',
|
||||
variant: 'secondary',
|
||||
},
|
||||
] as const
|
||||
|
||||
const { trigger, isSupported } = useWebHaptics({
|
||||
debug: true,
|
||||
})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div :class="['min-h-full flex flex-col gap-4 pb-12']">
|
||||
<div
|
||||
:class="[
|
||||
'inline-flex items-center gap-2 rounded-2xl border px-4 py-3 text-sm font-500 w-fit',
|
||||
isSupported
|
||||
? 'border-emerald-200 bg-emerald-50 text-emerald-700 dark:border-emerald-900/70 dark:bg-emerald-950/40 dark:text-emerald-200'
|
||||
: 'border-amber-200 bg-amber-50 text-amber-700 dark:border-amber-900/70 dark:bg-amber-950/40 dark:text-amber-200',
|
||||
]"
|
||||
>
|
||||
<span :class="[isSupported ? 'i-solar:check-circle-bold-duotone' : 'i-solar:danger-circle-bold-duotone']" />
|
||||
<span>isSupported: {{ isSupported ? 'true' : 'false' }}</span>
|
||||
</div>
|
||||
|
||||
<div :class="['flex flex-row gap-3']">
|
||||
<div
|
||||
v-for="preset in presetButtons"
|
||||
:key="preset.name"
|
||||
:class="['flex flex-1']"
|
||||
>
|
||||
<Button
|
||||
block
|
||||
size="md"
|
||||
shape="rounded"
|
||||
:variant="preset.variant"
|
||||
:icon="preset.icon"
|
||||
@click="trigger(preset.name)"
|
||||
>
|
||||
{{ preset.label }}
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<route lang="yaml">
|
||||
meta:
|
||||
layout: settings
|
||||
title: Web Haptics
|
||||
subtitleKey: tamagotchi.settings.devtools.title
|
||||
</route>
|
||||
@@ -74,6 +74,12 @@ const menu = computed(() => [
|
||||
icon: 'i-solar:transfer-horizontal-bold-duotone',
|
||||
to: '/devtools/websocket-inspector',
|
||||
},
|
||||
{
|
||||
title: 'Web Haptics',
|
||||
description: 'Trigger built-in haptic presets and custom pulse patterns',
|
||||
icon: 'i-solar:bolt-circle-bold-duotone',
|
||||
to: '/devtools/web-haptics',
|
||||
},
|
||||
{
|
||||
title: 'Plugin Host Debug',
|
||||
description: 'Inspect plugin host registry and capability state (desktop runtime)',
|
||||
|
||||
@@ -34,18 +34,24 @@
|
||||
],
|
||||
"scripts": {
|
||||
"build": "tsdown",
|
||||
"eval:run": "vieval run --config ./vieval.config.ts",
|
||||
"typecheck": "tsc --noEmit"
|
||||
},
|
||||
"dependencies": {
|
||||
"@moeru/std": "catalog:",
|
||||
"@proj-airi/pipelines-audio": "workspace:^",
|
||||
"@proj-airi/server-sdk": "workspace:^",
|
||||
"@proj-airi/server-shared": "workspace:^",
|
||||
"@xsai-ext/providers": "catalog:",
|
||||
"@xsai/generate-speech": "catalog:",
|
||||
"@xsai/generate-text": "catalog:",
|
||||
"@xsai/model": "catalog:",
|
||||
"@xsai/shared": "catalog:",
|
||||
"@xsai/shared-chat": "catalog:",
|
||||
"@xsai/stream-text": "catalog:",
|
||||
"@xsai/tool": "catalog:",
|
||||
"nanoid": "^5.1.9",
|
||||
"vieval": "catalog:",
|
||||
"xsschema": "catalog:",
|
||||
"zod": "^4.3.6"
|
||||
},
|
||||
|
||||
Generated
+15
@@ -2414,6 +2414,9 @@ importers:
|
||||
'@moeru/std':
|
||||
specifier: 'catalog:'
|
||||
version: 0.1.0-beta.17
|
||||
'@proj-airi/pipelines-audio':
|
||||
specifier: workspace:^
|
||||
version: link:../pipelines-audio
|
||||
'@proj-airi/server-sdk':
|
||||
specifier: workspace:^
|
||||
version: link:../server-sdk
|
||||
@@ -2423,9 +2426,18 @@ importers:
|
||||
'@xsai-ext/providers':
|
||||
specifier: 'catalog:'
|
||||
version: 0.5.0-beta.2
|
||||
'@xsai/generate-speech':
|
||||
specifier: 'catalog:'
|
||||
version: 0.5.0-beta.2
|
||||
'@xsai/generate-text':
|
||||
specifier: 'catalog:'
|
||||
version: 0.5.0-beta.2(patch_hash=306bfb723913596b334140f0d6fa48063f336e3b44024efc1d72bf60d54b15e6)
|
||||
'@xsai/model':
|
||||
specifier: 'catalog:'
|
||||
version: 0.5.0-beta.2
|
||||
'@xsai/shared':
|
||||
specifier: 'catalog:'
|
||||
version: 0.5.0-beta.2
|
||||
'@xsai/shared-chat':
|
||||
specifier: 'catalog:'
|
||||
version: 0.5.0-beta.2(patch_hash=26f2819b987245ec85f216b821ddf73aeb28fd7e611238a2d37250e42f838a01)
|
||||
@@ -2438,6 +2450,9 @@ importers:
|
||||
nanoid:
|
||||
specifier: ^5.1.9
|
||||
version: 5.1.9
|
||||
vieval:
|
||||
specifier: 'catalog:'
|
||||
version: 0.0.5(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(@vitest/browser-playwright@4.1.4)(@vitest/coverage-v8@4.1.4)(chokidar@5.0.0)(dotenv@17.4.2)(esbuild@0.27.2)(giget@2.0.0)(jiti@2.6.1)(jsdom@27.4.0(bufferutil@4.1.0)(canvas@3.2.3)(utf-8-validate@5.0.10))(less@4.6.4)(magicast@0.5.2)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)
|
||||
xsschema:
|
||||
specifier: 'catalog:'
|
||||
version: 0.5.0-beta.2(@valibot/to-json-schema@1.0.0-rc.0(valibot@1.3.1(typescript@5.9.3)))(zod-to-json-schema@3.25.2(zod@4.3.6))(zod@4.3.6)
|
||||
|
||||
Reference in New Issue
Block a user