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:
@@ -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 }
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user