@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.
- package/dist/components/VueToast/VueToast.vue.d.ts +3 -0
- package/dist/components/VueToast/VueToast.vue.d.ts.map +1 -0
- package/dist/components/VueToast/index.d.ts +4 -0
- package/dist/components/VueToast/index.d.ts.map +1 -0
- package/dist/composables/useToast.d.ts +6 -11
- package/dist/composables/useToast.d.ts.map +1 -1
- package/dist/index.d.ts +4 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/store/toastStore.d.ts +18 -0
- package/dist/store/toastStore.d.ts.map +1 -0
- package/dist/vue-toast.css +1 -1
- package/dist/vue-toast.es.js +140 -43
- package/dist/vue-toast.es.js.map +1 -1
- package/dist/vue-toast.umd.js +1 -1
- package/dist/vue-toast.umd.js.map +1 -1
- package/package.json +4 -4
|
@@ -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 @@
|
|
|
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":"
|
|
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
|
|
8
|
+
declare const VueToastPlugin: {
|
|
8
9
|
install: (app: App, pluginOptions?: {
|
|
9
10
|
defaultPosition?: ToastPosition;
|
|
10
11
|
}) => void;
|
|
11
12
|
};
|
|
12
|
-
export default
|
|
13
|
+
export default VueToastPlugin;
|
|
13
14
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/vue-toast.css
CHANGED
|
@@ -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%)}}
|
package/dist/vue-toast.es.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { defineComponent, computed, openBlock, createElementBlock, normalizeStyle, normalizeClass, createElementVNode, toDisplayString, withModifiers, createCommentVNode,
|
|
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
|
-
|
|
105
|
-
|
|
106
|
-
const
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
264
|
+
// State
|
|
265
|
+
toasts: store.toasts,
|
|
191
266
|
groupedToasts,
|
|
192
|
-
|
|
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
|
|
279
|
+
const VueToastPlugin = {
|
|
202
280
|
install: (app, pluginOptions) => {
|
|
203
|
-
app.component("VueToast",
|
|
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
|
-
|
|
207
|
-
|
|
285
|
+
return store.addToast({
|
|
286
|
+
...options,
|
|
287
|
+
message,
|
|
288
|
+
type: "success"
|
|
289
|
+
});
|
|
208
290
|
},
|
|
209
291
|
error: (message, options) => {
|
|
210
|
-
|
|
211
|
-
|
|
292
|
+
return store.addToast({
|
|
293
|
+
...options,
|
|
294
|
+
message,
|
|
295
|
+
type: "error"
|
|
296
|
+
});
|
|
212
297
|
},
|
|
213
298
|
warning: (message, options) => {
|
|
214
|
-
|
|
215
|
-
|
|
299
|
+
return store.addToast({
|
|
300
|
+
...options,
|
|
301
|
+
message,
|
|
302
|
+
type: "warning"
|
|
303
|
+
});
|
|
216
304
|
},
|
|
217
305
|
info: (message, options) => {
|
|
218
|
-
|
|
219
|
-
|
|
306
|
+
return store.addToast({
|
|
307
|
+
...options,
|
|
308
|
+
message,
|
|
309
|
+
type: "info"
|
|
310
|
+
});
|
|
220
311
|
},
|
|
221
312
|
add: (options) => {
|
|
222
|
-
|
|
223
|
-
|
|
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
|
|
326
|
+
VueToast,
|
|
327
|
+
VueToastPlugin as default,
|
|
231
328
|
useToast
|
|
232
329
|
};
|
|
233
330
|
//# sourceMappingURL=vue-toast.es.js.map
|
package/dist/vue-toast.es.js.map
CHANGED
|
@@ -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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"}
|
package/dist/vue-toast.umd.js
CHANGED
|
@@ -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"},
|
|
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.
|
|
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": "
|
|
47
|
+
"url": "https://github.com/rosavalenzuela23/vue-toast.git"
|
|
48
48
|
},
|
|
49
49
|
"bugs": {
|
|
50
|
-
"url": "https://github.com/
|
|
50
|
+
"url": "https://github.com/rosavalenzuela23/vue-toast/issues"
|
|
51
51
|
},
|
|
52
|
-
"homepage": "https://github.com/
|
|
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"
|