{"version":3,"file":"index.mjs","sources":[""],"sourcesContent":["import { wait } from \"@web3r/flowerkit/fn\";\r\nimport type {\r\n  ReactElement,\r\n  ReactNode,\r\n  RefObject,\r\n} from \"react\";\r\nimport {\r\n  Children,\r\n  cloneElement,\r\n  isValidElement,\r\n  createElement,\r\n  useEffect,\r\n  useState,\r\n  useRef,\r\n} from \"react\";\r\nimport { getSanitizedHTML } from \"../../../../utils/getSanitizedHTML\";\r\nimport type { TPoint } from \"../../config/types\";\r\n\r\nconst getMetaPaneContent = (data: TPoint): ReactNode => {\r\n  const pane = data?.meta?.pane;\r\n  if (!pane) {\r\n    return null;\r\n  }\r\n\r\n  const title = typeof pane.title === \"string\" ? pane.title : null;\r\n  const description = typeof pane.description === \"string\" ? pane.description : null;\r\n\r\n  if (!title && !description) {\r\n    return null;\r\n  }\r\n\r\n  const content: ReactNode[] = [];\r\n\r\n  if (title) {\r\n    content.push(createElement(\"div\", {\r\n      key: \"title\",\r\n      dangerouslySetInnerHTML: { __html: getSanitizedHTML(title) },\r\n    }));\r\n  }\r\n\r\n  if (description) {\r\n    content.push(createElement(\"div\", {\r\n      key: \"description\",\r\n      dangerouslySetInnerHTML: { __html: getSanitizedHTML(description) },\r\n    }));\r\n  }\r\n\r\n  return content;\r\n};\r\n\r\n/**\r\n * Получает контент для слота панели\r\n * @param children{ReactNode|Function}\r\n * @param data{TPoint}\r\n * @returns {ReactElement}\r\n */\r\nconst getSlot: ((children: (ReactNode | ((args: TPoint) => ReactNode)), data?: TPoint | null) => ReactNode) = (children, data) => {\r\n\r\n  if (!!data) {\r\n\r\n    switch (true) {\r\n      case typeof children === \"function\": {\r\n\r\n        return children(data);\r\n\r\n      }\r\n      case isValidElement(children): {\r\n\r\n        return Children\r\n          .toArray(children)\r\n          .filter((child) => isValidElement(child))\r\n          .map((child) => {\r\n            if (!isValidElement(child)) {\r\n              return child;\r\n            }\r\n            const element = child as ReactElement<{ data?: TPoint; }>;\r\n            return cloneElement(element, {\r\n              ...(element.props ?? {}),\r\n              key: element.key ?? `panel_${data.id}`,\r\n              data,\r\n            });\r\n          });\r\n\r\n      }\r\n      case children === null || children === undefined:\r\n        return getMetaPaneContent(data);\r\n      default:\r\n        console.error(`[Map] Panel slot must be valid React element or Function`);\r\n        return null;\r\n    }\r\n\r\n  } else {\r\n\r\n    return null;\r\n\r\n  }\r\n\r\n};\r\n\r\n/**\r\n * Хук позволяет использовать условный рендеринг с CSS-свойством `transition`\r\n * @param onOpen{null|Function=}\r\n * @param onHide{null|Function=}\r\n * @param ref{RefObject}\r\n * @param delay{Number=}\r\n * @returns {{\r\n *   isVisible: boolean,\r\n *   show: Function,\r\n *   hide: Function\r\n * }}\r\n */\r\nconst useVisibility = ({\r\n  ref,\r\n  delay = 100,\r\n  onShow = null,\r\n  onHide = null,\r\n}: {\r\n  ref: RefObject<HTMLElement | null>;\r\n  delay?: number;\r\n  onShow?: null | (() => void);\r\n  onHide?: null | (() => void);\r\n}): {\r\n  isVisible: boolean;\r\n  show: Function;\r\n  hide: Function;\r\n} => {\r\n\r\n  const [ isVisible, setIsVisible ] = useState(false);\r\n\r\n  const visibilityRef = useRef(isVisible);\r\n\r\n  const show = () => {\r\n\r\n    setIsVisible(true);\r\n\r\n  };\r\n\r\n  const hide = () => {\r\n\r\n    if (ref.current) {\r\n\r\n      ref.current.addEventListener(\"transitionend\", () => {\r\n\r\n        setIsVisible(false);\r\n\r\n      }, { once: true });\r\n      ref.current.classList.remove(\"isVisible\");\r\n\r\n    }\r\n\r\n  };\r\n\r\n  useEffect(() => {\r\n\r\n    if (visibilityRef.current !== isVisible) {\r\n\r\n      if (isVisible) {\r\n\r\n        wait(delay).then(() => {\r\n\r\n          return ref.current?.classList.add(\"isVisible\");\r\n\r\n        })\r\n          .finally(() => {\r\n\r\n            if (typeof onShow === \"function\") {\r\n\r\n              onShow();\r\n\r\n            }\r\n\r\n          });\r\n\r\n      } else {\r\n\r\n        if (typeof onHide === \"function\") {\r\n\r\n          onHide();\r\n\r\n        }\r\n\r\n      }\r\n      visibilityRef.current = isVisible;\r\n\r\n    }\r\n\r\n  }, [ isVisible ]);\r\n\r\n  return {\r\n    isVisible,\r\n    show,\r\n    hide,\r\n  };\r\n\r\n};\r\n\r\nexport {\r\n  getSlot,\r\n  useVisibility,\r\n};\r\n"],"names":["getMetaPaneContent","data","pane","meta","title","description","content","push","createElement","key","dangerouslySetInnerHTML","__html","getSanitizedHTML","getSlot","children","isValidElement","Children","toArray","filter","child","map","element","cloneElement","props","id","undefined","console","error","useVisibility","ref","delay","onShow","onHide","isVisible","setIsVisible","useState","visibilityRef","useRef","show","hide","current","addEventListener","once","classList","remove","useEffect","wait","then","add","finally"],"mappings":"2MAkBA,MAAMA,mBAAsBC,OAC1B,MAAMC,KAAOD,MAAME,MAAMD,KACzB,IAAKA,KACH,OAAO,KAGT,MAAME,aAAeF,KAAKE,QAAU,SAAWF,KAAKE,MAAQ,KAC5D,MAAMC,mBAAqBH,KAAKG,cAAgB,SAAWH,KAAKG,YAAc,KAE9E,IAAKD,QAAUC,YACb,OAAO,KAGT,MAAMC,QAAuB,GAE7B,GAAIF,MACFE,QAAQC,KAAKC,cAAc,MAAO,CAChCC,IAAK,QACLC,wBAAyB,CAAEC,OAAQC,iBAAiBR,WAIxD,GAAIC,YACFC,QAAQC,KAAKC,cAAc,MAAO,CAChCC,IAAK,cACLC,wBAAyB,CAAEC,OAAQC,iBAAiBP,iBAIxD,OAAOC;;;;;;GAST,MAAMO,QAAwG,CAACC,SAAUb,QAEvH,KAAMA,KAEJ,OAAQ,MACN,YAAYa,WAAa,WAEvB,OAAOA,SAASb,MAGlB,KAAKc,eAAeD,UAElB,OAAOE,SACJC,QAAQH,UACRI,OAAQC,OAAUJ,eAAeI,QACjCC,IAAKD,QACJ,IAAKJ,eAAeI,OAClB,OAAOA,MAET,MAAME,QAAUF,MAChB,OAAOG,aAAaD,QAAS,IACvBA,QAAQE,OAAS,GACrBd,IAAKY,QAAQZ,KAAO,SAASR,KAAKuB,KAClCvB,cAKR,KAAKa,WAAa,MAAQA,gBAAaW,EACrC,OAAOzB,mBAAmBC,MAC5B,QACEyB,QAAQC,MAAM,4DACd,OAAO,UAKX,OAAO;;;;;;;;;;;;GAkBX,MAAMC,cAAgB,EACpBC,QACAC,YAAQ,IACRC,cAAS,KACTC,cAAS,SAYT,MAAQC,UAAWC,cAAiBC,SAAS,OAE7C,MAAMC,cAAgBC,OAAOJ,WAE7B,MAAMK,KAAO,KAEXJ,aAAa,OAIf,MAAMK,KAAO,KAEX,GAAIV,IAAIW,QAAS,CAEfX,IAAIW,QAAQC,iBAAiB,gBAAiB,KAE5CP,aAAa,QAEZ,CAAEQ,KAAM,OACXb,IAAIW,QAAQG,UAAUC,OAAO,YAE/B,GAIFC,UAAU,KAER,GAAIT,cAAcI,UAAYP,UAAW,CAEvC,GAAIA,UAEFa,KAAKhB,OAAOiB,KAAK,IAERlB,IAAIW,SAASG,UAAUK,IAAI,cAGjCC,QAAQ,KAEP,UAAWlB,SAAW,WAEpBA,gBAQN,UAAWC,SAAW,WAEpBA,SAKJI,cAAcI,QAAUP,SAE1B,GAEC,CAAEA,YAEL,MAAO,CACLA,oBACAK,UACAC"}