const require_rolldown_runtime = require('../rolldown-runtime.cjs'); const require_shared_createContext = require('../shared/createContext.cjs'); const require_shared_getActiveElement = require('../shared/getActiveElement.cjs'); const require_shared_useForwardExpose = require('../shared/useForwardExpose.cjs'); const require_Primitive_Primitive = require('../Primitive/Primitive.cjs'); const require_Collection_Collection = require('../Collection/Collection.cjs'); const require_Toast_ToastProvider = require('./ToastProvider.cjs'); const require_Toast_ToastAnnounce = require('./ToastAnnounce.cjs'); const require_Toast_ToastPositioner = require('./ToastPositioner.cjs'); const require_Toast_utils = require('./utils.cjs'); const vue = require_rolldown_runtime.__toESM(require("vue")); const __vueuse_core = require_rolldown_runtime.__toESM(require("@vueuse/core")); const __vueuse_shared = require_rolldown_runtime.__toESM(require("@vueuse/shared")); //#region src/Toast/ToastRootImpl.vue?vue&type=script&setup=true&lang.ts const [injectToastRootContext, provideToastRootContext] = require_shared_createContext.createContext("ToastRoot"); var ToastRootImpl_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ (0, vue.defineComponent)({ inheritAttrs: false, __name: "ToastRootImpl", props: { type: { type: String, required: false }, open: { type: Boolean, required: false, default: false }, duration: { type: Number, required: false }, toast: { type: Object, required: false }, asChild: { type: Boolean, required: false }, as: { type: null, required: false, default: "li" } }, emits: [ "close", "escapeKeyDown", "pause", "resume", "swipeStart", "swipeMove", "swipeCancel", "swipeEnd" ], setup(__props, { emit: __emit }) { const props = __props; const emits = __emit; const { forwardRef, currentElement } = require_shared_useForwardExpose.useForwardExpose(); const { CollectionItem } = require_Collection_Collection.useCollection(); const providerContext = require_Toast_ToastProvider.injectToastProviderContext(); const pointerStartRef = (0, vue.ref)(null); const swipeDeltaRef = (0, vue.ref)(null); const duration = (0, vue.computed)(() => typeof props.duration === "number" ? props.duration : providerContext.duration.value); const closeTimerStartTimeRef = (0, vue.ref)(0); const closeTimerRemainingTimeRef = (0, vue.ref)(duration.value); const closeTimerRef = (0, vue.ref)(0); const remainingTime = (0, vue.ref)(duration.value); const remainingRaf = (0, __vueuse_core.useRafFn)(() => { const elapsedTime = Date.now() - closeTimerStartTimeRef.value; remainingTime.value = Math.max(closeTimerRemainingTimeRef.value - elapsedTime, 0); }, { fpsLimit: 60 }); function startTimer(duration$1) { if (duration$1 <= 0 || duration$1 === Number.POSITIVE_INFINITY) return; if (!__vueuse_shared.isClient) return; window.clearTimeout(closeTimerRef.value); closeTimerStartTimeRef.value = Date.now(); closeTimerRef.value = window.setTimeout(handleClose, duration$1); } function handleClose(event) { const isNonPointerEvent = event?.pointerType === ""; const isFocusInToast = currentElement.value?.contains(require_shared_getActiveElement.getActiveElement()); if (isFocusInToast && isNonPointerEvent) providerContext.viewport.value?.focus(); if (isNonPointerEvent) providerContext.isClosePausedRef.value = false; emits("close"); } const positionerContext = require_Toast_ToastPositioner.injectToastPositionerContext(null); const announceTextContent = (0, vue.shallowRef)(null); (0, vue.watch)([currentElement, () => props.toast?.updateKey], ([element]) => { announceTextContent.value = element ? require_Toast_utils.getAnnounceTextContent(element) : null; }, { flush: "post", immediate: true }); const stackEntry = (0, vue.reactive)({ seq: 0, height: 0, open: props.open }); const stack = (0, vue.computed)(() => providerContext.getToastStack(stackEntry)); function measureHeight() { const element = currentElement.value; if (!element) return; const previousHeight = element.style.height; element.style.height = "auto"; stackEntry.height = element.offsetHeight; element.style.height = previousHeight; } (0, __vueuse_core.useResizeObserver)(currentElement, measureHeight); (0, vue.watch)(() => props.toast?.updateKey, measureHeight, { flush: "post" }); (0, vue.watch)(() => props.open, (open, wasOpen) => { stackEntry.open = open; if (open && !wasOpen) providerContext.reopenToast(stackEntry); }); if (props.type && !["foreground", "background"].includes(props.type)) { const error = "Invalid prop `type` supplied to `Toast`. Expected `foreground | background`."; throw new Error(error); } (0, vue.watchEffect)((cleanupFn) => { const viewport = providerContext.viewport.value; if (viewport) { const handleResume = () => { startTimer(closeTimerRemainingTimeRef.value); remainingRaf.resume(); emits("resume"); }; const handlePause = () => { const elapsedTime = Date.now() - closeTimerStartTimeRef.value; closeTimerRemainingTimeRef.value = closeTimerRemainingTimeRef.value - elapsedTime; window.clearTimeout(closeTimerRef.value); remainingRaf.pause(); emits("pause"); }; viewport.addEventListener(require_Toast_utils.VIEWPORT_PAUSE, handlePause); viewport.addEventListener(require_Toast_utils.VIEWPORT_RESUME, handleResume); cleanupFn(() => { viewport.removeEventListener(require_Toast_utils.VIEWPORT_PAUSE, handlePause); viewport.removeEventListener(require_Toast_utils.VIEWPORT_RESUME, handleResume); }); } }); const restartKey = (0, vue.computed)(() => props.toast ? providerContext.toastStore.getRestartKey(props.toast.id) : 0); (0, vue.watch)([ () => props.open, duration, restartKey ], () => { closeTimerRemainingTimeRef.value = duration.value; if (props.open && !providerContext.isClosePausedRef.value) startTimer(duration.value); }, { immediate: true }); (0, __vueuse_core.onKeyStroke)("Escape", (event) => { emits("escapeKeyDown", event); if (!event.defaultPrevented) { providerContext.isFocusedToastEscapeKeyDownRef.value = true; handleClose(); } }); let unregisterToast; (0, vue.onMounted)(() => { providerContext.onToastAdd(); unregisterToast = providerContext.registerToast(stackEntry); measureHeight(); }); (0, vue.onUnmounted)(() => { providerContext.onToastRemove(); unregisterToast?.(); }); provideToastRootContext({ onClose: handleClose, toast: (0, vue.toRef)(props, "toast") }); return (_ctx, _cache) => { return (0, vue.openBlock)(), (0, vue.createElementBlock)(vue.Fragment, null, [announceTextContent.value ? ((0, vue.openBlock)(), (0, vue.createBlock)(require_Toast_ToastAnnounce.ToastAnnounce_default, { key: __props.toast?.updateKey ?? 0, role: "alert", "aria-live": __props.type === "foreground" ? "assertive" : "polite" }, { default: (0, vue.withCtx)(() => [(0, vue.createCommentVNode)("\n Render each chunk as its own text node so screen readers get the\n natural pause break between nodes (see comment in utils.ts).\n Interpolating the array directly with `{{ announceTextContent }}`\n would route through Vue's `toDisplayString`, which JSON-stringifies\n arrays — the live region would then announce literal `[`, quotes\n and commas instead of the toast title and description.\n "), ((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)(announceTextContent.value, (text, i) => { return (0, vue.openBlock)(), (0, vue.createElementBlock)(vue.Fragment, { key: i }, [(0, vue.createTextVNode)((0, vue.toDisplayString)(text), 1)], 64); }), 128))]), _: 1 }, 8, ["aria-live"])) : (0, vue.createCommentVNode)("v-if", true), (0, vue.unref)(providerContext).viewport.value || (0, vue.unref)(positionerContext) ? ((0, vue.openBlock)(), (0, vue.createBlock)(vue.Teleport, { key: 1, to: (0, vue.unref)(providerContext).viewport.value ?? "body", disabled: !!(0, vue.unref)(positionerContext) }, [(0, vue.createVNode)((0, vue.unref)(CollectionItem), null, { default: (0, vue.withCtx)(() => [(0, vue.createVNode)((0, vue.unref)(require_Primitive_Primitive.Primitive), (0, vue.mergeProps)({ ref: (0, vue.unref)(forwardRef), tabindex: "0" }, _ctx.$attrs, { as: __props.as, "as-child": __props.asChild, "data-state": __props.open ? "open" : "closed", "data-swipe-direction": (0, vue.unref)(providerContext).swipeDirection.value, "data-status": __props.toast?.status, "data-expanded": (0, vue.unref)(providerContext).expanded.value ? "" : void 0, "data-limited": stack.value.limited ? "" : void 0, inert: stack.value.limited || void 0, style: { ...(0, vue.unref)(providerContext).disableSwipe.value ? void 0 : { userSelect: "none", touchAction: "none" }, "--reka-toast-index": stack.value.index, "--reka-toast-offset-y": `${stack.value.offsetY}px`, "--reka-toast-height": stackEntry.height ? `${stackEntry.height}px` : void 0 }, onPointerdown: _cache[0] || (_cache[0] = (0, vue.withModifiers)((event) => { if ((0, vue.unref)(providerContext).disableSwipe.value) return; pointerStartRef.value = { x: event.clientX, y: event.clientY }; }, ["left"])), onPointermove: _cache[1] || (_cache[1] = (event) => { if ((0, vue.unref)(providerContext).disableSwipe.value || !pointerStartRef.value) return; const x = event.clientX - pointerStartRef.value.x; const y = event.clientY - pointerStartRef.value.y; const hasSwipeMoveStarted = Boolean(swipeDeltaRef.value); const isHorizontalSwipe = ["left", "right"].includes((0, vue.unref)(providerContext).swipeDirection.value); const clamp = ["left", "up"].includes((0, vue.unref)(providerContext).swipeDirection.value) ? Math.min : Math.max; const clampedX = isHorizontalSwipe ? clamp(0, x) : 0; const clampedY = !isHorizontalSwipe ? clamp(0, y) : 0; const moveStartBuffer = event.pointerType === "touch" ? 10 : 2; const delta = { x: clampedX, y: clampedY }; const eventDetail = { originalEvent: event, delta }; if (hasSwipeMoveStarted) { swipeDeltaRef.value = delta; (0, vue.unref)(require_Toast_utils.handleAndDispatchCustomEvent)((0, vue.unref)(require_Toast_utils.TOAST_SWIPE_MOVE), (ev) => emits("swipeMove", ev), eventDetail); } else if ((0, vue.unref)(require_Toast_utils.isDeltaInDirection)(delta, (0, vue.unref)(providerContext).swipeDirection.value, moveStartBuffer)) { swipeDeltaRef.value = delta; (0, vue.unref)(require_Toast_utils.handleAndDispatchCustomEvent)((0, vue.unref)(require_Toast_utils.TOAST_SWIPE_START), (ev) => emits("swipeStart", ev), eventDetail); event.target.setPointerCapture(event.pointerId); } else if (Math.abs(x) > moveStartBuffer || Math.abs(y) > moveStartBuffer) pointerStartRef.value = null; }), onPointerup: _cache[2] || (_cache[2] = (event) => { if ((0, vue.unref)(providerContext).disableSwipe.value) return; const delta = swipeDeltaRef.value; const target = event.target; if (target.hasPointerCapture(event.pointerId)) target.releasePointerCapture(event.pointerId); swipeDeltaRef.value = null; pointerStartRef.value = null; if (delta) { const toast = event.currentTarget; const eventDetail = { originalEvent: event, delta }; if ((0, vue.unref)(require_Toast_utils.isDeltaInDirection)(delta, (0, vue.unref)(providerContext).swipeDirection.value, (0, vue.unref)(providerContext).swipeThreshold.value)) (0, vue.unref)(require_Toast_utils.handleAndDispatchCustomEvent)((0, vue.unref)(require_Toast_utils.TOAST_SWIPE_END), (ev) => emits("swipeEnd", ev), eventDetail); else (0, vue.unref)(require_Toast_utils.handleAndDispatchCustomEvent)((0, vue.unref)(require_Toast_utils.TOAST_SWIPE_CANCEL), (ev) => emits("swipeCancel", ev), eventDetail); toast?.addEventListener("click", (event$1) => event$1.preventDefault(), { once: true }); } }) }), { default: (0, vue.withCtx)(() => [(0, vue.renderSlot)(_ctx.$slots, "default", { remaining: remainingTime.value, duration: duration.value })]), _: 3 }, 16, [ "as", "as-child", "data-state", "data-swipe-direction", "data-status", "data-expanded", "data-limited", "inert", "style" ])]), _: 3 })], 8, ["to", "disabled"])) : (0, vue.createCommentVNode)("v-if", true)], 64); }; } }); //#endregion //#region src/Toast/ToastRootImpl.vue var ToastRootImpl_default = ToastRootImpl_vue_vue_type_script_setup_true_lang_default; //#endregion Object.defineProperty(exports, 'ToastRootImpl_default', { enumerable: true, get: function () { return ToastRootImpl_default; } }); Object.defineProperty(exports, 'injectToastRootContext', { enumerable: true, get: function () { return injectToastRootContext; } }); //# sourceMappingURL=ToastRootImpl.cjs.map