mediacube-ui 0.1.351 → 0.1.352

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 (31) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/package.json +1 -1
  3. package/src/elements/McButton/McButton.vue +48 -8
  4. package/src/elements/McCropper/McCropper.vue +1 -1
  5. package/src/elements/McDatePicker/McDatePicker.vue +17 -17
  6. package/src/elements/McField/McFieldCheckbox/McFieldCheckbox.vue +2 -2
  7. package/src/elements/McField/McFieldRadio/McFieldRadioButton/McFieldRadioButton.vue +1 -1
  8. package/src/elements/McField/McFieldSelect/McFieldSelect.vue +10 -10
  9. package/src/elements/McField/McFieldText/McFieldText.vue +1 -1
  10. package/src/elements/McField/McFieldToggle/McFieldToggle.vue +6 -6
  11. package/src/elements/McNotification/McNotification.vue +1 -1
  12. package/src/elements/McRangeSlider/McRangeSlider.vue +1 -1
  13. package/src/elements/McTabs/McTabs/McTabs.vue +1 -1
  14. package/src/patterns/McChat/McChatComment/McChatComment.vue +2 -2
  15. package/src/patterns/McChat/McChatForm/McChatForm.vue +1 -1
  16. package/src/patterns/McDropdown/McDropdown.vue +1 -1
  17. package/src/patterns/McFilter/McFilter.vue +18 -23
  18. package/src/patterns/McFilter/McFilterChip/McFilterChip.vue +5 -3
  19. package/src/patterns/McFilter/McFilterTypeRelation/McFilterTypeRelation.vue +1 -1
  20. package/src/patterns/McOverlay/McOverlay.vue +1 -1
  21. package/src/patterns/McSideBar/McSideBar/McSideBar.vue +2 -2
  22. package/src/patterns/McSideBar/McSideBarButton/McSideBarButton.vue +7 -7
  23. package/src/patterns/McSideBar/McSideBarCenter/McSideBarCenter.vue +1 -1
  24. package/src/patterns/McTable/McTable/McTable.vue +4 -4
  25. package/src/patterns/McTable/McTableCol/McTableCol.vue +5 -7
  26. package/src/patterns/McTableCard/McTableCardHeader/McTableCardHeader.vue +1 -1
  27. package/src/styles/_mixins.scss +15 -15
  28. package/src/styles/global.scss +11 -3
  29. package/src/styles/table.scss +4 -4
  30. package/src/tokens/gradients.scss +6 -6
  31. package/src/utils/checkColor.js +38 -0
package/CHANGELOG.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
4
4
 
5
+ ### [0.1.352](https://github.com/MediaCubeCo/mcui/compare/v0.1.351...v0.1.352) (2025-01-14)
6
+
5
7
  ### [0.1.351](https://github.com/MediaCubeCo/mcui/compare/v0.1.350...v0.1.351) (2025-01-08)
6
8
 
7
9
  ### [0.1.350](https://github.com/MediaCubeCo/mcui/compare/v0.1.349...v0.1.350) (2025-01-08)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mediacube-ui",
3
- "version": "0.1.351",
3
+ "version": "0.1.352",
4
4
  "description": "Design system for Mediacube services",
5
5
  "author": "Mediacube",
6
6
  "private": false,
@@ -35,6 +35,7 @@
35
35
  <script>
36
36
  import McSvgIcon from '../McSvgIcon/McSvgIcon'
37
37
  import { VTooltip } from 'v-tooltip'
38
+ import { checkContrastColor } from '../../utils/checkColor'
38
39
 
39
40
  VTooltip.options.defaultBoundariesElement = 'window'
40
41
  export default {
@@ -114,7 +115,7 @@ export default {
114
115
  */
115
116
  variation: {
116
117
  type: String,
117
- default: 'purple',
118
+ default: 'main',
118
119
  },
119
120
  /**
120
121
  * Размеры:
@@ -272,6 +273,7 @@ export default {
272
273
  'mc-button--disabled': this.disabled,
273
274
  'mc-button--rounded': this.rounded && /-compact$/.test(this.size),
274
275
  'mc-button--semi-rounded': this.semiRounded,
276
+ 'mc-button--contrast': this.isContrast,
275
277
  'mc-button--full-width': this.fullWidth,
276
278
  'mc-button--uppercase': this.uppercase,
277
279
  'mc-button--shadow': this.shadow,
@@ -288,12 +290,11 @@ export default {
288
290
  const currentStyle = texts[texts.length - 1]
289
291
  let color = variation.replace(`-${currentStyle}`, '')
290
292
  switch (currentStyle) {
291
- case 'link':
292
293
  case 'flat':
293
294
  case 'outline':
294
- case 'invert': {
295
+ case 'invert':
296
+ case 'link':
295
297
  break
296
- }
297
298
  default: {
298
299
  color = variation
299
300
  break
@@ -304,16 +305,28 @@ export default {
304
305
  type: currentStyle,
305
306
  }
306
307
  },
308
+ /**
309
+ * Так как сейчас мы используем светлую тему, то проверяем контраст цвета на основе белого
310
+ * Проверяем только для main цветов, так как остальные должны подходить по стандарту
311
+ * TODO: сделать проверку контраста для темных тем
312
+ * */
313
+ isContrast() {
314
+ let [color] = this.variation.split('-') || []
315
+ return color.includes('main') && checkContrastColor(color, [255, 255, 255])
316
+ },
307
317
  styles() {
308
318
  let hoverBrightness
309
319
  let textColor
310
320
  switch (this.buttonVariation.type) {
311
- case 'link':
312
321
  case 'flat':
313
322
  case 'outline':
314
323
  case 'invert': {
324
+ if (this.isContrast) textColor = 'black'
315
325
  break
316
326
  }
327
+ case 'link':
328
+ textColor = this.buttonVariation.color
329
+ break
317
330
  default: {
318
331
  switch (this.buttonVariation.color) {
319
332
  case 'yellow':
@@ -325,7 +338,7 @@ export default {
325
338
  break
326
339
  }
327
340
  default: {
328
- textColor = 'white'
341
+ textColor = this.isContrast ? 'black' : 'white'
329
342
  }
330
343
  }
331
344
  break
@@ -467,7 +480,18 @@ export default {
467
480
  align-items: center;
468
481
  z-index: 1;
469
482
  }
470
-
483
+ &--contrast {
484
+ color: var(--mc-button-text-color) !important;
485
+ #{$block-name} {
486
+ &--is-active,
487
+ &.nuxt-link-active {
488
+ color: var(--color-main-dark);
489
+ background-color: transparent;
490
+ border-color: transparent;
491
+ pointer-events: none;
492
+ }
493
+ }
494
+ }
471
495
  &__text {
472
496
  @include ellipsis($display: inline-block);
473
497
  @include layout-flex-fix();
@@ -685,9 +709,22 @@ export default {
685
709
  opacity: 0.1 !important;
686
710
  }
687
711
  }
712
+ // TODO check contast colors
713
+ //&#{$block-name}--contrast {
714
+ // #{$block-name} {
715
+ // &__background {
716
+ // opacity: 0.4 !important;
717
+ // }
718
+ // }
719
+ //}
688
720
  @include hoverMixin {
689
721
  opacity: 0.2 !important;
690
722
  }
723
+ //&#{$block-name}--contrast {
724
+ // @include hoverMixin {
725
+ // opacity: 0.6 !important;
726
+ // }
727
+ //}
691
728
  }
692
729
  &-flat {
693
730
  color: var(--mc-button-background-color);
@@ -707,6 +744,9 @@ export default {
707
744
  &#{$block-name}--size-l {
708
745
  line-height: $line-height-250;
709
746
  }
747
+ &#{$block-name}--contrast {
748
+ filter: brightness(80%);
749
+ }
710
750
  &#{$block-name} {
711
751
  &--disabled {
712
752
  opacity: $opacity-disabled;
@@ -765,7 +805,7 @@ export default {
765
805
 
766
806
  &--is-active,
767
807
  &.nuxt-link-active {
768
- color: $color-purple;
808
+ color: var(--color-main);
769
809
  background-color: transparent;
770
810
  border-color: transparent;
771
811
  pointer-events: none;
@@ -80,7 +80,7 @@ export default {
80
80
  .mc-cropper {
81
81
  $block-name: &;
82
82
 
83
- $color-main: $color-purple;
83
+ $color-main: var(--color-main);
84
84
 
85
85
  .cropper {
86
86
  &-modal {
@@ -56,7 +56,7 @@
56
56
  v-for="preset in customPresets"
57
57
  :key="preset.title"
58
58
  variation="black-link"
59
- secondary-color="purple"
59
+ secondary-color="main"
60
60
  @click="handlerPreselectRange(preset.period)"
61
61
  >
62
62
  {{ preset.title }}
@@ -66,7 +66,7 @@
66
66
  <mc-button
67
67
  v-if="placeholders.week"
68
68
  variation="black-link"
69
- secondary-color="purple"
69
+ secondary-color="main"
70
70
  @click="selectPeriod('week')"
71
71
  >
72
72
  {{ placeholders.week }}
@@ -74,7 +74,7 @@
74
74
  <mc-button
75
75
  v-if="placeholders.month"
76
76
  variation="black-link"
77
- secondary-color="purple"
77
+ secondary-color="main"
78
78
  @click="selectPeriod('month')"
79
79
  >
80
80
  {{ placeholders.month }}
@@ -82,7 +82,7 @@
82
82
  <mc-button
83
83
  v-if="placeholders.quarter"
84
84
  variation="black-link"
85
- secondary-color="purple"
85
+ secondary-color="main"
86
86
  @click="selectPeriod('quarter')"
87
87
  >
88
88
  {{ placeholders.quarter }}
@@ -90,7 +90,7 @@
90
90
  <mc-button
91
91
  v-if="placeholders.year"
92
92
  variation="black-link"
93
- secondary-color="purple"
93
+ secondary-color="main"
94
94
  @click="selectPeriod('year')"
95
95
  >
96
96
  {{ placeholders.year }}
@@ -99,7 +99,7 @@
99
99
  </div>
100
100
  <mc-button
101
101
  v-if="placeholders.confirm"
102
- variation="purple-outline"
102
+ variation="main-outline"
103
103
  size="xs"
104
104
  @click="() => handleSubmit(emit)"
105
105
  >
@@ -635,7 +635,7 @@ export default {
635
635
  color: $color-black;
636
636
  &:hover,
637
637
  &:focus {
638
- border-color: $color-purple;
638
+ border-color: var(--color-main);
639
639
  }
640
640
  &::placeholder {
641
641
  color: $color-gray;
@@ -762,7 +762,7 @@ export default {
762
762
  .mx-btn-text {
763
763
  color: $color-black;
764
764
  &:hover {
765
- color: $color-purple;
765
+ color: var(--color-main);
766
766
  }
767
767
  }
768
768
  .mx-icon {
@@ -816,19 +816,19 @@ export default {
816
816
  border-radius: $radius-100;
817
817
  }
818
818
  &:hover {
819
- color: $color-purple;
820
- background-color: fade-out($color-purple, 0.9);
819
+ color: var(--color-main);
820
+ background-color: var(--color-main-alpha-10);
821
821
  border-radius: $radius-100;
822
822
  }
823
823
  &.today {
824
- color: $color-purple;
824
+ color: var(--color-main);
825
825
  }
826
826
  &.active {
827
827
  color: $color-white;
828
828
  background-color: $color-white;
829
829
 
830
830
  div {
831
- background-color: $color-purple;
831
+ background-color: var(--color-main);
832
832
  height: 100%;
833
833
  display: flex;
834
834
  align-items: center;
@@ -837,17 +837,17 @@ export default {
837
837
  }
838
838
  }
839
839
  &.hover-in-range {
840
- background-color: rgba($color-purple, 0.1);
840
+ background-color: var(--color-main-alpha-10);
841
841
  }
842
842
  &.in-range {
843
- background-color: rgba($color-purple, 0.1);
843
+ background-color: var(--color-main-alpha-10);
844
844
  color: $color-black;
845
845
  border-radius: 0;
846
846
 
847
847
  &:hover {
848
848
  div {
849
- color: $color-purple;
850
- background-color: fade-out($color-purple, 0.9);
849
+ color: var(--color-main);
850
+ background-color: var(--color-main-alpha-10);
851
851
  border-radius: $radius-100;
852
852
  }
853
853
  }
@@ -870,7 +870,7 @@ export default {
870
870
  border-radius: 0;
871
871
  background-color: $color-hover-gray;
872
872
  &.today {
873
- color: $color-purple;
873
+ color: var(--color-main);
874
874
  }
875
875
  }
876
876
  }
@@ -11,7 +11,7 @@
11
11
  <mc-svg-icon
12
12
  class="mc-field-checkbox__icon"
13
13
  :name="isChecked ? 'checkbox--checked' : 'checkbox'"
14
- :color="isChecked ? 'purple' : 'gray'"
14
+ :color="isChecked ? 'main' : 'gray'"
15
15
  :size="checkboxSize"
16
16
  />
17
17
  <input v-bind="inputProps" @change="handleChange" />
@@ -258,7 +258,7 @@ export default {
258
258
  &__icon {
259
259
  z-index: 1;
260
260
  &:hover {
261
- color: $color-purple;
261
+ color: var(--color-main);
262
262
  }
263
263
  }
264
264
 
@@ -92,7 +92,7 @@ export default {
92
92
  */
93
93
  color: {
94
94
  type: String,
95
- default: 'purple',
95
+ default: 'main',
96
96
  },
97
97
  iconSize: {
98
98
  type: String,
@@ -410,8 +410,8 @@ export default {
410
410
  computedOptions() {
411
411
  let options = !this.groupKeys
412
412
  ? [...this.options, ...this.local_options].filter(
413
- (v, i, a) => a.findIndex(afi => afi.value === v.value) === i,
414
- )
413
+ (v, i, a) => a.findIndex(afi => afi.value === v.value) === i,
414
+ )
415
415
  : this.options
416
416
  if (this.searchValueInOptions && this.taggable) {
417
417
  const search = this.searchValue
@@ -451,7 +451,7 @@ export default {
451
451
  let backgroundColor = this.backgroundColor
452
452
  let labelColor
453
453
  if (!this.backgroundColor || lightColors.includes(this.backgroundColor)) {
454
- borderColor = 'purple'
454
+ borderColor = 'main'
455
455
  }
456
456
  if (darkColors.includes(this.backgroundColor)) {
457
457
  labelColor = 'white'
@@ -596,7 +596,7 @@ export default {
596
596
  iosViewportIndent -
597
597
  ref.$refs.list.getBoundingClientRect().height -
598
598
  8}px`
599
- ref.$refs.list.style.bottom = 'auto'
599
+ ref.$refs.list.style.bottom = 'auto'
600
600
  break
601
601
  case 'bottom':
602
602
  ref.$refs.list.style.bottom = 'auto'
@@ -825,7 +825,7 @@ export default {
825
825
  overflow: hidden;
826
826
  text-align: start;
827
827
  &:hover {
828
- border-color: $color-purple;
828
+ border-color: var(--color-main);
829
829
  }
830
830
  &:before {
831
831
  content: '';
@@ -859,7 +859,7 @@ export default {
859
859
  margin-top: $space-50;
860
860
  margin-bottom: $space-50;
861
861
  margin-right: unset;
862
- background-color: $color-lighter-purple;
862
+ background-color: var(--color-main-lighter);
863
863
  color: $color-black;
864
864
  padding: $size-50 $size-50 $size-50 $size-100;
865
865
  border-radius: 100px;
@@ -876,7 +876,7 @@ export default {
876
876
  &__tag-icon {
877
877
  @include size($size-200);
878
878
  position: relative;
879
- background-color: $color-purple;
879
+ background-color: var(--color-main);
880
880
  border-radius: $radius-circle;
881
881
  flex: 0 0 auto;
882
882
  margin-inline-start: $space-100;
@@ -933,7 +933,7 @@ export default {
933
933
  color: $color-black;
934
934
  }
935
935
  &--selected {
936
- background-color: $color-lighter-purple !important;
936
+ background-color: var(--color-main-lighter) !important;
937
937
  color: $color-black !important;
938
938
  font-weight: $font-weight-medium;
939
939
  }
@@ -953,7 +953,7 @@ export default {
953
953
  }
954
954
  &__select {
955
955
  &::before {
956
- border-color: $color-purple $color-transparent $color-transparent;
956
+ border-color: var(--color-main) $color-transparent $color-transparent;
957
957
  }
958
958
  }
959
959
  }
@@ -961,7 +961,7 @@ export default {
961
961
  &__spinner {
962
962
  &:after,
963
963
  &:before {
964
- border-top-color: $color-purple;
964
+ border-top-color: var(--color-main);
965
965
  @include size($space-300);
966
966
  top: calc(50% - 5px);
967
967
  left: calc(50% - 2px);
@@ -879,7 +879,7 @@ export default {
879
879
  &:focus,
880
880
  &:hover {
881
881
  outline: 0;
882
- border-color: $color-purple;
882
+ border-color: var(--color-main);
883
883
  }
884
884
 
885
885
  &::-webkit-search-cancel-button,
@@ -77,7 +77,7 @@ export default {
77
77
  */
78
78
  color: {
79
79
  type: String,
80
- default: 'purple',
80
+ default: 'main',
81
81
  },
82
82
 
83
83
  /**
@@ -114,8 +114,8 @@ export default {
114
114
  let disabledColor
115
115
  let saturateValue
116
116
  switch (this.color) {
117
- case 'purple': {
118
- disabledColor = 'light-purple'
117
+ case 'main': {
118
+ disabledColor = 'main-light'
119
119
  break
120
120
  }
121
121
  default: {
@@ -185,7 +185,7 @@ export default {
185
185
 
186
186
  @at-root #{$block-name}--checked#{$block-name}--colored-text {
187
187
  #{$block-name}__text {
188
- color: $color-purple;
188
+ color: var(--color-main);
189
189
  }
190
190
  }
191
191
  @at-root #{$block-name}--disabled#{$block-name}--colored-text {
@@ -195,7 +195,7 @@ export default {
195
195
  }
196
196
  @at-root #{$block-name}--checked#{$block-name}--disabled#{$block-name}--colored-text {
197
197
  #{$block-name}__text {
198
- color: $color-light-purple;
198
+ color: var(--color-main-light);
199
199
  }
200
200
  }
201
201
  }
@@ -221,7 +221,7 @@ export default {
221
221
  @include size(0);
222
222
 
223
223
  &:checked + #{$block-name}__slider {
224
- background-color: $color-purple;
224
+ background-color: var(--color-main);
225
225
 
226
226
  &:before {
227
227
  inset-inline-start: calc(#{$space-300} + #{$toggle-indent});
@@ -63,7 +63,7 @@ export default {
63
63
  */
64
64
  variation: {
65
65
  type: String,
66
- default: 'purple',
66
+ default: 'main',
67
67
  },
68
68
  /**
69
69
  * Заголовок блока
@@ -149,7 +149,7 @@ export default {
149
149
  @import '../../tokens/box-shadows';
150
150
  .mc-range-slider {
151
151
  $block-name: &;
152
- --mc-range-slider-color: #{$color-purple};
152
+ --mc-range-slider-color: var(--color-main);
153
153
 
154
154
  .vue-slider-dot-tooltip-inner {
155
155
  line-height: $line-height-200;
@@ -99,7 +99,7 @@ export default {
99
99
  */
100
100
  accentColor: {
101
101
  type: String,
102
- default: 'purple',
102
+ default: 'main',
103
103
  },
104
104
  /**
105
105
  * Заглавные буквы
@@ -204,11 +204,11 @@ export default {
204
204
  color: $color-purple;
205
205
  &:hover,
206
206
  &:focus {
207
- color: $color-hover-purple;
207
+ color: var(--color-main-dark);
208
208
  }
209
209
 
210
210
  &:active {
211
- color: $color-hover-purple;
211
+ color: var(--color-main-dark);
212
212
  }
213
213
  }
214
214
 
@@ -19,7 +19,7 @@
19
19
  <mc-button
20
20
  slot="append"
21
21
  class="mc-chat-form__btn"
22
- variation="purple-link"
22
+ variation="main-link"
23
23
  size="m-compact"
24
24
  type="submit"
25
25
  rounded
@@ -182,7 +182,7 @@ export default {
182
182
  .mc-button__background {
183
183
  opacity: 0 !important;
184
184
  }
185
- background-color: fade-out($color-purple, 0.9);
185
+ background-color: var(--color-main-alpha-10);
186
186
  }
187
187
  }
188
188
  }
@@ -19,7 +19,7 @@
19
19
  :key="preset.name"
20
20
  :variation="getPresetButtonVariation(preset)"
21
21
  :tooltip="preset.tooltip"
22
- secondary-color="purple"
22
+ secondary-color="main"
23
23
  @mouseup="() => handlePresetMouseUp(preset)"
24
24
  >
25
25
  {{ preset.visibleName }}
@@ -50,7 +50,7 @@
50
50
  :use-timezone="useTimezone"
51
51
  @input="handleConditionChange"
52
52
  />
53
- <mc-button v-if="hasButtonAdd" variation="purple-outline" @click.native="handleStoreTag">
53
+ <mc-button v-if="hasButtonAdd" variation="main-outline" @click.native="handleStoreTag">
54
54
  {{ placeholders.actions[activeTag ? 'save' : 'add'] }}
55
55
  </mc-button>
56
56
  </template>
@@ -129,7 +129,7 @@
129
129
  />
130
130
  <mc-button
131
131
  :disabled="buttonCreateIsDisable"
132
- variation="purple-outline"
132
+ variation="main-outline"
133
133
  size="s"
134
134
  @click.native="handleCreatePreset"
135
135
  >
@@ -197,20 +197,20 @@ export default {
197
197
  required: true,
198
198
  },
199
199
  /**
200
- * Типы фильтров
201
- *
202
- * [{
203
- name: Filter title,
204
- value: [String] - Filter value(key),
205
- type: [String] - Filter type(relation / date / text / fast / labels / simple),
206
- options: [Array] - Filter options,
207
- getAjaxOne: [Function] - Method for get selected options when filter initialize,
208
- getAjaxOptions: [Function] - Method for get options by API,
209
- [relation]: [String] - Filter relation, only for fast filter,
210
- [default]: [String, Number, Boolean] - Only for fast filter type. Fast filter haven't options, we set default value
211
- [description]: [String] - Only for fast filter type. Description of fast filter
200
+ * Типы фильтров
201
+ *
202
+ * [{
203
+ name: Filter title,
204
+ value: [String] - Filter value(key),
205
+ type: [String] - Filter type(relation / date / text / fast / labels / simple),
206
+ options: [Array] - Filter options,
207
+ getAjaxOne: [Function] - Method for get selected options when filter initialize,
208
+ getAjaxOptions: [Function] - Method for get options by API,
209
+ [relation]: [String] - Filter relation, only for fast filter,
210
+ [default]: [String, Number, Boolean] - Only for fast filter type. Fast filter haven't options, we set default value
211
+ [description]: [String] - Only for fast filter type. Description of fast filter
212
212
  }, ...]
213
- */
213
+ */
214
214
  filters: {
215
215
  type: Array,
216
216
  required: true,
@@ -324,7 +324,7 @@ export default {
324
324
  return this.filters.filter(f => f.type !== 'fast')
325
325
  },
326
326
  visibilityToggleVariation() {
327
- return this.isOpen || !this.buttonConfirmIsDisable ? 'purple-invert' : 'black-flat'
327
+ return this.isOpen || !this.buttonConfirmIsDisable ? 'main-invert' : 'black-flat'
328
328
  },
329
329
  currentFilter() {
330
330
  return this.filters.find(f => f.value === this.selectedOptionFilter)
@@ -732,7 +732,7 @@ export default {
732
732
  this.activePreset = { ...preset }
733
733
  },
734
734
  getPresetButtonVariation(preset) {
735
- return this.activePreset && this.activePreset.name === preset.name ? 'purple-invert' : 'gray-outline'
735
+ return this.activePreset && this.activePreset.name === preset.name ? 'main-invert' : 'gray-outline'
736
736
  },
737
737
  },
738
738
  }
@@ -751,7 +751,6 @@ export default {
751
751
  display: flex;
752
752
  @include child-indent-right($space-100);
753
753
  }
754
-
755
754
  &__presets {
756
755
  position: relative;
757
756
  flex-grow: 1;
@@ -763,7 +762,6 @@ export default {
763
762
  background: linear-gradient(90deg, hsla(0, 0%, 100%, 0) 0, $color-white);
764
763
  pointer-events: none;
765
764
  }
766
-
767
765
  &-inner {
768
766
  display: flex;
769
767
  flex-wrap: nowrap;
@@ -776,7 +774,6 @@ export default {
776
774
  }
777
775
  }
778
776
  }
779
-
780
777
  &__body {
781
778
  padding: $space-200 $space-200 $space-300 $space-200;
782
779
  background-color: $color-hover-gray;
@@ -784,7 +781,6 @@ export default {
784
781
  &-top {
785
782
  display: flex;
786
783
  @include child-indent-right($space-400);
787
-
788
784
  &-left,
789
785
  &-right {
790
786
  @include child-indent-right($space-100);
@@ -799,7 +795,6 @@ export default {
799
795
  align-items: center;
800
796
  justify-content: space-between;
801
797
  @include child-indent-right($space-400);
802
-
803
798
  &-left {
804
799
  > *:not(:first-child) {
805
800
  margin-inline-start: $space-200;
@@ -39,7 +39,7 @@ export default {
39
39
  return `${this.tag.categoryName}${append}`
40
40
  },
41
41
  computedVariation() {
42
- return this.closable ? 'purple-invert' : 'hover-gray'
42
+ return this.closable ? 'main-invert' : 'hover-gray'
43
43
  },
44
44
  classes() {
45
45
  return {
@@ -67,13 +67,15 @@ export default {
67
67
 
68
68
  &--closable {
69
69
  border-radius: $space-150;
70
+
70
71
  &:hover {
71
72
  cursor: pointer;
72
- background-color: fade-out($color-purple, 0.6);
73
+ background-color: var(--color-main-alpha-40);
73
74
  }
74
75
  }
76
+
75
77
  &--is-active {
76
- background-color: fade-out($color-purple, 0.6);
78
+ background-color: var(--color-main-alpha-40);
77
79
  }
78
80
 
79
81
  .mc-title {
@@ -18,7 +18,7 @@
18
18
  <mc-button
19
19
  v-for="relation in relations"
20
20
  :key="relation"
21
- :variation="relationType === relation ? 'purple' : 'dark-gray-outline'"
21
+ :variation="relationType === relation ? 'main' : 'dark-gray-outline'"
22
22
  @click="() => changeRelationType(relation)"
23
23
  >
24
24
  {{ placeholders.actions[`${relation === 'exists' ? 'empty' : relation}`] }}
@@ -55,7 +55,7 @@ export default {
55
55
  }
56
56
  &__spinner {
57
57
  display: block;
58
- border: 2px solid $color-purple;
58
+ border: 2px solid var(--color-main);
59
59
  border-inline-start-color: transparent;
60
60
  border-radius: 50%;
61
61
  animation: rotate 1.5s infinite linear;
@@ -275,11 +275,11 @@ export default {
275
275
  dropdownActivator: 'black',
276
276
  mainMenuLinks: {
277
277
  variable: 'black-flat',
278
- secondaryColor: 'purple',
278
+ secondaryColor: 'main',
279
279
  },
280
280
  closeButton: {
281
281
  variable: 'black-link',
282
- secondaryColor: 'purple',
282
+ secondaryColor: 'main',
283
283
  },
284
284
  },
285
285
  }
@@ -23,7 +23,7 @@
23
23
  <mc-chip
24
24
  v-if="info || withIndicator"
25
25
  slot="icon-append"
26
- variation="purple"
26
+ variation="main"
27
27
  class="mc-side-bar-button__chip"
28
28
  :class="{ indicator: withIndicator }"
29
29
  >
@@ -159,7 +159,7 @@ export default {
159
159
  return {
160
160
  'mc-side-bar-button': true,
161
161
  [`mc-side-bar--${this.themeConfig.mode || 'black'}__button`]: true,
162
- 'purple-hover': !this.secondaryColor && this.themeConfig.mainMenuLinks.variable === 'black-flat',
162
+ 'main-hover': !this.secondaryColor && this.themeConfig.mainMenuLinks.variable === 'black-flat',
163
163
  }
164
164
  },
165
165
  btnAttrs() {
@@ -191,7 +191,7 @@ export default {
191
191
  &__dot {
192
192
  @include position(absolute, $space-100 6px null null);
193
193
  @include size($size-100);
194
- background-color: $color-purple;
194
+ background-color: var(--color-main);
195
195
  border-radius: $radius-circle;
196
196
  }
197
197
  &__chip {
@@ -211,8 +211,8 @@ export default {
211
211
  .mc-svg-icon {
212
212
  @include size($size-300);
213
213
  }
214
- &.purple-hover:hover {
215
- background-color: $color-lighter-purple;
214
+ &.main-hover:hover {
215
+ background-color: var(--color-main-lighter);
216
216
  }
217
217
 
218
218
  .mc-button__text {
@@ -243,8 +243,8 @@ export default {
243
243
  &--white__button {
244
244
  &.mc-button--is-active,
245
245
  &.mc-button.nuxt-link-active {
246
- color: $color-purple;
247
- background-color: $color-lighter-purple;
246
+ color: var(--color-main);
247
+ background-color: var(--color-main-lighter);
248
248
  pointer-events: auto;
249
249
  }
250
250
  }
@@ -224,7 +224,7 @@ export default {
224
224
  active: menuMainItem.active(),
225
225
  'with-submenu': menuMainItem.menu && menuMainItem.menu.length,
226
226
  [`mc-side-bar--${this.themeConfig.mode || 'black'}__button`]: true,
227
- 'purple-hover': this.themeConfig.mainMenuLinks.variable === 'black-flat',
227
+ 'main-hover': this.themeConfig.mainMenuLinks.variable === 'black-flat',
228
228
  [`mc-button--variation-${this.themeConfig.mainMenuLinks.variable}`]: !!this.themeConfig.mainMenuLinks
229
229
  .variable,
230
230
  ['mc-side-bar--black__button mc-button nuxt-link-active']:
@@ -612,7 +612,7 @@ export default {
612
612
  }
613
613
  }
614
614
  .vxe-body--row.row--cheched {
615
- background-color: rgba($color-purple, 0.05);
615
+ background-color: var(--color-main-alpha-10);
616
616
  }
617
617
  .fixed-left--wrapper {
618
618
  scrollbar-width: none;
@@ -726,14 +726,14 @@ export default {
726
726
  z-index: 1;
727
727
  &:hover {
728
728
  .vxe-checkbox--icon::before {
729
- border-color: $color-purple !important;
729
+ border-color: var(--color-main) !important;
730
730
  }
731
731
  }
732
732
  &.is--checked,
733
733
  &.is--indeterminate {
734
734
  .vxe-checkbox--icon::before {
735
- border-color: $color-purple;
736
- background-color: $color-purple;
735
+ border-color: var(--color-main);
736
+ background-color: var(--color-main);
737
737
  }
738
738
  }
739
739
  }
@@ -26,9 +26,8 @@
26
26
  :name="getSortIcon(column)"
27
27
  :color="getSortColor(column)"
28
28
  size="200"
29
- />{{
30
- $attrs.type === 'seq' ? '#' : column.title
31
- }}<div slot="icon-append" class="mc-table-col__header-append">
29
+ />{{ $attrs.type === 'seq' ? '#' : column.title }}
30
+ <div slot="icon-append" class="mc-table-col__header-append">
32
31
  <!-- @slot Слот для вставки в конец после заголовка столбца -->
33
32
  <slot name="header-append" />
34
33
  </div>
@@ -201,9 +200,9 @@ export default {
201
200
  }
202
201
  }
203
202
  }
203
+
204
204
  .mc-table-col {
205
205
  $block-name: &;
206
-
207
206
  &--border-right {
208
207
  border-inline-end: 1px solid $color-hover-gray;
209
208
  }
@@ -218,12 +217,10 @@ export default {
218
217
  overflow: visible !important;
219
218
  }
220
219
  }
221
-
222
220
  &__total {
223
221
  margin-inline-start: auto;
224
222
  color: $color-gray;
225
223
  }
226
-
227
224
  &__title {
228
225
  width: auto;
229
226
  max-width: 101%;
@@ -241,7 +238,6 @@ export default {
241
238
  @include position(absolute, 0 $space-200 0 null);
242
239
  @include child-indent-right($space-50);
243
240
  background-color: $color-white;
244
-
245
241
  &::before {
246
242
  @include pseudo();
247
243
  @include position(null, 0 100% 0 null);
@@ -267,6 +263,7 @@ export default {
267
263
  white-space: normal !important;
268
264
  }
269
265
  }
266
+
270
267
  .vxe-body--row {
271
268
  transition: background-color 0s;
272
269
  &.row--stripe {
@@ -283,6 +280,7 @@ export default {
283
280
  }
284
281
  }
285
282
  &.row--current {
283
+ background-color: var(--color-main-alpha-10) !important;
286
284
  @include col-right-color($vxe-table-row-current-background-color);
287
285
  }
288
286
  // описка названия в библиотеке таблицы
@@ -3,7 +3,7 @@
3
3
  <div class="mc-table-card-header__left">
4
4
  <!-- @slot Слот контента -->
5
5
  <slot>
6
- <mc-button :to="backTo" exact variation="purple-link" size="xs">
6
+ <mc-button :to="backTo" exact variation="main-link" size="xs">
7
7
  <mc-svg-icon slot="icon-prepend" name="keyboard_arrow_left" />
8
8
  {{ buttonBackText }}
9
9
  </mc-button>
@@ -51,7 +51,7 @@
51
51
  position: $position;
52
52
 
53
53
  @each $offset, $value in $offsets {
54
- #{$offset}: $value;
54
+ #{$offset}: $value;
55
55
  }
56
56
  }
57
57
 
@@ -225,26 +225,26 @@
225
225
  }
226
226
  }
227
227
 
228
- @mixin default-link($main-color: $color-black, $second-color: $color-purple, $is-important: false) {
229
- color: $main-color if($is-important, !important, null);
228
+ @mixin default-link($main-color: '--color-black', $second-color: ('--color-purple'), $is-important: false) {
229
+ color: var(#{$main-color}) if($is-important, !important, null);
230
230
  &:hover,
231
231
  &:focus {
232
- color: $second-color if($is-important, !important, null);
232
+ color: var(#{$second-color}) if($is-important, !important, null);
233
233
  }
234
234
 
235
235
  &:active {
236
- color: darken($second-color, 8%) if($is-important, !important, null);
236
+ filter: var(#{$second-color}) if($is-important, !important, null);
237
237
  }
238
238
  }
239
239
 
240
240
  @mixin delete-link() {
241
- @include default-link($color-black, $color-red);
241
+ @include default-link('--color-black', '--color-red');
242
242
  }
243
243
  @mixin text-link($is-important: false) {
244
- @include default-link($color-purple, $color-hover-purple, $is-important);
244
+ @include default-link('--color-main', '--color-main-dark', $is-important);
245
245
  }
246
246
  @mixin close-link() {
247
- @include default-link($color-gray, $color-black);
247
+ @include default-link('--color-gray', '--color-black');
248
248
  }
249
249
 
250
250
  @mixin field-error() {
@@ -430,7 +430,7 @@
430
430
  border-radius: $radius-200;
431
431
  }
432
432
  blockquote {
433
- border-left: $space-50 solid $color-purple !important;
433
+ border-left: $space-50 solid var(--color-main) !important;
434
434
  margin: $space-zero;
435
435
  padding-left: $space-200;
436
436
  }
@@ -517,12 +517,12 @@
517
517
  }
518
518
  }
519
519
 
520
- @mixin animation-border-spinner($duration: 2s, $border-color: $color-purple, $border-size: $space-100) {
520
+ @mixin animation-border-spinner($duration: 2s, $border-color: '--color-main', $border-size: $space-100) {
521
521
  background-repeat: no-repeat;
522
- background-image: linear-gradient(to right, $border-color 100%, $border-color 100%),
523
- linear-gradient(to bottom, $border-color 100%, $border-color 100%),
524
- linear-gradient(to right, $border-color 100%, $border-color 100%),
525
- linear-gradient(to bottom, $border-color 100%, $border-color 100%);
522
+ background-image: linear-gradient(to right, var(#{$border-color}) 100%, var(#{$border-color}) 100%),
523
+ linear-gradient(to bottom, var(#{$border-color}) 100%, var(#{$border-color}) 100%),
524
+ linear-gradient(to right, var(#{$border-color}) 100%, var(#{$border-color}) 100%),
525
+ linear-gradient(to bottom, var(#{$border-color}) 100%, var(#{$border-color}) 100%);
526
526
  background-position: 0 0, 100% 0, 100% 100%, 0 100%;
527
527
  background-size: 100% $border-size, $border-size 100%, 100% $border-size, $border-size 100%;
528
528
  animation: spin-border $duration linear;
@@ -609,4 +609,4 @@
609
609
  > *:not(:first-child) {
610
610
  margin-inline-start: $space;
611
611
  }
612
- }
612
+ }
@@ -122,19 +122,19 @@ a {
122
122
  }
123
123
 
124
124
  ::selection {
125
- background: fade-out($color-purple, 0);
125
+ background: var(--color-main);
126
126
  color: $color-white;
127
127
  }
128
128
 
129
129
  ::-moz-selection {
130
- background: fade-out($color-purple, 0);
130
+ background: var(--color-main);
131
131
  color: $color-white;
132
132
  }
133
133
 
134
134
  input,
135
135
  textarea,
136
136
  [contenteditable] {
137
- caret-color: $color-purple;
137
+ caret-color: var(--color-main);
138
138
  }
139
139
 
140
140
  button {
@@ -288,6 +288,14 @@ pre {
288
288
  @each $name, $color in $token-colors {
289
289
  #{'--color-'}#{$name}: #{$color};
290
290
  }
291
+ // Default main project colors
292
+ --color-main: $color-purple;
293
+ --color-main-dark: $color-hover-purple;
294
+ @for $i from 1 through 10 {
295
+ #{'--color-main-alpha-'}#{$i * 10}: #{rgba($color-purple, $i / 10)};
296
+ }
297
+ --color-main-light: $color-light-purple;
298
+ --color-main-lighter: $color-lighter-purple;
291
299
  @each $name, $size in $token-icon-sizes {
292
300
  #{'--size-'}#{$name}: #{$size};
293
301
  }
@@ -2,9 +2,9 @@ $vxe-table-border-color: $color-hover-gray;
2
2
  $vxe-table-header-background-color: $color-white;
3
3
  $vxe-table-row-hover-background-color: $color-hover-gray;
4
4
  $vxe-table-row-hover-striped-background-color: $color-hover-gray;
5
- $vxe-table-row-current-background-color: $color-lighter-purple;
6
- $vxe-table-row-hover-current-background-color: $color-lighter-purple;
7
- $vxe-table-row-cheched-background-color: $color-lighter-purple;
8
- $vxe-table-row-hover-cheched-background-color: $color-lighter-purple;
5
+ $vxe-table-row-current-background-color: var(--color-main-lighter);
6
+ $vxe-table-row-hover-current-background-color: var(--color-main-lighter);
7
+ $vxe-table-row-cheched-background-color: var(--color-main-lighter);
8
+ $vxe-table-row-hover-cheched-background-color: var(--color-main-lighter);
9
9
 
10
10
  $vxe-table-row-line-height: 16px;
@@ -3,17 +3,17 @@
3
3
  * @presenter Gradient
4
4
  */
5
5
  $gradient-pink: linear-gradient(180deg, #F5576C 0%, #F093FB 100%); /* Фирменный цвет личного кабинета */
6
- $gradient-violet: linear-gradient(180deg, #E41AFE 0%, #8035F8 100%); /* Столбики в графике 5 порядка */
6
+ $gradient-violet: linear-gradient(180deg, #E41AFE 0%, var(--color-main-dark) 100%); /* Столбики в графике 5 порядка */
7
7
  $gradient-blue: linear-gradient(180deg, #1ADBFE 0%, #3580F8 100%); /* Нотификации и столбики в графике 4 порядка */
8
8
  $gradient-yellow: linear-gradient(180deg, #FEE41A 0%, #F89B35 100%); /* Столбики в графике 3 порядка */
9
9
  $gradient-green: linear-gradient(180deg, #C9DD4C 0%, #63BE7E 100%); /* Столбики в графике 2 порядка */
10
10
  $gradient-red: linear-gradient(180deg, #F26567 0%, #F79440 100%); /* Столбики в графике 1 порядка */
11
- $gradient-purple: linear-gradient(270deg, #9a47ed 0%, #8446ff 100%); /* Основной градиент для MCPay */
12
- $gradient-purple-pink: linear-gradient(90deg, #722eff 2%, #fe6ffc 100%); /*Градиент промоакции*/
13
- $gradient-blue-purple: linear-gradient(90deg, #18bfe3 20%, #8756ff 70%); /*Градиент промоакции*/
14
- $gradient-dark-blue: linear-gradient(90deg, #5550EF 0%, #7F4EFF 100%); /*Градиент автоплатежей*/
11
+ $gradient-purple: linear-gradient(270deg, var(--color-main-dark) 0%, var(--color-main) 100%); /* Основной градиент для MCPay */
12
+ $gradient-purple-pink: linear-gradient(90deg, var(--color-main) 2%, #fe6ffc 100%); /*Градиент промоакции*/
13
+ $gradient-blue-purple: linear-gradient(90deg, #18bfe3 20%, var(--color-main) 70%); /*Градиент промоакции*/
14
+ $gradient-dark-blue: linear-gradient(90deg, #5550EF 0%, var(--color-main) 100%); /*Градиент автоплатежей*/
15
15
  $gradient-light-blue: linear-gradient(277.29deg, #d6e8ff 5.67%, #efe9ff 94.33%); /*Градиент новых криптовалют*/
16
- $gradient-purple-blue: linear-gradient(272.54deg, #18bfe3 17.19%, #8756ff 70.31%); /*Градиент баннера для криптовалют*/
16
+ $gradient-purple-blue: linear-gradient(272.54deg, #18bfe3 17.19%, var(--color-main) 70.31%); /*Градиент баннера для криптовалют*/
17
17
 
18
18
  $gradient-primary-radial: radial-gradient(rgb(179, 211, 255), rgb(62, 132, 244)); /* Radial gradient example */
19
19
 
@@ -0,0 +1,38 @@
1
+ export function hexToRGB(hex, alpha, byArray = false) {
2
+ const r = parseInt(hex.slice(1, 3), 16)
3
+ const g = parseInt(hex.slice(3, 5), 16)
4
+ const b = parseInt(hex.slice(5, 7), 16)
5
+ if (byArray) return [r, g, b]
6
+ const rgb_color = `${r}, ${g}, ${b}`
7
+ return alpha ? `rgba(${rgb_color}, ${alpha})` : `rgb(${rgb_color})`
8
+ }
9
+
10
+ /**
11
+ * Проверяем контрастность по формуле
12
+ * https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-procedure
13
+ * bgColor -
14
+ * */
15
+ export function checkContrastColor(colorName, bgColor) {
16
+ const RED = 0.2126
17
+ const GREEN = 0.7152
18
+ const BLUE = 0.0722
19
+ const GAMMA = 2.4
20
+
21
+ function luminance(r, g, b) {
22
+ const a = [r, g, b].map(v => {
23
+ v /= 255
24
+ return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, GAMMA)
25
+ })
26
+ return a[0] * RED + a[1] * GREEN + a[2] * BLUE
27
+ }
28
+
29
+ function contrast(rgb1, rgb2) {
30
+ const lum1 = luminance(...rgb2)
31
+ const lum2 = luminance(...rgb1)
32
+ const brightest = Math.max(lum1, lum2)
33
+ const darkest = Math.min(lum1, lum2)
34
+ return (brightest + 0.05) / (darkest + 0.05)
35
+ }
36
+ const color = getComputedStyle(document.querySelector(':root')).getPropertyValue(`--color-${colorName}`) || colorName
37
+ return contrast(hexToRGB(color, null, true), bgColor) < 4
38
+ }