feat(10-04): implement toast store, ToastContainer, mount in App.vue

- toast.js: reactive toasts array, show/dismiss with auto-dismiss via setTimeout
- ToastContainer.vue: Options API, Teleport to body, TransitionGroup, data-test attr
- type-to-class maps: accentClass/iconName/iconColorClass for success/error/warning/info
- App.vue: import and mount <ToastContainer /> after layout div
- all 10 tests pass; SettingsAccountTab and TotpEnrollment regressions green
This commit is contained in:
curo1305
2026-06-15 20:11:12 +02:00
parent 74fc41cefa
commit f92d98d067
3 changed files with 86 additions and 13 deletions
+11 -13
View File
@@ -1,20 +1,18 @@
/**
* Phase 7.1 STUB — Phase 10 (UX-10) fills in the full implementation.
*
* The signature `show(message, type, duration)` is locked and Phase 10 must
* honor it without modifying Phase 8 call sites.
*
* Default values match UI-SPEC.md:
* type = 'success' (NOT 'info')
* duration = 4000
*/
import { ref } from 'vue'
import { defineStore } from 'pinia'
export const useToastStore = defineStore('toast', () => {
// eslint-disable-next-line no-unused-vars
const toasts = ref([])
function show(message, type = 'success', duration = 4000) {
// No-op stub — Phase 10 implements rendering.
const id = Date.now() + Math.random()
toasts.value.push({ id, message, type, duration })
if (duration > 0) setTimeout(() => dismiss(id), duration)
}
return { show }
function dismiss(id) {
toasts.value = toasts.value.filter(t => t.id !== id)
}
return { toasts, show, dismiss }
})