@ailuracode/alpine-toast 0.1.1 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +52 -5
- package/dist/global.d.ts +18 -264
- package/dist/index.d.ts +392 -42
- package/dist/index.js +575 -395
- package/package.json +13 -8
- package/dist/index.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,26 +1,28 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ailuracode/alpine-toast",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"description": "Alpine.js in-app toast queue magic",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"author": "ailuracode",
|
|
8
|
+
"sideEffects": false,
|
|
8
9
|
"publishConfig": {
|
|
9
10
|
"access": "public"
|
|
10
11
|
},
|
|
11
12
|
"repository": {
|
|
12
13
|
"type": "git",
|
|
13
|
-
"url": "git+https://github.com/ailuracode/
|
|
14
|
+
"url": "git+https://github.com/ailuracode/alpinejs-toolkit.git",
|
|
14
15
|
"directory": "packages/toast"
|
|
15
16
|
},
|
|
16
17
|
"bugs": {
|
|
17
|
-
"url": "https://github.com/ailuracode/
|
|
18
|
+
"url": "https://github.com/ailuracode/alpinejs-toolkit/issues"
|
|
18
19
|
},
|
|
19
|
-
"homepage": "https://github.com/ailuracode/
|
|
20
|
+
"homepage": "https://github.com/ailuracode/alpinejs-toolkit/tree/master/packages/toast#readme",
|
|
20
21
|
"files": [
|
|
21
22
|
"dist",
|
|
22
23
|
"README.md"
|
|
23
24
|
],
|
|
25
|
+
"types": "./dist/global.d.ts",
|
|
24
26
|
"exports": {
|
|
25
27
|
".": {
|
|
26
28
|
"types": "./dist/index.d.ts",
|
|
@@ -30,16 +32,19 @@
|
|
|
30
32
|
"types": "./dist/global.d.ts"
|
|
31
33
|
}
|
|
32
34
|
},
|
|
33
|
-
"types": "./dist/global.d.ts",
|
|
34
35
|
"peerDependencies": {
|
|
35
|
-
"
|
|
36
|
-
"
|
|
36
|
+
"@ailuracode/alpine-core": "^0.2.0",
|
|
37
|
+
"alpinejs": "^3.0.0"
|
|
37
38
|
},
|
|
38
39
|
"peerDependenciesMeta": {
|
|
39
40
|
"@types/alpinejs": {
|
|
40
41
|
"optional": true
|
|
41
42
|
}
|
|
42
43
|
},
|
|
44
|
+
"devDependencies": {
|
|
45
|
+
"@types/alpinejs": "^3.13.11",
|
|
46
|
+
"@ailuracode/alpine-core": "0.2.0"
|
|
47
|
+
},
|
|
43
48
|
"keywords": [
|
|
44
49
|
"alpinejs",
|
|
45
50
|
"alpine",
|
|
@@ -49,7 +54,7 @@
|
|
|
49
54
|
"notifications"
|
|
50
55
|
],
|
|
51
56
|
"scripts": {
|
|
52
|
-
"build": "tsup src/index.ts --format esm --dts --clean --
|
|
57
|
+
"build": "tsup src/index.ts --format esm --dts --clean --out-dir dist && cp src/global.d.ts dist/global.d.ts",
|
|
53
58
|
"test": "vitest run --config ../../vitest.config.ts test"
|
|
54
59
|
}
|
|
55
60
|
}
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts","../src/config.ts","../src/store.ts","../src/magic.ts","../src/index.ts"],"sourcesContent":["/** Built-in Alpine store key for the toast queue. */\nexport const TOAST_STORE_KEY = \"toast\" as const;\n\nexport type ToastStoreKey = typeof TOAST_STORE_KEY;\n\n/** Built-in position used when none is provided. Map to CSS in your UI layer. */\nexport type DefaultToastPosition = \"bottom-right\";\n\n/** Union of `bottom-right` plus developer-defined positions from plugin options. */\nexport type ToastPosition<TPositions extends readonly string[] = readonly []> =\n | DefaultToastPosition\n | TPositions[number];\n\n/** Built-in variant used when none is provided. */\nexport type DefaultToastVariant = \"default\";\n\n/** Milliseconds before auto-dismiss, or `false` / `0` to keep the toast open. */\nexport type ToastDuration = number | false;\n\n/** Union of `default` plus developer-defined variants from plugin options. */\nexport type ToastVariant<TVariants extends readonly string[] = readonly []> =\n | DefaultToastVariant\n | TVariants[number];\n\nexport interface ToastAction {\n label: string;\n onClick?: () => void;\n}\n\nexport interface ToastPayload<\n TVariants extends readonly string[] = readonly [],\n TPositions extends readonly string[] = readonly [],\n TContent = unknown,\n> {\n /** Arbitrary payload for your renderer — objects, arrays, DOM refs, etc. */\n content?: TContent | null;\n /** Optional string shorthand; omit when using `content` only. */\n title?: string | null;\n description?: string | null;\n variant?: ToastVariant<TVariants>;\n position?: ToastPosition<TPositions>;\n duration?: ToastDuration;\n action?: ToastAction | null;\n /**\n * Optional dedupe key — use with `pushUnique` so only one active toast keeps this key.\n * Useful for undo flows and single-slot notices.\n */\n key?: string | null;\n}\n\nexport interface ToastItem<\n TVariants extends readonly string[] = readonly [],\n TPositions extends readonly string[] = readonly [],\n TContent = unknown,\n> {\n id: string;\n key: string | null;\n content: TContent | null;\n title: string | null;\n description: string | null;\n variant: ToastVariant<TVariants>;\n position: ToastPosition<TPositions>;\n duration: ToastDuration;\n action: ToastAction | null;\n removed: boolean;\n}\n\nexport type ToastPayloadWithoutVariant<\n TVariants extends readonly string[] = readonly [],\n TPositions extends readonly string[] = readonly [],\n TContent = unknown,\n> = Omit<ToastPayload<TVariants, TPositions, TContent>, \"variant\">;\n\nexport interface ToastPromiseOptions<TVariants extends readonly string[] = readonly []> {\n /** Loading toast title. Default: `\"Loading...\"`. */\n loading?: string;\n /** Error toast title. Default: `\"Error\"`. */\n error?: string;\n /** Auto-dismiss duration after success/error. Default: `4000`. */\n duration?: ToastDuration;\n loadingVariant?: ToastVariant<TVariants>;\n successVariant?: ToastVariant<TVariants>;\n errorVariant?: ToastVariant<TVariants>;\n}\n\nexport interface ToastPluginOptions<\n TVariants extends readonly string[] = readonly [],\n TPositions extends readonly string[] = readonly [],\n _TContent = unknown,\n> {\n /** Optional variant names — each registers a `$toast.<variant>()` shortcut. */\n variants?: TVariants;\n /** Optional position names — stored on each toast; style via your own CSS. */\n positions?: TPositions;\n /** Default toast position when omitted from a payload. */\n defaultPosition?: ToastPosition<TPositions>;\n /** Default auto-dismiss duration in milliseconds. */\n defaultDuration?: number;\n /** Promise flow defaults (`loading` → `success` / `error` variants and copy). */\n promise?: ToastPromiseOptions<TVariants>;\n /** Maximum toasts in the queue. `0` = unlimited. Default: `5`. */\n maxToasts?: number;\n /** Maximum toasts shown at once. Defaults to `maxToasts`. */\n maxVisible?: number;\n /** Listen for `toast` window events. Default: `true`. */\n listenToWindowEvents?: boolean;\n /** Internal store key. Default: `\"toast\"`. */\n storeKey?: ToastStoreKey;\n}\n\nexport interface ToastPromiseMessages<\n T = unknown,\n TVariant extends string = string,\n TContent = unknown,\n> {\n loading?: string;\n success?: string | ((data: T) => string);\n error?: string;\n loadingContent?: TContent;\n successContent?: TContent | ((data: T) => TContent);\n errorContent?: TContent;\n loadingVariant?: TVariant;\n successVariant?: TVariant;\n errorVariant?: TVariant;\n duration?: ToastDuration;\n}\n\n/** Async factory or an existing `Promise` / thenable passed to `$toast.promise`. */\nexport type ToastPromiseInput<T> = (() => Promise<T> | T) | Promise<T>;\n\nexport type ToastEventPayload<\n TVariants extends readonly string[] = readonly [],\n TPositions extends readonly string[] = readonly [],\n TContent = unknown,\n> = ToastPayload<TVariants, TPositions, TContent>;\n\nexport interface ToastStore<\n TVariants extends readonly string[] = readonly [],\n TPositions extends readonly string[] = readonly [],\n TContent = unknown,\n> {\n defaultPosition: ToastPosition<TPositions>;\n /** Positions with an independent toast stack each. */\n stackPositions: readonly ToastPosition<TPositions>[];\n maxToasts: number;\n maxVisible: number;\n items: ToastItem<TVariants, TPositions, TContent>[];\n push(payload?: ToastPayload<TVariants, TPositions, TContent>): string;\n /** Dismiss active toasts with the same `key`, then push. */\n pushUnique(key: string, payload?: ToastPayload<TVariants, TPositions, TContent>): string;\n update(id: string, payload?: Partial<ToastPayload<TVariants, TPositions, TContent>>): void;\n dismiss(id: string): void;\n /** Dismiss every toast in a position stack. */\n dismissAt(position: ToastPosition<TPositions>): void;\n /** Dismiss all toasts in every stack. */\n dismissAll(): void;\n /** Clear pending timers — call when tearing down the plugin or store. */\n destroy(): void;\n /** Toasts at `position`, newest first (includes exiting `removed` items). */\n itemsAt(position: ToastPosition<TPositions>): ToastItem<TVariants, TPositions, TContent>[];\n /** Timed stack at `position` (includes exiting `removed` items). */\n timedItemsAt(position: ToastPosition<TPositions>): ToastItem<TVariants, TPositions, TContent>[];\n /** Persistent stack at `position` (includes exiting `removed` items). */\n persistentItemsAt(\n position: ToastPosition<TPositions>\n ): ToastItem<TVariants, TPositions, TContent>[];\n /** Active timed toasts only — preferred for `x-for` render lists. */\n activeTimedItemsAt(\n position: ToastPosition<TPositions>\n ): ToastItem<TVariants, TPositions, TContent>[];\n /** Active persistent toasts only — preferred for `x-for` render lists. */\n activePersistentItemsAt(\n position: ToastPosition<TPositions>\n ): ToastItem<TVariants, TPositions, TContent>[];\n /** Whether the timed toast at `index` (within `timedItemsAt`) should render. */\n isVisibleAt(position: ToastPosition<TPositions>, index: number): boolean;\n}\n\nexport type ToastVariantMethods<\n TVariants extends readonly string[],\n TPositions extends readonly string[] = readonly [],\n TContent = unknown,\n> = {\n [K in TVariants[number]]: (\n titleOrPayload: string | ToastPayloadWithoutVariant<TVariants, TPositions, TContent>,\n options?: Omit<ToastPayloadWithoutVariant<TVariants, TPositions, TContent>, \"title\" | \"content\">\n ) => string;\n};\n\nexport type ToastMagic<\n TVariants extends readonly string[] = readonly [],\n TPositions extends readonly string[] = readonly [],\n TContent = unknown,\n> = {\n (title: string, options?: Omit<ToastPayload<TVariants, TPositions, TContent>, \"title\">): string;\n (payload: ToastPayload<TVariants, TPositions, TContent>): string;\n promise<T>(\n factoryOrPromise: ToastPromiseInput<T>,\n messages?: ToastPromiseMessages<T, ToastVariant<TVariants>, TContent>\n ): Promise<T>;\n dismiss(id: string): void;\n update(id: string, payload?: Partial<ToastPayload<TVariants, TPositions, TContent>>): void;\n /** Dismiss every toast in a position stack. */\n dismissAt(position: ToastPosition<TPositions>): void;\n /** Dismiss all toasts in every stack. */\n dismissAll(): void;\n /** Push after dismissing any active toast with the same `key`. */\n pushUnique(key: string, payload?: ToastPayload<TVariants, TPositions, TContent>): string;\n fromPayload(payload?: ToastEventPayload<TVariants, TPositions, TContent>): string;\n} & ToastVariantMethods<TVariants, TPositions, TContent>;\n\nexport type ResolvedPromiseConfig<TVariants extends readonly string[] = readonly []> = {\n loading: string;\n error: string;\n duration: ToastDuration;\n loadingVariant: ToastVariant<TVariants>;\n successVariant: ToastVariant<TVariants>;\n errorVariant: ToastVariant<TVariants>;\n};\n\nexport type ResolvedToastPluginConfig<\n TVariants extends readonly string[] = readonly [],\n TPositions extends readonly string[] = readonly [],\n> = {\n defaultPosition: ToastPosition<TPositions>;\n defaultDuration: number;\n maxToasts: number;\n maxVisible: number;\n listenToWindowEvents: boolean;\n storeKey: ToastStoreKey;\n variants: TVariants;\n positions: TPositions;\n promise: ResolvedPromiseConfig<TVariants>;\n};\n","import type {\n ResolvedPromiseConfig,\n ResolvedToastPluginConfig,\n ToastPluginOptions,\n ToastVariant,\n} from \"./types.js\";\nimport { TOAST_STORE_KEY } from \"./types.js\";\n\nconst DEFAULT_PLUGIN_OPTIONS = {\n defaultPosition: \"bottom-right\",\n defaultDuration: 4000,\n maxToasts: 5,\n listenToWindowEvents: true,\n} as const;\n\nfunction variantFromList<TVariants extends readonly string[]>(\n variants: TVariants,\n preferred: string\n): ToastVariant<TVariants> {\n if (variants.includes(preferred)) {\n return preferred as ToastVariant<TVariants>;\n }\n\n return \"default\";\n}\n\nfunction resolvePromiseConfig<TVariants extends readonly string[]>(\n variants: TVariants,\n promise: ToastPluginOptions<TVariants>[\"promise\"] = {}\n): ResolvedPromiseConfig<TVariants> {\n return {\n loading: promise.loading ?? \"Loading...\",\n error: promise.error ?? \"Error\",\n duration: promise.duration ?? 4000,\n loadingVariant: promise.loadingVariant ?? variantFromList(variants, \"loading\"),\n successVariant: promise.successVariant ?? variantFromList(variants, \"success\"),\n errorVariant: promise.errorVariant ?? variantFromList(variants, \"error\"),\n };\n}\n\n/** Resolves plugin options with defaults and queue limit rules. */\nexport function resolveToastPluginConfig<\n const TVariants extends readonly string[] = readonly [],\n const TPositions extends readonly string[] = readonly [],\n>(\n options: ToastPluginOptions<TVariants, TPositions> = {} as ToastPluginOptions<\n TVariants,\n TPositions\n >\n): ResolvedToastPluginConfig<TVariants, TPositions> {\n const variants = (options.variants ?? []) as TVariants;\n const positions = (options.positions ?? []) as TPositions;\n const maxToasts = options.maxToasts ?? DEFAULT_PLUGIN_OPTIONS.maxToasts;\n let maxVisible = options.maxVisible ?? maxToasts;\n\n if (maxToasts > 0 && maxVisible > maxToasts) {\n maxVisible = maxToasts;\n }\n\n return {\n defaultPosition: options.defaultPosition ?? DEFAULT_PLUGIN_OPTIONS.defaultPosition,\n defaultDuration: options.defaultDuration ?? DEFAULT_PLUGIN_OPTIONS.defaultDuration,\n maxToasts,\n maxVisible,\n listenToWindowEvents:\n options.listenToWindowEvents ?? DEFAULT_PLUGIN_OPTIONS.listenToWindowEvents,\n storeKey: options.storeKey ?? TOAST_STORE_KEY,\n variants,\n positions,\n promise: resolvePromiseConfig(variants, options.promise),\n };\n}\n\n/** Builds typed toast plugin options with inferred variant and position literals. */\nexport function toastOptions<\n const TVariants extends readonly string[] = readonly [],\n const TPositions extends readonly string[] = readonly [],\n TContent = unknown,\n>(\n options: ToastPluginOptions<TVariants, TPositions, TContent>\n): ToastPluginOptions<TVariants, TPositions, TContent> {\n return options;\n}\n\n/** Declares toast variant names with full literal inference. */\nexport function toastVariants<const T extends readonly string[]>(variants: T): T {\n return variants;\n}\n\n/** Declares toast position names with full literal inference. */\nexport function toastPositions<const T extends readonly string[]>(positions: T): T {\n return positions;\n}\n","import type { ToastDuration, ToastItem, ToastPayload, ToastPosition, ToastStore } from \"./types.js\";\n\nexport interface CreateToastStoreOptions<TPositions extends readonly string[] = readonly []> {\n defaultPosition?: ToastPosition<TPositions>;\n /** Declared positions — each gets its own stack. */\n positions?: TPositions;\n defaultDuration?: number;\n maxToasts?: number;\n maxVisible?: number;\n /** Reactive store accessor — required for Alpine auto-dismiss timers. */\n getStore?: () => ToastStore<readonly [], TPositions, unknown>;\n}\n\nexport function resolveToastLimits(options: { maxToasts?: number; maxVisible?: number } = {}): {\n maxToasts: number;\n maxVisible: number;\n} {\n const maxToasts = options.maxToasts ?? 5;\n let maxVisible = options.maxVisible ?? maxToasts;\n\n if (maxToasts > 0 && maxVisible > maxToasts) {\n maxVisible = maxToasts;\n }\n\n return { maxToasts, maxVisible };\n}\n\n/** Unique stack keys: built-in default plus configured positions. */\nexport function resolveStackPositions<TPositions extends readonly string[]>(\n defaultPosition: ToastPosition<TPositions>,\n positions?: TPositions\n): readonly ToastPosition<TPositions>[] {\n const stacks: ToastPosition<TPositions>[] = [defaultPosition];\n\n for (const position of positions ?? []) {\n if (!stacks.includes(position as ToastPosition<TPositions>)) {\n stacks.push(position as ToastPosition<TPositions>);\n }\n }\n\n return stacks;\n}\n\nfunction createToastId(): string {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n\n return `toast-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n}\n\n/** Canonical persistent value — `0` is normalized to `false`. */\nexport function normalizeToastDuration(duration: ToastDuration): ToastDuration {\n if (duration === 0) {\n return false;\n }\n\n return duration;\n}\n\n/** Resolves payload duration — `false` / `0` persist; `undefined` uses the default. */\nexport function resolveToastDuration(\n duration: ToastDuration | undefined,\n defaultDuration: number\n): ToastDuration {\n if (duration === undefined) {\n return normalizeToastDuration(defaultDuration);\n }\n\n return normalizeToastDuration(duration);\n}\n\n/** Whether the toast should schedule an auto-dismiss timer. */\nexport function shouldAutoDismiss(duration: ToastDuration): duration is number {\n return typeof duration === \"number\" && duration > 0 && Number.isFinite(duration);\n}\n\n/** Persistent toasts (`duration: false` / `0`) use a separate UI stack from timed toasts. */\nexport function isPersistentDuration(duration: ToastDuration): boolean {\n return !shouldAutoDismiss(duration);\n}\n\n/**\n * Timed duration for `$toast.promise` loading state.\n * Stays in the timed stack; the timer is replaced when the promise settles.\n */\nexport const PROMISE_LOADING_DURATION = 3_600_000;\n\nfunction itemsAtPosition<\n TVariants extends readonly string[],\n TPositions extends readonly string[],\n TContent = unknown,\n>(\n items: ToastItem<TVariants, TPositions, TContent>[],\n position: ToastPosition<TPositions>\n): ToastItem<TVariants, TPositions, TContent>[] {\n return items.filter((item) => item.position === position);\n}\n\nfunction timedStackAt<\n TVariants extends readonly string[],\n TPositions extends readonly string[],\n TContent = unknown,\n>(\n items: ToastItem<TVariants, TPositions, TContent>[],\n position: ToastPosition<TPositions>\n): ToastItem<TVariants, TPositions, TContent>[] {\n return itemsAtPosition(items, position).filter((item) => shouldAutoDismiss(item.duration));\n}\n\nfunction persistentStackAt<\n TVariants extends readonly string[],\n TPositions extends readonly string[],\n TContent = unknown,\n>(\n items: ToastItem<TVariants, TPositions, TContent>[],\n position: ToastPosition<TPositions>\n): ToastItem<TVariants, TPositions, TContent>[] {\n return itemsAtPosition(items, position).filter((item) => isPersistentDuration(item.duration));\n}\n\nfunction enforcePositionLimit<\n TVariants extends readonly string[],\n TPositions extends readonly string[],\n TContent = unknown,\n>(\n items: ToastItem<TVariants, TPositions, TContent>[],\n position: ToastPosition<TPositions>,\n maxToasts: number,\n dismissMany: (ids: string[]) => void,\n stack: \"timed\" | \"persistent\"\n): void {\n if (maxToasts <= 0) {\n return;\n }\n\n const stackAtPosition =\n stack === \"persistent\" ? persistentStackAt(items, position) : timedStackAt(items, position);\n const activeAtPosition = stackAtPosition.filter((item) => !item.removed);\n const overflowIds = activeAtPosition.slice(maxToasts).map((item) => item.id);\n\n dismissMany(overflowIds);\n}\n\nfunction applyToastPatch<TPositions extends readonly string[], TContent = unknown>(\n item: ToastItem<readonly [], TPositions, TContent>,\n payload: Partial<ToastPayload<readonly [], TPositions, TContent>>\n): ToastItem<readonly [], TPositions, TContent> {\n const next = { ...item };\n\n for (const [key, value] of Object.entries(payload) as [\n keyof ToastPayload<readonly [], TPositions, TContent>,\n ToastPayload<readonly [], TPositions, TContent>[keyof ToastPayload<\n readonly [],\n TPositions,\n TContent\n >],\n ][]) {\n if (value !== undefined) {\n if (key === \"duration\") {\n Object.assign(next, { duration: normalizeToastDuration(value as ToastDuration) });\n } else {\n Object.assign(next, { [key]: value });\n }\n }\n }\n\n return next;\n}\n\n/** Creates the internal reactive toast queue consumed by `$toast` and UI integrators. */\nexport function createToastStore<\n const TPositions extends readonly string[] = readonly [],\n TContent = unknown,\n>(\n options: CreateToastStoreOptions<TPositions> = {}\n): ToastStore<readonly [], TPositions, TContent> {\n const defaultPosition = options.defaultPosition ?? \"bottom-right\";\n const stackPositions = resolveStackPositions(defaultPosition, options.positions);\n const defaultDuration = options.defaultDuration ?? 4000;\n const { maxToasts, maxVisible } = resolveToastLimits(options);\n const dismissDelayMs = 400;\n const dismissTimers = new Map<string, ReturnType<typeof setTimeout>>();\n const purgeTimers = new Map<string, ReturnType<typeof setTimeout>>();\n const getStore = options.getStore;\n\n const store: ToastStore<readonly [], TPositions, TContent> = {\n defaultPosition,\n stackPositions,\n maxToasts,\n maxVisible,\n items: [],\n\n itemsAt(position) {\n return itemsAtPosition(this.items, position);\n },\n\n timedItemsAt(position) {\n return timedStackAt(this.items, position);\n },\n\n persistentItemsAt(position) {\n return persistentStackAt(this.items, position);\n },\n\n activeTimedItemsAt(position) {\n return this.timedItemsAt(position).filter((item) => !item.removed);\n },\n\n activePersistentItemsAt(position) {\n return this.persistentItemsAt(position).filter((item) => !item.removed);\n },\n\n isVisibleAt(position, index) {\n const stack = this.timedItemsAt(position);\n const item = stack[index];\n\n if (!item || item.removed) {\n return false;\n }\n\n if (this.maxVisible <= 0) {\n return true;\n }\n\n let rank = 0;\n\n for (let i = 0; i <= index; i++) {\n if (stack[i] && !stack[i].removed) {\n rank++;\n }\n }\n\n return rank <= this.maxVisible;\n },\n\n push(payload: ToastPayload<readonly [], TPositions, TContent> = {}) {\n const position = payload.position ?? this.defaultPosition;\n const id = createToastId();\n const toast: ToastItem<readonly [], TPositions, TContent> = {\n id,\n key: payload.key ?? null,\n content: payload.content ?? null,\n title: payload.title ?? null,\n description: payload.description ?? null,\n variant: payload.variant ?? \"default\",\n position,\n duration: resolveToastDuration(payload.duration, defaultDuration),\n action: payload.action ?? null,\n removed: false,\n };\n\n this.items = [toast, ...this.items];\n enforcePositionLimit(\n this.items,\n position,\n this.maxToasts,\n (ids) => markRemoved(ids),\n shouldAutoDismiss(toast.duration) ? \"timed\" : \"persistent\"\n );\n scheduleDismiss(id, toast.duration);\n\n return id;\n },\n\n pushUnique(key, payload: ToastPayload<readonly [], TPositions, TContent> = {}) {\n const activeIds = this.items\n .filter((item) => !item.removed && item.key === key)\n .map((item) => item.id);\n\n markRemoved(activeIds);\n\n return this.push({ ...payload, key });\n },\n\n update(id, payload: Partial<ToastPayload<readonly [], TPositions, TContent>> = {}) {\n const current = this.items.find((toast) => toast.id === id);\n if (!current) {\n return;\n }\n\n const previousPosition = current.position;\n const wasPersistent = isPersistentDuration(current.duration);\n\n this.items = this.items.map((item) =>\n item.id === id ? applyToastPatch(item, payload) : item\n );\n\n const updated = this.items.find((toast) => toast.id === id);\n if (!updated) {\n return;\n }\n\n const nextPosition = updated.position;\n const isNowPersistent = isPersistentDuration(updated.duration);\n const durationStackChanged =\n payload.duration !== undefined && wasPersistent !== isNowPersistent;\n const positionChanged = nextPosition !== previousPosition;\n\n if (positionChanged) {\n enforcePositionLimit(\n this.items,\n previousPosition,\n this.maxToasts,\n (ids) => markRemoved(ids),\n \"timed\"\n );\n enforcePositionLimit(\n this.items,\n previousPosition,\n this.maxToasts,\n (ids) => markRemoved(ids),\n \"persistent\"\n );\n }\n\n if (positionChanged || durationStackChanged) {\n enforcePositionLimit(\n this.items,\n nextPosition,\n this.maxToasts,\n (ids) => markRemoved(ids),\n \"timed\"\n );\n enforcePositionLimit(\n this.items,\n nextPosition,\n this.maxToasts,\n (ids) => markRemoved(ids),\n \"persistent\"\n );\n }\n\n if (payload.duration !== undefined) {\n scheduleDismiss(id, updated.duration);\n }\n },\n\n dismiss(id) {\n markRemoved([id]);\n },\n\n dismissAt(position) {\n const ids = this.itemsAt(position)\n .filter((item) => !item.removed)\n .map((item) => item.id);\n\n markRemoved(ids);\n },\n\n dismissAll() {\n const ids = this.items.filter((item) => !item.removed).map((item) => item.id);\n\n markRemoved(ids);\n },\n\n destroy() {\n for (const timer of dismissTimers.values()) {\n clearTimeout(timer);\n }\n\n dismissTimers.clear();\n\n for (const timer of purgeTimers.values()) {\n clearTimeout(timer);\n }\n\n purgeTimers.clear();\n },\n };\n\n function clearDismissTimer(id: string): void {\n const timer = dismissTimers.get(id);\n\n if (timer !== undefined) {\n clearTimeout(timer);\n dismissTimers.delete(id);\n }\n }\n\n function markRemoved(ids: string[]): void {\n if (ids.length === 0) {\n return;\n }\n\n const activeStore = getStore?.() ?? store;\n const idsToRemove: string[] = [];\n\n for (const id of ids) {\n const toast = activeStore.items.find((item) => item.id === id);\n\n if (!toast || toast.removed) {\n continue;\n }\n\n clearDismissTimer(id);\n idsToRemove.push(id);\n }\n\n if (idsToRemove.length === 0) {\n return;\n }\n\n const removeSet = new Set(idsToRemove);\n\n activeStore.items = activeStore.items.map((item) =>\n removeSet.has(item.id) ? { ...item, removed: true } : item\n );\n\n const batchId = createToastId();\n\n const timer = setTimeout(() => {\n purgeTimers.delete(batchId);\n const storeForFilter = getStore?.() ?? store;\n storeForFilter.items = storeForFilter.items.filter((item) => !removeSet.has(item.id));\n }, dismissDelayMs);\n\n purgeTimers.set(batchId, timer);\n }\n\n function scheduleDismiss(id: string, duration: ToastDuration): void {\n clearDismissTimer(id);\n\n // Promise loading uses a sentinel duration — settled via `update`, not a timer.\n if (duration === PROMISE_LOADING_DURATION) {\n return;\n }\n\n if (shouldAutoDismiss(duration)) {\n const timer = setTimeout(() => {\n dismissTimers.delete(id);\n (getStore?.() ?? store).dismiss(id);\n }, duration);\n dismissTimers.set(id, timer);\n }\n }\n\n return store;\n}\n","import { PROMISE_LOADING_DURATION } from \"./store.js\";\nimport type {\n ResolvedToastPluginConfig,\n ToastDuration,\n ToastEventPayload,\n ToastMagic,\n ToastPayload,\n ToastPayloadWithoutVariant,\n ToastPromiseInput,\n ToastPromiseMessages,\n ToastStore,\n ToastVariant,\n} from \"./types.js\";\n\n/** Variant names that cannot override core `$toast` methods. */\nexport const RESERVED_TOAST_MAGIC_KEYS = new Set([\n \"dismiss\",\n \"update\",\n \"dismissAt\",\n \"dismissAll\",\n \"pushUnique\",\n \"fromPayload\",\n \"promise\",\n]);\n\nfunction pushToast<\n TVariants extends readonly string[],\n TPositions extends readonly string[] = readonly [],\n TContent = unknown,\n>(\n store: ToastStore<TVariants, TPositions, TContent>,\n titleOrPayload: string | ToastPayload<TVariants, TPositions, TContent>,\n options: Omit<ToastPayload<TVariants, TPositions, TContent>, \"title\"> = {}\n): string {\n if (typeof titleOrPayload === \"string\") {\n return store.push({\n title: titleOrPayload,\n ...options,\n });\n }\n\n return store.push(titleOrPayload);\n}\n\nfunction pushVariantToast<\n TVariants extends readonly string[],\n TPositions extends readonly string[] = readonly [],\n TContent = unknown,\n>(\n store: ToastStore<TVariants, TPositions, TContent>,\n variant: ToastVariant<TVariants>,\n titleOrPayload: string | ToastPayloadWithoutVariant<TVariants, TPositions, TContent>,\n options: Omit<\n ToastPayloadWithoutVariant<TVariants, TPositions, TContent>,\n \"title\" | \"content\"\n > = {}\n): string {\n if (typeof titleOrPayload === \"string\") {\n return store.push({\n title: titleOrPayload,\n ...options,\n variant,\n });\n }\n\n return store.push({\n ...titleOrPayload,\n ...options,\n variant,\n });\n}\n\nfunction resolveSuccessTitle<T>(data: T, messages: ToastPromiseMessages<T>): string | undefined {\n if (typeof messages.success === \"function\") {\n return messages.success(data);\n }\n\n return messages.success;\n}\n\nfunction resolveSuccessContent<T, TContent>(\n data: T,\n messages: ToastPromiseMessages<T, string, TContent>\n): TContent | undefined {\n const { successContent } = messages;\n\n if (typeof successContent === \"function\") {\n return (successContent as (value: T) => TContent)(data);\n }\n\n return successContent;\n}\n\nfunction resolveErrorTitle<T, V extends string = string>(\n messages: ToastPromiseMessages<T, V>,\n fallbackError: string\n): string {\n return messages.error ?? fallbackError;\n}\n\nfunction resolveToastPromise<T>(factoryOrPromise: ToastPromiseInput<T>): Promise<T> {\n if (typeof factoryOrPromise === \"function\") {\n return Promise.resolve(factoryOrPromise());\n }\n\n return Promise.resolve(factoryOrPromise);\n}\n\nfunction buildPromiseSuccessPatch<T, TContent, TVariants extends readonly string[]>(\n data: T,\n messages: ToastPromiseMessages<T, ToastVariant<TVariants>, TContent>,\n successVariant: ToastVariant<TVariants>,\n settledDuration: ToastDuration\n): Partial<ToastPayload<TVariants, readonly [], TContent>> {\n const successTitle = resolveSuccessTitle(data, messages);\n const successContent = resolveSuccessContent(data, messages);\n\n return {\n ...(successTitle !== undefined ? { title: successTitle } : {}),\n ...(successContent !== undefined ? { content: successContent } : {}),\n variant: successVariant,\n duration: settledDuration,\n };\n}\n\nfunction buildPromiseErrorPatch<T, TContent, TVariants extends readonly string[]>(\n messages: ToastPromiseMessages<T, ToastVariant<TVariants>, TContent>,\n promiseConfig: ResolvedToastPluginConfig<TVariants>[\"promise\"],\n errorVariant: ToastVariant<TVariants>,\n settledDuration: ToastDuration\n): Partial<ToastPayload<TVariants, readonly [], TContent>> {\n return {\n title: resolveErrorTitle(messages, promiseConfig.error),\n ...(messages.errorContent !== undefined ? { content: messages.errorContent } : {}),\n variant: errorVariant,\n duration: settledDuration,\n };\n}\n\n/** Builds the callable `$toast` magic API backed by the internal toast store. */\nexport function createToastMagic<\n const TVariants extends readonly string[],\n const TPositions extends readonly string[] = readonly [],\n TContent = unknown,\n>(\n config: ResolvedToastPluginConfig<TVariants, TPositions>,\n getStore: () => ToastStore<TVariants, TPositions, TContent>\n): ToastMagic<TVariants, TPositions, TContent> {\n const magic = ((\n titleOrPayload: string | ToastPayload<TVariants, TPositions, TContent>,\n options?: Omit<ToastPayload<TVariants, TPositions, TContent>, \"title\">\n ) => pushToast(getStore(), titleOrPayload, options ?? {})) as ToastMagic<\n TVariants,\n TPositions,\n TContent\n >;\n\n magic.dismiss = (id) => getStore().dismiss(id);\n magic.update = (id, payload) => getStore().update(id, payload);\n magic.dismissAt = (position) => getStore().dismissAt(position);\n magic.dismissAll = () => getStore().dismissAll();\n magic.pushUnique = (key, payload) => getStore().pushUnique(key, payload ?? {});\n\n magic.fromPayload = (payload: ToastEventPayload<TVariants, TPositions, TContent> = {}) => {\n const { title = null, content = null, variant = \"default\", ...options } = payload;\n\n return pushToast(getStore(), {\n title,\n content,\n variant,\n ...options,\n });\n };\n\n magic.promise = async <T>(\n factoryOrPromise: ToastPromiseInput<T>,\n messages: ToastPromiseMessages<T, ToastVariant<TVariants>, TContent> = {}\n ): Promise<T> => {\n const promiseConfig = config.promise;\n const loadingVariant = messages.loadingVariant ?? promiseConfig.loadingVariant;\n const successVariant = messages.successVariant ?? promiseConfig.successVariant;\n const errorVariant = messages.errorVariant ?? promiseConfig.errorVariant;\n const settledDuration = messages.duration ?? promiseConfig.duration;\n\n const id = getStore().push({\n title: messages.loading ?? promiseConfig.loading,\n content: messages.loadingContent ?? null,\n variant: loadingVariant,\n duration: PROMISE_LOADING_DURATION,\n });\n\n try {\n const data = await resolveToastPromise(factoryOrPromise);\n\n getStore().update(\n id,\n buildPromiseSuccessPatch(data, messages, successVariant, settledDuration)\n );\n\n return data;\n } catch (error) {\n getStore().update(\n id,\n buildPromiseErrorPatch(messages, promiseConfig, errorVariant, settledDuration)\n );\n\n throw error;\n }\n };\n\n for (const variant of config.variants) {\n if (RESERVED_TOAST_MAGIC_KEYS.has(variant)) {\n continue;\n }\n\n Object.assign(magic, {\n [variant]: (\n titleOrPayload: string | ToastPayloadWithoutVariant<TVariants, TPositions, TContent>,\n options: Omit<\n ToastPayloadWithoutVariant<TVariants, TPositions, TContent>,\n \"title\" | \"content\"\n > = {}\n ) =>\n pushVariantToast(getStore(), variant as ToastVariant<TVariants>, titleOrPayload, options),\n });\n }\n\n return magic;\n}\n","import type AlpineType from \"alpinejs\";\nimport { resolveToastPluginConfig } from \"./config.js\";\nimport { createToastMagic } from \"./magic.js\";\nimport { createToastStore } from \"./store.js\";\nimport type { ToastEventPayload, ToastPluginOptions, ToastStore, ToastStoreKey } from \"./types.js\";\n\nexport {\n resolveToastPluginConfig,\n toastOptions,\n toastPositions,\n toastVariants,\n} from \"./config.js\";\nexport { createToastMagic, RESERVED_TOAST_MAGIC_KEYS } from \"./magic.js\";\nexport {\n createToastStore,\n isPersistentDuration,\n normalizeToastDuration,\n PROMISE_LOADING_DURATION,\n resolveStackPositions,\n resolveToastDuration,\n resolveToastLimits,\n shouldAutoDismiss,\n} from \"./store.js\";\nexport type {\n DefaultToastPosition,\n DefaultToastVariant,\n ResolvedPromiseConfig,\n ResolvedToastPluginConfig,\n ToastAction,\n ToastDuration,\n ToastEventPayload,\n ToastItem,\n ToastMagic,\n ToastPayload,\n ToastPayloadWithoutVariant,\n ToastPluginOptions,\n ToastPosition,\n ToastPromiseInput,\n ToastPromiseMessages,\n ToastPromiseOptions,\n ToastStore,\n ToastStoreKey,\n ToastVariant,\n ToastVariantMethods,\n} from \"./types.js\";\n\nexport { TOAST_STORE_KEY } from \"./types.js\";\n\nfunction registerAlpineToastStore<TPositions extends readonly string[], TContent>(\n Alpine: AlpineType.Alpine,\n storeKey: ToastStoreKey,\n store: ToastStore<readonly [], TPositions, TContent>\n): void {\n const registerStore = Alpine.store as (name: ToastStoreKey, value: unknown) => void;\n registerStore(storeKey, store);\n}\n\nfunction getToastStore<\n TVariants extends readonly string[],\n TPositions extends readonly string[],\n TContent,\n>(Alpine: AlpineType.Alpine, storeKey: ToastStoreKey): ToastStore<TVariants, TPositions, TContent> {\n return Alpine.store(storeKey) as unknown as ToastStore<TVariants, TPositions, TContent>;\n}\n\nfunction registerToastPlugin<\n TVariants extends readonly string[],\n TPositions extends readonly string[] = readonly [],\n TContent = unknown,\n>(\n Alpine: AlpineType.Alpine,\n options: ToastPluginOptions<TVariants, TPositions, TContent> = {} as ToastPluginOptions<\n TVariants,\n TPositions,\n TContent\n >\n): void {\n const config = resolveToastPluginConfig(options);\n let reactiveStore: ToastStore<TVariants, TPositions, TContent> | undefined;\n let windowEventsAbort: AbortController | undefined;\n\n const store = createToastStore<TPositions, TContent>({\n defaultPosition: config.defaultPosition,\n positions: config.positions,\n defaultDuration: config.defaultDuration,\n maxToasts: config.maxToasts,\n maxVisible: config.maxVisible,\n getStore: (): ToastStore<readonly [], TPositions, TContent> =>\n (reactiveStore ?? store) as ToastStore<readonly [], TPositions, TContent>,\n });\n\n const baseDestroy = store.destroy.bind(store);\n\n store.destroy = () => {\n windowEventsAbort?.abort();\n windowEventsAbort = undefined;\n baseDestroy();\n };\n\n registerAlpineToastStore<TPositions, TContent>(Alpine, config.storeKey, store);\n reactiveStore = getToastStore<TVariants, TPositions, TContent>(Alpine, config.storeKey);\n const toast = createToastMagic(config, () =>\n getToastStore<TVariants, TPositions, TContent>(Alpine, config.storeKey)\n );\n Alpine.magic(\"toast\", () => toast);\n\n if (config.listenToWindowEvents && typeof window !== \"undefined\") {\n windowEventsAbort = new AbortController();\n\n window.addEventListener(\n \"toast\",\n (event) => {\n if (event instanceof CustomEvent) {\n toast.fromPayload(\n (event.detail ?? {}) as ToastEventPayload<TVariants, TPositions, TContent>\n );\n }\n },\n { signal: windowEventsAbort.signal }\n );\n }\n}\n\n/** Alpine.js toast plugin. Registers magic `$toast` with an internal reactive queue. CSS-framework agnostic — no markup or styles. */\nexport default function toastPlugin<\n const TVariants extends readonly string[] = readonly [],\n const TPositions extends readonly string[] = readonly [],\n TContent = unknown,\n>(\n optionsOrAlpine?: ToastPluginOptions<TVariants, TPositions, TContent> | AlpineType.Alpine\n): undefined | ((Alpine: AlpineType.Alpine) => void) {\n if (optionsOrAlpine && typeof (optionsOrAlpine as AlpineType.Alpine).magic === \"function\") {\n registerToastPlugin(optionsOrAlpine as AlpineType.Alpine, {});\n return;\n }\n\n const options =\n (optionsOrAlpine as ToastPluginOptions<TVariants, TPositions, TContent> | undefined) ?? {};\n\n return (Alpine: AlpineType.Alpine) => {\n registerToastPlugin(Alpine, options);\n };\n}\n\ndeclare global {\n namespace Alpine {\n interface Stores {\n toast: import(\"./types.js\").ToastStore;\n }\n interface Magics<T> {\n $toast: import(\"./types.js\").ToastMagic;\n }\n }\n}\n"],"mappings":"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","names":[]}
|