FeatureBox.vue 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. <template>
  2. <div class="feature-card"
  3. :style="localOptions.style">
  4. <img class="feature-image"
  5. :class="{'has-url': localOptions.url}"
  6. :src="localOptions.image"
  7. @click="goToUrl">
  8. <div class="feature-meta">
  9. <div class="feature-title ellipsis-2-lines">
  10. <template v-if="localOptions.url">
  11. <a :href="localOptions.url">
  12. {{ localOptions.title }}
  13. </a>
  14. </template>
  15. <template v-else>
  16. {{ localOptions.title }}
  17. </template>
  18. </div>
  19. <div class="feature-description"
  20. v-html="localOptions.description" />
  21. </div>
  22. </div>
  23. </template>
  24. <script>
  25. import { mixinWidget } from 'src/mixin/Mixins.js'
  26. export default {
  27. name: 'FeatureBox',
  28. mixins: [mixinWidget],
  29. data() {
  30. return {
  31. defaultOptions: {
  32. title: null,
  33. description: null,
  34. image: null,
  35. horizontal: true,
  36. cssHoverEffects: {
  37. boxShadows: [],
  38. borderStyle: {
  39. borderCssString: '',
  40. borderRadiusCssString: ''
  41. },
  42. transition: {
  43. time: 0
  44. },
  45. transform: {
  46. rotate: 0,
  47. scaleX: 1,
  48. scaleY: 1,
  49. skewX: 0,
  50. skewY: 0,
  51. translateX: 0,
  52. translateY: 0
  53. }
  54. }
  55. }
  56. }
  57. },
  58. computed: {
  59. hoverShadows () {
  60. const shadows = []
  61. if (!Array.isArray(this.localOptions.cssHoverEffects?.boxShadows)) {
  62. return ''
  63. }
  64. this.localOptions.cssHoverEffects.boxShadows.forEach(shadow => {
  65. shadows.push(shadow.cssString)
  66. })
  67. return shadows.join(', ')
  68. },
  69. cssHoverEffectsBorderStyle () {
  70. const borderCssString = this.localOptions.cssHoverEffects?.borderStyle?.borderCssString ? this.localOptions.cssHoverEffects?.borderStyle?.borderCssString : ''
  71. const borderRadiusCssString = this.localOptions.cssHoverEffects?.borderStyle?.borderRadiusCssString ? this.localOptions.cssHoverEffects?.borderStyle?.borderRadiusCssString : ''
  72. return {
  73. borderCssString,
  74. borderRadiusCssString
  75. }
  76. }
  77. },
  78. methods: {
  79. goToUrl () {
  80. window.location.href = this.localOptions.url
  81. }
  82. }
  83. }
  84. </script>
  85. <style lang="scss" scoped>
  86. $hoverShadows: v-bind('hoverShadows');
  87. $hoverBorder: v-bind('cssHoverEffectsBorderStyle.borderCssString');
  88. $hoverBorderRadius: v-bind('cssHoverEffectsBorderStyle.borderRadiusCssString');
  89. $skewX: v-bind('localOptions.cssHoverEffects.transform.skewX');
  90. $skewY: v-bind('localOptions.cssHoverEffects.transform.skewY');
  91. $rotate: v-bind('localOptions.cssHoverEffects.transform.rotate');
  92. $scaleX: v-bind('localOptions.cssHoverEffects.transform.scaleX');
  93. $scaleY: v-bind('localOptions.cssHoverEffects.transform.scaleY');
  94. $translateX: v-bind('localOptions.cssHoverEffects.transform.translateX');
  95. $translateY: v-bind('localOptions.cssHoverEffects.transform.translateY');
  96. $transitionTime: v-bind('localOptions.cssHoverEffects.transition.time');
  97. .feature-card {
  98. display: flex;
  99. align-items: flex-start;
  100. justify-content: flex-start;
  101. gap: 33px;
  102. .feature-image {
  103. width: 215px;
  104. height: auto;
  105. border-radius: 20px;
  106. align-self: center;
  107. &.has-url {
  108. cursor: pointer;
  109. }
  110. }
  111. .feature-meta {
  112. .feature-title {
  113. font-size: 18px;
  114. letter-spacing: 0;
  115. color: #212121;
  116. }
  117. .feature-description {
  118. font-size: 20px;
  119. letter-spacing: 0;
  120. color: #707070;
  121. }
  122. }
  123. &:hover {
  124. transform: rotate(calc(#{$rotate} * 1deg)) translate(calc(#{$translateX} * 1px), calc(#{$translateY} * 1px)) scale($scaleX, $scaleY) skew(calc(#{$skewX} * 1deg), calc(#{$skewY} * 1deg));
  125. transition: all calc(#{$transitionTime} * 1s);
  126. box-shadow: $hoverShadows;
  127. -webkit-box-shadow: $hoverShadows;
  128. -moz-box-shadow: $hoverShadows;
  129. border-radius: $hoverBorderRadius;
  130. -webkit-border-radius: $hoverBorderRadius;
  131. -moz-border-radius: $hoverBorderRadius;
  132. border: $hoverBorder;
  133. }
  134. @media screen and (max-width: 800px) {
  135. flex-flow: column;
  136. }
  137. }
  138. </style>