{"version":3,"file":"ScreenHeaderContext-Df1DvpEW.cjs","names":[],"sources":["../../react/src/shell/ScreenHeaderContext.tsx"],"sourcesContent":["\"use client\";\n\nimport type React from \"react\";\nimport {\n  createContext,\n  type ReactNode,\n  type ReactPortal,\n  use,\n  useCallback,\n  useLayoutEffect,\n  useMemo,\n  useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\n\n// ---------------------------------------------------------------------------\n// SlotContext\n// ---------------------------------------------------------------------------\n\ninterface SlotContextValue {\n  breadcrumbsEl: HTMLDivElement | null;\n  actionsEl: HTMLDivElement | null;\n  mobileActionsEl: HTMLDivElement | null;\n  breadcrumbCount: number;\n  incrementBreadcrumbs: () => void;\n  decrementBreadcrumbs: () => void;\n  setBreadcrumbsEl: (node: HTMLDivElement | null) => void;\n  setActionsEl: (node: HTMLDivElement | null) => void;\n  setMobileActionsEl: (node: HTMLDivElement | null) => void;\n}\n\nconst SlotContext = createContext<SlotContextValue | null>(null);\n\n// ---------------------------------------------------------------------------\n// ScreenHeaderProvider\n// ---------------------------------------------------------------------------\n\nexport function ScreenHeaderProvider({\n  children,\n}: {\n  children: ReactNode;\n}): React.JSX.Element {\n  const [breadcrumbsEl, setBreadcrumbsEl] = useState<HTMLDivElement | null>(\n    null,\n  );\n  const [actionsEl, setActionsEl] = useState<HTMLDivElement | null>(null);\n  const [mobileActionsEl, setMobileActionsEl] = useState<HTMLDivElement | null>(\n    null,\n  );\n  const [breadcrumbCount, setBreadcrumbCount] = useState(0);\n\n  const incrementBreadcrumbs = useCallback(\n    () => setBreadcrumbCount((c) => c + 1),\n    [],\n  );\n  const decrementBreadcrumbs = useCallback(\n    () => setBreadcrumbCount((c) => c - 1),\n    [],\n  );\n\n  const value = useMemo<SlotContextValue>(\n    () => ({\n      breadcrumbsEl,\n      actionsEl,\n      mobileActionsEl,\n      breadcrumbCount,\n      incrementBreadcrumbs,\n      decrementBreadcrumbs,\n      setBreadcrumbsEl,\n      setActionsEl,\n      setMobileActionsEl,\n    }),\n    [\n      breadcrumbsEl,\n      actionsEl,\n      mobileActionsEl,\n      breadcrumbCount,\n      incrementBreadcrumbs,\n      decrementBreadcrumbs,\n      setBreadcrumbsEl,\n      setActionsEl,\n      setMobileActionsEl,\n    ],\n  );\n\n  return <SlotContext.Provider value={value}>{children}</SlotContext.Provider>;\n}\n\n// ---------------------------------------------------------------------------\n// ScreenHeaderBreadcrumbs — portal-based slot for breadcrumbs\n// ---------------------------------------------------------------------------\n\nexport function ScreenHeaderBreadcrumbs({\n  children,\n}: {\n  children: ReactNode;\n}): ReactPortal | null {\n  const ctx = use(SlotContext);\n\n  const increment = ctx?.incrementBreadcrumbs;\n  const decrement = ctx?.decrementBreadcrumbs;\n  useLayoutEffect(() => {\n    increment?.();\n    return () => decrement?.();\n  }, [increment, decrement]);\n\n  if (!ctx?.breadcrumbsEl) return null;\n  return createPortal(children, ctx.breadcrumbsEl);\n}\n\n// ---------------------------------------------------------------------------\n// ScreenHeaderActions — portal-based slot for actions\n// ---------------------------------------------------------------------------\n\nexport function ScreenHeaderActions({\n  children,\n}: {\n  children: ReactNode;\n}): ReactPortal | null {\n  const ctx = use(SlotContext);\n\n  const target = ctx?.mobileActionsEl ?? ctx?.actionsEl;\n  if (!target) return null;\n  return createPortal(children, target);\n}\n\n// ---------------------------------------------------------------------------\n// ScreenHeaderMobileActionsSlot — host for actions in the mobile SDK header\n// ---------------------------------------------------------------------------\n\nexport function ScreenHeaderMobileActionsSlot(): React.JSX.Element | null {\n  const ctx = use(SlotContext);\n\n  if (!ctx) return null;\n  return (\n    <div\n      ref={ctx.setMobileActionsEl}\n      data-fluid-mobile-header-actions=\"\"\n      className=\"flex items-center gap-2\"\n    />\n  );\n}\n\n// ---------------------------------------------------------------------------\n// useScreenHeaderActive — true when inside a ScreenHeaderProvider\n// ---------------------------------------------------------------------------\n\nexport function useScreenHeaderActive(): boolean {\n  return use(SlotContext) !== null;\n}\n\n// ---------------------------------------------------------------------------\n// useScreenHeaderSlotRefs — internal hook for ScreenHeader component\n// ---------------------------------------------------------------------------\n\nexport function useScreenHeaderSlotRefs(): {\n  breadcrumbsRef: (node: HTMLDivElement | null) => void;\n  actionsRef: (node: HTMLDivElement | null) => void;\n  hasBreadcrumbs: boolean;\n} {\n  const ctx = use(SlotContext);\n\n  if (!ctx) {\n    throw new Error(\n      \"useScreenHeaderSlotRefs must be used within a ScreenHeaderProvider\",\n    );\n  }\n\n  return {\n    breadcrumbsRef: ctx.setBreadcrumbsEl,\n    actionsRef: ctx.setActionsEl,\n    hasBreadcrumbs: ctx.breadcrumbCount > 0,\n  };\n}\n"],"mappings":";;;;;AA+BA,MAAM,eAAA,GAAA,MAAA,eAAqD,KAAK;AAMhE,SAAgB,qBAAqB,EACnC,YAGoB;CACpB,MAAM,CAAC,eAAe,qBAAA,GAAA,MAAA,UACpB,KACD;CACD,MAAM,CAAC,WAAW,iBAAA,GAAA,MAAA,UAAgD,KAAK;CACvE,MAAM,CAAC,iBAAiB,uBAAA,GAAA,MAAA,UACtB,KACD;CACD,MAAM,CAAC,iBAAiB,uBAAA,GAAA,MAAA,UAA+B,EAAE;CAEzD,MAAM,wBAAA,GAAA,MAAA,mBACE,oBAAoB,MAAM,IAAI,EAAE,EACtC,EAAE,CACH;CACD,MAAM,wBAAA,GAAA,MAAA,mBACE,oBAAoB,MAAM,IAAI,EAAE,EACtC,EAAE,CACH;CAED,MAAM,SAAA,GAAA,MAAA,gBACG;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,GACD;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CACF;AAED,QAAO,iBAAA,GAAA,kBAAA,KAAC,YAAY,UAAb;EAA6B;EAAQ;EAAgC,CAAA;;AAO9E,SAAgB,wBAAwB,EACtC,YAGqB;CACrB,MAAM,OAAA,GAAA,MAAA,KAAU,YAAY;CAE5B,MAAM,YAAY,KAAK;CACvB,MAAM,YAAY,KAAK;AACvB,EAAA,GAAA,MAAA,uBAAsB;AACpB,eAAa;AACb,eAAa,aAAa;IACzB,CAAC,WAAW,UAAU,CAAC;AAE1B,KAAI,CAAC,KAAK,cAAe,QAAO;AAChC,SAAA,GAAA,UAAA,cAAoB,UAAU,IAAI,cAAc;;AAOlD,SAAgB,oBAAoB,EAClC,YAGqB;CACrB,MAAM,OAAA,GAAA,MAAA,KAAU,YAAY;CAE5B,MAAM,SAAS,KAAK,mBAAmB,KAAK;AAC5C,KAAI,CAAC,OAAQ,QAAO;AACpB,SAAA,GAAA,UAAA,cAAoB,UAAU,OAAO;;AAOvC,SAAgB,gCAA0D;CACxE,MAAM,OAAA,GAAA,MAAA,KAAU,YAAY;AAE5B,KAAI,CAAC,IAAK,QAAO;AACjB,QACE,iBAAA,GAAA,kBAAA,KAAC,OAAD;EACE,KAAK,IAAI;EACT,oCAAiC;EACjC,WAAU;EACV,CAAA;;AAgBN,SAAgB,0BAId;CACA,MAAM,OAAA,GAAA,MAAA,KAAU,YAAY;AAE5B,KAAI,CAAC,IACH,OAAM,IAAI,MACR,qEACD;AAGH,QAAO;EACL,gBAAgB,IAAI;EACpB,YAAY,IAAI;EAChB,gBAAgB,IAAI,kBAAkB;EACvC"}