border.js.flow 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. // @flow
  2. import capitalizeString from '../internalHelpers/_capitalizeString'
  3. import type { SideKeyword } from '../types/sideKeyword'
  4. import type { Styles } from '../types/style'
  5. const sideMap = ['top', 'right', 'bottom', 'left']
  6. /**
  7. * Shorthand for the border property that splits out individual properties for use with tools like Fela and Styletron. A side keyword can optionally be passed to target only one side's border properties.
  8. *
  9. * @example
  10. * // Styles as object usage
  11. * const styles = {
  12. * ...border('1px', 'solid', 'red')
  13. * }
  14. *
  15. * // styled-components usage
  16. * const div = styled.div`
  17. * ${border('1px', 'solid', 'red')}
  18. * `
  19. *
  20. * // CSS as JS Output
  21. *
  22. * div {
  23. * 'borderColor': 'red',
  24. * 'borderStyle': 'solid',
  25. * 'borderWidth': `1px`,
  26. * }
  27. *
  28. * // Styles as object usage
  29. * const styles = {
  30. * ...border('top', '1px', 'solid', 'red')
  31. * }
  32. *
  33. * // styled-components usage
  34. * const div = styled.div`
  35. * ${border('top', '1px', 'solid', 'red')}
  36. * `
  37. *
  38. * // CSS as JS Output
  39. *
  40. * div {
  41. * 'borderTopColor': 'red',
  42. * 'borderTopStyle': 'solid',
  43. * 'borderTopWidth': `1px`,
  44. * }
  45. */
  46. export default function border(
  47. sideKeyword: SideKeyword | string | number,
  48. ...values: Array<string | number>
  49. ): Styles {
  50. if (typeof sideKeyword === 'string' && sideMap.indexOf(sideKeyword) >= 0) {
  51. return {
  52. [`border${capitalizeString(sideKeyword)}Width`]: values[0],
  53. [`border${capitalizeString(sideKeyword)}Style`]: values[1],
  54. [`border${capitalizeString(sideKeyword)}Color`]: values[2],
  55. }
  56. } else {
  57. values.unshift(sideKeyword)
  58. return {
  59. borderWidth: values[0],
  60. borderStyle: values[1],
  61. borderColor: values[2],
  62. }
  63. }
  64. }