{"version":3,"file":"useLayoutMode.mjs","sources":["../../../../../src/lib/layouts/adaptive/hooks/useLayoutMode.ts"],"sourcesContent":["/**\n * @fileoverview useLayoutMode Hook\n *\n * Hook for managing layout mode state with locking capabilities.\n * Allows manual override of automatic layout mode selection.\n *\n * @module layouts/adaptive/hooks/useLayoutMode\n * @version 1.0.0\n */\n\nimport { useCallback, useRef, useState } from 'react';\nimport type { LayoutMode, UseLayoutModeReturn } from '../types';\n\n// =============================================================================\n// HOOK IMPLEMENTATION\n// =============================================================================\n\n/**\n * Options for useLayoutMode hook.\n */\nexport interface UseLayoutModeOptions {\n  /** Initial layout mode */\n  initialMode?: LayoutMode;\n  /** Callback when mode changes */\n  onChange?: (mode: LayoutMode, previousMode: LayoutMode | null) => void;\n  /** Whether to start in locked mode */\n  initiallyLocked?: boolean;\n}\n\n/**\n * Hook for managing layout mode with locking capabilities.\n *\n * @param options - Hook configuration options\n * @returns Layout mode state and controls\n *\n * @example\n * ```tsx\n * function LayoutControls() {\n *   const {\n *     mode,\n *     previousMode,\n *     setMode,\n *     isLocked,\n *     lockMode,\n *     unlockMode\n *   } = useLayoutMode({\n *     initialMode: 'grid',\n *     onChange: (mode) => console.log('Mode changed to:', mode)\n *   });\n *\n *   return (\n *     <div>\n *       <select value={mode} onChange={(e) => setMode(e.target.value as LayoutMode)}>\n *         <option value=\"grid\">Grid</option>\n *         <option value=\"list\">List</option>\n *         <option value=\"compact\">Compact</option>\n *       </select>\n *       <button onClick={isLocked ? unlockMode : lockMode}>\n *         {isLocked ? 'Unlock' : 'Lock'} Mode\n *       </button>\n *     </div>\n *   );\n * }\n * ```\n */\nexport function useLayoutMode(options: UseLayoutModeOptions = {}): UseLayoutModeReturn {\n  const { initialMode = 'grid', onChange, initiallyLocked = false } = options;\n\n  // State\n  const [mode, setModeState] = useState<LayoutMode>(initialMode);\n  const [isLocked, setIsLocked] = useState(initiallyLocked);\n  const [previousMode, setPreviousMode] = useState<LayoutMode | null>(null);\n\n  // Refs\n  const previousModeRef = useRef<LayoutMode | null>(null);\n\n  // Set mode\n  const setMode = useCallback(\n    (newMode: LayoutMode) => {\n      const prevMode = mode;\n\n      if (newMode !== prevMode) {\n        previousModeRef.current = prevMode;\n        setPreviousMode(prevMode);\n        setModeState(newMode);\n        onChange?.(newMode, prevMode);\n      }\n    },\n    [mode, onChange]\n  );\n\n  // Lock mode\n  const lockMode = useCallback(() => {\n    setIsLocked(true);\n  }, []);\n\n  // Unlock mode\n  const unlockMode = useCallback(() => {\n    setIsLocked(false);\n  }, []);\n\n  return {\n    mode,\n    previousMode,\n    setMode,\n    isLocked,\n    lockMode,\n    unlockMode,\n  };\n}\n\n// =============================================================================\n// HELPER HOOKS\n// =============================================================================\n\n/**\n * Hook that returns true when layout mode matches the specified mode.\n *\n * @param targetMode - The mode to check against\n * @param currentMode - The current layout mode\n * @returns Whether the current mode matches the target\n *\n * @example\n * ```tsx\n * function GridOnlyContent({ currentMode }: { currentMode: LayoutMode }) {\n *   const isGrid = useIsLayoutMode('grid', currentMode);\n *\n *   if (!isGrid) return null;\n *\n *   return <GridSpecificContent />;\n * }\n * ```\n */\nexport function useIsLayoutMode(targetMode: LayoutMode, currentMode: LayoutMode): boolean {\n  return currentMode === targetMode;\n}\n\n/**\n * Hook that returns the appropriate value based on current layout mode.\n *\n * @param modeValues - Object mapping layout modes to values\n * @param currentMode - The current layout mode\n * @param defaultValue - Default value if mode not found\n * @returns The value for the current mode\n *\n * @example\n * ```tsx\n * function AdaptiveComponent({ currentMode }: { currentMode: LayoutMode }) {\n *   const columns = useLayoutModeValue(\n *     {\n *       grid: 4,\n *       list: 1,\n *       compact: 6,\n *       expanded: 2,\n *       dense: 8,\n *       sparse: 1,\n *     },\n *     currentMode,\n *     3\n *   );\n *\n *   return <Grid columns={columns}>{children}</Grid>;\n * }\n * ```\n */\nexport function useLayoutModeValue<T>(\n  modeValues: Partial<Record<LayoutMode, T>>,\n  currentMode: LayoutMode,\n  defaultValue: T\n): T {\n  return modeValues[currentMode] ?? defaultValue;\n}\n\n// =============================================================================\n// EXPORTS\n// =============================================================================\n\nexport type { UseLayoutModeReturn };\n"],"names":["useLayoutMode","options","initialMode","onChange","initiallyLocked","mode","setModeState","useState","isLocked","setIsLocked","previousMode","setPreviousMode","previousModeRef","useRef","setMode","useCallback","newMode","prevMode","lockMode","unlockMode","useIsLayoutMode","targetMode","currentMode","useLayoutModeValue","modeValues","defaultValue"],"mappings":";AAiEO,SAASA,EAAcC,IAAgC,IAAyB;AACrF,QAAM,EAAE,aAAAC,IAAc,QAAQ,UAAAC,GAAU,iBAAAC,IAAkB,OAAUH,GAG9D,CAACI,GAAMC,CAAY,IAAIC,EAAqBL,CAAW,GACvD,CAACM,GAAUC,CAAW,IAAIF,EAASH,CAAe,GAClD,CAACM,GAAcC,CAAe,IAAIJ,EAA4B,IAAI,GAGlEK,IAAkBC,EAA0B,IAAI,GAGhDC,IAAUC;AAAA,IACd,CAACC,MAAwB;AACvB,YAAMC,IAAWZ;AAEjB,MAAIW,MAAYC,MACdL,EAAgB,UAAUK,GAC1BN,EAAgBM,CAAQ,GACxBX,EAAaU,CAAO,GACpBb,IAAWa,GAASC,CAAQ;AAAA,IAEhC;AAAA,IACA,CAACZ,GAAMF,CAAQ;AAAA,EAAA,GAIXe,IAAWH,EAAY,MAAM;AACjC,IAAAN,EAAY,EAAI;AAAA,EAClB,GAAG,CAAA,CAAE,GAGCU,IAAaJ,EAAY,MAAM;AACnC,IAAAN,EAAY,EAAK;AAAA,EACnB,GAAG,CAAA,CAAE;AAEL,SAAO;AAAA,IACL,MAAAJ;AAAA,IACA,cAAAK;AAAA,IACA,SAAAI;AAAA,IACA,UAAAN;AAAA,IACA,UAAAU;AAAA,IACA,YAAAC;AAAA,EAAA;AAEJ;AAwBO,SAASC,EAAgBC,GAAwBC,GAAkC;AACxF,SAAOA,MAAgBD;AACzB;AA8BO,SAASE,EACdC,GACAF,GACAG,GACG;AACH,SAAOD,EAAWF,CAAW,KAAKG;AACpC;"}