@rosadorito/vue-toast 0.0.1 → 0.0.3

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.
@@ -0,0 +1,3 @@
1
+ declare const _default: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
2
+ export default _default;
3
+ //# sourceMappingURL=VueToast.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VueToast.vue.d.ts","sourceRoot":"","sources":["../../../src/components/VueToast/VueToast.vue"],"names":[],"mappings":"AAkBA;;AAoOA,wBAKG"}
@@ -0,0 +1,4 @@
1
+ import { default as VueToast } from './VueToast.vue';
2
+ export { VueToast };
3
+ export default VueToast;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/VueToast/index.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAA;AAErC,OAAO,EAAE,QAAQ,EAAE,CAAA;AACnB,eAAe,QAAQ,CAAA"}
@@ -1,20 +1,15 @@
1
- import { Ref } from 'vue';
2
1
  import { ToastOptions, ToastPosition } from '../types';
3
- interface ToastInstance extends ToastOptions {
4
- id: string;
5
- timer?: ReturnType<typeof setTimeout>;
6
- }
7
2
  export declare function useToast(defaultPosition?: ToastPosition): {
8
- toasts: Ref<ToastInstance[], ToastInstance[]>;
9
- groupedToasts: import('vue').ComputedRef<Record<string, ToastInstance[]>>;
10
- addToast: (options: ToastOptions) => string;
11
- removeToast: (id: string) => void;
12
- clearToasts: () => void;
3
+ toasts: import('vue').Ref<import('../store/toastStore').ToastInstance[], import('../store/toastStore').ToastInstance[]>;
4
+ groupedToasts: import('vue').ComputedRef<Record<string, import('../store/toastStore').ToastInstance[]>>;
13
5
  success: (message: string, options?: Omit<ToastOptions, "message" | "type">) => string;
14
6
  error: (message: string, options?: Omit<ToastOptions, "message" | "type">) => string;
15
7
  warning: (message: string, options?: Omit<ToastOptions, "message" | "type">) => string;
16
8
  info: (message: string, options?: Omit<ToastOptions, "message" | "type">) => string;
9
+ addToast: (options: ToastOptions) => string;
10
+ removeToast: (id: string) => void;
11
+ clearToasts: () => void;
12
+ updateToast: (id: string, updates: Partial<ToastOptions>) => void;
17
13
  };
18
14
  export type UseToastReturn = ReturnType<typeof useToast>;
19
- export {};
20
15
  //# sourceMappingURL=useToast.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useToast.d.ts","sourceRoot":"","sources":["../../src/composables/useToast.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8B,KAAK,GAAG,EAAE,MAAM,KAAK,CAAA;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAE1D,UAAU,aAAc,SAAQ,YAAY;IAC1C,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,CAAC,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,CAAA;CACtC;AAED,wBAAgB,QAAQ,CAAC,eAAe,GAAE,aAA2B;;;wBAKxC,YAAY;sBAqBd,MAAM;;uBA6BL,MAAM,YAAW,IAAI,CAAC,YAAY,EAAE,SAAS,GAAG,MAAM,CAAC;qBAQzD,MAAM,YAAW,IAAI,CAAC,YAAY,EAAE,SAAS,GAAG,MAAM,CAAC;uBAQrD,MAAM,YAAW,IAAI,CAAC,YAAY,EAAE,SAAS,GAAG,MAAM,CAAC;oBAQ1D,MAAM,YAAW,IAAI,CAAC,YAAY,EAAE,SAAS,GAAG,MAAM,CAAC;EAqC/E;AAED,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAA"}
1
+ {"version":3,"file":"useToast.d.ts","sourceRoot":"","sources":["../../src/composables/useToast.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAG1D,wBAAgB,QAAQ,CAAC,eAAe,GAAE,aAA2B;;;uBAGzC,MAAM,YAAW,IAAI,CAAC,YAAY,EAAE,SAAS,GAAG,MAAM,CAAC;qBAQzD,MAAM,YAAW,IAAI,CAAC,YAAY,EAAE,SAAS,GAAG,MAAM,CAAC;uBAQrD,MAAM,YAAW,IAAI,CAAC,YAAY,EAAE,SAAS,GAAG,MAAM,CAAC;oBAQ1D,MAAM,YAAW,IAAI,CAAC,YAAY,EAAE,SAAS,GAAG,MAAM,CAAC;;;;;EA6B/E;AAED,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAA"}
package/dist/index.d.ts CHANGED
@@ -1,13 +1,14 @@
1
1
  import { App } from 'vue';
2
2
  import { default as Toast } from './components/Toast';
3
+ import { default as VueToast } from './components/VueToast';
3
4
  import { useToast } from './composables/useToast';
4
5
  import { ToastOptions, ToastPosition, ToastType } from './types';
5
- export { Toast, useToast };
6
+ export { Toast, VueToast, useToast };
6
7
  export type { ToastOptions, ToastPosition, ToastType };
7
- declare const VueToast: {
8
+ declare const VueToastPlugin: {
8
9
  install: (app: App, pluginOptions?: {
9
10
  defaultPosition?: ToastPosition;
10
11
  }) => void;
11
12
  };
12
- export default VueToast;
13
+ export default VueToastPlugin;
13
14
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,KAAK,CAAA;AAC9B,OAAO,KAAK,MAAM,oBAAoB,CAAA;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAErE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAA;AAC1B,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,CAAA;AAEtD,QAAA,MAAM,QAAQ;mBACG,GAAG,kBAAkB;QAAE,eAAe,CAAC,EAAE,aAAa,CAAA;KAAE;CA0BxE,CAAA;AAED,eAAe,QAAQ,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,KAAK,CAAA;AAC9B,OAAO,KAAK,MAAM,oBAAoB,CAAA;AACtC,OAAO,QAAQ,MAAM,uBAAuB,CAAA;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AAEjD,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAErE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAA;AACpC,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,CAAA;AAEtD,QAAA,MAAM,cAAc;mBACH,GAAG,kBAAkB;QAAE,eAAe,CAAC,EAAE,aAAa,CAAA;KAAE;CAgDxE,CAAA;AAED,eAAe,cAAc,CAAA"}
@@ -0,0 +1,18 @@
1
+ import { Ref } from 'vue';
2
+ import { ToastOptions, ToastPosition } from '../types';
3
+ export interface ToastInstance extends ToastOptions {
4
+ id: string;
5
+ timer?: ReturnType<typeof setTimeout>;
6
+ }
7
+ interface ToastStore {
8
+ toasts: Ref<ToastInstance[]>;
9
+ addToast: (options: ToastOptions) => string;
10
+ removeToast: (id: string) => void;
11
+ clearToasts: () => void;
12
+ updateToast: (id: string, updates: Partial<ToastOptions>) => void;
13
+ }
14
+ export declare const groupToasts: (toasts: ToastInstance[]) => Record<string, ToastInstance[]>;
15
+ export declare const getToastStore: (defaultPosition?: ToastPosition) => ToastStore;
16
+ export declare const resetToastStore: () => void;
17
+ export {};
18
+ //# sourceMappingURL=toastStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toastStore.d.ts","sourceRoot":"","sources":["../../src/store/toastStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,GAAG,EAAE,MAAM,KAAK,CAAA;AAC/C,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAa,MAAM,SAAS,CAAA;AAErE,MAAM,WAAW,aAAc,SAAQ,YAAY;IACjD,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,CAAC,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,CAAA;CACtC;AAED,UAAU,UAAU;IAClB,MAAM,EAAE,GAAG,CAAC,aAAa,EAAE,CAAC,CAAA;IAC5B,QAAQ,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,MAAM,CAAA;IAC3C,WAAW,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;IACjC,WAAW,EAAE,MAAM,IAAI,CAAA;IACvB,WAAW,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC,KAAK,IAAI,CAAA;CAClE;AAMD,eAAO,MAAM,WAAW,GAAI,QAAQ,aAAa,EAAE,KAAG,MAAM,CAAC,MAAM,EAAE,aAAa,EAAE,CAYnF,CAAA;AAiGD,eAAO,MAAM,aAAa,GAAI,kBAAiB,aAA2B,KAAG,UAK5E,CAAA;AAED,eAAO,MAAM,eAAe,QAAO,IAKlC,CAAA"}
@@ -1 +1 @@
1
- .vue-toast[data-v-38db861e]{position:relative;display:flex;align-items:center;justify-content:space-between;min-width:300px;max-width:500px;padding:12px 16px;margin-bottom:8px;border-radius:6px;box-shadow:0 4px 12px #00000026;background-color:#fff;color:#333;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-size:14px;line-height:1.4;animation:toast-slide-in-38db861e .3s ease-out;transition:transform .2s ease,opacity .2s ease;z-index:calc(1000 + var(--toast-index));cursor:pointer}.vue-toast[data-v-38db861e]:hover{transform:translateY(-1px);box-shadow:0 6px 16px #0003}.vue-toast--success[data-v-38db861e]{border-left:4px solid #10b981;background-color:#f0fdf4;color:#065f46}.vue-toast--error[data-v-38db861e]{border-left:4px solid #ef4444;background-color:#fef2f2;color:#991b1b}.vue-toast--warning[data-v-38db861e]{border-left:4px solid #f59e0b;background-color:#fffbeb;color:#92400e}.vue-toast--info[data-v-38db861e]{border-left:4px solid #3b82f6;background-color:#eff6ff;color:#1e40af}.vue-toast--default[data-v-38db861e]{border-left:4px solid #6b7280;background-color:#f9fafb;color:#374151}.vue-toast__content[data-v-38db861e]{flex:1;margin-right:8px}.vue-toast__message[data-v-38db861e]{word-break:break-word}.vue-toast__close[data-v-38db861e]{flex-shrink:0;background:none;border:none;padding:4px;margin-left:8px;cursor:pointer;color:inherit;opacity:.7;border-radius:4px;transition:opacity .2s ease,background-color .2s ease}.vue-toast__close[data-v-38db861e]:hover{opacity:1;background-color:#0000001a}.vue-toast__close[data-v-38db861e]:focus{outline:2px solid currentColor;outline-offset:2px}.vue-toast__close-icon[data-v-38db861e]{display:block}.vue-toast--topleft[data-v-38db861e]{position:fixed;top:20px;left:20px}.vue-toast--topcenter[data-v-38db861e]{position:fixed;top:20px;left:50%;transform:translate(-50%)}.vue-toast--topright[data-v-38db861e]{position:fixed;top:20px;right:20px}.vue-toast--bottomleft[data-v-38db861e]{position:fixed;bottom:20px;left:20px}.vue-toast--bottomcenter[data-v-38db861e]{position:fixed;bottom:20px;left:50%;transform:translate(-50%)}.vue-toast--bottomright[data-v-38db861e]{position:fixed;bottom:20px;right:20px}@keyframes toast-slide-in-38db861e{0%{opacity:0;transform:translateY(-20px)}to{opacity:1;transform:translateY(0)}}@media(max-width:640px){.vue-toast[data-v-38db861e]{min-width:calc(100vw - 40px);max-width:calc(100vw - 40px);margin-left:20px;margin-right:20px}.vue-toast--topleft[data-v-38db861e],.vue-toast--topcenter[data-v-38db861e],.vue-toast--topright[data-v-38db861e]{top:10px}.vue-toast--bottomleft[data-v-38db861e],.vue-toast--bottomcenter[data-v-38db861e],.vue-toast--bottomright[data-v-38db861e]{bottom:10px}}
1
+ .vue-toast[data-v-38db861e]{position:relative;display:flex;align-items:center;justify-content:space-between;min-width:300px;max-width:500px;padding:12px 16px;margin-bottom:8px;border-radius:6px;box-shadow:0 4px 12px #00000026;background-color:#fff;color:#333;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-size:14px;line-height:1.4;animation:toast-slide-in-38db861e .3s ease-out;transition:transform .2s ease,opacity .2s ease;z-index:calc(1000 + var(--toast-index));cursor:pointer}.vue-toast[data-v-38db861e]:hover{transform:translateY(-1px);box-shadow:0 6px 16px #0003}.vue-toast--success[data-v-38db861e]{border-left:4px solid #10b981;background-color:#f0fdf4;color:#065f46}.vue-toast--error[data-v-38db861e]{border-left:4px solid #ef4444;background-color:#fef2f2;color:#991b1b}.vue-toast--warning[data-v-38db861e]{border-left:4px solid #f59e0b;background-color:#fffbeb;color:#92400e}.vue-toast--info[data-v-38db861e]{border-left:4px solid #3b82f6;background-color:#eff6ff;color:#1e40af}.vue-toast--default[data-v-38db861e]{border-left:4px solid #6b7280;background-color:#f9fafb;color:#374151}.vue-toast__content[data-v-38db861e]{flex:1;margin-right:8px}.vue-toast__message[data-v-38db861e]{word-break:break-word}.vue-toast__close[data-v-38db861e]{flex-shrink:0;background:none;border:none;padding:4px;margin-left:8px;cursor:pointer;color:inherit;opacity:.7;border-radius:4px;transition:opacity .2s ease,background-color .2s ease}.vue-toast__close[data-v-38db861e]:hover{opacity:1;background-color:#0000001a}.vue-toast__close[data-v-38db861e]:focus{outline:2px solid currentColor;outline-offset:2px}.vue-toast__close-icon[data-v-38db861e]{display:block}.vue-toast--topleft[data-v-38db861e]{position:fixed;top:20px;left:20px}.vue-toast--topcenter[data-v-38db861e]{position:fixed;top:20px;left:50%;transform:translate(-50%)}.vue-toast--topright[data-v-38db861e]{position:fixed;top:20px;right:20px}.vue-toast--bottomleft[data-v-38db861e]{position:fixed;bottom:20px;left:20px}.vue-toast--bottomcenter[data-v-38db861e]{position:fixed;bottom:20px;left:50%;transform:translate(-50%)}.vue-toast--bottomright[data-v-38db861e]{position:fixed;bottom:20px;right:20px}@keyframes toast-slide-in-38db861e{0%{opacity:0;transform:translateY(-20px)}to{opacity:1;transform:translateY(0)}}@media(max-width:640px){.vue-toast[data-v-38db861e]{min-width:calc(100vw - 40px);max-width:calc(100vw - 40px);margin-left:20px;margin-right:20px}.vue-toast--topleft[data-v-38db861e],.vue-toast--topcenter[data-v-38db861e],.vue-toast--topright[data-v-38db861e]{top:10px}.vue-toast--bottomleft[data-v-38db861e],.vue-toast--bottomcenter[data-v-38db861e],.vue-toast--bottomright[data-v-38db861e]{bottom:10px}}.vue-toast-container[data-v-bcc3b5d0]{position:fixed;z-index:9999;pointer-events:none}.vue-toast-container--topleft[data-v-bcc3b5d0]{top:20px;left:20px}.vue-toast-container--topcenter[data-v-bcc3b5d0]{top:20px;left:50%;transform:translate(-50%)}.vue-toast-container--topright[data-v-bcc3b5d0]{top:20px;right:20px}.vue-toast-container--bottomleft[data-v-bcc3b5d0]{bottom:20px;left:20px}.vue-toast-container--bottomcenter[data-v-bcc3b5d0]{bottom:20px;left:50%;transform:translate(-50%)}.vue-toast-container--bottomright[data-v-bcc3b5d0]{bottom:20px;right:20px}@media(max-width:640px){.vue-toast-container--topleft[data-v-bcc3b5d0],.vue-toast-container--topcenter[data-v-bcc3b5d0],.vue-toast-container--topright[data-v-bcc3b5d0]{top:10px}.vue-toast-container--bottomleft[data-v-bcc3b5d0],.vue-toast-container--bottomcenter[data-v-bcc3b5d0],.vue-toast-container--bottomright[data-v-bcc3b5d0]{bottom:10px}.vue-toast-container--topleft[data-v-bcc3b5d0],.vue-toast-container--bottomleft[data-v-bcc3b5d0]{left:10px}.vue-toast-container--topright[data-v-bcc3b5d0],.vue-toast-container--bottomright[data-v-bcc3b5d0]{right:10px}.vue-toast-container--topcenter[data-v-bcc3b5d0],.vue-toast-container--bottomcenter[data-v-bcc3b5d0]{left:50%;transform:translate(-50%)}}
@@ -1,8 +1,8 @@
1
- import { defineComponent, computed, openBlock, createElementBlock, normalizeStyle, normalizeClass, createElementVNode, toDisplayString, withModifiers, createCommentVNode, ref, onUnmounted } from "vue";
1
+ import { defineComponent, computed, openBlock, createElementBlock, normalizeStyle, normalizeClass, createElementVNode, toDisplayString, withModifiers, createCommentVNode, shallowRef, Fragment, renderList, createBlock } from "vue";
2
2
  const _hoisted_1 = ["aria-label"];
3
3
  const _hoisted_2 = { class: "vue-toast__content" };
4
4
  const _hoisted_3 = { class: "vue-toast__message" };
5
- const _sfc_main = /* @__PURE__ */ defineComponent({
5
+ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
6
6
  __name: "Toast",
7
7
  props: {
8
8
  toast: {},
@@ -100,10 +100,21 @@ const _export_sfc = (sfc, props) => {
100
100
  }
101
101
  return target;
102
102
  };
103
- const Toast = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-38db861e"]]);
104
- function useToast(defaultPosition = "top-right") {
105
- const toasts = ref([]);
106
- const generateId = () => `toast-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
103
+ const Toast = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__scopeId", "data-v-38db861e"]]);
104
+ const generateId = () => `toast-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
105
+ const groupToasts = (toasts) => {
106
+ const groups = {};
107
+ toasts.forEach((toast) => {
108
+ const position = toast.position || "top-right";
109
+ if (!groups[position]) {
110
+ groups[position] = [];
111
+ }
112
+ groups[position].push(toast);
113
+ });
114
+ return groups;
115
+ };
116
+ const createToastStore = (defaultPosition = "top-right") => {
117
+ const toasts = shallowRef([]);
107
118
  const addToast = (options) => {
108
119
  const id = options.id || generateId();
109
120
  const toast = {
@@ -111,9 +122,10 @@ function useToast(defaultPosition = "top-right") {
111
122
  id,
112
123
  position: options.position || defaultPosition,
113
124
  duration: options.duration ?? 5e3,
114
- dismissible: options.dismissible ?? true
125
+ dismissible: options.dismissible ?? true,
126
+ type: options.type || "default"
115
127
  };
116
- toasts.value.push(toast);
128
+ toasts.value = [...toasts.value, toast];
117
129
  if (toast.duration && toast.duration > 0) {
118
130
  toast.timer = setTimeout(() => {
119
131
  removeToast(id);
@@ -131,7 +143,7 @@ function useToast(defaultPosition = "top-right") {
131
143
  if (toast.onClose) {
132
144
  toast.onClose();
133
145
  }
134
- toasts.value.splice(index, 1);
146
+ toasts.value = toasts.value.filter((t) => t.id !== id);
135
147
  };
136
148
  const clearToasts = () => {
137
149
  toasts.value.forEach((toast) => {
@@ -144,90 +156,175 @@ function useToast(defaultPosition = "top-right") {
144
156
  });
145
157
  toasts.value = [];
146
158
  };
159
+ const updateToast = (id, updates) => {
160
+ const index = toasts.value.findIndex((t) => t.id === id);
161
+ if (index === -1) return;
162
+ const toast = toasts.value[index];
163
+ if (updates.duration !== void 0 && toast.timer) {
164
+ clearTimeout(toast.timer);
165
+ }
166
+ const updatedToast = { ...toast, ...updates };
167
+ if (updates.duration && updates.duration > 0) {
168
+ updatedToast.timer = setTimeout(() => {
169
+ removeToast(id);
170
+ }, updates.duration);
171
+ }
172
+ toasts.value = [
173
+ ...toasts.value.slice(0, index),
174
+ updatedToast,
175
+ ...toasts.value.slice(index + 1)
176
+ ];
177
+ };
178
+ return {
179
+ toasts,
180
+ addToast,
181
+ removeToast,
182
+ clearToasts,
183
+ updateToast
184
+ };
185
+ };
186
+ let globalStore = null;
187
+ const getToastStore = (defaultPosition = "top-right") => {
188
+ if (!globalStore) {
189
+ globalStore = createToastStore(defaultPosition);
190
+ }
191
+ return globalStore;
192
+ };
193
+ const _sfc_main = /* @__PURE__ */ defineComponent({
194
+ __name: "VueToast",
195
+ setup(__props) {
196
+ const store = getToastStore();
197
+ const groupedToasts = computed(() => {
198
+ return groupToasts(store.toasts.value);
199
+ });
200
+ const removeToast = (id) => {
201
+ store.removeToast(id);
202
+ };
203
+ const handleToastClick = (toast) => {
204
+ if (toast.onClick) {
205
+ toast.onClick();
206
+ }
207
+ };
208
+ return (_ctx, _cache) => {
209
+ return openBlock(true), createElementBlock(Fragment, null, renderList(groupedToasts.value, (toasts, position) => {
210
+ return openBlock(), createElementBlock("div", {
211
+ key: position,
212
+ class: normalizeClass(`vue-toast-container vue-toast-container--${position.replace("-", "")}`)
213
+ }, [
214
+ (openBlock(true), createElementBlock(Fragment, null, renderList(toasts, (toast, index) => {
215
+ return openBlock(), createBlock(Toast, {
216
+ key: toast.id,
217
+ toast,
218
+ index,
219
+ total: toasts.length,
220
+ onClose: ($event) => removeToast(toast.id),
221
+ onClick: ($event) => handleToastClick(toast)
222
+ }, null, 8, ["toast", "index", "total", "onClose", "onClick"]);
223
+ }), 128))
224
+ ], 2);
225
+ }), 128);
226
+ };
227
+ }
228
+ });
229
+ const VueToast = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-bcc3b5d0"]]);
230
+ function useToast(defaultPosition = "top-right") {
231
+ const store = getToastStore(defaultPosition);
147
232
  const success = (message, options = {}) => {
148
- return addToast({
233
+ return store.addToast({
149
234
  ...options,
150
235
  message,
151
236
  type: "success"
152
237
  });
153
238
  };
154
239
  const error = (message, options = {}) => {
155
- return addToast({
240
+ return store.addToast({
156
241
  ...options,
157
242
  message,
158
243
  type: "error"
159
244
  });
160
245
  };
161
246
  const warning = (message, options = {}) => {
162
- return addToast({
247
+ return store.addToast({
163
248
  ...options,
164
249
  message,
165
250
  type: "warning"
166
251
  });
167
252
  };
168
253
  const info = (message, options = {}) => {
169
- return addToast({
254
+ return store.addToast({
170
255
  ...options,
171
256
  message,
172
257
  type: "info"
173
258
  });
174
259
  };
175
260
  const groupedToasts = computed(() => {
176
- const groups = {};
177
- toasts.value.forEach((toast) => {
178
- const position = toast.position || defaultPosition;
179
- if (!groups[position]) {
180
- groups[position] = [];
181
- }
182
- groups[position].push(toast);
183
- });
184
- return groups;
185
- });
186
- onUnmounted(() => {
187
- clearToasts();
261
+ return groupToasts(store.toasts.value);
188
262
  });
189
263
  return {
190
- toasts,
264
+ // State
265
+ toasts: store.toasts,
191
266
  groupedToasts,
192
- addToast,
193
- removeToast,
194
- clearToasts,
267
+ // Convenience methods
195
268
  success,
196
269
  error,
197
270
  warning,
198
- info
271
+ info,
272
+ // Core methods
273
+ addToast: store.addToast,
274
+ removeToast: store.removeToast,
275
+ clearToasts: store.clearToasts,
276
+ updateToast: store.updateToast
199
277
  };
200
278
  }
201
- const VueToast = {
279
+ const VueToastPlugin = {
202
280
  install: (app, pluginOptions) => {
203
- app.component("VueToast", Toast);
281
+ app.component("VueToast", VueToast);
282
+ const store = getToastStore(pluginOptions == null ? void 0 : pluginOptions.defaultPosition);
204
283
  app.config.globalProperties.$toast = {
205
284
  success: (message, options) => {
206
- const { success } = useToast((options == null ? void 0 : options.position) || (pluginOptions == null ? void 0 : pluginOptions.defaultPosition));
207
- return success(message, options);
285
+ return store.addToast({
286
+ ...options,
287
+ message,
288
+ type: "success"
289
+ });
208
290
  },
209
291
  error: (message, options) => {
210
- const { error } = useToast((options == null ? void 0 : options.position) || (pluginOptions == null ? void 0 : pluginOptions.defaultPosition));
211
- return error(message, options);
292
+ return store.addToast({
293
+ ...options,
294
+ message,
295
+ type: "error"
296
+ });
212
297
  },
213
298
  warning: (message, options) => {
214
- const { warning } = useToast((options == null ? void 0 : options.position) || (pluginOptions == null ? void 0 : pluginOptions.defaultPosition));
215
- return warning(message, options);
299
+ return store.addToast({
300
+ ...options,
301
+ message,
302
+ type: "warning"
303
+ });
216
304
  },
217
305
  info: (message, options) => {
218
- const { info } = useToast((options == null ? void 0 : options.position) || (pluginOptions == null ? void 0 : pluginOptions.defaultPosition));
219
- return info(message, options);
306
+ return store.addToast({
307
+ ...options,
308
+ message,
309
+ type: "info"
310
+ });
220
311
  },
221
312
  add: (options) => {
222
- const { addToast } = useToast(options.position);
223
- return addToast(options);
313
+ return store.addToast(options);
314
+ },
315
+ remove: (id) => {
316
+ store.removeToast(id);
317
+ },
318
+ clear: () => {
319
+ store.clearToasts();
224
320
  }
225
321
  };
226
322
  }
227
323
  };
228
324
  export {
229
325
  Toast,
230
- VueToast as default,
326
+ VueToast,
327
+ VueToastPlugin as default,
231
328
  useToast
232
329
  };
233
330
  //# sourceMappingURL=vue-toast.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"vue-toast.es.js","sources":["../src/components/Toast/Toast.vue","../src/composables/useToast.ts","../src/index.ts"],"sourcesContent":["<template>\n <div\n :class=\"[\n 'vue-toast',\n `vue-toast--${toast.type || 'default'}`,\n `vue-toast--${positionClass}`,\n { 'vue-toast--dismissible': toast.dismissible }\n ]\"\n :style=\"toastStyle\"\n @click=\"handleClick\"\n role=\"alert\"\n aria-live=\"polite\"\n :aria-label=\"ariaLabel\"\n >\n <div class=\"vue-toast__content\">\n <span class=\"vue-toast__message\">{{ toast.message }}</span>\n </div>\n \n <button\n v-if=\"toast.dismissible\"\n class=\"vue-toast__close\"\n @click.stop=\"handleClose\"\n aria-label=\"Close notification\"\n >\n <svg\n class=\"vue-toast__close-icon\"\n viewBox=\"0 0 24 24\"\n width=\"16\"\n height=\"16\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n </svg>\n </button>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport type { ToastComponentProps, ToastType } from '@/types'\n\nconst props = defineProps<ToastComponentProps>()\n\nconst emit = defineEmits<{\n close: [id?: string]\n click: []\n}>()\n\nconst positionClass = computed(() => {\n const position = props.toast.position || 'top-right'\n return position.replace('-', '')\n})\n\nconst toastStyle = computed(() => ({\n '--toast-index': props.index,\n '--toast-total': props.total,\n}))\n\nconst ariaLabel = computed(() => {\n const type = props.toast.type || 'default'\n const typeLabels: Record<ToastType, string> = {\n success: 'Success notification',\n error: 'Error notification',\n warning: 'Warning notification',\n info: 'Information notification',\n default: 'Notification',\n }\n return typeLabels[type]\n})\n\nconst handleClose = () => {\n emit('close', props.toast.id)\n}\n\nconst handleClick = () => {\n if (props.toast.onClick) {\n props.toast.onClick()\n }\n emit('click')\n}\n</script>\n\n<style scoped>\n.vue-toast {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: space-between;\n min-width: 300px;\n max-width: 500px;\n padding: 12px 16px;\n margin-bottom: 8px;\n border-radius: 6px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n background-color: white;\n color: #333;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n font-size: 14px;\n line-height: 1.4;\n animation: toast-slide-in 0.3s ease-out;\n transition: transform 0.2s ease, opacity 0.2s ease;\n z-index: calc(1000 + var(--toast-index));\n cursor: pointer;\n}\n\n.vue-toast:hover {\n transform: translateY(-1px);\n box-shadow: 0 6px 16px rgba(0, 0, 0, 0.2);\n}\n\n.vue-toast--success {\n border-left: 4px solid #10b981;\n background-color: #f0fdf4;\n color: #065f46;\n}\n\n.vue-toast--error {\n border-left: 4px solid #ef4444;\n background-color: #fef2f2;\n color: #991b1b;\n}\n\n.vue-toast--warning {\n border-left: 4px solid #f59e0b;\n background-color: #fffbeb;\n color: #92400e;\n}\n\n.vue-toast--info {\n border-left: 4px solid #3b82f6;\n background-color: #eff6ff;\n color: #1e40af;\n}\n\n.vue-toast--default {\n border-left: 4px solid #6b7280;\n background-color: #f9fafb;\n color: #374151;\n}\n\n.vue-toast__content {\n flex: 1;\n margin-right: 8px;\n}\n\n.vue-toast__message {\n word-break: break-word;\n}\n\n.vue-toast__close {\n flex-shrink: 0;\n background: none;\n border: none;\n padding: 4px;\n margin-left: 8px;\n cursor: pointer;\n color: inherit;\n opacity: 0.7;\n border-radius: 4px;\n transition: opacity 0.2s ease, background-color 0.2s ease;\n}\n\n.vue-toast__close:hover {\n opacity: 1;\n background-color: rgba(0, 0, 0, 0.1);\n}\n\n.vue-toast__close:focus {\n outline: 2px solid currentColor;\n outline-offset: 2px;\n}\n\n.vue-toast__close-icon {\n display: block;\n}\n\n/* Position classes */\n.vue-toast--topleft {\n position: fixed;\n top: 20px;\n left: 20px;\n}\n\n.vue-toast--topcenter {\n position: fixed;\n top: 20px;\n left: 50%;\n transform: translateX(-50%);\n}\n\n.vue-toast--topright {\n position: fixed;\n top: 20px;\n right: 20px;\n}\n\n.vue-toast--bottomleft {\n position: fixed;\n bottom: 20px;\n left: 20px;\n}\n\n.vue-toast--bottomcenter {\n position: fixed;\n bottom: 20px;\n left: 50%;\n transform: translateX(-50%);\n}\n\n.vue-toast--bottomright {\n position: fixed;\n bottom: 20px;\n right: 20px;\n}\n\n/* Animation */\n@keyframes toast-slide-in {\n from {\n opacity: 0;\n transform: translateY(-20px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n/* Responsive */\n@media (max-width: 640px) {\n .vue-toast {\n min-width: calc(100vw - 40px);\n max-width: calc(100vw - 40px);\n margin-left: 20px;\n margin-right: 20px;\n }\n \n .vue-toast--topleft,\n .vue-toast--topcenter,\n .vue-toast--topright {\n top: 10px;\n }\n \n .vue-toast--bottomleft,\n .vue-toast--bottomcenter,\n .vue-toast--bottomright {\n bottom: 10px;\n }\n}\n</style>","import { ref, computed, onUnmounted, type Ref } from 'vue'\nimport type { ToastOptions, ToastPosition } from '@/types'\n\ninterface ToastInstance extends ToastOptions {\n id: string\n timer?: ReturnType<typeof setTimeout>\n}\n\nexport function useToast(defaultPosition: ToastPosition = 'top-right') {\n const toasts: Ref<ToastInstance[]> = ref([])\n\n const generateId = () => `toast-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\n\n const addToast = (options: ToastOptions) => {\n const id = options.id || generateId()\n const toast: ToastInstance = {\n ...options,\n id,\n position: options.position || defaultPosition,\n duration: options.duration ?? 5000,\n dismissible: options.dismissible ?? true,\n }\n\n toasts.value.push(toast)\n\n if (toast.duration && toast.duration > 0) {\n toast.timer = setTimeout(() => {\n removeToast(id)\n }, toast.duration)\n }\n\n return id\n }\n\n const removeToast = (id: string) => {\n const index = toasts.value.findIndex(t => t.id === id)\n if (index === -1) return\n\n const toast = toasts.value[index]\n \n if (toast.timer) {\n clearTimeout(toast.timer)\n }\n\n if (toast.onClose) {\n toast.onClose()\n }\n\n toasts.value.splice(index, 1)\n }\n\n const clearToasts = () => {\n toasts.value.forEach(toast => {\n if (toast.timer) {\n clearTimeout(toast.timer)\n }\n if (toast.onClose) {\n toast.onClose()\n }\n })\n toasts.value = []\n }\n\n const success = (message: string, options: Omit<ToastOptions, 'message' | 'type'> = {}) => {\n return addToast({\n ...options,\n message,\n type: 'success',\n })\n }\n\n const error = (message: string, options: Omit<ToastOptions, 'message' | 'type'> = {}) => {\n return addToast({\n ...options,\n message,\n type: 'error',\n })\n }\n\n const warning = (message: string, options: Omit<ToastOptions, 'message' | 'type'> = {}) => {\n return addToast({\n ...options,\n message,\n type: 'warning',\n })\n }\n\n const info = (message: string, options: Omit<ToastOptions, 'message' | 'type'> = {}) => {\n return addToast({\n ...options,\n message,\n type: 'info',\n })\n }\n\n const groupedToasts = computed(() => {\n const groups: Record<string, ToastInstance[]> = {}\n \n toasts.value.forEach(toast => {\n const position = toast.position || defaultPosition\n if (!groups[position]) {\n groups[position] = []\n }\n groups[position].push(toast)\n })\n\n return groups\n })\n\n onUnmounted(() => {\n clearToasts()\n })\n\n return {\n toasts,\n groupedToasts,\n addToast,\n removeToast,\n clearToasts,\n success,\n error,\n warning,\n info,\n }\n}\n\nexport type UseToastReturn = ReturnType<typeof useToast>","import { type App } from 'vue'\nimport Toast from './components/Toast'\nimport { useToast } from './composables/useToast'\nimport type { ToastOptions, ToastPosition, ToastType } from './types'\n\nexport { Toast, useToast }\nexport type { ToastOptions, ToastPosition, ToastType }\n\nconst VueToast = {\n install: (app: App, pluginOptions?: { defaultPosition?: ToastPosition }) => {\n app.component('VueToast', Toast)\n \n app.config.globalProperties.$toast = {\n success: (message: string, options?: Omit<ToastOptions, 'message' | 'type'>) => {\n const { success } = useToast(options?.position || pluginOptions?.defaultPosition)\n return success(message, options)\n },\n error: (message: string, options?: Omit<ToastOptions, 'message' | 'type'>) => {\n const { error } = useToast(options?.position || pluginOptions?.defaultPosition)\n return error(message, options)\n },\n warning: (message: string, options?: Omit<ToastOptions, 'message' | 'type'>) => {\n const { warning } = useToast(options?.position || pluginOptions?.defaultPosition)\n return warning(message, options)\n },\n info: (message: string, options?: Omit<ToastOptions, 'message' | 'type'>) => {\n const { info } = useToast(options?.position || pluginOptions?.defaultPosition)\n return info(message, options)\n },\n add: (options: ToastOptions) => {\n const { addToast } = useToast(options.position)\n return addToast(options)\n },\n }\n },\n}\n\nexport default VueToast"],"names":["_createElementBlock","_normalizeClass","_createElementVNode","_toDisplayString"],"mappings":"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"}
1
+ {"version":3,"file":"vue-toast.es.js","sources":["../src/components/Toast/Toast.vue","../src/store/toastStore.ts","../src/components/VueToast/VueToast.vue","../src/composables/useToast.ts","../src/index.ts"],"sourcesContent":["<template>\n <div\n :class=\"[\n 'vue-toast',\n `vue-toast--${toast.type || 'default'}`,\n `vue-toast--${positionClass}`,\n { 'vue-toast--dismissible': toast.dismissible }\n ]\"\n :style=\"toastStyle\"\n @click=\"handleClick\"\n role=\"alert\"\n aria-live=\"polite\"\n :aria-label=\"ariaLabel\"\n >\n <div class=\"vue-toast__content\">\n <span class=\"vue-toast__message\">{{ toast.message }}</span>\n </div>\n \n <button\n v-if=\"toast.dismissible\"\n class=\"vue-toast__close\"\n @click.stop=\"handleClose\"\n aria-label=\"Close notification\"\n >\n <svg\n class=\"vue-toast__close-icon\"\n viewBox=\"0 0 24 24\"\n width=\"16\"\n height=\"16\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n </svg>\n </button>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport type { ToastComponentProps, ToastType } from '@/types'\n\nconst props = defineProps<ToastComponentProps>()\n\nconst emit = defineEmits<{\n close: [id?: string]\n click: []\n}>()\n\nconst positionClass = computed(() => {\n const position = props.toast.position || 'top-right'\n return position.replace('-', '')\n})\n\nconst toastStyle = computed(() => ({\n '--toast-index': props.index,\n '--toast-total': props.total,\n}))\n\nconst ariaLabel = computed(() => {\n const type = props.toast.type || 'default'\n const typeLabels: Record<ToastType, string> = {\n success: 'Success notification',\n error: 'Error notification',\n warning: 'Warning notification',\n info: 'Information notification',\n default: 'Notification',\n }\n return typeLabels[type]\n})\n\nconst handleClose = () => {\n emit('close', props.toast.id)\n}\n\nconst handleClick = () => {\n if (props.toast.onClick) {\n props.toast.onClick()\n }\n emit('click')\n}\n</script>\n\n<style scoped>\n.vue-toast {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: space-between;\n min-width: 300px;\n max-width: 500px;\n padding: 12px 16px;\n margin-bottom: 8px;\n border-radius: 6px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n background-color: white;\n color: #333;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n font-size: 14px;\n line-height: 1.4;\n animation: toast-slide-in 0.3s ease-out;\n transition: transform 0.2s ease, opacity 0.2s ease;\n z-index: calc(1000 + var(--toast-index));\n cursor: pointer;\n}\n\n.vue-toast:hover {\n transform: translateY(-1px);\n box-shadow: 0 6px 16px rgba(0, 0, 0, 0.2);\n}\n\n.vue-toast--success {\n border-left: 4px solid #10b981;\n background-color: #f0fdf4;\n color: #065f46;\n}\n\n.vue-toast--error {\n border-left: 4px solid #ef4444;\n background-color: #fef2f2;\n color: #991b1b;\n}\n\n.vue-toast--warning {\n border-left: 4px solid #f59e0b;\n background-color: #fffbeb;\n color: #92400e;\n}\n\n.vue-toast--info {\n border-left: 4px solid #3b82f6;\n background-color: #eff6ff;\n color: #1e40af;\n}\n\n.vue-toast--default {\n border-left: 4px solid #6b7280;\n background-color: #f9fafb;\n color: #374151;\n}\n\n.vue-toast__content {\n flex: 1;\n margin-right: 8px;\n}\n\n.vue-toast__message {\n word-break: break-word;\n}\n\n.vue-toast__close {\n flex-shrink: 0;\n background: none;\n border: none;\n padding: 4px;\n margin-left: 8px;\n cursor: pointer;\n color: inherit;\n opacity: 0.7;\n border-radius: 4px;\n transition: opacity 0.2s ease, background-color 0.2s ease;\n}\n\n.vue-toast__close:hover {\n opacity: 1;\n background-color: rgba(0, 0, 0, 0.1);\n}\n\n.vue-toast__close:focus {\n outline: 2px solid currentColor;\n outline-offset: 2px;\n}\n\n.vue-toast__close-icon {\n display: block;\n}\n\n/* Position classes */\n.vue-toast--topleft {\n position: fixed;\n top: 20px;\n left: 20px;\n}\n\n.vue-toast--topcenter {\n position: fixed;\n top: 20px;\n left: 50%;\n transform: translateX(-50%);\n}\n\n.vue-toast--topright {\n position: fixed;\n top: 20px;\n right: 20px;\n}\n\n.vue-toast--bottomleft {\n position: fixed;\n bottom: 20px;\n left: 20px;\n}\n\n.vue-toast--bottomcenter {\n position: fixed;\n bottom: 20px;\n left: 50%;\n transform: translateX(-50%);\n}\n\n.vue-toast--bottomright {\n position: fixed;\n bottom: 20px;\n right: 20px;\n}\n\n/* Animation */\n@keyframes toast-slide-in {\n from {\n opacity: 0;\n transform: translateY(-20px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n/* Responsive */\n@media (max-width: 640px) {\n .vue-toast {\n min-width: calc(100vw - 40px);\n max-width: calc(100vw - 40px);\n margin-left: 20px;\n margin-right: 20px;\n }\n \n .vue-toast--topleft,\n .vue-toast--topcenter,\n .vue-toast--topright {\n top: 10px;\n }\n \n .vue-toast--bottomleft,\n .vue-toast--bottomcenter,\n .vue-toast--bottomright {\n bottom: 10px;\n }\n}\n</style>","import { ref, shallowRef, type Ref } from 'vue'\nimport type { ToastOptions, ToastPosition, ToastType } from '@/types'\n\nexport interface ToastInstance extends ToastOptions {\n id: string\n timer?: ReturnType<typeof setTimeout>\n}\n\ninterface ToastStore {\n toasts: Ref<ToastInstance[]>\n addToast: (options: ToastOptions) => string\n removeToast: (id: string) => void\n clearToasts: () => void\n updateToast: (id: string, updates: Partial<ToastOptions>) => void\n}\n\n// Helper function to generate unique IDs\nconst generateId = () => `toast-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\n\n// Helper function to group toasts by position\nexport const groupToasts = (toasts: ToastInstance[]): Record<string, ToastInstance[]> => {\n const groups: Record<string, ToastInstance[]> = {}\n \n toasts.forEach(toast => {\n const position = toast.position || 'top-right'\n if (!groups[position]) {\n groups[position] = []\n }\n groups[position].push(toast)\n })\n\n return groups\n}\n\n// Create the singleton store\nconst createToastStore = (defaultPosition: ToastPosition = 'top-right'): ToastStore => {\n // Use shallowRef for better performance with array updates\n const toasts = shallowRef<ToastInstance[]>([])\n\n const addToast = (options: ToastOptions): string => {\n const id = options.id || generateId()\n const toast: ToastInstance = {\n ...options,\n id,\n position: options.position || defaultPosition,\n duration: options.duration ?? 5000,\n dismissible: options.dismissible ?? true,\n type: options.type || 'default',\n }\n\n toasts.value = [...toasts.value, toast]\n\n if (toast.duration && toast.duration > 0) {\n toast.timer = setTimeout(() => {\n removeToast(id)\n }, toast.duration)\n }\n\n return id\n }\n\n const removeToast = (id: string): void => {\n const index = toasts.value.findIndex(t => t.id === id)\n if (index === -1) return\n\n const toast = toasts.value[index]\n \n if (toast.timer) {\n clearTimeout(toast.timer)\n }\n\n if (toast.onClose) {\n toast.onClose()\n }\n\n toasts.value = toasts.value.filter(t => t.id !== id)\n }\n\n const clearToasts = (): void => {\n toasts.value.forEach(toast => {\n if (toast.timer) {\n clearTimeout(toast.timer)\n }\n if (toast.onClose) {\n toast.onClose()\n }\n })\n toasts.value = []\n }\n\n const updateToast = (id: string, updates: Partial<ToastOptions>): void => {\n const index = toasts.value.findIndex(t => t.id === id)\n if (index === -1) return\n\n const toast = toasts.value[index]\n \n // Clear existing timer if duration is being updated\n if (updates.duration !== undefined && toast.timer) {\n clearTimeout(toast.timer)\n }\n\n const updatedToast = { ...toast, ...updates }\n \n // Set new timer if duration is provided and > 0\n if (updates.duration && updates.duration > 0) {\n updatedToast.timer = setTimeout(() => {\n removeToast(id)\n }, updates.duration)\n }\n\n toasts.value = [\n ...toasts.value.slice(0, index),\n updatedToast,\n ...toasts.value.slice(index + 1)\n ]\n }\n\n return {\n toasts,\n addToast,\n removeToast,\n clearToasts,\n updateToast,\n }\n}\n\n// Global singleton instance\nlet globalStore: ToastStore | null = null\n\nexport const getToastStore = (defaultPosition: ToastPosition = 'top-right'): ToastStore => {\n if (!globalStore) {\n globalStore = createToastStore(defaultPosition)\n }\n return globalStore\n}\n\nexport const resetToastStore = (): void => {\n if (globalStore) {\n globalStore.clearToasts()\n }\n globalStore = null\n}","<template>\n <!-- Render toast containers for each position -->\n <div\n v-for=\"(toasts, position) in groupedToasts\"\n :key=\"position\"\n :class=\"`vue-toast-container vue-toast-container--${position.replace('-', '')}`\"\n >\n <Toast\n v-for=\"(toast, index) in toasts\"\n :key=\"toast.id\"\n :toast=\"toast\"\n :index=\"index\"\n :total=\"toasts.length\"\n @close=\"removeToast(toast.id)\"\n @click=\"handleToastClick(toast)\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport Toast from '../Toast/Toast.vue'\nimport { getToastStore, groupToasts } from '@/store/toastStore'\nimport type { ToastInstance } from '@/store/toastStore'\n\n// Get the global store\nconst store = getToastStore()\n\n// Compute grouped toasts for rendering\nconst groupedToasts = computed(() => {\n return groupToasts(store.toasts.value)\n})\n\n// Handle toast removal\nconst removeToast = (id: string) => {\n store.removeToast(id)\n}\n\n// Handle toast click\nconst handleToastClick = (toast: ToastInstance) => {\n if (toast.onClick) {\n toast.onClick()\n }\n}\n</script>\n\n<style scoped>\n.vue-toast-container {\n position: fixed;\n z-index: 9999;\n pointer-events: none;\n}\n\n/* Position styles */\n.vue-toast-container--topleft {\n top: 20px;\n left: 20px;\n}\n\n.vue-toast-container--topcenter {\n top: 20px;\n left: 50%;\n transform: translateX(-50%);\n}\n\n.vue-toast-container--topright {\n top: 20px;\n right: 20px;\n}\n\n.vue-toast-container--bottomleft {\n bottom: 20px;\n left: 20px;\n}\n\n.vue-toast-container--bottomcenter {\n bottom: 20px;\n left: 50%;\n transform: translateX(-50%);\n}\n\n.vue-toast-container--bottomright {\n bottom: 20px;\n right: 20px;\n}\n\n/* Responsive adjustments */\n@media (max-width: 640px) {\n .vue-toast-container--topleft,\n .vue-toast-container--topcenter,\n .vue-toast-container--topright {\n top: 10px;\n }\n \n .vue-toast-container--bottomleft,\n .vue-toast-container--bottomcenter,\n .vue-toast-container--bottomright {\n bottom: 10px;\n }\n \n .vue-toast-container--topleft,\n .vue-toast-container--bottomleft {\n left: 10px;\n }\n \n .vue-toast-container--topright,\n .vue-toast-container--bottomright {\n right: 10px;\n }\n \n .vue-toast-container--topcenter,\n .vue-toast-container--bottomcenter {\n left: 50%;\n transform: translateX(-50%);\n }\n}\n</style>","import { computed } from 'vue'\nimport type { ToastOptions, ToastPosition } from '@/types'\nimport { getToastStore, groupToasts } from '@/store/toastStore'\n\nexport function useToast(defaultPosition: ToastPosition = 'top-right') {\n const store = getToastStore(defaultPosition)\n\n const success = (message: string, options: Omit<ToastOptions, 'message' | 'type'> = {}) => {\n return store.addToast({\n ...options,\n message,\n type: 'success',\n })\n }\n\n const error = (message: string, options: Omit<ToastOptions, 'message' | 'type'> = {}) => {\n return store.addToast({\n ...options,\n message,\n type: 'error',\n })\n }\n\n const warning = (message: string, options: Omit<ToastOptions, 'message' | 'type'> = {}) => {\n return store.addToast({\n ...options,\n message,\n type: 'warning',\n })\n }\n\n const info = (message: string, options: Omit<ToastOptions, 'message' | 'type'> = {}) => {\n return store.addToast({\n ...options,\n message,\n type: 'info',\n })\n }\n\n const groupedToasts = computed(() => {\n return groupToasts(store.toasts.value)\n })\n\n return {\n // State\n toasts: store.toasts,\n groupedToasts,\n \n // Convenience methods\n success,\n error,\n warning,\n info,\n \n // Core methods\n addToast: store.addToast,\n removeToast: store.removeToast,\n clearToasts: store.clearToasts,\n updateToast: store.updateToast,\n }\n}\n\nexport type UseToastReturn = ReturnType<typeof useToast>","import { type App } from 'vue'\nimport Toast from './components/Toast'\nimport VueToast from './components/VueToast'\nimport { useToast } from './composables/useToast'\nimport { getToastStore } from './store/toastStore'\nimport type { ToastOptions, ToastPosition, ToastType } from './types'\n\nexport { Toast, VueToast, useToast }\nexport type { ToastOptions, ToastPosition, ToastType }\n\nconst VueToastPlugin = {\n install: (app: App, pluginOptions?: { defaultPosition?: ToastPosition }) => {\n // Register the container component globally\n app.component('VueToast', VueToast)\n \n // Initialize store with default position if provided\n const store = getToastStore(pluginOptions?.defaultPosition)\n \n // Set up global $toast API\n app.config.globalProperties.$toast = {\n success: (message: string, options?: Omit<ToastOptions, 'message' | 'type'>) => {\n return store.addToast({\n ...options,\n message,\n type: 'success',\n })\n },\n error: (message: string, options?: Omit<ToastOptions, 'message' | 'type'>) => {\n return store.addToast({\n ...options,\n message,\n type: 'error',\n })\n },\n warning: (message: string, options?: Omit<ToastOptions, 'message' | 'type'>) => {\n return store.addToast({\n ...options,\n message,\n type: 'warning',\n })\n },\n info: (message: string, options?: Omit<ToastOptions, 'message' | 'type'>) => {\n return store.addToast({\n ...options,\n message,\n type: 'info',\n })\n },\n add: (options: ToastOptions) => {\n return store.addToast(options)\n },\n remove: (id: string) => {\n store.removeToast(id)\n },\n clear: () => {\n store.clearToasts()\n },\n }\n },\n}\n\nexport default VueToastPlugin"],"names":["_createElementBlock","_normalizeClass","_createElementVNode","_toDisplayString","_openBlock","_Fragment","_renderList","_createBlock"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("vue")):"function"==typeof define&&define.amd?define(["exports","vue"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).VueToast={},e.Vue)}(this,function(e,t){"use strict";const o=["aria-label"],s={class:"vue-toast__content"},i={class:"vue-toast__message"},n=((e,t)=>{const o=e.__vccOpts||e;for(const[s,i]of t)o[s]=i;return o})(t.defineComponent({__name:"Toast",props:{toast:{},index:{},total:{}},emits:["close","click"],setup(e,{emit:n}){const a=e,l=n,r=t.computed(()=>(a.toast.position||"top-right").replace("-","")),u=t.computed(()=>({"--toast-index":a.index,"--toast-total":a.total})),c=t.computed(()=>({success:"Success notification",error:"Error notification",warning:"Warning notification",info:"Information notification",default:"Notification"}[a.toast.type||"default"])),d=()=>{l("close",a.toast.id)},p=()=>{a.toast.onClick&&a.toast.onClick(),l("click")};return(n,a)=>(t.openBlock(),t.createElementBlock("div",{class:t.normalizeClass(["vue-toast",`vue-toast--${e.toast.type||"default"}`,`vue-toast--${r.value}`,{"vue-toast--dismissible":e.toast.dismissible}]),style:t.normalizeStyle(u.value),onClick:p,role:"alert","aria-live":"polite","aria-label":c.value},[t.createElementVNode("div",s,[t.createElementVNode("span",i,t.toDisplayString(e.toast.message),1)]),e.toast.dismissible?(t.openBlock(),t.createElementBlock("button",{key:0,class:"vue-toast__close",onClick:t.withModifiers(d,["stop"]),"aria-label":"Close notification"},[...a[0]||(a[0]=[t.createElementVNode("svg",{class:"vue-toast__close-icon",viewBox:"0 0 24 24",width:"16",height:"16",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},[t.createElementVNode("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),t.createElementVNode("line",{x1:"6",y1:"6",x2:"18",y2:"18"})],-1)])])):t.createCommentVNode("",!0)],14,o))}}),[["__scopeId","data-v-38db861e"]]);function a(e="top-right"){const o=t.ref([]),s=t=>{const s=t.id||`toast-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,n={...t,id:s,position:t.position||e,duration:t.duration??5e3,dismissible:t.dismissible??!0};return o.value.push(n),n.duration&&n.duration>0&&(n.timer=setTimeout(()=>{i(s)},n.duration)),s},i=e=>{const t=o.value.findIndex(t=>t.id===e);if(-1===t)return;const s=o.value[t];s.timer&&clearTimeout(s.timer),s.onClose&&s.onClose(),o.value.splice(t,1)},n=()=>{o.value.forEach(e=>{e.timer&&clearTimeout(e.timer),e.onClose&&e.onClose()}),o.value=[]},a=t.computed(()=>{const t={};return o.value.forEach(o=>{const s=o.position||e;t[s]||(t[s]=[]),t[s].push(o)}),t});return t.onUnmounted(()=>{n()}),{toasts:o,groupedToasts:a,addToast:s,removeToast:i,clearToasts:n,success:(e,t={})=>s({...t,message:e,type:"success"}),error:(e,t={})=>s({...t,message:e,type:"error"}),warning:(e,t={})=>s({...t,message:e,type:"warning"}),info:(e,t={})=>s({...t,message:e,type:"info"})}}const l={install:(e,t)=>{e.component("VueToast",n),e.config.globalProperties.$toast={success:(e,o)=>{const{success:s}=a((null==o?void 0:o.position)||(null==t?void 0:t.defaultPosition));return s(e,o)},error:(e,o)=>{const{error:s}=a((null==o?void 0:o.position)||(null==t?void 0:t.defaultPosition));return s(e,o)},warning:(e,o)=>{const{warning:s}=a((null==o?void 0:o.position)||(null==t?void 0:t.defaultPosition));return s(e,o)},info:(e,o)=>{const{info:s}=a((null==o?void 0:o.position)||(null==t?void 0:t.defaultPosition));return s(e,o)},add:e=>{const{addToast:t}=a(e.position);return t(e)}}}};e.Toast=n,e.default=l,e.useToast=a,Object.defineProperties(e,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
1
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("vue")):"function"==typeof define&&define.amd?define(["exports","vue"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).VueToast={},e.Vue)}(this,function(e,t){"use strict";const o=["aria-label"],s={class:"vue-toast__content"},a={class:"vue-toast__message"},n=(e,t)=>{const o=e.__vccOpts||e;for(const[s,a]of t)o[s]=a;return o},i=n(t.defineComponent({__name:"Toast",props:{toast:{},index:{},total:{}},emits:["close","click"],setup(e,{emit:n}){const i=e,l=n,r=t.computed(()=>(i.toast.position||"top-right").replace("-","")),c=t.computed(()=>({"--toast-index":i.index,"--toast-total":i.total})),d=t.computed(()=>({success:"Success notification",error:"Error notification",warning:"Warning notification",info:"Information notification",default:"Notification"}[i.toast.type||"default"])),u=()=>{l("close",i.toast.id)},m=()=>{i.toast.onClick&&i.toast.onClick(),l("click")};return(n,i)=>(t.openBlock(),t.createElementBlock("div",{class:t.normalizeClass(["vue-toast",`vue-toast--${e.toast.type||"default"}`,`vue-toast--${r.value}`,{"vue-toast--dismissible":e.toast.dismissible}]),style:t.normalizeStyle(c.value),onClick:m,role:"alert","aria-live":"polite","aria-label":d.value},[t.createElementVNode("div",s,[t.createElementVNode("span",a,t.toDisplayString(e.toast.message),1)]),e.toast.dismissible?(t.openBlock(),t.createElementBlock("button",{key:0,class:"vue-toast__close",onClick:t.withModifiers(u,["stop"]),"aria-label":"Close notification"},[...i[0]||(i[0]=[t.createElementVNode("svg",{class:"vue-toast__close-icon",viewBox:"0 0 24 24",width:"16",height:"16",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},[t.createElementVNode("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),t.createElementVNode("line",{x1:"6",y1:"6",x2:"18",y2:"18"})],-1)])])):t.createCommentVNode("",!0)],14,o))}}),[["__scopeId","data-v-38db861e"]]),l=e=>{const t={};return e.forEach(e=>{const o=e.position||"top-right";t[o]||(t[o]=[]),t[o].push(e)}),t},r=(e="top-right")=>{const o=t.shallowRef([]),s=e=>{const t=o.value.findIndex(t=>t.id===e);if(-1===t)return;const s=o.value[t];s.timer&&clearTimeout(s.timer),s.onClose&&s.onClose(),o.value=o.value.filter(t=>t.id!==e)};return{toasts:o,addToast:t=>{const a=t.id||`toast-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,n={...t,id:a,position:t.position||e,duration:t.duration??5e3,dismissible:t.dismissible??!0,type:t.type||"default"};return o.value=[...o.value,n],n.duration&&n.duration>0&&(n.timer=setTimeout(()=>{s(a)},n.duration)),a},removeToast:s,clearToasts:()=>{o.value.forEach(e=>{e.timer&&clearTimeout(e.timer),e.onClose&&e.onClose()}),o.value=[]},updateToast:(e,t)=>{const a=o.value.findIndex(t=>t.id===e);if(-1===a)return;const n=o.value[a];void 0!==t.duration&&n.timer&&clearTimeout(n.timer);const i={...n,...t};t.duration&&t.duration>0&&(i.timer=setTimeout(()=>{s(e)},t.duration)),o.value=[...o.value.slice(0,a),i,...o.value.slice(a+1)]}}};let c=null;const d=(e="top-right")=>(c||(c=r(e)),c),u=n(t.defineComponent({__name:"VueToast",setup(e){const o=d(),s=t.computed(()=>l(o.toasts.value));return(e,a)=>(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(s.value,(e,s)=>(t.openBlock(),t.createElementBlock("div",{key:s,class:t.normalizeClass(`vue-toast-container vue-toast-container--${s.replace("-","")}`)},[(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(e,(s,a)=>(t.openBlock(),t.createBlock(i,{key:s.id,toast:s,index:a,total:e.length,onClose:e=>{return t=s.id,void o.removeToast(t);var t},onClick:e=>(e=>{e.onClick&&e.onClick()})(s)},null,8,["toast","index","total","onClose","onClick"]))),128))],2))),128))}}),[["__scopeId","data-v-bcc3b5d0"]]);const m={install:(e,t)=>{e.component("VueToast",u);const o=d(null==t?void 0:t.defaultPosition);e.config.globalProperties.$toast={success:(e,t)=>o.addToast({...t,message:e,type:"success"}),error:(e,t)=>o.addToast({...t,message:e,type:"error"}),warning:(e,t)=>o.addToast({...t,message:e,type:"warning"}),info:(e,t)=>o.addToast({...t,message:e,type:"info"}),add:e=>o.addToast(e),remove:e=>{o.removeToast(e)},clear:()=>{o.clearToasts()}}}};e.Toast=i,e.VueToast=u,e.default=m,e.useToast=function(e="top-right"){const o=d(e),s=t.computed(()=>l(o.toasts.value));return{toasts:o.toasts,groupedToasts:s,success:(e,t={})=>o.addToast({...t,message:e,type:"success"}),error:(e,t={})=>o.addToast({...t,message:e,type:"error"}),warning:(e,t={})=>o.addToast({...t,message:e,type:"warning"}),info:(e,t={})=>o.addToast({...t,message:e,type:"info"}),addToast:o.addToast,removeToast:o.removeToast,clearToasts:o.clearToasts,updateToast:o.updateToast}},Object.defineProperties(e,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
2
2
  //# sourceMappingURL=vue-toast.umd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"vue-toast.umd.js","sources":["../src/components/Toast/Toast.vue","../src/composables/useToast.ts","../src/index.ts"],"sourcesContent":["<template>\n <div\n :class=\"[\n 'vue-toast',\n `vue-toast--${toast.type || 'default'}`,\n `vue-toast--${positionClass}`,\n { 'vue-toast--dismissible': toast.dismissible }\n ]\"\n :style=\"toastStyle\"\n @click=\"handleClick\"\n role=\"alert\"\n aria-live=\"polite\"\n :aria-label=\"ariaLabel\"\n >\n <div class=\"vue-toast__content\">\n <span class=\"vue-toast__message\">{{ toast.message }}</span>\n </div>\n \n <button\n v-if=\"toast.dismissible\"\n class=\"vue-toast__close\"\n @click.stop=\"handleClose\"\n aria-label=\"Close notification\"\n >\n <svg\n class=\"vue-toast__close-icon\"\n viewBox=\"0 0 24 24\"\n width=\"16\"\n height=\"16\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n </svg>\n </button>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport type { ToastComponentProps, ToastType } from '@/types'\n\nconst props = defineProps<ToastComponentProps>()\n\nconst emit = defineEmits<{\n close: [id?: string]\n click: []\n}>()\n\nconst positionClass = computed(() => {\n const position = props.toast.position || 'top-right'\n return position.replace('-', '')\n})\n\nconst toastStyle = computed(() => ({\n '--toast-index': props.index,\n '--toast-total': props.total,\n}))\n\nconst ariaLabel = computed(() => {\n const type = props.toast.type || 'default'\n const typeLabels: Record<ToastType, string> = {\n success: 'Success notification',\n error: 'Error notification',\n warning: 'Warning notification',\n info: 'Information notification',\n default: 'Notification',\n }\n return typeLabels[type]\n})\n\nconst handleClose = () => {\n emit('close', props.toast.id)\n}\n\nconst handleClick = () => {\n if (props.toast.onClick) {\n props.toast.onClick()\n }\n emit('click')\n}\n</script>\n\n<style scoped>\n.vue-toast {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: space-between;\n min-width: 300px;\n max-width: 500px;\n padding: 12px 16px;\n margin-bottom: 8px;\n border-radius: 6px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n background-color: white;\n color: #333;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n font-size: 14px;\n line-height: 1.4;\n animation: toast-slide-in 0.3s ease-out;\n transition: transform 0.2s ease, opacity 0.2s ease;\n z-index: calc(1000 + var(--toast-index));\n cursor: pointer;\n}\n\n.vue-toast:hover {\n transform: translateY(-1px);\n box-shadow: 0 6px 16px rgba(0, 0, 0, 0.2);\n}\n\n.vue-toast--success {\n border-left: 4px solid #10b981;\n background-color: #f0fdf4;\n color: #065f46;\n}\n\n.vue-toast--error {\n border-left: 4px solid #ef4444;\n background-color: #fef2f2;\n color: #991b1b;\n}\n\n.vue-toast--warning {\n border-left: 4px solid #f59e0b;\n background-color: #fffbeb;\n color: #92400e;\n}\n\n.vue-toast--info {\n border-left: 4px solid #3b82f6;\n background-color: #eff6ff;\n color: #1e40af;\n}\n\n.vue-toast--default {\n border-left: 4px solid #6b7280;\n background-color: #f9fafb;\n color: #374151;\n}\n\n.vue-toast__content {\n flex: 1;\n margin-right: 8px;\n}\n\n.vue-toast__message {\n word-break: break-word;\n}\n\n.vue-toast__close {\n flex-shrink: 0;\n background: none;\n border: none;\n padding: 4px;\n margin-left: 8px;\n cursor: pointer;\n color: inherit;\n opacity: 0.7;\n border-radius: 4px;\n transition: opacity 0.2s ease, background-color 0.2s ease;\n}\n\n.vue-toast__close:hover {\n opacity: 1;\n background-color: rgba(0, 0, 0, 0.1);\n}\n\n.vue-toast__close:focus {\n outline: 2px solid currentColor;\n outline-offset: 2px;\n}\n\n.vue-toast__close-icon {\n display: block;\n}\n\n/* Position classes */\n.vue-toast--topleft {\n position: fixed;\n top: 20px;\n left: 20px;\n}\n\n.vue-toast--topcenter {\n position: fixed;\n top: 20px;\n left: 50%;\n transform: translateX(-50%);\n}\n\n.vue-toast--topright {\n position: fixed;\n top: 20px;\n right: 20px;\n}\n\n.vue-toast--bottomleft {\n position: fixed;\n bottom: 20px;\n left: 20px;\n}\n\n.vue-toast--bottomcenter {\n position: fixed;\n bottom: 20px;\n left: 50%;\n transform: translateX(-50%);\n}\n\n.vue-toast--bottomright {\n position: fixed;\n bottom: 20px;\n right: 20px;\n}\n\n/* Animation */\n@keyframes toast-slide-in {\n from {\n opacity: 0;\n transform: translateY(-20px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n/* Responsive */\n@media (max-width: 640px) {\n .vue-toast {\n min-width: calc(100vw - 40px);\n max-width: calc(100vw - 40px);\n margin-left: 20px;\n margin-right: 20px;\n }\n \n .vue-toast--topleft,\n .vue-toast--topcenter,\n .vue-toast--topright {\n top: 10px;\n }\n \n .vue-toast--bottomleft,\n .vue-toast--bottomcenter,\n .vue-toast--bottomright {\n bottom: 10px;\n }\n}\n</style>","import { ref, computed, onUnmounted, type Ref } from 'vue'\nimport type { ToastOptions, ToastPosition } from '@/types'\n\ninterface ToastInstance extends ToastOptions {\n id: string\n timer?: ReturnType<typeof setTimeout>\n}\n\nexport function useToast(defaultPosition: ToastPosition = 'top-right') {\n const toasts: Ref<ToastInstance[]> = ref([])\n\n const generateId = () => `toast-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\n\n const addToast = (options: ToastOptions) => {\n const id = options.id || generateId()\n const toast: ToastInstance = {\n ...options,\n id,\n position: options.position || defaultPosition,\n duration: options.duration ?? 5000,\n dismissible: options.dismissible ?? true,\n }\n\n toasts.value.push(toast)\n\n if (toast.duration && toast.duration > 0) {\n toast.timer = setTimeout(() => {\n removeToast(id)\n }, toast.duration)\n }\n\n return id\n }\n\n const removeToast = (id: string) => {\n const index = toasts.value.findIndex(t => t.id === id)\n if (index === -1) return\n\n const toast = toasts.value[index]\n \n if (toast.timer) {\n clearTimeout(toast.timer)\n }\n\n if (toast.onClose) {\n toast.onClose()\n }\n\n toasts.value.splice(index, 1)\n }\n\n const clearToasts = () => {\n toasts.value.forEach(toast => {\n if (toast.timer) {\n clearTimeout(toast.timer)\n }\n if (toast.onClose) {\n toast.onClose()\n }\n })\n toasts.value = []\n }\n\n const success = (message: string, options: Omit<ToastOptions, 'message' | 'type'> = {}) => {\n return addToast({\n ...options,\n message,\n type: 'success',\n })\n }\n\n const error = (message: string, options: Omit<ToastOptions, 'message' | 'type'> = {}) => {\n return addToast({\n ...options,\n message,\n type: 'error',\n })\n }\n\n const warning = (message: string, options: Omit<ToastOptions, 'message' | 'type'> = {}) => {\n return addToast({\n ...options,\n message,\n type: 'warning',\n })\n }\n\n const info = (message: string, options: Omit<ToastOptions, 'message' | 'type'> = {}) => {\n return addToast({\n ...options,\n message,\n type: 'info',\n })\n }\n\n const groupedToasts = computed(() => {\n const groups: Record<string, ToastInstance[]> = {}\n \n toasts.value.forEach(toast => {\n const position = toast.position || defaultPosition\n if (!groups[position]) {\n groups[position] = []\n }\n groups[position].push(toast)\n })\n\n return groups\n })\n\n onUnmounted(() => {\n clearToasts()\n })\n\n return {\n toasts,\n groupedToasts,\n addToast,\n removeToast,\n clearToasts,\n success,\n error,\n warning,\n info,\n }\n}\n\nexport type UseToastReturn = ReturnType<typeof useToast>","import { type App } from 'vue'\nimport Toast from './components/Toast'\nimport { useToast } from './composables/useToast'\nimport type { ToastOptions, ToastPosition, ToastType } from './types'\n\nexport { Toast, useToast }\nexport type { ToastOptions, ToastPosition, ToastType }\n\nconst VueToast = {\n install: (app: App, pluginOptions?: { defaultPosition?: ToastPosition }) => {\n app.component('VueToast', Toast)\n \n app.config.globalProperties.$toast = {\n success: (message: string, options?: Omit<ToastOptions, 'message' | 'type'>) => {\n const { success } = useToast(options?.position || pluginOptions?.defaultPosition)\n return success(message, options)\n },\n error: (message: string, options?: Omit<ToastOptions, 'message' | 'type'>) => {\n const { error } = useToast(options?.position || pluginOptions?.defaultPosition)\n return error(message, options)\n },\n warning: (message: string, options?: Omit<ToastOptions, 'message' | 'type'>) => {\n const { warning } = useToast(options?.position || pluginOptions?.defaultPosition)\n return warning(message, options)\n },\n info: (message: string, options?: Omit<ToastOptions, 'message' | 'type'>) => {\n const { info } = useToast(options?.position || pluginOptions?.defaultPosition)\n return info(message, options)\n },\n add: (options: ToastOptions) => {\n const { addToast } = useToast(options.position)\n return addToast(options)\n },\n }\n },\n}\n\nexport default VueToast"],"names":["props","__props","emit","__emit","positionClass","computed","toast","position","replace","toastStyle","index","total","ariaLabel","success","error","warning","info","default","type","handleClose","id","handleClick","onClick","_createElementBlock","class","_normalizeClass","value","dismissible","style","role","_createElementVNode","_hoisted_2","_hoisted_3","_toDisplayString","message","viewBox","width","height","fill","stroke","x1","y1","x2","y2","useToast","defaultPosition","toasts","ref","addToast","options","Date","now","Math","random","toString","substr","duration","push","timer","setTimeout","removeToast","findIndex","t","clearTimeout","onClose","splice","clearToasts","forEach","groupedToasts","groups","onUnmounted","VueToast","install","app","pluginOptions","component","Toast","config","globalProperties","$toast","add"],"mappings":"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"}
1
+ {"version":3,"file":"vue-toast.umd.js","sources":["../src/components/Toast/Toast.vue","../src/store/toastStore.ts","../src/components/VueToast/VueToast.vue","../src/index.ts","../src/composables/useToast.ts"],"sourcesContent":["<template>\n <div\n :class=\"[\n 'vue-toast',\n `vue-toast--${toast.type || 'default'}`,\n `vue-toast--${positionClass}`,\n { 'vue-toast--dismissible': toast.dismissible }\n ]\"\n :style=\"toastStyle\"\n @click=\"handleClick\"\n role=\"alert\"\n aria-live=\"polite\"\n :aria-label=\"ariaLabel\"\n >\n <div class=\"vue-toast__content\">\n <span class=\"vue-toast__message\">{{ toast.message }}</span>\n </div>\n \n <button\n v-if=\"toast.dismissible\"\n class=\"vue-toast__close\"\n @click.stop=\"handleClose\"\n aria-label=\"Close notification\"\n >\n <svg\n class=\"vue-toast__close-icon\"\n viewBox=\"0 0 24 24\"\n width=\"16\"\n height=\"16\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n </svg>\n </button>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport type { ToastComponentProps, ToastType } from '@/types'\n\nconst props = defineProps<ToastComponentProps>()\n\nconst emit = defineEmits<{\n close: [id?: string]\n click: []\n}>()\n\nconst positionClass = computed(() => {\n const position = props.toast.position || 'top-right'\n return position.replace('-', '')\n})\n\nconst toastStyle = computed(() => ({\n '--toast-index': props.index,\n '--toast-total': props.total,\n}))\n\nconst ariaLabel = computed(() => {\n const type = props.toast.type || 'default'\n const typeLabels: Record<ToastType, string> = {\n success: 'Success notification',\n error: 'Error notification',\n warning: 'Warning notification',\n info: 'Information notification',\n default: 'Notification',\n }\n return typeLabels[type]\n})\n\nconst handleClose = () => {\n emit('close', props.toast.id)\n}\n\nconst handleClick = () => {\n if (props.toast.onClick) {\n props.toast.onClick()\n }\n emit('click')\n}\n</script>\n\n<style scoped>\n.vue-toast {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: space-between;\n min-width: 300px;\n max-width: 500px;\n padding: 12px 16px;\n margin-bottom: 8px;\n border-radius: 6px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n background-color: white;\n color: #333;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n font-size: 14px;\n line-height: 1.4;\n animation: toast-slide-in 0.3s ease-out;\n transition: transform 0.2s ease, opacity 0.2s ease;\n z-index: calc(1000 + var(--toast-index));\n cursor: pointer;\n}\n\n.vue-toast:hover {\n transform: translateY(-1px);\n box-shadow: 0 6px 16px rgba(0, 0, 0, 0.2);\n}\n\n.vue-toast--success {\n border-left: 4px solid #10b981;\n background-color: #f0fdf4;\n color: #065f46;\n}\n\n.vue-toast--error {\n border-left: 4px solid #ef4444;\n background-color: #fef2f2;\n color: #991b1b;\n}\n\n.vue-toast--warning {\n border-left: 4px solid #f59e0b;\n background-color: #fffbeb;\n color: #92400e;\n}\n\n.vue-toast--info {\n border-left: 4px solid #3b82f6;\n background-color: #eff6ff;\n color: #1e40af;\n}\n\n.vue-toast--default {\n border-left: 4px solid #6b7280;\n background-color: #f9fafb;\n color: #374151;\n}\n\n.vue-toast__content {\n flex: 1;\n margin-right: 8px;\n}\n\n.vue-toast__message {\n word-break: break-word;\n}\n\n.vue-toast__close {\n flex-shrink: 0;\n background: none;\n border: none;\n padding: 4px;\n margin-left: 8px;\n cursor: pointer;\n color: inherit;\n opacity: 0.7;\n border-radius: 4px;\n transition: opacity 0.2s ease, background-color 0.2s ease;\n}\n\n.vue-toast__close:hover {\n opacity: 1;\n background-color: rgba(0, 0, 0, 0.1);\n}\n\n.vue-toast__close:focus {\n outline: 2px solid currentColor;\n outline-offset: 2px;\n}\n\n.vue-toast__close-icon {\n display: block;\n}\n\n/* Position classes */\n.vue-toast--topleft {\n position: fixed;\n top: 20px;\n left: 20px;\n}\n\n.vue-toast--topcenter {\n position: fixed;\n top: 20px;\n left: 50%;\n transform: translateX(-50%);\n}\n\n.vue-toast--topright {\n position: fixed;\n top: 20px;\n right: 20px;\n}\n\n.vue-toast--bottomleft {\n position: fixed;\n bottom: 20px;\n left: 20px;\n}\n\n.vue-toast--bottomcenter {\n position: fixed;\n bottom: 20px;\n left: 50%;\n transform: translateX(-50%);\n}\n\n.vue-toast--bottomright {\n position: fixed;\n bottom: 20px;\n right: 20px;\n}\n\n/* Animation */\n@keyframes toast-slide-in {\n from {\n opacity: 0;\n transform: translateY(-20px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n/* Responsive */\n@media (max-width: 640px) {\n .vue-toast {\n min-width: calc(100vw - 40px);\n max-width: calc(100vw - 40px);\n margin-left: 20px;\n margin-right: 20px;\n }\n \n .vue-toast--topleft,\n .vue-toast--topcenter,\n .vue-toast--topright {\n top: 10px;\n }\n \n .vue-toast--bottomleft,\n .vue-toast--bottomcenter,\n .vue-toast--bottomright {\n bottom: 10px;\n }\n}\n</style>","import { ref, shallowRef, type Ref } from 'vue'\nimport type { ToastOptions, ToastPosition, ToastType } from '@/types'\n\nexport interface ToastInstance extends ToastOptions {\n id: string\n timer?: ReturnType<typeof setTimeout>\n}\n\ninterface ToastStore {\n toasts: Ref<ToastInstance[]>\n addToast: (options: ToastOptions) => string\n removeToast: (id: string) => void\n clearToasts: () => void\n updateToast: (id: string, updates: Partial<ToastOptions>) => void\n}\n\n// Helper function to generate unique IDs\nconst generateId = () => `toast-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\n\n// Helper function to group toasts by position\nexport const groupToasts = (toasts: ToastInstance[]): Record<string, ToastInstance[]> => {\n const groups: Record<string, ToastInstance[]> = {}\n \n toasts.forEach(toast => {\n const position = toast.position || 'top-right'\n if (!groups[position]) {\n groups[position] = []\n }\n groups[position].push(toast)\n })\n\n return groups\n}\n\n// Create the singleton store\nconst createToastStore = (defaultPosition: ToastPosition = 'top-right'): ToastStore => {\n // Use shallowRef for better performance with array updates\n const toasts = shallowRef<ToastInstance[]>([])\n\n const addToast = (options: ToastOptions): string => {\n const id = options.id || generateId()\n const toast: ToastInstance = {\n ...options,\n id,\n position: options.position || defaultPosition,\n duration: options.duration ?? 5000,\n dismissible: options.dismissible ?? true,\n type: options.type || 'default',\n }\n\n toasts.value = [...toasts.value, toast]\n\n if (toast.duration && toast.duration > 0) {\n toast.timer = setTimeout(() => {\n removeToast(id)\n }, toast.duration)\n }\n\n return id\n }\n\n const removeToast = (id: string): void => {\n const index = toasts.value.findIndex(t => t.id === id)\n if (index === -1) return\n\n const toast = toasts.value[index]\n \n if (toast.timer) {\n clearTimeout(toast.timer)\n }\n\n if (toast.onClose) {\n toast.onClose()\n }\n\n toasts.value = toasts.value.filter(t => t.id !== id)\n }\n\n const clearToasts = (): void => {\n toasts.value.forEach(toast => {\n if (toast.timer) {\n clearTimeout(toast.timer)\n }\n if (toast.onClose) {\n toast.onClose()\n }\n })\n toasts.value = []\n }\n\n const updateToast = (id: string, updates: Partial<ToastOptions>): void => {\n const index = toasts.value.findIndex(t => t.id === id)\n if (index === -1) return\n\n const toast = toasts.value[index]\n \n // Clear existing timer if duration is being updated\n if (updates.duration !== undefined && toast.timer) {\n clearTimeout(toast.timer)\n }\n\n const updatedToast = { ...toast, ...updates }\n \n // Set new timer if duration is provided and > 0\n if (updates.duration && updates.duration > 0) {\n updatedToast.timer = setTimeout(() => {\n removeToast(id)\n }, updates.duration)\n }\n\n toasts.value = [\n ...toasts.value.slice(0, index),\n updatedToast,\n ...toasts.value.slice(index + 1)\n ]\n }\n\n return {\n toasts,\n addToast,\n removeToast,\n clearToasts,\n updateToast,\n }\n}\n\n// Global singleton instance\nlet globalStore: ToastStore | null = null\n\nexport const getToastStore = (defaultPosition: ToastPosition = 'top-right'): ToastStore => {\n if (!globalStore) {\n globalStore = createToastStore(defaultPosition)\n }\n return globalStore\n}\n\nexport const resetToastStore = (): void => {\n if (globalStore) {\n globalStore.clearToasts()\n }\n globalStore = null\n}","<template>\n <!-- Render toast containers for each position -->\n <div\n v-for=\"(toasts, position) in groupedToasts\"\n :key=\"position\"\n :class=\"`vue-toast-container vue-toast-container--${position.replace('-', '')}`\"\n >\n <Toast\n v-for=\"(toast, index) in toasts\"\n :key=\"toast.id\"\n :toast=\"toast\"\n :index=\"index\"\n :total=\"toasts.length\"\n @close=\"removeToast(toast.id)\"\n @click=\"handleToastClick(toast)\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport Toast from '../Toast/Toast.vue'\nimport { getToastStore, groupToasts } from '@/store/toastStore'\nimport type { ToastInstance } from '@/store/toastStore'\n\n// Get the global store\nconst store = getToastStore()\n\n// Compute grouped toasts for rendering\nconst groupedToasts = computed(() => {\n return groupToasts(store.toasts.value)\n})\n\n// Handle toast removal\nconst removeToast = (id: string) => {\n store.removeToast(id)\n}\n\n// Handle toast click\nconst handleToastClick = (toast: ToastInstance) => {\n if (toast.onClick) {\n toast.onClick()\n }\n}\n</script>\n\n<style scoped>\n.vue-toast-container {\n position: fixed;\n z-index: 9999;\n pointer-events: none;\n}\n\n/* Position styles */\n.vue-toast-container--topleft {\n top: 20px;\n left: 20px;\n}\n\n.vue-toast-container--topcenter {\n top: 20px;\n left: 50%;\n transform: translateX(-50%);\n}\n\n.vue-toast-container--topright {\n top: 20px;\n right: 20px;\n}\n\n.vue-toast-container--bottomleft {\n bottom: 20px;\n left: 20px;\n}\n\n.vue-toast-container--bottomcenter {\n bottom: 20px;\n left: 50%;\n transform: translateX(-50%);\n}\n\n.vue-toast-container--bottomright {\n bottom: 20px;\n right: 20px;\n}\n\n/* Responsive adjustments */\n@media (max-width: 640px) {\n .vue-toast-container--topleft,\n .vue-toast-container--topcenter,\n .vue-toast-container--topright {\n top: 10px;\n }\n \n .vue-toast-container--bottomleft,\n .vue-toast-container--bottomcenter,\n .vue-toast-container--bottomright {\n bottom: 10px;\n }\n \n .vue-toast-container--topleft,\n .vue-toast-container--bottomleft {\n left: 10px;\n }\n \n .vue-toast-container--topright,\n .vue-toast-container--bottomright {\n right: 10px;\n }\n \n .vue-toast-container--topcenter,\n .vue-toast-container--bottomcenter {\n left: 50%;\n transform: translateX(-50%);\n }\n}\n</style>","import { type App } from 'vue'\nimport Toast from './components/Toast'\nimport VueToast from './components/VueToast'\nimport { useToast } from './composables/useToast'\nimport { getToastStore } from './store/toastStore'\nimport type { ToastOptions, ToastPosition, ToastType } from './types'\n\nexport { Toast, VueToast, useToast }\nexport type { ToastOptions, ToastPosition, ToastType }\n\nconst VueToastPlugin = {\n install: (app: App, pluginOptions?: { defaultPosition?: ToastPosition }) => {\n // Register the container component globally\n app.component('VueToast', VueToast)\n \n // Initialize store with default position if provided\n const store = getToastStore(pluginOptions?.defaultPosition)\n \n // Set up global $toast API\n app.config.globalProperties.$toast = {\n success: (message: string, options?: Omit<ToastOptions, 'message' | 'type'>) => {\n return store.addToast({\n ...options,\n message,\n type: 'success',\n })\n },\n error: (message: string, options?: Omit<ToastOptions, 'message' | 'type'>) => {\n return store.addToast({\n ...options,\n message,\n type: 'error',\n })\n },\n warning: (message: string, options?: Omit<ToastOptions, 'message' | 'type'>) => {\n return store.addToast({\n ...options,\n message,\n type: 'warning',\n })\n },\n info: (message: string, options?: Omit<ToastOptions, 'message' | 'type'>) => {\n return store.addToast({\n ...options,\n message,\n type: 'info',\n })\n },\n add: (options: ToastOptions) => {\n return store.addToast(options)\n },\n remove: (id: string) => {\n store.removeToast(id)\n },\n clear: () => {\n store.clearToasts()\n },\n }\n },\n}\n\nexport default VueToastPlugin","import { computed } from 'vue'\nimport type { ToastOptions, ToastPosition } from '@/types'\nimport { getToastStore, groupToasts } from '@/store/toastStore'\n\nexport function useToast(defaultPosition: ToastPosition = 'top-right') {\n const store = getToastStore(defaultPosition)\n\n const success = (message: string, options: Omit<ToastOptions, 'message' | 'type'> = {}) => {\n return store.addToast({\n ...options,\n message,\n type: 'success',\n })\n }\n\n const error = (message: string, options: Omit<ToastOptions, 'message' | 'type'> = {}) => {\n return store.addToast({\n ...options,\n message,\n type: 'error',\n })\n }\n\n const warning = (message: string, options: Omit<ToastOptions, 'message' | 'type'> = {}) => {\n return store.addToast({\n ...options,\n message,\n type: 'warning',\n })\n }\n\n const info = (message: string, options: Omit<ToastOptions, 'message' | 'type'> = {}) => {\n return store.addToast({\n ...options,\n message,\n type: 'info',\n })\n }\n\n const groupedToasts = computed(() => {\n return groupToasts(store.toasts.value)\n })\n\n return {\n // State\n toasts: store.toasts,\n groupedToasts,\n \n // Convenience methods\n success,\n error,\n warning,\n info,\n \n // Core methods\n addToast: store.addToast,\n removeToast: store.removeToast,\n clearToasts: store.clearToasts,\n updateToast: store.updateToast,\n }\n}\n\nexport type UseToastReturn = ReturnType<typeof useToast>"],"names":["props","__props","emit","__emit","positionClass","computed","toast","position","replace","toastStyle","index","total","ariaLabel","success","error","warning","info","default","type","handleClose","id","handleClick","onClick","_createElementBlock","class","_normalizeClass","value","dismissible","style","role","_createElementVNode","_hoisted_2","_hoisted_3","_toDisplayString","message","viewBox","width","height","fill","stroke","x1","y1","x2","y2","groupToasts","toasts","groups","forEach","push","createToastStore","defaultPosition","shallowRef","removeToast","findIndex","t","timer","clearTimeout","onClose","filter","addToast","options","Date","now","Math","random","toString","substr","duration","setTimeout","clearToasts","updateToast","updates","updatedToast","slice","globalStore","getToastStore","store","groupedToasts","_openBlock","_Fragment","_renderList","key","_createBlock","Toast","length","$event","handleToastClick","VueToastPlugin","install","app","pluginOptions","component","VueToast","config","globalProperties","$toast","add","remove","clear"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rosadorito/vue-toast",
3
- "version": "0.0.1",
3
+ "version": "0.0.3",
4
4
  "description": "A lightweight, customizable toast notification library for Vue 3",
5
5
  "type": "module",
6
6
  "main": "./dist/vue-toast.umd.js",
@@ -44,12 +44,12 @@
44
44
  "license": "MIT",
45
45
  "repository": {
46
46
  "type": "git",
47
- "url": "git+https://github.com/yourusername/vue-toast.git"
47
+ "url": "https://github.com/rosavalenzuela23/vue-toast.git"
48
48
  },
49
49
  "bugs": {
50
- "url": "https://github.com/yourusername/vue-toast/issues"
50
+ "url": "https://github.com/rosavalenzuela23/vue-toast/issues"
51
51
  },
52
- "homepage": "https://github.com/yourusername/vue-toast#readme",
52
+ "homepage": "https://github.com/rosavalenzuela23/vue-toast#readme",
53
53
  "packageManager": "pnpm@10.30.1",
54
54
  "dependencies": {
55
55
  "vue": "^3.5.32"