DotButton.vue 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. <template>
  2. <b-button
  3. class="dot-btn"
  4. :class="['dot-btn-' + variant, { 'active': active, 'show': show, 'hide': dotOnly }]"
  5. v-bind="$attrs" v-on="$listeners"
  6. :active="active"
  7. :variant="variant"
  8. @mouseover="show = true"
  9. @mouseleave="show = false"
  10. @focus="show = true"
  11. @blur="show = false"
  12. @click="onClick"
  13. >
  14. <span :class="pos">
  15. <slot name="default" />
  16. </span>
  17. </b-button>
  18. </template>
  19. <script>
  20. export default {
  21. name: 'DotButton',
  22. props: {
  23. variant: { type: String, required: true },
  24. active: { type: Boolean, default: false },
  25. hovered: { type: Boolean, default: false },
  26. dotOnly: { type: Boolean, default: false },
  27. pos: { type: String, default: 'left' }
  28. },
  29. data () {
  30. return {
  31. show: this.hovered
  32. }
  33. },
  34. methods: {
  35. onClick (e) {
  36. this.$el.blur()
  37. }
  38. }
  39. }
  40. </script>
  41. <style lang="scss" scoped>
  42. @each $color, $value in $theme-colors {
  43. .dot-btn-#{$color} {
  44. @include dot-button-variant($value, $value);
  45. }
  46. }
  47. .dot-btn {
  48. word-break: keep-all;
  49. white-space: pre;
  50. &:not(.show),
  51. &.hide {
  52. height: 1.1875rem;
  53. width: 1.1875rem;
  54. padding: 0;
  55. &.dot-btn-depart {
  56. height: 1.875rem;
  57. width: 1.875rem;
  58. }
  59. span {
  60. display: none;
  61. }
  62. }
  63. &.hide:hover {
  64. span {
  65. pointer-events: none;
  66. position: absolute;
  67. display: block;
  68. border-radius: 50rem;
  69. padding: 0 $input-btn-padding-x;
  70. line-height: 1.5;
  71. &.left {
  72. transform: translate(calc(-100% + 1.1875rem), -50%);
  73. }
  74. &.right {
  75. transform: translate(-2px, -50%);
  76. }
  77. &.middle {
  78. transform: translate(calc(-50% + #{1.1875rem / 2}), -50%);
  79. }
  80. }
  81. @each $color, $value in $theme-colors {
  82. &.dot-btn-#{$color} {
  83. span {
  84. background-color: lighten($value, 15%);
  85. }
  86. &:active,
  87. &.active {
  88. span {
  89. background-color: $value;
  90. }
  91. }
  92. }
  93. }
  94. }
  95. }
  96. </style>