{"version":3,"file":"index.mjs","names":["dom.getTriggerId","dom.getContentId","dom.getBackdropId","dom.getTitleId","dom.getDescriptionId","dom.getCloseTriggerId","props","dom.getContentEl","modalAncestor: HTMLElement | null","hiddenElements: HTMLElement[]"],"sources":["../src/modal.anatomy.ts","../src/modal.dom.ts","../src/modal.connect.ts","../src/modal.machine.ts","../src/modal.props.ts"],"sourcesContent":["import { createAnatomy } from '@zag-js/anatomy'\n\nexport const anatomy = createAnatomy('modal').parts(\n  'trigger',\n  'backdrop',\n  'content',\n  'title',\n  'description',\n  'closeTrigger',\n)\n\nexport const parts = anatomy.build()\n","import type { Scope } from '@zag-js/core'\n\n// trigger: [data-open-modal][aria-controls] (line 18)\n// backdrop (wrapper): .usa-modal-wrapper with role=dialog (lines 267, 229)\n// content: .usa-modal (line 8)\n// title: element referenced by aria-labelledby (line 218)\n// description: element referenced by aria-describedby (line 219)\n// closeTrigger: [data-close-modal] (line 12)\n\nexport const getTriggerId = (ctx: Scope) => ctx.ids?.trigger ?? `modal:${ctx.id}:trigger`\nexport const getBackdropId = (ctx: Scope) => ctx.ids?.backdrop ?? `modal:${ctx.id}:backdrop`\nexport const getContentId = (ctx: Scope) => ctx.ids?.content ?? `modal:${ctx.id}:content`\nexport const getTitleId = (ctx: Scope) => ctx.ids?.title ?? `modal:${ctx.id}:title`\nexport const getDescriptionId = (ctx: Scope) => ctx.ids?.description ?? `modal:${ctx.id}:description`\nexport const getCloseTriggerId = (ctx: Scope) => ctx.ids?.closeTrigger ?? `modal:${ctx.id}:close-trigger`\n\nexport const getTriggerEl = (ctx: Scope) => ctx.getById(getTriggerId(ctx))\nexport const getBackdropEl = (ctx: Scope) => ctx.getById(getBackdropId(ctx))\nexport const getContentEl = (ctx: Scope) => ctx.getById(getContentId(ctx))\nexport const getCloseEl = (ctx: Scope) => ctx.getById(getCloseTriggerId(ctx))\n","import type { Service } from '@zag-js/core'\nimport type { EventKeyMap, NormalizeProps, PropTypes } from '@zag-js/types'\nimport type { ModalApi, ModalSchema } from './modal.types'\nimport { ariaAttr, getEventKey } from '@zag-js/dom-query'\nimport { parts } from './modal.anatomy'\nimport * as dom from './modal.dom'\n\nexport function connect<T extends PropTypes>(\n  service: Service<ModalSchema>,\n  normalize: NormalizeProps<T>,\n): ModalApi<T> {\n  const { state, send, prop, scope } = service\n\n  const open = state.matches('open')\n  const forceAction = !!prop('forceAction')\n\n  return {\n    /* ----- State properties ----- */\n    open,\n\n    /* ----- Imperative methods ----- */\n\n    setOpen(nextOpen) {\n      const currentOpen = state.matches('open')\n      if (currentOpen === nextOpen)\n        return\n      send({ type: nextOpen ? 'OPEN' : 'CLOSE' })\n    },\n\n    /* ----- Trigger props ----- */\n    //   All [aria-controls=\"${modalId}\"] elements get click → toggleModal.\n    //   Anchor triggers get role=\"button\" and preventDefault.\n    //\n    // In the machine model, the consumer renders a button with these props.\n    // a <button> element, not by the machine.\n    getTriggerProps() {\n      return normalize.button({\n        ...parts.trigger.attrs,\n        'id': dom.getTriggerId(scope),\n        'type': 'button',\n        // incomplete screen reader support. Preserving the comment's intent:\n        // not setting aria-haspopup.\n        'aria-controls': dom.getContentId(scope),\n        'aria-expanded': open,\n        'data-state': open ? 'open' : 'closed',\n\n        onClick() {\n          send({ type: 'TOGGLE' })\n        },\n      })\n    },\n\n    /* ----- Backdrop props ----- */\n    //   overlayDiv.classList.add(OVERLAY_CLASSNAME)\n    // CLOSERS selector (line 19):\n    //   \".usa-modal-overlay:not([data-force-action])\"\n    // So overlay click closes modal UNLESS forceAction is set.\n    getBackdropProps() {\n      return normalize.element({\n        ...parts.backdrop.attrs,\n        'id': dom.getBackdropId(scope),\n        'hidden': !open,\n        'data-state': open ? 'open' : 'closed',\n\n        //   .usa-modal-overlay:not([data-force-action])\n        // Overlay is a closer unless force-action is set.\n        //   Click on overlay (outside .usa-modal) proceeds to toggle.\n        onClick() {\n          if (forceAction)\n            return\n          send({ type: 'CLOSE' })\n        },\n      })\n    },\n\n    /* ----- Content props ----- */\n    //   role=\"dialog\", id, aria-labelledby, aria-describedby on wrapper\n    // And original element: tabindex=\"-1\" (line 248)\n    //\n    // In the machine model, we put role=dialog on the content element which is\n    // the semantic dialog container. This preserves the accessible dialog\n    // boundary while matching the standard pattern. The wrapper/backdrop are\n    // presentational.\n    getContentProps() {\n      return normalize.element({\n        ...parts.content.attrs,\n        'id': dom.getContentId(scope),\n        'role': prop('role'),\n        // aria-modal=\"true\" when the dialog is modal — scopes SR focus to\n        // this dialog. WAI-ARIA 1.2 equivalent of the sibling-aria-hidden\n        // strategy; since we render in-tree (no body-level portal),\n        // aria-modal is the correct signal.\n        'aria-modal': ariaAttr(prop('modal')),\n        'aria-labelledby': dom.getTitleId(scope),\n        'aria-describedby': dom.getDescriptionId(scope),\n        'tabIndex': -1,\n        'hidden': !open,\n        'data-state': open ? 'open' : 'closed',\n\n        // When forceAction is false, FocusTrap binds Escape → onMenuClose (lines 151-153)\n        // onMenuClose (lines 38-40) calls toggleModal(false)\n        //\n        // When forceAction is true, no Escape binding (line 149)\n        //\n        // We handle this in onKeyDown on the content element since that's where\n        // the focus trap operates (all focus is within content).\n        onKeyDown(event) {\n          if (event.defaultPrevented)\n            return\n\n          const keymap: EventKeyMap = {\n            //   Escape: onMenuClose\n            // Only active when !forceAction (lines 148-154)\n            Escape(event) {\n              if (forceAction)\n                return\n              send({ type: 'CLOSE' })\n              event.preventDefault()\n            },\n          }\n\n          const key = getEventKey(event)\n          const exec = keymap[key]\n          exec?.(event)\n        },\n      })\n    },\n\n    /* ----- Title props ----- */\n    //   const ariaLabelledBy = baseComponent.getAttribute(\"aria-labelledby\")\n    // The title element's ID is used for aria-labelledby on the content.\n    getTitleProps() {\n      return normalize.element({\n        ...parts.title.attrs,\n        id: dom.getTitleId(scope),\n      })\n    },\n\n    /* ----- Description props ----- */\n    //   const ariaDescribedBy = baseComponent.getAttribute(\"aria-describedby\")\n    // The description element's ID is used for aria-describedby on the content.\n    getDescriptionProps() {\n      return normalize.element({\n        ...parts.description.attrs,\n        id: dom.getDescriptionId(scope),\n      })\n    },\n\n    /* ----- Close trigger props ----- */\n    //   \".usa-modal-wrapper *[data-close-modal]\"\n    // And CLOSERS (line 19) which includes close buttons.\n    // Click on close button → toggleModal (via init click binding, line 369)\n    // toggleModal identifies it as a closer (lines 113-114):\n    //   clickedElement.hasAttribute(CLOSER_ATTRIBUTE) ||\n    //   clickedElement.closest(`[${CLOSER_ATTRIBUTE}]`)\n    getCloseTriggerProps() {\n      return normalize.button({\n        ...parts.closeTrigger.attrs,\n        'id': dom.getCloseTriggerId(scope),\n        'type': 'button',\n        'aria-controls': dom.getContentId(scope),\n        'data-state': open ? 'open' : 'closed',\n\n        onClick() {\n          send({ type: 'CLOSE' })\n        },\n      })\n    },\n  }\n}\n","import type { ModalSchema } from './modal.types'\nimport { createMachine } from '@zag-js/core'\nimport { addDomEvent, raf } from '@zag-js/dom-query'\nimport * as dom from './modal.dom'\n\nconst FOCUSABLE\n  = 'a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, [tabindex=\"0\"], [contenteditable]'\n\nfunction getScrollbarWidth(doc: Document) {\n  const outer = doc.createElement('div')\n  outer.style.visibility = 'hidden'\n  outer.style.overflow = 'scroll'\n  ;(outer.style as any).msOverflowStyle = 'scrollbar'\n  doc.body.appendChild(outer)\n\n  const inner = doc.createElement('div')\n  outer.appendChild(inner)\n\n  const scrollbarWidth = outer.offsetWidth - inner.offsetWidth\n\n  outer.parentNode?.removeChild(outer)\n\n  return scrollbarWidth\n}\n\n/* -----------------------------------------------------------------------------\n * Machine\n * ----------------------------------------------------------------------------- */\n\nexport const machine = createMachine<ModalSchema>({\n  props({ props }) {\n    return {\n      forceAction: false,\n      preventScroll: true,\n      trapFocus: true,\n      modal: true,\n      role: 'dialog',\n      restoreFocus: true,\n      defaultOpen: false,\n      ...props,\n    }\n  },\n\n  // Modals start hidden by default. Honor controlled `open` at mount,\n  // otherwise <Modal open={true}> renders closed on first paint.\n  initialState({ prop }) {\n    if (prop('open') !== undefined) {\n      return prop('open') ? 'open' : 'closed'\n    }\n    return prop('defaultOpen') ? 'open' : 'closed'\n  },\n\n  context() {\n    return {}\n  },\n\n  // Watch for controlled `open` prop changes\n  // Mirrors Zag pattern for controlled components\n  watch({ prop, send }) {\n    const open = prop('open')\n    if (open === undefined)\n      return\n    send({ type: open ? 'CONTROLLED.OPEN' : 'CONTROLLED.CLOSE' })\n  },\n\n  states: {\n    open: {\n      // Entry: focus initial element\n      entry: ['focusInitialEl'],\n      effects: ['restoreFocus', 'trapFocus', 'preventScroll', 'hideContentBelow'],\n      on: {\n        'CONTROLLED.CLOSE': {\n          target: 'closed',\n        },\n        'CLOSE': [\n          {\n            guard: 'isOpenControlled',\n            actions: ['invokeOnClose'],\n          },\n          {\n            target: 'closed',\n            actions: ['invokeOnClose'],\n          },\n        ],\n        'TOGGLE': [\n          {\n            guard: 'isOpenControlled',\n            actions: ['invokeOnClose'],\n          },\n          {\n            target: 'closed',\n            actions: ['invokeOnClose'],\n          },\n        ],\n      },\n    },\n\n    closed: {\n      on: {\n        'CONTROLLED.OPEN': {\n          target: 'open',\n        },\n        'OPEN': [\n          {\n            guard: 'isOpenControlled',\n            actions: ['invokeOnOpen'],\n          },\n          {\n            target: 'open',\n            actions: ['invokeOnOpen'],\n          },\n        ],\n        'TOGGLE': [\n          {\n            guard: 'isOpenControlled',\n            actions: ['invokeOnOpen'],\n          },\n          {\n            target: 'open',\n            actions: ['invokeOnOpen'],\n          },\n        ],\n      },\n    },\n  },\n\n  implementations: {\n    guards: {\n      // Controlled component: prop(\"open\") is defined\n      isOpenControlled: ({ prop }) => prop('open') !== undefined,\n    },\n\n    effects: {\n      restoreFocus({ prop, scope }) {\n        if (!prop('restoreFocus'))\n          return\n\n        const doc = scope.getDoc()\n        const previouslyFocusedEl = doc.activeElement as HTMLElement | null\n\n        return () => {\n          if (previouslyFocusedEl && typeof previouslyFocusedEl.focus === 'function') {\n            raf(() => {\n              previouslyFocusedEl.focus()\n            })\n          }\n        }\n      },\n\n      trapFocus({ prop, scope }) {\n        if (!prop('trapFocus'))\n          return\n\n        const contentEl = dom.getContentEl(scope)\n        if (!contentEl)\n          return\n\n        function handleKeyDown(event: KeyboardEvent) {\n          if (event.key !== 'Tab')\n            return\n\n          const focusableElements = Array.from(\n            contentEl!.querySelectorAll<HTMLElement>(FOCUSABLE),\n          )\n\n          if (focusableElements.length === 0) {\n            event.preventDefault()\n            return\n          }\n\n          const firstTabStop = focusableElements[0]!\n          const lastTabStop = focusableElements[focusableElements.length - 1]!\n          const doc = scope.getDoc()\n          const active = doc.activeElement\n\n          if (event.shiftKey) {\n            // Shift+Tab: tabBack\n            //   if (activeElement() === firstTabStop) → wrap to lastTabStop\n            //   else if (!focusableElements.includes(activeElement())) → firstTabStop\n            if (active === firstTabStop) {\n              event.preventDefault()\n              lastTabStop.focus()\n            }\n            else if (!focusableElements.includes(active as HTMLElement)) {\n              // Focus is on container itself, not a focusable element\n              event.preventDefault()\n              firstTabStop.focus()\n            }\n          }\n          else {\n            // Tab: tabAhead\n            //   if (activeElement() === lastTabStop) → wrap to firstTabStop\n            if (active === lastTabStop) {\n              event.preventDefault()\n              firstTabStop.focus()\n            }\n          }\n        }\n\n        return addDomEvent(contentEl, 'keydown', handleKeyDown)\n      },\n\n      preventScroll({ prop, scope }) {\n        if (!prop('preventScroll'))\n          return\n\n        const doc = scope.getDoc()\n        const { body } = doc\n        const win = doc.defaultView\n\n        if (!win)\n          return\n\n        //   INITIAL_BODY_PADDING = getComputedStyle(body).paddingRight\n        //   TEMPORARY_BODY_PADDING = parseInt(initial) + parseInt(scrollbarWidth) + \"px\"\n        const initialPadding = win.getComputedStyle(body).getPropertyValue('padding-right')\n        const scrollbarWidth = getScrollbarWidth(doc)\n        const temporaryPadding = `${\n          Number.parseInt(initialPadding.replace(/px/, ''), 10) + scrollbarWidth\n        }px`\n\n        body.style.paddingRight = temporaryPadding\n\n        return () => {\n          body.style.removeProperty('padding-right')\n        }\n      },\n\n      hideContentBelow({ prop, scope }) {\n        if (!prop('modal'))\n          return\n\n        const doc = scope.getDoc()\n        const contentEl = dom.getContentEl(scope)\n        if (!contentEl)\n          return\n\n        // Find the top-level ancestor of our modal (the element directly under body)\n        let modalAncestor: HTMLElement | null = contentEl\n        while (modalAncestor && modalAncestor.parentElement !== doc.body) {\n          modalAncestor = modalAncestor.parentElement as HTMLElement | null\n        }\n\n        //   \"body > *:not(.usa-modal-wrapper):not([aria-hidden])\"\n        const hiddenElements: HTMLElement[] = []\n        const bodyChildren = doc.body.children\n\n        for (let i = 0; i < bodyChildren.length; i++) {\n          const child = bodyChildren[i] as HTMLElement\n          if (child === modalAncestor)\n            continue\n          if (child.getAttribute('aria-hidden') === 'true')\n            continue\n\n          child.setAttribute('aria-hidden', 'true')\n          child.setAttribute('data-modal-hidden', '')\n          hiddenElements.push(child)\n        }\n\n        return () => {\n          //   document.querySelectorAll(NON_MODALS_HIDDEN).forEach(nonModal => {\n          //     nonModal.removeAttribute(\"aria-hidden\");\n          //     nonModal.removeAttribute(NON_MODAL_HIDDEN_ATTRIBUTE);\n          //   })\n          for (const el of hiddenElements) {\n            el.removeAttribute('aria-hidden')\n            el.removeAttribute('data-modal-hidden')\n          }\n        }\n      },\n    },\n\n    actions: {\n      focusInitialEl({ prop, scope }) {\n        raf(() => {\n          // Consumer can override via prop\n          const customFocusEl = prop('initialFocusEl')?.()\n          if (customFocusEl) {\n            customFocusEl.focus()\n            return\n          }\n\n          const contentEl = dom.getContentEl(scope)\n          if (!contentEl)\n            return\n\n          const dataFocusEl = contentEl.querySelector<HTMLElement>('[data-focus]')\n          if (dataFocusEl) {\n            dataFocusEl.focus()\n            return\n          }\n\n          // Fallback: focus the content element itself\n          contentEl.focus()\n        })\n      },\n\n      invokeOnOpen({ prop }) {\n        prop('onOpenChange')?.({ open: true })\n      },\n\n      invokeOnClose({ prop }) {\n        prop('onOpenChange')?.({ open: false })\n      },\n    },\n  },\n})\n","import type { ModalProps } from './modal.types'\nimport { createProps } from '@zag-js/types'\nimport { createSplitProps } from '@zag-js/utils'\n\nexport const props = createProps<ModalProps>()([\n  'id',\n  'ids',\n  'getRootNode',\n  'forceAction',\n  'preventScroll',\n  'trapFocus',\n  'modal',\n  'role',\n  'initialFocusEl',\n  'restoreFocus',\n  'defaultOpen',\n  'open',\n  'onOpenChange',\n])\n\nexport const splitProps = createSplitProps<Partial<ModalProps>>(props)\n"],"mappings":"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"}