UNPKG

@zag-js/toast

Version:

Core logic for the toast widget implemented as a state machine

157 lines (155 loc) • 5.55 kB
"use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; 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 __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/toast.connect.ts var toast_connect_exports = {}; __export(toast_connect_exports, { connect: () => connect }); module.exports = __toCommonJS(toast_connect_exports); var import_dom_query = require("@zag-js/dom-query"); var import_toast = require("./toast.anatomy.js"); var dom = __toESM(require("./toast.dom.js")); var import_toast2 = require("./toast.utils.js"); function connect(service, normalize) { const { state, send, prop, scope, context, computed } = service; const translations = prop("translations"); const visible = state.hasTag("visible"); const paused = state.hasTag("paused"); const mounted = context.get("mounted"); const frontmost = computed("frontmost"); const placement = prop("parent").computed("placement"); const type = prop("type"); const stacked = prop("stacked"); const title = prop("title"); const description = prop("description"); const action = prop("action"); const [side, align = "center"] = placement.split("-"); return { type, title, description, placement, visible, paused, closable: !!prop("closable"), pause() { send({ type: "PAUSE" }); }, resume() { send({ type: "RESUME" }); }, dismiss() { send({ type: "DISMISS", src: "programmatic" }); }, getRootProps() { return normalize.element({ ...import_toast.parts.root.attrs, dir: prop("dir"), id: dom.getRootId(scope), "data-state": visible ? "open" : "closed", "data-type": type, "data-placement": placement, "data-align": align, "data-side": side, "data-mounted": (0, import_dom_query.dataAttr)(mounted), "data-paused": (0, import_dom_query.dataAttr)(paused), "data-first": (0, import_dom_query.dataAttr)(frontmost), "data-sibling": (0, import_dom_query.dataAttr)(!frontmost), "data-stack": (0, import_dom_query.dataAttr)(stacked), "data-overlap": (0, import_dom_query.dataAttr)(!stacked), role: "status", "aria-atomic": "true", "aria-describedby": description ? dom.getDescriptionId(scope) : void 0, "aria-labelledby": title ? dom.getTitleId(scope) : void 0, tabIndex: 0, style: (0, import_toast2.getPlacementStyle)(service, visible), onKeyDown(event) { if (event.defaultPrevented) return; if (event.key == "Escape") { send({ type: "DISMISS", src: "keyboard" }); event.preventDefault(); } } }); }, /* Leave a ghost div to avoid setting hover to false when transitioning out */ getGhostBeforeProps() { return normalize.element({ "data-ghost": "before", style: (0, import_toast2.getGhostBeforeStyle)(service, visible) }); }, /* Needed to avoid setting hover to false when in between toasts */ getGhostAfterProps() { return normalize.element({ "data-ghost": "after", style: (0, import_toast2.getGhostAfterStyle)() }); }, getTitleProps() { return normalize.element({ ...import_toast.parts.title.attrs, id: dom.getTitleId(scope) }); }, getDescriptionProps() { return normalize.element({ ...import_toast.parts.description.attrs, id: dom.getDescriptionId(scope) }); }, getActionTriggerProps() { return normalize.button({ ...import_toast.parts.actionTrigger.attrs, type: "button", onClick(event) { if (event.defaultPrevented) return; action?.onClick?.(); send({ type: "DISMISS", src: "user" }); } }); }, getCloseTriggerProps() { return normalize.button({ id: dom.getCloseTriggerId(scope), ...import_toast.parts.closeTrigger.attrs, type: "button", "aria-label": translations?.closeTriggerLabel, onClick(event) { if (event.defaultPrevented) return; send({ type: "DISMISS", src: "user" }); } }); } }; } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { connect });