@omnisass/library 0.2.0 → 0.3.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.
- package/CHANGELOG.md +101 -3
- package/README.md +94 -0
- package/modules/utilities/converters/_convert-camel2kebab.scss +5 -4
- package/modules/utilities/converters/_convert-em2px.scss +5 -3
- package/modules/utilities/converters/_convert-hex2rgb.scss +4 -0
- package/modules/utilities/converters/_convert-hex2rgba.scss +5 -0
- package/modules/utilities/converters/_convert-kebab2camel.scss +5 -4
- package/modules/utilities/converters/_convert-kebab2snake.scss +4 -4
- package/modules/utilities/converters/_convert-px2em.scss +5 -4
- package/modules/utilities/converters/_convert-px2rem.scss +5 -4
- package/modules/utilities/converters/_convert-rem2px.scss +5 -3
- package/modules/utilities/converters/_convert-snake2kebab.scss +4 -4
- package/modules/utilities/getters/color/_get-color-brightness.scss +4 -0
- package/modules/utilities/getters/color/_get-color-darkest.scss +5 -1
- package/modules/utilities/getters/list/_get-list-item-end.scss +4 -2
- package/modules/utilities/getters/list/_get-list-item-start.scss +4 -2
- package/modules/utilities/getters/list/_get-list-item.scss +6 -4
- package/modules/utilities/getters/number/_get-number-from-percent.scss +6 -2
- package/modules/utilities/getters/number/_get-number-height-by-ratio.scss +5 -0
- package/modules/utilities/getters/number/_get-number-max.scss +4 -0
- package/modules/utilities/getters/number/_get-number-min.scss +4 -0
- package/modules/utilities/getters/number/_get-number-percentage-of.scss +6 -1
- package/modules/utilities/getters/number/_get-number-unit.scss +4 -2
- package/modules/utilities/getters/number/_get-number-width-by-ratio.scss +5 -0
- package/modules/utilities/helpers/color/_color-blend-steps.scss +6 -0
- package/modules/utilities/helpers/color/_color-blend.scss +6 -0
- package/modules/utilities/helpers/color/_color-hue-shift.scss +5 -0
- package/modules/utilities/helpers/color/_color-scale.scss +5 -0
- package/modules/utilities/helpers/color/_color-shade.scss +5 -0
- package/modules/utilities/helpers/color/_color-tint.scss +5 -0
- package/modules/utilities/helpers/color/_color-triad.scss +4 -1
- package/modules/utilities/helpers/list/_list-dedupe.scss +4 -0
- package/modules/utilities/helpers/list/_list-insert-at.scss +5 -0
- package/modules/utilities/helpers/list/_list-merge.scss +54 -8
- package/modules/utilities/helpers/list/_list-remove-at.scss +5 -0
- package/modules/utilities/helpers/list/_list-sum-numbers-safe.scss +3 -0
- package/modules/utilities/helpers/list/_list-sum-numbers.scss +3 -0
- package/modules/utilities/helpers/misc/_url-encode.scss +5 -6
- package/modules/utilities/helpers/number/_number-ceil-to.scss +56 -4
- package/modules/utilities/helpers/number/_number-clamp-max.scss +65 -10
- package/modules/utilities/helpers/number/_number-clamp-min.scss +65 -10
- package/modules/utilities/helpers/number/_number-clamp.scss +88 -12
- package/modules/utilities/helpers/number/_number-denormalize.scss +87 -9
- package/modules/utilities/helpers/number/_number-fibonacci.scss +62 -9
- package/modules/utilities/helpers/number/_number-floor-to.scss +57 -3
- package/modules/utilities/helpers/number/_number-format-with-separator.scss +99 -16
- package/modules/utilities/helpers/number/_number-normalize.scss +88 -10
- package/modules/utilities/helpers/number/_number-random-between-int.scss +74 -13
- package/modules/utilities/helpers/number/_number-random-between.scss +76 -15
- package/modules/utilities/helpers/number/_number-range.scss +105 -12
- package/modules/utilities/helpers/number/_number-round-to-nearest.scss +58 -1
- package/modules/utilities/helpers/number/_number-round-to.scss +65 -2
- package/modules/utilities/helpers/number/_number-strip-unit.scss +43 -9
- package/modules/utilities/helpers/string/_string-capitalize.scss +46 -5
- package/modules/utilities/helpers/string/_string-replace.scss +82 -4
- package/modules/utilities/helpers/string/_string-trim-end.scss +49 -6
- package/modules/utilities/helpers/string/_string-trim-start.scss +49 -6
- package/modules/utilities/helpers/string/_string-trim.scss +56 -11
- package/modules/utilities/loggers/_log-invalid-type.scss +1 -1
- package/modules/utilities/loggers/_log-invalid-value.scss +1 -1
- package/modules/utilities/validators/color/_is-color-light.scss +61 -4
- package/modules/utilities/validators/color/_is-color-list.scss +41 -9
- package/modules/utilities/validators/list/_is-list-contained.scss +42 -3
- package/modules/utilities/validators/misc/_is-time.scss +29 -0
- package/modules/utilities/validators/number/_is-int-even.scss +50 -8
- package/modules/utilities/validators/number/_is-int-odd.scss +51 -9
- package/modules/utilities/validators/number/_is-int.scss +71 -12
- package/modules/utilities/validators/number/_is-number-has-unit.scss +55 -13
- package/modules/utilities/validators/number/_is-number-negative.scss +53 -11
- package/modules/utilities/validators/number/_is-number-positive.scss +52 -10
- package/modules/utilities/validators/number/_is-number-unitless.scss +53 -12
- package/modules/utilities/validators/number/_is-number-zero.scss +54 -10
- package/modules/utilities/validators/string/_is-string-contained.scss +59 -4
- package/modules/utilities/validators/string/_is-string-empty.scss +48 -8
- package/modules/utilities/validators/string/_is-string-ending-with.scss +64 -5
- package/modules/utilities/validators/string/_is-string-starting-with.scss +60 -8
- package/package.json +1 -1
- package/package.scss +9 -8
- package/test.md +0 -168
- package/test.scss +0 -405
- package/test.sh +0 -149
|
@@ -1,23 +1,25 @@
|
|
|
1
1
|
@use 'sass:math';
|
|
2
|
+
@use '../../loggers/log-invalid-type' as *;
|
|
3
|
+
@use '../../validators/type-of/is-number' as *;
|
|
2
4
|
|
|
3
5
|
/// Генерирует случайное целое число в заданном диапазоне.
|
|
4
6
|
///
|
|
5
7
|
/// Функция принимает минимальное и максимальное целые значения
|
|
6
8
|
/// и возвращает случайное целое число, равномерно распределенное
|
|
7
|
-
/// в диапазоне [`$min`, `$max`] включительно.
|
|
9
|
+
/// в диапазоне [`$value-min`, `$value-max`] включительно.
|
|
8
10
|
///
|
|
9
11
|
/// Формула генерации:
|
|
10
|
-
/// `math.floor($min + math.random() * ($max - $min + 1))`
|
|
12
|
+
/// `math.floor($value-min + math.random() * ($value-max - $value-min + 1))`
|
|
11
13
|
///
|
|
12
14
|
/// Визуализация работы:
|
|
13
15
|
/// - Генерирует базовое случайное число от 0 до 1 (исключая 1)
|
|
14
16
|
/// - Масштабирует его на длину диапазона плюс 1
|
|
15
|
-
/// - Сдвигает на минимальное значение (`$min`)
|
|
17
|
+
/// - Сдвигает на минимальное значение (`$value-min`)
|
|
16
18
|
/// - Округляет вниз до ближайшего целого числа
|
|
17
19
|
///
|
|
18
20
|
/// Важные особенности функции:
|
|
19
21
|
/// - Работает только с целыми числами (без единиц измерения)
|
|
20
|
-
/// - Диапазон включает оба конца: `$min` и `$max`
|
|
22
|
+
/// - Диапазон включает оба конца: `$value-min` и `$value-max`
|
|
21
23
|
/// - Равномерное распределение в заданном диапазоне
|
|
22
24
|
/// - Каждый вызов функции возвращает новое случайное значение
|
|
23
25
|
/// - Результат компилируется в CSS как фиксированное целое число
|
|
@@ -67,18 +69,77 @@
|
|
|
67
69
|
/// $columns: number-random-between-int(2, 6); // например: 4
|
|
68
70
|
/// $repeat-count: number-random-between-int(3, 8); // например: 5
|
|
69
71
|
/// $z-index: number-random-between-int(1, 10); // например: 7
|
|
70
|
-
/// @param {Number} $min - Минимальное целое значение диапазона (включительно).
|
|
72
|
+
/// @param {Number} $value-min - Минимальное целое значение диапазона (включительно).
|
|
71
73
|
/// Должно быть целым числом без единиц измерения.
|
|
72
74
|
/// Определяет нижнюю границу генерации.
|
|
73
|
-
/// @param {Number} $max - Максимальное целое значение диапазона (включительно).
|
|
75
|
+
/// @param {Number} $value-max - Максимальное целое значение диапазона (включительно).
|
|
74
76
|
/// Должно быть целым числом без единиц измерения.
|
|
75
77
|
/// Определяет верхнюю границу генерации.
|
|
76
|
-
/// Должно быть больше или равно `$min` для корректных результатов.
|
|
77
|
-
/// @return {Number} - Случайное целое число в диапазоне [`$min`, `$max`].
|
|
78
|
+
/// Должно быть больше или равно `$value-min` для корректных результатов.
|
|
79
|
+
/// @return {Number} - Случайное целое число в диапазоне [`$value-min`, `$value-max`].
|
|
78
80
|
/// Всегда возвращает целое число без единиц измерения.
|
|
79
|
-
/// @throws {Error} -
|
|
80
|
-
///
|
|
81
|
-
///
|
|
82
|
-
@
|
|
83
|
-
|
|
81
|
+
/// @throws {Error} - Выбрасывает ошибку, если в параметры передано
|
|
82
|
+
/// значение, не соответствующее типу `number`. Компиляция Sass
|
|
83
|
+
/// будет остановлена с ошибкой.
|
|
84
|
+
/// @throws {Warning} - При `$value-max < $value-min` результат
|
|
85
|
+
/// может быть неожиданным.
|
|
86
|
+
@function number-random-between-int($value-min, $value-max) {
|
|
87
|
+
|
|
88
|
+
// Проверка типа первого параметра: ожидается числовое значение
|
|
89
|
+
// минимальной границы диапазона. $value-min определяет нижнюю
|
|
90
|
+
// границу (включительно) для генерации случайного целого числа.
|
|
91
|
+
@if not is-number($value-min) {
|
|
92
|
+
|
|
93
|
+
// Если $value-min не является числом, возвращаем ошибку через
|
|
94
|
+
// стандартную функцию логирования. Это предотвращает
|
|
95
|
+
// некорректные вычисления с нечисловыми данными.
|
|
96
|
+
@return log-invalid-type(
|
|
97
|
+
'number-random-between-int',
|
|
98
|
+
$value-min,
|
|
99
|
+
'$value-min',
|
|
100
|
+
'number'
|
|
101
|
+
);
|
|
102
|
+
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Проверка типа второго параметра: ожидается числовое значение
|
|
106
|
+
// максимальной границы диапазона. $value-max определяет верхнюю
|
|
107
|
+
// границу (включительно) для генерации случайного целого числа.
|
|
108
|
+
@else if not is-number($value-max) {
|
|
109
|
+
|
|
110
|
+
// Если $value-max не является числом, возвращаем ошибку.
|
|
111
|
+
// Проверка выполняется только если $value-min прошел валидацию.
|
|
112
|
+
@return log-invalid-type(
|
|
113
|
+
'number-random-between-int',
|
|
114
|
+
$value-max,
|
|
115
|
+
'$value-max',
|
|
116
|
+
'number'
|
|
117
|
+
);
|
|
118
|
+
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// Все параметры прошли валидацию - генерируем случайное целое число.
|
|
122
|
+
@else {
|
|
123
|
+
|
|
124
|
+
// Формула генерации случайного целого числа в диапазоне
|
|
125
|
+
// [$value-min, $value-max] включительно:
|
|
126
|
+
//
|
|
127
|
+
// Алгоритм вычислений:
|
|
128
|
+
// 1. math.random() - генерирует случайное число от 0 (включительно)
|
|
129
|
+
// до 1 (исключительно)
|
|
130
|
+
// 2. $value-max - $value-min + 1 - вычисляем ширину диапазона
|
|
131
|
+
// с добавлением 1 для включения верхней границы
|
|
132
|
+
// 3. math.random() * ... - масштабируем случайное число в диапазон
|
|
133
|
+
// 4. $value-min + ... - смещаем результат в нужный диапазон
|
|
134
|
+
// 5. math.floor() - округляем вниз до целого числа
|
|
135
|
+
//
|
|
136
|
+
// Математическая формула:
|
|
137
|
+
// result = floor(value-min + random() × (value-max - value-min + 1))
|
|
138
|
+
//
|
|
139
|
+
// Ключевая особенность: функция возвращает случайное ЦЕЛОЕ число
|
|
140
|
+
// в указанном диапазоне включительно (обе границы могут быть результатом).
|
|
141
|
+
@return math.floor($value-min + math.random() * ($value-max - $value-min + 1));
|
|
142
|
+
|
|
143
|
+
}
|
|
144
|
+
|
|
84
145
|
}
|
|
@@ -1,19 +1,21 @@
|
|
|
1
1
|
@use 'sass:math';
|
|
2
|
+
@use '../../loggers/log-invalid-type' as *;
|
|
3
|
+
@use '../../validators/type-of/is-number' as *;
|
|
2
4
|
|
|
3
5
|
/// Генерирует случайное число в заданном диапазоне.
|
|
4
6
|
///
|
|
5
7
|
/// Функция принимает минимальное и максимальное значения
|
|
6
8
|
/// и возвращает случайное число, равномерно распределенное
|
|
7
|
-
/// в диапазоне [`$min`, `$max`] (включительно для `$min`,
|
|
8
|
-
/// исключительно для `$max` для дробных чисел).
|
|
9
|
+
/// в диапазоне [`$value-min`, `$value-max`] (включительно для `$value-min`,
|
|
10
|
+
/// исключительно для `$value-max` для дробных чисел).
|
|
9
11
|
///
|
|
10
12
|
/// Формула генерации:
|
|
11
|
-
/// `$min + math.random() * ($max - $min)`
|
|
13
|
+
/// `$value-min + math.random() * ($value-max - $value-min)`
|
|
12
14
|
///
|
|
13
15
|
/// Визуализация работы:
|
|
14
16
|
/// - Генерирует базовое случайное число от 0 до 1 (исключая 1)
|
|
15
|
-
/// - Масштабирует его на длину диапазона (`$max - $min`)
|
|
16
|
-
/// - Сдвигает на минимальное значение (`$min`)
|
|
17
|
+
/// - Масштабирует его на длину диапазона (`$value-max - $value-min`)
|
|
18
|
+
/// - Сдвигает на минимальное значение (`$value-min`)
|
|
17
19
|
///
|
|
18
20
|
/// Важные особенности функции:
|
|
19
21
|
/// - Работает с любыми числовыми значениями (целые, дробные,
|
|
@@ -98,23 +100,82 @@
|
|
|
98
100
|
/// .decorative {
|
|
99
101
|
/// transform: rotate(2.1312623254deg);
|
|
100
102
|
/// }
|
|
101
|
-
/// @param {Number} $min - Минимальное значение диапазона (включительно).
|
|
103
|
+
/// @param {Number} $value-min - Минимальное значение диапазона (включительно).
|
|
102
104
|
/// Может быть любым числом: целым, дробным, положительным,
|
|
103
105
|
/// отрицательным, с единицами измерения или без.
|
|
104
106
|
/// Определяет нижнюю границу генерации.
|
|
105
|
-
/// @param {Number} $max - Максимальное значение диапазона (исключительно
|
|
107
|
+
/// @param {Number} $value-max - Максимальное значение диапазона (исключительно
|
|
106
108
|
/// для дробных чисел, но практически достижимо).
|
|
107
109
|
/// Может быть любым числом: целым, дробным, положительным,
|
|
108
110
|
/// отрицательным, с единицами измерения или без.
|
|
109
111
|
/// Определяет верхнюю границу генерации.
|
|
110
|
-
/// Должно быть больше или равно `$min` для корректных результатов.
|
|
111
|
-
/// @return {Number} - Случайное число в диапазоне [`$min`, `$max`).
|
|
112
|
+
/// Должно быть больше или равно `$value-min` для корректных результатов.
|
|
113
|
+
/// @return {Number} - Случайное число в диапазоне [`$value-min`, `$value-max`).
|
|
112
114
|
/// Если параметры имеют единицы измерения, результат будет
|
|
113
115
|
/// иметь те же единицы. Всегда возвращает дробное число.
|
|
114
|
-
/// @throws {
|
|
115
|
-
///
|
|
116
|
-
///
|
|
117
|
-
///
|
|
118
|
-
@
|
|
119
|
-
|
|
116
|
+
/// @throws {Warning} - При `$value-max < $value-min` результат может
|
|
117
|
+
/// быть неожиданным (возможны отрицательные значения длины
|
|
118
|
+
/// диапазона). Рекомендуется всегда передавать
|
|
119
|
+
/// `$value-min ≤ $value-max`.
|
|
120
|
+
/// @throws {Error} - Выбрасывает ошибку, если в параметры передано
|
|
121
|
+
/// значение, не соответствующее типу `number`. Компиляция Sass
|
|
122
|
+
/// будет остановлена с ошибкой.
|
|
123
|
+
@function number-random-between($value-min, $value-max) {
|
|
124
|
+
|
|
125
|
+
// Проверка типа первого параметра: ожидается числовое значение
|
|
126
|
+
// минимальной границы диапазона. $value-min определяет нижнюю
|
|
127
|
+
// границу для генерации случайного числа.
|
|
128
|
+
@if not is-number($value-min) {
|
|
129
|
+
|
|
130
|
+
// Если $value-min не является числом, возвращаем ошибку через
|
|
131
|
+
// стандартную функцию логирования. Это предотвращает
|
|
132
|
+
// некорректные вычисления с нечисловыми данными.
|
|
133
|
+
@return log-invalid-type(
|
|
134
|
+
'number-random-between',
|
|
135
|
+
$value-min,
|
|
136
|
+
'$value-min',
|
|
137
|
+
'number'
|
|
138
|
+
);
|
|
139
|
+
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// Проверка типа второго параметра: ожидается числовое значение
|
|
143
|
+
// максимальной границы диапазона. $value-max определяет верхнюю
|
|
144
|
+
// границу для генерации случайного числа.
|
|
145
|
+
@else if not is-number($value-max) {
|
|
146
|
+
|
|
147
|
+
// Если $value-max не является числом, возвращаем ошибку.
|
|
148
|
+
// Проверка выполняется только если $value-min прошел валидацию.
|
|
149
|
+
@return log-invalid-type(
|
|
150
|
+
'number-random-between',
|
|
151
|
+
$value-max,
|
|
152
|
+
'$value-max',
|
|
153
|
+
'number'
|
|
154
|
+
);
|
|
155
|
+
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// Все параметры прошли валидацию - генерируем случайное число.
|
|
159
|
+
@else {
|
|
160
|
+
|
|
161
|
+
// Формула генерации случайного числа в диапазоне
|
|
162
|
+
// [$value-min, $value-max):
|
|
163
|
+
//
|
|
164
|
+
// Алгоритм вычислений:
|
|
165
|
+
// 1. math.random() - генерирует случайное число от 0 (включительно)
|
|
166
|
+
// до 1 (исключительно)
|
|
167
|
+
// 2. $value-max - $value-min - вычисляем ширину диапазона
|
|
168
|
+
// 3. math.random() * ... - масштабируем случайное число в диапазон
|
|
169
|
+
// 4. $value-min + ... - смещаем результат в нужный диапазон
|
|
170
|
+
//
|
|
171
|
+
// Математическая формула:
|
|
172
|
+
// result = value-min + random() × (value-max - value-min)
|
|
173
|
+
//
|
|
174
|
+
// Ключевая особенность: функция возвращает случайное число
|
|
175
|
+
// в указанном диапазоне, где $value-min включительно,
|
|
176
|
+
// а $value-max исключительно.
|
|
177
|
+
@return $value-min + math.random() * ($value-max - $value-min);
|
|
178
|
+
|
|
179
|
+
}
|
|
180
|
+
|
|
120
181
|
}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
@use 'sass:list';
|
|
2
|
+
@use '../../loggers/log-invalid-type' as *;
|
|
3
|
+
@use '../../validators/type-of/is-number' as *;
|
|
2
4
|
|
|
3
5
|
/// Генерирует последовательность чисел в заданном диапазоне
|
|
4
6
|
/// с определенным шагом.
|
|
@@ -242,27 +244,118 @@
|
|
|
242
244
|
/// - Последний элемент: ближайшее к `$end` значение, кратное шагу
|
|
243
245
|
/// - Все элементы: равномерно распределены с шагом `$step`
|
|
244
246
|
/// - Направление: соответствует соотношению `$start` и `$end`
|
|
247
|
+
/// @throws {Error} - Выбрасывает ошибку, если в параметры передано
|
|
248
|
+
/// значение, не соответствующее типу `number`. Компиляция Sass
|
|
249
|
+
/// будет остановлена с ошибкой.
|
|
245
250
|
@function number-range($from, $to, $step: 1) {
|
|
246
|
-
$-result: ();
|
|
247
251
|
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
252
|
+
// Проверка типа первого параметра: ожидается числовое значение
|
|
253
|
+
// начальной точки диапазона. $from определяет начальное значение
|
|
254
|
+
// для генерации последовательности чисел.
|
|
255
|
+
@if not is-number($from) {
|
|
251
256
|
|
|
252
|
-
|
|
257
|
+
// Если $from не является числом, возвращаем ошибку через
|
|
258
|
+
// стандартную функцию логирования. Это предотвращает
|
|
259
|
+
// некорректные вычисления с нечисловыми данными.
|
|
260
|
+
@return log-invalid-type(
|
|
261
|
+
'number-range',
|
|
262
|
+
$from,
|
|
263
|
+
'$from',
|
|
264
|
+
'number'
|
|
265
|
+
);
|
|
266
|
+
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
// Проверка типа второго параметра: ожидается числовое значение
|
|
270
|
+
// конечной точки диапазона. $to определяет конечное значение
|
|
271
|
+
// для генерации последовательности чисел.
|
|
272
|
+
@else if not is-number($to) {
|
|
273
|
+
|
|
274
|
+
// Если $to не является числом, возвращаем ошибку.
|
|
275
|
+
// Проверка выполняется только если $from прошел валидацию.
|
|
276
|
+
@return log-invalid-type(
|
|
277
|
+
'number-range',
|
|
278
|
+
$to,
|
|
279
|
+
'$to',
|
|
280
|
+
'number'
|
|
281
|
+
);
|
|
282
|
+
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
// Проверка типа третьего параметра: ожидается числовое значение
|
|
286
|
+
// шага последовательности. $step определяет интервал между
|
|
287
|
+
// числами в генерируемой последовательности.
|
|
288
|
+
@else if not is-number($step) {
|
|
289
|
+
|
|
290
|
+
// Если $step не является числом, возвращаем ошибку.
|
|
291
|
+
// Проверка выполняется только если $from и $to
|
|
292
|
+
// прошли валидацию.
|
|
293
|
+
@return log-invalid-type(
|
|
294
|
+
'number-range',
|
|
295
|
+
$step,
|
|
296
|
+
'$step',
|
|
297
|
+
'number'
|
|
298
|
+
);
|
|
299
|
+
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
// Все параметры прошли валидацию - генерируем числовую последовательность.
|
|
303
|
+
@else {
|
|
304
|
+
|
|
305
|
+
// Инициализация переменной для хранения результата.
|
|
306
|
+
// $-result будет содержать список чисел в указанном диапазоне
|
|
307
|
+
// с заданным шагом.
|
|
308
|
+
$-result: ();
|
|
309
|
+
|
|
310
|
+
// Проверка направления диапазона: восходящая последовательность.
|
|
311
|
+
// Если начальное значение меньше конечного, генерируем числа
|
|
312
|
+
// от меньшего к большему.
|
|
313
|
+
@if $from < $to {
|
|
314
|
+
|
|
315
|
+
// Цикл по всем числам от $from до $to включительно.
|
|
316
|
+
// Переменная $i принимает значения от $from до $to.
|
|
317
|
+
@for $i from $from through $to {
|
|
318
|
+
|
|
319
|
+
// Проверка: соответствует ли текущее число шагу последовательности.
|
|
320
|
+
// Условие ($i - $from) % $step == 0 проверяет, что разница
|
|
321
|
+
// между текущим числом и начальным значением кратна шагу.
|
|
322
|
+
@if ($i - $from) % $step == 0 {
|
|
323
|
+
|
|
324
|
+
// Если число соответствует шагу, добавляем его в результат.
|
|
325
|
+
// Функция list.append() добавляет число в конец списка.
|
|
326
|
+
$-result: list.append($-result, $i);
|
|
327
|
+
|
|
328
|
+
}
|
|
253
329
|
|
|
254
330
|
}
|
|
255
|
-
}
|
|
256
|
-
} @else {
|
|
257
|
-
@for $i from $from through $to {
|
|
258
|
-
@if ($from - $i) % $step == 0 {
|
|
259
331
|
|
|
260
|
-
|
|
332
|
+
} @else {
|
|
333
|
+
|
|
334
|
+
// Нисходящая последовательность.
|
|
335
|
+
// Если начальное значение больше или равно конечному,
|
|
336
|
+
// генерируем числа от большего к меньшему.
|
|
337
|
+
@for $i from $from through $to {
|
|
338
|
+
|
|
339
|
+
// Проверка: соответствует ли текущее число шагу последовательности
|
|
340
|
+
// для нисходящего направления.
|
|
341
|
+
// Условие ($from - $i) % $step == 0 проверяет, что разница
|
|
342
|
+
// между начальным значением и текущим числом кратна шагу.
|
|
343
|
+
@if ($from - $i) % $step == 0 {
|
|
344
|
+
|
|
345
|
+
// Если число соответствует шагу, добавляем его в результат.
|
|
346
|
+
$-result: list.append($-result, $i);
|
|
347
|
+
|
|
348
|
+
}
|
|
261
349
|
|
|
262
350
|
}
|
|
351
|
+
|
|
263
352
|
}
|
|
264
|
-
}
|
|
265
353
|
|
|
266
|
-
|
|
354
|
+
// Возвращаем список чисел в указанном диапазоне с заданным шагом.
|
|
355
|
+
// Последовательность включает начальное и конечное значения,
|
|
356
|
+
// если они соответствуют шагу.
|
|
357
|
+
@return $-result;
|
|
358
|
+
|
|
359
|
+
}
|
|
267
360
|
|
|
268
361
|
}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
@use 'sass:math';
|
|
2
|
+
@use '../../loggers/log-invalid-type' as *;
|
|
3
|
+
@use '../../validators/type-of/is-number' as *;
|
|
2
4
|
|
|
3
5
|
/// Округляет число до ближайшего кратного значения с
|
|
4
6
|
/// использованием стандартного математического округления
|
|
@@ -126,6 +128,61 @@
|
|
|
126
128
|
/// @throws {Error} - Может выбросить ошибку если `$value` или
|
|
127
129
|
/// `$nearest` не являются числами, или если происходит
|
|
128
130
|
/// деление на ноль.
|
|
131
|
+
/// @throws {Error} - Выбрасывает ошибку, если в параметры передано
|
|
132
|
+
/// значение, не соответствующее типу `number`. Компиляция Sass
|
|
133
|
+
/// будет остановлена с ошибкой.
|
|
129
134
|
@function number-round-to-nearest($value, $nearest) {
|
|
130
|
-
|
|
135
|
+
|
|
136
|
+
// Проверка типа первого параметра: ожидается числовое значение.
|
|
137
|
+
// Функция is-number() проверяет, является ли $value числом.
|
|
138
|
+
// Это может быть целое число, дробное число или число с единицами измерения.
|
|
139
|
+
@if not is-number($value) {
|
|
140
|
+
|
|
141
|
+
// Если $value не является числом, возвращаем ошибку через
|
|
142
|
+
// стандартную функцию логирования. Это предотвращает
|
|
143
|
+
// некорректные вычисления с нечисловыми данными.
|
|
144
|
+
@return log-invalid-type(
|
|
145
|
+
'number-round-to-nearest',
|
|
146
|
+
$value,
|
|
147
|
+
'$value',
|
|
148
|
+
'number'
|
|
149
|
+
);
|
|
150
|
+
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// Проверка типа второго параметра: ожидается числовое значение
|
|
154
|
+
// для шага округления. $nearest определяет, до какого ближайшего
|
|
155
|
+
// кратного значения нужно округлить исходное число.
|
|
156
|
+
@else if not is-number($nearest) {
|
|
157
|
+
|
|
158
|
+
// Если $nearest не является числом, возвращаем ошибку.
|
|
159
|
+
// Проверка выполняется только если $value прошел валидацию.
|
|
160
|
+
@return log-invalid-type(
|
|
161
|
+
'number-round-to-nearest',
|
|
162
|
+
$nearest,
|
|
163
|
+
'$nearest',
|
|
164
|
+
'number'
|
|
165
|
+
);
|
|
166
|
+
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// Все параметры прошли валидацию - выполняем округление к ближайшему.
|
|
170
|
+
@else {
|
|
171
|
+
|
|
172
|
+
// Формула округления к ближайшему кратному значению:
|
|
173
|
+
// 1. math.div($value, $nearest) - делим исходное значение на шаг округления
|
|
174
|
+
// 2. math.round() - округляем результат деления к ближайшему целому
|
|
175
|
+
// (использует математическое округление: .5 округляется вверх)
|
|
176
|
+
// 3. * $nearest - умножаем округленное целое на шаг округления
|
|
177
|
+
//
|
|
178
|
+
// Математическая формула:
|
|
179
|
+
// result = round(value / nearest) × nearest
|
|
180
|
+
//
|
|
181
|
+
// Ключевая особенность: функция округляет значение к ближайшему
|
|
182
|
+
// кратному с использованием математического округления,
|
|
183
|
+
// где .5 всегда округляется вверх.
|
|
184
|
+
@return math.round(math.div($value, $nearest)) * $nearest;
|
|
185
|
+
|
|
186
|
+
}
|
|
187
|
+
|
|
131
188
|
}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
@use 'sass:math';
|
|
2
|
+
@use '../../loggers/log-invalid-type' as *;
|
|
3
|
+
@use '../../validators/type-of/is-number' as *;
|
|
2
4
|
|
|
3
5
|
/// Округляет число до указанного количества знаков после
|
|
4
6
|
/// запятой.
|
|
@@ -109,10 +111,71 @@
|
|
|
109
111
|
/// @throws {Error} - Может выбросить ошибку если `$precision`
|
|
110
112
|
/// не является целым неотрицательным числом или если
|
|
111
113
|
/// `$value` не является числом.
|
|
114
|
+
/// @throws {Error} - Выбрасывает ошибку, если в параметры передано
|
|
115
|
+
/// значение, не соответствующее типу `number`. Компиляция Sass
|
|
116
|
+
/// будет остановлена с ошибкой.
|
|
112
117
|
@function number-round-to($value, $precision: 2) {
|
|
113
118
|
|
|
114
|
-
|
|
119
|
+
// Проверка типа первого параметра: ожидается числовое значение.
|
|
120
|
+
// Функция is-number() проверяет, является ли $value числом.
|
|
121
|
+
// Это может быть целое число, дробное число или число с единицами измерения.
|
|
122
|
+
@if not is-number($value) {
|
|
115
123
|
|
|
116
|
-
|
|
124
|
+
// Если $value не является числом, возвращаем ошибку через
|
|
125
|
+
// стандартную функцию логирования. Это предотвращает
|
|
126
|
+
// некорректные вычисления с нечисловыми данными.
|
|
127
|
+
@return log-invalid-type(
|
|
128
|
+
'number-round-to',
|
|
129
|
+
$value,
|
|
130
|
+
'$value',
|
|
131
|
+
'number'
|
|
132
|
+
);
|
|
133
|
+
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Проверка типа второго параметра: ожидается числовое значение
|
|
137
|
+
// для точности округления. $precision определяет количество
|
|
138
|
+
// знаков после запятой в результате округления.
|
|
139
|
+
@else if not is-number($precision) {
|
|
140
|
+
|
|
141
|
+
// Если $precision не является числом, возвращаем ошибку.
|
|
142
|
+
// Проверка выполняется только если $value прошел валидацию.
|
|
143
|
+
@return log-invalid-type(
|
|
144
|
+
'number-round-to',
|
|
145
|
+
$precision,
|
|
146
|
+
'$precision',
|
|
147
|
+
'number'
|
|
148
|
+
);
|
|
149
|
+
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// Все параметры прошли валидацию - выполняем округление с заданной точностью.
|
|
153
|
+
@else {
|
|
154
|
+
|
|
155
|
+
// Вычисление множителя для округления.
|
|
156
|
+
// math.pow(10, $precision) возводит 10 в степень $precision,
|
|
157
|
+
// создавая множитель для перемещения нужного количества
|
|
158
|
+
// знаков после запятой в целую часть числа.
|
|
159
|
+
// Пример: при $precision = 2 → множитель = 100
|
|
160
|
+
$-multiplier: math.pow(10, $precision);
|
|
161
|
+
|
|
162
|
+
// Формула округления с заданной точностью:
|
|
163
|
+
// 1. $value * $-multiplier - умножаем значение на множитель,
|
|
164
|
+
// чтобы переместить нужное количество знаков после запятой
|
|
165
|
+
// в целую часть (например, 3.14159 × 100 = 314.159)
|
|
166
|
+
// 2. math.round(...) - округляем результат к ближайшему целому
|
|
167
|
+
// (314.159 → 314)
|
|
168
|
+
// 3. math.div(..., $-multiplier) - делим обратно на множитель,
|
|
169
|
+
// чтобы вернуть десятичную точку на исходное место (314 → 3.14)
|
|
170
|
+
//
|
|
171
|
+
// Математическая формула:
|
|
172
|
+
// result = round(value × 10^precision) ÷ 10^precision
|
|
173
|
+
//
|
|
174
|
+
// Ключевая особенность: функция округляет значение до указанного
|
|
175
|
+
// количества знаков после запятой с использованием математического
|
|
176
|
+
// округления, где .5 всегда округляется вверх.
|
|
177
|
+
@return math.div(math.round($value * $-multiplier), $-multiplier);
|
|
178
|
+
|
|
179
|
+
}
|
|
117
180
|
|
|
118
181
|
}
|
|
@@ -79,19 +79,53 @@
|
|
|
79
79
|
/// @return {Number} - Безразмерное числовое значение, равное
|
|
80
80
|
/// числовой части входного значения. Если входное значение
|
|
81
81
|
/// уже было безразмерным, возвращается то же самое значение.
|
|
82
|
-
/// @throws {Error} -
|
|
83
|
-
///
|
|
84
|
-
///
|
|
82
|
+
/// @throws {Error} - Выбрасывает ошибку, если в параметры передано
|
|
83
|
+
/// значение, не соответствующее типу `number`. Компиляция Sass
|
|
84
|
+
/// будет остановлена с ошибкой.
|
|
85
85
|
@function number-strip-unit($value) {
|
|
86
86
|
|
|
87
|
-
|
|
87
|
+
// Проверка типа входного параметра: ожидается числовое значение.
|
|
88
|
+
// Функция is-number() проверяет, является ли $value числом.
|
|
89
|
+
// Это может быть целое число, дробное число или число с единицами измерения.
|
|
90
|
+
@if not is-number($value) {
|
|
91
|
+
|
|
92
|
+
// Если $value не является числом, возвращаем ошибку через
|
|
93
|
+
// стандартную функцию логирования. Это предотвращает
|
|
94
|
+
// некорректные вычисления с нечисловыми данными.
|
|
95
|
+
@return log-invalid-type(
|
|
96
|
+
'number-strip-unit',
|
|
97
|
+
$value,
|
|
98
|
+
'$value',
|
|
99
|
+
'number'
|
|
100
|
+
);
|
|
88
101
|
|
|
89
|
-
@if is-number($value) {
|
|
90
|
-
$-result: math.div($value, $value * 0 + 1);
|
|
91
|
-
} @else {
|
|
92
|
-
@debug log-invalid-type('number-strip-unit', $value, '$value', 'number');
|
|
93
102
|
}
|
|
94
103
|
|
|
95
|
-
|
|
104
|
+
// Основная логика выполняется только если $value является
|
|
105
|
+
// корректным числом.
|
|
106
|
+
@else {
|
|
107
|
+
|
|
108
|
+
// Формула удаления единиц измерения из числа:
|
|
109
|
+
// Используем математический трюк для конвертации числа
|
|
110
|
+
// в безразмерное значение.
|
|
111
|
+
//
|
|
112
|
+
// Алгоритм вычислений:
|
|
113
|
+
// 1. $value * 0 + 1 - создаем безразмерное число 1:
|
|
114
|
+
// - $value * 0 = 0 с теми же единицами измерения, что и $value
|
|
115
|
+
// - 0 + 1 = 1 без единиц измерения (единицы теряются при сложении
|
|
116
|
+
// с безразмерным числом)
|
|
117
|
+
// 2. math.div($value, ...) - делим исходное значение на безразмерную 1
|
|
118
|
+
// Деление числа с единицами измерения на безразмерное число
|
|
119
|
+
// удаляет единицы измерения, сохраняя числовое значение.
|
|
120
|
+
//
|
|
121
|
+
// Математическая формула:
|
|
122
|
+
// result = value ÷ (value × 0 + 1)
|
|
123
|
+
//
|
|
124
|
+
// Ключевая особенность: этот метод корректно работает с любыми
|
|
125
|
+
// единицами измерения (px, rem, em, %, и т.д.) и всегда возвращает
|
|
126
|
+
// безразмерное числовое значение.
|
|
127
|
+
@return math.div($value, $value * 0 + 1);
|
|
128
|
+
|
|
129
|
+
}
|
|
96
130
|
|
|
97
131
|
}
|