@divetocode/toast
Version:
A lightweight toast notification system for React/Next.js
124 lines (117 loc) • 4.38 kB
JavaScript
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// src/index.ts
var index_exports = {};
__export(index_exports, {
ToastRoot: () => ToastRoot_default,
showToast: () => showToast
});
module.exports = __toCommonJS(index_exports);
// src/Toast.tsx
var listener = null;
var showToast = (message, options) => {
listener?.(message, options);
};
var _internalSetToastListener = (fn) => {
listener = fn;
};
// src/ToastRoot.tsx
var import_react = require("react");
var import_react_dom = require("react-dom");
var import_jsx_runtime = require("react/jsx-runtime");
var toastId = 0;
var ToastRoot = () => {
const [toasts, setToasts] = (0, import_react.useState)([]);
const [mounted, setMounted] = (0, import_react.useState)(false);
(0, import_react.useEffect)(() => {
setMounted(true);
_internalSetToastListener((message, options) => {
const id = toastId++;
const type = options?.type || "success";
setToasts((prev) => [...prev, { id, message, type }]);
setTimeout(() => {
setToasts((prev) => prev.filter((t) => t.id !== id));
}, 5e3);
});
}, []);
if (!mounted) return null;
return (0, import_react_dom.createPortal)(
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("style", { children: `
@keyframes slide-in {
0% {
opacity: 0;
transform: translateX(100%);
}
100% {
opacity: 1;
transform: translateX(0);
}
}
.toast-container {
position: fixed;
top: 1.5rem; /* top-6 */
right: 1.5rem; /* right-6 */
z-index: 50;
display: flex;
flex-direction: column;
align-items: flex-end;
gap: 0.5rem; /* space-y-2 */
pointer-events: none;
}
.toast-base {
position: relative;
width: 100%;
max-width: 20rem; /* max-w-xs */
padding: 0.5rem 1rem; /* px-4 py-2 */
margin-top: 0.5rem; /* mt-2 */
border-radius: 0.375rem; /* rounded-md */
box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1),
0 4px 6px -2px rgba(0, 0, 0, 0.05); /* shadow-lg */
font-size: 0.875rem; /* text-sm */
font-weight: 500; /* font-medium */
transition: all 0.5s; /* transition-all duration-500 */
transform: translateX(0); /* transform */
animation: slide-in 0.3s ease-out; /* animate-slide-in */
}
.toast-success {
background-color: #d1fae5; /* bg-green-100 */
color: #065f46; /* text-green-900 */
border: 1px solid #a7f3d0; /* border-green-300 */
}
.toast-error {
background-color: #fee2e2; /* bg-red-100 */
color: #991b1b; /* text-red-900 */
border: 1px solid #fca5a5; /* border-red-300 */
}
` }),
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "toast-container", children: toasts.map((t) => {
const typeClass = t.type === "error" ? "toast-error" : "toast-success";
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: `toast-base ${typeClass}`, children: t.message }, t.id);
}) })
] }),
document.body
);
};
var ToastRoot_default = ToastRoot;
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
ToastRoot,
showToast
});
//# sourceMappingURL=index.cjs.map