@ecomplus/widget-martan 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/CHANGELOG.md +132 -0
  2. package/README.md +11 -0
  3. package/cms.config.js +264 -0
  4. package/dist/public/widget-martan.1.min.js +2 -0
  5. package/dist/public/widget-martan.1.min.js.map +1 -0
  6. package/dist/public/widget-martan.2.min.js +2 -0
  7. package/dist/public/widget-martan.2.min.js.map +1 -0
  8. package/dist/public/widget-martan.3.min.js +2 -0
  9. package/dist/public/widget-martan.3.min.js.map +1 -0
  10. package/dist/public/widget-martan.4.min.js +2 -0
  11. package/dist/public/widget-martan.4.min.js.map +1 -0
  12. package/dist/public/widget-martan.5.min.js +2 -0
  13. package/dist/public/widget-martan.5.min.js.map +1 -0
  14. package/dist/public/widget-martan.var.min.js +71 -0
  15. package/dist/public/widget-martan.var.min.js.map +1 -0
  16. package/dist/widget-martan.1.min.js +2 -0
  17. package/dist/widget-martan.1.min.js.map +1 -0
  18. package/dist/widget-martan.2.min.js +2 -0
  19. package/dist/widget-martan.2.min.js.map +1 -0
  20. package/dist/widget-martan.3.min.js +2 -0
  21. package/dist/widget-martan.3.min.js.map +1 -0
  22. package/dist/widget-martan.4.min.js +2 -0
  23. package/dist/widget-martan.4.min.js.map +1 -0
  24. package/dist/widget-martan.5.min.js +2 -0
  25. package/dist/widget-martan.5.min.js.map +1 -0
  26. package/dist/widget-martan.min.js +71 -0
  27. package/dist/widget-martan.min.js.map +1 -0
  28. package/package.json +36 -0
  29. package/src/append/body.ejs +79 -0
  30. package/src/append/head.ejs +5 -0
  31. package/src/append/product-block.ejs +5 -0
  32. package/src/append/product-card-slots.ejs +3 -0
  33. package/src/append/product-slots.ejs +25 -0
  34. package/src/append/stamps.ejs +3 -0
  35. package/src/index.js +22 -0
  36. package/src/utils/get-width.js +11 -0
  37. package/src/utils/textToNumber.js +31 -0
  38. package/src/utils/time-ago.js +35 -0
  39. package/src/widgets/reviews/AuthorAndRating.vue +30 -0
  40. package/src/widgets/reviews/AverageScore.vue +160 -0
  41. package/src/widgets/reviews/AverageTotal.vue +35 -0
  42. package/src/widgets/reviews/CardReview.vue +87 -0
  43. package/src/widgets/reviews/GridView.vue +113 -0
  44. package/src/widgets/reviews/HeaderExpanded.vue +84 -0
  45. package/src/widgets/reviews/HeaderMinimal.vue +110 -0
  46. package/src/widgets/reviews/ListView.vue +47 -0
  47. package/src/widgets/reviews/Quickview.vue +398 -0
  48. package/src/widgets/reviews/ReviewBody.vue +39 -0
  49. package/src/widgets/reviews/ReviewReply.vue +57 -0
  50. package/src/widgets/reviews/Reviews.vue +496 -0
  51. package/src/widgets/reviews/Score.vue +186 -0
  52. package/src/widgets/reviews/Sort.vue +76 -0
  53. package/src/widgets/reviews/ThumbsPictures.vue +135 -0
  54. package/src/widgets/reviews/Total.vue +79 -0
  55. package/src/widgets/reviews/VerifiedPurchase.vue +111 -0
  56. package/src/widgets/reviews/VideoPlayer.vue +136 -0
  57. package/src/widgets/reviews/index.js +52 -0
  58. package/src/widgets/reviews/isRecommended.vue +44 -0
  59. package/src/widgets/snippets/Rating.vue +71 -0
  60. package/src/widgets/snippets/Snippets.vue +311 -0
  61. package/src/widgets/snippets/index.js +45 -0
  62. package/webpack.config.js +1 -0
@@ -0,0 +1,186 @@
1
+ <template>
2
+ <ul class="mt-average__options" ref="options">
3
+ <li class="mt-rating__list" v-for="index in maxReviews" :key="index"
4
+ @click="(reviews.total === 0 ? null : setRating($event, index))">
5
+ <div class="mt-rating-star">
6
+ <span>{{ index }}</span>
7
+
8
+ <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" stroke-width="2"
9
+ stroke="#E6E3E3" style="color:#E6E3E3;" fill="none" stroke-linecap="round" stroke-linejoin="round">
10
+ <path stroke="none" d="M0 0h24v24H0z" fill="none" />
11
+ <path
12
+ d="M8.243 7.34l-6.38 .925l-.113 .023a1 1 0 0 0 -.44 1.684l4.622 4.499l-1.09 6.355l-.013 .11a1 1 0 0 0 1.464 .944l5.706 -3l5.693 3l.1 .046a1 1 0 0 0 1.352 -1.1l-1.091 -6.355l4.624 -4.5l.078 -.085a1 1 0 0 0 -.633 -1.62l-6.38 -.926l-2.852 -5.78a1 1 0 0 0 -1.794 0l-2.853 5.78z"
13
+ stroke-width="0" fill="currentColor" />
14
+ </svg>
15
+ </div>
16
+
17
+
18
+ <div class="mt-rating-meter">
19
+ <div class="mt-rating-bar" v-bind:style="{
20
+ width: getWidth(reviews, index),
21
+ 'background-color': starColor || 'red',
22
+ }" />
23
+ </div>
24
+
25
+ <div class="mt-rating-total">
26
+ <span>{{ reviews.average[numberToText(index)] }}</span>
27
+ <span>({{ getWidth(reviews, index) }})</span>
28
+
29
+ <span class="mt-rating-remove"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-x"
30
+ width="15" height="15" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none"
31
+ stroke-linecap="round" stroke-linejoin="round">
32
+ <path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
33
+ <path d="M18 6l-12 12"></path>
34
+ <path d="M6 6l12 12"></path>
35
+ </svg></span>
36
+ </div>
37
+ </li>
38
+ </ul>
39
+ </template>
40
+
41
+ <script>
42
+ import { getWidth } from './../../utils/get-width'
43
+ import { numberToText } from './../../utils/textToNumber'
44
+
45
+ export default {
46
+ name: 'Score',
47
+
48
+ props: {
49
+ reviews: {
50
+ type: Object,
51
+ default: {
52
+ list: [],
53
+ orderRating: null,
54
+ total: 0,
55
+ average: {
56
+ one: 0,
57
+ two: 0,
58
+ three: 0,
59
+ four: 0,
60
+ five: 0
61
+ },
62
+ averageTotal: 0,
63
+ offset: 0,
64
+ }
65
+ },
66
+
67
+ starColor: {
68
+ type: String,
69
+ default: '#212529'
70
+ },
71
+ },
72
+
73
+ data () {
74
+ return {
75
+ maxReviews: 5,
76
+ };
77
+ },
78
+
79
+ methods: {
80
+ getWidth,
81
+ numberToText,
82
+ setRating: async function (e, rating) {
83
+ const removeClass = () =>
84
+ new Promise((resolve) => {
85
+ const res = Array.from(this.$refs.options.children).map((option) => {
86
+ option.style.removeProperty("opacity");
87
+ option.children[0].childNodes[2].style.stroke = "rgb(227, 230, 230)";
88
+ option.children[0].childNodes[2].style.color = 'rgb(227, 230, 230)';
89
+
90
+ return option.classList.remove("is-active");
91
+ });
92
+ resolve(res);
93
+ });
94
+
95
+ await removeClass().catch(e => console.error(e))
96
+
97
+ if (rating !== this.reviews.orderRating) {
98
+ const el = Array.from(this.$refs.options.children)[rating - 1];
99
+ el.classList.add("is-active");
100
+ el.style.opacity = 1;
101
+ el.children[0].childNodes[2].style.stroke = this.starColor;
102
+ el.children[0].childNodes[2].style.color = this.starColor;
103
+ Array.from(this.$refs.options.children).forEach((option, index) => {
104
+ if (index !== rating - 1) {
105
+ option.style.opacity = ".5";
106
+ }
107
+ });
108
+ }
109
+
110
+ this.$parent.$emit('updateOrderByAverage', { rating })
111
+ },
112
+ },
113
+ };
114
+ </script>
115
+
116
+
117
+ <style>
118
+ .mt-rating-remove {
119
+ visibility: hidden;
120
+ cursor: pointer;
121
+ display: flex;
122
+ align-items: center;
123
+ }
124
+
125
+ .mt-rating__list.is-active .mt-rating-remove {
126
+ visibility: visible;
127
+ }
128
+
129
+ .mt-average__options li:hover {
130
+ cursor: pointer;
131
+ }
132
+
133
+ .mt-rating__list {
134
+ display: flex;
135
+ align-items: center;
136
+ height: 23px;
137
+ transition: opacity .25s ease-in-out;
138
+ }
139
+
140
+ .mt-rating__list.is-active .mt-rating-total,
141
+ .mt-rating__list:hover .mt-rating-total {
142
+ visibility: visible;
143
+ }
144
+
145
+ .mt-rating__list:hover {
146
+ opacity: 0.9;
147
+ }
148
+
149
+ .mt-rating-meter {
150
+ overflow: hidden;
151
+ box-shadow: inset 0 0 0 1px #e3e6e6;
152
+ background-color: #e3e6e6;
153
+ height: 10px;
154
+ width: 100%;
155
+ border-radius: 50px;
156
+ display: flex;
157
+ }
158
+
159
+ .mt-average__options {
160
+ margin: 0;
161
+ list-style: none;
162
+ padding: 0;
163
+ max-width: 800px;
164
+ width: 100%;
165
+ }
166
+
167
+ .mt-rating-star {
168
+ display: flex;
169
+ width: 30px;
170
+ justify-content: space-around;
171
+ font-size: 12px;
172
+ color: #757373;
173
+ align-items: center;
174
+ margin-left: 5px;
175
+ }
176
+
177
+ .mt-rating-total {
178
+ visibility: hidden;
179
+ width: 50px;
180
+ font-size: 12px;
181
+ color: #757373;
182
+ margin-left: 2px;
183
+ display: flex;
184
+ gap: 3px;
185
+ }
186
+ </style>
@@ -0,0 +1,76 @@
1
+ <template>
2
+ <div class="mt-rating__order_by">
3
+ <svg width="24px" height="24px" viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg">
4
+ <title />
5
+ <path d="M110.22,117.75h-80a10,10,0,0,0,0,20h80a10,10,0,0,0,0-20Z" />
6
+ <path
7
+ d="M177.22,125.75a9.67,9.67,0,0,0-14,0l-8,7.5V42.75a10,10,0,0,0-20,0v113.5a8.29,8.29,0,0,0,3,8,9.67,9.67,0,0,0,14,0l24.5-24.5a10.13,10.13,0,0,0,.5-14Z" />
8
+ <path d="M110.22,37.75h-80a10,10,0,0,0,0,20h80a10,10,0,0,0,0-20Z" />
9
+ <path d="M30.22,97.75h70a10,10,0,0,0,0-20h-70a10,10,0,0,0,0,20Z" />
10
+ </svg>
11
+
12
+ <select class="mt-select" @change="e => $emit('onSort', { order: e.target.value })">
13
+ <option selected disabled>Ordenar</option>
14
+ <option v-for="option in orderOptions" :value="option.key" :key="option.key">
15
+ {{ option.name }}
16
+ </option>
17
+ </select>
18
+ </div>
19
+ </template>
20
+
21
+ <script>
22
+ const orderOptions = [
23
+ {
24
+ key: "most_recent",
25
+ name: "Recentes",
26
+ },
27
+ {
28
+ key: "most_voted",
29
+ name: "Mais úteis",
30
+ },
31
+ {
32
+ key: "most_positive",
33
+ name: "Positivas",
34
+ },
35
+ {
36
+ key: "most_negative",
37
+ name: "Negativas",
38
+ },
39
+ ];
40
+
41
+ export default {
42
+ name: 'Sort',
43
+
44
+ data() {
45
+ return {
46
+ orderOptions,
47
+ };
48
+ },
49
+ };
50
+ </script>
51
+
52
+ <style>
53
+ .mt-rating__order_by {
54
+ display: flex;
55
+ align-items: center;
56
+ height: 40px;
57
+ max-width: 130px;
58
+ width: 100%;
59
+ justify-content: flex-end;
60
+
61
+ svg {
62
+ fill: #6b6d76;
63
+ }
64
+ }
65
+
66
+ .mt-select {
67
+ height: 30px;
68
+ border: none;
69
+ background: #fff;
70
+ line-height: 1.14;
71
+ font-weight: 400;
72
+ letter-spacing: normal;
73
+ color: #6b6d76;
74
+ font-size: 14px;
75
+ }
76
+ </style>
@@ -0,0 +1,135 @@
1
+ <template>
2
+ <div class="media">
3
+ <ul v-if="pictures.length || video" class="media__list">
4
+ <li
5
+ v-if="pictures.length"
6
+ class="mt-lazy-image"
7
+ v-for="(picture, index) in pictures"
8
+ :key="picture.thumb"
9
+ @click="onClick(index)"
10
+ >
11
+ <img
12
+ :alt="title"
13
+ :data-src="picture.thumb"
14
+ data-loaded="false"
15
+ class="media__preview"
16
+ />
17
+ </li>
18
+
19
+ <li
20
+ v-if="video"
21
+ class="lazy-image"
22
+ @click="onClick(pictures.length)"
23
+ :key="video"
24
+ title="Abrir vídeo"
25
+ >
26
+ <svg
27
+ xmlns="http://www.w3.org/2000/svg"
28
+ width="30"
29
+ height="30"
30
+ viewBox="0 0 24 24"
31
+ stroke-width="2"
32
+ stroke="#ffffff"
33
+ fill="none"
34
+ stroke-linecap="round"
35
+ stroke-linejoin="round"
36
+ >
37
+ <path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
38
+ <path d="M7 4v16l13 -8z"></path>
39
+ </svg>
40
+ </li>
41
+ </ul>
42
+ </div>
43
+ </template>
44
+
45
+ <script>
46
+ export default {
47
+ name: "ThumbsPictures",
48
+
49
+ props: {
50
+ review: {
51
+ type: Object,
52
+ required: true
53
+ },
54
+ },
55
+
56
+ computed: {
57
+ pictures: function () {
58
+ return this.review.pictures || [];
59
+ },
60
+
61
+ video: function () {
62
+ return this.review.video_url || null;
63
+ },
64
+
65
+ title: function () {
66
+ return this.review.title || null;
67
+ },
68
+ },
69
+
70
+ mounted() {
71
+ const images = Array.from(document.querySelectorAll(".mt-lazy-image img"));
72
+ const imageObserver = new IntersectionObserver((entries, observer) => {
73
+ entries.forEach((entry) => {
74
+ if (entry.isIntersecting && entry.target.dataset.loaded === "false") {
75
+ const image = entry.target;
76
+ image.dataset.loaded = true;
77
+ image.src = image.dataset.src;
78
+ imageObserver.unobserve(image);
79
+ }
80
+ });
81
+ });
82
+
83
+ images.forEach((img) => imageObserver.observe(img));
84
+ },
85
+
86
+ methods: {
87
+ onClick(slide) {
88
+ const { review } = this;
89
+ this.$emit("onClick", { review, slide });
90
+ },
91
+ },
92
+ };
93
+ </script>
94
+
95
+ <style lang="css">
96
+ .media--open {
97
+ width: 500px;
98
+ }
99
+
100
+ .media__preview {
101
+ object-fit: cover;
102
+ width: 100%;
103
+ height: 100%;
104
+ display: block;
105
+ }
106
+
107
+ .media__list {
108
+ list-style: none;
109
+ padding: 0;
110
+ display: flex;
111
+ padding-top: 0.75rem;
112
+ }
113
+
114
+ .media__list li {
115
+ -webkit-tap-highlight-color: transparent;
116
+ box-sizing: border-box;
117
+ position: relative;
118
+ user-select: none;
119
+ overflow: hidden;
120
+ border-radius: 5px;
121
+ text-decoration: none;
122
+ border: 0.125rem solid #383a3e;
123
+ background-color: #383a3e;
124
+ padding: 0;
125
+ width: 2.375rem;
126
+ min-width: 2.375rem;
127
+ height: 2.375rem;
128
+ margin-right: 0.25rem;
129
+ transition: all ease 0.3s;
130
+ display: flex;
131
+ align-items: center;
132
+ justify-content: center;
133
+ cursor: pointer;
134
+ }
135
+ </style>
@@ -0,0 +1,79 @@
1
+ <template>
2
+ <div class="mt-rating__average__sort">
3
+ <span class="mt-rating__count" v-if="!!reviews.orderRating">{{ Array.isArray(reviews.list) ? reviews.list.length : 0
4
+ }}
5
+ {{
6
+ Array.isArray(reviews.list) && reviews.list.length > 1 || reviews.list.length === 0
7
+ ? i19reviews
8
+ : i19review
9
+ }}
10
+ <span>{{ reviews.orderRating }} {{
11
+ Array.isArray(reviews.list) && reviews.list.length > 1 || reviews.list.length === 0
12
+ ? i19stars
13
+ : i19star
14
+ }}</span>
15
+ </span>
16
+
17
+ <span class="mt-rating__count" v-else>
18
+ {{ reviews.total }}
19
+ {{
20
+ reviews.total > 1 || reviews.total === 0
21
+ ? i19reviews
22
+ : i19review
23
+ }}
24
+ </span>
25
+
26
+ <sort @onSort="onSort"/>
27
+ </div>
28
+ </template>
29
+
30
+ <script>
31
+ import Sort from './Sort.vue';
32
+
33
+ export default {
34
+ name: 'Total',
35
+
36
+ props: {
37
+ reviews: {
38
+ type: Object,
39
+ default: {
40
+ list: [],
41
+ orderRating: null,
42
+ total: 0
43
+ }
44
+ }
45
+ },
46
+
47
+ computed: {
48
+
49
+ i19stars: () => 'Estrelas',
50
+ i19star: () => 'Estrela',
51
+ i19reviews: () => 'Avaliações',
52
+ i19review: () => 'Avaliação',
53
+ orderRating () {
54
+ return reviews.orderRating;
55
+ },
56
+ },
57
+
58
+ components: { Sort },
59
+
60
+ methods: {
61
+ onSort(value) {
62
+ this.$emit('onSort', value)
63
+ }
64
+ }
65
+ };
66
+ </script>
67
+
68
+ <style lang="css">
69
+ .mt-rating__average__sort {
70
+ display: flex;
71
+ justify-content: space-between;
72
+ align-items: center;
73
+ padding: 15px 00;
74
+ }
75
+
76
+ .mt-rating__count {
77
+ color: #6b6d76;
78
+ }
79
+ </style>
@@ -0,0 +1,111 @@
1
+ <template>
2
+ <div>
3
+ <div class="mt-rating__verified">
4
+ <svg
5
+ xmlns="http://www.w3.org/2000/svg"
6
+ class="icon icon-tabler icon-tabler-discount-check-filled"
7
+ width="24"
8
+ height="24"
9
+ viewBox="0 0 24 24"
10
+ stroke-width="2"
11
+ stroke="currentColor"
12
+ fill="none"
13
+ stroke-linecap="round"
14
+ stroke-linejoin="round"
15
+ >
16
+ <path stroke="none" d="M0 0h24v24H0z" fill="none" />
17
+ <path
18
+ d="M12.01 2.011a3.2 3.2 0 0 1 2.113 .797l.154 .145l.698 .698a1.2 1.2 0 0 0 .71 .341l.135 .008h1a3.2 3.2 0 0 1 3.195 3.018l.005 .182v1c0 .27 .092 .533 .258 .743l.09 .1l.697 .698a3.2 3.2 0 0 1 .147 4.382l-.145 .154l-.698 .698a1.2 1.2 0 0 0 -.341 .71l-.008 .135v1a3.2 3.2 0 0 1 -3.018 3.195l-.182 .005h-1a1.2 1.2 0 0 0 -.743 .258l-.1 .09l-.698 .697a3.2 3.2 0 0 1 -4.382 .147l-.154 -.145l-.698 -.698a1.2 1.2 0 0 0 -.71 -.341l-.135 -.008h-1a3.2 3.2 0 0 1 -3.195 -3.018l-.005 -.182v-1a1.2 1.2 0 0 0 -.258 -.743l-.09 -.1l-.697 -.698a3.2 3.2 0 0 1 -.147 -4.382l.145 -.154l.698 -.698a1.2 1.2 0 0 0 .341 -.71l.008 -.135v-1l.005 -.182a3.2 3.2 0 0 1 3.013 -3.013l.182 -.005h1a1.2 1.2 0 0 0 .743 -.258l.1 -.09l.698 -.697a3.2 3.2 0 0 1 2.269 -.944zm3.697 7.282a1 1 0 0 0 -1.414 0l-3.293 3.292l-1.293 -1.292l-.094 -.083a1 1 0 0 0 -1.32 1.497l2 2l.094 .083a1 1 0 0 0 1.32 -.083l4 -4l.083 -.094a1 1 0 0 0 -.083 -1.32z"
19
+ stroke-width="0"
20
+ fill="currentColor"
21
+ />
22
+ </svg>
23
+
24
+ <span> {{ i19verifiedBuyer }} </span>
25
+ </div>
26
+ <div class="collapse multi-collapse" :id="collapseId">
27
+ <div class="card card-body">
28
+ <h5> {{ i19howProcessVerifiedMsg }} </h5>
29
+
30
+ <p>
31
+ {{ i19useMartanPrivacyMsg }}
32
+ </p>
33
+
34
+ <p>
35
+ {{ i19howWeCollectMsg }}
36
+ </p>
37
+
38
+ <p>
39
+ {{ i19howClientsReviewMsg }}
40
+ </p>
41
+ </div>
42
+ </div>
43
+ </div>
44
+ </template>
45
+
46
+ <script>
47
+
48
+ import { i18n } from "@ecomplus/utils";
49
+ import $ from "../../../../storefront-twbs/src";
50
+
51
+ export default {
52
+ name: "VerifiedPurchase",
53
+
54
+ props: {
55
+ showVerified: {
56
+ type: Boolean,
57
+ default: false,
58
+ },
59
+ },
60
+
61
+ data () {
62
+ return {
63
+ collapseId: null,
64
+ };
65
+ },
66
+
67
+ computed: {
68
+ i19verifiedBuyer: () => 'Comprador verificado',
69
+ i19howProcessVerifiedMsg: () => i18n({
70
+ en_us: 'How we verify and process reviews',
71
+ pt_br: 'Como verificamos e processamos avaliações'
72
+ }),
73
+ i19useMartanPrivacyMsg: () => i18n({
74
+ en_us: 'We use Martan, a web-based application that provides an online reviews and marketing solution, to collect, source, process and display reviews on our website.',
75
+ pt_br: 'Utilizamos o Martan, uma aplicação baseada na web que oferece uma solução de avaliações online e marketing, para coletar, originar, processar e exibir avaliações em nosso site.'
76
+ }),
77
+ i19howWeCollectMsg: () => i18n({
78
+ en_us: 'We automatically send review requests through Martan to customers for whom we have a record of purchasing products directly from our website. This allows us to verify the reliability of the review through technical means such as the customers email address. Reviews submitted directly through these requests are marked as "Verified Purchase", and the following statement will be displayed in the interface where the review is published: "This review was collected from a verified customer who purchased this item."',
79
+ pt_br: 'Enviamos automaticamente solicitações de avaliações por meio do Martan aos clientes para os quais temos registro de que compraram produtos diretamente em nosso site. Isso nos permite verificar a confiabilidade da avaliação por meio de meios técnicos, como o endereço de e-mail do cliente. As avaliações enviadas diretamente por essas solicitações são marcadas como "Compra verificada", e a seguinte declaração será exibida na interface em que a avaliação for publicada: "Esta avaliação foi coletada de um cliente verificado que comprou este item".'
80
+ }),
81
+ i19howClientsReviewMsg: () => i18n({
82
+ en_us: 'Customers can choose how to rate reviewed products with a score between 1 and 5. The average review score is calculated using a simple mathematical average, which is then rounded to a half or full star rating using standard rounding rules. The average review score includes reviews for which customers received discounts on future purchases for adding a photo or video to their review.',
83
+ pt_br: 'Os clientes podem escolher como avaliar os produtos avaliados com uma pontuação entre 1 e 5. A pontuação média das avaliações é calculada usando uma média matemática simples, que é então arredondada para uma meia ou uma avaliação de estrela completa usando regras padrão de arredondamento. A pontuação média das avaliações inclui avaliações para as quais os clientes receberam descontos em compras futuras por adicionar uma foto ou um vídeo à sua avaliação.'
84
+ })
85
+ },
86
+
87
+ methods: {
88
+ open: function () {
89
+ $("#" + this.collapseId).collapse("toggle");
90
+ },
91
+ },
92
+
93
+ mounted: function () {
94
+ this.collapseId = "mt-verified-" + Date.now();
95
+ },
96
+ };
97
+ </script>
98
+
99
+ <style lang="scss">
100
+
101
+ .mt-rating__verified {
102
+ font-size: 12px;
103
+ color: #6b6d76;
104
+ font-weight: 400;
105
+
106
+ svg {
107
+ width: 15px;
108
+ color: var(--success);
109
+ }
110
+ }
111
+ </style>