toggle-components-library 1.36.1 → 1.36.3-beta.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 (39) hide show
  1. package/dist/img/airship-feedback-hover.a207c947.svg +10 -0
  2. package/dist/img/airship-feedback.1f7c858c.svg +10 -0
  3. package/dist/toggle-components-library.common.js +39486 -13335
  4. package/dist/toggle-components-library.common.js.map +1 -1
  5. package/dist/toggle-components-library.css +1 -1
  6. package/dist/toggle-components-library.umd.js +39486 -13335
  7. package/dist/toggle-components-library.umd.js.map +1 -1
  8. package/dist/toggle-components-library.umd.min.js +285 -8
  9. package/dist/toggle-components-library.umd.min.js.map +1 -1
  10. package/package.json +2 -1
  11. package/src/assets/icons/airship-feedback-hover.svg +10 -0
  12. package/src/assets/icons/airship-feedback.svg +10 -0
  13. package/src/components/buttons/ToggleMetricsButton.vue +22 -3
  14. package/src/components/cards/ToggleCommentCard.vue +55 -0
  15. package/src/components/carousel/ToggleCarousel.vue +29 -16
  16. package/src/components/carousel/ToggleCarouselSlide.vue +1 -1
  17. package/src/components/forms/ToggleDatePicker.vue +229 -138
  18. package/src/components/forms/ToggleInputCurrency.vue +10 -3
  19. package/src/components/forms/ToggleInputPercentage.vue +7 -1
  20. package/src/components/forms/ToggleInputSelect.vue +7 -13
  21. package/src/components/forms/ToggleInputText.vue +0 -11
  22. package/src/components/metrics/ToggleMetricSingleMetric.vue +12 -7
  23. package/src/components/metrics/ToggleMetricSparkLine.vue +7 -3
  24. package/src/components/mixins/mixins.js +2 -2
  25. package/src/components/statusbar/ToggleStatusBar.vue +74 -0
  26. package/src/components/tables/ToggleTable.vue +49 -114
  27. package/src/index.js +7 -4
  28. package/src/sass/includes/_as_buttons.scss +47 -4
  29. package/src/sass/includes/_as_cards.scss +33 -0
  30. package/src/sass/includes/_as_carousels.scss +12 -0
  31. package/src/sass/includes/_as_inputs.scss +830 -825
  32. package/src/sass/includes/_as_metrics.scss +5 -0
  33. package/src/sass/includes/_as_navs.scss +18 -2
  34. package/src/sass/includes/_as_statusbar.scss +183 -0
  35. package/src/sass/includes/_as_table.scss +163 -163
  36. package/src/sass/main.scss +1 -0
  37. package/dist/img/contacts-greyblue.ef6f8a9a.svg +0 -1
  38. package/dist/img/contacts-white.95d07c7a.svg +0 -1
  39. package/package-lock.json +0 -20285
@@ -1,18 +1,18 @@
1
1
  <template>
2
2
 
3
3
  <div class="toggle-input-container" :class="{'toggle-input-is-invalid':isInvalid, 'toggle-input-is-disabled':disabled}" v-on:click="focusClosestInput">
4
- <label
4
+ <label
5
5
  v-if="label"
6
- :for="name ? name : 'ToggleInputSelect' "
6
+ :for="name ? name : 'ToggleInputSelect' "
7
7
  class="toggle-input-label"
8
- > {{ label }}
8
+ > {{ label }}
9
9
  </label>
10
10
 
11
11
  <div class="toggle-input-select-container">
12
- <select
13
- :name="name ? name : 'ToggleInputSelect' "
12
+ <select
13
+ :name="name ? name : 'ToggleInputSelect' "
14
14
  :class="[ 'toggle-input-select', size]"
15
- v-model="inputVal"
15
+ v-model="inputVal"
16
16
  :autocomplete="autocomplete ? 'on' : 'off' "
17
17
  :required="required"
18
18
  :disabled="disabled"
@@ -24,7 +24,7 @@
24
24
  </div>
25
25
 
26
26
  <label
27
- class="toggle-input-label-error"
27
+ class="toggle-input-label-error"
28
28
  v-if="isInvalid"
29
29
  :for="name ? name : 'ToggleInputText' "
30
30
  >
@@ -39,11 +39,6 @@ import { mixins } from '../mixins/mixins'
39
39
 
40
40
  export default {
41
41
  mixins:[mixins],
42
- data() {
43
- return {
44
- show: false
45
- }
46
- },
47
42
  props: {
48
43
  value: {},
49
44
  name: {
@@ -92,7 +87,6 @@ export default {
92
87
  },
93
88
 
94
89
  created : function(){
95
-
96
90
  },
97
91
  computed: {
98
92
  inputVal: {
@@ -19,8 +19,6 @@
19
19
  :maxlength="maxLength"
20
20
  :disabled="disabled"
21
21
  :readonly="readonly"
22
- :ref="'input_ele'"
23
- @keyup.esc="handleEscPress"
24
22
  />
25
23
  <label
26
24
  class="toggle-input-label-error"
@@ -105,10 +103,6 @@ export default {
105
103
  }
106
104
  },
107
105
 
108
- created : function()
109
- {
110
- this.$nextTick(() => this.$refs['input_ele'].focus());
111
- },
112
106
  computed: {
113
107
  inputVal: {
114
108
  get: function (){
@@ -122,11 +116,6 @@ export default {
122
116
  },
123
117
  methods: {
124
118
 
125
- handleEscPress()
126
- {
127
- this.$emit('bail');
128
- },
129
-
130
119
  /*
131
120
  * Concat message for count characters
132
121
  * @return string
@@ -2,7 +2,9 @@
2
2
  <div>
3
3
  <h3 class="toggle-metric metric-label">{{label}}</h3>
4
4
  <div class="single-metric-icon" v-if="metricPending && label.length == 0"></div>
5
- <h1 class="toggle-metric metric-value" v-else>{{metricValue}}</h1>
5
+ <h1 class="toggle-metric metric-value" v-else>{{metricValue}}
6
+ <span v-if="score && value.maxScore" class="toggle-metric-score-rating">/{{value.maxScore}}</span>
7
+ </h1>
6
8
  </div>
7
9
  </template>
8
10
 
@@ -21,20 +23,20 @@ export default {
21
23
  type: String,
22
24
  default: "ToggleMetricSingleMetric"
23
25
  },
24
- /**
26
+ /**
25
27
  * Type of the value, this will affect on the format shown
26
28
  */
27
29
  type : {
28
30
  type: String,
29
31
  validator: function (value) {
30
- return ['text', 'number', 'percentage', 'currency'].indexOf(value) !== -1
32
+ return ['text', 'number', 'percentage', 'currency', 'score'].indexOf(value) !== -1
31
33
  }
32
34
  },
33
35
  /**
34
36
  * Component's value
35
37
  */
36
38
  value: {
37
- type: [String, Number],
39
+ type: [String, Number, Object],
38
40
  required: true
39
41
  },
40
42
  /**
@@ -87,14 +89,17 @@ export default {
87
89
  case 'currency':
88
90
  return (this.value/this.currencyDenomination).toLocaleString(this.currencyLocale, {style: 'currency', currency: this.currencyCode});
89
91
  case'percentage':
90
- return `${this.value} %`
92
+ return `${this.value} %`;
93
+ case 'score':
94
+ return this.value.score;
91
95
  default:
92
96
  return this.value.toLocaleString();
93
97
 
94
98
  }
99
+ },
100
+ score() {
101
+ return this.type === 'score';
95
102
  }
96
-
97
-
98
103
  }
99
104
  }
100
105
 
@@ -54,14 +54,14 @@ export default {
54
54
  type : {
55
55
  type: String,
56
56
  validator: function (value) {
57
- return ['text', 'number', 'percentage', 'currency'].indexOf(value) !== -1
57
+ return ['text', 'number', 'percentage', 'currency', 'score'].indexOf(value) !== -1
58
58
  }
59
59
  },
60
60
  /**
61
61
  * single metric component value
62
62
  */
63
63
  singleMetricVal: {
64
- type: [String, Number],
64
+ type: [String, Number, Object],
65
65
  required: true
66
66
  },
67
67
  /**
@@ -112,6 +112,10 @@ export default {
112
112
  inverse_trend_impact: {
113
113
  type: Boolean,
114
114
  default: false
115
+ },
116
+ showTrendForAllZeros: {
117
+ type: Boolean,
118
+ default: false
115
119
  }
116
120
  },
117
121
 
@@ -195,7 +199,7 @@ export default {
195
199
 
196
200
  const trendImpactVals = this.sparkLineVal[0].data[0].y || this.sparkLineVal[0].data[0].y === 0 ? this.sparkLineVal[0].data.map(data => data.y) : this.sparkLineVal[0].data;
197
201
 
198
- let result = this.calcTrendImpact(trendImpactVals, this.trend_impact_base);
202
+ let result = this.calcTrendImpact(trendImpactVals, this.trend_impact_base, this.showTrendForAllZeros);
199
203
 
200
204
  if (this.inverse_trend_impact === true && result != false)
201
205
  return result *-1;
@@ -139,10 +139,10 @@ export const charts = {
139
139
  *
140
140
  * @return { {Integer} 1, 0,-1 }
141
141
  */
142
- calcTrendImpact(values, trend_impact_base){
142
+ calcTrendImpact(values, trend_impact_base, show_trend_for_all_zeros){
143
143
 
144
144
  // If all values in the values array are 0 return 0;
145
- if (values.every((val) => val === 0)){
145
+ if (!show_trend_for_all_zeros && values.every((val) => val === 0)){
146
146
  return false;
147
147
  }
148
148
 
@@ -0,0 +1,74 @@
1
+ <template>
2
+ <div :class="['toggle-status-bar-container', statusColours, statusSize]">
3
+ <span class="toggle-status-bar-dot blinking toggle-status-bar-label" v-if="showDot">&#9679;</span>
4
+ <label class="toggle-status-bar-label">
5
+ {{ statusName }}
6
+ </label>
7
+
8
+ <div class="toggle-status-bar-tooltip-container" v-if="showToolTip && toolTipText.length">
9
+ <div class="toggle-status-bar-tooltip">
10
+ ?
11
+ <span class="toggle-status-bar-tooltip-text">{{ toolTipText }}</span>
12
+ </div>
13
+ </div>
14
+ </div>
15
+ </template>
16
+
17
+ <script>
18
+ export default {
19
+ name: 'StatusBar',
20
+ props: {
21
+ status: {
22
+ type: String,
23
+ required: true,
24
+ validator: function (value) {
25
+ return ['draft', 'processing', 'complete', 'inactive', 'active', 'submitted', 'failed'].indexOf(value) !== -1;
26
+ }
27
+ },
28
+ size: {
29
+ type: String,
30
+ required: false,
31
+ default: 'regular',
32
+ validator: function (value) {
33
+ return ['small', 'regular'].indexOf(value) !== -1;
34
+ }
35
+ },
36
+ toolTipOptions: {
37
+ type: Object,
38
+ required: false
39
+ }
40
+ },
41
+ computed: {
42
+ // Capitalise the first letter of the status
43
+ statusName() {
44
+ return this.status.charAt(0).toUpperCase() + this.status.slice(1);
45
+ },
46
+ // Add the status to the class name
47
+ statusColours() {
48
+ return 'toggle-status-bar-' + this.status;
49
+ },
50
+ // Add the size to the class name
51
+ statusSize() {
52
+ return 'toggle-status-bar-' + this.size;
53
+ },
54
+ // Show the dot if the status is active or processing
55
+ showDot() {
56
+ return this.status === 'active' || this.status === 'processing' || this.status === 'submitted';
57
+ },
58
+ showToolTip() {
59
+ return this.size == 'regular';
60
+ },
61
+ toolTipText() {
62
+ if (!this.toolTipOptions) {
63
+ return '';
64
+ }
65
+
66
+ if (this.toolTipOptions[this.status]) {
67
+ return this.toolTipOptions[this.status];
68
+ } else {
69
+ return '';
70
+ }
71
+ }
72
+ }
73
+ }
74
+ </script>
@@ -3,56 +3,29 @@
3
3
  <div>
4
4
 
5
5
  <table class="toggle-table">
6
- <thead :class="{'toggle-table-any-search-active': anySearchActive}">
6
+ <thead :class="{'toggle-table-any-search-active': searchActive}">
7
7
  <tr class="toggle-tablee-tr">
8
- <th
9
- scope="col"
10
- :class="['toggle-table-th', {'toggle-table-search-active': tableSearchActive(field), 'toggle-table-searchable':field.filterable}]"
11
- v-for="(field, index) in headers"
12
- :colspan="field.colspan"
8
+ <th
9
+ scope="col"
10
+ :class="['toggle-table-th', {'toggle-table-search-active': tableSearchActive(field), 'toggle-table-searchable':field.filterable}]"
11
+ v-for="(field, index) in headers"
13
12
  :key="index"
14
13
  :style="'width:'+field.width"
15
14
  @click="activateSearch(field)"
16
15
  >
17
- <div class="toggle-table-th-inner" @transitionend="handleTransitionEnd">
18
-
16
+ <div class="toggle-table-th-inner">
19
17
  <span class="toggle-table-th-title">{{field.label}}</span>
20
18
  <span class="toggle-table-close-search" v-on:click.stop @click="closeSearch(field)"></span>
19
+ <ToggleInputText type="text" :ref="field.key+'-input'" v-model="searchModels[field.key]" @input="searchChange(field)"
20
+ v-if="field.type == 'text' && (searchModels[field.key] || editingInput == field.key)" />
21
+ <ToggleInputSelect style="margin-top:2px;" size="small" v-if="field.type == 'select' && (searchModels[field.key] || editingInput == field.key)" :options="field.select_options" v-model="searchModels[field.key]" @input="val=>searchChange(val, field)"/>
21
22
 
22
- <ToggleInputText
23
- v-if="field.type === 'text' && (searchModels[field.key] || editingInput === field.key) && applyFocus"
24
- type="text"
25
- :ref="field.key+'-input'"
26
- v-model="searchModels[field.key]"
27
- @input="searchChange()"
28
- @bail="closeSearch(field)"
29
- />
30
- <ToggleInputSelect
31
- style="margin-top:2px;"
32
- :size="'small'"
33
- v-if="field.type === 'select' && (searchModels[field.key] || editingInput === field.key) && applyFocus"
34
- :options="field.select_options"
35
- v-model="searchModels[field.key]"
36
- @input="searchChange()"
37
- />
38
- <ToggleDateRangePicker
39
- v-if="field.type === 'date_range' && (searchModels[field.key].start || searchModels[field.key].end || editingInput === field.key)"
40
- name="date_range"
41
- v-model="searchModels[field.key]"
42
- @input="searchChange()"
43
- />
23
+ <ToggleDateRangePicker v-if="field.type == 'date' && (searchModels[field.key].start || searchModels[field.key].end || editingInput == field.key)" name="date" v-model="searchModels[field.key]" @input="val=>searchChange(val, field)" />
44
24
  </div>
45
25
  </th>
46
-
26
+
47
27
  </tr>
48
28
  </thead>
49
- <tr class="empty-table" v-if="(items && items.length === 0) && !loading">
50
- <td :colspan="headers.length">
51
- <div class="full">
52
- <div class="empty-area"><p>{{ emptyTableMessage }}</p></div>
53
- </div>
54
- </td>
55
- </tr>
56
29
  <tbody v-if="!$slots.default || !$slots.default.length">
57
30
  <ToggleTableRow v-for="(item, index) in items" :key="index" >
58
31
  <ToggleTableColumn v-for="(column, column_index) in item" :key="column_index">{{column}}</ToggleTableColumn>
@@ -89,34 +62,20 @@ export default {
89
62
  type: [Array]
90
63
  },
91
64
  total:{
92
- type: [Number]
65
+ type: [Number]
93
66
  },
94
67
  per_page:{
95
- type: [Number]
68
+ type: [Number]
96
69
  },
97
70
  page:{
98
71
  type: [Number],
99
72
  default:1
100
- },
101
- loading: {
102
- type: Boolean
103
- },
104
- emptyTableMessage: {
105
- type: String,
106
- default: "No rows returned."
107
- },
108
- searchDebounce: {
109
- type: [Number],
110
- default: 500
111
73
  }
112
- },
74
+ },
113
75
  data : function(){
114
76
  return {
115
77
  editingInput:false,
116
- searchModels:{},
117
- anySearchActive: false,
118
- applyFocus: false,
119
- searchTimeout: null
78
+ searchModels:{}
120
79
  };
121
80
  },
122
81
  computed: {
@@ -138,23 +97,36 @@ export default {
138
97
 
139
98
  headers() {
140
99
  if(!this.fields){
141
- return Object.keys(this.items[0]);
100
+ return Object.keys(this.items[0]);
142
101
  }
143
102
  return this.fields;
144
103
  },
145
104
 
105
+ searchActive() {
106
+ if(this.editingInput) {
107
+ return true;
108
+ }
109
+ for(let col in this.searchModels){
110
+ if(!this.searchModels[col])
111
+ return false;
112
+ if (this.searchModels[col].start !== undefined) {
113
+ return true;
114
+ }
115
+ else if(this.searchModels[col]) return true;
116
+ }
117
+ return false;
118
+ },
119
+
120
+
146
121
  },
147
122
  created : function(){
148
123
 
149
124
  if(this.fields){
150
-
151
125
  for (let i = 0; i < this.fields.length; i++) {
152
- let value = this.fields[i].type == 'date_range' ? this.setInitialDate(i) : (this.fields[i].value ?? '');
153
-
126
+ let value = this.fields[i].type == 'date' ? this.setInitialDate(i) : this.fields[i].value;
154
127
  let field_name = this.fields[i].key;
155
128
  this.$set( this.searchModels, field_name, value )
156
129
  if(value){
157
- this.applyFocus = true;
158
130
  // if date has an initial value set, show it.
159
131
  if(typeof value.start !== 'undefined'){
160
132
  if(value.start.length) this.activateSearch(this.fields[i]);
@@ -165,29 +137,20 @@ export default {
165
137
  this.searchChange();
166
138
  }
167
139
  }
168
-
140
+
169
141
  },
170
142
 
171
143
  beforeDestroy: function () {
144
+ },
145
+ watch:{
146
+
172
147
  },
173
148
  mounted : function ()
174
149
  {
175
150
 
176
151
  },
177
-
152
+
178
153
  methods:{
179
-
180
- handleTransitionEnd(event){
181
- if(event.propertyName === 'height'){
182
- if(this.anySearchActive && !this.applyFocus){
183
- this.applyFocus = true;
184
- }
185
- if(!this.anySearchActive && this.applyFocus){
186
- this.applyFocus = false;
187
- }
188
- }
189
- },
190
-
191
154
  // set initial date
192
155
  setInitialDate(index){
193
156
  let value = this.fields[index].value;
@@ -197,64 +160,36 @@ export default {
197
160
 
198
161
  tableSearchActive(field)
199
162
  {
200
- if(field.type === 'date_range'){
201
- return (this.searchModels[field.key].start || this.searchModels[field.key].end || this.editingInput === field.key);
163
+ if(field.type == 'date'){
164
+ return (this.searchModels[field.key].start || this.searchModels[field.key].end || this.editingInput == field.key);
202
165
  }
203
- return (this.searchModels[field.key] || this.editingInput === field.key);
166
+ return (this.searchModels[field.key] || this.editingInput == field.key);
204
167
 
205
168
  },
206
169
 
207
-
208
- getSearchModelTypeFromKey(key){
209
- for(let i=0; i<this.fields.length; i++){
210
- if(this.fields[i].key === key){
211
- return this.fields[i].type;
212
- }
213
- }
214
- return null;
215
- },
216
-
217
170
  closeSearch(field){
218
-
219
171
  this.editingInput = false;
220
- this.searchModels[field.key] = field.type === 'date_range' ? { start: false, end: false} : '' ;
221
-
222
- // check if any search is active; if not, close/shrink header
223
- let is_active = false;
224
- for(const key in this.searchModels){
225
-
226
- if(this.getSearchModelTypeFromKey(key) === 'date_range'){
227
- if (this.searchModels[key].start || this.searchModels[key].end){
228
- is_active = true;
229
- break;
230
- }
231
- }else if(this.searchModels[key] && this.searchModels[key] !== ''){
232
- is_active = true;
233
- break;
234
- }
235
- }
236
- this.anySearchActive = is_active;
172
+ this.searchModels[field.key] = field.type == 'date' ? { start: false, end: false} : '' ;
237
173
  this.searchChange();
238
174
  },
239
175
 
240
176
  searchChange(){
241
- clearTimeout(this.searchTimeout);
242
- this.searchTimeout = setTimeout(()=>{
243
- this.$emit('search', this.fieldsWithSearch);
244
- },this.searchDebounce);
245
-
177
+ this.$emit('search', this.fieldsWithSearch);
246
178
  },
247
179
 
248
180
  /* activateSearch
249
181
  * When a user clicks a searchable column name, show it as active, and focus the child input field (unless it's already active)
250
182
  */
251
183
  activateSearch(field){
252
- if(!field.filterable || field.readonly) return;
184
+ if(!field.filterable) return;
185
+ if(field.type === 'date'){
186
+ this.datePickerOpen = true;
187
+ }
253
188
  this.editingInput = field.key;
254
- this.anySearchActive = true;
189
+ //this.$nextTick(() => this.$refs[this.editingInput + '-input'].focus())
255
190
  },
256
191
 
257
-
192
+
258
193
 
259
194
  }
260
195
  }
package/src/index.js CHANGED
@@ -4,7 +4,6 @@ import ToggleInputText from "./components/forms/ToggleInputText.vue";
4
4
  import ToggleInputEditableText from "./components/forms/ToggleInputEditableText.vue";
5
5
  import ToggleInputWebsite from "./components/forms/ToggleInputWebsite.vue";
6
6
  import ToggleDatePicker from "./components/forms/ToggleDatePicker.vue";
7
- import ToggleDateRangePicker from "./components/forms/ToggleDateRangePicker.vue";
8
7
  import ToggleInputSelect from "./components/forms/ToggleInputSelect.vue";
9
8
  import ToggleInputPercentage from "./components/forms/ToggleInputPercentage.vue";
10
9
  import ToggleInputCurrency from "./components/forms/ToggleInputCurrency.vue";
@@ -83,11 +82,14 @@ import ToggleMetricFunnelChart from "./components/metrics/ToggleMetricFunnelChar
83
82
  import ToggleThreeDots from "./components/threedots/ToggleThreeDots.vue";
84
83
  import ToggleThreeDotsButton from "./components/threedots/ToggleThreeDotsButton.vue";
85
84
 
85
+ import ToggleStatusBar from "./components/statusbar/ToggleStatusBar.vue";
86
+
86
87
  import ToggleCarousel from "./components/carousel/ToggleCarousel.vue";
87
88
  import ToggleCarouselSlide from "./components/carousel/ToggleCarouselSlide.vue";
88
89
 
89
90
  import ToggleEmailCard from "./components/cards/ToggleEmailCard.vue";
90
91
  import ToggleRewardsCard from "./components/cards/ToggleRewardsCard.vue";
92
+ import ToggleCommentCard from "./components/cards/ToggleCommentCard.vue";
91
93
 
92
94
 
93
95
  import './sass/main.scss';
@@ -104,14 +106,13 @@ const Components = {
104
106
  ToggleInputEditableText,
105
107
  ToggleInputWebsite,
106
108
  ToggleDatePicker,
107
- ToggleDateRangePicker,
108
109
  ToggleInputSelect,
109
110
  ToggleInputPercentage,
110
111
  ToggleInputCurrency,
111
112
  ToggleInputRadioButtons,
112
113
  ToggleInputTextArea,
113
114
  ToggleInputCheckboxContainer,
114
- ToggleInputCheckbox,
115
+ ToggleInputCheckbox,
115
116
  ToggleInputCheckboxInline,
116
117
  ToggleFillLoader,
117
118
  ToggleProgressLoader,
@@ -158,10 +159,12 @@ const Components = {
158
159
  ToggleBoosterBasicButton,
159
160
  ToggleBoosterModal,
160
161
  ToggleContactSearch,
162
+ ToggleStatusBar,
161
163
  ToggleCarousel,
162
164
  ToggleCarouselSlide,
163
165
  ToggleEmailCard,
164
- ToggleRewardsCard
166
+ ToggleRewardsCard,
167
+ ToggleCommentCard
165
168
  }
166
169
 
167
170
  Object.keys(Components).forEach(name => {
@@ -395,7 +395,7 @@
395
395
  }
396
396
 
397
397
  &:hover .contacts-icon {
398
- background-image: url("../assets/icons/contacts-white.svg");
398
+ background-color: white;
399
399
  }
400
400
  }
401
401
  //icons
@@ -418,9 +418,11 @@
418
418
  }
419
419
 
420
420
  .contacts-icon {
421
- background-image: url("../assets/icons/contacts-greyblue.svg");
422
- background-repeat:no-repeat;
423
- background-size:contain;
421
+ --svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' height='.9em' viewBox='0 0 448 512'%3E%3C!--! Font Awesome Free 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. --%3E%3Cstyle%3Esvg%7Bfill:%23fff%7D%3C/style%3E%3Cpath d='M304 128a80 80 0 1 0 -160 0 80 80 0 1 0 160 0zM96 128a128 128 0 1 1 256 0A128 128 0 1 1 96 128zM49.3 464H398.7c-8.9-63.3-63.3-112-129-112H178.3c-65.7 0-120.1 48.7-129 112zM0 482.3C0 383.8 79.8 304 178.3 304h91.4C368.2 304 448 383.8 448 482.3c0 16.4-13.3 29.7-29.7 29.7H29.7C13.3 512 0 498.7 0 482.3z'/%3E%3C/svg%3E");
422
+ background-color: #6d90b4;
423
+ -webkit-mask: var(--svg);
424
+ mask: var(--svg);
425
+ mask-repeat: no-repeat;
424
426
  margin-right: 6px;
425
427
  width: 14px;
426
428
  height: 14px;
@@ -428,6 +430,47 @@
428
430
  }
429
431
  }
430
432
 
433
+ .toggle-metrics-button-small {
434
+ padding: 0px 13px;
435
+ font-size: 12px;
436
+ &.mini-contacts {
437
+ font-size: 0.65rem;
438
+ padding: 5px 12px;
439
+ }
440
+ .heatmap-icon {
441
+ width: 21px;
442
+ height: 21px;
443
+ }
444
+ .email-icon {
445
+ width: 25px;
446
+ height: 25px;
447
+ }
448
+ .contacts-icon {
449
+ --svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' height='.8em' viewBox='0 0 448 512'%3E%3C!--! Font Awesome Free 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. --%3E%3Cstyle%3Esvg%7Bfill:%23fff%7D%3C/style%3E%3Cpath d='M304 128a80 80 0 1 0 -160 0 80 80 0 1 0 160 0zM96 128a128 128 0 1 1 256 0A128 128 0 1 1 96 128zM49.3 464H398.7c-8.9-63.3-63.3-112-129-112H178.3c-65.7 0-120.1 48.7-129 112zM0 482.3C0 383.8 79.8 304 178.3 304h91.4C368.2 304 448 383.8 448 482.3c0 16.4-13.3 29.7-29.7 29.7H29.7C13.3 512 0 498.7 0 482.3z'/%3E%3C/svg%3E");
450
+ -webkit-mask: var(--svg);
451
+ mask: var(--svg);
452
+ mask-repeat: no-repeat;
453
+ }
454
+ }
455
+
456
+ .toggle-metrics-button-large {
457
+ padding: 23px 27px;
458
+ font-size: 17px;
459
+ &.mini-contacts {
460
+ font-size: .92rem;
461
+ padding: 10px 25px;
462
+ }
463
+ }
464
+
465
+ .toggle-metrics-button-disabled {
466
+ opacity: 0.3;
467
+ cursor: default;
468
+
469
+ .heatmap-icon, .email-icon, .contacts-icon {
470
+ transform: none !important;
471
+ }
472
+ }
473
+
431
474
  .toggle-button-booster-badge {
432
475
  display: flex;
433
476
  align-items: center;