vue-toast-kit 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1145 -0
  3. package/dist/composables/useToast.d.ts +28 -0
  4. package/dist/composables/useToastContext.d.ts +6 -0
  5. package/dist/composables/useToastState.d.ts +7 -0
  6. package/dist/core/GroupManager.d.ts +16 -0
  7. package/dist/core/ToastBuffer.d.ts +19 -0
  8. package/dist/core/ToastQueue.d.ts +55 -0
  9. package/dist/core/UndoTimer.d.ts +23 -0
  10. package/dist/core/types.d.ts +114 -0
  11. package/dist/index.d.ts +23 -0
  12. package/dist/module.d.ts +1 -0
  13. package/dist/nuxt/module.cjs +2 -0
  14. package/dist/nuxt/module.cjs.map +1 -0
  15. package/dist/nuxt/module.d.ts +1 -0
  16. package/dist/nuxt/module.js +34 -0
  17. package/dist/nuxt/module.js.map +1 -0
  18. package/dist/plugin.d.ts +6 -0
  19. package/dist/style.css +1 -0
  20. package/dist/testing.d.ts +14 -0
  21. package/dist/vue-toast-kit.cjs +2 -0
  22. package/dist/vue-toast-kit.cjs.map +1 -0
  23. package/dist/vue-toast-kit.d.ts +540 -0
  24. package/dist/vue-toast-kit.js +1000 -0
  25. package/dist/vue-toast-kit.js.map +1 -0
  26. package/package.json +89 -0
  27. package/src/components/Toast.vue +222 -0
  28. package/src/components/ToastActions.vue +34 -0
  29. package/src/components/ToastContainer.vue +257 -0
  30. package/src/components/ToastIcon.vue +53 -0
  31. package/src/components/ToastProgressBar.vue +18 -0
  32. package/src/composables/useToast.ts +152 -0
  33. package/src/composables/useToastContext.ts +63 -0
  34. package/src/composables/useToastState.ts +18 -0
  35. package/src/core/GroupManager.ts +105 -0
  36. package/src/core/ToastBuffer.ts +45 -0
  37. package/src/core/ToastQueue.ts +377 -0
  38. package/src/core/UndoTimer.ts +90 -0
  39. package/src/core/types.ts +142 -0
  40. package/src/env.d.ts +7 -0
  41. package/src/index.ts +51 -0
  42. package/src/nuxt/composables.ts +13 -0
  43. package/src/nuxt/module.ts +52 -0
  44. package/src/nuxt/plugin.ts +8 -0
  45. package/src/plugin.ts +18 -0
  46. package/src/styles/animations.css +106 -0
  47. package/src/styles/base.css +201 -0
  48. package/src/styles/themes/dark.css +30 -0
  49. package/src/styles/themes/light.css +30 -0
  50. package/src/styles/themes/system.css +32 -0
  51. package/src/styles/tokens.css +74 -0
  52. package/src/testing.ts +81 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vue-toast-kit.cjs","sources":["../src/core/types.ts","../src/core/GroupManager.ts","../src/core/UndoTimer.ts","../src/core/ToastQueue.ts","../src/core/ToastBuffer.ts","../src/composables/useToastContext.ts","../src/composables/useToast.ts","../src/composables/useToastState.ts","../src/components/ToastIcon.vue","../src/components/ToastProgressBar.vue","../src/components/ToastActions.vue","../src/components/Toast.vue","../src/components/ToastContainer.vue","../src/plugin.ts"],"sourcesContent":["import type { Component, VNode, Ref } from 'vue'\n\nexport type ToastType = 'info' | 'success' | 'warning' | 'error' | 'loading' | 'custom'\nexport type ToastPriority = 'critical' | 'high' | 'normal' | 'low'\nexport type ToastPosition =\n | 'top-left' | 'top-center' | 'top-right'\n | 'bottom-left' | 'bottom-center' | 'bottom-right'\n\nexport interface ToastAction {\n label: string\n onClick: () => void\n}\n\nexport interface ToastUndo {\n label?: string\n onUndo: () => void | Promise<void>\n duration?: number\n}\n\nexport interface ToastDesignTokens {\n colorBg?: string\n colorText?: string\n colorBorder?: string\n colorSuccess?: string\n colorError?: string\n colorWarning?: string\n colorInfo?: string\n colorLoading?: string\n fontFamily?: string\n fontSize?: string\n fontWeight?: string\n lineHeight?: string\n borderRadius?: string\n borderWidth?: string\n shadow?: string\n paddingX?: string\n paddingY?: string\n iconSize?: string\n progressHeight?: string\n maxWidth?: string\n minWidth?: string\n transitionDuration?: string\n transitionEasing?: string\n zIndex?: string\n}\n\nexport interface ToastOptions {\n id?: string\n type?: ToastType\n priority?: ToastPriority\n duration?: number\n position?: ToastPosition\n closable?: boolean\n groupKey?: string\n icon?: Component | string | false\n action?: ToastAction\n undo?: ToastUndo\n onClose?: () => void\n onAutoClose?: () => void\n pauseOnHover?: boolean\n pauseOnFocusLoss?: boolean\n swipeToDismiss?: boolean\n persist?: boolean\n component?: Component\n componentProps?: Record<string, unknown>\n ariaLive?: 'assertive' | 'polite'\n theme?: 'light' | 'dark' | 'system' | ToastDesignTokens\n}\n\nexport interface ToastItem {\n id: string\n message: string | VNode\n options: Required<Omit<ToastOptions, 'component' | 'componentProps' | 'icon' | 'action' | 'undo' | 'theme' | 'position'>> & {\n position?: ToastPosition\n component?: Component\n componentProps?: Record<string, unknown>\n icon?: Component | string | false\n action?: ToastAction\n undo?: ToastUndo\n theme?: 'light' | 'dark' | 'system' | ToastDesignTokens\n }\n createdAt: number\n remaining: Ref<number>\n isPaused: Ref<boolean>\n groupCount: Ref<number>\n isGrouped: Ref<boolean>\n pause(): void\n resume(): void\n dismiss(): void\n update(opts: Partial<ToastOptions>): void\n}\n\nexport interface PromiseToastMessages<T = unknown> {\n loading: string\n success: string | ((data: T) => string)\n error: string | ((err: unknown) => string)\n}\n\nexport interface ToastContext {\n queue: import('./ToastQueue').ToastQueue\n addToast(message: string | VNode, options?: ToastOptions): string\n dismiss(id?: string): void\n update(id: string, options: Partial<ToastOptions>): void\n isActive(id: string): boolean\n}\n\nexport interface GlobalToastOptions {\n position?: ToastPosition\n maxVisible?: number\n duration?: number\n theme?: 'light' | 'dark' | 'system'\n ignoreSSR?: boolean\n pauseOnHover?: boolean\n pauseOnFocusLoss?: boolean\n closable?: boolean\n /** Max toasts added within rateLimitWindowMs before extras are dropped. */\n rateLimit?: number\n /** Window in ms for rateLimit (default: 1000). */\n rateLimitWindowMs?: number\n /** Enable automatic localStorage persist/restore for toasts with persist:true. */\n persistStorage?: boolean\n}\n\nexport const PRIORITY_ORDER: Record<ToastPriority, number> = {\n critical: 3,\n high: 2,\n normal: 1,\n low: 0,\n}\n\nexport const DEFAULT_OPTIONS: Required<Omit<ToastOptions, 'id' | 'component' | 'componentProps' | 'icon' | 'action' | 'undo' | 'groupKey' | 'theme' | 'onClose' | 'onAutoClose' | 'ariaLive' | 'position'>> = {\n type: 'info',\n priority: 'normal',\n duration: 4000,\n closable: true,\n pauseOnHover: true,\n pauseOnFocusLoss: true,\n swipeToDismiss: true,\n persist: false,\n}\n\nexport const TOAST_CONTEXT_KEY = Symbol('vue-toast-kit-context')\n","import type { ToastItem } from './types'\n\nexport class GroupManager {\n private groups = new Map<string, string[]>()\n private expandedGroups = new Set<string>()\n\n private getItems: (ids: string[]) => ToastItem[]\n private hideItem: (id: string) => void\n private showItem: (id: string) => void\n\n constructor(\n getItems: (ids: string[]) => ToastItem[],\n hideItem: (id: string) => void,\n showItem: (id: string) => void,\n ) {\n this.getItems = getItems\n this.hideItem = hideItem\n this.showItem = showItem\n }\n\n add(id: string, groupKey: string): void {\n if (!this.groups.has(groupKey)) {\n this.groups.set(groupKey, [id])\n return\n }\n\n const ids = this.groups.get(groupKey)!\n ids.push(id)\n\n const [leaderId] = ids\n const leader = this.getItems([leaderId])[0]\n if (leader) {\n leader.groupCount.value = ids.length\n }\n\n if (!this.expandedGroups.has(groupKey)) {\n this.hideItem(id)\n }\n }\n\n remove(id: string, groupKey: string): void {\n const ids = this.groups.get(groupKey)\n if (!ids) return\n\n const idx = ids.indexOf(id)\n if (idx === -1) return\n\n ids.splice(idx, 1)\n\n if (ids.length === 0) {\n this.groups.delete(groupKey)\n this.expandedGroups.delete(groupKey)\n return\n }\n\n const [leaderId] = ids\n const leader = this.getItems([leaderId])[0]\n if (leader) {\n leader.groupCount.value = ids.length\n }\n\n if (idx === 0 && ids.length > 0) {\n this.showItem(ids[0])\n if (!this.expandedGroups.has(groupKey)) {\n for (let i = 1; i < ids.length; i++) {\n this.hideItem(ids[i])\n }\n }\n }\n }\n\n toggleExpand(groupKey: string): void {\n const ids = this.groups.get(groupKey)\n if (!ids) return\n\n if (this.expandedGroups.has(groupKey)) {\n this.expandedGroups.delete(groupKey)\n for (let i = 1; i < ids.length; i++) {\n this.hideItem(ids[i])\n }\n } else {\n this.expandedGroups.add(groupKey)\n for (const id of ids) {\n this.showItem(id)\n }\n }\n }\n\n isExpanded(groupKey: string): boolean {\n return this.expandedGroups.has(groupKey)\n }\n\n getGroupIds(groupKey: string): string[] {\n return this.groups.get(groupKey) ?? []\n }\n\n hasGroup(groupKey: string): boolean {\n return this.groups.has(groupKey)\n }\n\n clear(): void {\n this.groups.clear()\n this.expandedGroups.clear()\n }\n}\n","export class UndoTimer {\n private timerId: ReturnType<typeof setTimeout> | null = null\n private tickId: ReturnType<typeof setInterval> | null = null\n private elapsed = 0\n private startTime = 0\n private _remaining = 1\n private _isPaused = false\n\n private static readonly TICK_INTERVAL = 50\n\n readonly duration: number\n readonly onExpire: () => void\n readonly onTick?: (remaining: number) => void\n\n constructor(duration: number, onExpire: () => void, onTick?: (remaining: number) => void) {\n this.duration = duration\n this.onExpire = onExpire\n this.onTick = onTick\n }\n\n get remaining(): number {\n return this._remaining\n }\n\n get isPaused(): boolean {\n return this._isPaused\n }\n\n start(): void {\n this.elapsed = 0\n this._remaining = 1\n this.startTime = Date.now()\n this.scheduleExpiry(this.duration)\n if (this.onTick) this.startTick()\n }\n\n pause(): void {\n if (this._isPaused) return\n this._isPaused = true\n this.elapsed += Date.now() - this.startTime\n this.clearExpiry()\n this.clearTick()\n }\n\n resume(): void {\n if (!this._isPaused) return\n this._isPaused = false\n const remainingMs = this.duration - this.elapsed\n this.startTime = Date.now()\n this.scheduleExpiry(remainingMs)\n if (this.onTick) this.startTick()\n }\n\n destroy(): void {\n this.clearExpiry()\n this.clearTick()\n }\n\n private scheduleExpiry(delay: number): void {\n this.timerId = setTimeout(() => {\n this.clearTick()\n this._remaining = 0\n this.onTick?.(0)\n this.timerId = null\n this.onExpire()\n }, delay)\n }\n\n private clearExpiry(): void {\n if (this.timerId !== null) {\n clearTimeout(this.timerId)\n this.timerId = null\n }\n }\n\n private startTick(): void {\n this.tickId = setInterval(() => {\n const totalElapsed = this.elapsed + (Date.now() - this.startTime)\n this._remaining = Math.max(0, 1 - totalElapsed / this.duration)\n this.onTick?.(this._remaining)\n }, UndoTimer.TICK_INTERVAL)\n }\n\n private clearTick(): void {\n if (this.tickId !== null) {\n clearInterval(this.tickId)\n this.tickId = null\n }\n }\n}\n","import { ref, reactive, shallowReactive, type VNode } from 'vue'\nimport { GroupManager } from './GroupManager'\nimport { UndoTimer } from './UndoTimer'\nimport { PRIORITY_ORDER, DEFAULT_OPTIONS, type ToastItem, type ToastOptions, type ToastPosition } from './types'\n\nlet idCounter = 0\nfunction generateId(): string {\n return `vtk-${Date.now()}-${++idCounter}`\n}\n\nconst PERSIST_KEY = 'vtk-persist'\n\ntype EventListener<T extends unknown[]> = (...args: T) => void\n\nexport class ToastQueue {\n active = shallowReactive<ToastItem[]>([])\n pending = shallowReactive<ToastItem[]>([])\n\n private maxVisible: number\n private hiddenItems = reactive(new Set<string>())\n private timers = new Map<string, UndoTimer>()\n private groupManager: GroupManager\n\n private rateLimit: number\n private rateLimitWindowMs: number\n private recentAddTimes: number[] = []\n\n private persistStorage: boolean\n\n private addListeners = new Set<EventListener<[ToastItem]>>()\n private dismissListeners = new Set<EventListener<[string]>>()\n private updateListeners = new Set<EventListener<[string, Partial<ToastOptions>]>>()\n\n constructor(maxVisible = 5, options: { rateLimit?: number; rateLimitWindowMs?: number; persistStorage?: boolean } = {}) {\n this.maxVisible = maxVisible\n this.rateLimit = options.rateLimit ?? 0\n this.rateLimitWindowMs = options.rateLimitWindowMs ?? 1000\n this.persistStorage = options.persistStorage ?? false\n\n this.groupManager = new GroupManager(\n (ids) => [...this.active, ...this.pending].filter(t => ids.includes(t.id)),\n (id) => this.hiddenItems.add(id),\n (id) => this.hiddenItems.delete(id),\n )\n\n if (this.persistStorage) {\n this.restoreFromStorage()\n }\n }\n\n /** Subscribe to toast add events. Returns an unsubscribe function. */\n onAdd(fn: EventListener<[ToastItem]>): () => void {\n this.addListeners.add(fn)\n return () => this.addListeners.delete(fn)\n }\n\n /** Subscribe to toast dismiss events. Returns an unsubscribe function. */\n onDismiss(fn: EventListener<[string]>): () => void {\n this.dismissListeners.add(fn)\n return () => this.dismissListeners.delete(fn)\n }\n\n /** Subscribe to toast update events. Returns an unsubscribe function. */\n onUpdate(fn: EventListener<[string, Partial<ToastOptions>]>): () => void {\n this.updateListeners.add(fn)\n return () => this.updateListeners.delete(fn)\n }\n\n private emit<T extends unknown[]>(set: Set<EventListener<T>>, ...args: T): void {\n set.forEach(fn => fn(...args))\n }\n\n private isRateLimited(): boolean {\n if (!this.rateLimit) return false\n const now = Date.now()\n this.recentAddTimes = this.recentAddTimes.filter(t => now - t < this.rateLimitWindowMs)\n if (this.recentAddTimes.length >= this.rateLimit) return true\n this.recentAddTimes.push(now)\n return false\n }\n\n private restoreFromStorage(): void {\n if (typeof localStorage === 'undefined') return\n try {\n const raw = localStorage.getItem(PERSIST_KEY)\n if (!raw) return\n const items: Array<{ id: string; message: string; options: ToastOptions }> = JSON.parse(raw)\n for (const item of items) {\n this.add(item.message, { ...item.options, id: item.id })\n }\n } catch {\n localStorage.removeItem(PERSIST_KEY)\n }\n }\n\n private saveToStorage(item: ToastItem): void {\n if (typeof localStorage === 'undefined') return\n try {\n const raw = localStorage.getItem(PERSIST_KEY)\n const items: Array<{ id: string; message: string; options: ToastOptions }> = raw ? JSON.parse(raw) : []\n if (!items.find(i => i.id === item.id)) {\n items.push({ id: item.id, message: item.message as string, options: item.options })\n localStorage.setItem(PERSIST_KEY, JSON.stringify(items))\n }\n } catch { /* noop */ }\n }\n\n private removeFromStorage(id: string): void {\n if (typeof localStorage === 'undefined') return\n try {\n const raw = localStorage.getItem(PERSIST_KEY)\n if (!raw) return\n const items: Array<{ id: string }> = JSON.parse(raw)\n const filtered = items.filter(i => i.id !== id)\n if (filtered.length) {\n localStorage.setItem(PERSIST_KEY, JSON.stringify(filtered))\n } else {\n localStorage.removeItem(PERSIST_KEY)\n }\n } catch { /* noop */ }\n }\n\n get visibleActive(): ToastItem[] {\n return this.active.filter(t => !this.hiddenItems.has(t.id))\n }\n\n isHidden(id: string): boolean {\n return this.hiddenItems.has(id)\n }\n\n add(message: string | VNode, options: ToastOptions = {}): string {\n if (this.isRateLimited()) return ''\n\n const id = options.id ?? generateId()\n\n const existing = this.active.find(t => t.id === id)\n if (existing) {\n this.mergeOptions(existing, options)\n return id\n }\n\n const item = this.createItem(id, message, options)\n\n if (this.visibleActive.length < this.maxVisible) {\n this.active.push(item)\n this.startTimer(item)\n if (options.groupKey) this.groupManager.add(id, options.groupKey)\n if (this.persistStorage && item.options.persist) this.saveToStorage(item)\n this.emit(this.addListeners, item)\n return id\n }\n\n const priority = options.priority ?? 'normal'\n if (PRIORITY_ORDER[priority] > PRIORITY_ORDER['normal']) {\n const lowestIdx = this.findLowestPriorityIndex()\n if (lowestIdx !== -1) {\n const evicted = this.active[lowestIdx]\n if (PRIORITY_ORDER[priority] > PRIORITY_ORDER[evicted.options.priority]) {\n this.stopTimer(evicted.id)\n this.active.splice(lowestIdx, 1)\n this.pending.unshift(evicted)\n this.active.push(item)\n this.startTimer(item)\n if (options.groupKey) this.groupManager.add(id, options.groupKey)\n if (this.persistStorage && item.options.persist) this.saveToStorage(item)\n this.emit(this.addListeners, item)\n return id\n }\n }\n }\n\n this.pending.push(item)\n this.sortPending()\n if (options.groupKey) this.groupManager.add(id, options.groupKey)\n if (this.persistStorage && item.options.persist) this.saveToStorage(item)\n this.emit(this.addListeners, item)\n return id\n }\n\n remove(id: string): void {\n this.stopTimer(id)\n\n const activeIdx = this.active.findIndex(t => t.id === id)\n if (activeIdx !== -1) {\n const item = this.active[activeIdx]\n this.active.splice(activeIdx, 1)\n this.hiddenItems.delete(id)\n\n if (item.options.groupKey) this.groupManager.remove(id, item.options.groupKey)\n if (this.persistStorage) this.removeFromStorage(id)\n\n if (this.pending.length > 0) {\n const next = this.pending.shift()!\n this.active.push(next)\n this.startTimer(next)\n }\n return\n }\n\n const pendingIdx = this.pending.findIndex(t => t.id === id)\n if (pendingIdx !== -1) {\n const item = this.pending[pendingIdx]\n this.pending.splice(pendingIdx, 1)\n this.hiddenItems.delete(id)\n if (item.options.groupKey) this.groupManager.remove(id, item.options.groupKey)\n if (this.persistStorage) this.removeFromStorage(id)\n }\n }\n\n update(id: string, partial: Partial<ToastOptions>): void {\n const item = [...this.active, ...this.pending].find(t => t.id === id)\n if (!item) return\n this.mergeOptions(item, partial)\n this.emit(this.updateListeners, id, partial)\n }\n\n dismiss(id?: string): void {\n if (id === undefined) {\n const ids = [...this.active, ...this.pending].map(t => t.id)\n ids.forEach(i => this.remove(i))\n return\n }\n const item = [...this.active, ...this.pending].find(t => t.id === id)\n if (item) {\n item.options.onClose?.()\n this.remove(id)\n this.emit(this.dismissListeners, id)\n }\n }\n\n dismissAll(position?: ToastPosition): void {\n const targets = [...this.active, ...this.pending].filter(\n t => !position || t.options.position === position,\n )\n targets.forEach(t => {\n t.options.onClose?.()\n this.remove(t.id)\n this.emit(this.dismissListeners, t.id)\n })\n }\n\n isActive(id: string): boolean {\n return this.active.some(t => t.id === id)\n }\n\n pauseAll(): void {\n this.active.forEach(t => t.pause())\n }\n\n resumeAll(): void {\n this.active.forEach(t => t.resume())\n }\n\n setMaxVisible(n: number): void {\n this.maxVisible = n\n while (this.visibleActive.length < n && this.pending.length > 0) {\n const next = this.pending.shift()!\n this.active.push(next)\n this.startTimer(next)\n }\n }\n\n toggleGroupExpand(groupKey: string): void {\n this.groupManager.toggleExpand(groupKey)\n }\n\n isGroupExpanded(groupKey: string): boolean {\n return this.groupManager.isExpanded(groupKey)\n }\n\n destroy(): void {\n this.timers.forEach(t => t.destroy())\n this.timers.clear()\n this.groupManager.clear()\n this.active.splice(0)\n this.pending.splice(0)\n this.hiddenItems.clear()\n this.addListeners.clear()\n this.dismissListeners.clear()\n this.updateListeners.clear()\n }\n\n private createItem(id: string, message: string | VNode, options: ToastOptions): ToastItem {\n const remaining = ref(1)\n const isPaused = ref(false)\n const groupCount = ref(1)\n const isGrouped = ref(false)\n\n const mergedOptions = {\n ...DEFAULT_OPTIONS,\n ...options,\n type: options.type ?? 'info',\n priority: options.priority ?? 'normal',\n duration: options.duration ?? 4000,\n closable: options.closable ?? true,\n pauseOnHover: options.pauseOnHover ?? true,\n pauseOnFocusLoss: options.pauseOnFocusLoss ?? true,\n swipeToDismiss: options.swipeToDismiss ?? true,\n persist: options.persist ?? false,\n }\n\n const item: ToastItem = {\n id,\n message,\n options: mergedOptions as ToastItem['options'],\n createdAt: Date.now(),\n remaining,\n isPaused,\n groupCount,\n isGrouped,\n pause: () => {\n isPaused.value = true\n this.timers.get(id)?.pause()\n },\n resume: () => {\n isPaused.value = false\n this.timers.get(id)?.resume()\n },\n dismiss: () => this.dismiss(id),\n update: (opts) => this.update(id, opts),\n }\n\n return item\n }\n\n private startTimer(item: ToastItem): void {\n const duration = item.options.undo?.duration ?? item.options.duration\n if (!duration) return\n\n const timer = new UndoTimer(\n duration,\n () => {\n item.options.onAutoClose?.()\n this.remove(item.id)\n },\n (r) => {\n item.remaining.value = r\n },\n )\n this.timers.set(item.id, timer)\n timer.start()\n }\n\n private stopTimer(id: string): void {\n this.timers.get(id)?.destroy()\n this.timers.delete(id)\n }\n\n private mergeOptions(item: ToastItem, partial: Partial<ToastOptions>): void {\n Object.assign(item.options, partial)\n if ('message' in partial) {\n item.message = (partial as Record<string, unknown>).message as string | VNode\n }\n }\n\n private findLowestPriorityIndex(): number {\n let lowestIdx = -1\n let lowestPriority = 999\n this.active.forEach((t, i) => {\n const p = PRIORITY_ORDER[t.options.priority]\n if (p < lowestPriority) {\n lowestPriority = p\n lowestIdx = i\n }\n })\n return lowestIdx\n }\n\n private sortPending(): void {\n this.pending.sort((a, b) => {\n const pa = PRIORITY_ORDER[a.options.priority]\n const pb = PRIORITY_ORDER[b.options.priority]\n if (pb !== pa) return pb - pa\n return a.createdAt - b.createdAt\n })\n }\n}\r\n","import type { VNode } from 'vue'\nimport type { ToastOptions } from './types'\n\ninterface BufferedToast {\n message: string | VNode\n options: ToastOptions\n}\n\nexport const isServer = typeof window === 'undefined'\n\nexport class ToastBuffer {\n private buffer: BufferedToast[] = []\n private flushed = false\n private flushCallbacks: Array<(items: BufferedToast[]) => void> = []\n\n push(message: string | VNode, options: ToastOptions): void {\n if (this.flushed) return\n this.buffer.push({ message, options })\n }\n\n onFlush(cb: (items: BufferedToast[]) => void): void {\n this.flushCallbacks.push(cb)\n }\n\n flush(): void {\n if (this.flushed) return\n this.flushed = true\n const items = [...this.buffer]\n this.buffer = []\n for (const cb of this.flushCallbacks) {\n cb(items)\n }\n this.flushCallbacks = []\n }\n\n isFlushed(): boolean {\n return this.flushed\n }\n\n get size(): number {\n return this.buffer.length\n }\n}\n\nexport const globalBuffer = new ToastBuffer()\n","import { inject, type App } from 'vue'\nimport { ToastQueue } from '../core/ToastQueue'\nimport { isServer, globalBuffer } from '../core/ToastBuffer'\nimport { TOAST_CONTEXT_KEY, type ToastOptions, type ToastContext, type GlobalToastOptions } from '../core/types'\nimport type { VNode } from 'vue'\n\nfunction buildContext(queue: ToastQueue): ToastContext {\n return {\n queue,\n addToast(message: string | VNode, options: ToastOptions = {}): string {\n if (isServer) {\n const id = options.id ?? `vtk-ssr-${Date.now()}`\n globalBuffer.push(message, { ...options, id })\n return id\n }\n return queue.add(message, options)\n },\n dismiss(id?: string): void {\n queue.dismiss(id)\n },\n update(id: string, options: Partial<ToastOptions>): void {\n queue.update(id, options)\n },\n isActive(id: string): boolean {\n return queue.isActive(id)\n },\n }\n}\n\nlet globalContext: ToastContext | null = null\n\nexport function getOrCreateGlobalContext(opts?: GlobalToastOptions): ToastContext {\n if (!globalContext) {\n const queue = new ToastQueue(opts?.maxVisible ?? 5, {\n rateLimit: opts?.rateLimit,\n rateLimitWindowMs: opts?.rateLimitWindowMs,\n persistStorage: opts?.persistStorage,\n })\n globalContext = buildContext(queue)\n }\n return globalContext\n}\n\nexport function createToastContext(opts?: GlobalToastOptions): ToastContext {\n const queue = new ToastQueue(opts?.maxVisible ?? 5, {\n rateLimit: opts?.rateLimit,\n rateLimitWindowMs: opts?.rateLimitWindowMs,\n persistStorage: opts?.persistStorage,\n })\n return buildContext(queue)\n}\n\nexport function useToastContext(): ToastContext {\n const injected = inject<ToastContext>(TOAST_CONTEXT_KEY, null as unknown as ToastContext)\n if (injected) return injected\n return getOrCreateGlobalContext()\n}\n\nexport function installContext(app: App, opts?: GlobalToastOptions): ToastContext {\n const ctx = getOrCreateGlobalContext(opts)\n app.provide(TOAST_CONTEXT_KEY, ctx)\n return ctx\n}\n","import { type Component, type VNode } from 'vue'\nimport { useToastContext, getOrCreateGlobalContext } from './useToastContext'\nimport { UndoTimer } from '../core/UndoTimer'\nimport type { ToastContext, ToastOptions, PromiseToastMessages, ToastPosition } from '../core/types'\nimport type { ToastQueue } from '../core/ToastQueue'\n\nfunction restartTimer(queue: ToastQueue, id: string, duration: number): void {\n const q = queue as unknown as { timers: Map<string, UndoTimer> }\n q.timers.get(id)?.destroy()\n q.timers.delete(id)\n\n const item = queue.active.find(t => t.id === id)\n if (!item || !duration) return\n\n const timer = new UndoTimer(\n duration,\n () => {\n item.options.onAutoClose?.()\n queue.remove(id)\n },\n (r: number) => { item.remaining.value = r },\n )\n q.timers.set(id, timer)\n timer.start()\n}\n\nfunction buildToastApi(ctx: ToastContext) {\n const q = ctx.queue\n\n /** Show an info toast. Returns the toast id. */\n function toast(message: string, options?: ToastOptions): string {\n return ctx.addToast(message, { type: 'info', ...options })\n }\n\n /** Show a success toast. */\n toast.success = (message: string, options?: ToastOptions): string =>\n ctx.addToast(message, { type: 'success', ...options })\n\n /** Show an error toast (default priority: high). */\n toast.error = (message: string, options?: ToastOptions): string =>\n ctx.addToast(message, { type: 'error', priority: 'high', ...options })\n\n /** Show a warning toast. */\n toast.warning = (message: string, options?: ToastOptions): string =>\n ctx.addToast(message, { type: 'warning', ...options })\n\n /** Show an info toast (alias for the default call). */\n toast.info = (message: string, options?: ToastOptions): string =>\n ctx.addToast(message, { type: 'info', ...options })\n\n /** Show a sticky loading toast. Returns the id to update later. */\n toast.loading = (message: string, options?: ToastOptions): string =>\n ctx.addToast(message, { type: 'loading', duration: 0, closable: false, ...options })\n\n /** Show a toast with a fully custom component. */\n toast.custom = (component: Component, options?: ToastOptions): string =>\n ctx.addToast('', { type: 'custom', component, duration: 0, ...options })\n\n /** Dismiss one or all toasts. */\n toast.dismiss = (id?: string): void => ctx.dismiss(id)\n\n /** Update options (and optionally the message) of an existing toast. */\n toast.update = (id: string, partial: Partial<ToastOptions> & { message?: string | VNode }): void => {\n const item = q.active.find(t => t.id === id)\n if (item && partial.message !== undefined) {\n item.message = partial.message\n }\n ctx.update(id, partial)\n }\n\n /** Update only the message text without touching options. */\n toast.updateMessage = (id: string, message: string | VNode): void => {\n const item = q.active.find(t => t.id === id)\n if (item) item.message = message\n }\n\n /** Returns true if the toast with the given id is currently active. */\n toast.isActive = (id: string): boolean => ctx.isActive(id)\n\n /**\n * Show a loading toast, then update it to success or error when the promise settles.\n * Returns the original promise so it can be awaited or chained.\n */\n toast.promise = async <T>(\n promise: Promise<T>,\n messages: PromiseToastMessages<T>,\n options?: ToastOptions,\n ): Promise<T> => {\n const id = toast.loading(messages.loading, options)\n\n try {\n const data = await promise\n const msg = typeof messages.success === 'function' ? messages.success(data) : messages.success\n const item = q.active.find(t => t.id === id)\n if (item) {\n item.message = msg\n item.options.type = 'success'\n item.options.closable = true\n item.options.duration = 3000\n restartTimer(q, id, 3000)\n }\n return data\n } catch (err: unknown) {\n const msg = typeof messages.error === 'function' ? messages.error(err) : messages.error\n const item = q.active.find(t => t.id === id)\n if (item) {\n item.message = msg\n item.options.type = 'error'\n item.options.closable = true\n item.options.duration = 5000\n restartTimer(q, id, 5000)\n }\n throw err\n }\n }\n\n /** Show an undo toast with a countdown. Call `options.undo.onUndo` if the user taps Undo. */\n toast.undo = (message: string, options: ToastOptions & { undo: NonNullable<ToastOptions['undo']> }): string => {\n return ctx.addToast(message, {\n type: 'info',\n duration: options.undo.duration ?? 5000,\n closable: false,\n ...options,\n })\n }\n\n /** Dismiss all toasts, optionally filtered by position. */\n toast.dismissAll = (position?: ToastPosition): void => q.dismissAll(position)\n /** Pause all active toast timers. */\n toast.pauseAll = (): void => q.pauseAll()\n /** Resume all active toast timers. */\n toast.resumeAll = (): void => q.resumeAll()\n\n return toast\n}\n\nexport type ToastApi = ReturnType<typeof buildToastApi>\n\nexport function useToast(context?: ToastContext): ToastApi {\n if (context) return buildToastApi(context)\n\n // Inside component — try injected context\n try {\n const ctx = useToastContext()\n return buildToastApi(ctx)\n } catch {\n return buildToastApi(getOrCreateGlobalContext())\n }\n}\n\n// Global singleton for use outside components (Pinia stores, axios interceptors, etc.)\nexport const toast: ToastApi = buildToastApi(getOrCreateGlobalContext())\r\n","import { computed } from 'vue'\nimport { useToastContext } from './useToastContext'\nimport type { ToastContext, ToastItem } from '../core/types'\n\nexport function useToastState(context?: ToastContext) {\n const ctx = context ?? useToastContext()\n const queue = ctx.queue\n\n const active = computed<ToastItem[]>(() => queue.active.filter(t => !queue.isHidden(t.id)))\n const pending = computed<ToastItem[]>(() => [...queue.pending])\n const count = computed(() => active.value.length)\n\n function has(id: string): boolean {\n return ctx.isActive(id)\n }\n\n return { active, pending, count, has }\n}\n","<script setup lang=\"ts\">\nimport { computed, type Component } from 'vue'\nimport type { ToastType } from '../core/types'\n\nconst props = defineProps<{\n type: ToastType\n icon?: Component | string | false\n}>()\n\nconst isComponent = computed(() =>\n props.icon && typeof props.icon === 'object',\n)\n\nconst isString = computed(() =>\n props.icon && typeof props.icon === 'string',\n)\n\nconst showDefault = computed(() => props.icon !== false && !props.icon)\n</script>\n\n<template>\n <span :class=\"['vtk-icon', `vtk-icon--${type}`]\" aria-hidden=\"true\">\n <!-- Custom component -->\n <component :is=\"icon\" v-if=\"isComponent\" />\n\n <!-- String (emoji or text) -->\n <span v-else-if=\"isString\">{{ icon }}</span>\n\n <!-- Loading spinner -->\n <span v-else-if=\"type === 'loading'\" class=\"vtk-spinner\" />\n\n <!-- Default SVG icons -->\n <template v-else-if=\"showDefault\">\n <!-- success -->\n <svg v-if=\"type === 'success'\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path fill-rule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z\" clip-rule=\"evenodd\" />\n </svg>\n <!-- error -->\n <svg v-else-if=\"type === 'error'\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path fill-rule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zM8.28 7.22a.75.75 0 00-1.06 1.06L8.94 10l-1.72 1.72a.75.75 0 101.06 1.06L10 11.06l1.72 1.72a.75.75 0 101.06-1.06L11.06 10l1.72-1.72a.75.75 0 00-1.06-1.06L10 8.94 8.28 7.22z\" clip-rule=\"evenodd\" />\n </svg>\n <!-- warning -->\n <svg v-else-if=\"type === 'warning'\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path fill-rule=\"evenodd\" d=\"M8.485 2.495c.673-1.167 2.357-1.167 3.03 0l6.28 10.875c.673 1.167-.17 2.625-1.516 2.625H3.72c-1.347 0-2.189-1.458-1.515-2.625L8.485 2.495zM10 5a.75.75 0 01.75.75v3.5a.75.75 0 01-1.5 0v-3.5A.75.75 0 0110 5zm0 9a1 1 0 100-2 1 1 0 000 2z\" clip-rule=\"evenodd\" />\n </svg>\n <!-- info -->\n <svg v-else-if=\"type === 'info'\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path fill-rule=\"evenodd\" d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a.75.75 0 000 1.5h.253a.25.25 0 01.244.304l-.459 2.066A1.75 1.75 0 0010.747 15H11a.75.75 0 000-1.5h-.253a.25.25 0 01-.244-.304l.459-2.066A1.75 1.75 0 009.253 9H9z\" clip-rule=\"evenodd\" />\n </svg>\n <!-- custom — no default icon -->\n </template>\n </span>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\nconst props = defineProps<{\n remaining: number // 0–1\n}>()\n\nconst scaleX = computed(() => props.remaining)\n</script>\n\n<template>\n <div class=\"vtk-progress\" aria-hidden=\"true\">\n <div\n class=\"vtk-progress__bar\"\n :style=\"{ transform: `scaleX(${scaleX})` }\"\n />\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport type { ToastItem } from '../core/types'\n\nconst props = defineProps<{\n toast: ToastItem\n onDismiss: (id: string) => void\n}>()\n\nfunction handleUndo() {\n props.toast.options.undo?.onUndo()\n props.onDismiss(props.toast.id)\n}\n</script>\n\n<template>\n <div class=\"vtk-actions\">\n <button\n v-if=\"toast.options.action\"\n class=\"vtk-btn vtk-btn--action\"\n type=\"button\"\n @click=\"toast.options.action.onClick()\"\n >\n {{ toast.options.action.label }}\n </button>\n <button\n v-if=\"toast.options.undo\"\n class=\"vtk-btn vtk-btn--undo\"\n type=\"button\"\n @click=\"handleUndo\"\n >\n {{ toast.options.undo.label ?? 'Undo' }}\n </button>\n </div>\n</template>\r\n","<script setup lang=\"ts\">\nimport { computed, onMounted, onUnmounted, ref } from 'vue'\nimport type { ToastItem } from '../core/types'\nimport ToastIcon from './ToastIcon.vue'\nimport ToastProgressBar from './ToastProgressBar.vue'\nimport ToastActions from './ToastActions.vue'\n\nconst props = defineProps<{\n toast: ToastItem\n onDismiss: (id: string) => void\n onGroupToggle?: (groupKey: string) => void\n}>()\n\nconst el = ref<HTMLElement | null>(null)\n\n// Focus return: restore focus to the element that was active before this toast appeared\nlet focusReturnTarget: HTMLElement | null = null\n\nonMounted(() => {\n focusReturnTarget = document.activeElement as HTMLElement | null\n})\n\nfunction dismissWithFocusReturn(id: string) {\n props.onDismiss(id)\n if (focusReturnTarget && typeof focusReturnTarget.focus === 'function') {\n focusReturnTarget.focus()\n }\n}\n\n// Swipe-to-dismiss\nconst swipeX = ref(0)\nconst isSwiping = ref(false)\nlet touchStartX = 0\n\nfunction onTouchStart(e: TouchEvent) {\n if (!props.toast.options.swipeToDismiss) return\n touchStartX = e.touches[0].clientX\n isSwiping.value = true\n}\n\nfunction onTouchMove(e: TouchEvent) {\n if (!isSwiping.value) return\n swipeX.value = e.touches[0].clientX - touchStartX\n}\n\nfunction onTouchEnd() {\n if (!isSwiping.value) return\n isSwiping.value = false\n const threshold = (el.value?.offsetWidth ?? 280) * 0.4\n if (Math.abs(swipeX.value) > threshold) {\n props.onDismiss(props.toast.id)\n } else {\n swipeX.value = 0\n }\n}\n\n// Hover pause\nfunction onMouseEnter() {\n if (props.toast.options.pauseOnHover) props.toast.pause()\n}\nfunction onMouseLeave() {\n if (props.toast.options.pauseOnHover) props.toast.resume()\n}\n\n// Focus loss pause\nfunction onVisibilityChange() {\n if (!props.toast.options.pauseOnFocusLoss) return\n if (document.hidden) {\n props.toast.pause()\n } else {\n props.toast.resume()\n }\n}\n\nonMounted(() => {\n document.addEventListener('visibilitychange', onVisibilityChange)\n})\nonUnmounted(() => {\n document.removeEventListener('visibilitychange', onVisibilityChange)\n})\n\n// ARIA\nconst role = computed(() => {\n const t = props.toast.options.type\n return t === 'error' || t === 'warning' || props.toast.options.priority === 'critical'\n ? 'alert'\n : 'status'\n})\n\nconst ariaLive = computed(() => {\n if (props.toast.options.ariaLive) return props.toast.options.ariaLive\n return props.toast.options.priority === 'critical' ? 'assertive' : 'polite'\n})\n\nconst swipeStyle = computed(() => {\n if (!swipeX.value) return {}\n const opacity = Math.max(0, 1 - Math.abs(swipeX.value) / 200)\n return {\n transform: `translateX(${swipeX.value}px)`,\n opacity,\n transition: isSwiping.value ? 'none' : undefined,\n }\n})\n\nconst hasUndo = computed(() => !!props.toast.options.undo)\nconst hasAction = computed(() => !!props.toast.options.action)\nconst showClose = computed(() => props.toast.options.closable)\nconst showProgress = computed(() =>\n props.toast.options.duration > 0 && !props.toast.isPaused.value,\n)\nconst isGrouped = computed(() => props.toast.groupCount.value > 1)\n\nfunction handleGroupToggle() {\n if (props.toast.options.groupKey) {\n props.onGroupToggle?.(props.toast.options.groupKey)\n }\n}\n\nfunction onKeydown(e: KeyboardEvent) {\n if (e.key === 'Escape' && showClose.value) {\n e.stopPropagation()\n dismissWithFocusReturn(props.toast.id)\n }\n}\n</script>\n\n<template>\n <div\n ref=\"el\"\n :class=\"[\n 'vtk-toast',\n `vtk-toast--${toast.options.type}`,\n toast.options.theme && typeof toast.options.theme === 'string' ? `vtk-theme-${toast.options.theme}` : '',\n ]\"\n :role=\"role\"\n :aria-live=\"ariaLive\"\n :aria-atomic=\"true\"\n :tabindex=\"showClose || hasAction || hasUndo ? 0 : undefined\"\n :style=\"swipeStyle\"\n @mouseenter=\"onMouseEnter\"\n @mouseleave=\"onMouseLeave\"\n @touchstart.passive=\"onTouchStart\"\n @touchmove.passive=\"onTouchMove\"\n @touchend=\"onTouchEnd\"\n @keydown=\"onKeydown\"\n >\n <!-- Rich content: full replacement via component -->\n <component\n v-if=\"toast.options.component\"\n :is=\"toast.options.component\"\n v-bind=\"toast.options.componentProps\"\n :toast=\"toast\"\n :dismiss=\"() => onDismiss(toast.id)\"\n />\n\n <template v-else>\n <!-- Icon slot -->\n <slot name=\"toast-icon\" :toast=\"toast\">\n <ToastIcon\n v-if=\"toast.options.icon !== false\"\n :type=\"toast.options.type\"\n :icon=\"toast.options.icon\"\n />\n </slot>\n\n <!-- Content slot -->\n <slot name=\"toast-content\" :toast=\"toast\">\n <div class=\"vtk-content\">\n <div class=\"vtk-message\">\n <component :is=\"'span'\" v-if=\"typeof toast.message !== 'string'\">\n <component :is=\"toast.message\" />\n </component>\n <template v-else>{{ toast.message }}</template>\n </div>\n\n <!-- Action slot -->\n <slot name=\"toast-action\" :toast=\"toast\">\n <ToastActions\n v-if=\"hasAction || hasUndo\"\n :toast=\"toast\"\n :on-dismiss=\"onDismiss\"\n />\n </slot>\n </div>\n </slot>\n\n <!-- Group counter -->\n <span\n v-if=\"isGrouped\"\n class=\"vtk-group-count\"\n role=\"button\"\n :aria-label=\"`Show all (${toast.groupCount.value})`\"\n @click=\"handleGroupToggle\"\n >\n +{{ toast.groupCount.value - 1 }}\n </span>\n\n <!-- Close button slot -->\n <slot name=\"toast-close\" :toast=\"toast\" :dismiss=\"dismissWithFocusReturn\">\n <button\n v-if=\"showClose\"\n class=\"vtk-btn vtk-btn--close\"\n type=\"button\"\n aria-label=\"Close\"\n @click=\"dismissWithFocusReturn(toast.id)\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"currentColor\">\n <path d=\"M1.4 1.4a1 1 0 011.42 0L7 5.59l4.18-4.19a1 1 0 111.42 1.42L8.41 7l4.19 4.18a1 1 0 01-1.42 1.42L7 8.41l-4.18 4.19A1 1 0 011.4 12.6L5.59 7 1.4 2.82a1 1 0 010-1.42z\"/>\n </svg>\n </button>\n </slot>\n </template>\n\n <!-- Progress bar / undo slot -->\n <slot name=\"toast-undo\" :toast=\"toast\" :remaining=\"toast.remaining.value\">\n <ToastProgressBar\n v-if=\"showProgress || hasUndo\"\n :remaining=\"toast.remaining.value\"\n />\n </slot>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, onMounted, ref, watch } from 'vue'\nimport { Teleport, TransitionGroup } from 'vue'\nimport Toast from './Toast.vue'\nimport { useToastContext } from '../composables/useToastContext'\nimport { globalBuffer } from '../core/ToastBuffer'\nimport { PRIORITY_ORDER } from '../core/types'\nimport type { ToastContext, ToastPosition, ToastDesignTokens, ToastItem } from '../core/types'\n\nconst ALL_POSITIONS: ToastPosition[] = [\n 'top-left', 'top-center', 'top-right',\n 'bottom-left', 'bottom-center', 'bottom-right',\n]\n\nconst props = withDefaults(defineProps<{\n position?: ToastPosition\n maxVisible?: number\n gap?: number\n offsetX?: number\n offsetY?: number\n zIndex?: number\n expand?: boolean\n teleportTo?: string\n context?: ToastContext\n theme?: 'light' | 'dark' | 'system' | ToastDesignTokens\n stackMode?: boolean\n}>(), {\n position: 'bottom-right',\n maxVisible: 5,\n gap: 8,\n offsetX: 16,\n offsetY: 16,\n zIndex: 9999,\n expand: false,\n teleportTo: 'body',\n stackMode: false,\n})\n\n// Resolve context once during setup — inject() must not be called inside computed()\nconst ctx = props.context ?? useToastContext()\nconst queue = ctx.queue\n\n// Sync maxVisible with the queue\nwatch(() => props.maxVisible, (n) => queue.setMaxVisible(n), { immediate: true })\n\nconst isHovered = ref(false)\n\n// Все видимые тосты\nconst allToasts = computed(() => queue.active.filter(t => !queue.isHidden(t.id)))\n\n// Тосты по позиции: тост без position попадает в props.position; critical — первыми\nfunction toastsForPosition(pos: ToastPosition): ToastItem[] {\n return allToasts.value\n .filter(t => (t.options.position ?? props.position) === pos)\n .sort((a, b) => PRIORITY_ORDER[b.options.priority] - PRIORITY_ORDER[a.options.priority])\n}\n\n// Stack mode: depth = расстояние от \"переднего\" тоста\nfunction stackDepth(index: number, total: number, pos: ToastPosition): number {\n return pos.startsWith('bottom') ? (total - 1 - index) : index\n}\n\n// Inline-стиль обёртки тоста в stack mode\nfunction stackWrapStyle(index: number, total: number, pos: ToastPosition): Record<string, string> {\n if (!props.stackMode || isHovered.value) return {}\n const depth = stackDepth(index, total, pos)\n if (depth === 0) return { 'z-index': '10' }\n if (depth > 2) return { display: 'none' }\n\n const isBottom = pos.startsWith('bottom')\n const scale = Math.max(0.88, 1 - depth * 0.06)\n const offset = depth * 8\n const opacity = Math.max(0.5, 1 - depth * 0.2)\n const edgeProp = isBottom ? 'bottom' : 'top'\n\n return {\n position: 'absolute',\n width: '100%',\n [edgeProp]: '0',\n transform: `translateY(${isBottom ? offset : -offset}px) scale(${scale})`,\n opacity: String(opacity),\n 'pointer-events': 'none',\n 'z-index': String(10 - depth),\n transition: 'transform 300ms ease, opacity 300ms ease',\n }\n}\n\n// CSS-классы контейнера для конкретной позиции\nfunction containerClass(pos: ToastPosition) {\n const toasts = toastsForPosition(pos)\n return [\n 'vtk-container',\n `vtk-container--${pos}`,\n props.theme && typeof props.theme === 'string' ? `vtk-theme-${props.theme}` : '',\n props.stackMode && toasts.length > 1 ? 'vtk-container--stack' : '',\n props.stackMode && isHovered.value ? 'vtk-container--stack-expanded' : '',\n ]\n}\n\n// Inline CSS-переменные из объекта дизайн-токенов (одинаковы для всех позиций)\nconst containerStyle = computed(() => {\n const style: Record<string, string> = {\n '--vtk-z-index': String(props.zIndex),\n '--vtk-gap': `${props.gap}px`,\n '--vtk-container-offset-x': `${props.offsetX}px`,\n '--vtk-container-offset-y': `${props.offsetY}px`,\n }\n\n if (props.theme && typeof props.theme === 'object') {\n const map: Record<keyof ToastDesignTokens, string> = {\n colorBg: '--vtk-color-bg',\n colorText: '--vtk-color-text',\n colorBorder: '--vtk-color-border',\n colorSuccess: '--vtk-color-success',\n colorError: '--vtk-color-error',\n colorWarning: '--vtk-color-warning',\n colorInfo: '--vtk-color-info',\n colorLoading: '--vtk-color-loading',\n fontFamily: '--vtk-font-family',\n fontSize: '--vtk-font-size',\n fontWeight: '--vtk-font-weight',\n lineHeight: '--vtk-line-height',\n borderRadius: '--vtk-border-radius',\n borderWidth: '--vtk-border-width',\n shadow: '--vtk-shadow',\n paddingX: '--vtk-padding-x',\n paddingY: '--vtk-padding-y',\n iconSize: '--vtk-icon-size',\n progressHeight: '--vtk-progress-height',\n maxWidth: '--vtk-max-width',\n minWidth: '--vtk-min-width',\n transitionDuration: '--vtk-transition-duration',\n transitionEasing: '--vtk-transition-easing',\n zIndex: '--vtk-z-index',\n }\n for (const [key, cssVar] of Object.entries(map)) {\n const val = (props.theme as ToastDesignTokens)[key as keyof ToastDesignTokens]\n if (val) style[cssVar] = val\n }\n }\n\n return style\n})\n\n// Event handlers\nfunction handleDismiss(id: string) {\n ctx.dismiss(id)\n}\n\nfunction handleGroupToggle(groupKey: string) {\n queue.toggleGroupExpand(groupKey)\n}\n\nfunction onContainerEnter() {\n isHovered.value = true\n queue.pauseAll()\n}\nfunction onContainerLeave() {\n isHovered.value = false\n queue.resumeAll()\n}\n\n// SSR buffer flush on mount\nonMounted(() => {\n setTimeout(() => {\n globalBuffer.onFlush((items) => {\n for (const item of items) {\n ctx.addToast(item.message, item.options)\n }\n })\n globalBuffer.flush()\n }, 100)\n})\n\ndefineSlots<{\n toast(props: { toast: ToastItem; dismiss: (id: string) => void }): void\n 'toast-icon'(props: { toast: ToastItem }): void\n 'toast-content'(props: { toast: ToastItem }): void\n 'toast-action'(props: { toast: ToastItem }): void\n 'toast-close'(props: { toast: ToastItem; dismiss: (id: string) => void }): void\n 'toast-undo'(props: { toast: ToastItem; remaining: number }): void\n}>()\n</script>\n\n<template>\n <Teleport :to=\"teleportTo\">\n <!--\n Все 6 позиций рендерятся всегда — даже пустыми.\n Это гарантирует, что TransitionGroup всегда в DOM,\n и enter/leave-анимации корректно срабатывают даже для одного тоста.\n -->\n <div\n v-for=\"pos in ALL_POSITIONS\"\n :key=\"pos\"\n :class=\"containerClass(pos)\"\n :style=\"containerStyle\"\n :role=\"toastsForPosition(pos).length ? 'region' : undefined\"\n :aria-label=\"toastsForPosition(pos).length ? 'Notifications' : undefined\"\n @mouseenter=\"onContainerEnter\"\n @mouseleave=\"onContainerLeave\"\n >\n <TransitionGroup :name=\"`vtk-slide-${pos}`\" tag=\"div\" class=\"vtk-container__list\">\n <div\n v-for=\"(t, i) in toastsForPosition(pos)\"\n :key=\"t.id\"\n class=\"vtk-toast-wrap\"\n :style=\"stackWrapStyle(i, toastsForPosition(pos).length, pos)\"\n >\n <slot\n v-if=\"$slots.toast\"\n name=\"toast\"\n :toast=\"t\"\n :dismiss=\"handleDismiss\"\n />\n <Toast\n v-else\n :toast=\"t\"\n :on-dismiss=\"handleDismiss\"\n :on-group-toggle=\"handleGroupToggle\"\n >\n <template v-if=\"$slots['toast-icon']\" #toast-icon=\"slotProps\">\n <slot name=\"toast-icon\" v-bind=\"slotProps\" />\n </template>\n <template v-if=\"$slots['toast-content']\" #toast-content=\"slotProps\">\n <slot name=\"toast-content\" v-bind=\"slotProps\" />\n </template>\n <template v-if=\"$slots['toast-action']\" #toast-action=\"slotProps\">\n <slot name=\"toast-action\" v-bind=\"slotProps\" />\n </template>\n <template v-if=\"$slots['toast-close']\" #toast-close=\"slotProps\">\n <slot name=\"toast-close\" v-bind=\"slotProps\" />\n </template>\n <template v-if=\"$slots['toast-undo']\" #toast-undo=\"slotProps\">\n <slot name=\"toast-undo\" v-bind=\"slotProps\" />\n </template>\n </Toast>\n </div>\n </TransitionGroup>\n </div>\n </Teleport>\n</template>\n\n<style scoped>\n.vtk-container__list {\n display: contents;\n}\n\n/* In stack mode, list becomes a positioning context */\n.vtk-container--stack .vtk-container__list {\n display: block;\n position: relative;\n}\n\n.vtk-container--stack .vtk-toast-wrap {\n display: block;\n}\n</style>\n","import type { App, Plugin } from 'vue'\nimport { installContext } from './composables/useToastContext'\nimport ToastContainer from './components/ToastContainer.vue'\nimport type { GlobalToastOptions } from './core/types'\n\nexport interface VueToastPluginOptions extends GlobalToastOptions {\n registerComponent?: boolean\n}\n\nexport const VueToastPlugin: Plugin<VueToastPluginOptions | void> = {\n install(app: App, options?: VueToastPluginOptions) {\n installContext(app, options ?? {})\n\n if (options?.registerComponent !== false) {\n app.component('ToastContainer', ToastContainer)\n }\n },\n}\n"],"names":["PRIORITY_ORDER","DEFAULT_OPTIONS","TOAST_CONTEXT_KEY","GroupManager","getItems","hideItem","showItem","__publicField","id","groupKey","ids","leaderId","leader","idx","i","_UndoTimer","duration","onExpire","onTick","remainingMs","delay","_a","totalElapsed","UndoTimer","idCounter","generateId","PERSIST_KEY","ToastQueue","maxVisible","options","shallowReactive","reactive","t","fn","set","args","now","raw","items","item","filtered","message","existing","priority","lowestIdx","evicted","activeIdx","next","pendingIdx","partial","_b","position","n","remaining","ref","isPaused","groupCount","isGrouped","mergedOptions","opts","timer","lowestPriority","p","a","b","pa","pb","isServer","ToastBuffer","cb","globalBuffer","buildContext","queue","globalContext","getOrCreateGlobalContext","createToastContext","useToastContext","injected","inject","installContext","app","ctx","restartTimer","q","r","buildToastApi","toast","component","promise","messages","data","msg","err","useToast","context","useToastState","active","computed","pending","count","has","props","__props","isComponent","isString","showDefault","_createElementBlock","_openBlock","_createBlock","_resolveDynamicComponent","_hoisted_2","_Fragment","_hoisted_3","_cache","_createElementVNode","_hoisted_4","_hoisted_5","_hoisted_6","scaleX","_hoisted_1","handleUndo","_toDisplayString","el","focusReturnTarget","onMounted","dismissWithFocusReturn","swipeX","isSwiping","touchStartX","onTouchStart","e","onTouchMove","onTouchEnd","threshold","onMouseEnter","onMouseLeave","onVisibilityChange","onUnmounted","role","ariaLive","swipeStyle","opacity","hasUndo","hasAction","showClose","showProgress","handleGroupToggle","onKeydown","_normalizeClass","_mergeProps","_renderSlot","_ctx","ToastIcon","_createTextVNode","ToastActions","$event","ToastProgressBar","ALL_POSITIONS","watch","isHovered","allToasts","toastsForPosition","pos","stackDepth","index","total","stackWrapStyle","depth","isBottom","scale","offset","containerClass","toasts","containerStyle","style","map","key","cssVar","val","handleDismiss","onContainerEnter","onContainerLeave","_Teleport","_renderList","_createVNode","_TransitionGroup","_normalizeStyle","$slots","Toast","_withCtx","slotProps","VueToastPlugin","ToastContainer"],"mappings":"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"}