Fretboard component written in React.
Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
 
 
 

164 wiersze
3.7 KiB

  1. import * as React from 'react'
  2. import * as PropTypes from 'prop-types'
  3. const propTypes = {
  4. fretNumber: PropTypes.number.isRequired,
  5. totalFrets: PropTypes.number.isRequired,
  6. firstString: PropTypes.bool,
  7. strings: PropTypes.number.isRequired,
  8. landmarks: PropTypes.bool,
  9. fretted: PropTypes.bool,
  10. capoFret: PropTypes.number,
  11. name: PropTypes.string,
  12. }
  13. type Props = PropTypes.InferProps<typeof propTypes>
  14. const Fret: React.FC<Props> = ({
  15. fretNumber,
  16. totalFrets,
  17. children,
  18. firstString,
  19. strings,
  20. landmarks = false,
  21. fretted = false,
  22. capoFret = 0,
  23. name,
  24. }) => (
  25. <div
  26. style={{
  27. display: 'block',
  28. position: 'relative',
  29. width: fretNumber > 0 ? `${(totalFrets - fretNumber) / 12 * 100 + 100}%` : '0.5rem',
  30. height: '1rem',
  31. flexShrink: fretNumber > 0 ? undefined : 0,
  32. padding: 0,
  33. borderWidth: '0 0.0625rem',
  34. borderStyle: 'none solid',
  35. }}
  36. >
  37. {
  38. landmarks
  39. && (fretNumber % 12 === 3 || fretNumber % 12 === 5 || fretNumber % 12 === 7 || fretNumber % 12 === 9 || fretNumber % 12 === 0)
  40. && fretNumber > 0
  41. && firstString
  42. && (
  43. <div
  44. style={{
  45. position: 'absolute',
  46. top: 0,
  47. height: `${strings! * 100}%`,
  48. width: '100%',
  49. display: 'flex',
  50. alignItems: 'center',
  51. justifyContent: 'space-around',
  52. flexDirection: 'column',
  53. }}
  54. >
  55. <div
  56. style={{
  57. width: '0.75rem',
  58. height: '0.75rem',
  59. backgroundColor: 'currentColor',
  60. opacity: 0.5,
  61. borderRadius: '50%',
  62. }}
  63. />
  64. {fretNumber > 0 && fretNumber % 12 === 0 && (
  65. <div
  66. style={{
  67. width: '0.75rem',
  68. height: '0.75rem',
  69. backgroundColor: 'currentColor',
  70. opacity: 0.5,
  71. borderRadius: '50%',
  72. }}
  73. />
  74. )}
  75. </div>
  76. )
  77. }
  78. <div
  79. style={{
  80. position: 'absolute',
  81. top: 0,
  82. left: 0,
  83. width: '100%',
  84. height: '100%',
  85. display: 'flex',
  86. alignItems: 'center',
  87. }}
  88. >
  89. {children}
  90. </div>
  91. {
  92. fretted
  93. && (
  94. <div
  95. style={{
  96. position: 'absolute',
  97. top: 0,
  98. left: 0,
  99. height: '100%',
  100. width: '100%',
  101. display: 'flex',
  102. alignItems: 'center',
  103. justifyContent: 'space-around',
  104. flexDirection: 'column',
  105. color: 'red',
  106. zIndex: 1,
  107. }}
  108. >
  109. <div
  110. style={{
  111. display: 'grid',
  112. placeContent: 'center',
  113. width: name ? '2rem' : '0.75rem',
  114. height: name ? '1.5rem' : '0.75rem',
  115. backgroundColor: 'currentColor',
  116. borderRadius: name ? '0.75rem' : '0.375rem',
  117. }}
  118. >
  119. <div
  120. style={{
  121. color: 'white',
  122. }}
  123. >
  124. {name}
  125. </div>
  126. </div>
  127. </div>
  128. )
  129. }
  130. {
  131. fretNumber > 0
  132. && capoFret === fretNumber
  133. && firstString
  134. && (
  135. <div
  136. style={{
  137. position: 'absolute',
  138. top: 0,
  139. height: `${strings! * 100}%`,
  140. width: '100%',
  141. }}
  142. >
  143. <div
  144. style={{
  145. margin: '0 auto',
  146. width: '0.75rem',
  147. height: '100%',
  148. backgroundColor: 'currentColor',
  149. borderRadius: '0.375rem',
  150. }}
  151. />
  152. </div>
  153. )
  154. }
  155. </div>
  156. )
  157. Fret.propTypes = propTypes
  158. export default Fret