diff --git a/apps/stage-tamagotchi/src/renderer/components/stage-islands/controls-island/controls-island-profile-picker.vue b/apps/stage-tamagotchi/src/renderer/components/stage-islands/controls-island/controls-island-profile-picker.vue
index 2a1f30c94..fb9caa8fe 100644
--- a/apps/stage-tamagotchi/src/renderer/components/stage-islands/controls-island/controls-island-profile-picker.vue
+++ b/apps/stage-tamagotchi/src/renderer/components/stage-islands/controls-island/controls-island-profile-picker.vue
@@ -1,20 +1,31 @@
-
-
-
+
+
+
diff --git a/apps/stage-tamagotchi/src/renderer/components/stage-islands/controls-island/index.vue b/apps/stage-tamagotchi/src/renderer/components/stage-islands/controls-island/index.vue
index 1fdeca291..c8ab7e05f 100644
--- a/apps/stage-tamagotchi/src/renderer/components/stage-islands/controls-island/index.vue
+++ b/apps/stage-tamagotchi/src/renderer/components/stage-islands/controls-island/index.vue
@@ -5,7 +5,7 @@ import { useSettings, useSettingsAudioDevice } from '@proj-airi/stage-ui/stores/
import { useTheme } from '@proj-airi/ui'
import { refDebounced, useIntervalFn } from '@vueuse/core'
import { storeToRefs } from 'pinia'
-import { computed, ref, watch } from 'vue'
+import { computed, reactive, ref, watch } from 'vue'
import { useI18n } from 'vue-i18n'
import ControlButtonTooltip from './control-button-tooltip.vue'
@@ -41,21 +41,37 @@ const setAlwaysOnTop = useElectronEventaInvoke(electronWindowSetAlwaysOnTop)
const expanded = ref(false)
const islandRef = ref()
-// Expose whether hearing dialog is open so parent can disable click-through
-const hearingDialogOpen = ref(false)
-defineExpose({ hearingDialogOpen })
+// Tracks open overlays/dialogs that should prevent auto-collapse (e.g. 'hearing', 'profile-picker')
+const blockingOverlays = reactive(new Set())
+const isBlocked = computed(() => blockingOverlays.size > 0)
+
+function setOverlay(key: string, active: boolean) {
+ active ? blockingOverlays.add(key) : blockingOverlays.delete(key)
+}
+
+// Expose for parent (e.g. to disable click-through when a dialog is open)
+defineExpose({
+ get hearingDialogOpen() { return blockingOverlays.has('hearing') },
+ set hearingDialogOpen(v: boolean) { setOverlay('hearing', v) },
+})
const { isOutside } = useElectronMouseInElement(islandRef)
const isOutsideAfter2seconds = refDebounced(isOutside, 1500)
watch(isOutsideAfter2seconds, (outside) => {
- if (outside && expanded.value && !hearingDialogOpen.value) {
+ if (outside && expanded.value && !isBlocked.value) {
expanded.value = false
}
})
+watch(expanded, (isExpanded) => {
+ if (!isExpanded) {
+ blockingOverlays.clear()
+ }
+})
+
useIntervalFn(() => {
- if (expanded.value && isOutside.value && !hearingDialogOpen.value) {
+ if (expanded.value && isOutside.value && !isBlocked.value) {
expanded.value = false
}
}, 1500)
@@ -130,7 +146,7 @@ function refreshWindow() {
-
+
@@ -173,7 +189,7 @@ function refreshWindow() {
-
+
diff --git a/packages/i18n/src/locales/en/stage.yaml b/packages/i18n/src/locales/en/stage.yaml
index 4f3b03744..45060d416 100644
--- a/packages/i18n/src/locales/en/stage.yaml
+++ b/packages/i18n/src/locales/en/stage.yaml
@@ -34,5 +34,6 @@ profile-switcher:
no-profile: No Profile
no-profiles: No profiles yet
save-as-new: Save as New Profile
+ new-profile-name: Profile name
manage: Manage Profiles
waiting: Waiting
diff --git a/packages/i18n/src/locales/es/stage.yaml b/packages/i18n/src/locales/es/stage.yaml
index fbff45391..4ea5e72d8 100644
--- a/packages/i18n/src/locales/es/stage.yaml
+++ b/packages/i18n/src/locales/es/stage.yaml
@@ -34,5 +34,6 @@ profile-switcher:
no-profile: No Profile
no-profiles: No profiles yet
save-as-new: Save as New Profile
+ new-profile-name: Profile name
manage: Manage Profiles
waiting: Esperando...
diff --git a/packages/i18n/src/locales/fr/stage.yaml b/packages/i18n/src/locales/fr/stage.yaml
index 1c8c7135f..a1dfd1c88 100644
--- a/packages/i18n/src/locales/fr/stage.yaml
+++ b/packages/i18n/src/locales/fr/stage.yaml
@@ -34,5 +34,6 @@ profile-switcher:
no-profile: Aucun profil
no-profiles: Aucuns profils pour l'instant
save-as-new: Enregistrer comme Nouveau Profil
+ new-profile-name: Nom du profil
manage: Gérer les Profils
waiting: En attente
diff --git a/packages/i18n/src/locales/ja/stage.yaml b/packages/i18n/src/locales/ja/stage.yaml
index ca2818c50..040501d1c 100644
--- a/packages/i18n/src/locales/ja/stage.yaml
+++ b/packages/i18n/src/locales/ja/stage.yaml
@@ -34,5 +34,6 @@ profile-switcher:
no-profile: プロファイルがありません
no-profiles: まだプロファイルがありません
save-as-new: 新規プロファイルとして保存
+ new-profile-name: Profile name
manage: プロファイルを管理
waiting: 待機中
diff --git a/packages/i18n/src/locales/ko/stage.yaml b/packages/i18n/src/locales/ko/stage.yaml
index 9c536110b..57ac41f8b 100644
--- a/packages/i18n/src/locales/ko/stage.yaml
+++ b/packages/i18n/src/locales/ko/stage.yaml
@@ -34,5 +34,6 @@ profile-switcher:
no-profile: No Profile
no-profiles: No profiles yet
save-as-new: Save as New Profile
+ new-profile-name: Profile name
manage: Manage Profiles
waiting: 대기 중
diff --git a/packages/i18n/src/locales/ru/stage.yaml b/packages/i18n/src/locales/ru/stage.yaml
index 5ce29bf20..482824f74 100644
--- a/packages/i18n/src/locales/ru/stage.yaml
+++ b/packages/i18n/src/locales/ru/stage.yaml
@@ -34,5 +34,6 @@ profile-switcher:
no-profile: Профиль отсутствует
no-profiles: Нет профилей
save-as-new: Сохранить как Новый Профиль
+ new-profile-name: Profile name
manage: Управление профилями
waiting: Ожидание
diff --git a/packages/i18n/src/locales/vi/stage.yaml b/packages/i18n/src/locales/vi/stage.yaml
index ff61d0fd3..df1e9dfce 100644
--- a/packages/i18n/src/locales/vi/stage.yaml
+++ b/packages/i18n/src/locales/vi/stage.yaml
@@ -34,5 +34,6 @@ profile-switcher:
no-profile: No Profile
no-profiles: No profiles yet
save-as-new: Save as New Profile
+ new-profile-name: Profile name
manage: Manage Profiles
waiting: Đang chờ
diff --git a/packages/i18n/src/locales/zh-Hans/stage.yaml b/packages/i18n/src/locales/zh-Hans/stage.yaml
index 2874dae29..5af18684a 100644
--- a/packages/i18n/src/locales/zh-Hans/stage.yaml
+++ b/packages/i18n/src/locales/zh-Hans/stage.yaml
@@ -34,5 +34,6 @@ profile-switcher:
no-profile: 缺少角色
no-profiles: 还没有角色
save-as-new: 存为新角色
+ new-profile-name: 角色名称
manage: 管理角色卡
waiting: 等待中
diff --git a/packages/i18n/src/locales/zh-Hant/stage.yaml b/packages/i18n/src/locales/zh-Hant/stage.yaml
index 4eadaef21..8442dc4da 100644
--- a/packages/i18n/src/locales/zh-Hant/stage.yaml
+++ b/packages/i18n/src/locales/zh-Hant/stage.yaml
@@ -34,5 +34,6 @@ profile-switcher:
no-profile: No Profile
no-profiles: No profiles yet
save-as-new: Save as New Profile
+ new-profile-name: Profile name
manage: Manage Profiles
waiting: 等待中
diff --git a/packages/stage-layouts/src/components/Layouts/Header.vue b/packages/stage-layouts/src/components/Layouts/Header.vue
index 489601c20..8a51d6c45 100644
--- a/packages/stage-layouts/src/components/Layouts/Header.vue
+++ b/packages/stage-layouts/src/components/Layouts/Header.vue
@@ -17,7 +17,7 @@ function handleNavigation() {
diff --git a/packages/stage-ui/src/components/misc/index.ts b/packages/stage-ui/src/components/misc/index.ts
index 78a9b1204..a4843fc36 100644
--- a/packages/stage-ui/src/components/misc/index.ts
+++ b/packages/stage-ui/src/components/misc/index.ts
@@ -1,5 +1,6 @@
export { default as Alert } from './alert.vue'
export { default as ErrorContainer } from './error-container.vue'
export { default as ProfileSwitcherPopover } from './profile-switcher-popover.vue'
+export type { Props as ProfileSwitcherPopoverProps } from './profile-switcher-popover.vue'
export * from './steppers'
export { default as WIP } from './wip.vue'
diff --git a/packages/stage-ui/src/components/misc/profile-switcher-popover.vue b/packages/stage-ui/src/components/misc/profile-switcher-popover.vue
index 3f2952998..97d4eb733 100644
--- a/packages/stage-ui/src/components/misc/profile-switcher-popover.vue
+++ b/packages/stage-ui/src/components/misc/profile-switcher-popover.vue
@@ -1,12 +1,12 @@