{"version":3,"file":"FlagGate.mjs","sources":["../../../src/lib/flags/FlagGate.tsx"],"sourcesContent":["import { type ReactNode, useMemo, memo } from 'react';\nimport { useFeatureFlagContext } from './FeatureFlagProvider';\nimport type { FlagKey } from './flag-keys';\n\ninterface FlagGateProps {\n  /** The feature flag to check */\n  flag: FlagKey | string;\n  /** Content to render when flag is enabled */\n  children: ReactNode;\n  /** Content to render when flag is disabled */\n  fallback?: ReactNode;\n  /** Invert the check (show children when flag is disabled) */\n  invert?: boolean;\n}\n\n/**\n * Conditional renderer: <FlagGate flag=\"x\" fallback=\"...\">children</FlagGate>\n * Memoized for performance optimization.\n */\nexport const FlagGate = memo(\n  ({ flag, children, fallback = null, invert = false }: FlagGateProps) => {\n    const { isEnabled } = useFeatureFlagContext();\n    const flagEnabled = isEnabled(flag);\n    const shouldRender = invert ? !flagEnabled : flagEnabled;\n\n    return <>{shouldRender ? children : fallback}</>;\n  }\n);\n\nFlagGate.displayName = 'FlagGate';\n\n/**\n * Render children only when ALL specified flags are enabled.\n * Memoized for performance optimization.\n *\n * Note: Uses context-based flag checking to comply with Rules of Hooks.\n * Hooks must not be called inside loops, conditions, or nested functions.\n */\nexport const FlagGateAll = memo(\n  ({\n    flags,\n    children,\n    fallback = null,\n  }: {\n    flags: (FlagKey | string)[];\n    children: ReactNode;\n    fallback?: ReactNode;\n  }) => {\n    const { isEnabled } = useFeatureFlagContext();\n\n    const allEnabled = useMemo(() => flags.every((flag) => isEnabled(flag)), [flags, isEnabled]);\n\n    return <>{allEnabled ? children : fallback}</>;\n  }\n);\n\nFlagGateAll.displayName = 'FlagGateAll';\n\n/**\n * Render children when ANY of the specified flags are enabled.\n * Memoized for performance optimization.\n *\n * Note: Uses context-based flag checking to comply with Rules of Hooks.\n * Hooks must not be called inside loops, conditions, or nested functions.\n */\nexport const FlagGateAny = memo(\n  ({\n    flags,\n    children,\n    fallback = null,\n  }: {\n    flags: (FlagKey | string)[];\n    children: ReactNode;\n    fallback?: ReactNode;\n  }) => {\n    const { isEnabled } = useFeatureFlagContext();\n\n    const anyEnabled = useMemo(() => flags.some((flag) => isEnabled(flag)), [flags, isEnabled]);\n\n    return <>{anyEnabled ? children : fallback}</>;\n  }\n);\n\nFlagGateAny.displayName = 'FlagGateAny';\n"],"names":["FlagGate","memo","flag","children","fallback","invert","isEnabled","useFeatureFlagContext","flagEnabled","jsx","Fragment","FlagGateAll","flags","allEnabled","useMemo","FlagGateAny","anyEnabled"],"mappings":";;;AAmBO,MAAMA,IAAWC;AAAA,EACtB,CAAC,EAAE,MAAAC,GAAM,UAAAC,GAAU,UAAAC,IAAW,MAAM,QAAAC,IAAS,SAA2B;AACtE,UAAM,EAAE,WAAAC,EAAA,IAAcC,EAAA,GAChBC,IAAcF,EAAUJ,CAAI;AAGlC,WAAO,gBAAAO,EAAAC,GAAA,EAAG,WAFWL,IAAS,CAACG,IAAcA,KAEpBL,IAAWC,GAAS;AAAA,EAC/C;AACF;AAEAJ,EAAS,cAAc;AAShB,MAAMW,IAAcV;AAAA,EACzB,CAAC;AAAA,IACC,OAAAW;AAAA,IACA,UAAAT;AAAA,IACA,UAAAC,IAAW;AAAA,EAAA,MAKP;AACJ,UAAM,EAAE,WAAAE,EAAA,IAAcC,EAAA,GAEhBM,IAAaC,EAAQ,MAAMF,EAAM,MAAM,CAACV,MAASI,EAAUJ,CAAI,CAAC,GAAG,CAACU,GAAON,CAAS,CAAC;AAE3F,WAAO,gBAAAG,EAAAC,GAAA,EAAG,UAAAG,IAAaV,IAAWC,GAAS;AAAA,EAC7C;AACF;AAEAO,EAAY,cAAc;AASnB,MAAMI,IAAcd;AAAA,EACzB,CAAC;AAAA,IACC,OAAAW;AAAA,IACA,UAAAT;AAAA,IACA,UAAAC,IAAW;AAAA,EAAA,MAKP;AACJ,UAAM,EAAE,WAAAE,EAAA,IAAcC,EAAA,GAEhBS,IAAaF,EAAQ,MAAMF,EAAM,KAAK,CAACV,MAASI,EAAUJ,CAAI,CAAC,GAAG,CAACU,GAAON,CAAS,CAAC;AAE1F,WAAO,gBAAAG,EAAAC,GAAA,EAAG,UAAAM,IAAab,IAAWC,GAAS;AAAA,EAC7C;AACF;AAEAW,EAAY,cAAc;"}