toastory 0.1.0 → 0.1.2

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 (131) hide show
  1. package/README.md +10 -10
  2. package/dist/angular.cjs +2 -2
  3. package/dist/angular.cjs.map +1 -1
  4. package/dist/angular.d.cts +11 -4
  5. package/dist/angular.d.ts +11 -4
  6. package/dist/angular.js +2 -2
  7. package/dist/angular.js.map +1 -1
  8. package/dist/core.cjs +1 -1
  9. package/dist/core.cjs.map +1 -1
  10. package/dist/core.d.cts +6 -6
  11. package/dist/core.d.ts +6 -6
  12. package/dist/core.js +1 -1
  13. package/dist/core.js.map +1 -1
  14. package/dist/{dialog-B08CfkHj.d.ts → dialog-Buemfm7I.d.ts} +1 -1
  15. package/dist/{dialog-B9Z_67Ry.d.ts → dialog-fziFV6J0.d.cts} +1 -1
  16. package/dist/index.cjs +3 -3
  17. package/dist/index.cjs.map +1 -1
  18. package/dist/index.d.cts +4 -4
  19. package/dist/index.d.ts +4 -4
  20. package/dist/index.js +3 -3
  21. package/dist/index.js.map +1 -1
  22. package/dist/native.cjs +1 -1
  23. package/dist/native.cjs.map +1 -1
  24. package/dist/native.js +1 -1
  25. package/dist/native.js.map +1 -1
  26. package/dist/react.cjs +2 -2
  27. package/dist/react.cjs.map +1 -1
  28. package/dist/react.d.cts +10 -7
  29. package/dist/react.d.ts +10 -7
  30. package/dist/react.js +2 -2
  31. package/dist/react.js.map +1 -1
  32. package/dist/svelte.cjs +2 -2
  33. package/dist/svelte.cjs.map +1 -1
  34. package/dist/svelte.d.cts +2 -2
  35. package/dist/svelte.d.ts +2 -2
  36. package/dist/svelte.js +2 -2
  37. package/dist/svelte.js.map +1 -1
  38. package/dist/themes/_base.css +1 -1
  39. package/dist/themes/_base.dialog.css +1 -1
  40. package/dist/themes/_base.toast.css +1 -1
  41. package/dist/themes/all.css +1 -0
  42. package/dist/themes/aurora.css +1 -1
  43. package/dist/themes/aurora.dialog.css +1 -1
  44. package/dist/themes/aurora.toast.css +1 -1
  45. package/dist/themes/basic.css +1 -1
  46. package/dist/themes/basic.dialog.css +1 -1
  47. package/dist/themes/basic.toast.css +1 -1
  48. package/dist/themes/brutal.css +1 -1
  49. package/dist/themes/brutal.dialog.css +1 -1
  50. package/dist/themes/brutal.toast.css +1 -1
  51. package/dist/themes/classic-bar.css +1 -1
  52. package/dist/themes/classic-bar.dialog.css +1 -1
  53. package/dist/themes/classic-bar.toast.css +1 -1
  54. package/dist/themes/classic-stack.css +1 -1
  55. package/dist/themes/classic-stack.dialog.css +1 -1
  56. package/dist/themes/classic-stack.toast.css +1 -1
  57. package/dist/themes/dialogs.css +1 -1
  58. package/dist/themes/dialogs.dialog.css +1 -1
  59. package/dist/themes/dialogs.toast.css +1 -1
  60. package/dist/themes/essentials.css +1 -1
  61. package/dist/themes/essentials.dialog.css +1 -1
  62. package/dist/themes/essentials.toast.css +1 -1
  63. package/dist/themes/flat.css +1 -1
  64. package/dist/themes/flat.dialog.css +1 -1
  65. package/dist/themes/flat.toast.css +1 -1
  66. package/dist/themes/gradient-strip.css +1 -1
  67. package/dist/themes/gradient-strip.dialog.css +1 -1
  68. package/dist/themes/gradient-strip.toast.css +1 -1
  69. package/dist/themes/gradient.css +1 -1
  70. package/dist/themes/gradient.dialog.css +1 -1
  71. package/dist/themes/gradient.toast.css +1 -1
  72. package/dist/themes/ios-glass.css +1 -1
  73. package/dist/themes/ios-glass.dialog.css +1 -1
  74. package/dist/themes/ios-glass.toast.css +1 -1
  75. package/dist/themes/liquid-glass.css +1 -1
  76. package/dist/themes/liquid-glass.dialog.css +1 -1
  77. package/dist/themes/liquid-glass.toast.css +1 -1
  78. package/dist/themes/material.css +1 -1
  79. package/dist/themes/material.dialog.css +1 -1
  80. package/dist/themes/material.toast.css +1 -1
  81. package/dist/themes/minimal.css +1 -1
  82. package/dist/themes/minimal.dialog.css +1 -1
  83. package/dist/themes/minimal.toast.css +1 -1
  84. package/dist/themes/neon.css +1 -1
  85. package/dist/themes/neon.dialog.css +1 -1
  86. package/dist/themes/neon.toast.css +1 -1
  87. package/dist/themes/outline.css +1 -1
  88. package/dist/themes/outline.dialog.css +1 -1
  89. package/dist/themes/outline.toast.css +1 -1
  90. package/dist/themes/pastel.css +1 -1
  91. package/dist/themes/pastel.dialog.css +1 -1
  92. package/dist/themes/pastel.toast.css +1 -1
  93. package/dist/themes/pill.css +1 -1
  94. package/dist/themes/pill.dialog.css +1 -1
  95. package/dist/themes/pill.toast.css +1 -1
  96. package/dist/themes/ripple.css +1 -1
  97. package/dist/themes/ripple.dialog.css +1 -1
  98. package/dist/themes/ripple.toast.css +1 -1
  99. package/dist/themes/showcase.css +1 -1
  100. package/dist/themes/showcase.dialog.css +1 -1
  101. package/dist/themes/showcase.toast.css +1 -1
  102. package/dist/themes/sweet.css +1 -1
  103. package/dist/themes/sweet.dialog.css +1 -1
  104. package/dist/themes/sweet.toast.css +1 -1
  105. package/dist/{toast-api-C3NL4zla.d.cts → toast-api-D6WYDtUy.d.cts} +5 -3
  106. package/dist/{toast-api-C3NL4zla.d.ts → toast-api-D6WYDtUy.d.ts} +5 -3
  107. package/dist/{ui-BRRU9D4b.d.ts → ui-Cs1AjRNH.d.ts} +2 -2
  108. package/dist/{ui-30FIsmS5.d.cts → ui-D5FwMD8Y.d.cts} +2 -2
  109. package/dist/vue.cjs +2 -2
  110. package/dist/vue.cjs.map +1 -1
  111. package/dist/vue.d.cts +130 -13
  112. package/dist/vue.d.ts +130 -13
  113. package/dist/vue.js +2 -2
  114. package/dist/vue.js.map +1 -1
  115. package/package.json +6 -6
  116. package/dist/dialog-BDLOS-N9.d.cts +0 -56
  117. package/dist/dialog-BwJckkzq.d.cts +0 -56
  118. package/dist/dialog-DWyGuoVI.d.cts +0 -56
  119. package/dist/dialog-D_JZtadd.d.cts +0 -56
  120. package/dist/dialog-GDDN2Jkl.d.ts +0 -56
  121. package/dist/dialog-zlFXWvsk.d.ts +0 -56
  122. package/dist/toast-api-DksXya0f.d.cts +0 -704
  123. package/dist/toast-api-DksXya0f.d.ts +0 -704
  124. package/dist/toast-api-TqsztUqW.d.cts +0 -704
  125. package/dist/toast-api-TqsztUqW.d.ts +0 -704
  126. package/dist/ui-Bk3-iiT3.d.cts +0 -97
  127. package/dist/ui-BwjuXLKj.d.ts +0 -97
  128. package/dist/ui-CVyKIiVQ.d.ts +0 -97
  129. package/dist/ui-Cma14-bn.d.cts +0 -97
  130. package/dist/ui-ImWgPMgJ.d.ts +0 -97
  131. package/dist/ui-u9GYcdbJ.d.cts +0 -97
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/clock.ts","../src/core/ids.ts","../src/core/config.ts","../src/core/timer.ts","../src/core/types-registry.ts","../src/core/toast-manager.ts","../src/core/promise.ts","../src/core/toast-api.ts","../src/core/index.ts","../src/native/index.tsx"],"names":["defaultClock","fn","ms","id","counter","nextId","prefix","normalizeId","DEFAULT_CONFIG","createConfigStore","initial","current","stripUndefined","listeners","emit","listener","patch","value","out","k","createTimer","duration","onDone","clock","totalDuration","remainingMs","startedAt","cancelTimeout","cancelInterval","started","done","pauseReasons","tickListeners","isLive","notifyTick","rem","getRemaining","frac","err","stopTimers","arm","reason","count","live","callback","pol","color","ass","BUILT_IN_TYPES","createTypeRegistry","custom","name","definition","USER_REASONS","safeCall","args","MANUAL_PAUSE","BUILTIN_DEFAULTS","createToastManager","options","config","now","types","entries","order","snapshot","history","regionOf","record","build","opts","previous","cfg","type","merged","rawDuration","urgent","stamp","remainingOf","entry","dedupeKeyOf","t","d","promote","counts","key","used","isImportant","finalize","flushOpened","dismissEntry","exit","makeEntry","input","restartTimer","store","existing","other","resetTimer","rest","next","changed","rebuilt","positionChanged","list","e","nextPausedBy","toPatch","message","errorText","error","runPromiseToast","messages","promise","requestedId","base","loadingPatch","settle","raw","payload","desc","createToastApi","make","api","renderer","createToastEngine","nativeEngine","getNativeEngine","triggerHaptic","Haptics","createNativeToastApi","baseToast","wrap","msg","nativeApi","toast","configure","resetNativeEngine","ui","GlazeProvider","children","jsx","Fragment","Toaster","props","toastsList","setToastsList","useState","useEffect","engine","unsub","visibleToasts","useMemo","position","posStyle","item","jsxs","act","i","useNativeToast"],"mappings":"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","file":"native.js","sourcesContent":["/**\n * Injectable clock and scheduler interface.\n * Abstracts time and timers so tests and headless engines can run deterministically.\n */\nexport interface Clock {\n /** Returns the current timestamp in milliseconds. */\n now(): number;\n /**\n * Schedules a callback after `ms` milliseconds.\n * @returns A cancellation function.\n */\n setTimeout(fn: () => void, ms: number): () => void;\n /**\n * Schedules a recurring callback every `ms` milliseconds.\n * @returns A cancellation function.\n */\n setInterval(fn: () => void, ms: number): () => void;\n}\n\n/** Default system clock using standard global timer functions. */\nexport const defaultClock: Clock = {\n now: () => Date.now(),\n setTimeout: (fn, ms) => {\n const id = setTimeout(fn, ms);\n return () => clearTimeout(id);\n },\n setInterval: (fn, ms) => {\n const id = setInterval(fn, ms);\n return () => clearInterval(id);\n },\n};\n","import type { ToastId } from './types';\n\nlet counter = 0;\n\n/**\n * Returns a collision-safe, incremental unique identifier.\n * @param prefix Optional prefix for the id (default: 'gk').\n */\nexport function nextId(prefix = 'gk'): string {\n return `${prefix}-${++counter}`;\n}\n\n/**\n * Normalizes an optional user-provided id, generating an incremental id if omitted.\n * @param id User-supplied id or undefined.\n * @param prefix Prefix used when generating an id.\n */\nexport function normalizeId(id: ToastId | undefined, prefix = 'gk'): ToastId {\n return id !== undefined && id !== '' ? id : nextId(prefix);\n}\n\n/**\n * Resets the internal counter. Useful for deterministic test execution.\n */\nexport function resetIdCounter(): void {\n counter = 0;\n}\n","import type { GlazeConfig, Listener, Unsubscribe } from './types';\n\n/** Library default configuration. */\nexport const DEFAULT_CONFIG: Readonly<GlazeConfig> = Object.freeze({\n theme: 'ios-glass',\n mode: 'auto',\n position: 'top-right',\n duration: 4000,\n maxVisible: 8,\n gap: 12,\n stack: true,\n dir: 'auto',\n hotkey: 'alt+t',\n pauseOn: ['hover', 'focus', 'hidden'],\n shadow: true,\n closeButton: false,\n richColors: false,\n invert: false,\n swipe: true,\n dragThreshold: 45,\n progress: false,\n closeOnClick: false,\n exitDuration: 250,\n historyLimit: 100,\n regionLabel: 'Notifications',\n closeLabel: 'Close notification',\n startPaused: false,\n newestOnTop: true,\n dedupeWindow: 500,\n container: undefined,\n} satisfies GlazeConfig);\n\n/** Observable configuration container holding immutable snapshots. */\nexport interface ConfigStore {\n /** Returns the current immutable configuration snapshot. */\n get(): Readonly<GlazeConfig>;\n /** Merges a partial configuration and notifies subscribers. Returns the updated snapshot. */\n set(patch: Partial<GlazeConfig>): Readonly<GlazeConfig>;\n /** Restores library defaults. */\n reset(): void;\n /** Subscribes to configuration changes. */\n subscribe(listener: Listener): Unsubscribe;\n}\n\n/**\n * Resolves an option according to precedence:\n * Call option > Theme default > Global config > Library default.\n */\nexport const resolvePrecedence = <T>(\n callVal: T | undefined,\n themeVal: T | undefined,\n globalVal: T | undefined,\n defaultVal: T,\n): T => callVal ?? themeVal ?? globalVal ?? defaultVal;\n\n/** Creates an isolated, immutable configuration store. */\nexport function createConfigStore(initial: Partial<GlazeConfig> = {}): ConfigStore {\n let current: Readonly<GlazeConfig> = Object.freeze({\n ...DEFAULT_CONFIG,\n ...stripUndefined(initial),\n });\n const listeners = new Set<Listener>();\n\n const emit = (): void => {\n listeners.forEach((listener) => listener());\n };\n\n return {\n get: () => current,\n set(patch) {\n current = Object.freeze({ ...current, ...stripUndefined(patch) });\n emit();\n return current;\n },\n reset() {\n current = DEFAULT_CONFIG;\n emit();\n },\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n };\n}\n\nfunction stripUndefined<T extends object>(value: T): Partial<T> {\n const out: Partial<T> = {};\n for (const k in value) if (value[k] !== undefined) out[k] = value[k];\n return out;\n}\n","import type { Clock } from './clock';\nimport { defaultClock } from './clock';\n\nexport interface PausableTimer {\n /** Starts or resumes the countdown. No effect when already running or finished. */\n start(): void;\n /**\n * Pauses the timer for a named reason (reference-counted).\n * @param reason The pause trigger identifier, e.g. 'hover', 'focus', 'hidden', 'manual'.\n */\n pause(reason?: string): void;\n /**\n * Resumes the timer for a named reason (decrements reference count).\n * Restarts the countdown when all pause reasons are cleared.\n */\n resume(reason?: string): void;\n /** Adds milliseconds to the remaining countdown (or subtracts if negative). */\n add(ms: number): void;\n /** Resets the countdown duration and restarts if previously active. */\n reset(ms?: number): void;\n /** Permanently cancels and tears down the timer. */\n cancel(): void;\n /** Current milliseconds remaining on the countdown. */\n remaining(): number;\n /** Current milliseconds elapsed on the countdown. */\n elapsed(): number;\n /** Whether the countdown is actively ticking. */\n isRunning(): boolean;\n /** Whether the countdown is held by one or more pause reasons. */\n isPaused(): boolean;\n /** List of all currently active pause reason names. */\n pausedReasons(): string[];\n /** Clears all pause reasons and resumes if started. */\n clearReasons(): void;\n /** Registers a progress tick listener called while ticking. */\n onTick(callback: (remaining: number, fraction: number) => void): () => void;\n}\n\n/**\n * Creates a pausable countdown timer with reference-counted pause reasons.\n *\n * @param duration Total countdown duration in milliseconds.\n * @param onDone Callback fired when countdown reaches zero.\n * @param clock Injectable clock/scheduler (defaults to defaultClock).\n */\nexport function createTimer(\n duration: number,\n onDone: () => void,\n clock: Clock = defaultClock,\n): PausableTimer {\n let totalDuration = duration;\n let remainingMs = duration;\n let startedAt = 0;\n let cancelTimeout: (() => void) | undefined;\n let cancelInterval: (() => void) | undefined;\n let started = false;\n let done = false;\n\n // Reference-counted pause reasons: reason -> count\n const pauseReasons = new Map<string, number>();\n const tickListeners = new Set<(remaining: number, fraction: number) => void>();\n\n const isLive = (): boolean => Number.isFinite(remainingMs) && remainingMs > 0;\n\n const notifyTick = (): void => {\n if (tickListeners.size === 0) return;\n const rem = getRemaining();\n const frac = totalDuration > 0 ? Math.max(0, Math.min(1, rem / totalDuration)) : 0;\n for (const listener of tickListeners) {\n try {\n listener(rem, frac);\n } catch (err) {\n console.error(err);\n }\n }\n };\n\n const getRemaining = (): number => {\n if (done) return 0;\n if (started && pauseReasons.size === 0) {\n return Math.max(0, remainingMs - (clock.now() - startedAt));\n }\n return remainingMs;\n };\n\n const stopTimers = (): void => {\n cancelTimeout?.();\n cancelTimeout = undefined;\n cancelInterval?.();\n cancelInterval = undefined;\n };\n\n const arm = (): void => {\n stopTimers();\n if (!isLive() || pauseReasons.size > 0 || done) return;\n\n startedAt = clock.now();\n cancelTimeout = clock.setTimeout(() => {\n stopTimers();\n remainingMs = 0;\n done = true;\n started = false;\n notifyTick();\n onDone();\n }, remainingMs);\n\n if (tickListeners.size > 0) {\n cancelInterval = clock.setInterval(() => {\n notifyTick();\n }, 50);\n }\n };\n\n const pauseTimer = (reason = 'manual'): void => {\n if (done) return;\n pauseReasons.set(reason, (pauseReasons.get(reason) ?? 0) + 1);\n\n if (started && pauseReasons.size === 1) {\n remainingMs = Math.max(0, remainingMs - (clock.now() - startedAt));\n stopTimers();\n notifyTick();\n }\n };\n\n const resumeTimer = (reason = 'manual'): void => {\n if (done) return;\n const count = pauseReasons.get(reason);\n if (!count) return;\n\n if (count <= 1) pauseReasons.delete(reason);\n else pauseReasons.set(reason, count - 1);\n\n if (started && pauseReasons.size === 0 && isLive()) {\n arm();\n notifyTick();\n }\n };\n\n return {\n start() {\n if (done || !isLive()) return;\n started = true;\n pauseReasons.clear();\n arm();\n notifyTick();\n },\n pause: pauseTimer,\n resume: resumeTimer,\n clearReasons() {\n pauseReasons.clear();\n if (started && isLive()) arm();\n },\n add(ms: number) {\n if (done || !Number.isFinite(remainingMs)) return;\n const live = started && pauseReasons.size === 0;\n remainingMs = Math.max(\n 1,\n (live ? remainingMs - (clock.now() - startedAt) : remainingMs) + ms,\n );\n totalDuration = Math.max(totalDuration, remainingMs);\n if (live) arm();\n notifyTick();\n },\n reset(ms?: number) {\n done = false;\n remainingMs = totalDuration = ms !== undefined ? ms : totalDuration;\n if (started && pauseReasons.size === 0) {\n if (isLive()) arm();\n else stopTimers();\n }\n notifyTick();\n },\n cancel() {\n stopTimers();\n started = false;\n done = true;\n remainingMs = 0;\n },\n remaining: getRemaining,\n elapsed() {\n return Math.max(0, totalDuration - getRemaining());\n },\n isRunning: () => started && !done && !pauseReasons.size && isLive(),\n isPaused: () => pauseReasons.size > 0,\n pausedReasons: () => [...pauseReasons.keys()],\n onTick(callback) {\n tickListeners.add(callback);\n if (started && pauseReasons.size === 0 && !cancelInterval) {\n cancelInterval = clock.setInterval(notifyTick, 50);\n }\n return () => {\n tickListeners.delete(callback);\n if (tickListeners.size === 0 && cancelInterval) {\n cancelInterval();\n cancelInterval = undefined;\n }\n };\n },\n };\n}\n","import type { ToastTypeDefinition } from './types';\n\n/** Registry of custom and built-in toast types. */\nexport interface TypeRegistry {\n /**\n * Registers or replaces a toast type.\n * @param name Non-empty type name.\n * @param definition Defaults, icon, color tokens, default duration, ariaLive.\n */\n add(name: string, definition?: ToastTypeDefinition): void;\n /** Removes a type. Returns whether it existed. */\n remove(name: string): boolean;\n /** Looks a type up. */\n get(name: string): ToastTypeDefinition | undefined;\n /** Lists registered custom type names. */\n list(): string[];\n}\n\nconst pol = (color: string) => ({ color: `var(--gk-${color})`, ariaLive: 'polite' as const });\nconst ass = (color: string) => ({ color: `var(--gk-${color})`, ariaLive: 'assertive' as const });\n\nconst BUILT_IN_TYPES: Record<string, ToastTypeDefinition> = {\n success: pol('success'),\n error: ass('error'),\n warning: ass('warning'),\n info: pol('info'),\n loading: { ...pol('info'), defaults: { duration: 0, dismissible: false } },\n message: pol('fg'),\n};\n\n/** Creates a type registry. */\nexport function createTypeRegistry(): TypeRegistry {\n const custom = new Map<string, ToastTypeDefinition>();\n\n return {\n add(name, definition = {}) {\n if (typeof name !== 'string' || name.trim() === '') {\n throw new TypeError('toastory: toast type name must be a non-empty string');\n }\n custom.set(name.trim(), definition);\n },\n remove: (name) => custom.delete(name),\n get: (name) => custom.get(name) ?? BUILT_IN_TYPES[name],\n list: () => [...custom.keys()],\n };\n}\n","import type { Clock } from './clock';\nimport { defaultClock } from './clock';\nimport type { ConfigStore } from './config';\nimport { createConfigStore } from './config';\nimport { normalizeId } from './ids';\nimport { createTimer } from './timer';\nimport type { PausableTimer } from './timer';\nimport { createTypeRegistry } from './types-registry';\nimport type { TypeRegistry } from './types-registry';\nimport type {\n CloseReason,\n Listener,\n ToastCustomRenderer,\n ToastId,\n ToastOptions,\n ToastPatch,\n ToastRecord,\n Unsubscribe,\n} from './types';\n\n/** Reasons that originate from a person and are blocked on non-dismissible toasts. */\nconst USER_REASONS: ReadonlySet<CloseReason> = new Set<CloseReason>(['user', 'swipe', 'click']);\n\nconst safeCall = <A extends unknown[]>(\n fn: ((...args: A) => void) | undefined,\n ...args: A\n): void => {\n try {\n fn?.(...args);\n } catch (err) {\n console.error(err);\n }\n};\n\n/** Pause reason used by `startPaused`. */\nexport const MANUAL_PAUSE = 'manual';\n\n/** Options for creating a toast manager / store. */\nexport interface ToastManagerOptions {\n config?: ConfigStore;\n clock?: Clock;\n now?: () => number;\n types?: TypeRegistry;\n}\n\nexport type ToastStoreOptions = ToastManagerOptions;\n\n/** Input for adding a toast. */\nexport interface AddToastInput extends ToastOptions {\n custom?: ToastCustomRenderer;\n}\n\ninterface Entry {\n opts: ToastOptions;\n custom: ToastCustomRenderer | undefined;\n record: ToastRecord;\n timer: PausableTimer;\n dedupeKey: string | undefined;\n exitHandle: (() => void) | undefined;\n reason: CloseReason | undefined;\n openedFired: boolean;\n closedFired: boolean;\n dismissFired: boolean;\n autoCloseFired: boolean;\n}\n\nconst BUILTIN_DEFAULTS: Readonly<Record<string, ToastOptions>> = {\n loading: { duration: 0 },\n};\n\n/** State container for toasts. Pure logic: no DOM, no framework. */\nexport interface ToastManager {\n add(input: AddToastInput): ToastId;\n update(id: ToastId, patch: ToastPatch): boolean;\n dismiss(id?: ToastId, reason?: CloseReason): void;\n dismissAll(reason?: CloseReason): void;\n pause(id: ToastId | undefined, reason: string): void;\n resume(id: ToastId | undefined, reason: string): void;\n extend(id: ToastId, ms: number): void;\n getRemaining(id: ToastId): number;\n getToasts(): readonly ToastRecord[];\n getHistory(): readonly ToastRecord[];\n clear(): void;\n clearHistory(): void;\n subscribe(listener: Listener): Unsubscribe;\n readonly config: ConfigStore;\n readonly types: TypeRegistry;\n}\n\nexport type ToastStore = ToastManager;\n\nexport function createToastManager(options: ToastManagerOptions = {}): ToastManager {\n const config = options.config ?? createConfigStore();\n const clock = options.clock ?? defaultClock;\n const now = options.now ?? (() => clock.now());\n const types = options.types ?? createTypeRegistry();\n\n const entries = new Map<ToastId, Entry>();\n let order: ToastId[] = [];\n let snapshot: readonly ToastRecord[] = [];\n let history: readonly ToastRecord[] = [];\n const listeners = new Set<Listener>();\n\n const emit = (): void => {\n snapshot = order.map((id) => entries.get(id)?.record).filter(Boolean) as ToastRecord[];\n listeners.forEach((listener) => listener());\n };\n\n const regionOf = (record: ToastRecord): string => `${record.container ?? ''}|${record.position}`;\n\n const build = (\n id: ToastId,\n opts: ToastOptions,\n previous: ToastRecord | undefined,\n custom: ToastCustomRenderer | undefined,\n ): ToastRecord => {\n const cfg = config.get();\n const type = opts.type ?? 'default';\n const merged: ToastOptions = {\n ...BUILTIN_DEFAULTS[type],\n ...types.get(type)?.defaults,\n ...opts,\n };\n const rawDuration = merged.duration ?? cfg.duration;\n const duration = Number.isFinite(rawDuration) && rawDuration > 0 ? rawDuration : 0;\n const urgent = merged.important === true || type === 'error';\n const stamp = now();\n\n const record: ToastRecord = {\n ...merged,\n id,\n type,\n duration,\n position: merged.position ?? cfg.position,\n ariaLive: merged.ariaLive ?? (urgent ? 'assertive' : 'polite'),\n role: merged.role ?? (urgent ? 'alert' : 'status'),\n createdAt: previous?.createdAt ?? stamp,\n updatedAt: stamp,\n revision: (previous?.revision ?? -1) + 1,\n timerEpoch: previous?.timerEpoch ?? 0,\n count: previous?.count ?? 1,\n visible: previous?.visible ?? false,\n dismissed: false,\n pausedBy: previous?.pausedBy ?? (cfg.startPaused ? [MANUAL_PAUSE] : []),\n remaining: previous?.remaining ?? (duration === 0 ? Infinity : duration),\n custom,\n };\n return record;\n };\n\n const remainingOf = (entry: Entry): number => {\n return entry.record.duration === 0 ? Infinity : entry.timer.remaining();\n };\n\n const dedupeKeyOf = (opts: ToastOptions): string | undefined => {\n if (opts.dedupe === false) return undefined;\n if (typeof opts.dedupe === 'string') return opts.dedupe;\n const t = typeof opts.title === 'string' ? opts.title : '';\n const d = typeof opts.description === 'string' ? opts.description : '';\n return t || d ? `${opts.type ?? 'default'}|${t}|${d}` : undefined;\n };\n\n const promote = (): void => {\n const cfg = config.get();\n const counts = new Map<string, number>();\n for (const id of order) {\n const entry = entries.get(id);\n if (!entry || entry.record.dismissed) continue;\n const key = regionOf(entry.record);\n const used = counts.get(key) ?? 0;\n const isImportant = entry.record.important === true;\n if (used < cfg.maxVisible || isImportant) {\n if (!entry.record.visible) {\n entry.record = { ...entry.record, visible: true };\n if (!entry.record.pausedBy.length && entry.record.duration > 0) {\n entry.timer.start();\n }\n }\n if (!isImportant) counts.set(key, used + 1);\n } else if (entry.record.visible) {\n entry.record = { ...entry.record, visible: false };\n entry.timer.pause();\n }\n }\n };\n\n const finalize = (entry: Entry): void => {\n entry.exitHandle?.();\n entry.timer.cancel();\n entries.delete(entry.record.id);\n order = order.filter((id) => id !== entry.record.id);\n history = [{ ...entry.record, dismissed: true }, ...history].slice(\n 0,\n config.get().historyLimit,\n );\n promote();\n flushOpened();\n emit();\n if (!entry.closedFired) {\n entry.closedFired = true;\n safeCall(entry.record.onClose, entry.record, entry.reason ?? 'api');\n }\n };\n\n const dismissEntry = (entry: Entry, reason: CloseReason): void => {\n if (entry.record.dismissed) return;\n if (entry.record.dismissible === false && USER_REASONS.has(reason)) return;\n entry.reason = reason;\n entry.record = {\n ...entry.record,\n dismissed: true,\n remaining: 0,\n revision: entry.record.revision + 1,\n };\n entry.timer.cancel();\n\n if (!entry.dismissFired && reason !== 'auto') {\n entry.dismissFired = true;\n safeCall(entry.record.onDismiss, entry.record, reason);\n }\n\n promote();\n flushOpened();\n emit();\n\n const exit = config.get().exitDuration;\n if (exit <= 0 || !entry.record.visible) {\n finalize(entry);\n } else {\n entry.exitHandle = clock.setTimeout(() => finalize(entry), exit);\n }\n };\n\n const makeEntry = (id: ToastId, input: AddToastInput): Entry => {\n const { custom, ...opts } = input;\n const record = build(id, opts, undefined, custom);\n const entry: Entry = {\n opts,\n custom,\n record,\n timer: undefined as unknown as PausableTimer,\n dedupeKey: dedupeKeyOf(opts),\n exitHandle: undefined,\n reason: undefined,\n openedFired: false,\n closedFired: false,\n dismissFired: false,\n autoCloseFired: false,\n };\n entry.timer = createTimer(\n record.duration,\n () => {\n if (!entry.autoCloseFired) {\n entry.autoCloseFired = true;\n safeCall(entry.record.onAutoClose, entry.record);\n }\n dismissEntry(entry, 'auto');\n },\n clock,\n );\n if (record.pausedBy.length) entry.timer.pause();\n return entry;\n };\n\n const restartTimer = (entry: Entry): void => {\n entry.timer.cancel();\n if (entry.record.duration > 0) {\n entry.timer.reset(entry.record.duration);\n if (entry.record.visible && !entry.record.pausedBy.length) entry.timer.start();\n }\n entry.record = {\n ...entry.record,\n timerEpoch: entry.record.timerEpoch + 1,\n remaining: remainingOf(entry),\n };\n };\n\n const flushOpened = (): void => {\n for (const id of order) {\n const entry = entries.get(id);\n if (entry && entry.record.visible && !entry.openedFired && !entry.record.dismissed) {\n entry.openedFired = true;\n safeCall(entry.record.onOpen, entry.record);\n }\n }\n };\n\n const store: ToastManager = {\n config,\n types,\n\n add(input: AddToastInput): ToastId {\n const id = normalizeId(input.id);\n const existing = entries.get(id);\n if (existing && !existing.record.dismissed) {\n const { custom, ...patch } = input;\n store.update(id, patch);\n if (custom) {\n existing.custom = custom;\n existing.record = { ...existing.record, custom };\n emit();\n }\n return id;\n }\n if (existing) finalize(existing);\n\n const key = dedupeKeyOf(input);\n if (key !== undefined) {\n for (const other of entries.values()) {\n if (other.dedupeKey === key && !other.record.dismissed) {\n other.record = {\n ...other.record,\n count: other.record.count + 1,\n revision: other.record.revision + 1,\n updatedAt: now(),\n };\n restartTimer(other);\n emit();\n return other.record.id;\n }\n }\n }\n\n const entry = makeEntry(id, input);\n entries.set(id, entry);\n order = [...order, id];\n promote();\n emit();\n flushOpened();\n return id;\n },\n\n update(id, patch) {\n const entry = entries.get(id);\n if (!entry || entry.record.dismissed) return false;\n const { resetTimer = true, ...rest } = patch;\n const next: ToastOptions = { ...entry.opts };\n if (rest.type !== undefined && rest.type !== entry.record.type) {\n delete next.duration;\n delete next.ariaLive;\n delete next.role;\n delete next.icon;\n }\n let changed = false;\n for (const key in rest) {\n const value = (rest as Record<string, unknown>)[key];\n if (value !== undefined) {\n if ((entry.opts as Record<string, unknown>)[key] !== value) changed = true;\n (next as Record<string, unknown>)[key] = value;\n }\n }\n if (!changed && rest.type === undefined && rest.position === undefined) return true;\n entry.opts = next;\n entry.dedupeKey = dedupeKeyOf(next);\n const rebuilt = build(id, next, entry.record, entry.custom);\n const positionChanged = rebuilt.position !== entry.record.position;\n entry.record = rebuilt;\n if (positionChanged) {\n entry.record = { ...entry.record, visible: false };\n promote();\n }\n if (resetTimer || positionChanged) restartTimer(entry);\n else {\n entry.record = {\n ...entry.record,\n remaining: remainingOf(entry),\n };\n }\n emit();\n flushOpened();\n return true;\n },\n\n dismiss(id, reason = 'api') {\n if (id === undefined) return store.dismissAll(reason);\n const entry = entries.get(id);\n if (entry) dismissEntry(entry, reason);\n },\n\n dismissAll(reason = 'api') {\n for (const entry of entries.values()) dismissEntry(entry, reason);\n },\n\n pause(id, reason) {\n const list =\n id === undefined\n ? [...entries.values()]\n : [entries.get(id)].filter((e): e is Entry => Boolean(e));\n for (const entry of list) {\n if (entry.record.pausedBy.includes(reason)) continue;\n entry.timer.pause(reason);\n entry.record = {\n ...entry.record,\n pausedBy: [...entry.record.pausedBy, reason],\n remaining: remainingOf(entry),\n };\n }\n emit();\n },\n\n resume(id, reason) {\n const list =\n id === undefined\n ? [...entries.values()]\n : [entries.get(id)].filter((e): e is Entry => Boolean(e));\n for (const entry of list) {\n if (!entry.record.pausedBy.includes(reason)) continue;\n entry.timer.resume(reason);\n const nextPausedBy = entry.record.pausedBy.filter((value) => value !== reason);\n entry.record = {\n ...entry.record,\n pausedBy: nextPausedBy,\n remaining: remainingOf(entry),\n };\n if (!nextPausedBy.length && entry.record.visible && entry.record.duration > 0) {\n entry.timer.start();\n }\n }\n emit();\n },\n\n extend(id, ms) {\n const entry = entries.get(id);\n if (!entry || entry.record.dismissed) return;\n entry.timer.add(ms);\n entry.record = {\n ...entry.record,\n remaining: remainingOf(entry),\n timerEpoch: entry.record.timerEpoch + 1,\n revision: entry.record.revision + 1,\n };\n emit();\n },\n\n getRemaining(id) {\n const entry = entries.get(id);\n return entry ? remainingOf(entry) : 0;\n },\n\n getToasts: () => snapshot,\n getHistory: () => history,\n\n clear() {\n for (const entry of entries.values()) {\n entry.exitHandle?.();\n entry.timer.cancel();\n }\n entries.clear();\n order = [];\n snapshot = [];\n emit();\n },\n\n clearHistory() {\n history = [];\n emit();\n },\n\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n };\n\n return store;\n}\n\nexport const createToastStore = createToastManager;\n","import type { PromiseHandle, PromiseMessages, ToastId, ToastOptions, ToastPatch } from './types';\nimport type { ToastStore } from './toast-manager';\n\nfunction toPatch(message: string | ToastPatch): ToastPatch {\n return typeof message === 'string' ? { title: message } : message;\n}\n\nfunction errorText(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\n/**\n * Handles async promise toasts: displays loading state, resolves to success or error,\n * calls lifecycle hooks, and provides `unwrap()` returning the raw promise result.\n */\nexport function runPromiseToast<T>(\n store: ToastStore,\n input: Promise<T> | (() => Promise<T>),\n messages: PromiseMessages<T>,\n options: ToastOptions = {},\n): PromiseHandle<T> {\n let promise: Promise<T>;\n try {\n promise = typeof input === 'function' ? input() : input;\n } catch (error) {\n promise = Promise.reject(error);\n }\n\n const { id: requestedId, ...base } = options;\n const loadingPatch = toPatch(messages.loading);\n\n const id: ToastId = store.add({\n ...base,\n ...(requestedId === undefined ? {} : { id: requestedId }),\n ...loadingPatch,\n type: 'loading',\n duration: 0, // persistent while pending\n });\n\n const settle = (type: 'success' | 'error', raw: unknown, payload: unknown): void => {\n const desc =\n typeof messages.description === 'function'\n ? messages.description(\n type === 'success'\n ? { status: type, value: payload as T }\n : { status: type, error: payload },\n )\n : messages.description;\n store.update(id, {\n duration: base.duration ?? store.config.get().duration,\n ...toPatch(raw as string | ToastPatch),\n type,\n ...(desc !== undefined ? { description: desc } : {}),\n resetTimer: true,\n });\n };\n\n promise\n .then((value) => {\n if (messages.success === undefined) {\n store.dismiss(id);\n } else {\n settle(\n 'success',\n typeof messages.success === 'function' ? messages.success(value) : messages.success,\n value,\n );\n }\n })\n .catch((error: unknown) => {\n settle(\n 'error',\n messages.error === undefined\n ? errorText(error)\n : typeof messages.error === 'function'\n ? messages.error(error)\n : messages.error,\n error,\n );\n })\n .finally(() => {\n try {\n void messages.finally?.();\n } catch (err) {\n console.error(err);\n }\n });\n\n return {\n id,\n unwrap: () => promise,\n };\n}\n","import { runPromiseToast } from './promise';\nimport type { ToastStore } from './toast-manager';\nimport type {\n PromiseHandle,\n PromiseMessage,\n PromiseMessages,\n PromiseOutcome,\n Renderable,\n ToastCustomRenderer,\n ToastId,\n ToastOptions,\n ToastPatch,\n ToastRecord,\n} from './types';\nimport type { TypeRegistry } from './types-registry';\n\nexport type { PromiseHandle, PromiseMessage, PromiseMessages, PromiseOutcome };\n\n/** Callable toast function shape shared by all entry points. */\nexport type ToastFn = (message?: Renderable, options?: ToastOptions) => ToastId;\n\n/** The `ui.toast` API. */\nexport interface ToastApi extends ToastFn {\n /** Success toast. */\n success: ToastFn;\n /** Error toast. Uses an assertive live region. */\n error: ToastFn;\n /** Informational toast. */\n info: ToastFn;\n /** Warning toast. */\n warning: ToastFn;\n /** Loading toast with indefinite duration. */\n loading: ToastFn;\n /** Neutral message toast. */\n message: ToastFn;\n /** Custom renderer. */\n custom: (renderer: ToastCustomRenderer, options?: ToastOptions) => ToastId;\n /** Updates an existing toast. */\n update: (id: ToastId, patch: ToastPatch) => boolean;\n /** Dismisses one toast, or all when id is omitted. */\n dismiss: (id?: ToastId) => void;\n /** Dismisses every toast in every region. */\n dismissAll: () => void;\n /** Tracks a promise with loading, success and error states. */\n promise: <T>(\n input: Promise<T> | (() => Promise<T>),\n messages: PromiseMessages<T>,\n options?: ToastOptions,\n ) => PromiseHandle<T>;\n /** Returns a snapshot of active and queued toasts. */\n getToasts: () => readonly ToastRecord[];\n /** Returns closed toasts up to `config.historyLimit`. */\n getHistory: () => readonly ToastRecord[];\n /** Registry of custom toast types. */\n readonly types: TypeRegistry;\n}\n\n/** Builds the `ui.toast` API on top of a store/manager. */\nexport function createToastApi(store: ToastStore): ToastApi {\n const make =\n (type: ToastOptions['type']): ToastFn =>\n (message, options = {}) => {\n const input: ToastOptions = { ...options };\n if (type !== undefined && options.type === undefined) input.type = type;\n if (message !== undefined) {\n if (options.title === undefined) {\n input.title = message;\n } else if (options.description === undefined) {\n input.description = message;\n }\n }\n return store.add(input);\n };\n\n const api = make(undefined) as ToastApi;\n api.success = make('success');\n api.error = make('error');\n api.info = make('info');\n api.warning = make('warning');\n api.loading = make('loading');\n api.message = make('message');\n\n api.custom = (renderer, options) => store.add({ ...options, custom: renderer });\n api.update = store.update;\n api.dismiss = store.dismiss;\n api.dismissAll = store.dismissAll;\n api.getToasts = store.getToasts;\n api.getHistory = store.getHistory;\n (api as unknown as { types: TypeRegistry }).types = store.types;\n api.promise = (input, messages, options) => runPromiseToast(store, input, messages, options);\n\n return api;\n}\n","export { defaultClock } from './clock';\nexport type { Clock } from './clock';\n\nexport { nextId, normalizeId, resetIdCounter } from './ids';\n\nexport { createStore } from './store';\nexport type { Store } from './types';\n\nexport { createTimer } from './timer';\nexport type { PausableTimer } from './timer';\n\nexport { createTypeRegistry } from './types-registry';\nexport type { TypeRegistry } from './types-registry';\n\nexport {\n decideAriaLive,\n decideDialogLabels,\n decideDialogRole,\n decideFocusTarget,\n decideToastRole,\n} from './a11y-rules';\n\nexport { createConfigStore, DEFAULT_CONFIG, resolvePrecedence } from './config';\nexport type { ConfigStore } from './config';\n\nexport { createToastManager, createToastStore, MANUAL_PAUSE } from './toast-manager';\nexport type { AddToastInput, ToastManager, ToastManagerOptions, ToastStore } from './toast-manager';\n\nexport { runPromiseToast } from './promise';\n\nexport { createDialogManager } from './dialog-manager';\nexport type { DialogManager, DialogQueueItem, HeadlessDialogController } from './dialog-manager';\n\nexport { createDialogController, runSteps } from './dialog';\nexport type { DialogController, DialogPromise, StepsResult } from './dialog';\n\nexport { createToastApi } from './toast-api';\nexport type {\n PromiseHandle,\n PromiseMessage,\n PromiseMessages,\n PromiseOutcome,\n ToastApi,\n ToastFn,\n} from './toast-api';\n\nexport type * from './types';\n\nimport type { Clock } from './clock';\nimport { defaultClock } from './clock';\nimport type { ConfigStore } from './config';\nimport { createConfigStore } from './config';\nimport { runSteps } from './dialog';\nimport type { StepsResult } from './dialog';\nimport { createDialogManager } from './dialog-manager';\nimport type { DialogManager } from './dialog-manager';\nimport { createToastManager } from './toast-manager';\nimport type { ToastStore } from './toast-manager';\nimport { createToastApi } from './toast-api';\nimport type { ToastApi } from './toast-api';\nimport type {\n BottomSheetHandle,\n BottomSheetOptions,\n DialogHandle,\n DialogOptions,\n DialogResult,\n GlazeConfig,\n LoadingHandle,\n LoadingOptions,\n SheetOptions,\n ToastRecord,\n} from './types';\n\n/**\n * Renderer interface for bridging the framework-agnostic core to UI adapters.\n * If a call happens before a renderer is registered, it queues and replays upon registration.\n */\nexport interface Renderer {\n openDialog?(options: DialogOptions, handle: DialogHandle): Promise<DialogResult> | undefined;\n openSheet?(options: SheetOptions): Promise<DialogResult>;\n openBottomSheet?(options: BottomSheetOptions): BottomSheetHandle;\n openLoading?(options: LoadingOptions): LoadingHandle;\n mountToast?(record: ToastRecord): void;\n}\n\n/** Complete framework-agnostic UI feedback toolkit. */\nexport interface CoreUI {\n /** Toast notifications API. */\n readonly toast: ToastApi;\n /** Global configuration store. */\n readonly config: ConfigStore;\n /** Toast state manager. */\n readonly toastStore: ToastStore;\n /** Headless dialog manager. */\n readonly dialogManager: DialogManager;\n\n /** Opens a confirm dialog. */\n confirm(options: DialogOptions | string): Promise<DialogResult>;\n /** Opens an informational alert dialog. */\n alert(options: DialogOptions | string): Promise<DialogResult>;\n /** Opens a prompt dialog for user text/value input. */\n prompt(options: DialogOptions | string): Promise<DialogResult>;\n /** Runs a multi-step dialog sequence. */\n steps(steps: readonly DialogOptions[], backLabel?: string): Promise<StepsResult>;\n /** Opens an action sheet. */\n sheet(options: SheetOptions): Promise<DialogResult>;\n /** Opens a bottom sheet. */\n bottomSheet(options: BottomSheetOptions): BottomSheetHandle;\n /** Opens a loading overlay. */\n loading(options?: LoadingOptions | string): LoadingHandle;\n\n /** Merges global configuration. */\n configure(patch: Partial<GlazeConfig>): Readonly<GlazeConfig>;\n /** Returns the current configuration snapshot. */\n getConfig(): Readonly<GlazeConfig>;\n /** Clears all active toasts and dialogs. */\n clear(): void;\n\n /** Registers a concrete UI renderer, replaying any calls queued during hydration. */\n registerRenderer(renderer: Renderer): void;\n /** Returns the active renderer if registered. */\n getRenderer(): Renderer | undefined;\n}\n\nexport interface CreateUIOptions {\n config?: ConfigStore;\n clock?: Clock;\n}\n\n/**\n * Creates an isolated, framework-agnostic CoreUI instance.\n * Useful for multi-tenant applications, microfrontends, and isolated tests.\n */\nexport function createUI(options: CreateUIOptions = {}): CoreUI {\n const clock = options.clock ?? defaultClock;\n const config = options.config ?? createConfigStore();\n const toastStore = createToastManager({ config, clock });\n const toast = createToastApi(toastStore);\n const dialogManager = createDialogManager(clock);\n\n let activeRenderer: Renderer | undefined;\n const replayQueue: (() => void)[] = [];\n\n const toDialogOptions = (opts: DialogOptions | string): DialogOptions =>\n typeof opts === 'string' ? { title: opts } : { ...opts };\n\n const runDlg = (merged: DialogOptions): Promise<DialogResult> => {\n const handle = dialogManager.open(merged);\n if (activeRenderer?.openDialog) void activeRenderer.openDialog(merged, handle);\n else replayQueue.push(() => void activeRenderer?.openDialog?.(merged, handle));\n return handle.result;\n };\n\n const DISMISSED: DialogResult = {\n isConfirmed: false,\n isDenied: false,\n isDismissed: true,\n value: undefined,\n dismiss: 'close',\n };\n\n const ui: CoreUI = {\n toast,\n config,\n toastStore,\n dialogManager,\n\n confirm: (opts) =>\n runDlg({\n confirmButton: { show: true },\n cancelButton: { show: true },\n ...toDialogOptions(opts),\n }),\n\n alert: (opts) =>\n runDlg({\n confirmButton: { show: true },\n cancelButton: { show: false },\n denyButton: { show: false },\n ...toDialogOptions(opts),\n }),\n\n prompt: (opts) =>\n runDlg({\n input: 'text',\n confirmButton: { show: true },\n cancelButton: { show: true },\n ...toDialogOptions(opts),\n }),\n\n steps(stepList, backLabel = 'Back') {\n return runSteps(stepList, (s) => ui.confirm(s), backLabel);\n },\n\n sheet: (opts) =>\n activeRenderer?.openSheet\n ? activeRenderer.openSheet(opts)\n : new Promise((res) => {\n replayQueue.push(() =>\n activeRenderer?.openSheet\n ? void activeRenderer.openSheet(opts).then(res)\n : res(DISMISSED),\n );\n }),\n\n bottomSheet(opts) {\n if (activeRenderer?.openBottomSheet) return activeRenderer.openBottomSheet(opts);\n let live: BottomSheetHandle | undefined;\n return {\n body: undefined,\n close: (r) => live?.close(r),\n snapTo: (i) => live?.snapTo(i),\n update: (p) => live?.update(p),\n result: new Promise((res) => {\n replayQueue.push(() =>\n activeRenderer?.openBottomSheet\n ? void (live = activeRenderer.openBottomSheet(opts)).result.then(res)\n : res(DISMISSED),\n );\n }),\n };\n },\n\n loading(loadingOpts = {}) {\n const opts = typeof loadingOpts === 'string' ? { text: loadingOpts } : loadingOpts;\n if (activeRenderer?.openLoading) return activeRenderer.openLoading(opts);\n let live: LoadingHandle | undefined, done: () => void;\n const closed = new Promise<void>((res) => {\n done = res;\n });\n replayQueue.push(() =>\n activeRenderer?.openLoading\n ? void (live = activeRenderer.openLoading(opts)).closed.then(done)\n : done(),\n );\n return {\n update: (p) => live?.update(p),\n close: () => {\n live?.close();\n done();\n },\n closed,\n };\n },\n\n configure: (patch) => config.set(patch),\n getConfig: () => config.get(),\n\n clear() {\n toastStore.clear();\n dialogManager.clear();\n replayQueue.length = 0;\n },\n\n registerRenderer(renderer) {\n activeRenderer = renderer;\n while (replayQueue.length > 0) {\n const replay = replayQueue.shift();\n replay?.();\n }\n },\n\n getRenderer: () => activeRenderer,\n };\n\n return ui;\n}\n\nlet defaultUI: CoreUI | undefined;\nconst def = (): CoreUI => (defaultUI ??= createUI());\n\n/** Default singleton instance of the CoreUI toolkit. */\nexport const ui: CoreUI = {\n get toast() {\n return def().toast;\n },\n get config() {\n return def().config;\n },\n get toastStore() {\n return def().toastStore;\n },\n get dialogManager() {\n return def().dialogManager;\n },\n confirm: (o) => def().confirm(o),\n alert: (o) => def().alert(o),\n prompt: (o) => def().prompt(o),\n steps: (s, b) => def().steps(s, b),\n sheet: (o) => def().sheet(o),\n bottomSheet: (o) => def().bottomSheet(o),\n loading: (o) => def().loading(o),\n configure: (p) => def().configure(p),\n getConfig: () => def().getConfig(),\n clear: () => def().clear(),\n registerRenderer: (r) => def().registerRenderer(r),\n getRenderer: () => def().getRenderer(),\n};\n\n/** Registers the renderer with the default UI instance. */\nexport function registerRenderer(renderer: Renderer): void {\n def().registerRenderer(renderer);\n}\n\n/** Backward-compatible ToastEngine interface. */\nexport interface ToastEngine {\n store: ToastStore;\n toast: ToastApi;\n}\n\n/** Backward-compatible factory for ToastEngine. */\nexport function createToastEngine(options: { config?: ConfigStore } = {}): ToastEngine {\n const store = createToastManager({ config: options.config });\n return { store, toast: createToastApi(store) };\n}\n","import React, { useEffect, useMemo, useState } from 'react';\nimport type {\n GlazeConfig,\n ToastApi,\n ToastOptions,\n ToastRecord,\n ToastStore,\n Unsubscribe,\n} from '../core';\nimport { createToastEngine } from '../core';\n\n/** Native engine holder for React Native environments. */\nlet nativeEngine: { store: ToastStore; toast: ToastApi } | undefined;\n\nfunction getNativeEngine(): { store: ToastStore; toast: ToastApi } {\n if (!nativeEngine) {\n nativeEngine = createToastEngine();\n }\n return nativeEngine;\n}\n\n/** Triggers optional haptic feedback on supported Expo devices. */\nasync function triggerHaptic(type: string): Promise<void> {\n try {\n // Dynamic optional import for expo-haptics\n // @ts-expect-error expo-haptics is an optional peer dependency that may not be installed at compile time\n const Haptics = await import('expo-haptics');\n if (!Haptics) return;\n if (type === 'success') {\n await Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success);\n } else if (type === 'error') {\n await Haptics.notificationAsync(Haptics.NotificationFeedbackType.Error);\n } else if (type === 'warning') {\n await Haptics.notificationAsync(Haptics.NotificationFeedbackType.Warning);\n } else {\n await Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light);\n }\n } catch {\n // expo-haptics is an optional peer dependency, gracefully ignore when not installed\n }\n}\n\n/**\n * Creates the React Native `toast` API with haptics integration.\n */\nfunction createNativeToastApi(): ToastApi {\n const engine = getNativeEngine();\n const baseToast = engine.toast;\n\n const wrap =\n (fn: (msg?: unknown, opts?: ToastOptions) => string | number) =>\n (msg?: unknown, opts: ToastOptions = {}) => {\n const type = opts.type ?? 'default';\n void triggerHaptic(type);\n return fn(msg, opts);\n };\n\n const nativeApi = wrap(baseToast) as ToastApi;\n nativeApi.success = wrap(baseToast.success);\n nativeApi.error = wrap(baseToast.error);\n nativeApi.info = wrap(baseToast.info);\n nativeApi.warning = wrap(baseToast.warning);\n nativeApi.loading = wrap(baseToast.loading);\n nativeApi.message = wrap(baseToast.message);\n\n nativeApi.promise = baseToast.promise;\n nativeApi.custom = baseToast.custom;\n nativeApi.update = baseToast.update;\n nativeApi.dismiss = baseToast.dismiss;\n nativeApi.dismissAll = baseToast.dismissAll;\n nativeApi.getToasts = baseToast.getToasts;\n nativeApi.getHistory = baseToast.getHistory;\n Object.defineProperty(nativeApi, 'types', { value: baseToast.types, enumerable: true });\n\n return nativeApi;\n}\n\n/** Native toast API. */\nexport const toast: ToastApi = createNativeToastApi();\n\n/** Configuration function for React Native. */\nexport function configure(patch: Partial<GlazeConfig>): Readonly<GlazeConfig> {\n return getNativeEngine().store.config.set(patch);\n}\n\n/** Resets the native engine for tests. */\nexport function resetNativeEngine(): void {\n if (nativeEngine) {\n nativeEngine.store.clear();\n nativeEngine.store.clearHistory();\n nativeEngine.store.config.reset();\n }\n}\n\n/** Native UI namespace. */\nexport const ui = {\n toast,\n configure,\n reset: resetNativeEngine,\n};\n\nexport interface NativeToasterProps {\n /** Toast placement. Defaults to 'top'. */\n position?: 'top' | 'bottom' | 'center';\n /** Optional top/bottom inset offset. */\n offset?: number;\n /** Toast container style. */\n style?: Record<string, unknown>;\n}\n\nexport interface GlazeProviderProps {\n children?: React.ReactNode;\n}\n\n/** Root provider for React Native toastory overlay hosting. */\nexport function GlazeProvider({ children }: GlazeProviderProps): React.JSX.Element {\n return <>{children}</>;\n}\n\n/**\n * React Native Toast Renderer component.\n * Renders glass toasts with optional Expo BlurView and gesture animations.\n */\nexport function Toaster(props: NativeToasterProps): React.JSX.Element | null {\n const [toastsList, setToastsList] = useState<readonly ToastRecord[]>([]);\n\n useEffect(() => {\n const engine = getNativeEngine();\n setToastsList(engine.store.getToasts());\n const unsub: Unsubscribe = engine.store.subscribe(() => {\n setToastsList(engine.store.getToasts());\n });\n return () => unsub();\n }, []);\n\n const visibleToasts = useMemo(() => toastsList.filter((t) => t.visible), [toastsList]);\n\n if (visibleToasts.length === 0) return null;\n\n const position = props.position ?? 'top';\n const posStyle: React.CSSProperties =\n position === 'bottom'\n ? { bottom: props.offset ?? 50 }\n : position === 'center'\n ? { top: '50%', transform: 'translateY(-50%)' }\n : { top: props.offset ?? 50 };\n\n return (\n <div\n style={\n {\n position: 'absolute',\n ...posStyle,\n left: 16,\n right: 16,\n zIndex: 99999,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: 8,\n ...props.style,\n } as React.CSSProperties\n }\n >\n {visibleToasts.map((item) => (\n <div\n key={String(item.id)}\n style={\n {\n backgroundColor: 'rgba(28, 28, 30, 0.88)',\n padding: 14,\n borderRadius: 16,\n minWidth: 200,\n maxWidth: '100%',\n boxShadow: '0 8px 24px rgba(0, 0, 0, 0.25)',\n display: 'flex',\n flexDirection: 'column',\n gap: 4,\n } as React.CSSProperties\n }\n >\n {item.badge ? (\n <div\n style={\n {\n fontSize: 11,\n fontWeight: '600',\n color: '#38bdf8',\n textTransform: 'uppercase',\n letterSpacing: '0.04em',\n } as React.CSSProperties\n }\n >\n {typeof item.badge === 'string'\n ? item.badge\n : ((item.badge as { label?: string }).label ?? '')}\n </div>\n ) : null}\n {item.title ? (\n <div style={{ color: '#fff', fontWeight: '600', fontSize: 15 }}>\n {String(item.title)}\n </div>\n ) : null}\n {item.description ? (\n <div style={{ color: '#aaa', fontSize: 13, marginTop: 2 }}>\n {String(item.description)}\n </div>\n ) : null}\n {item.progressValue !== undefined ? (\n <div\n style={\n {\n height: 3,\n backgroundColor: 'rgba(255,255,255,0.15)',\n borderRadius: 3,\n marginTop: 6,\n overflow: 'hidden',\n } as React.CSSProperties\n }\n >\n <div\n style={\n {\n height: '100%',\n width: `${Math.round(item.progressValue * 100)}%`,\n backgroundColor: '#38bdf8',\n } as React.CSSProperties\n }\n />\n </div>\n ) : null}\n {item.actions && item.actions.length > 0 ? (\n <div\n style={\n {\n display: 'flex',\n gap: 8,\n marginTop: 8,\n justifyContent: 'flex-end',\n } as React.CSSProperties\n }\n >\n {item.actions.map((act, i) => (\n <button\n key={i}\n type=\"button\"\n onClick={act.onClick ? (e) => act.onClick?.(e.nativeEvent) : undefined}\n style={\n {\n fontSize: 12,\n fontWeight: '600',\n padding: '4px 10px',\n borderRadius: 8,\n border: 'none',\n backgroundColor: 'rgba(255, 255, 255, 0.12)',\n color: '#fff',\n cursor: 'pointer',\n } as React.CSSProperties\n }\n >\n {act.label ?? act.text ?? 'Action'}\n </button>\n ))}\n </div>\n ) : null}\n </div>\n ))}\n </div>\n );\n}\n\n/** React Native hook for reactive toast state. */\nexport function useNativeToast(): {\n toast: ToastApi;\n toasts: readonly ToastRecord[];\n} {\n const [toastsList, setToastsList] = useState<readonly ToastRecord[]>([]);\n\n useEffect(() => {\n const engine = getNativeEngine();\n setToastsList(engine.store.getToasts());\n return engine.store.subscribe(() => {\n setToastsList(engine.store.getToasts());\n });\n }, []);\n\n return { toast, toasts: toastsList };\n}\n"]}
1
+ {"version":3,"sources":["../src/core/clock.ts","../src/core/ids.ts","../src/core/config.ts","../src/core/timer.ts","../src/core/types-registry.ts","../src/core/toast-manager.ts","../src/core/promise.ts","../src/core/toast-api.ts","../src/core/index.ts","../src/native/index.tsx"],"names":["defaultClock","fn","ms","t","counter","nextId","p","normalizeId","id","DEFAULT_CONFIG","createConfigStore","initial","current","stripUndefined","listeners","emit","listener","patch","value","out","k","createTimer","duration","onDone","clock","totalDuration","remainingMs","startedAt","cancelTimeout","cancelInterval","started","done","pauseReasons","tickListeners","isLive","notifyTick","rem","getRemaining","frac","err","stopTimers","arm","reason","count","live","callback","tDef","color","ariaLive","BUILT_IN_TYPES","createTypeRegistry","custom","name","definition","USER_REASONS","safeCall","args","MANUAL_PAUSE","BUILTIN_DEFAULTS","createToastManager","options","config","now","types","entries","order","snapshot","history","regionOf","record","build","opts","previous","cfg","type","merged","rawDuration","urgent","stamp","remainingOf","entry","dedupeKeyOf","d","promote","counts","key","used","isImportant","finalize","flushOpened","dismissEntry","exit","makeEntry","input","restartTimer","store","existing","other","resetTimer","rest","next","changed","rebuilt","positionChanged","list","e","nextPausedBy","toPatch","message","errorText","error","runPromiseToast","messages","promise","requestedId","base","loadingPatch","settle","raw","payload","desc","createToastApi","make","api","renderer","createToastEngine","nativeEngine","getNativeEngine","triggerHaptic","Haptics","createNativeToastApi","baseToast","wrap","msg","nativeApi","toast","configure","resetNativeEngine","ui","GlazeProvider","children","jsx","Fragment","Toaster","props","toastsList","setToastsList","useState","useEffect","engine","unsub","visibleToasts","useMemo","position","posStyle","item","jsxs","act","i","useNativeToast"],"mappings":"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","file":"native.js","sourcesContent":["/**\n * Injectable clock and scheduler interface.\n * Abstracts time and timers so tests and headless engines can run deterministically.\n */\nexport interface Clock {\n /** Returns the current timestamp in milliseconds. */\n now(): number;\n /**\n * Schedules a callback after `ms` milliseconds.\n * @returns A cancellation function.\n */\n setTimeout(fn: () => void, ms: number): () => void;\n /**\n * Schedules a recurring callback every `ms` milliseconds.\n * @returns A cancellation function.\n */\n setInterval(fn: () => void, ms: number): () => void;\n}\n\n/** Default system clock using standard global timer functions. */\nexport const defaultClock: Clock = {\n now: () => Date.now(),\n setTimeout: (fn, ms) => {\n const t = setTimeout(fn, ms);\n return () => clearTimeout(t);\n },\n setInterval: (fn, ms) => {\n const t = setInterval(fn, ms);\n return () => clearInterval(t);\n },\n};\n","import type { ToastId } from './types';\n\nlet counter = 0;\n\n/**\n * Returns a collision-safe, incremental unique identifier.\n * @param prefix Optional prefix for the id (default: 'gk').\n */\nexport function nextId(p = 'gk'): string {\n return `${p}-${++counter}`;\n}\n\n/**\n * Normalizes an optional user-provided id, generating an incremental id if omitted.\n * @param id User-supplied id or undefined.\n * @param prefix Prefix used when generating an id.\n */\nexport function normalizeId(id: ToastId | undefined, p = 'gk'): ToastId {\n return id !== undefined && id !== '' ? id : nextId(p);\n}\n\n/**\n * Resets the internal counter. Useful for deterministic test execution.\n */\nexport function resetIdCounter(): void {\n counter = 0;\n}\n","import type { GlazeConfig, Listener, Unsubscribe } from './types';\n\n/** Library default configuration. */\nexport const DEFAULT_CONFIG: Readonly<GlazeConfig> = Object.freeze({\n theme: 'ios-glass',\n mode: 'auto',\n position: 'top-right',\n duration: 4000,\n maxVisible: 8,\n gap: 12,\n stack: true,\n dir: 'auto',\n hotkey: 'alt+t',\n pauseOn: ['hover', 'focus', 'hidden'],\n shadow: true,\n closeButton: false,\n richColors: false,\n invert: false,\n swipe: true,\n dragThreshold: 45,\n progress: false,\n closeOnClick: false,\n exitDuration: 250,\n historyLimit: 100,\n regionLabel: 'Notifications',\n closeLabel: 'Close notification',\n startPaused: false,\n newestOnTop: true,\n dedupeWindow: 500,\n container: undefined,\n} satisfies GlazeConfig);\n\n/** Observable configuration container holding immutable snapshots. */\nexport interface ConfigStore {\n /** Returns the current immutable configuration snapshot. */\n get(): Readonly<GlazeConfig>;\n /** Merges a partial configuration and notifies subscribers. Returns the updated snapshot. */\n set(patch: Partial<GlazeConfig>): Readonly<GlazeConfig>;\n /** Restores library defaults. */\n reset(): void;\n /** Subscribes to configuration changes. */\n subscribe(listener: Listener): Unsubscribe;\n}\n\n/**\n * Resolves an option according to precedence:\n * Call option > Theme default > Global config > Library default.\n */\nexport const resolvePrecedence = <T>(\n callVal: T | undefined,\n themeVal: T | undefined,\n globalVal: T | undefined,\n defaultVal: T,\n): T => callVal ?? themeVal ?? globalVal ?? defaultVal;\n\n/** Creates an isolated, immutable configuration store. */\nexport function createConfigStore(initial: Partial<GlazeConfig> = {}): ConfigStore {\n let current: Readonly<GlazeConfig> = Object.freeze({\n ...DEFAULT_CONFIG,\n ...stripUndefined(initial),\n });\n const listeners = new Set<Listener>();\n\n const emit = (): void => {\n listeners.forEach((listener) => listener());\n };\n\n return {\n get: () => current,\n set(patch) {\n current = Object.freeze({ ...current, ...stripUndefined(patch) });\n emit();\n return current;\n },\n reset() {\n current = DEFAULT_CONFIG;\n emit();\n },\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n };\n}\n\nfunction stripUndefined<T extends object>(value: T): Partial<T> {\n const out: Partial<T> = {};\n for (const k in value) if (value[k] !== undefined) out[k] = value[k];\n return out;\n}\n","import type { Clock } from './clock';\nimport { defaultClock } from './clock';\n\nexport interface PausableTimer {\n /** Starts or resumes the countdown. No effect when already running or finished. */\n start(): void;\n /**\n * Pauses the timer for a named reason (reference-counted).\n * @param reason The pause trigger identifier, e.g. 'hover', 'focus', 'hidden', 'manual'.\n */\n pause(reason?: string): void;\n /**\n * Resumes the timer for a named reason (decrements reference count).\n * Restarts the countdown when all pause reasons are cleared.\n */\n resume(reason?: string): void;\n /** Adds milliseconds to the remaining countdown (or subtracts if negative). */\n add(ms: number): void;\n /** Resets the countdown duration and restarts if previously active. */\n reset(ms?: number): void;\n /** Permanently cancels and tears down the timer. */\n cancel(): void;\n /** Current milliseconds remaining on the countdown. */\n remaining(): number;\n /** Current milliseconds elapsed on the countdown. */\n elapsed(): number;\n /** Whether the countdown is actively ticking. */\n isRunning(): boolean;\n /** Whether the countdown is held by one or more pause reasons. */\n isPaused(): boolean;\n /** List of all currently active pause reason names. */\n pausedReasons(): string[];\n /** Clears all pause reasons and resumes if started. */\n clearReasons(): void;\n /** Registers a progress tick listener called while ticking. */\n onTick(callback: (remaining: number, fraction: number) => void): () => void;\n}\n\n/**\n * Creates a pausable countdown timer with reference-counted pause reasons.\n *\n * @param duration Total countdown duration in milliseconds.\n * @param onDone Callback fired when countdown reaches zero.\n * @param clock Injectable clock/scheduler (defaults to defaultClock).\n */\nexport function createTimer(\n duration: number,\n onDone: () => void,\n clock: Clock = defaultClock,\n): PausableTimer {\n let totalDuration = duration;\n let remainingMs = duration;\n let startedAt = 0;\n let cancelTimeout: (() => void) | undefined;\n let cancelInterval: (() => void) | undefined;\n let started = false;\n let done = false;\n\n // Reference-counted pause reasons: reason -> count\n const pauseReasons = new Map<string, number>();\n const tickListeners = new Set<(remaining: number, fraction: number) => void>();\n\n const isLive = (): boolean => Number.isFinite(remainingMs) && remainingMs > 0;\n\n const notifyTick = (): void => {\n if (tickListeners.size === 0) return;\n const rem = getRemaining();\n const frac = totalDuration > 0 ? Math.max(0, Math.min(1, rem / totalDuration)) : 0;\n for (const listener of tickListeners) {\n try {\n listener(rem, frac);\n } catch (err) {\n console.error(err);\n }\n }\n };\n\n const getRemaining = (): number => {\n if (done) return 0;\n if (started && pauseReasons.size === 0) {\n return Math.max(0, remainingMs - (clock.now() - startedAt));\n }\n return remainingMs;\n };\n\n const stopTimers = (): void => {\n cancelTimeout?.();\n cancelTimeout = undefined;\n cancelInterval?.();\n cancelInterval = undefined;\n };\n\n const arm = (): void => {\n stopTimers();\n if (!isLive() || pauseReasons.size > 0 || done) return;\n\n startedAt = clock.now();\n cancelTimeout = clock.setTimeout(() => {\n stopTimers();\n remainingMs = 0;\n done = true;\n started = false;\n notifyTick();\n onDone();\n }, remainingMs);\n\n if (tickListeners.size > 0) {\n cancelInterval = clock.setInterval(() => {\n notifyTick();\n }, 50);\n }\n };\n\n const pauseTimer = (reason = 'manual'): void => {\n if (done) return;\n pauseReasons.set(reason, (pauseReasons.get(reason) ?? 0) + 1);\n\n if (started && pauseReasons.size === 1) {\n remainingMs = Math.max(0, remainingMs - (clock.now() - startedAt));\n stopTimers();\n notifyTick();\n }\n };\n\n const resumeTimer = (reason = 'manual'): void => {\n if (done) return;\n const count = pauseReasons.get(reason);\n if (!count) return;\n\n if (count <= 1) pauseReasons.delete(reason);\n else pauseReasons.set(reason, count - 1);\n\n if (started && pauseReasons.size === 0 && isLive()) {\n arm();\n notifyTick();\n }\n };\n\n return {\n start() {\n if (done || !isLive()) return;\n started = true;\n pauseReasons.clear();\n arm();\n notifyTick();\n },\n pause: pauseTimer,\n resume: resumeTimer,\n clearReasons() {\n pauseReasons.clear();\n if (started && isLive()) arm();\n },\n add(ms: number) {\n if (done || !Number.isFinite(remainingMs)) return;\n const live = started && pauseReasons.size === 0;\n remainingMs = Math.max(\n 1,\n (live ? remainingMs - (clock.now() - startedAt) : remainingMs) + ms,\n );\n totalDuration = Math.max(totalDuration, remainingMs);\n if (live) arm();\n notifyTick();\n },\n reset(ms?: number) {\n done = false;\n remainingMs = totalDuration = ms !== undefined ? ms : totalDuration;\n if (started && pauseReasons.size === 0) {\n if (isLive()) arm();\n else stopTimers();\n }\n notifyTick();\n },\n cancel() {\n stopTimers();\n started = false;\n done = true;\n remainingMs = 0;\n },\n remaining: getRemaining,\n elapsed() {\n return Math.max(0, totalDuration - getRemaining());\n },\n isRunning: () => started && !done && !pauseReasons.size && isLive(),\n isPaused: () => pauseReasons.size > 0,\n pausedReasons: () => [...pauseReasons.keys()],\n onTick(callback) {\n tickListeners.add(callback);\n if (started && pauseReasons.size === 0 && !cancelInterval) {\n cancelInterval = clock.setInterval(notifyTick, 50);\n }\n return () => {\n tickListeners.delete(callback);\n if (tickListeners.size === 0 && cancelInterval) {\n cancelInterval();\n cancelInterval = undefined;\n }\n };\n },\n };\n}\n","import type { ToastTypeDefinition } from './types';\n\n/** Registry of custom and built-in toast types. */\nexport interface TypeRegistry {\n /**\n * Registers or replaces a toast type.\n * @param name Non-empty type name.\n * @param definition Defaults, icon, color tokens, default duration, ariaLive.\n */\n add(name: string, definition?: ToastTypeDefinition): void;\n /** Removes a type. Returns whether it existed. */\n remove(name: string): boolean;\n /** Looks a type up. */\n get(name: string): ToastTypeDefinition | undefined;\n /** Lists registered custom type names. */\n list(): string[];\n}\n\nconst tDef = (color: string, ariaLive: 'polite' | 'assertive' = 'polite') => ({\n color: `var(--gk-${color})`,\n ariaLive,\n});\n\nconst BUILT_IN_TYPES: Record<string, ToastTypeDefinition> = {\n success: tDef('success'),\n error: tDef('error', 'assertive'),\n warning: tDef('warning', 'assertive'),\n info: tDef('info'),\n loading: { ...tDef('info'), defaults: { duration: 0, dismissible: false } },\n message: tDef('fg'),\n};\n\n/** Creates a type registry. */\nexport function createTypeRegistry(): TypeRegistry {\n const custom = new Map<string, ToastTypeDefinition>();\n\n return {\n add(name, definition = {}) {\n const k = typeof name === 'string' ? name.trim() : '';\n if (!k) throw new TypeError('toastory: invalid type');\n custom.set(k, definition);\n },\n remove: (name) => custom.delete(name),\n get: (name) => custom.get(name) ?? BUILT_IN_TYPES[name],\n list: () => [...custom.keys()],\n };\n}\n","import type { Clock } from './clock';\nimport { defaultClock } from './clock';\nimport type { ConfigStore } from './config';\nimport { createConfigStore } from './config';\nimport { normalizeId } from './ids';\nimport { createTimer } from './timer';\nimport type { PausableTimer } from './timer';\nimport { createTypeRegistry } from './types-registry';\nimport type { TypeRegistry } from './types-registry';\nimport type {\n CloseReason,\n Listener,\n ToastCustomRenderer,\n ToastId,\n ToastOptions,\n ToastPatch,\n ToastRecord,\n Unsubscribe,\n} from './types';\n\n/** Reasons that originate from a person and are blocked on non-dismissible toasts. */\nconst USER_REASONS = new Set<CloseReason>(['user', 'swipe', 'click']);\n\nconst safeCall = <A extends unknown[]>(\n fn: ((...args: A) => void) | undefined,\n ...args: A\n): void => {\n try {\n fn?.(...args);\n } catch (err) {\n console.error(err);\n }\n};\n\n/** Pause reason used by `startPaused`. */\nexport const MANUAL_PAUSE = 'manual';\n\n/** Options for creating a toast manager / store. */\nexport interface ToastManagerOptions {\n config?: ConfigStore;\n clock?: Clock;\n now?: () => number;\n types?: TypeRegistry;\n}\n\nexport type ToastStoreOptions = ToastManagerOptions;\n\n/** Input for adding a toast. */\nexport interface AddToastInput extends ToastOptions {\n custom?: ToastCustomRenderer;\n}\n\ninterface Entry {\n opts: ToastOptions;\n custom: ToastCustomRenderer | undefined;\n record: ToastRecord;\n timer: PausableTimer;\n dedupeKey: string | undefined;\n exitHandle: (() => void) | undefined;\n reason: CloseReason | undefined;\n openedFired: boolean;\n closedFired: boolean;\n dismissFired: boolean;\n autoCloseFired: boolean;\n}\n\nconst BUILTIN_DEFAULTS: Readonly<Record<string, ToastOptions>> = {\n loading: { duration: 0 },\n};\n\n/** State container for toasts. Pure logic: no DOM, no framework. */\nexport interface ToastManager {\n add(input: AddToastInput): ToastId;\n update(id: ToastId, patch: ToastPatch): boolean;\n dismiss(id?: ToastId, reason?: CloseReason): void;\n dismissAll(reason?: CloseReason): void;\n pause(id: ToastId | undefined, reason: string): void;\n resume(id: ToastId | undefined, reason: string): void;\n extend(id: ToastId, ms: number): void;\n getRemaining(id: ToastId): number;\n getToasts(): readonly ToastRecord[];\n getHistory(): readonly ToastRecord[];\n clear(): void;\n clearHistory(): void;\n subscribe(listener: Listener): Unsubscribe;\n readonly config: ConfigStore;\n readonly types: TypeRegistry;\n}\n\nexport type ToastStore = ToastManager;\n\nexport function createToastManager(options: ToastManagerOptions = {}): ToastManager {\n const config = options.config ?? createConfigStore();\n const clock = options.clock ?? defaultClock;\n const now = options.now ?? (() => clock.now());\n const types = options.types ?? createTypeRegistry();\n\n const entries = new Map<ToastId, Entry>();\n let order: ToastId[] = [];\n let snapshot: readonly ToastRecord[] = [];\n let history: readonly ToastRecord[] = [];\n const listeners = new Set<Listener>();\n\n const emit = (): void => {\n snapshot = order.map((id) => entries.get(id)?.record).filter(Boolean) as ToastRecord[];\n listeners.forEach((listener) => listener());\n };\n\n const regionOf = (record: ToastRecord): string => `${record.container ?? ''}|${record.position}`;\n\n const build = (\n id: ToastId,\n opts: ToastOptions,\n previous: ToastRecord | undefined,\n custom: ToastCustomRenderer | undefined,\n ): ToastRecord => {\n const cfg = config.get();\n const type = opts.type ?? 'default';\n const merged: ToastOptions = {\n ...BUILTIN_DEFAULTS[type],\n ...types.get(type)?.defaults,\n ...opts,\n };\n const rawDuration = merged.duration ?? cfg.duration;\n const duration = Number.isFinite(rawDuration) && rawDuration > 0 ? rawDuration : 0;\n const urgent = merged.important || type === 'error';\n const stamp = now();\n\n const record: ToastRecord = {\n ...merged,\n id,\n type,\n duration,\n position: merged.position ?? cfg.position,\n ariaLive: merged.ariaLive ?? (urgent ? 'assertive' : 'polite'),\n role: merged.role ?? (urgent ? 'alert' : 'status'),\n createdAt: previous?.createdAt ?? stamp,\n updatedAt: stamp,\n revision: (previous?.revision ?? -1) + 1,\n timerEpoch: previous?.timerEpoch ?? 0,\n count: previous?.count ?? 1,\n visible: previous?.visible ?? false,\n dismissed: false,\n pausedBy: previous?.pausedBy ?? (cfg.startPaused ? [MANUAL_PAUSE] : []),\n remaining: previous?.remaining ?? (duration ? duration : Infinity),\n custom,\n };\n return record;\n };\n\n const remainingOf = (entry: Entry): number => {\n return entry.record.duration === 0 ? Infinity : entry.timer.remaining();\n };\n\n const dedupeKeyOf = (opts: ToastOptions): string | undefined => {\n if (opts.dedupe === false) return;\n if (typeof opts.dedupe === 'string') return opts.dedupe;\n const t = typeof opts.title === 'string' ? opts.title : '';\n const d = typeof opts.description === 'string' ? opts.description : '';\n return t || d ? `${opts.type ?? 'default'}|${t}|${d}` : undefined;\n };\n\n const promote = (): void => {\n const cfg = config.get();\n const counts = new Map<string, number>();\n for (const id of order) {\n const entry = entries.get(id);\n if (!entry || entry.record.dismissed) continue;\n const key = regionOf(entry.record);\n const used = counts.get(key) ?? 0;\n const isImportant = !!entry.record.important;\n if (used < cfg.maxVisible || isImportant) {\n if (!entry.record.visible) {\n entry.record = { ...entry.record, visible: true };\n if (!entry.record.pausedBy.length && entry.record.duration > 0) {\n entry.timer.start();\n }\n }\n if (!isImportant) counts.set(key, used + 1);\n } else if (entry.record.visible) {\n entry.record = { ...entry.record, visible: false };\n entry.timer.pause();\n }\n }\n };\n\n const finalize = (entry: Entry): void => {\n entry.exitHandle?.();\n entry.timer.cancel();\n entries.delete(entry.record.id);\n order = order.filter((id) => id !== entry.record.id);\n history = [{ ...entry.record, dismissed: true }, ...history].slice(\n 0,\n config.get().historyLimit,\n );\n promote();\n flushOpened();\n emit();\n if (!entry.closedFired) {\n entry.closedFired = true;\n safeCall(entry.record.onClose, entry.record, entry.reason ?? 'api');\n }\n };\n\n const dismissEntry = (entry: Entry, reason: CloseReason): void => {\n if (entry.record.dismissed) return;\n if (entry.record.dismissible === false && USER_REASONS.has(reason)) return;\n entry.reason = reason;\n entry.record = {\n ...entry.record,\n dismissed: true,\n remaining: 0,\n revision: entry.record.revision + 1,\n };\n entry.timer.cancel();\n\n if (!entry.dismissFired && reason !== 'auto') {\n entry.dismissFired = true;\n safeCall(entry.record.onDismiss, entry.record, reason);\n }\n\n promote();\n flushOpened();\n emit();\n\n const exit = config.get().exitDuration;\n if (exit <= 0 || !entry.record.visible) {\n finalize(entry);\n } else {\n entry.exitHandle = clock.setTimeout(() => finalize(entry), exit);\n }\n };\n\n const makeEntry = (id: ToastId, input: AddToastInput): Entry => {\n const { custom, ...opts } = input;\n const record = build(id, opts, undefined, custom);\n const entry: Entry = {\n opts,\n custom,\n record,\n timer: undefined as unknown as PausableTimer,\n dedupeKey: dedupeKeyOf(opts),\n exitHandle: undefined,\n reason: undefined,\n openedFired: false,\n closedFired: false,\n dismissFired: false,\n autoCloseFired: false,\n };\n entry.timer = createTimer(\n record.duration,\n () => {\n if (!entry.autoCloseFired) {\n entry.autoCloseFired = true;\n safeCall(entry.record.onAutoClose, entry.record);\n }\n dismissEntry(entry, 'auto');\n },\n clock,\n );\n if (record.pausedBy.length) entry.timer.pause();\n return entry;\n };\n\n const restartTimer = (entry: Entry): void => {\n entry.timer.cancel();\n if (entry.record.duration > 0) {\n entry.timer.reset(entry.record.duration);\n if (entry.record.visible && !entry.record.pausedBy.length) entry.timer.start();\n }\n entry.record = {\n ...entry.record,\n timerEpoch: entry.record.timerEpoch + 1,\n remaining: remainingOf(entry),\n };\n };\n\n const flushOpened = (): void => {\n for (const id of order) {\n const entry = entries.get(id);\n if (entry && entry.record.visible && !entry.openedFired && !entry.record.dismissed) {\n entry.openedFired = true;\n safeCall(entry.record.onOpen, entry.record);\n }\n }\n };\n\n const store: ToastManager = {\n config,\n types,\n\n add(input: AddToastInput): ToastId {\n const id = normalizeId(input.id);\n const existing = entries.get(id);\n if (existing && !existing.record.dismissed) {\n const { custom, ...patch } = input;\n store.update(id, patch);\n if (custom) {\n existing.custom = custom;\n existing.record = { ...existing.record, custom };\n emit();\n }\n return id;\n }\n if (existing) finalize(existing);\n\n const key = dedupeKeyOf(input);\n if (key !== undefined) {\n for (const other of entries.values()) {\n if (other.dedupeKey === key && !other.record.dismissed) {\n other.record = {\n ...other.record,\n count: other.record.count + 1,\n revision: other.record.revision + 1,\n updatedAt: now(),\n };\n restartTimer(other);\n emit();\n return other.record.id;\n }\n }\n }\n\n const entry = makeEntry(id, input);\n entries.set(id, entry);\n order = [...order, id];\n promote();\n emit();\n flushOpened();\n return id;\n },\n\n update(id, patch) {\n const entry = entries.get(id);\n if (!entry || entry.record.dismissed) return false;\n const { resetTimer = true, ...rest } = patch;\n const next: ToastOptions = { ...entry.opts };\n if (rest.type !== undefined && rest.type !== entry.record.type) {\n delete next.duration;\n delete next.ariaLive;\n delete next.role;\n delete next.icon;\n }\n let changed = false;\n for (const key in rest) {\n const value = (rest as Record<string, unknown>)[key];\n if (value !== undefined) {\n if ((entry.opts as Record<string, unknown>)[key] !== value) changed = true;\n (next as Record<string, unknown>)[key] = value;\n }\n }\n if (!changed && rest.type === undefined && rest.position === undefined) return true;\n entry.opts = next;\n entry.dedupeKey = dedupeKeyOf(next);\n const rebuilt = build(id, next, entry.record, entry.custom);\n const positionChanged = rebuilt.position !== entry.record.position;\n entry.record = rebuilt;\n if (positionChanged) {\n entry.record = { ...entry.record, visible: false };\n promote();\n }\n if (resetTimer || positionChanged) restartTimer(entry);\n else {\n entry.record = {\n ...entry.record,\n remaining: remainingOf(entry),\n };\n }\n emit();\n flushOpened();\n return true;\n },\n\n dismiss(id, reason = 'api') {\n if (id === undefined) return store.dismissAll(reason);\n const entry = entries.get(id);\n if (entry) dismissEntry(entry, reason);\n },\n\n dismissAll(reason = 'api') {\n for (const entry of entries.values()) dismissEntry(entry, reason);\n },\n\n pause(id, reason) {\n const list =\n id === undefined\n ? [...entries.values()]\n : [entries.get(id)].filter((e): e is Entry => Boolean(e));\n for (const entry of list) {\n if (entry.record.pausedBy.includes(reason)) continue;\n entry.timer.pause(reason);\n entry.record = {\n ...entry.record,\n pausedBy: [...entry.record.pausedBy, reason],\n remaining: remainingOf(entry),\n };\n }\n emit();\n },\n\n resume(id, reason) {\n const list =\n id === undefined\n ? [...entries.values()]\n : [entries.get(id)].filter((e): e is Entry => Boolean(e));\n for (const entry of list) {\n if (!entry.record.pausedBy.includes(reason)) continue;\n entry.timer.resume(reason);\n const nextPausedBy = entry.record.pausedBy.filter((value) => value !== reason);\n entry.record = {\n ...entry.record,\n pausedBy: nextPausedBy,\n remaining: remainingOf(entry),\n };\n if (!nextPausedBy.length && entry.record.visible && entry.record.duration > 0) {\n entry.timer.start();\n }\n }\n emit();\n },\n\n extend(id, ms) {\n const entry = entries.get(id);\n if (!entry || entry.record.dismissed) return;\n entry.timer.add(ms);\n entry.record = {\n ...entry.record,\n remaining: remainingOf(entry),\n timerEpoch: entry.record.timerEpoch + 1,\n revision: entry.record.revision + 1,\n };\n emit();\n },\n\n getRemaining(id) {\n const entry = entries.get(id);\n return entry ? remainingOf(entry) : 0;\n },\n\n getToasts: () => snapshot,\n getHistory: () => history,\n\n clear() {\n for (const entry of entries.values()) {\n entry.exitHandle?.();\n entry.timer.cancel();\n }\n entries.clear();\n order = [];\n snapshot = [];\n emit();\n },\n\n clearHistory() {\n history = [];\n emit();\n },\n\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n };\n\n return store;\n}\n\nexport const createToastStore = createToastManager;\n","import type { PromiseHandle, PromiseMessages, ToastId, ToastOptions, ToastPatch } from './types';\nimport type { ToastStore } from './toast-manager';\n\nfunction toPatch(message: string | ToastPatch): ToastPatch {\n return typeof message === 'string' ? { title: message } : message;\n}\n\nfunction errorText(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\n/**\n * Handles async promise toasts: displays loading state, resolves to success or error,\n * calls lifecycle hooks, and provides `unwrap()` returning the raw promise result.\n */\nexport function runPromiseToast<T>(\n store: ToastStore,\n input: Promise<T> | (() => Promise<T>),\n messages: PromiseMessages<T>,\n options: ToastOptions = {},\n): PromiseHandle<T> {\n let promise: Promise<T>;\n try {\n promise = typeof input === 'function' ? input() : input;\n } catch (error) {\n promise = Promise.reject(error);\n }\n\n const { id: requestedId, ...base } = options;\n const loadingPatch = toPatch(messages.loading);\n\n const id: ToastId = store.add({\n ...base,\n id: requestedId,\n ...loadingPatch,\n type: 'loading',\n duration: 0,\n });\n\n const settle = (type: 'success' | 'error', raw: unknown, payload: unknown): void => {\n const desc =\n typeof messages.description === 'function'\n ? messages.description(\n type === 'success'\n ? { status: type, value: payload as T }\n : { status: type, error: payload },\n )\n : messages.description;\n store.update(id, {\n duration: base.duration ?? store.config.get().duration,\n ...toPatch(raw as string | ToastPatch),\n type,\n ...(desc !== undefined ? { description: desc } : {}),\n resetTimer: true,\n });\n };\n\n promise\n .then((value) => {\n if (messages.success === undefined) {\n store.dismiss(id);\n } else {\n settle(\n 'success',\n typeof messages.success === 'function' ? messages.success(value) : messages.success,\n value,\n );\n }\n })\n .catch((error: unknown) => {\n settle(\n 'error',\n messages.error === undefined\n ? errorText(error)\n : typeof messages.error === 'function'\n ? messages.error(error)\n : messages.error,\n error,\n );\n })\n .finally(() => {\n try {\n void messages.finally?.();\n } catch (err) {\n console.error(err);\n }\n });\n\n return {\n id,\n unwrap: () => promise,\n };\n}\n","import { runPromiseToast } from './promise';\nimport type { ToastStore } from './toast-manager';\nimport type {\n PromiseHandle,\n PromiseMessage,\n PromiseMessages,\n PromiseOutcome,\n Renderable,\n ToastCustomRenderer,\n ToastId,\n ToastOptions,\n ToastPatch,\n ToastRecord,\n} from './types';\nimport type { TypeRegistry } from './types-registry';\n\nexport type { PromiseHandle, PromiseMessage, PromiseMessages, PromiseOutcome };\n\n/** Callable toast function shape shared by all entry points. */\nexport type ToastFn = (message?: Renderable, options?: ToastOptions) => ToastId;\n\n/** The `ui.toast` API. */\nexport interface ToastApi extends ToastFn {\n /** Success toast. */\n success: ToastFn;\n /** Error toast. Uses an assertive live region. */\n error: ToastFn;\n /** Informational toast. */\n info: ToastFn;\n /** Warning toast. */\n warning: ToastFn;\n /** Loading toast with indefinite duration. */\n loading: ToastFn;\n /** Neutral message toast. */\n message: ToastFn;\n /** Custom renderer. */\n custom: (renderer: ToastCustomRenderer, options?: ToastOptions) => ToastId;\n /** Updates an existing toast. */\n update: (id: ToastId, patch: ToastPatch) => boolean;\n /** Dismisses one toast, or all when id is omitted. */\n dismiss: (id?: ToastId) => void;\n /** Dismisses every toast in every region. */\n dismissAll: () => void;\n /** Tracks a promise with loading, success and error states. */\n promise: <T>(\n input: Promise<T> | (() => Promise<T>),\n messages: PromiseMessages<T>,\n options?: ToastOptions,\n ) => PromiseHandle<T>;\n /** Returns a snapshot of active and queued toasts. */\n getToasts: () => readonly ToastRecord[];\n /** Returns closed toasts up to `config.historyLimit`. */\n getHistory: () => readonly ToastRecord[];\n /** Registry of custom toast types. */\n readonly types: TypeRegistry;\n}\n\n/** Builds the `ui.toast` API on top of a store/manager. */\nexport function createToastApi(store: ToastStore): ToastApi {\n const make =\n (type?: ToastOptions['type']): ToastFn =>\n (message, options = {}) => {\n const input: ToastOptions = { type, ...options };\n if (options.type !== undefined) input.type = options.type;\n if (message !== undefined) {\n if (options.title === undefined) input.title = message;\n else if (options.description === undefined) input.description = message;\n }\n return store.add(input);\n };\n\n const api = make() as ToastApi;\n api.success = make('success');\n api.error = make('error');\n api.info = make('info');\n api.warning = make('warning');\n api.loading = make('loading');\n api.message = make('message');\n\n api.custom = (renderer, options) => store.add({ ...options, custom: renderer });\n api.update = store.update;\n api.dismiss = store.dismiss;\n api.dismissAll = store.dismissAll;\n api.getToasts = store.getToasts;\n api.getHistory = store.getHistory;\n (api as unknown as { types: TypeRegistry }).types = store.types;\n api.promise = (input, messages, options) => runPromiseToast(store, input, messages, options);\n\n return api;\n}\n","export { defaultClock } from './clock';\nexport type { Clock } from './clock';\n\nexport { nextId, normalizeId, resetIdCounter } from './ids';\n\nexport { createStore } from './store';\nexport type { Store } from './types';\n\nexport { createTimer } from './timer';\nexport type { PausableTimer } from './timer';\n\nexport { createTypeRegistry } from './types-registry';\nexport type { TypeRegistry } from './types-registry';\n\nexport {\n decideAriaLive,\n decideDialogLabels,\n decideDialogRole,\n decideFocusTarget,\n decideToastRole,\n} from './a11y-rules';\n\nexport { createConfigStore, DEFAULT_CONFIG, resolvePrecedence } from './config';\nexport type { ConfigStore } from './config';\n\nexport { createToastManager, createToastStore, MANUAL_PAUSE } from './toast-manager';\nexport type { AddToastInput, ToastManager, ToastManagerOptions, ToastStore } from './toast-manager';\n\nexport { runPromiseToast } from './promise';\n\nexport { createDialogManager } from './dialog-manager';\nexport type { DialogManager, DialogQueueItem, HeadlessDialogController } from './dialog-manager';\n\nexport { createDialogController, runSteps } from './dialog';\nexport type { DialogController, DialogPromise, StepsResult } from './dialog';\n\nexport { createToastApi } from './toast-api';\nexport type {\n PromiseHandle,\n PromiseMessage,\n PromiseMessages,\n PromiseOutcome,\n ToastApi,\n ToastFn,\n} from './toast-api';\n\nexport type * from './types';\n\nimport type { Clock } from './clock';\nimport { defaultClock } from './clock';\nimport type { ConfigStore } from './config';\nimport { createConfigStore } from './config';\nimport { runSteps } from './dialog';\nimport type { StepsResult } from './dialog';\nimport { createDialogManager } from './dialog-manager';\nimport type { DialogManager } from './dialog-manager';\nimport { createToastManager } from './toast-manager';\nimport type { ToastStore } from './toast-manager';\nimport { createToastApi } from './toast-api';\nimport type { ToastApi } from './toast-api';\nimport type {\n BottomSheetHandle,\n BottomSheetOptions,\n DialogHandle,\n DialogOptions,\n DialogResult,\n GlazeConfig,\n LoadingHandle,\n LoadingOptions,\n SheetOptions,\n ToastRecord,\n} from './types';\n\n/**\n * Renderer interface for bridging the framework-agnostic core to UI adapters.\n * If a call happens before a renderer is registered, it queues and replays upon registration.\n */\nexport interface Renderer {\n openDialog?(options: DialogOptions, handle: DialogHandle): Promise<DialogResult> | undefined;\n openSheet?(options: SheetOptions): Promise<DialogResult>;\n openBottomSheet?(options: BottomSheetOptions): BottomSheetHandle;\n openLoading?(options: LoadingOptions): LoadingHandle;\n mountToast?(record: ToastRecord): void;\n}\n\n/** Complete framework-agnostic UI feedback toolkit. */\nexport interface CoreUI {\n /** Toast notifications API. */\n readonly toast: ToastApi;\n /** Global configuration store. */\n readonly config: ConfigStore;\n /** Toast state manager. */\n readonly toastStore: ToastStore;\n /** Headless dialog manager. */\n readonly dialogManager: DialogManager;\n\n /** Opens a confirm dialog. */\n confirm(options: DialogOptions | string): Promise<DialogResult>;\n /** Opens an informational alert dialog. */\n alert(options: DialogOptions | string): Promise<DialogResult>;\n /** Opens a prompt dialog for user text/value input. */\n prompt(options: DialogOptions | string): Promise<DialogResult>;\n /** Runs a multi-step dialog sequence. */\n steps(steps: readonly DialogOptions[], backLabel?: string): Promise<StepsResult>;\n /** Opens an action sheet. */\n sheet(options: SheetOptions): Promise<DialogResult>;\n /** Opens a bottom sheet. */\n bottomSheet(options: BottomSheetOptions): BottomSheetHandle;\n /** Opens a loading overlay. */\n loading(options?: LoadingOptions | string): LoadingHandle;\n\n /** Merges global configuration. */\n configure(patch: Partial<GlazeConfig>): Readonly<GlazeConfig>;\n /** Returns the current configuration snapshot. */\n getConfig(): Readonly<GlazeConfig>;\n /** Clears all active toasts and dialogs. */\n clear(): void;\n\n /** Registers a concrete UI renderer, replaying any calls queued during hydration. */\n registerRenderer(renderer: Renderer): void;\n /** Returns the active renderer if registered. */\n getRenderer(): Renderer | undefined;\n}\n\nexport interface CreateUIOptions {\n config?: ConfigStore;\n clock?: Clock;\n}\n\n/**\n * Creates an isolated, framework-agnostic CoreUI instance.\n * Useful for multi-tenant applications, microfrontends, and isolated tests.\n */\nexport function createUI(options: CreateUIOptions = {}): CoreUI {\n const clock = options.clock ?? defaultClock;\n const config = options.config ?? createConfigStore();\n const toastStore = createToastManager({ config, clock });\n const toast = createToastApi(toastStore);\n const dialogManager = createDialogManager(clock);\n\n let activeRenderer: Renderer | undefined;\n const replayQueue: (() => void)[] = [];\n\n const toDialogOptions = (opts: DialogOptions | string): DialogOptions =>\n typeof opts === 'string' ? { title: opts } : { ...opts };\n\n const runDlg = (merged: DialogOptions): Promise<DialogResult> => {\n const handle = dialogManager.open(merged);\n if (activeRenderer?.openDialog) void activeRenderer.openDialog(merged, handle);\n else replayQueue.push(() => void activeRenderer?.openDialog?.(merged, handle));\n return handle.result;\n };\n\n const DISMISSED: DialogResult = {\n isConfirmed: false,\n isDenied: false,\n isDismissed: true,\n value: undefined,\n dismiss: 'close',\n };\n\n const ui: CoreUI = {\n toast,\n config,\n toastStore,\n dialogManager,\n\n confirm: (opts) =>\n runDlg({\n confirmButton: { show: true },\n cancelButton: { show: true },\n ...toDialogOptions(opts),\n }),\n\n alert: (opts) =>\n runDlg({\n confirmButton: { show: true },\n cancelButton: { show: false },\n denyButton: { show: false },\n ...toDialogOptions(opts),\n }),\n\n prompt: (opts) =>\n runDlg({\n input: 'text',\n confirmButton: { show: true },\n cancelButton: { show: true },\n ...toDialogOptions(opts),\n }),\n\n steps(stepList, backLabel = 'Back') {\n return runSteps(stepList, (s) => ui.confirm(s), backLabel);\n },\n\n sheet: (opts) =>\n activeRenderer?.openSheet\n ? activeRenderer.openSheet(opts)\n : new Promise((res) => {\n replayQueue.push(() =>\n activeRenderer?.openSheet\n ? void activeRenderer.openSheet(opts).then(res)\n : res(DISMISSED),\n );\n }),\n\n bottomSheet(opts) {\n if (activeRenderer?.openBottomSheet) return activeRenderer.openBottomSheet(opts);\n let live: BottomSheetHandle | undefined;\n return {\n body: undefined,\n close: (r) => live?.close(r),\n snapTo: (i) => live?.snapTo(i),\n update: (p) => live?.update(p),\n result: new Promise((res) => {\n replayQueue.push(() =>\n activeRenderer?.openBottomSheet\n ? void (live = activeRenderer.openBottomSheet(opts)).result.then(res)\n : res(DISMISSED),\n );\n }),\n };\n },\n\n loading(loadingOpts = {}) {\n const opts = typeof loadingOpts === 'string' ? { text: loadingOpts } : loadingOpts;\n if (activeRenderer?.openLoading) return activeRenderer.openLoading(opts);\n let live: LoadingHandle | undefined, done: () => void;\n const closed = new Promise<void>((res) => {\n done = res;\n });\n replayQueue.push(() =>\n activeRenderer?.openLoading\n ? void (live = activeRenderer.openLoading(opts)).closed.then(done)\n : done(),\n );\n return {\n update: (p) => live?.update(p),\n close: () => {\n live?.close();\n done();\n },\n closed,\n };\n },\n\n configure: (patch) => config.set(patch),\n getConfig: () => config.get(),\n\n clear() {\n toastStore.clear();\n dialogManager.clear();\n replayQueue.length = 0;\n },\n\n registerRenderer(renderer) {\n activeRenderer = renderer;\n while (replayQueue.length > 0) {\n const replay = replayQueue.shift();\n replay?.();\n }\n },\n\n getRenderer: () => activeRenderer,\n };\n\n return ui;\n}\n\nlet defaultUI: CoreUI | undefined;\nconst def = (): CoreUI => (defaultUI ??= createUI());\n\n/** Default singleton instance of the CoreUI toolkit. */\nexport const ui: CoreUI = {\n get toast() {\n return def().toast;\n },\n get config() {\n return def().config;\n },\n get toastStore() {\n return def().toastStore;\n },\n get dialogManager() {\n return def().dialogManager;\n },\n confirm: (o) => def().confirm(o),\n alert: (o) => def().alert(o),\n prompt: (o) => def().prompt(o),\n steps: (s, b) => def().steps(s, b),\n sheet: (o) => def().sheet(o),\n bottomSheet: (o) => def().bottomSheet(o),\n loading: (o) => def().loading(o),\n configure: (p) => def().configure(p),\n getConfig: () => def().getConfig(),\n clear: () => def().clear(),\n registerRenderer: (r) => def().registerRenderer(r),\n getRenderer: () => def().getRenderer(),\n};\n\n/** Registers the renderer with the default UI instance. */\nexport function registerRenderer(renderer: Renderer): void {\n def().registerRenderer(renderer);\n}\n\n/** Backward-compatible ToastEngine interface. */\nexport interface ToastEngine {\n store: ToastStore;\n toast: ToastApi;\n}\n\n/** Backward-compatible factory for ToastEngine. */\nexport function createToastEngine(options: { config?: ConfigStore } = {}): ToastEngine {\n const store = createToastManager({ config: options.config });\n return { store, toast: createToastApi(store) };\n}\n","import React, { useEffect, useMemo, useState } from 'react';\nimport type {\n GlazeConfig,\n ToastApi,\n ToastOptions,\n ToastRecord,\n ToastStore,\n Unsubscribe,\n} from '../core';\nimport { createToastEngine } from '../core';\n\n/** Native engine holder for React Native environments. */\nlet nativeEngine: { store: ToastStore; toast: ToastApi } | undefined;\n\nfunction getNativeEngine(): { store: ToastStore; toast: ToastApi } {\n if (!nativeEngine) {\n nativeEngine = createToastEngine();\n }\n return nativeEngine;\n}\n\n/** Triggers optional haptic feedback on supported Expo devices. */\nasync function triggerHaptic(type: string): Promise<void> {\n try {\n // Dynamic optional import for expo-haptics\n // @ts-expect-error expo-haptics is an optional peer dependency that may not be installed at compile time\n const Haptics = await import('expo-haptics');\n if (!Haptics) return;\n if (type === 'success') {\n await Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success);\n } else if (type === 'error') {\n await Haptics.notificationAsync(Haptics.NotificationFeedbackType.Error);\n } else if (type === 'warning') {\n await Haptics.notificationAsync(Haptics.NotificationFeedbackType.Warning);\n } else {\n await Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light);\n }\n } catch {\n // expo-haptics is an optional peer dependency, gracefully ignore when not installed\n }\n}\n\n/**\n * Creates the React Native `toast` API with haptics integration.\n */\nfunction createNativeToastApi(): ToastApi {\n const engine = getNativeEngine();\n const baseToast = engine.toast;\n\n const wrap =\n (fn: (msg?: unknown, opts?: ToastOptions) => string | number) =>\n (msg?: unknown, opts: ToastOptions = {}) => {\n const type = opts.type ?? 'default';\n void triggerHaptic(type);\n return fn(msg, opts);\n };\n\n const nativeApi = wrap(baseToast) as ToastApi;\n nativeApi.success = wrap(baseToast.success);\n nativeApi.error = wrap(baseToast.error);\n nativeApi.info = wrap(baseToast.info);\n nativeApi.warning = wrap(baseToast.warning);\n nativeApi.loading = wrap(baseToast.loading);\n nativeApi.message = wrap(baseToast.message);\n\n nativeApi.promise = baseToast.promise;\n nativeApi.custom = baseToast.custom;\n nativeApi.update = baseToast.update;\n nativeApi.dismiss = baseToast.dismiss;\n nativeApi.dismissAll = baseToast.dismissAll;\n nativeApi.getToasts = baseToast.getToasts;\n nativeApi.getHistory = baseToast.getHistory;\n Object.defineProperty(nativeApi, 'types', { value: baseToast.types, enumerable: true });\n\n return nativeApi;\n}\n\n/** Native toast API. */\nexport const toast: ToastApi = createNativeToastApi();\n\n/** Configuration function for React Native. */\nexport function configure(patch: Partial<GlazeConfig>): Readonly<GlazeConfig> {\n return getNativeEngine().store.config.set(patch);\n}\n\n/** Resets the native engine for tests. */\nexport function resetNativeEngine(): void {\n if (nativeEngine) {\n nativeEngine.store.clear();\n nativeEngine.store.clearHistory();\n nativeEngine.store.config.reset();\n }\n}\n\n/** Native UI namespace. */\nexport const ui = {\n toast,\n configure,\n reset: resetNativeEngine,\n};\n\nexport interface NativeToasterProps {\n /** Toast placement. Defaults to 'top'. */\n position?: 'top' | 'bottom' | 'center';\n /** Optional top/bottom inset offset. */\n offset?: number;\n /** Toast container style. */\n style?: Record<string, unknown>;\n}\n\nexport interface GlazeProviderProps {\n children?: React.ReactNode;\n}\n\n/** Root provider for React Native toastory overlay hosting. */\nexport function GlazeProvider({ children }: GlazeProviderProps): React.JSX.Element {\n return <>{children}</>;\n}\n\n/**\n * React Native Toast Renderer component.\n * Renders glass toasts with optional Expo BlurView and gesture animations.\n */\nexport function Toaster(props: NativeToasterProps): React.JSX.Element | null {\n const [toastsList, setToastsList] = useState<readonly ToastRecord[]>([]);\n\n useEffect(() => {\n const engine = getNativeEngine();\n setToastsList(engine.store.getToasts());\n const unsub: Unsubscribe = engine.store.subscribe(() => {\n setToastsList(engine.store.getToasts());\n });\n return () => unsub();\n }, []);\n\n const visibleToasts = useMemo(() => toastsList.filter((t) => t.visible), [toastsList]);\n\n if (visibleToasts.length === 0) return null;\n\n const position = props.position ?? 'top';\n const posStyle: React.CSSProperties =\n position === 'bottom'\n ? { bottom: props.offset ?? 50 }\n : position === 'center'\n ? { top: '50%', transform: 'translateY(-50%)' }\n : { top: props.offset ?? 50 };\n\n return (\n <div\n style={\n {\n position: 'absolute',\n ...posStyle,\n left: 16,\n right: 16,\n zIndex: 99999,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: 8,\n ...props.style,\n } as React.CSSProperties\n }\n >\n {visibleToasts.map((item) => (\n <div\n key={String(item.id)}\n style={\n {\n backgroundColor: 'rgba(28, 28, 30, 0.88)',\n padding: 14,\n borderRadius: 16,\n minWidth: 200,\n maxWidth: '100%',\n boxShadow: '0 8px 24px rgba(0, 0, 0, 0.25)',\n display: 'flex',\n flexDirection: 'column',\n gap: 4,\n } as React.CSSProperties\n }\n >\n {item.badge ? (\n <div\n style={\n {\n fontSize: 11,\n fontWeight: '600',\n color: '#38bdf8',\n textTransform: 'uppercase',\n letterSpacing: '0.04em',\n } as React.CSSProperties\n }\n >\n {typeof item.badge === 'string'\n ? item.badge\n : ((item.badge as { label?: string }).label ?? '')}\n </div>\n ) : null}\n {item.title ? (\n <div style={{ color: '#fff', fontWeight: '600', fontSize: 15 }}>\n {String(item.title)}\n </div>\n ) : null}\n {item.description ? (\n <div style={{ color: '#aaa', fontSize: 13, marginTop: 2 }}>\n {String(item.description)}\n </div>\n ) : null}\n {item.progressValue !== undefined ? (\n <div\n style={\n {\n height: 3,\n backgroundColor: 'rgba(255,255,255,0.15)',\n borderRadius: 3,\n marginTop: 6,\n overflow: 'hidden',\n } as React.CSSProperties\n }\n >\n <div\n style={\n {\n height: '100%',\n width: `${Math.round(item.progressValue * 100)}%`,\n backgroundColor: '#38bdf8',\n } as React.CSSProperties\n }\n />\n </div>\n ) : null}\n {item.actions && item.actions.length > 0 ? (\n <div\n style={\n {\n display: 'flex',\n gap: 8,\n marginTop: 8,\n justifyContent: 'flex-end',\n } as React.CSSProperties\n }\n >\n {item.actions.map((act, i) => (\n <button\n key={i}\n type=\"button\"\n onClick={act.onClick ? (e) => act.onClick?.(e.nativeEvent) : undefined}\n style={\n {\n fontSize: 12,\n fontWeight: '600',\n padding: '4px 10px',\n borderRadius: 8,\n border: 'none',\n backgroundColor: 'rgba(255, 255, 255, 0.12)',\n color: '#fff',\n cursor: 'pointer',\n } as React.CSSProperties\n }\n >\n {act.label ?? act.text ?? 'Action'}\n </button>\n ))}\n </div>\n ) : null}\n </div>\n ))}\n </div>\n );\n}\n\n/** React Native hook for reactive toast state. */\nexport function useNativeToast(): {\n toast: ToastApi;\n toasts: readonly ToastRecord[];\n} {\n const [toastsList, setToastsList] = useState<readonly ToastRecord[]>([]);\n\n useEffect(() => {\n const engine = getNativeEngine();\n setToastsList(engine.store.getToasts());\n return engine.store.subscribe(() => {\n setToastsList(engine.store.getToasts());\n });\n }, []);\n\n return { toast, toasts: toastsList };\n}\n"]}