BorderLine.tsx 1.3 KB

1234567891011121314151617181920212223242526272829303132333435
  1. import type { OperateBorderLines } from '@/lib/types/edit';
  2. interface BorderLineProps {
  3. readonly type: OperateBorderLines;
  4. readonly isWide?: boolean;
  5. readonly style?: React.CSSProperties;
  6. readonly className?: string;
  7. }
  8. export function BorderLine({ type, isWide = false, style, className }: BorderLineProps) {
  9. const borderClass = {
  10. top: 'border-t',
  11. bottom: 'border-b',
  12. left: 'border-l',
  13. right: 'border-r',
  14. }[type];
  15. const wideBeforeClass = isWide
  16. ? {
  17. top: 'before:absolute before:-top-2 before:-left-2 before:w-[calc(100%+16px)] before:h-4 before:bg-transparent before:cursor-move before:content-[""]',
  18. bottom:
  19. 'before:absolute before:-bottom-2 before:-left-2 before:w-[calc(100%+16px)] before:h-4 before:bg-transparent before:cursor-move before:content-[""]',
  20. left: 'before:absolute before:-top-2 before:-left-2 before:w-4 before:h-[calc(100%+16px)] before:bg-transparent before:cursor-move before:content-[""]',
  21. right:
  22. 'before:absolute before:-top-2 before:-right-2 before:w-4 before:h-[calc(100%+16px)] before:bg-transparent before:cursor-move before:content-[""]',
  23. }[type]
  24. : '';
  25. return (
  26. <div
  27. className={`border-line absolute inset-0 border-dashed border-primary ${borderClass} ${wideBeforeClass} ${className || ''}`}
  28. style={style}
  29. />
  30. );
  31. }