{"version":3,"file":"index.cjs","sources":["../../src/dev-panel/index.ts"],"sourcesContent":["import { Button, Collapse, Icon } from \"@blueprintjs/core\";\nimport { useEffect, useState } from \"react\";\nimport hyper from \"@macrostrat/hyper\";\nimport { create, useStore as useStoreCreator } from \"zustand\";\nimport styles from \"./page-admin.module.sass\";\nimport { PageAdminInner } from \"./_inner\";\nimport { ErrorBoundary } from \"../error-boundary\";\nimport type { ComponentType } from \"react\";\n\nconst h = hyper.styled(styles);\n\ntype DevToolsState = {\n  isOpen: boolean;\n  isSystemEnabled: boolean;\n  isInitialized: boolean;\n};\n\nexport interface DevToolsStore extends DevToolsState {\n  buttonRef: HTMLElement;\n  setIsOpen: (isOpen: boolean) => void;\n  toggle: () => void;\n  toggleButton: () => void;\n  setButtonRef: (ref: HTMLElement) => void;\n}\n\nconst useStore: any = create<DevToolsStore>((set) => {\n  return {\n    isOpen: false,\n    isSystemEnabled: false,\n    isInitialized: false,\n    setIsOpen(isOpen) {\n      set({ isOpen });\n    },\n    toggle() {\n      set((state) => ({ isOpen: !state.isOpen }));\n    },\n    toggleButton() {\n      set((state) => {\n        let isOpen = state.isSystemEnabled ? false : state.isOpen;\n        return { isSystemEnabled: !state.isSystemEnabled, isOpen };\n      });\n    },\n    buttonRef: null,\n    setButtonRef(ref) {\n      console.log(\"Setting button ref\");\n      set({ buttonRef: ref });\n    },\n  };\n});\n\nfunction DevToolsDialog({ isOpen, setIsOpen, children }) {\n  if (!isOpen) return null;\n  return h(PageAdminInner, { isOpen, setIsOpen }, children);\n}\n\ntype DevTool = ComponentType & { title?: string };\n\nexport function DevToolsConsole({\n  className,\n  tools,\n}: {\n  className?: string;\n  tools: DevTool[];\n}) {\n  // Disable totally for now\n  const [isOpen, setIsOpen] = useIsOpen();\n  const buttonRef = useStore((state) => state.buttonRef);\n  useDevToolsQueryParameter();\n  useDevToolsKeyBinding();\n\n  const isSystemEnabled = useStore((state) => state.isSystemEnabled);\n\n  if (!isSystemEnabled) return null;\n\n  return h(\"div.dev-tools-container\", { className }, [\n    h(DevToolsDialog, { isOpen, setIsOpen }, h(Accordion, { tools })),\n    h.if(buttonRef == null)(DevToolsButtonSlot, { setRef: false }),\n  ]);\n}\n\nfunction Accordion({ tools }: { tools: DevTool[] }) {\n  const [openIndex, setOpenIndex] = useState(0);\n  return h(\n    \"div.accordion\",\n    {},\n    tools.map((tool, i) => {\n      return h(CollapseArea, {\n        title: tool.title ?? tool.displayName ?? \"Dev Tool\",\n        isExpanded: i === openIndex,\n        setExpanded: () => {\n          if (i === openIndex) {\n            setOpenIndex(Math.min(Math.max(i + 1, tools.length - 1), 0));\n          } else {\n            setOpenIndex(i);\n          }\n        },\n        component: tool,\n      });\n    }),\n  );\n}\n\nfunction CollapseArea({ title, isExpanded, setExpanded, component }) {\n  return h(\"div.collapse-area\", [\n    h(\n      \"div.collapse-header\",\n      { onClick: setExpanded, className: isExpanded ? \"expanded\" : null },\n      [\n        h(\"h3.collapse-title\", title),\n        h(Icon, { icon: isExpanded ? \"chevron-up\" : \"chevron-down\" }),\n      ],\n    ),\n    h(\n      Collapse,\n      { isOpen: isExpanded },\n      h(\"div.collapse-content\", h(ErrorBoundary, h(component))),\n    ),\n  ]);\n}\n\nexport function DevToolsButtonSlot({\n  setRef = true,\n  className,\n}: {\n  setRef?: boolean;\n  className?: string;\n}) {\n  const onClick = useStore((state) => state.toggle);\n  const _setRef = useStore((state) => state.setButtonRef);\n  const isShown = useStore((state) => state.isSystemEnabled);\n  const ref = (el) => {\n    if (setRef) _setRef(el);\n  };\n\n  if (!isShown) return null;\n\n  return h(\n    \"div.devtools-button\",\n    { className },\n    h(Button, {\n      onClick,\n      ref,\n      minimal: true,\n      icon: \"code\",\n    }),\n  );\n}\n\nfunction useDevToolsKeyBinding() {\n  // Show the page admin console only if the appropriate query parameter is set\n  // OR if the user presses shift+alt+I\n  const toggleButton = useStore((s) => s.toggleButton);\n\n  useEffect(() => {\n    function handleKeyDown(event: KeyboardEvent) {\n      if (event.key === \"I\" && event.shiftKey) {\n        toggleButton();\n      }\n    }\n\n    document.addEventListener(\"keydown\", handleKeyDown);\n    return () => document.removeEventListener(\"keydown\", handleKeyDown);\n  }, []);\n}\n\nfunction useDevToolsQueryParameter() {\n  // On initial load, check if the dev-tools query parameter is set\n  useEffect(() => {\n    if (typeof window === \"undefined\") return;\n    const url = new URL(window.location.href);\n    const params = url.searchParams;\n    const opt = params.get(\"dev-tools\");\n    let res: Partial<DevToolsState> = { isInitialized: true };\n    if (opt != null) {\n      res = { ...res, isSystemEnabled: true, isOpen: opt === \"open\" };\n    }\n    // Set up the initial state\n    useStore.setState(res);\n  }, []);\n\n  // Set the query parameter\n  const isSystemEnabled = useStore((state) => state.isSystemEnabled);\n  const isOpen = useStore((state) => state.isOpen);\n  const isInitialized = useStore((state) => state.isInitialized);\n\n  useEffect(() => {\n    // Check if window exists\n    if (typeof window === \"undefined\") return;\n    if (!isInitialized) return;\n    const url = new URL(window.location.href);\n    if (isSystemEnabled) {\n      const opt = isOpen ? \"open\" : \"enabled\";\n      url.searchParams.set(\"dev-tools\", opt);\n    } else {\n      url.searchParams.delete(\"dev-tools\");\n    }\n    window.history.replaceState({}, \"\", url.toString());\n  }, [isSystemEnabled, isInitialized, isOpen]);\n\n  return null;\n}\n\nfunction useIsOpen(): [boolean, (isOpen: boolean) => void] {\n  return useStore((state) => [state.isOpen, state.setIsOpen]);\n}\n"],"names":["hyper","styles","create","PageAdminInner","useState","Icon","Collapse","ErrorBoundary","Button","useEffect"],"mappings":"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"}