{"version":3,"sources":["../src/index.ts","../src/tree/Tree.tsx","../src/tree/RootTreeContext.tsx","../src/tree/SubTreeContext.tsx","../src/tree/TreeLevelContext.tsx","../src/tree/TreeItem.tsx","../src/tree/TreeItemContext.tsx","../src/tree/TreeItemLayout.tsx","../src/tree/TreeWithJson.tsx"],"sourcesContent":["// Main entry point for the React Tree component library\nexport * from './tree';\n","import * as React from 'react';\nimport { RootTreeContext } from './RootTreeContext';\nimport { SubTreeContext } from './SubTreeContext';\nimport { TreeLevelContext } from './TreeLevelContext';\n\n// Tree 컴포넌트의 Props 타입\nexport interface TreeProps {\n  'aria-label'?: string;\n  'aria-labelledby'?: string;\n  children: React.ReactNode;\n  open?: boolean;\n  dropDownIcon?: React.ReactNode;\n  className?: string;\n}\n\n// Tree 컴포넌트\nexport const Tree = (props: TreeProps) => {\n  const isRoot = React.useContext(SubTreeContext) === undefined;\n\n  return isRoot ? <RootTree {...props} /> : <SubTree {...props} />;\n};\n\nconst RootTree = ({\n  children,\n  open,\n  dropDownIcon = '▶',\n  className = '',\n  ...props\n}: TreeProps) => {\n  return (\n    <RootTreeContext.Provider value={{ open, dropDownIcon }}>\n      <SubTreeContext.Provider value={null}>\n        <TreeLevelContext.Provider value={{ level: 0 }}>\n          <div role=\"tree\" className={className} {...props}>\n            {children}\n          </div>\n        </TreeLevelContext.Provider>\n      </SubTreeContext.Provider>\n    </RootTreeContext.Provider>\n  );\n};\n\nconst SubTree = ({ children, className = '', ...props }: TreeProps) => {\n  const { level } = React.useContext(TreeLevelContext);\n\n  return (\n    <SubTreeContext.Provider value={null}>\n      <TreeLevelContext.Provider value={{ level: level + 1 }}>\n        <div role=\"tree\" className={className} {...props}>\n          {children}\n        </div>\n      </TreeLevelContext.Provider>\n    </SubTreeContext.Provider>\n  );\n};\n","import * as React from 'react';\n\nexport interface RootTreeContextValue {\n  open?: boolean;\n  dropDownIcon?: React.ReactNode;\n}\n\nexport const RootTreeContext = React.createContext<RootTreeContextValue | null>(\n  {\n    open: false,\n    dropDownIcon: '▶',\n  }\n);\n\nexport const useRootTreeContext = () => {\n  const context = React.useContext(RootTreeContext);\n  if (!context) {\n    throw new Error('useRootTreeContext must be used within a Tree');\n  }\n  return context;\n};\n\nRootTreeContext.displayName = 'RootTreeContext';\n","import * as React from 'react';\n\nexport interface SubTreeContextValue {\n  dropDownIcon?: React.ReactNode;\n}\n\nexport const SubTreeContext = React.createContext<\n  SubTreeContextValue | null | undefined\n>(undefined);\n\nSubTreeContext.displayName = 'SubTreeContext';\n\nexport const useSubTreeContext = () => {\n  const context = React.useContext(SubTreeContext);\n  if (!context) {\n    throw new Error('useSubTreeContext must be used within a SubTree');\n  }\n  return context;\n};\n","import * as React from 'react';\n\nexport interface TreeLevelContextValue {\n  level: number;\n}\n\nexport const TreeLevelContext = React.createContext<TreeLevelContextValue>({\n  level: 0,\n});\n\nexport const useTreeLevelContext = () => {\n  return React.useContext(TreeLevelContext);\n};\n\nTreeLevelContext.displayName = 'TreeLevelContext';\n","import * as React from 'react';\nimport { useRootTreeContext } from './RootTreeContext';\nimport './TreeItem.css';\nimport { TreeItemContext } from './TreeItemContext';\nimport { useTreeLevelContext } from './TreeLevelContext';\n\nexport interface TreeItemProps {\n  itemType: 'leaf' | 'branch';\n  children: React.ReactNode;\n  className?: string;\n}\n\nexport const TreeItem = ({\n  itemType,\n  children,\n  className = '',\n}: TreeItemProps) => {\n  const { open: defaultOpen } = useRootTreeContext();\n  const { level } = useTreeLevelContext();\n  const [isOpen, setIsOpen] = React.useState(defaultOpen ?? false);\n\n  const handleToggle = React.useCallback(() => {\n    if (itemType === 'branch') {\n      setIsOpen(prev => !prev);\n    }\n  }, [itemType]);\n\n  const contextValue = React.useMemo(\n    () => ({\n      itemType,\n      isOpen,\n      onToggle: handleToggle,\n      level,\n    }),\n    [itemType, isOpen, handleToggle, level]\n  );\n\n  return (\n    <TreeItemContext.Provider value={contextValue}>\n      <div\n        role=\"treeitem\"\n        aria-expanded={itemType === 'branch' ? isOpen : undefined}\n        className={`tree-item ${className}`}\n      >\n        {React.Children.map(children, (child, childIndex) => {\n          if (childIndex === 0) {\n            // 첫 번째 자식은 TreeItemLayout (노드 자체)\n            return child;\n          } else if (childIndex === 1 && itemType === 'branch') {\n            // 두 번째 자식은 중첩된 Tree (자식들)\n            return (\n              <div\n                className=\"tree-item-subtree\"\n                style={{\n                  maxHeight: isOpen ? '2000px' : '0px',\n                }}\n              >\n                {child}\n              </div>\n            );\n          }\n          return null;\n        })}\n      </div>\n    </TreeItemContext.Provider>\n  );\n};\n","import * as React from 'react';\n\nexport interface TreeItemContextValue {\n  itemType: 'leaf' | 'branch';\n  isOpen: boolean;\n  onToggle: () => void;\n  level: number;\n}\n\nexport const TreeItemContext = React.createContext<TreeItemContextValue | null>(\n  null\n);\n\nexport const useTreeItemContext = () => {\n  const context = React.useContext(TreeItemContext);\n  if (!context) {\n    throw new Error('useTreeItemContext must be used within a TreeItem');\n  }\n  return context;\n};\n\nTreeItemContext.displayName = 'TreeItemContext';\n","import * as React from 'react';\nimport { useTreeItemContext } from './TreeItemContext';\nimport './TreeItemLayout.css';\nimport { useRootTreeContext } from './RootTreeContext';\n\nexport interface TreeItemLayoutProps\n  extends React.HTMLAttributes<HTMLDivElement> {\n  children: React.ReactNode;\n  className?: string;\n}\n\nexport const TreeItemLayout = ({\n  children,\n  className = '',\n  ...props\n}: TreeItemLayoutProps) => {\n  const { itemType, isOpen, onToggle, level } = useTreeItemContext();\n  const { dropDownIcon } = useRootTreeContext();\n\n  return (\n    <div\n      className={`tree-item-layout ${\n        itemType === 'branch'\n          ? 'tree-item-layout-branch'\n          : 'tree-item-layout-leaf'\n      } ${className}`}\n      onClick={itemType === 'branch' ? onToggle : undefined}\n      data-level={level}\n      style={{ paddingLeft: `${level * 1.5}rem` }}\n      {...props}\n    >\n      {itemType === 'branch' && (\n        <span\n          className={`drop-down-icon ${\n            isOpen ? 'drop-down-icon-open' : 'drop-down-icon-closed'\n          }`}\n        >\n          {dropDownIcon}\n        </span>\n      )}\n      {children}\n    </div>\n  );\n};\n","import * as React from 'react';\nimport { Tree, TreeProps } from './Tree';\nimport { TreeItem, TreeItemProps } from './TreeItem';\nimport { TreeItemLayout, TreeItemLayoutProps } from './TreeItemLayout';\n\nexport type TreeData = Record<string, any | Record<string, any>>;\n\nexport interface TreeWithJsonProps extends RenderTreeProps {}\n\nexport const TreeWithJson = ({\n  treeProps,\n  ...renderTreeProps\n}: TreeWithJsonProps) => {\n  return (\n    <Tree {...treeProps}>{renderTree({ treeProps, ...renderTreeProps })}</Tree>\n  );\n};\n\ninterface getTreeItemLayoutPropsParams {\n  level: number;\n  key: string;\n  value: TreeData;\n  itemType: 'leaf' | 'branch';\n}\n\ninterface RenderTreeItemProps {\n  level: number;\n  key: string;\n  value: TreeData;\n  itemType: 'leaf' | 'branch';\n  keyPath: string[];\n}\n\nexport interface RenderTreeProps {\n  data: TreeData;\n  renderTreeItem: (params: RenderTreeItemProps) => React.ReactNode;\n  getTreeItemLayoutProps?: (\n    params: getTreeItemLayoutPropsParams\n  ) => Omit<TreeItemLayoutProps, 'children'>;\n  treeItemProps?: Omit<TreeItemProps, 'children' | 'itemType'>;\n  treeProps?: Omit<TreeProps, 'children'>;\n  checkIsLeaf?: (value: TreeData) => boolean;\n}\n\nconst renderTree = (\n  props: RenderTreeProps,\n  level = 0,\n  keyPath: string[] = []\n) => {\n  const {\n    data,\n    renderTreeItem,\n    treeProps,\n    treeItemProps,\n    getTreeItemLayoutProps,\n    checkIsLeaf,\n  } = props;\n  return Object.entries(data).map(([key, value]) => {\n    const isLeaf = checkIsLeaf ? checkIsLeaf(value) : typeof value !== 'object';\n\n    const id = JSON.stringify(value).slice(1, -1);\n\n    const treeItemLayoutProps =\n      getTreeItemLayoutProps?.({\n        level,\n        key,\n        value,\n        itemType: isLeaf ? 'leaf' : 'branch',\n      }) ?? {};\n    if (isLeaf) {\n      return (\n        <TreeItem key={`${key}-${id}`} itemType=\"leaf\" {...treeItemProps}>\n          <TreeItemLayout {...treeItemLayoutProps}>\n            {renderTreeItem({\n              level,\n              key,\n              value,\n              itemType: 'leaf',\n              keyPath: [...keyPath, key],\n            })}\n          </TreeItemLayout>\n        </TreeItem>\n      );\n    }\n\n    return (\n      <TreeItem key={`${key}-${id}`} itemType=\"branch\" {...treeItemProps}>\n        <TreeItemLayout {...treeItemLayoutProps}>\n          {renderTreeItem({\n            level,\n            key,\n            value,\n            itemType: 'branch',\n            keyPath: [...keyPath, key],\n          })}\n        </TreeItemLayout>\n        <Tree {...treeProps}>\n          {renderTree({ ...props, data: value }, level + 1, [...keyPath, key])}\n        </Tree>\n      </TreeItem>\n    );\n  });\n};\n"],"mappings":"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","names":["index_exports","__export","RootTreeContext","SubTreeContext","Tree","TreeItem","TreeItemContext","TreeItemLayout","TreeLevelContext","TreeWithJson","useRootTreeContext","useSubTreeContext","useTreeItemContext","useTreeLevelContext","__toCommonJS","React","React","RootTreeContext","useRootTreeContext","context","React","SubTreeContext","useSubTreeContext","context","React","TreeLevelContext","useTreeLevelContext","import_jsx_runtime","Tree","props","SubTreeContext","RootTree","SubTree","children","open","dropDownIcon","className","RootTreeContext","TreeLevelContext","level","React","import_TreeItem","React","TreeItemContext","useTreeItemContext","context","import_jsx_runtime","TreeItem","itemType","children","className","defaultOpen","useRootTreeContext","level","useTreeLevelContext","isOpen","setIsOpen","handleToggle","prev","contextValue","TreeItemContext","child","childIndex","import_TreeItemLayout","import_jsx_runtime","TreeItemLayout","children","className","props","itemType","isOpen","onToggle","level","useTreeItemContext","dropDownIcon","useRootTreeContext","import_jsx_runtime","TreeWithJson","treeProps","renderTreeProps","Tree","renderTree","props","level","keyPath","data","renderTreeItem","treeItemProps","getTreeItemLayoutProps","checkIsLeaf","key","value","isLeaf","id","treeItemLayoutProps","TreeItem","TreeItemLayout"]}