vgapp 1.2.5 → 1.2.6

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 (42) hide show
  1. package/CHANGELOG.md +58 -35
  2. package/agents.md +2 -2
  3. package/app/modules/base-module.js +87 -10
  4. package/app/modules/vgalert/js/vgalert.js +3 -3
  5. package/app/modules/vgdynamictable/index.js +5 -0
  6. package/app/modules/vgdynamictable/js/editable.js +438 -0
  7. package/app/modules/vgdynamictable/js/expandable.js +248 -0
  8. package/app/modules/vgdynamictable/js/filters.js +450 -0
  9. package/app/modules/vgdynamictable/js/fixed.js +566 -0
  10. package/app/modules/vgdynamictable/js/options.js +646 -0
  11. package/app/modules/vgdynamictable/js/pagination.js +623 -0
  12. package/app/modules/vgdynamictable/js/search.js +82 -0
  13. package/app/modules/vgdynamictable/js/skeleton.js +136 -0
  14. package/app/modules/vgdynamictable/js/sortable.js +442 -0
  15. package/app/modules/vgdynamictable/js/summary-footer.js +284 -0
  16. package/app/modules/vgdynamictable/js/table-remote.js +821 -0
  17. package/app/modules/vgdynamictable/js/table-state.js +243 -0
  18. package/app/modules/vgdynamictable/js/table-url-state.js +444 -0
  19. package/app/modules/vgdynamictable/js/utils/common.js +48 -0
  20. package/app/modules/vgdynamictable/js/vgdynamictable.js +3829 -0
  21. package/app/modules/vgdynamictable/js/viewport.js +322 -0
  22. package/app/modules/vgdynamictable/readme.md +251 -0
  23. package/app/modules/vgdynamictable/scss/_actions.scss +193 -0
  24. package/app/modules/vgdynamictable/scss/_pagination.scss +183 -0
  25. package/app/modules/vgdynamictable/scss/_skeleton.scss +60 -0
  26. package/app/modules/vgdynamictable/scss/_sortable.scss +63 -0
  27. package/app/modules/vgdynamictable/scss/_table.scss +157 -0
  28. package/app/modules/vgdynamictable/scss/_variables.scss +130 -0
  29. package/app/modules/vgdynamictable/scss/vgdynamictable.scss +267 -0
  30. package/app/modules/vgrangeslider/index.js +3 -0
  31. package/app/modules/vgrangeslider/js/skins.js +222 -0
  32. package/app/modules/vgrangeslider/js/vgrangeslider.js +704 -0
  33. package/app/modules/vgrangeslider/readme.md +523 -0
  34. package/app/modules/vgrangeslider/scss/_variables.scss +53 -0
  35. package/app/modules/vgrangeslider/scss/vgrangeslider.scss +240 -0
  36. package/app/utils/js/components/ajax.js +116 -7
  37. package/build/vgapp.css +2 -3246
  38. package/build/vgapp.css.map +1 -1
  39. package/build/vgapp.js +2 -30
  40. package/index.js +2 -0
  41. package/index.scss +6 -0
  42. package/package.json +1 -1
@@ -0,0 +1,130 @@
1
+ $spacer: 1rem !default;
2
+ $spacers: (
3
+ 0: 0,
4
+ 1: $spacer * .25,
5
+ 2: $spacer * .5,
6
+ 3: $spacer,
7
+ 4: $spacer * 1.5,
8
+ 5: $spacer * 3,
9
+ ) !default;
10
+
11
+ $sizes-0: map-get($spacers, 0);
12
+ $sizes-1: map-get($spacers, 1);
13
+ $sizes-2: map-get($spacers, 2);
14
+ $sizes-3: map-get($spacers, 3);
15
+ $sizes-4: map-get($spacers, 4);
16
+ $sizes-5: map-get($spacers, 5);
17
+
18
+ $dynamic-table-map: (
19
+ wrap: (
20
+ border-radius: 14px,
21
+ box-shadow: none,
22
+ border-width: 1px,
23
+ background: transparent,
24
+ border-color: transparent,
25
+ ),
26
+ cell: (
27
+ padding: $sizes-3 $sizes-4,
28
+ font-size: $sizes-3,
29
+ row-content-height: 20px,
30
+ border-color: transparent,
31
+ text-color: #1f1f1f,
32
+ ),
33
+ header: (
34
+ font-weight: 600,
35
+ background: #f7f4ef,
36
+ text-color: #1f1f1f,
37
+ ),
38
+ bordered: (
39
+ border-width: 1px,
40
+ border-color: rgba(0, 0, 0, 0.1),
41
+ ),
42
+ striped: (
43
+ background: rgba(0, 0, 0, 0.03),
44
+ ),
45
+ hover: (
46
+ background: rgba(0, 0, 0, 0.05),
47
+ ),
48
+ table: (
49
+ min-width: 640px,
50
+ ),
51
+ table-sm: (
52
+ padding: $sizes-1 $sizes-2,
53
+ ),
54
+ table-md: (
55
+ padding: $sizes-2 $sizes-3,
56
+ ),
57
+ table-lg: (
58
+ padding: $sizes-3 $sizes-4,
59
+ ),
60
+ table-xl: (
61
+ padding: $sizes-4 $sizes-5,
62
+ ),
63
+ pagination: (
64
+ padding-y: 12px,
65
+ padding-x: 14px,
66
+ gap: 12px,
67
+ toolbar-radius: 12px,
68
+ toolbar-padding-y: 8px,
69
+ toolbar-padding-x: 10px,
70
+ label-size: 13px,
71
+ per-page-gap: 8px,
72
+ pages-gap: 6px,
73
+ button-size: 36px,
74
+ button-radius: 10px,
75
+ button-padding: 0 10px,
76
+ button-font-size: 13px,
77
+ button-line-height: 2,
78
+ button-disabled-opacity: 0.45,
79
+ per-page-radius: 10px,
80
+ per-page-height: 36px,
81
+ per-page-padding-x: 10px,
82
+ jump-width: 64px,
83
+ jump-gap: 6px,
84
+ jump-button-min-width: 54px,
85
+ border-color: rgba(0, 0, 0, 0.08),
86
+ toolbar-bg: #faf8f4,
87
+ label-color: #5f5a52,
88
+ button-border: 1px solid rgba(0, 0, 0, 0.12),
89
+ button-border-color: rgba(0, 0, 0, 0.12),
90
+ button-bg: #ffffff,
91
+ button-text: #2e2a24,
92
+ button-hover-bg: #f1ece4,
93
+ button-hover-border: rgba(0, 0, 0, 0.2),
94
+ button-active-bg: #24201b,
95
+ button-active-text: #ffffff,
96
+ button-active-border: #24201b,
97
+ per-page-bg: #ffffff,
98
+ per-page-border-color: rgba(0, 0, 0, 0.12),
99
+ per-page-text: #2e2a24,
100
+ ),
101
+ sortable: (
102
+ header-padding-right: 1.8rem,
103
+ controls-right: 0.6rem,
104
+ controls-gap: 0,
105
+ arrow-width: 14px,
106
+ arrow-height: 10px,
107
+ arrow-line-height: 0.7rem,
108
+ arrow-font-size: 0.55rem,
109
+ arrow-opacity: 0.35,
110
+ arrow-active-opacity: 1,
111
+ arrow-color: currentColor,
112
+ column-highlight-background: rgba(191, 153, 92, 0.14),
113
+ ),
114
+ fixed: (
115
+ shadow-width: 14px,
116
+ shadow-color: rgba(0, 0, 0, 0.16),
117
+ cell-background: rgba(247, 244, 239, 0.92),
118
+ ),
119
+ skeleton: (
120
+ padding: 12px 14px,
121
+ line-height: 10px,
122
+ radius: 999px,
123
+ duration: 1.2s,
124
+ row-bg: rgba(255, 255, 255, 0.5),
125
+ border-color: rgba(0, 0, 0, 0.04),
126
+ glow: rgba(255, 255, 255, 0.55),
127
+ gradient-1: #ebe6df,
128
+ gradient-2: #f5f1ea,
129
+ ),
130
+ );
@@ -0,0 +1,267 @@
1
+ /**
2
+ *--------------------------------------------------------------------------
3
+ * Модуль: VGDynamicTable
4
+ * Автор: Vegas DEV
5
+ * Лицензия: смотри LICENSE
6
+ *--------------------------------------------------------------------------
7
+ **/
8
+
9
+ @import "../../../utils/scss/functions";
10
+ @import "../../../utils/scss/mixin";
11
+ @import "../../../utils/scss/variables";
12
+ @import "variables";
13
+
14
+ .vg-dynamic-table {
15
+ @include mix-vars('dynamic-table', $dynamic-table-map);
16
+ background: var(--vg-dynamic-table-wrap-background);
17
+ border-radius: var(--vg-dynamic-table-wrap-border-radius);
18
+ box-shadow: var(--vg-dynamic-table-wrap-box-shadow);
19
+ overflow: visible;
20
+ border: var(--vg-dynamic-table-wrap-border-width) solid var(--vg-dynamic-table-wrap-border-color);
21
+
22
+ .vgdt-table-viewport {
23
+ overflow-x: auto;
24
+ overflow-y: visible;
25
+ border-radius: var(--vg-dynamic-table-wrap-border-radius);
26
+ scrollbar-width: thin;
27
+ scrollbar-color: var(--vg-dynamic-table-cell-border-color) transparent;
28
+
29
+ &::-webkit-scrollbar {
30
+ height: 10px;
31
+ }
32
+
33
+ &::-webkit-scrollbar-track {
34
+ background: transparent;
35
+ }
36
+
37
+ &::-webkit-scrollbar-thumb {
38
+ background: var(--vg-dynamic-table-cell-border-color);
39
+ border-radius: 999px;
40
+ border: 2px solid transparent;
41
+ background-clip: padding-box;
42
+ }
43
+
44
+ &::-webkit-scrollbar-thumb:hover {
45
+ background: var(--vg-dynamic-table-header-text-color);
46
+ background-clip: padding-box;
47
+ }
48
+
49
+ &.vgdt-pan-enabled {
50
+ touch-action: pan-x pan-y;
51
+ }
52
+
53
+ &.is-panning {
54
+ cursor: grabbing;
55
+ user-select: none;
56
+ }
57
+ }
58
+
59
+ @import "pagination";
60
+ @import "sortable";
61
+ @import "table";
62
+ @import "skeleton";
63
+ @import "actions";
64
+
65
+ &.table-striped {
66
+ tbody {
67
+ tr:nth-of-type(odd) {
68
+ background-color: var(--vg-dynamic-table-striped-background);
69
+ }
70
+
71
+ tr[data-virtual-spacer="1"] {
72
+ background-color: transparent;
73
+ }
74
+ }
75
+
76
+ tbody tr:nth-of-type(odd) td[data-fixed-side][data-fixed-overlap="1"] {
77
+ background: var(--vg-dynamic-table-striped-background);
78
+ }
79
+ }
80
+
81
+ tbody tr[data-virtual-spacer="1"] > td {
82
+ padding: 0;
83
+ border: 0;
84
+ height: 0;
85
+ background: transparent;
86
+ line-height: 0;
87
+ pointer-events: none;
88
+ }
89
+
90
+ &.table-bordered {
91
+ border: var(--vg-dynamic-table-bordered-border-width) solid var(--vg-dynamic-table-bordered-border-color);
92
+ border-collapse: separate;
93
+ border-spacing: 0;
94
+
95
+ th,
96
+ td {
97
+ border-top: var(--vg-dynamic-table-bordered-border-width) solid var(--vg-dynamic-table-bordered-border-color);
98
+ border-left: var(--vg-dynamic-table-bordered-border-width) solid var(--vg-dynamic-table-bordered-border-color);
99
+ }
100
+
101
+ tr:first-child {
102
+ th {
103
+ border-top: 0;
104
+ }
105
+ }
106
+
107
+ tr {
108
+ th:first-child,
109
+ td:first-child {
110
+ border-left: 0;
111
+ }
112
+ }
113
+ }
114
+
115
+ &.table-hover {
116
+ tbody {
117
+ tr:hover {
118
+ background-color: var(--vg-dynamic-table-hover-background);
119
+ }
120
+
121
+ tr:hover td[data-fixed-side] {
122
+ background: var(--vg-dynamic-table-hover-background);
123
+ }
124
+ }
125
+ }
126
+
127
+ &.table-sm {
128
+ th,
129
+ td {
130
+ padding: var(--vg-dynamic-table-table-sm-padding);
131
+ }
132
+ }
133
+
134
+ &.table-md {
135
+ th,
136
+ td {
137
+ padding: var(--vg-dynamic-table-table-md-padding);
138
+ }
139
+ }
140
+
141
+ &.table-lg {
142
+ th,
143
+ td {
144
+ padding: var(--vg-dynamic-table-table-lg-padding);
145
+ }
146
+ }
147
+
148
+ &.table-xl {
149
+ th,
150
+ td {
151
+ padding: var(--vg-dynamic-table-table-xl-padding);
152
+ }
153
+ }
154
+
155
+ &.table-sticky-head {
156
+ overflow: visible;
157
+
158
+ .vgdt-table-viewport > table {
159
+ thead th {
160
+ position: sticky;
161
+ top: var(--vgdt-sticky-top, 0px);
162
+ z-index: 3;
163
+ background: var(--vg-dynamic-table-header-background);
164
+ box-shadow: 0 1px 0 var(--vg-dynamic-table-cell-border-color);
165
+ }
166
+
167
+ thead th[data-fixed-side] {
168
+ z-index: 6;
169
+ }
170
+
171
+ thead th[data-sorted-column="1"] {
172
+ background: var(--vg-dynamic-table-sortable-column-highlight-background);
173
+ }
174
+
175
+ }
176
+
177
+ .vgdt-table-viewport.table-sticky-scroll {
178
+ max-height: var(--vgdt-sticky-max-height, 0px);
179
+ overflow: auto;
180
+ }
181
+ }
182
+
183
+ &.table-sticky-clone {
184
+ overflow: visible;
185
+
186
+ .vgdt-sticky-clone {
187
+ position: sticky;
188
+ top: var(--vgdt-sticky-top, 0px);
189
+ z-index: 4;
190
+ overflow: hidden;
191
+ margin-bottom: 0;
192
+ border-top-left-radius: var(--vg-dynamic-table-wrap-border-radius);
193
+ border-top-right-radius: var(--vg-dynamic-table-wrap-border-radius);
194
+ background: var(--vg-dynamic-table-header-background);
195
+ box-shadow: 0 1px 0 var(--vg-dynamic-table-cell-border-color);
196
+ }
197
+
198
+ .vgdt-sticky-clone__table {
199
+ border-collapse: separate;
200
+ border-spacing: 0;
201
+ margin: 0;
202
+ min-width: var(--vg-dynamic-table-table-min-width);
203
+ will-change: transform;
204
+ }
205
+
206
+ .vgdt-sticky-clone th,
207
+ .vgdt-sticky-clone td {
208
+ text-align: left;
209
+ padding: var(--vg-dynamic-table-cell-padding);
210
+ border-bottom: 1px solid var(--vg-dynamic-table-cell-border-color);
211
+ font-size: var(--vg-dynamic-table-cell-font-size);
212
+ line-height: var(--vg-dynamic-table-cell-row-content-height);
213
+ color: var(--vg-dynamic-table-header-text-color);
214
+ background: var(--vg-dynamic-table-header-background);
215
+ font-weight: var(--vg-dynamic-table-header-font-weight);
216
+ }
217
+
218
+ .vgdt-sticky-clone th[data-sorted-column="1"] {
219
+ background: var(--vg-dynamic-table-sortable-column-highlight-background);
220
+ }
221
+
222
+ .vgdt-sticky-clone th[data-fixed-side] {
223
+ position: relative;
224
+ z-index: 6;
225
+ will-change: transform;
226
+ }
227
+
228
+ .vgdt-sticky-clone th[data-fixed-edge="right"][data-fixed-shadow="1"]::after,
229
+ .vgdt-sticky-clone th[data-fixed-edge="left"][data-fixed-shadow="1"]::before {
230
+ content: '';
231
+ position: absolute;
232
+ top: 0;
233
+ bottom: -1px;
234
+ width: var(--vg-dynamic-table-fixed-shadow-width);
235
+ pointer-events: none;
236
+ }
237
+
238
+ .vgdt-sticky-clone th[data-fixed-edge="right"][data-fixed-shadow="1"]::after {
239
+ right: calc(-1 * var(--vg-dynamic-table-fixed-shadow-width));
240
+ background: linear-gradient(to right, var(--vg-dynamic-table-fixed-shadow-color), transparent);
241
+ }
242
+
243
+ .vgdt-sticky-clone th[data-fixed-edge="left"][data-fixed-shadow="1"]::before {
244
+ left: calc(-1 * var(--vg-dynamic-table-fixed-shadow-width));
245
+ background: linear-gradient(to left, var(--vg-dynamic-table-fixed-shadow-color), transparent);
246
+ }
247
+
248
+ .vgdt-sticky-clone thead tr:first-child th:first-child {
249
+ border-top-left-radius: var(--vg-dynamic-table-wrap-border-radius);
250
+ }
251
+
252
+ .vgdt-sticky-clone thead tr:first-child th:last-child {
253
+ border-top-right-radius: var(--vg-dynamic-table-wrap-border-radius);
254
+ }
255
+
256
+ .vgdt-table-viewport.table-sticky-scroll {
257
+ max-height: var(--vgdt-sticky-max-height, 0px);
258
+ overflow: auto;
259
+ }
260
+
261
+ .vgdt-table-viewport > table {
262
+ margin-top: calc(-1 * var(--vgdt-sticky-clone-height, 0px));
263
+ }
264
+ }
265
+
266
+ }
267
+
@@ -0,0 +1,3 @@
1
+ import VGRangeSlider from './js/vgrangeslider';
2
+
3
+ export default VGRangeSlider;
@@ -0,0 +1,222 @@
1
+ const SKIN_CLASS_DEFAULT = 'is-skin-default';
2
+ const SKIN_CLASS_RULER = 'is-skin-ruler';
3
+ const SKIN_CLASS_STATUS = 'is-skin-status';
4
+ const SKIN_CLASS_RULER_DIM = 'is-ruler-dim-inactive';
5
+ const STATUS_CLASS_SUCCESS = 'is-status-success';
6
+ const STATUS_CLASS_WARNING = 'is-status-warning';
7
+ const STATUS_CLASS_DANGER = 'is-status-danger';
8
+
9
+ const STATUS_CLASSES = [
10
+ STATUS_CLASS_SUCCESS,
11
+ STATUS_CLASS_WARNING,
12
+ STATUS_CLASS_DANGER,
13
+ ];
14
+
15
+ const resolveStatusToneByValue = (value, params, state) => {
16
+ const span = state.max - state.min;
17
+ const percent = span > 0 ? ((value - state.min) / span) * 100 : 0;
18
+ const warningBelow = Number(params?.status?.warningBelow);
19
+ const dangerBelow = Number(params?.status?.dangerBelow);
20
+ const warningThreshold = Number.isFinite(warningBelow) ? warningBelow : 60;
21
+ const dangerThreshold = Number.isFinite(dangerBelow) ? dangerBelow : 30;
22
+
23
+ if (percent < dangerThreshold) {
24
+ return 'danger';
25
+ }
26
+
27
+ if (percent < warningThreshold) {
28
+ return 'warning';
29
+ }
30
+
31
+ return 'success';
32
+ };
33
+
34
+ const resolveStatusSourceValue = (params, state, helpers) => {
35
+ if (!helpers.isRange) {
36
+ return state.from;
37
+ }
38
+
39
+ const by = typeof params?.status?.by === 'string'
40
+ ? params.status.by.toLowerCase()
41
+ : 'to';
42
+
43
+ if (by === 'from') {
44
+ return state.from;
45
+ }
46
+
47
+ if (by === 'avg') {
48
+ return (state.from + state.to) / 2;
49
+ }
50
+
51
+ return state.to;
52
+ };
53
+
54
+ const buildRulerValues = (params, state) => {
55
+ if (Array.isArray(params?.ruler?.values) && params.ruler.values.length > 0) {
56
+ return params.ruler.values
57
+ .map(value => Number(value))
58
+ .filter(value => Number.isFinite(value))
59
+ .sort((a, b) => a - b);
60
+ }
61
+
62
+ const count = Math.max(2, Number(params?.ruler?.count) || 6);
63
+ const span = state.max - state.min;
64
+ const step = span / (count - 1);
65
+ const values = [];
66
+
67
+ for (let index = 0; index < count; index++) {
68
+ const value = index === count - 1 ? state.max : state.min + (step * index);
69
+ values.push(Number(value.toFixed(5)));
70
+ }
71
+
72
+ return values;
73
+ };
74
+
75
+ const createRulerSkin = (root, params, state, formatValue, toPositionPx) => {
76
+ const values = buildRulerValues(params, state);
77
+ const ruler = document.createElement('div');
78
+ ruler.className = 'vg-range-slider__ruler';
79
+
80
+ if (params?.ruler?.dimInactive === true) {
81
+ root.classList.add(SKIN_CLASS_RULER_DIM);
82
+ }
83
+
84
+ const ticks = values.map((value) => {
85
+ const item = document.createElement('span');
86
+ item.className = 'vg-range-slider__ruler-item';
87
+ item.style.left = `${toPositionPx(value)}px`;
88
+ item.dataset.value = String(value);
89
+
90
+ const mark = document.createElement('span');
91
+ mark.className = 'vg-range-slider__ruler-mark';
92
+ item.appendChild(mark);
93
+
94
+ if (params?.ruler?.labels !== false) {
95
+ const label = document.createElement('span');
96
+ label.className = 'vg-range-slider__ruler-label';
97
+ label.textContent = formatValue(value);
98
+ item.appendChild(label);
99
+ }
100
+
101
+ ruler.appendChild(item);
102
+ return item;
103
+ });
104
+
105
+ root.appendChild(ruler);
106
+
107
+ return {
108
+ type: 'ruler',
109
+ root: ruler,
110
+ ticks,
111
+ values,
112
+ };
113
+ };
114
+
115
+ const resolveStatusTone = (params, state, helpers) => {
116
+ const value = resolveStatusSourceValue(params, state, helpers);
117
+ return resolveStatusToneByValue(value, params, state);
118
+ };
119
+
120
+ const syncStatusClasses = (root, tone) => {
121
+ root.classList.remove(...STATUS_CLASSES);
122
+
123
+ if (tone === 'danger') {
124
+ root.classList.add(STATUS_CLASS_DANGER);
125
+ return;
126
+ }
127
+
128
+ if (tone === 'warning') {
129
+ root.classList.add(STATUS_CLASS_WARNING);
130
+ return;
131
+ }
132
+
133
+ root.classList.add(STATUS_CLASS_SUCCESS);
134
+ };
135
+
136
+ const resolveStatusLabel = (params, tone) => {
137
+ if (!Array.isArray(params?.labelWords) || params.labelWords.length < 3) {
138
+ return null;
139
+ }
140
+
141
+ if (tone === 'danger') {
142
+ return params.labelWords[0] || null;
143
+ }
144
+
145
+ if (tone === 'warning') {
146
+ return params.labelWords[1] || null;
147
+ }
148
+
149
+ return params.labelWords[2] || null;
150
+ };
151
+
152
+ const syncStatusLabels = (params, state, helpers) => {
153
+ const labelFrom = helpers?.dom?.labelFrom;
154
+ const labelTo = helpers?.dom?.labelTo;
155
+ const fromLabel = resolveStatusLabel(params, resolveStatusToneByValue(state.from, params, state));
156
+ const toLabel = resolveStatusLabel(params, resolveStatusToneByValue(state.to, params, state));
157
+
158
+ if (labelFrom && fromLabel) {
159
+ labelFrom.textContent = fromLabel;
160
+ }
161
+
162
+ if (labelTo && toLabel) {
163
+ labelTo.textContent = toLabel;
164
+ }
165
+ };
166
+
167
+ const applyRangeSliderSkin = (root, params, state, helpers) => {
168
+ root.classList.add(SKIN_CLASS_DEFAULT);
169
+
170
+ if (params.skin === 'ruler') {
171
+ root.classList.add(SKIN_CLASS_RULER);
172
+ return createRulerSkin(root, params, state, helpers.formatValue, helpers.toPositionPx);
173
+ }
174
+
175
+ if (params.skin === 'status') {
176
+ root.classList.add(SKIN_CLASS_STATUS);
177
+ syncStatusClasses(root, resolveStatusTone(params, state, helpers));
178
+
179
+ return {
180
+ type: 'status',
181
+ root,
182
+ };
183
+ }
184
+
185
+ if (params.skin !== 'default') {
186
+ return null;
187
+ }
188
+
189
+ return null;
190
+ };
191
+
192
+ const syncRangeSliderSkin = (skin, state, helpers) => {
193
+ if (!skin) {
194
+ return;
195
+ }
196
+
197
+ if (skin.type === 'status') {
198
+ syncStatusClasses(skin.root, resolveStatusTone(helpers.params, state, helpers));
199
+ syncStatusLabels(helpers.params, state, helpers);
200
+ return;
201
+ }
202
+
203
+ if (skin.type !== 'ruler') {
204
+ return;
205
+ }
206
+
207
+ const isRange = state.from !== state.to || helpers.isRange;
208
+
209
+ skin.ticks.forEach((tick, index) => {
210
+ const value = skin.values[index];
211
+ const isActive = isRange
212
+ ? value >= state.from && value <= state.to
213
+ : value <= state.from;
214
+
215
+ tick.classList.toggle('is-active', isActive);
216
+ });
217
+ };
218
+
219
+ export {
220
+ applyRangeSliderSkin,
221
+ syncRangeSliderSkin,
222
+ };