{"version":3,"names":["createSignal","isSafari","useIsoLayoutEffect","VISUALLY_HIDDEN_STYLE","FocusGuard","props","role","setRole","undefined","el","ref"],"sources":["focus-guard.tsx"],"sourcesContent":["import type { JSX } from \"@solidjs/web\";\n/**\n * Solid port of Base UI React's `FocusGuard` (`packages/react/src/utils/FocusGuard.tsx`).\n *\n * Visually-hidden `<span>` sentinel used at popup boundaries to catch\n * Tab / Shift+Tab and redirect focus. The React source pins\n * `role=\"button\"` on Safari because VoiceOver only fires the `focus`\n * event on button-roled elements — other browsers leave `role` unset so\n * screen-reader announcements don't change.\n *\n * Port notes:\n *  - React's `forwardRef` has no Solid equivalent; consumers pass a\n *    callback ref via the `ref` prop (Solid's ref syntax) which is\n *    forwarded to the inner `<span>`.\n *  - `React.useState` → `createSignal`. The Safari `role` is resolved\n *    synchronously in `useIsoLayoutEffect` (matches React's\n *    `useIsoLayoutEffect`).\n *  - Style + nonce handling match the React source 1:1: style comes from\n *    `VISUALLY_HIDDEN_STYLE`, `aria-hidden` is set only when no `role`\n *    is present, and the `data-quoin-focus-guard` marker stays so\n *    downstream focus logic can recognize the sentinel.\n */\n\nimport { createSignal } from \"solid-js\";\nimport { isSafari } from \"../floating-ui/detect-browser\";\nimport { useIsoLayoutEffect } from \"../use-iso-layout-effect\";\nimport { VISUALLY_HIDDEN_STYLE } from \"../visually-hidden-style\";\n\nexport interface FocusGuardProps\n\textends Omit<JSX.HTMLAttributes<HTMLSpanElement>, \"role\" | \"style\"> {\n\tref?: ((el: HTMLSpanElement) => void) | HTMLSpanElement | undefined;\n}\n\n/**\n * @internal\n */\nexport function FocusGuard(props: FocusGuardProps): JSX.Element {\n\tconst [role, setRole] = createSignal<\"button\" | undefined>(undefined);\n\n\tuseIsoLayoutEffect(\n\t\t() => {\n\t\t\tif (isSafari) {\n\t\t\t\t// Unlike other screen readers such as NVDA and JAWS, the\n\t\t\t\t// virtual cursor on VoiceOver does trigger the onFocus event,\n\t\t\t\t// so we can use the focus trap element. On Safari, only\n\t\t\t\t// buttons trigger the onFocus event.\n\t\t\t\tsetRole(\"button\");\n\t\t\t}\n\t\t\treturn undefined;\n\t\t},\n\t\t() => {},\n\t);\n\n\treturn (\n\t\t<span\n\t\t\t{...props}\n\t\t\tref={(el: HTMLSpanElement) => {\n\t\t\t\tif (typeof props.ref === \"function\") props.ref(el);\n\t\t\t\telse if (props.ref) (props as { ref: HTMLSpanElement }).ref = el;\n\t\t\t}}\n\t\t\ttabindex={0}\n\t\t\trole={role()}\n\t\t\tstyle={{ ...VISUALLY_HIDDEN_STYLE }}\n\t\t\taria-hidden={role() ? undefined : \"true\"}\n\t\t\tdata-quoin-focus-guard=\"\"\n\t\t/>\n\t);\n}\n"],"mappings":"AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,YAAY,QAAQ,UAAU;AACvC,SAASC,QAAQ,QAAQ,+BAA+B;AACxD,SAASC,kBAAkB,QAAQ,0BAA0B;AAC7D,SAASC,qBAAqB,QAAQ,0BAA0B;AAOhE;AACA;AACA;AACA,OAAO,SAASC,UAAUA,CAACC,KAAsB,EAAe;EAC/D,MAAM,CAACC,IAAI,EAAEC,OAAO,CAAC,GAAGP,YAAY,CAAuBQ,SAAS,CAAC;EAErEN,kBAAkB,CACjB,MAAM;IACL,IAAID,QAAQ,EAAE;MACb;MACA;MACA;MACA;MACAM,OAAO,CAAC,QAAQ,CAAC;IAClB;IACA,OAAOC,SAAS;EACjB,CAAC,EACD,MAAM,CAAC,CACR,CAAC;EAED,OACC,CAAC,IAAI,CACJ,IAAIH,KAAK,CAAC,CACV,GAAG,CAAC,CAAEI,EAAmB,IAAK;IAC7B,IAAI,OAAOJ,KAAK,CAACK,GAAG,KAAK,UAAU,EAAEL,KAAK,CAACK,GAAG,CAACD,EAAE,CAAC,CAAC,KAC9C,IAAIJ,KAAK,CAACK,GAAG,EAAGL,KAAK,CAA8BK,GAAG,GAAGD,EAAE;EACjE,CAAC,CAAC,CACF,QAAQ,CAAC,CAAC,CAAC,CAAC,CACZ,IAAI,CAAC,CAACH,IAAI,CAAC,CAAC,CAAC,CACb,KAAK,CAAC,CAAC;IAAE,GAAGH;EAAsB,CAAC,CAAC,CACpC,WAAW,CAAC,CAACG,IAAI,CAAC,CAAC,GAAGE,SAAS,GAAG,MAAM,CAAC,CACzC,sBAAsB,CAAC,EAAE,GACxB;AAEJ","ignoreList":[]}