'use client'; import React from 'react'; import { cn, withProps, withRef } from '@udecode/cn'; import { useElement } from '@udecode/plate-common/react'; import { useBlockSelected } from '@udecode/plate-selection/react'; import { TableRowPlugin, useTableCellElement, useTableCellElementResizable, useTableCellElementResizableState, useTableCellElementState, } from '@udecode/plate-table/react'; import { blockSelectionVariants } from './block-selection'; import { PlateElement } from './plate-element'; import { ResizeHandle } from './resizable'; export const TableCellElement = withRef< typeof PlateElement, { hideBorder?: boolean; isHeader?: boolean; } >(({ children, className, hideBorder, isHeader, style, ...props }, ref) => { const { element } = props; const rowElement = useElement(TableRowPlugin.key); const isSelectingRow = useBlockSelected(rowElement.id as string); const { borders, colIndex, colSpan, hovered, hoveredLeft, isSelectingCell, readOnly, rowIndex, rowSize, selected, } = useTableCellElementState(); const { props: cellProps } = useTableCellElement({ element: props.element }); const resizableState = useTableCellElementResizableState({ colIndex, colSpan, rowIndex, }); const { bottomProps, hiddenLeft, leftProps, rightProps } = useTableCellElementResizable(resizableState); return ( _*]:m-0', 'before:size-full', selected && 'before:z-10 before:bg-muted', "before:absolute before:box-border before:select-none before:content-['']", borders && cn( borders.bottom?.size && `before:border-b before:border-b-border`, borders.right?.size && `before:border-r before:border-r-border`, borders.left?.size && `before:border-l before:border-l-border`, borders.top?.size && `before:border-t before:border-t-border` ) ), className )} {...cellProps} {...props} style={ { '--cellBackground': element.background, ...style, } as React.CSSProperties } >
{children}
{!isSelectingCell && (
{!readOnly && ( <> {!hiddenLeft && ( )} {hovered && (
)} {hoveredLeft && (
)} )}
)} {isSelectingRow && (
)} ); }); TableCellElement.displayName = 'TableCellElement'; export const TableCellHeaderElement = withProps(TableCellElement, { isHeader: true, });