@zag-js/toast 0.69.0 → 0.71.0

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.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/toast-group.connect.ts","../src/toast.anatomy.ts","../src/toast.dom.ts","../src/toast.utils.ts","../src/toast-group.machine.ts","../src/toast.machine.ts","../src/toast.connect.ts","../src/index.ts"],"sourcesContent":["import { isMachine, subscribe } from \"@zag-js/core\"\nimport { contains } from \"@zag-js/dom-query\"\nimport type { NormalizeProps, PropTypes } from \"@zag-js/types\"\nimport { runIfFn, uuid } from \"@zag-js/utils\"\nimport { parts } from \"./toast.anatomy\"\nimport { dom } from \"./toast.dom\"\nimport type { GroupMachineApi, GroupSend, GroupService, GroupState, Options, Placement } from \"./toast.types\"\nimport { getGroupPlacementStyle, getToastsByPlacement } from \"./toast.utils\"\n\nexport function groupConnect<T extends PropTypes, O = any>(\n serviceOrState: GroupState<O> | GroupService<O>,\n send: GroupSend,\n normalize: NormalizeProps<T>,\n): GroupMachineApi<T, O> {\n //\n\n function getState(): GroupState<O> {\n const result = isMachine(serviceOrState) ? serviceOrState.getState() : serviceOrState\n return result as GroupState<O>\n }\n\n function getToastsByPlacementImpl(placement: Placement) {\n return getToastsByPlacement(getState().context.toasts, placement)\n }\n\n function isVisible(id: string) {\n const toasts = getState().context.toasts\n if (!toasts.length) return false\n return !!toasts.find((toast) => toast.id == id)\n }\n\n function create(options: Options<O>) {\n const uid = `toast:${uuid()}`\n const id = options.id ? options.id : uid\n\n if (isVisible(id)) return id\n send({ type: \"ADD_TOAST\", toast: { ...options, id } })\n\n return id\n }\n\n function update(id: string, options: Options<O>) {\n if (!isVisible(id)) return id\n send({ type: \"UPDATE_TOAST\", id, toast: options })\n return id\n }\n\n function upsert(options: Options<O>) {\n const { id } = options\n const visible = id ? isVisible(id) : false\n if (visible && id != null) {\n return update(id, options)\n } else {\n return create(options)\n }\n }\n\n function dismiss(id?: string) {\n if (id == null) {\n send(\"DISMISS_ALL\")\n } else if (isVisible(id)) {\n send({ type: \"DISMISS_TOAST\", id })\n }\n }\n\n return {\n getCount() {\n return getState().context.count\n },\n getPlacements() {\n const toasts = getState().context.toasts\n const placements = toasts.map((toast) => toast.state.context.placement!)\n return Array.from(new Set(placements))\n },\n getToastsByPlacement: getToastsByPlacementImpl,\n isVisible,\n create,\n update,\n upsert,\n dismiss,\n\n remove(id) {\n if (id == null) {\n send(\"REMOVE_ALL\")\n } else if (isVisible(id)) {\n send({ type: \"REMOVE_TOAST\", id })\n }\n },\n\n dismissByPlacement(placement) {\n const toasts = getToastsByPlacementImpl(placement)\n toasts.forEach((toast) => dismiss(toast.id))\n },\n loading(options) {\n return upsert({ ...options, type: \"loading\" })\n },\n success(options) {\n return upsert({ ...options, type: \"success\" })\n },\n error(options) {\n return upsert({ ...options, type: \"error\" })\n },\n\n promise(promise, options, shared = {}) {\n const id = upsert({ ...shared, ...options.loading, type: \"loading\" })\n\n runIfFn(promise)\n .then((response) => {\n const successOptions = runIfFn(options.success, response)\n upsert({ ...shared, ...successOptions, id, type: \"success\" })\n })\n .catch((error) => {\n const errorOptions = runIfFn(options.error, error)\n upsert({ ...shared, ...errorOptions, id, type: \"error\" })\n })\n .finally(() => {\n options.finally?.()\n })\n\n return id\n },\n\n pause(id) {\n if (id == null) {\n send(\"PAUSE_ALL\")\n } else if (isVisible(id)) {\n send({ type: \"PAUSE_TOAST\", id })\n }\n },\n\n resume(id) {\n if (id == null) {\n send(\"RESUME_ALL\")\n } else if (isVisible(id)) {\n send({ type: \"RESUME_TOAST\", id })\n }\n },\n\n getGroupProps(options) {\n const { placement, label = \"Notifications\" } = options\n const state = getState()\n const hotkeyLabel = state.context.hotkey.join(\"+\").replace(/Key/g, \"\").replace(/Digit/g, \"\")\n const [side, align = \"center\"] = placement.split(\"-\")\n\n return normalize.element({\n ...parts.group.attrs,\n dir: state.context.dir,\n tabIndex: -1,\n \"aria-label\": `${placement} ${label} ${hotkeyLabel}`,\n id: dom.getRegionId(placement),\n \"data-placement\": placement,\n \"data-side\": side,\n \"data-align\": align,\n \"aria-live\": \"polite\",\n role: \"region\",\n style: getGroupPlacementStyle(state.context, placement),\n onMouseMove() {\n send({ type: \"REGION.POINTER_ENTER\", placement })\n },\n onMouseLeave() {\n send({ type: \"REGION.POINTER_LEAVE\", placement })\n },\n onFocus(event) {\n send({ type: \"REGION.FOCUS\", target: event.relatedTarget })\n },\n onBlur(event) {\n if (state.context.isFocusWithin && !contains(event.currentTarget, event.relatedTarget)) {\n send({ type: \"REGION.BLUR\" })\n }\n },\n })\n },\n\n subscribe(fn) {\n const state = getState()\n return subscribe(state.context.toasts, () => {\n const toasts = getToastsByPlacementImpl(state.context.placement)\n const contexts = toasts.map((toast) => toast.getState().context)\n fn(contexts)\n })\n },\n }\n}\n","import { createAnatomy } from \"@zag-js/anatomy\"\n\nexport const anatomy = createAnatomy(\"toast\").parts(\n \"group\",\n \"root\",\n \"title\",\n \"description\",\n \"actionTrigger\",\n \"closeTrigger\",\n)\n\nexport const parts = anatomy.build()\n","import { createScope } from \"@zag-js/dom-query\"\nimport type { MachineContext as Ctx, Placement, GroupMachineContext as GroupCtx } from \"./toast.types\"\n\nexport const dom = createScope({\n getRegionId: (placement: Placement) => `toast-group:${placement}`,\n getRegionEl: (ctx: GroupCtx, placement: Placement) => dom.getById(ctx, `toast-group:${placement}`),\n\n getRootId: (ctx: Ctx) => `toast:${ctx.id}`,\n getRootEl: (ctx: Ctx) => dom.getById(ctx, dom.getRootId(ctx)),\n getTitleId: (ctx: Ctx) => `toast:${ctx.id}:title`,\n getDescriptionId: (ctx: Ctx) => `toast:${ctx.id}:description`,\n getCloseTriggerId: (ctx: Ctx) => `toast${ctx.id}:close`,\n})\n","import { MAX_Z_INDEX } from \"@zag-js/dom-query\"\nimport type { Style } from \"@zag-js/types\"\nimport type { GroupMachineContext, MachineContext, Placement, Service, Type } from \"./toast.types\"\n\nexport function getToastsByPlacement<T>(toasts: Service<T>[], placement: Placement) {\n return toasts.filter((toast) => toast.state.context.placement === placement)\n}\n\nexport const defaultTimeouts: Record<Type, number> = {\n info: 5000,\n error: 5000,\n success: 2000,\n loading: Infinity,\n DEFAULT: 5000,\n}\n\nexport function getToastDuration(duration: number | undefined, type: NonNullable<MachineContext[\"type\"]>) {\n return duration ?? defaultTimeouts[type] ?? defaultTimeouts.DEFAULT\n}\n\nexport function getGroupPlacementStyle<T>(ctx: GroupMachineContext<T>, placement: Placement): Style {\n const offset = ctx.offsets\n const computedOffset =\n typeof offset === \"string\" ? { left: offset, right: offset, bottom: offset, top: offset } : offset\n\n const rtl = ctx.dir === \"rtl\"\n const computedPlacement = placement\n .replace(\"-start\", rtl ? \"-right\" : \"-left\")\n .replace(\"-end\", rtl ? \"-left\" : \"-right\")\n\n const isRighty = computedPlacement.includes(\"right\")\n const isLefty = computedPlacement.includes(\"left\")\n\n const styles: Style = {\n position: \"fixed\",\n pointerEvents: ctx.count > 0 ? undefined : \"none\",\n display: \"flex\",\n flexDirection: \"column\",\n \"--gap\": `${ctx.gap}px`,\n \"--first-height\": `${ctx.heights[0]?.height || 0}px`,\n zIndex: MAX_Z_INDEX,\n }\n\n let alignItems: Style[\"alignItems\"] = \"center\"\n if (isRighty) alignItems = \"flex-end\"\n if (isLefty) alignItems = \"flex-start\"\n\n styles.alignItems = alignItems\n\n if (computedPlacement.includes(\"top\")) {\n const offset = computedOffset.top\n styles.top = `max(env(safe-area-inset-top, 0px), ${offset})`\n }\n\n if (computedPlacement.includes(\"bottom\")) {\n const offset = computedOffset.bottom\n styles.bottom = `max(env(safe-area-inset-bottom, 0px), ${offset})`\n }\n\n if (!computedPlacement.includes(\"left\")) {\n const offset = computedOffset.right\n styles.insetInlineEnd = `calc(env(safe-area-inset-right, 0px) + ${offset})`\n }\n\n if (!computedPlacement.includes(\"right\")) {\n const offset = computedOffset.left\n styles.insetInlineStart = `calc(env(safe-area-inset-left, 0px) + ${offset})`\n }\n\n return styles\n}\n\nexport function getPlacementStyle<T>(ctx: MachineContext<T>, visible: boolean): Style {\n const [side] = ctx.placement!.split(\"-\")\n const sibling = !ctx.frontmost\n const overlap = !ctx.stacked\n\n const styles: Style = {\n position: \"absolute\",\n pointerEvents: \"auto\",\n \"--opacity\": \"0\",\n \"--remove-delay\": `${ctx.removeDelay}ms`,\n \"--duration\": `${ctx.type === \"loading\" ? Number.MAX_SAFE_INTEGER : ctx.duration}ms`,\n \"--initial-height\": `${ctx.height}px`,\n \"--offset\": `${ctx.offset}px`,\n \"--index\": ctx.index,\n \"--z-index\": ctx.zIndex,\n \"--lift-amount\": \"calc(var(--lift) * var(--gap))\",\n \"--y\": \"100%\",\n \"--x\": \"0\",\n }\n\n const assign = (overrides: Style) => Object.assign(styles, overrides)\n\n if (side === \"top\") {\n //\n assign({\n top: \"0\",\n \"--sign\": \"-1\",\n \"--y\": \"-100%\",\n \"--lift\": \"1\",\n })\n //\n } else if (side === \"bottom\") {\n //\n assign({\n bottom: \"0\",\n \"--sign\": \"1\",\n \"--y\": \"100%\",\n \"--lift\": \"-1\",\n })\n }\n\n if (ctx.mounted) {\n assign({\n \"--y\": \"0\",\n \"--opacity\": \"1\",\n })\n\n if (ctx.stacked) {\n assign({\n \"--y\": \"calc(var(--lift) * var(--offset))\",\n \"--height\": \"var(--initial-height)\",\n })\n }\n }\n\n if (!visible) {\n assign({\n \"--opacity\": \"0\",\n pointerEvents: \"none\",\n })\n }\n\n if (sibling && overlap) {\n assign({\n \"--base-scale\": \"var(--index) * 0.05 + 1\",\n \"--y\": \"calc(var(--lift-amount) * var(--index))\",\n \"--scale\": \"calc(-1 * var(--base-scale))\",\n \"--height\": \"var(--first-height)\",\n })\n\n if (!visible) {\n assign({\n \"--y\": \"calc(var(--sign) * 40%)\",\n })\n }\n }\n\n if (sibling && ctx.stacked && !visible) {\n assign({\n \"--y\": \"calc(var(--lift) * var(--offset) + var(--lift) * -100%)\",\n })\n }\n\n if (ctx.frontmost && !visible) {\n assign({\n \"--y\": \"calc(var(--lift) * -100%)\",\n })\n }\n\n return styles\n}\n\nexport function getGhostBeforeStyle<T>(ctx: MachineContext<T>, visible: boolean): Style {\n const styles: Style = {\n position: \"absolute\",\n inset: \"0\",\n scale: \"1 2\",\n pointerEvents: visible ? \"none\" : \"auto\",\n }\n\n const assign = (overrides: Style) => Object.assign(styles, overrides)\n\n if (ctx.frontmost && !visible) {\n assign({\n height: \"calc(var(--initial-height) + 80%)\",\n })\n }\n\n return styles\n}\n\nexport function getGhostAfterStyle<T>(_ctx: MachineContext<T>, _visible: boolean): Style {\n return {\n position: \"absolute\",\n left: \"0\",\n height: \"calc(var(--gap) + 2px)\",\n bottom: \"100%\",\n width: \"100%\",\n }\n}\n","import { createMachine, ref } from \"@zag-js/core\"\nimport { trackDismissableBranch } from \"@zag-js/dismissable\"\nimport { addDomEvent } from \"@zag-js/dom-event\"\nimport { compact } from \"@zag-js/utils\"\nimport { dom } from \"./toast.dom\"\nimport { createToastMachine } from \"./toast.machine\"\nimport type {\n GroupMachineContext,\n GroupMachineState,\n MachineContext,\n Service,\n UserDefinedGroupContext,\n} from \"./toast.types\"\nimport { getToastsByPlacement } from \"./toast.utils\"\n\nexport function groupMachine<T = any>(userContext: UserDefinedGroupContext) {\n const ctx = compact(userContext)\n return createMachine<GroupMachineContext<T>, GroupMachineState>(\n {\n id: \"toaster\",\n initial: ctx.overlap ? \"overlap\" : \"stack\",\n context: {\n dir: \"ltr\",\n max: Number.MAX_SAFE_INTEGER,\n gap: 16,\n pauseOnPageIdle: false,\n hotkey: [\"altKey\", \"KeyT\"],\n offsets: \"1rem\",\n placement: \"bottom\",\n removeDelay: 200,\n ...ctx,\n toasts: [],\n lastFocusedEl: null,\n isFocusWithin: false,\n heights: [],\n },\n\n computed: {\n count: (ctx) => ctx.toasts.length,\n },\n\n activities: [\"trackDocumentVisibility\", \"trackHotKeyPress\"],\n\n watch: {\n toasts: [\"collapsedIfEmpty\", \"setDismissableBranch\"],\n },\n\n exit: [\"removeToasts\", \"clearDismissableBranch\", \"clearLastFocusedEl\"],\n\n on: {\n PAUSE_TOAST: {\n actions: [\"pauseToast\"],\n },\n PAUSE_ALL: {\n actions: [\"pauseToasts\"],\n },\n RESUME_TOAST: {\n actions: [\"resumeToast\"],\n },\n RESUME_ALL: {\n actions: [\"resumeToasts\"],\n },\n ADD_TOAST: {\n guard: \"isWithinRange\",\n actions: [\"createToast\", \"syncToastIndex\"],\n },\n UPDATE_TOAST: {\n actions: [\"updateToast\"],\n },\n DISMISS_TOAST: {\n actions: [\"dismissToast\"],\n },\n DISMISS_ALL: {\n actions: [\"dismissToasts\"],\n },\n REMOVE_TOAST: {\n actions: [\"removeToast\", \"syncToastIndex\", \"syncToastOffset\"],\n },\n REMOVE_ALL: {\n actions: [\"removeToasts\"],\n },\n UPDATE_HEIGHT: {\n actions: [\"syncHeights\", \"syncToastOffset\"],\n },\n \"DOC.HOTKEY\": {\n actions: [\"focusRegionEl\"],\n },\n \"REGION.BLUR\": [\n {\n guard: \"isOverlapping\",\n target: \"overlap\",\n actions: [\"resumeToasts\", \"restoreLastFocusedEl\"],\n },\n {\n actions: [\"resumeToasts\", \"restoreLastFocusedEl\"],\n },\n ],\n },\n\n states: {\n stack: {\n entry: [\"expandToasts\"],\n on: {\n \"REGION.POINTER_LEAVE\": [\n {\n guard: \"isOverlapping\",\n target: \"overlap\",\n actions: [\"resumeToasts\"],\n },\n {\n actions: [\"resumeToasts\"],\n },\n ],\n \"REGION.OVERLAP\": {\n target: \"overlap\",\n },\n \"REGION.FOCUS\": {\n actions: [\"setLastFocusedEl\", \"pauseToasts\"],\n },\n \"REGION.POINTER_ENTER\": {\n actions: [\"pauseToasts\"],\n },\n },\n },\n overlap: {\n entry: [\"collapseToasts\"],\n on: {\n \"REGION.STACK\": {\n target: \"stack\",\n },\n \"REGION.POINTER_ENTER\": {\n target: \"stack\",\n actions: [\"pauseToasts\"],\n },\n \"REGION.FOCUS\": {\n target: \"stack\",\n actions: [\"setLastFocusedEl\", \"pauseToasts\"],\n },\n },\n },\n },\n },\n {\n guards: {\n isWithinRange: (ctx) => ctx.toasts.length < ctx.max,\n isOverlapping: (ctx) => !!ctx.overlap,\n },\n activities: {\n trackHotKeyPress(ctx, _evt, { send }) {\n const handleKeyDown = (event: KeyboardEvent) => {\n const isHotkeyPressed = ctx.hotkey.every((key) => (event as any)[key] || event.code === key)\n if (!isHotkeyPressed) return\n send({ type: \"DOC.HOTKEY\" })\n }\n return addDomEvent(document, \"keydown\", handleKeyDown, { capture: true })\n },\n trackDocumentVisibility(ctx, _evt, { send }) {\n if (!ctx.pauseOnPageIdle) return\n const doc = dom.getDoc(ctx)\n return addDomEvent(doc, \"visibilitychange\", () => {\n send(doc.visibilityState === \"hidden\" ? \"PAUSE_ALL\" : \"RESUME_ALL\")\n })\n },\n },\n actions: {\n setDismissableBranch(ctx) {\n const currentToasts = getToastsByPlacement(ctx.toasts, ctx.placement)\n const hasToasts = currentToasts.length > 0\n\n if (!hasToasts) {\n ctx._cleanup?.()\n return\n }\n\n if (hasToasts && ctx._cleanup) {\n return\n }\n\n // mark toast as a dismissable branch\n // so that interacting with them will not close dismissable layers\n const groupEl = () => dom.getRegionEl(ctx, ctx.placement)\n ctx._cleanup = trackDismissableBranch(groupEl, { defer: true })\n },\n clearDismissableBranch(ctx) {\n ctx._cleanup?.()\n },\n focusRegionEl(ctx) {\n queueMicrotask(() => {\n dom.getRegionEl(ctx, ctx.placement)?.focus()\n })\n },\n expandToasts(ctx) {\n each(ctx, (toast) => {\n toast.state.context.stacked = true\n })\n },\n collapseToasts(ctx) {\n each(ctx, (toast) => {\n toast.state.context.stacked = false\n })\n },\n collapsedIfEmpty(ctx, _evt, { send }) {\n if (!ctx.overlap || ctx.toasts.length > 1) return\n send(\"REGION.OVERLAP\")\n },\n pauseToast(_ctx, evt, { self }) {\n self.sendChild(\"PAUSE\", evt.id)\n },\n pauseToasts(ctx) {\n ctx.toasts.forEach((toast) => toast.send(\"PAUSE\"))\n },\n resumeToast(_ctx, evt, { self }) {\n self.sendChild(\"RESUME\", evt.id)\n },\n resumeToasts(ctx) {\n ctx.toasts.forEach((toast) => toast.send(\"RESUME\"))\n },\n measureToasts(ctx) {\n ctx.toasts.forEach((toast) => toast.send(\"MEASURE\"))\n },\n createToast(ctx, evt, { self, getState }) {\n const options: MachineContext<T> = {\n placement: ctx.placement,\n duration: ctx.duration,\n removeDelay: ctx.removeDelay,\n ...evt.toast,\n dir: ctx.dir,\n getRootNode: ctx.getRootNode,\n stacked: getState().matches(\"stack\"),\n }\n\n const toast = createToastMachine(options)\n\n const actor = self.spawn(toast)\n ctx.toasts = [actor, ...ctx.toasts]\n },\n updateToast(_ctx, evt, { self }) {\n self.sendChild({ type: \"UPDATE\", toast: evt.toast }, evt.id)\n },\n dismissToast(_ctx, evt, { self }) {\n self.sendChild(\"DISMISS\", evt.id)\n },\n dismissToasts(ctx) {\n ctx.toasts.forEach((toast) => toast.send(\"DISMISS\"))\n },\n removeToast(ctx, evt, { self }) {\n self.stopChild(evt.id)\n ctx.toasts = ctx.toasts.filter((toast) => toast.id !== evt.id)\n ctx.heights = ctx.heights.filter((height) => height.id !== evt.id)\n },\n removeToasts(ctx, _evt, { self }) {\n ctx.toasts.forEach((toast) => self.stopChild(toast.id))\n ctx.toasts = []\n ctx.heights = []\n },\n syncHeights(ctx, evt) {\n const existing = ctx.heights.find((height) => height.id === evt.id)\n if (existing) {\n existing.height = evt.height\n existing.placement = evt.placement\n } else {\n const newHeight = { id: evt.id, height: evt.height, placement: evt.placement }\n ctx.heights = [newHeight, ...ctx.heights]\n }\n },\n syncToastIndex(ctx) {\n each(ctx, (toast, index, toasts) => {\n // Note: This is an intentional side effect\n // consider writing directly to the DOM (root element)\n toast.state.context.index = index\n toast.state.context.frontmost = index === 0\n toast.state.context.zIndex = toasts.length - index\n })\n },\n syncToastOffset(ctx, evt) {\n const placement = evt.placement ?? ctx.placement\n\n // Notify each toast of it's index\n each({ ...ctx, placement }, (toast) => {\n const heightIndex = Math.max(\n ctx.heights.findIndex((height) => height.id === toast.id),\n 0,\n )\n\n // calculate offset until toast\n const toastsHeightBefore = ctx.heights.reduce((prev, curr, reducerIndex) => {\n if (reducerIndex >= heightIndex) return prev\n return prev + curr.height\n }, 0)\n\n // Note: This is an intentional side effect\n // consider writing directly to the DOM (root element)\n toast.state.context.offset = heightIndex * ctx.gap + toastsHeightBefore\n })\n },\n setLastFocusedEl(ctx, evt) {\n if (ctx.isFocusWithin || !evt.target) return\n ctx.isFocusWithin = true\n ctx.lastFocusedEl = ref(evt.target)\n },\n restoreLastFocusedEl(ctx) {\n ctx.isFocusWithin = false\n if (!ctx.lastFocusedEl) return\n ctx.lastFocusedEl.focus({ preventScroll: true })\n ctx.lastFocusedEl = null\n },\n clearLastFocusedEl(ctx) {\n if (!ctx.lastFocusedEl) return\n ctx.lastFocusedEl.focus({ preventScroll: true })\n ctx.lastFocusedEl = null\n ctx.isFocusWithin = false\n },\n },\n },\n )\n}\n\nfunction each(ctx: GroupMachineContext, fn: (toast: Service<any>, index: number, arr: Service<any>[]) => void) {\n const currentToasts = getToastsByPlacement(ctx.toasts, ctx.placement)\n currentToasts.forEach(fn)\n}\n","import { createMachine, guards } from \"@zag-js/core\"\nimport { queryAll, raf } from \"@zag-js/dom-query\"\nimport { compact, warn } from \"@zag-js/utils\"\nimport { dom } from \"./toast.dom\"\nimport type { MachineContext, MachineState, Options } from \"./toast.types\"\nimport { getToastDuration } from \"./toast.utils\"\n\nconst { not, and, or } = guards\n\nexport function createToastMachine<T>(options: Options<T>) {\n const { type = \"info\", duration, id = \"1\", placement = \"bottom\", removeDelay = 200, ...restProps } = options\n const ctx = compact(restProps)\n\n const computedDuration = getToastDuration(duration, type)\n\n return createMachine<MachineContext<T>, MachineState>(\n {\n id,\n context: {\n id,\n type,\n remaining: computedDuration,\n duration: computedDuration,\n removeDelay,\n createdAt: Date.now(),\n placement,\n ...ctx,\n height: 0,\n offset: 0,\n frontmost: false,\n mounted: false,\n index: -1,\n zIndex: 0,\n },\n\n initial: type === \"loading\" ? \"visible:persist\" : \"visible\",\n\n on: {\n UPDATE: [\n {\n guard: and(\"hasTypeChanged\", \"isChangingToLoading\"),\n target: \"visible:persist\",\n actions: [\"setContext\"],\n },\n {\n guard: or(\"hasDurationChanged\", \"hasTypeChanged\"),\n target: \"visible:updating\",\n actions: [\"setContext\"],\n },\n {\n actions: [\"setContext\"],\n },\n ],\n MEASURE: {\n actions: [\"measureHeight\"],\n },\n },\n\n entry: [\"invokeOnVisible\"],\n\n activities: [\"trackHeight\"],\n\n states: {\n \"visible:updating\": {\n tags: [\"visible\", \"updating\"],\n after: {\n 0: \"visible\",\n },\n },\n\n \"visible:persist\": {\n tags: [\"visible\", \"paused\"],\n on: {\n RESUME: {\n guard: not(\"isLoadingType\"),\n target: \"visible\",\n actions: [\"setCreatedAt\"],\n },\n DISMISS: \"dismissing\",\n },\n },\n\n visible: {\n tags: [\"visible\"],\n after: {\n VISIBLE_DURATION: \"dismissing\",\n },\n on: {\n DISMISS: \"dismissing\",\n PAUSE: {\n target: \"visible:persist\",\n actions: \"setRemainingDuration\",\n },\n },\n },\n\n dismissing: {\n entry: \"invokeOnDismiss\",\n after: {\n REMOVE_DELAY: {\n target: \"unmounted\",\n actions: \"notifyParentToRemove\",\n },\n },\n },\n\n unmounted: {\n entry: \"invokeOnUnmount\",\n type: \"final\",\n },\n },\n },\n {\n activities: {\n trackHeight(ctx, _evt, { self }) {\n let cleanup: VoidFunction\n raf(() => {\n const rootEl = dom.getRootEl(ctx)\n if (!rootEl) return\n ctx.mounted = true\n\n const ghosts = queryAll(rootEl, \"[data-ghost]\")\n\n warn(\n ghosts.length !== 2,\n \"[toast] No ghost element found in toast. Render the `ghostBefore` and `ghostAfter` elements\",\n )\n\n const syncHeight = () => {\n const originalHeight = rootEl.style.height\n rootEl.style.height = \"auto\"\n const newHeight = rootEl.getBoundingClientRect().height\n rootEl.style.height = originalHeight\n\n ctx.height = newHeight\n self.sendParent({ type: \"UPDATE_HEIGHT\", id: self.id, height: newHeight, placement: ctx.placement })\n }\n\n syncHeight()\n\n const win = dom.getWin(ctx)\n\n const observer = new win.MutationObserver(syncHeight)\n observer.observe(rootEl, { childList: true, subtree: true, characterData: true })\n\n cleanup = () => observer.disconnect()\n })\n\n return () => cleanup?.()\n },\n },\n\n guards: {\n isChangingToLoading: (_, evt) => evt.toast?.type === \"loading\",\n isLoadingType: (ctx) => ctx.type === \"loading\",\n hasTypeChanged: (ctx, evt) => evt.toast?.type != null && evt.toast.type !== ctx.type,\n hasDurationChanged: (ctx, evt) => evt.toast?.duration != null && evt.toast.duration !== ctx.duration,\n },\n\n delays: {\n VISIBLE_DURATION: (ctx) => ctx.remaining,\n REMOVE_DELAY: (ctx) => ctx.removeDelay,\n },\n\n actions: {\n measureHeight(ctx, _evt, { self }) {\n raf(() => {\n const rootEl = dom.getRootEl(ctx)\n if (!rootEl) return\n\n ctx.mounted = true\n\n const originalHeight = rootEl.style.height\n rootEl.style.height = \"auto\"\n\n const newHeight = rootEl.getBoundingClientRect().height\n rootEl.style.height = originalHeight\n ctx.height = newHeight\n\n self.sendParent({ type: \"UPDATE_HEIGHT\", id: self.id, height: newHeight, placement: ctx.placement })\n })\n },\n setRemainingDuration(ctx) {\n ctx.remaining -= Date.now() - ctx.createdAt\n },\n setCreatedAt(ctx) {\n ctx.createdAt = Date.now()\n },\n notifyParentToRemove(_ctx, _evt, { self }) {\n self.sendParent({ type: \"REMOVE_TOAST\", id: self.id })\n },\n invokeOnDismiss(ctx) {\n ctx.onStatusChange?.({ status: \"dismissing\" })\n },\n invokeOnUnmount(ctx) {\n ctx.onStatusChange?.({ status: \"unmounted\" })\n },\n invokeOnVisible(ctx) {\n ctx.onStatusChange?.({ status: \"visible\" })\n },\n setContext(ctx, evt) {\n const duration = evt.toast?.duration\n const type = evt.toast?.type ?? ctx.type\n\n const computedDuration = getToastDuration(duration, type)\n\n Object.assign(ctx, {\n ...evt.toast,\n duration: computedDuration,\n remaining: computedDuration,\n })\n },\n },\n },\n )\n}\n","import { dataAttr } from \"@zag-js/dom-query\"\nimport type { NormalizeProps, PropTypes } from \"@zag-js/types\"\nimport { parts } from \"./toast.anatomy\"\nimport { dom } from \"./toast.dom\"\nimport type { MachineApi, Send, State } from \"./toast.types\"\nimport { getGhostAfterStyle, getGhostBeforeStyle, getPlacementStyle } from \"./toast.utils\"\n\nexport function connect<T extends PropTypes, O>(\n state: State<O>,\n send: Send,\n normalize: NormalizeProps<T>,\n): MachineApi<T, O> {\n const visible = state.hasTag(\"visible\")\n const paused = state.hasTag(\"paused\")\n\n const placement = state.context.placement!\n const type = state.context.type!\n\n const [side, align = \"center\"] = placement.split(\"-\")\n\n return {\n type: type,\n title: state.context.title,\n description: state.context.description,\n placement,\n visible: visible,\n paused: paused,\n\n pause() {\n send(\"PAUSE\")\n },\n\n resume() {\n send(\"RESUME\")\n },\n\n dismiss() {\n send(\"DISMISS\")\n },\n\n getRootProps() {\n return normalize.element({\n ...parts.root.attrs,\n dir: state.context.dir,\n id: dom.getRootId(state.context),\n \"data-state\": visible ? \"open\" : \"closed\",\n \"data-type\": type,\n \"data-placement\": placement,\n \"data-align\": align,\n \"data-side\": side,\n \"data-mounted\": dataAttr(state.context.mounted),\n \"data-paused\": dataAttr(paused),\n\n \"data-first\": dataAttr(state.context.frontmost),\n \"data-sibling\": dataAttr(!state.context.frontmost),\n \"data-stack\": dataAttr(state.context.stacked),\n \"data-overlap\": dataAttr(!state.context.stacked),\n\n role: \"status\",\n \"aria-atomic\": \"true\",\n \"aria-describedby\": state.context.description ? dom.getDescriptionId(state.context) : undefined,\n \"aria-labelledby\": state.context.title ? dom.getTitleId(state.context) : undefined,\n tabIndex: 0,\n style: getPlacementStyle(state.context, visible),\n onKeyDown(event) {\n if (event.defaultPrevented) return\n if (event.key == \"Escape\") {\n send(\"DISMISS\")\n event.preventDefault()\n }\n },\n })\n },\n\n /* Leave a ghost div to avoid setting hover to false when transitioning out */\n getGhostBeforeProps() {\n return normalize.element({\n \"data-ghost\": \"before\",\n style: getGhostBeforeStyle(state.context, visible),\n })\n },\n\n /* Needed to avoid setting hover to false when in between toasts */\n getGhostAfterProps() {\n return normalize.element({\n \"data-ghost\": \"after\",\n style: getGhostAfterStyle(state.context, visible),\n })\n },\n\n getTitleProps() {\n return normalize.element({\n ...parts.title.attrs,\n id: dom.getTitleId(state.context),\n })\n },\n\n getDescriptionProps() {\n return normalize.element({\n ...parts.description.attrs,\n id: dom.getDescriptionId(state.context),\n })\n },\n\n getActionTriggerProps() {\n return normalize.button({\n ...parts.actionTrigger.attrs,\n type: \"button\",\n onClick(event) {\n if (event.defaultPrevented) return\n state.context.action?.onClick?.()\n send(\"DISMISS\")\n },\n })\n },\n\n getCloseTriggerProps() {\n return normalize.button({\n id: dom.getCloseTriggerId(state.context),\n ...parts.closeTrigger.attrs,\n type: \"button\",\n \"aria-label\": \"Dismiss notification\",\n onClick(event) {\n if (event.defaultPrevented) return\n send(\"DISMISS\")\n },\n })\n },\n }\n}\n","import { groupConnect } from \"./toast-group.connect\"\nimport { groupMachine } from \"./toast-group.machine\"\nimport { createToastMachine as createMachine } from \"./toast.machine\"\n\nexport { anatomy } from \"./toast.anatomy\"\nexport { connect } from \"./toast.connect\"\nexport type {\n ActionOptions,\n MachineApi as Api,\n GenericOptions,\n GroupMachineApi as GroupApi,\n GroupMachineContext,\n GroupProps,\n GroupService,\n GroupState,\n MachineContext,\n Options,\n Placement,\n PromiseOptions,\n Service,\n Status,\n StatusChangeDetails,\n Type,\n} from \"./toast.types\"\nexport { createMachine }\n\nexport const group = {\n connect: groupConnect,\n machine: groupMachine,\n}\n"],"mappings":"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","names":["offset","createMachine","compact","ctx","duration","type","computedDuration","compact","createMachine","ctx"]}
package/src/index.ts DELETED
@@ -1,30 +0,0 @@
1
- import { groupConnect } from "./toast-group.connect"
2
- import { groupMachine } from "./toast-group.machine"
3
- import { createToastMachine as createMachine } from "./toast.machine"
4
-
5
- export { anatomy } from "./toast.anatomy"
6
- export { connect } from "./toast.connect"
7
- export type {
8
- ActionOptions,
9
- MachineApi as Api,
10
- GenericOptions,
11
- GroupMachineApi as GroupApi,
12
- GroupMachineContext,
13
- GroupProps,
14
- GroupService,
15
- GroupState,
16
- MachineContext,
17
- Options,
18
- Placement,
19
- PromiseOptions,
20
- Service,
21
- Status,
22
- StatusChangeDetails,
23
- Type,
24
- } from "./toast.types"
25
- export { createMachine }
26
-
27
- export const group = {
28
- connect: groupConnect,
29
- machine: groupMachine,
30
- }
@@ -1,183 +0,0 @@
1
- import { isMachine, subscribe } from "@zag-js/core"
2
- import { contains } from "@zag-js/dom-query"
3
- import type { NormalizeProps, PropTypes } from "@zag-js/types"
4
- import { runIfFn, uuid } from "@zag-js/utils"
5
- import { parts } from "./toast.anatomy"
6
- import { dom } from "./toast.dom"
7
- import type { GroupMachineApi, GroupSend, GroupService, GroupState, Options, Placement } from "./toast.types"
8
- import { getGroupPlacementStyle, getToastsByPlacement } from "./toast.utils"
9
-
10
- export function groupConnect<T extends PropTypes, O = any>(
11
- serviceOrState: GroupState<O> | GroupService<O>,
12
- send: GroupSend,
13
- normalize: NormalizeProps<T>,
14
- ): GroupMachineApi<T, O> {
15
- //
16
-
17
- function getState(): GroupState<O> {
18
- const result = isMachine(serviceOrState) ? serviceOrState.getState() : serviceOrState
19
- return result as GroupState<O>
20
- }
21
-
22
- function getToastsByPlacementImpl(placement: Placement) {
23
- return getToastsByPlacement(getState().context.toasts, placement)
24
- }
25
-
26
- function isVisible(id: string) {
27
- const toasts = getState().context.toasts
28
- if (!toasts.length) return false
29
- return !!toasts.find((toast) => toast.id == id)
30
- }
31
-
32
- function create(options: Options<O>) {
33
- const uid = `toast:${uuid()}`
34
- const id = options.id ? options.id : uid
35
-
36
- if (isVisible(id)) return id
37
- send({ type: "ADD_TOAST", toast: { ...options, id } })
38
-
39
- return id
40
- }
41
-
42
- function update(id: string, options: Options<O>) {
43
- if (!isVisible(id)) return id
44
- send({ type: "UPDATE_TOAST", id, toast: options })
45
- return id
46
- }
47
-
48
- function upsert(options: Options<O>) {
49
- const { id } = options
50
- const visible = id ? isVisible(id) : false
51
- if (visible && id != null) {
52
- return update(id, options)
53
- } else {
54
- return create(options)
55
- }
56
- }
57
-
58
- function dismiss(id?: string) {
59
- if (id == null) {
60
- send("DISMISS_ALL")
61
- } else if (isVisible(id)) {
62
- send({ type: "DISMISS_TOAST", id })
63
- }
64
- }
65
-
66
- return {
67
- getCount() {
68
- return getState().context.count
69
- },
70
- getPlacements() {
71
- const toasts = getState().context.toasts
72
- const placements = toasts.map((toast) => toast.state.context.placement!)
73
- return Array.from(new Set(placements))
74
- },
75
- getToastsByPlacement: getToastsByPlacementImpl,
76
- isVisible,
77
- create,
78
- update,
79
- upsert,
80
- dismiss,
81
-
82
- remove(id) {
83
- if (id == null) {
84
- send("REMOVE_ALL")
85
- } else if (isVisible(id)) {
86
- send({ type: "REMOVE_TOAST", id })
87
- }
88
- },
89
-
90
- dismissByPlacement(placement) {
91
- const toasts = getToastsByPlacementImpl(placement)
92
- toasts.forEach((toast) => dismiss(toast.id))
93
- },
94
- loading(options) {
95
- return upsert({ ...options, type: "loading" })
96
- },
97
- success(options) {
98
- return upsert({ ...options, type: "success" })
99
- },
100
- error(options) {
101
- return upsert({ ...options, type: "error" })
102
- },
103
-
104
- promise(promise, options, shared = {}) {
105
- const id = upsert({ ...shared, ...options.loading, type: "loading" })
106
-
107
- runIfFn(promise)
108
- .then((response) => {
109
- const successOptions = runIfFn(options.success, response)
110
- upsert({ ...shared, ...successOptions, id, type: "success" })
111
- })
112
- .catch((error) => {
113
- const errorOptions = runIfFn(options.error, error)
114
- upsert({ ...shared, ...errorOptions, id, type: "error" })
115
- })
116
- .finally(() => {
117
- options.finally?.()
118
- })
119
-
120
- return id
121
- },
122
-
123
- pause(id) {
124
- if (id == null) {
125
- send("PAUSE_ALL")
126
- } else if (isVisible(id)) {
127
- send({ type: "PAUSE_TOAST", id })
128
- }
129
- },
130
-
131
- resume(id) {
132
- if (id == null) {
133
- send("RESUME_ALL")
134
- } else if (isVisible(id)) {
135
- send({ type: "RESUME_TOAST", id })
136
- }
137
- },
138
-
139
- getGroupProps(options) {
140
- const { placement, label = "Notifications" } = options
141
- const state = getState()
142
- const hotkeyLabel = state.context.hotkey.join("+").replace(/Key/g, "").replace(/Digit/g, "")
143
- const [side, align = "center"] = placement.split("-")
144
-
145
- return normalize.element({
146
- ...parts.group.attrs,
147
- dir: state.context.dir,
148
- tabIndex: -1,
149
- "aria-label": `${placement} ${label} ${hotkeyLabel}`,
150
- id: dom.getRegionId(placement),
151
- "data-placement": placement,
152
- "data-side": side,
153
- "data-align": align,
154
- "aria-live": "polite",
155
- role: "region",
156
- style: getGroupPlacementStyle(state.context, placement),
157
- onMouseMove() {
158
- send({ type: "REGION.POINTER_ENTER", placement })
159
- },
160
- onMouseLeave() {
161
- send({ type: "REGION.POINTER_LEAVE", placement })
162
- },
163
- onFocus(event) {
164
- send({ type: "REGION.FOCUS", target: event.relatedTarget })
165
- },
166
- onBlur(event) {
167
- if (state.context.isFocusWithin && !contains(event.currentTarget, event.relatedTarget)) {
168
- send({ type: "REGION.BLUR" })
169
- }
170
- },
171
- })
172
- },
173
-
174
- subscribe(fn) {
175
- const state = getState()
176
- return subscribe(state.context.toasts, () => {
177
- const toasts = getToastsByPlacementImpl(state.context.placement)
178
- const contexts = toasts.map((toast) => toast.getState().context)
179
- fn(contexts)
180
- })
181
- },
182
- }
183
- }
@@ -1,321 +0,0 @@
1
- import { createMachine, ref } from "@zag-js/core"
2
- import { trackDismissableBranch } from "@zag-js/dismissable"
3
- import { addDomEvent } from "@zag-js/dom-event"
4
- import { compact } from "@zag-js/utils"
5
- import { dom } from "./toast.dom"
6
- import { createToastMachine } from "./toast.machine"
7
- import type {
8
- GroupMachineContext,
9
- GroupMachineState,
10
- MachineContext,
11
- Service,
12
- UserDefinedGroupContext,
13
- } from "./toast.types"
14
- import { getToastsByPlacement } from "./toast.utils"
15
-
16
- export function groupMachine<T = any>(userContext: UserDefinedGroupContext) {
17
- const ctx = compact(userContext)
18
- return createMachine<GroupMachineContext<T>, GroupMachineState>(
19
- {
20
- id: "toaster",
21
- initial: ctx.overlap ? "overlap" : "stack",
22
- context: {
23
- dir: "ltr",
24
- max: Number.MAX_SAFE_INTEGER,
25
- gap: 16,
26
- pauseOnPageIdle: false,
27
- hotkey: ["altKey", "KeyT"],
28
- offsets: "1rem",
29
- placement: "bottom",
30
- removeDelay: 200,
31
- ...ctx,
32
- toasts: [],
33
- lastFocusedEl: null,
34
- isFocusWithin: false,
35
- heights: [],
36
- },
37
-
38
- computed: {
39
- count: (ctx) => ctx.toasts.length,
40
- },
41
-
42
- activities: ["trackDocumentVisibility", "trackHotKeyPress"],
43
-
44
- watch: {
45
- toasts: ["collapsedIfEmpty", "setDismissableBranch"],
46
- },
47
-
48
- exit: ["removeToasts", "clearDismissableBranch", "clearLastFocusedEl"],
49
-
50
- on: {
51
- PAUSE_TOAST: {
52
- actions: ["pauseToast"],
53
- },
54
- PAUSE_ALL: {
55
- actions: ["pauseToasts"],
56
- },
57
- RESUME_TOAST: {
58
- actions: ["resumeToast"],
59
- },
60
- RESUME_ALL: {
61
- actions: ["resumeToasts"],
62
- },
63
- ADD_TOAST: {
64
- guard: "isWithinRange",
65
- actions: ["createToast", "syncToastIndex"],
66
- },
67
- UPDATE_TOAST: {
68
- actions: ["updateToast"],
69
- },
70
- DISMISS_TOAST: {
71
- actions: ["dismissToast"],
72
- },
73
- DISMISS_ALL: {
74
- actions: ["dismissToasts"],
75
- },
76
- REMOVE_TOAST: {
77
- actions: ["removeToast", "syncToastIndex", "syncToastOffset"],
78
- },
79
- REMOVE_ALL: {
80
- actions: ["removeToasts"],
81
- },
82
- UPDATE_HEIGHT: {
83
- actions: ["syncHeights", "syncToastOffset"],
84
- },
85
- "DOC.HOTKEY": {
86
- actions: ["focusRegionEl"],
87
- },
88
- "REGION.BLUR": [
89
- {
90
- guard: "isOverlapping",
91
- target: "overlap",
92
- actions: ["resumeToasts", "restoreLastFocusedEl"],
93
- },
94
- {
95
- actions: ["resumeToasts", "restoreLastFocusedEl"],
96
- },
97
- ],
98
- },
99
-
100
- states: {
101
- stack: {
102
- entry: ["expandToasts"],
103
- on: {
104
- "REGION.POINTER_LEAVE": [
105
- {
106
- guard: "isOverlapping",
107
- target: "overlap",
108
- actions: ["resumeToasts"],
109
- },
110
- {
111
- actions: ["resumeToasts"],
112
- },
113
- ],
114
- "REGION.OVERLAP": {
115
- target: "overlap",
116
- },
117
- "REGION.FOCUS": {
118
- actions: ["setLastFocusedEl", "pauseToasts"],
119
- },
120
- "REGION.POINTER_ENTER": {
121
- actions: ["pauseToasts"],
122
- },
123
- },
124
- },
125
- overlap: {
126
- entry: ["collapseToasts"],
127
- on: {
128
- "REGION.STACK": {
129
- target: "stack",
130
- },
131
- "REGION.POINTER_ENTER": {
132
- target: "stack",
133
- actions: ["pauseToasts"],
134
- },
135
- "REGION.FOCUS": {
136
- target: "stack",
137
- actions: ["setLastFocusedEl", "pauseToasts"],
138
- },
139
- },
140
- },
141
- },
142
- },
143
- {
144
- guards: {
145
- isWithinRange: (ctx) => ctx.toasts.length < ctx.max,
146
- isOverlapping: (ctx) => !!ctx.overlap,
147
- },
148
- activities: {
149
- trackHotKeyPress(ctx, _evt, { send }) {
150
- const handleKeyDown = (event: KeyboardEvent) => {
151
- const isHotkeyPressed = ctx.hotkey.every((key) => (event as any)[key] || event.code === key)
152
- if (!isHotkeyPressed) return
153
- send({ type: "DOC.HOTKEY" })
154
- }
155
- return addDomEvent(document, "keydown", handleKeyDown, { capture: true })
156
- },
157
- trackDocumentVisibility(ctx, _evt, { send }) {
158
- if (!ctx.pauseOnPageIdle) return
159
- const doc = dom.getDoc(ctx)
160
- return addDomEvent(doc, "visibilitychange", () => {
161
- send(doc.visibilityState === "hidden" ? "PAUSE_ALL" : "RESUME_ALL")
162
- })
163
- },
164
- },
165
- actions: {
166
- setDismissableBranch(ctx) {
167
- const currentToasts = getToastsByPlacement(ctx.toasts, ctx.placement)
168
- const hasToasts = currentToasts.length > 0
169
-
170
- if (!hasToasts) {
171
- ctx._cleanup?.()
172
- return
173
- }
174
-
175
- if (hasToasts && ctx._cleanup) {
176
- return
177
- }
178
-
179
- // mark toast as a dismissable branch
180
- // so that interacting with them will not close dismissable layers
181
- const groupEl = () => dom.getRegionEl(ctx, ctx.placement)
182
- ctx._cleanup = trackDismissableBranch(groupEl, { defer: true })
183
- },
184
- clearDismissableBranch(ctx) {
185
- ctx._cleanup?.()
186
- },
187
- focusRegionEl(ctx) {
188
- queueMicrotask(() => {
189
- dom.getRegionEl(ctx, ctx.placement)?.focus()
190
- })
191
- },
192
- expandToasts(ctx) {
193
- each(ctx, (toast) => {
194
- toast.state.context.stacked = true
195
- })
196
- },
197
- collapseToasts(ctx) {
198
- each(ctx, (toast) => {
199
- toast.state.context.stacked = false
200
- })
201
- },
202
- collapsedIfEmpty(ctx, _evt, { send }) {
203
- if (!ctx.overlap || ctx.toasts.length > 1) return
204
- send("REGION.OVERLAP")
205
- },
206
- pauseToast(_ctx, evt, { self }) {
207
- self.sendChild("PAUSE", evt.id)
208
- },
209
- pauseToasts(ctx) {
210
- ctx.toasts.forEach((toast) => toast.send("PAUSE"))
211
- },
212
- resumeToast(_ctx, evt, { self }) {
213
- self.sendChild("RESUME", evt.id)
214
- },
215
- resumeToasts(ctx) {
216
- ctx.toasts.forEach((toast) => toast.send("RESUME"))
217
- },
218
- measureToasts(ctx) {
219
- ctx.toasts.forEach((toast) => toast.send("MEASURE"))
220
- },
221
- createToast(ctx, evt, { self, getState }) {
222
- const options: MachineContext<T> = {
223
- placement: ctx.placement,
224
- duration: ctx.duration,
225
- removeDelay: ctx.removeDelay,
226
- ...evt.toast,
227
- dir: ctx.dir,
228
- getRootNode: ctx.getRootNode,
229
- stacked: getState().matches("stack"),
230
- }
231
-
232
- const toast = createToastMachine(options)
233
-
234
- const actor = self.spawn(toast)
235
- ctx.toasts = [actor, ...ctx.toasts]
236
- },
237
- updateToast(_ctx, evt, { self }) {
238
- self.sendChild({ type: "UPDATE", toast: evt.toast }, evt.id)
239
- },
240
- dismissToast(_ctx, evt, { self }) {
241
- self.sendChild("DISMISS", evt.id)
242
- },
243
- dismissToasts(ctx) {
244
- ctx.toasts.forEach((toast) => toast.send("DISMISS"))
245
- },
246
- removeToast(ctx, evt, { self }) {
247
- self.stopChild(evt.id)
248
- ctx.toasts = ctx.toasts.filter((toast) => toast.id !== evt.id)
249
- ctx.heights = ctx.heights.filter((height) => height.id !== evt.id)
250
- },
251
- removeToasts(ctx, _evt, { self }) {
252
- ctx.toasts.forEach((toast) => self.stopChild(toast.id))
253
- ctx.toasts = []
254
- ctx.heights = []
255
- },
256
- syncHeights(ctx, evt) {
257
- const existing = ctx.heights.find((height) => height.id === evt.id)
258
- if (existing) {
259
- existing.height = evt.height
260
- existing.placement = evt.placement
261
- } else {
262
- const newHeight = { id: evt.id, height: evt.height, placement: evt.placement }
263
- ctx.heights = [newHeight, ...ctx.heights]
264
- }
265
- },
266
- syncToastIndex(ctx) {
267
- each(ctx, (toast, index, toasts) => {
268
- // Note: This is an intentional side effect
269
- // consider writing directly to the DOM (root element)
270
- toast.state.context.index = index
271
- toast.state.context.frontmost = index === 0
272
- toast.state.context.zIndex = toasts.length - index
273
- })
274
- },
275
- syncToastOffset(ctx, evt) {
276
- const placement = evt.placement ?? ctx.placement
277
-
278
- // Notify each toast of it's index
279
- each({ ...ctx, placement }, (toast) => {
280
- const heightIndex = Math.max(
281
- ctx.heights.findIndex((height) => height.id === toast.id),
282
- 0,
283
- )
284
-
285
- // calculate offset until toast
286
- const toastsHeightBefore = ctx.heights.reduce((prev, curr, reducerIndex) => {
287
- if (reducerIndex >= heightIndex) return prev
288
- return prev + curr.height
289
- }, 0)
290
-
291
- // Note: This is an intentional side effect
292
- // consider writing directly to the DOM (root element)
293
- toast.state.context.offset = heightIndex * ctx.gap + toastsHeightBefore
294
- })
295
- },
296
- setLastFocusedEl(ctx, evt) {
297
- if (ctx.isFocusWithin || !evt.target) return
298
- ctx.isFocusWithin = true
299
- ctx.lastFocusedEl = ref(evt.target)
300
- },
301
- restoreLastFocusedEl(ctx) {
302
- ctx.isFocusWithin = false
303
- if (!ctx.lastFocusedEl) return
304
- ctx.lastFocusedEl.focus({ preventScroll: true })
305
- ctx.lastFocusedEl = null
306
- },
307
- clearLastFocusedEl(ctx) {
308
- if (!ctx.lastFocusedEl) return
309
- ctx.lastFocusedEl.focus({ preventScroll: true })
310
- ctx.lastFocusedEl = null
311
- ctx.isFocusWithin = false
312
- },
313
- },
314
- },
315
- )
316
- }
317
-
318
- function each(ctx: GroupMachineContext, fn: (toast: Service<any>, index: number, arr: Service<any>[]) => void) {
319
- const currentToasts = getToastsByPlacement(ctx.toasts, ctx.placement)
320
- currentToasts.forEach(fn)
321
- }
@@ -1,12 +0,0 @@
1
- import { createAnatomy } from "@zag-js/anatomy"
2
-
3
- export const anatomy = createAnatomy("toast").parts(
4
- "group",
5
- "root",
6
- "title",
7
- "description",
8
- "actionTrigger",
9
- "closeTrigger",
10
- )
11
-
12
- export const parts = anatomy.build()