contextLine.tsx 1009 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. import {Fragment} from 'react';
  2. import styled from '@emotion/styled';
  3. import classNames from 'classnames';
  4. interface Props {
  5. colorClass: string;
  6. isActive: boolean;
  7. line: [number, string];
  8. children?: React.ReactNode;
  9. className?: string;
  10. }
  11. const ContextLine = function ({line, isActive, children, className, colorClass}: Props) {
  12. let lineWs = '';
  13. let lineCode = '';
  14. if (typeof line[1] === 'string') {
  15. [, lineWs, lineCode] = line[1].match(/^(\s*)(.*?)$/m)!;
  16. }
  17. const Component = !children ? Fragment : Context;
  18. const hasCoverage = colorClass !== '';
  19. return (
  20. <li
  21. className={classNames(
  22. className,
  23. 'expandable',
  24. hasCoverage ? colorClass : {active: isActive}
  25. )}
  26. key={line[0]}
  27. >
  28. <Component>
  29. <span className="ws">{lineWs}</span>
  30. <span className="contextline">{lineCode}</span>
  31. </Component>
  32. {children}
  33. </li>
  34. );
  35. };
  36. export default ContextLine;
  37. const Context = styled('div')`
  38. display: inline;
  39. `;