diff --git a/web/src/components/AudioConfigPopover.vue b/web/src/components/AudioConfigPopover.vue
index b9aa9c8a..045103b1 100644
--- a/web/src/components/AudioConfigPopover.vue
+++ b/web/src/components/AudioConfigPopover.vue
@@ -7,7 +7,7 @@ import { Loader2, RefreshCw, Volume2 } from 'lucide-vue-next'
import { audioApi, configApi } from '@/api'
import { Button } from '@/components/ui/button'
import { Label } from '@/components/ui/label'
-import { NativeSelect, NativeSelectOption } from '@/components/ui/native-select'
+import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'
import {
Popover,
PopoverContent,
@@ -48,6 +48,7 @@ const applying = ref(false)
const audioEnabled = ref(false)
const selectedDevice = ref('')
const selectedQuality = ref<'voice' | 'balanced' | 'high'>('balanced')
+const EMPTY_SELECT_VALUE = '__one-kvm-empty-select-value__'
async function handleVolumeChange(value: number[] | undefined) {
if (!value || value.length === 0 || value[0] === undefined) return
@@ -226,23 +227,26 @@ onUnmounted(() => {
-
- {{ t('actionbar.selectAudioDevice') }}
-
- {{ device.description || device.name }}
-
-
+
+
+
+
+ {{ t('actionbar.selectAudioDevice') }}
+
+ {{ device.description || device.name }}
+
+
+
diff --git a/web/src/components/MicrophoneTransferControls.vue b/web/src/components/MicrophoneTransferControls.vue
index c0570fc7..1cb4256e 100644
--- a/web/src/components/MicrophoneTransferControls.vue
+++ b/web/src/components/MicrophoneTransferControls.vue
@@ -5,7 +5,7 @@ import { toast } from 'vue-sonner'
import { Loader2, Mic, MicOff, RefreshCw } from 'lucide-vue-next'
import { Button } from '@/components/ui/button'
-import { NativeSelect, NativeSelectOption } from '@/components/ui/native-select'
+import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'
import { getMicrophone } from '@/composables/useMicrophone'
const { t } = useI18n()
@@ -69,25 +69,25 @@ async function selectDevice(value: unknown) {
-
-
- {{ t('actionbar.noMicrophoneDevices') }}
-
-
- {{ device.label }}
-
-
+
+
+
+
+
+ {{ device.label }}
+
+
+
- config.otg_network_interface = value === EMPTY_SELECT_VALUE ? '' : String(value)"
>
-
- {{ otgNetworkInterfacesError }}
-
-
- {{ t('settings.otgNetworkNone') }}
-
-
- {{ item.name }} · {{ item.interface_type }}
-
-
+
+
+
+
+ {{ otgNetworkInterfacesError }}
+
+
+ {{ t('settings.otgNetworkNone') }}
+
+
+ {{ item.name }} · {{ item.interface_type }}
+
+
+
@@ -4058,17 +4096,23 @@ watch(isWindows, () => {
-
- {{ t('settings.selectDevice') }}
-
- {{ formatAtxDeviceLabel(atxConfig.driver, dev) }}
-
-
+
@@ -4089,10 +4133,16 @@ watch(isWindows, () => {
-
- {{ t('settings.atxDriverNone') }}
- {{ dev }}
-
+
@@ -4113,10 +4163,16 @@ watch(isWindows, () => {
-
- {{ t('settings.atxDriverNone') }}
- {{ dev }}
-
+
@@ -4137,10 +4193,16 @@ watch(isWindows, () => {
-
- {{ t('settings.atxDriverNone') }}
- {{ dev }}
-
+
@@ -4161,10 +4223,16 @@ watch(isWindows, () => {
-
- {{ t('settings.atxDriverNone') }}
- {{ dev }}
-
+
diff --git a/web/src/views/SetupView.vue b/web/src/views/SetupView.vue
index 71935b47..cd1aaf5b 100644
--- a/web/src/views/SetupView.vue
+++ b/web/src/views/SetupView.vue
@@ -27,7 +27,6 @@ import {
import { Switch } from '@/components/ui/switch'
import { Stepper, StepperItem, StepperSeparator, StepperTitle, StepperTrigger } from '@/components/ui/stepper'
import { Alert, AlertDescription } from '@/components/ui/alert'
-import { NativeSelect, NativeSelectOption } from '@/components/ui/native-select'
import {
Eye,
EyeOff,
@@ -75,6 +74,7 @@ const platform = ref
(null)
const isWindows = computed(() => platform.value?.mode === 'windows')
const audioSupported = computed(() => platform.value?.audio.available ?? true)
const totalSteps = 4
+const EMPTY_SELECT_VALUE = '__one-kvm-empty-select-value__'
const hidBackend = ref('ch9329')
const ch9329Port = ref('')
@@ -698,12 +698,20 @@ const stepIcons = [User, Video, Keyboard, Puzzle]
-
- {{ t('setup.selectVideoDevice') }}
-
+
-
+
+
+
@@ -731,37 +739,58 @@ const stepIcons = [User, Video, Keyboard, Puzzle]
-
- {{ t('setup.selectFormat') }}
-
+
-
+
+
+
-
- {{ t('setup.selectResolution') }}
- videoResolution = value === EMPTY_SELECT_VALUE ? '' : String(value)"
+ >
+
+
+
+
+ {{ t('setup.selectResolution') }}
+
{{ res.width }}x{{ res.height }}
-
-
+
+
+
- videoFps = value === '' ? null : Number(value)">
- {{ t('setup.selectFps') }}
-
+
-
+
+
+
@@ -784,11 +813,20 @@ const stepIcons = [User, Video, Keyboard, Puzzle]
-
- {{ t('setup.selectAudioDevice') }}
- {{ t('setup.noAudio') }}
- {{ dev.description }}{{ dev.is_hdmi ? ' (HDMI)' : '' }}
-
+
{{ t('setup.noAudioDevices') }}
@@ -859,12 +897,20 @@ const stepIcons = [User, Video, Keyboard, Puzzle]
-
- {{ t('setup.selectSerialPort') }}
-
+
-
+
+
+
{{ t('setup.noSerialDevices') }}
@@ -894,12 +940,20 @@ const stepIcons = [User, Video, Keyboard, Puzzle]
-
- {{ t('setup.selectUdc') }}
-
+
-
+
+
+
{{ t('setup.noUdcDevices') }}