Design system.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

84 lines
2.0 KiB

  1. import * as React from 'react';
  2. import RefractorCore from 'react-refractor/all';
  3. import styles from './style.module.css';
  4. import {Marker} from 'react-refractor';
  5. export type RefractorDerivedElement = HTMLDivElement;
  6. export interface RefractorProps extends Omit<React.HTMLProps<RefractorDerivedElement>, 'children'> {
  7. code?: string;
  8. language?: string;
  9. lineNumbers?: boolean;
  10. tabSize?: number;
  11. header?: boolean;
  12. scroll?: boolean;
  13. actions?: React.ReactNode;
  14. markers?: Marker[];
  15. }
  16. export const Refractor = React.forwardRef<RefractorDerivedElement, RefractorProps>(({
  17. code: codeRaw = '',
  18. language = 'plain',
  19. lineNumbers = false,
  20. tabSize = 2,
  21. className,
  22. style,
  23. header = false,
  24. scroll = false,
  25. actions,
  26. markers = [],
  27. ...etcProps
  28. }, forwardedRef) => {
  29. const code = codeRaw.trim();
  30. return (
  31. <div
  32. {...etcProps}
  33. className={`${styles['react-refractor']} ${className ?? ''}`.trim()}
  34. style={style}
  35. ref={forwardedRef}
  36. >
  37. {header && (
  38. <div className={styles['header']}>
  39. <div className={styles['language']}>
  40. {language}
  41. </div>
  42. {actions}
  43. </div>
  44. )}
  45. <div
  46. className={styles['content-wrapper']}
  47. >
  48. {lineNumbers && (
  49. <pre
  50. className={styles['line-numbers']}
  51. >
  52. <code>
  53. {code.split('\n').map((_, i) => (
  54. <React.Fragment key={i}>
  55. {i > 0 && '\n'}
  56. {i + 1}
  57. {' '}
  58. </React.Fragment>
  59. ))}
  60. </code>
  61. </pre>
  62. )}
  63. <div
  64. className={`${styles['code-wrapper']} ${scroll ? styles['code-wrapper-scroll'] : ''}`.trim()}
  65. >
  66. <RefractorCore
  67. markers={markers}
  68. language={language}
  69. value={code}
  70. className="highlight"
  71. />
  72. </div>
  73. </div>
  74. </div>
  75. )
  76. });
  77. Refractor.displayName = 'Refractor';