@zipify/wysiwyg 3.1.2 → 4.0.0-vue3.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 (134) hide show
  1. package/.eslintrc.js +1 -1
  2. package/config/build/example.config.js +12 -2
  3. package/config/build/lib.config.js +10 -2
  4. package/config/jest/matchers/index.js +0 -2
  5. package/config/jest/setupTests.js +4 -7
  6. package/config/jest/typing.d.ts +1 -2
  7. package/dist/cli.js +2 -7
  8. package/dist/wysiwyg.css +153 -152
  9. package/dist/wysiwyg.mjs +3594 -3172
  10. package/example/example.js +34 -35
  11. package/jest.config.js +4 -1
  12. package/lib/Wysiwyg.vue +166 -190
  13. package/lib/__tests__/utils/buildTestExtensions.js +1 -1
  14. package/lib/components/base/Button.vue +31 -37
  15. package/lib/components/base/ButtonToggle.vue +11 -17
  16. package/lib/components/base/Checkbox.vue +14 -20
  17. package/lib/components/base/FieldLabel.vue +7 -11
  18. package/lib/components/base/Icon.vue +31 -43
  19. package/lib/components/base/Modal.vue +59 -74
  20. package/lib/components/base/NumberField.vue +65 -80
  21. package/lib/components/base/Range.vue +46 -56
  22. package/lib/components/base/ScrollView.vue +13 -21
  23. package/lib/components/base/TextField.vue +28 -33
  24. package/lib/components/base/__tests__/Button.test.js +1 -1
  25. package/lib/components/base/__tests__/Icon.test.js +1 -1
  26. package/lib/components/base/__tests__/Modal.test.js +21 -13
  27. package/lib/components/base/__tests__/Range.test.js +1 -1
  28. package/lib/components/base/__tests__/TextField.test.js +8 -7
  29. package/lib/components/base/colorPicker/ColorPicker.vue +33 -51
  30. package/lib/components/base/composables/__tests__/useDeselectionLock.test.js +4 -2
  31. package/lib/components/base/composables/__tests__/useModalToggler.test.js +3 -1
  32. package/lib/components/base/composables/__tests__/useScrollView.test.js +3 -1
  33. package/lib/components/base/dropdown/Dropdown.vue +35 -55
  34. package/lib/components/base/dropdown/DropdownActivator.vue +38 -66
  35. package/lib/components/base/dropdown/DropdownDivider.vue +0 -6
  36. package/lib/components/base/dropdown/DropdownGroup.vue +8 -20
  37. package/lib/components/base/dropdown/DropdownMenu.vue +8 -21
  38. package/lib/components/base/dropdown/DropdownOption.vue +27 -45
  39. package/lib/components/base/dropdown/__tests__/DropdownActivator.test.js +5 -3
  40. package/lib/components/base/dropdown/__tests__/DropdownOption.test.js +9 -7
  41. package/lib/components/toolbar/Toolbar.vue +26 -42
  42. package/lib/components/toolbar/__tests__/Toolbar.test.js +1 -1
  43. package/lib/components/toolbar/base/__tests__/ToolbarDivider.test.js +1 -1
  44. package/lib/components/toolbar/controls/AlignmentControl.vue +27 -46
  45. package/lib/components/toolbar/controls/BackgroundColorControl.vue +5 -26
  46. package/lib/components/toolbar/controls/CaseStyleControl.vue +10 -32
  47. package/lib/components/toolbar/controls/FontColorControl.vue +5 -27
  48. package/lib/components/toolbar/controls/FontFamilyControl.vue +27 -49
  49. package/lib/components/toolbar/controls/FontSizeControl.vue +9 -29
  50. package/lib/components/toolbar/controls/FontWeightControl.vue +7 -27
  51. package/lib/components/toolbar/controls/ItalicControl.vue +6 -27
  52. package/lib/components/toolbar/controls/LineHeightControl.vue +10 -37
  53. package/lib/components/toolbar/controls/ListControl.vue +18 -49
  54. package/lib/components/toolbar/controls/RemoveFormatControl.vue +4 -21
  55. package/lib/components/toolbar/controls/StrikeThroughControl.vue +5 -25
  56. package/lib/components/toolbar/controls/StylePresetControl.vue +34 -59
  57. package/lib/components/toolbar/controls/SuperscriptControl.vue +5 -25
  58. package/lib/components/toolbar/controls/UnderlineControl.vue +5 -26
  59. package/lib/components/toolbar/controls/__tests__/AlignmentControl.test.js +15 -13
  60. package/lib/components/toolbar/controls/__tests__/BackgroundColorControl.test.js +17 -15
  61. package/lib/components/toolbar/controls/__tests__/CaseStyleControl.test.js +9 -8
  62. package/lib/components/toolbar/controls/__tests__/FontColorControl.test.js +17 -15
  63. package/lib/components/toolbar/controls/__tests__/FontFamilyControl.test.js +14 -12
  64. package/lib/components/toolbar/controls/__tests__/FontSizeControl.test.js +5 -3
  65. package/lib/components/toolbar/controls/__tests__/FontWeightControl.test.js +3 -1
  66. package/lib/components/toolbar/controls/__tests__/ItalicControl.test.js +3 -1
  67. package/lib/components/toolbar/controls/__tests__/LineHeightControl.test.js +11 -9
  68. package/lib/components/toolbar/controls/__tests__/ListControl.test.js +16 -14
  69. package/lib/components/toolbar/controls/__tests__/RemoveFormatControl.test.js +3 -1
  70. package/lib/components/toolbar/controls/__tests__/StrikeThroughControl.test.js +3 -1
  71. package/lib/components/toolbar/controls/__tests__/StylePresetControl.test.js +3 -1
  72. package/lib/components/toolbar/controls/__tests__/SuperscriptControl.test.js +3 -1
  73. package/lib/components/toolbar/controls/__tests__/UnderlineControl.test.js +3 -1
  74. package/lib/components/toolbar/controls/composables/__tests__/useRecentFonts.test.js +6 -4
  75. package/lib/components/toolbar/controls/link/LinkControl.vue +75 -108
  76. package/lib/components/toolbar/controls/link/LinkControlHeader.vue +8 -14
  77. package/lib/components/toolbar/controls/link/__tests__/LinkControl.test.js +5 -3
  78. package/lib/components/toolbar/controls/link/__tests__/LinkControlHeader.test.js +3 -1
  79. package/lib/components/toolbar/controls/link/composables/__tests__/useLink.test.js +5 -4
  80. package/lib/components/toolbar/controls/link/destination/LinkControlDestination.vue +28 -47
  81. package/lib/components/toolbar/controls/link/destination/LinkControlPageBlock.vue +12 -20
  82. package/lib/components/toolbar/controls/link/destination/LinkControlUrl.vue +18 -26
  83. package/lib/components/toolbar/controls/link/destination/__tests__/LinkControlPageBlock.test.js +10 -10
  84. package/lib/components/toolbar/controls/link/destination/__tests__/LinkControlUrl.test.js +12 -10
  85. package/lib/components/toolbar/layouts/ToolbarDesktop.vue +36 -64
  86. package/lib/components/toolbar/layouts/ToolbarMobile.vue +38 -66
  87. package/lib/components/toolbar/layouts/ToolbarPopup.vue +36 -64
  88. package/lib/composables/__tests__/useEditor.test.js +3 -3
  89. package/lib/composables/useEditor.js +1 -1
  90. package/lib/directives/__tests__/outClick.test.js +9 -9
  91. package/lib/directives/outClick.js +3 -3
  92. package/lib/extensions/Alignment.js +1 -1
  93. package/lib/extensions/BackgroundColor.js +1 -1
  94. package/lib/extensions/CaseStyle.js +1 -1
  95. package/lib/extensions/DeviceManager.js +1 -1
  96. package/lib/extensions/FontColor.js +1 -1
  97. package/lib/extensions/FontFamily.js +2 -2
  98. package/lib/extensions/FontSize.js +3 -3
  99. package/lib/extensions/FontStyle.js +1 -1
  100. package/lib/extensions/FontWeight.js +1 -1
  101. package/lib/extensions/LineHeight.js +1 -1
  102. package/lib/extensions/Link.js +1 -1
  103. package/lib/extensions/Margin.js +1 -1
  104. package/lib/extensions/StylePreset.js +9 -9
  105. package/lib/extensions/Superscript.js +1 -1
  106. package/lib/extensions/TextDecoration.js +1 -1
  107. package/lib/extensions/__tests__/Alignment.test.js +1 -1
  108. package/lib/extensions/__tests__/BackgroundColor.test.js +1 -1
  109. package/lib/extensions/__tests__/CaseStyle.test.js +1 -1
  110. package/lib/extensions/__tests__/FontColor.test.js +1 -1
  111. package/lib/extensions/__tests__/FontFamily.test.js +1 -1
  112. package/lib/extensions/__tests__/FontSize.test.js +1 -1
  113. package/lib/extensions/__tests__/FontStyle.test.js +1 -1
  114. package/lib/extensions/__tests__/FontWeight.test.js +1 -1
  115. package/lib/extensions/__tests__/LineHeight.test.js +1 -1
  116. package/lib/extensions/__tests__/Link.test.js +1 -1
  117. package/lib/extensions/__tests__/StylePreset.test.js +1 -1
  118. package/lib/extensions/__tests__/Superscript.test.js +1 -1
  119. package/lib/extensions/__tests__/TextDecoration.test.js +1 -1
  120. package/lib/extensions/core/NodeProcessor.js +1 -1
  121. package/lib/extensions/core/SelectionProcessor.js +1 -1
  122. package/lib/extensions/core/TextProcessor.js +1 -1
  123. package/lib/extensions/core/__tests__/NodeProcessor.test.js +1 -1
  124. package/lib/extensions/core/__tests__/SelectionProcessor.test.js +1 -1
  125. package/lib/extensions/core/__tests__/TextProcessor.test.js +1 -1
  126. package/lib/extensions/core/index.js +1 -1
  127. package/lib/extensions/index.js +1 -1
  128. package/lib/extensions/list/List.js +4 -4
  129. package/lib/extensions/list/__tests__/List.test.js +1 -1
  130. package/package.json +19 -20
  131. package/config/jest/matchers/toVueEmpty.js +0 -16
  132. package/config/jest/matchers/toVuexActionHasBeenDispatched.js +0 -19
  133. package/lib/components/base/__tests__/__snapshots__/TextField.test.js.snap +0 -9
  134. package/lib/components/base/dropdown/__tests__/DropdownMenu.test.js +0 -67
@@ -7,61 +7,49 @@
7
7
  />
8
8
  </template>
9
9
 
10
- <script>
10
+ <script setup>
11
11
  import { computed } from 'vue';
12
12
  import { importIcon } from '../../utils';
13
13
 
14
- export default {
15
- name: 'Icon',
16
-
17
- props: {
18
- name: {
19
- type: String,
20
- required: true
21
- },
22
-
23
- size: {
24
- type: [String, Number],
25
- required: false,
26
- default: ''
27
- },
14
+ const props = defineProps({
15
+ name: {
16
+ type: String,
17
+ required: true
18
+ },
28
19
 
29
- autoColor: {
30
- type: Boolean,
31
- required: false,
32
- default: false
33
- }
20
+ size: {
21
+ type: [String, Number],
22
+ required: false,
23
+ default: ''
34
24
  },
35
25
 
36
- setup(props) {
37
- const source = computed(() => importIcon(props.name));
26
+ autoColor: {
27
+ type: Boolean,
28
+ required: false,
29
+ default: false
30
+ }
31
+ });
38
32
 
39
- const iconSize = computed(() => {
40
- if (isNaN(Number(props.size))) return props.size;
33
+ const source = computed(() => importIcon(props.name));
41
34
 
42
- return `${props.size}px`;
43
- });
35
+ const iconSize = computed(() => {
36
+ if (isNaN(Number(props.size))) return props.size;
44
37
 
45
- const iconStyles = computed(() => {
46
- if (!props.size) return null;
38
+ return `${props.size}px`;
39
+ });
47
40
 
48
- return {
49
- '--zw-icon-width': iconSize.value,
50
- '--zw-icon-height': iconSize.value
51
- };
52
- });
41
+ const iconStyles = computed(() => {
42
+ if (!props.size) return null;
53
43
 
54
- const iconClasses = computed(() => ({
55
- 'zw-icon--auto-color': props.autoColor
56
- }));
44
+ return {
45
+ '--zw-icon-width': iconSize.value,
46
+ '--zw-icon-height': iconSize.value
47
+ };
48
+ });
57
49
 
58
- return {
59
- source,
60
- iconStyles,
61
- iconClasses
62
- };
63
- }
64
- };
50
+ const iconClasses = computed(() => ({
51
+ 'zw-icon--auto-color': props.autoColor
52
+ }));
65
53
  </script>
66
54
 
67
55
  <style scoped>
@@ -1,95 +1,80 @@
1
1
  <template>
2
- <transition name="zw-modal-" :duration="$options.transition">
2
+ <transition name="zw-modal-" :duration="transition">
3
3
  <div
4
4
  class="zw-modal"
5
5
  ref="hostRef"
6
6
  tabindex="-1"
7
7
  :style="modalStyles"
8
8
  v-if="isOpened"
9
- v-out-click="close"
9
+ v-out-click="toggler.close"
10
+ data-test-selector="modal"
10
11
  >
11
12
  <slot />
12
13
  </div>
13
14
  </transition>
14
15
  </template>
15
16
 
16
- <script>
17
- import { computed, nextTick, ref, watch } from 'vue';
18
- import { outClick } from '../../directives';
17
+ <script setup>
18
+ import { computed, nextTick, ref, unref, watch } from 'vue';
19
+ import { outClick as vOutClick } from '../../directives';
19
20
  import { useDeselectionLock, useElementRef, useModalToggler } from './composables';
20
21
 
21
- export default {
22
- name: 'Modal',
22
+ const transition = {
23
+ enter: 200,
24
+ leave: 100
25
+ };
23
26
 
24
- transition: {
25
- enter: 200,
26
- leave: 100
27
+ const props = defineProps({
28
+ toggler: {
29
+ type: Object,
30
+ required: false,
31
+ default: null
27
32
  },
28
33
 
29
- directives: {
30
- outClick
34
+ maxHeight: {
35
+ type: [Number, String],
36
+ required: false,
37
+ default: 1000
31
38
  },
32
39
 
33
- props: {
34
- toggler: {
35
- type: Object,
36
- required: false,
37
- default: null
38
- },
39
-
40
- maxHeight: {
41
- type: [Number, String],
42
- required: false,
43
- default: 1000
44
- },
45
-
46
- maxWidth: {
47
- type: [Number, String],
48
- required: false,
49
- default: 1000
50
- },
51
-
52
- focusFirstControl: {
53
- type: Boolean,
54
- required: false,
55
- default: false
56
- }
40
+ maxWidth: {
41
+ type: [Number, String],
42
+ required: false,
43
+ default: 1000
57
44
  },
58
45
 
59
- setup(props) {
60
- const toggler = props.toggler || useModalToggler();
61
- const hostRef = ref(null);
62
- const hostEl = useElementRef(hostRef);
63
-
64
- const modalStyles = computed(() => ({
65
- '--zw-modal-max-height': `${props.maxHeight}px`,
66
- '--zw-modal-max-width': `${props.maxWidth}px`
67
- }));
68
-
69
- useDeselectionLock({
70
- isActiveRef: toggler.isOpened,
71
- hostRef
72
- });
73
-
74
- if (props.focusFirstControl) {
75
- watch(toggler.isOpened, async (_, wasOpened) => {
76
- if (wasOpened) return;
77
-
78
- await nextTick();
79
- const focusableEl = hostEl.value.querySelector(':where(a, button, input):not(:disabled, [data-initial-focus="false"])');
80
-
81
- (focusableEl || hostEl.value).focus();
82
- });
83
- }
84
-
85
- return {
86
- hostRef,
87
- modalStyles,
88
- close: toggler.close,
89
- isOpened: toggler.isOpened
90
- };
46
+ focusFirstControl: {
47
+ type: Boolean,
48
+ required: false,
49
+ default: false
91
50
  }
92
- };
51
+ });
52
+
53
+ const toggler = props.toggler || useModalToggler();
54
+ const isOpened = computed(() => unref(toggler.isOpened));
55
+ const hostRef = ref(null);
56
+ const hostEl = useElementRef(hostRef);
57
+
58
+ const modalStyles = computed(() => ({
59
+ '--zw-modal-max-height': `${props.maxHeight}px`,
60
+ '--zw-modal-max-width': `${props.maxWidth}px`
61
+ }));
62
+
63
+ useDeselectionLock({
64
+ isActiveRef: toggler.isOpened,
65
+ hostRef
66
+ });
67
+
68
+ if (props.focusFirstControl) {
69
+ watch(toggler.isOpened, async (_, wasOpened) => {
70
+ if (wasOpened) return;
71
+
72
+ await nextTick();
73
+ const focusableEl = hostEl.value.querySelector(':where(a, button, input):not(:disabled, [data-initial-focus="false"])');
74
+
75
+ (focusableEl || hostEl.value).focus();
76
+ });
77
+ }
93
78
  </script>
94
79
 
95
80
  <style scoped>
@@ -108,7 +93,7 @@ export default {
108
93
  transition: opacity 0.15s ease-out;
109
94
  }
110
95
 
111
- .zw-modal--enter,
96
+ .zw-modal--enter-from,
112
97
  .zw-modal--leave-to {
113
98
  opacity: 0;
114
99
  }
@@ -119,17 +104,17 @@ export default {
119
104
 
120
105
  /* Scrollbar overrides in modal */
121
106
 
122
- .zw-modal::v-deep .simplebar-offset,
123
- .zw-modal::v-deep .simplebar-mask {
107
+ .zw-modal:deep(.simplebar-offset),
108
+ .zw-modal:deep(.simplebar-mask) {
124
109
  position: initial;
125
110
  }
126
111
 
127
- .zw-modal::v-deep .simplebar-content {
112
+ .zw-modal:deep(.simplebar-content) {
128
113
  max-height: var(--zw-modal-max-height);
129
114
  padding: 0 !important;
130
115
  }
131
116
 
132
- .zw-modal::v-deep .simplebar-content-wrapper {
117
+ .zw-modal:deep(.simplebar-content-wrapper) {
133
118
  overscroll-behavior: contain;
134
119
  }
135
120
  </style>
@@ -35,95 +35,80 @@
35
35
  </label>
36
36
  </template>
37
37
 
38
- <script>
39
- import { computed, toRef } from 'vue';
38
+ <script setup>
39
+ import { computed, toRef, unref } from 'vue';
40
40
  import Button from './Button';
41
41
  import { useNumberValue } from './composables';
42
42
 
43
- export default {
44
- name: 'NumberField',
43
+ const props = defineProps({
44
+ value: {
45
+ required: true,
46
+ type: [Number, String]
47
+ },
48
+
49
+ min: {
50
+ type: [Number, String],
51
+ required: false,
52
+ default: null
53
+ },
54
+
55
+ max: {
56
+ type: [Number, String],
57
+ required: false,
58
+ default: null
59
+ },
60
+
61
+ digits: {
62
+ type: [Number, String],
63
+ required: false,
64
+ default: 2
65
+ },
45
66
 
46
- components: {
47
- Button
67
+ step: {
68
+ type: [Number, String],
69
+ required: false,
70
+ default: 1
48
71
  },
49
72
 
50
- props: {
51
- value: {
52
- required: true,
53
- type: [Number, String]
54
- },
55
-
56
- min: {
57
- type: [Number, String],
58
- required: false,
59
- default: null
60
- },
61
-
62
- max: {
63
- type: [Number, String],
64
- required: false,
65
- default: null
66
- },
67
-
68
- digits: {
69
- type: [Number, String],
70
- required: false,
71
- default: 2
72
- },
73
-
74
- step: {
75
- type: [Number, String],
76
- required: false,
77
- default: 1
78
- },
79
-
80
- units: {
81
- type: String,
82
- required: false,
83
- default: ''
84
- },
85
-
86
- disabled: {
87
- type: Boolean,
88
- required: false,
89
- default: false
90
- },
91
-
92
- fieldId: {
93
- type: String,
94
- required: false,
95
- default: ''
96
- }
73
+ units: {
74
+ type: String,
75
+ required: false,
76
+ default: ''
97
77
  },
98
78
 
99
- setup(props, { emit }) {
100
- const toOptionalNumber = (number) => number === null ? null : Number(number);
101
-
102
- const numberValue = useNumberValue({
103
- valueRef: toRef(props, 'value'),
104
- onChange: (value) => emit('input', value),
105
- digits: Number(props.digits),
106
- min: toOptionalNumber(props.min),
107
- max: toOptionalNumber(props.max)
108
- });
109
-
110
- const onChange = (event) => numberValue.change(event.target.value);
111
- const incrementValue = () => numberValue.increment(Number(props.step));
112
- const decrementValue = () => numberValue.decrement(Number(props.step));
113
-
114
- const elementClasses = computed(() => ({
115
- 'zw-number-field--disabled': props.disabled
116
- }));
117
-
118
- return {
119
- elementClasses,
120
- tempValue: numberValue.temp,
121
- onChange,
122
- incrementValue,
123
- decrementValue
124
- };
79
+ disabled: {
80
+ type: Boolean,
81
+ required: false,
82
+ default: false
83
+ },
84
+
85
+ fieldId: {
86
+ type: String,
87
+ required: false,
88
+ default: ''
125
89
  }
126
- };
90
+ });
91
+
92
+ const emit = defineEmits(['input']);
93
+
94
+ const toOptionalNumber = (number) => number === null ? null : Number(number);
95
+
96
+ const numberValue = useNumberValue({
97
+ valueRef: toRef(props, 'value'),
98
+ onChange: (value) => emit('input', value),
99
+ digits: Number(props.digits),
100
+ min: toOptionalNumber(props.min),
101
+ max: toOptionalNumber(props.max)
102
+ });
103
+
104
+ const onChange = (event) => numberValue.change(event.target.value);
105
+ const incrementValue = () => numberValue.increment(Number(props.step));
106
+ const decrementValue = () => numberValue.decrement(Number(props.step));
107
+ const tempValue = computed(() => unref(numberValue.temp.value));
108
+
109
+ const elementClasses = computed(() => ({
110
+ 'zw-number-field--disabled': props.disabled
111
+ }));
127
112
  </script>
128
113
 
129
114
  <style scoped>
@@ -12,68 +12,58 @@
12
12
  >
13
13
  </template>
14
14
 
15
- <script>
15
+ <script setup>
16
16
  import { computed, toRef } from 'vue';
17
17
  import { useTempValue } from './composables';
18
18
 
19
- export default {
20
- name: 'Range',
21
-
22
- props: {
23
- min: {
24
- type: [String, Number],
25
- required: true
26
- },
27
-
28
- max: {
29
- type: [String, Number],
30
- required: true
31
- },
32
-
33
- step: {
34
- type: [String, Number],
35
- required: true
36
- },
37
-
38
- value: {
39
- type: [String, Number],
40
- required: true
41
- },
42
-
43
- fieldId: {
44
- type: String,
45
- required: false,
46
- default: ''
47
- }
19
+ const props = defineProps({
20
+ min: {
21
+ type: [String, Number],
22
+ required: true
48
23
  },
49
24
 
50
- setup(props, { emit }) {
51
- const tempValue = useTempValue({
52
- valueRef: toRef(props, 'value'),
53
- format: Number
54
- });
55
- const inputStyles = computed(() => {
56
- const min = Number(props.min);
57
- const max = Number(props.max);
58
- const step = Number(props.step);
59
- const value = Math.ceil(tempValue.value / step) * step;
60
- const progress = (value - min) / (max - min);
61
-
62
- return { '--zw-range-progress': `${progress * 100}%` };
63
- });
64
-
65
- function update(event) {
66
- tempValue.value = Number(event.target.value);
67
- emit('input', tempValue.value);
68
- }
69
-
70
- return {
71
- inputStyles,
72
- tempValue,
73
- update
74
- };
25
+ max: {
26
+ type: [String, Number],
27
+ required: true
28
+ },
29
+
30
+ step: {
31
+ type: [String, Number],
32
+ required: true
33
+ },
34
+
35
+ value: {
36
+ type: [String, Number],
37
+ required: true
38
+ },
39
+
40
+ fieldId: {
41
+ type: String,
42
+ required: false,
43
+ default: ''
75
44
  }
76
- };
45
+ });
46
+
47
+ const emit = defineEmits(['input']);
48
+
49
+ const tempValue = useTempValue({
50
+ valueRef: toRef(props, 'value'),
51
+ format: Number
52
+ });
53
+ const inputStyles = computed(() => {
54
+ const min = Number(props.min);
55
+ const max = Number(props.max);
56
+ const step = Number(props.step);
57
+ const value = Math.ceil(tempValue.value / step) * step;
58
+ const progress = (value - min) / (max - min);
59
+
60
+ return { '--zw-range-progress': `${progress * 100}%` };
61
+ });
62
+
63
+ function update(event) {
64
+ tempValue.value = Number(event.target.value);
65
+ emit('input', tempValue.value);
66
+ }
77
67
  </script>
78
68
 
79
69
  <style scoped>
@@ -4,48 +4,40 @@
4
4
  </div>
5
5
  </template>
6
6
 
7
- <script>
7
+ <script setup>
8
8
  import SimpleBar from 'simplebar';
9
9
  import { onMounted, provide, ref } from 'vue';
10
10
  import { SCROLL_VIEW } from './composables';
11
11
 
12
- export default {
13
- name: 'ScrollView',
12
+ const hostRef = ref(null);
13
+ const scrollerRef = ref(null);
14
14
 
15
- setup() {
16
- const hostRef = ref(null);
17
- const scrollerRef = ref(null);
15
+ provide(SCROLL_VIEW, scrollerRef);
18
16
 
19
- provide(SCROLL_VIEW, scrollerRef);
17
+ onMounted(() => {
18
+ const options = SimpleBar.getOptions(hostRef.value.attributes);
19
+ const simpleBar = new SimpleBar(hostRef.value, options);
20
20
 
21
- onMounted(() => {
22
- const options = SimpleBar.getOptions(hostRef.value.attributes);
23
- const simpleBar = new SimpleBar(hostRef.value, options);
24
-
25
- scrollerRef.value = simpleBar.getScrollElement();
26
- });
27
-
28
- return { hostRef };
29
- }
30
- };
21
+ scrollerRef.value = simpleBar.getScrollElement();
22
+ });
31
23
  </script>
32
24
 
33
25
  <style scoped>
34
- .zw-scroll-view::v-deep .simplebar-placeholder {
26
+ .zw-scroll-view:deep(.simplebar-placeholder) {
35
27
  display: none;
36
28
  }
37
29
 
38
- .zw-scroll-view::v-deep .simplebar-track {
30
+ .zw-scroll-view:deep(.simplebar-track) {
39
31
  width: 4px;
40
32
  background-color: rgb(var(--zw-color-n20));
41
33
  pointer-events: initial;
42
34
  }
43
35
 
44
- .zw-scroll-view::v-deep .simplebar-scrollbar {
36
+ .zw-scroll-view:deep(.simplebar-scrollbar) {
45
37
  width: 4px;
46
38
  }
47
39
 
48
- .zw-scroll-view::v-deep .simplebar-scrollbar::before {
40
+ .zw-scroll-view:deep(.simplebar-scrollbar::before) {
49
41
  top: 0;
50
42
  left: 0;
51
43
  background-color: rgb(var(--zw-color-n5));
@@ -20,45 +20,40 @@
20
20
  </div>
21
21
  </template>
22
22
 
23
- <script>
23
+ <script setup>
24
24
  import { computed } from 'vue';
25
25
 
26
- export default {
27
- name: 'TextField',
28
-
29
- props: {
30
- value: {
31
- type: [Number, String],
32
- required: true
33
- },
34
-
35
- label: {
36
- type: String,
37
- required: true
38
- },
39
-
40
- placeholder: {
41
- type: String,
42
- required: false,
43
- default: ''
44
- },
45
-
46
- error: {
47
- type: String,
48
- required: false,
49
- default: null
50
- }
26
+ const props = defineProps({
27
+ value: {
28
+ type: [Number, String],
29
+ required: true
51
30
  },
52
31
 
53
- setup(props, { emit }) {
54
- const onInput = (event) => emit('input', event.target.value);
55
- const fieldId = computed(() => {
56
- return props.label.toLowerCase().replace(/[^a-zA-Z0-9]+(.)/g, (m, chr) => chr.toUpperCase());
57
- });
32
+ label: {
33
+ type: String,
34
+ required: true
35
+ },
36
+
37
+ placeholder: {
38
+ type: String,
39
+ required: false,
40
+ default: ''
41
+ },
58
42
 
59
- return { onInput, fieldId };
43
+ error: {
44
+ type: String,
45
+ required: false,
46
+ default: null
60
47
  }
61
- };
48
+ });
49
+
50
+ const emit = defineEmits(['input']);
51
+
52
+ const onInput = (event) => emit('input', event.target.value);
53
+
54
+ const fieldId = computed(() => {
55
+ return props.label.toLowerCase().replace(/[^a-zA-Z0-9]+(.)/g, (m, chr) => chr.toUpperCase());
56
+ });
62
57
  </script>
63
58
 
64
59
  <style scoped>
@@ -3,7 +3,7 @@ import Button from '../Button';
3
3
 
4
4
  function createComponent({ skin, active, icon } = {}) {
5
5
  return shallowMount(Button, {
6
- propsData: {
6
+ props: {
7
7
  skin: skin ?? 'none',
8
8
  active: active ?? false,
9
9
  icon: icon ?? false