{"version":3,"file":"index.cjs","names":["React","IconButton","ChevronLeft","ChevronRight"],"sources":["../../../src/components/Table/Table.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport { ChevronLeft, ChevronRight } from \"lucide-react\";\nimport React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { IconButton } from \"../IconButton\";\n\ntype TableAlignment = \"left\" | \"center\" | \"right\";\n\nconst alignmentClasses: Record<TableAlignment, string> = {\n  left: \"openui-table-align-left\",\n  center: \"openui-table-align-center\",\n  right: \"openui-table-align-right\",\n};\n\n// ─── Primitives ───\n\nconst Table = React.forwardRef<\n  HTMLTableElement,\n  React.HTMLAttributes<HTMLTableElement> & {\n    containerRef?: React.RefObject<HTMLDivElement>;\n    containerClassName?: string;\n    containerStyle?: React.CSSProperties;\n  }\n>(({ className, containerRef, containerClassName, containerStyle, ...props }, ref) => (\n  <div\n    ref={containerRef}\n    className={clsx(\"openui-table-container\", containerClassName)}\n    style={containerStyle}\n  >\n    <table ref={ref} className={clsx(\"openui-table\", className)} {...props} />\n  </div>\n));\nTable.displayName = \"Table\";\n\nconst TableHeader = React.forwardRef<\n  HTMLTableSectionElement,\n  React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n  <thead ref={ref} className={clsx(\"openui-table-header\", className)} {...props} />\n));\nTableHeader.displayName = \"TableHeader\";\n\nconst TableBody = React.forwardRef<\n  HTMLTableSectionElement,\n  React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n  <tbody ref={ref} className={clsx(\"openui-table-body\", className)} {...props} />\n));\nTableBody.displayName = \"TableBody\";\n\nconst TableFooter = React.forwardRef<\n  HTMLTableSectionElement,\n  React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n  <tfoot ref={ref} className={clsx(\"openui-table-footer\", className)} {...props} />\n));\nTableFooter.displayName = \"TableFooter\";\n\nconst TableRow = React.forwardRef<HTMLTableRowElement, React.HTMLAttributes<HTMLTableRowElement>>(\n  ({ className, ...props }, ref) => (\n    <tr ref={ref} className={clsx(\"openui-table-row\", className)} {...props} />\n  ),\n);\nTableRow.displayName = \"TableRow\";\n\nexport interface TableHeadProps extends React.ThHTMLAttributes<HTMLTableCellElement> {\n  icon?: React.ReactNode;\n  align?: TableAlignment;\n}\n\nconst TableHead = React.forwardRef<HTMLTableCellElement, TableHeadProps>(\n  ({ className, children, icon, align, ...props }, ref) => (\n    <th ref={ref} className={clsx(\"openui-table-head\", className)} {...props}>\n      <div className={clsx(\"openui-table-head-content\", align && alignmentClasses[align])}>\n        {icon && <div className=\"openui-table-head-icon\">{icon}</div>}\n        <div className=\"openui-table-head-label\">{children}</div>\n      </div>\n    </th>\n  ),\n);\nTableHead.displayName = \"TableHead\";\n\nexport interface TableCellProps extends React.TdHTMLAttributes<HTMLTableCellElement> {\n  align?: TableAlignment;\n}\n\nconst TableCell = React.forwardRef<HTMLTableCellElement, TableCellProps>(\n  ({ className, align, ...props }, ref) => (\n    <td\n      ref={ref}\n      className={clsx(\"openui-table-cell\", align && alignmentClasses[align], className)}\n      {...props}\n    />\n  ),\n);\nTableCell.displayName = \"TableCell\";\n\n// ─── ScrollableTable ───\n\nexport interface ScrollableTableProps extends React.HTMLAttributes<HTMLTableElement> {\n  containerClassName?: string;\n  containerStyle?: React.CSSProperties;\n}\n\nconst ScrollableTable = React.forwardRef<HTMLTableElement, ScrollableTableProps>(\n  ({ className, containerClassName, containerStyle, children, ...tableProps }, ref) => {\n    const wrapperRef = useRef<HTMLDivElement>(null);\n    const scrollContainerRef = useRef<HTMLDivElement>(null);\n\n    const [isScrollable, setIsScrollable] = useState(false);\n    const [canScrollLeft, setCanScrollLeft] = useState(false);\n    const [canScrollRight, setCanScrollRight] = useState(false);\n    const columnLeftsRef = useRef<number[]>([]);\n\n    useEffect(() => {\n      const container = scrollContainerRef.current;\n      const wrapper = wrapperRef.current;\n      if (!container || !wrapper) return;\n\n      const compute = () => {\n        const scrollable = container.scrollWidth > container.clientWidth;\n        setIsScrollable(scrollable);\n        setCanScrollLeft(container.scrollLeft > 0);\n        setCanScrollRight(container.scrollLeft < container.scrollWidth - container.clientWidth - 1);\n\n        const ths = wrapper.querySelectorAll<HTMLTableCellElement>(\"thead th\");\n        if (!ths || ths.length === 0) {\n          columnLeftsRef.current = [];\n          return;\n        }\n        const containerRect = container.getBoundingClientRect();\n        const lefts: number[] = [];\n        ths.forEach((th) => {\n          const rect = th.getBoundingClientRect();\n          const left = rect.left - containerRect.left + container.scrollLeft;\n          lefts.push(Math.max(0, Math.round(left)));\n        });\n        columnLeftsRef.current = Array.from(new Set(lefts)).sort((a, b) => a - b);\n      };\n\n      compute();\n\n      const ro = new ResizeObserver(() => compute());\n      ro.observe(container);\n\n      const onScroll = () => {\n        setCanScrollLeft(container.scrollLeft > 0);\n        setCanScrollRight(container.scrollLeft < container.scrollWidth - container.clientWidth - 1);\n      };\n      container.addEventListener(\"scroll\", onScroll);\n\n      return () => {\n        ro.disconnect();\n        container.removeEventListener(\"scroll\", onScroll);\n      };\n    }, [children]);\n\n    const scrollToNextColumn = useCallback(() => {\n      const container = scrollContainerRef.current;\n      if (!container || columnLeftsRef.current.length === 0) return;\n      const current = container.scrollLeft;\n      const target = columnLeftsRef.current.find((l) => l > current + 1);\n      const maxScroll = container.scrollWidth - container.clientWidth;\n      const next = typeof target === \"number\" ? target : maxScroll;\n      container.scrollTo({ left: Math.min(next, maxScroll), behavior: \"smooth\" });\n    }, []);\n\n    const scrollToPrevColumn = useCallback(() => {\n      const container = scrollContainerRef.current;\n      if (!container || columnLeftsRef.current.length === 0) return;\n      const current = container.scrollLeft;\n      const prevs = columnLeftsRef.current.filter((l) => l < current - 1);\n      const prev = prevs.at(-1) ?? 0;\n      container.scrollTo({ left: Math.max(0, prev), behavior: \"smooth\" });\n    }, []);\n\n    return (\n      <div className=\"openui-scrollable-table-wrapper\" ref={wrapperRef} tabIndex={0}>\n        {isScrollable && (\n          <>\n            <div\n              className={clsx(\n                \"openui-scrollable-table-control\",\n                \"openui-scrollable-table-control-left\",\n                !canScrollLeft && \"openui-scrollable-table-control-disabled\",\n              )}\n            >\n              <IconButton\n                aria-label=\"Scroll left\"\n                size=\"small\"\n                variant=\"secondary\"\n                onClick={scrollToPrevColumn}\n                disabled={!canScrollLeft}\n                icon={<ChevronLeft size={16} />}\n              />\n            </div>\n            <div\n              className={clsx(\n                \"openui-scrollable-table-control\",\n                \"openui-scrollable-table-control-right\",\n                !canScrollRight && \"openui-scrollable-table-control-disabled\",\n              )}\n            >\n              <IconButton\n                aria-label=\"Scroll right\"\n                size=\"small\"\n                variant=\"secondary\"\n                onClick={scrollToNextColumn}\n                disabled={!canScrollRight}\n                icon={<ChevronRight size={16} />}\n              />\n            </div>\n          </>\n        )}\n        <Table\n          ref={ref}\n          containerRef={scrollContainerRef as React.RefObject<HTMLDivElement>}\n          containerClassName={clsx(\"openui-scrollable-table-scroll-container\", containerClassName)}\n          containerStyle={containerStyle}\n          className={className}\n          style={{ width: isScrollable ? \"max-content\" : \"100%\" }}\n          {...tableProps}\n        >\n          {children}\n        </Table>\n      </div>\n    );\n  },\n);\nScrollableTable.displayName = \"ScrollableTable\";\n\nexport {\n  ScrollableTable,\n  Table,\n  TableBody,\n  TableCell,\n  TableFooter,\n  TableHead,\n  TableHeader,\n  TableRow,\n};\n"],"mappings":"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"}