@omnisass/library 0.2.1 → 0.4.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 (88) hide show
  1. package/CHANGELOG.md +120 -3
  2. package/README.md +94 -0
  3. package/index.scss +6 -0
  4. package/modules/utilities/converters/_convert-camel2kebab.scss +5 -4
  5. package/modules/utilities/converters/_convert-em2px.scss +5 -3
  6. package/modules/utilities/converters/_convert-hex2rgb.scss +4 -0
  7. package/modules/utilities/converters/_convert-hex2rgba.scss +5 -0
  8. package/modules/utilities/converters/_convert-kebab2camel.scss +5 -4
  9. package/modules/utilities/converters/_convert-kebab2snake.scss +4 -4
  10. package/modules/utilities/converters/_convert-px2em.scss +5 -4
  11. package/modules/utilities/converters/_convert-px2rem.scss +5 -4
  12. package/modules/utilities/converters/_convert-rem2px.scss +5 -3
  13. package/modules/utilities/converters/_convert-snake2kebab.scss +4 -4
  14. package/modules/utilities/getters/color/_get-color-brightness.scss +4 -0
  15. package/modules/utilities/getters/color/_get-color-darkest.scss +5 -1
  16. package/modules/utilities/getters/list/_get-list-item-end.scss +4 -2
  17. package/modules/utilities/getters/list/_get-list-item-start.scss +4 -2
  18. package/modules/utilities/getters/list/_get-list-item.scss +6 -4
  19. package/modules/utilities/getters/misc/_get-uid.scss +135 -0
  20. package/modules/utilities/getters/number/_get-number-from-percent.scss +6 -2
  21. package/modules/utilities/getters/number/_get-number-height-by-ratio.scss +5 -0
  22. package/modules/utilities/getters/number/_get-number-max.scss +4 -0
  23. package/modules/utilities/getters/number/_get-number-min.scss +4 -0
  24. package/modules/utilities/getters/number/_get-number-percentage-of.scss +6 -1
  25. package/modules/utilities/getters/number/_get-number-unit.scss +4 -2
  26. package/modules/utilities/getters/number/_get-number-width-by-ratio.scss +5 -0
  27. package/modules/utilities/getters/string/_get-string-hash.scss +143 -0
  28. package/modules/utilities/helpers/color/_color-blend-steps.scss +6 -0
  29. package/modules/utilities/helpers/color/_color-blend.scss +6 -0
  30. package/modules/utilities/helpers/color/_color-hue-shift.scss +5 -0
  31. package/modules/utilities/helpers/color/_color-scale.scss +5 -0
  32. package/modules/utilities/helpers/color/_color-shade.scss +5 -0
  33. package/modules/utilities/helpers/color/_color-tint.scss +5 -0
  34. package/modules/utilities/helpers/color/_color-triad.scss +4 -1
  35. package/modules/utilities/helpers/list/_list-dedupe.scss +4 -0
  36. package/modules/utilities/helpers/list/_list-insert-at.scss +5 -0
  37. package/modules/utilities/helpers/list/_list-merge.scss +54 -8
  38. package/modules/utilities/helpers/list/_list-remove-at.scss +5 -0
  39. package/modules/utilities/helpers/list/_list-sum-numbers-safe.scss +3 -0
  40. package/modules/utilities/helpers/list/_list-sum-numbers.scss +3 -0
  41. package/modules/utilities/helpers/misc/_url-encode.scss +7 -8
  42. package/modules/utilities/helpers/number/_number-ceil-to.scss +56 -4
  43. package/modules/utilities/helpers/number/_number-clamp-max.scss +65 -10
  44. package/modules/utilities/helpers/number/_number-clamp-min.scss +65 -10
  45. package/modules/utilities/helpers/number/_number-clamp.scss +88 -12
  46. package/modules/utilities/helpers/number/_number-denormalize.scss +87 -9
  47. package/modules/utilities/helpers/number/_number-fibonacci.scss +62 -9
  48. package/modules/utilities/helpers/number/_number-floor-to.scss +57 -3
  49. package/modules/utilities/helpers/number/_number-format-with-separator.scss +99 -16
  50. package/modules/utilities/helpers/number/_number-normalize.scss +88 -10
  51. package/modules/utilities/helpers/number/_number-random-between-int.scss +74 -13
  52. package/modules/utilities/helpers/number/_number-random-between.scss +76 -15
  53. package/modules/utilities/helpers/number/_number-range.scss +105 -12
  54. package/modules/utilities/helpers/number/_number-round-to-nearest.scss +58 -1
  55. package/modules/utilities/helpers/number/_number-round-to.scss +65 -2
  56. package/modules/utilities/helpers/number/_number-strip-unit.scss +43 -9
  57. package/modules/utilities/helpers/string/_string-capitalize.scss +46 -5
  58. package/modules/utilities/helpers/string/_string-count.scss +173 -0
  59. package/modules/utilities/helpers/string/_string-lorips.config.scss +81 -0
  60. package/modules/utilities/helpers/string/_string-lorips.scss +198 -0
  61. package/modules/utilities/helpers/string/_string-repeat.scss +147 -0
  62. package/modules/utilities/helpers/string/_string-replace.scss +82 -4
  63. package/modules/utilities/helpers/string/_string-reverse.scss +139 -0
  64. package/modules/utilities/helpers/string/_string-trim-end.scss +49 -6
  65. package/modules/utilities/helpers/string/_string-trim-start.scss +49 -6
  66. package/modules/utilities/helpers/string/_string-trim.scss +56 -11
  67. package/modules/utilities/loggers/_log-invalid-type.scss +1 -1
  68. package/modules/utilities/loggers/_log-invalid-value.scss +1 -1
  69. package/modules/utilities/validators/color/_is-color-light.scss +61 -4
  70. package/modules/utilities/validators/color/_is-color-list.scss +41 -9
  71. package/modules/utilities/validators/list/_is-list-contained.scss +42 -3
  72. package/modules/utilities/validators/misc/_is-time.scss +29 -0
  73. package/modules/utilities/validators/number/_is-int-even.scss +50 -8
  74. package/modules/utilities/validators/number/_is-int-odd.scss +51 -9
  75. package/modules/utilities/validators/number/_is-int.scss +71 -12
  76. package/modules/utilities/validators/number/_is-number-has-unit.scss +55 -13
  77. package/modules/utilities/validators/number/_is-number-negative.scss +53 -11
  78. package/modules/utilities/validators/number/_is-number-positive.scss +52 -10
  79. package/modules/utilities/validators/number/_is-number-unitless.scss +53 -12
  80. package/modules/utilities/validators/number/_is-number-zero.scss +54 -10
  81. package/modules/utilities/validators/string/_is-string-contained.scss +59 -4
  82. package/modules/utilities/validators/string/_is-string-empty.scss +48 -8
  83. package/modules/utilities/validators/string/_is-string-ending-with.scss +64 -5
  84. package/modules/utilities/validators/string/_is-string-starting-with.scss +60 -8
  85. package/package.json +1 -1
  86. package/package.scss +9 -8
  87. package/test2.sh +158 -0
  88. package/modules/utilities/setters/_index.scss +0 -3
@@ -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
  ///
@@ -106,9 +108,61 @@
106
108
  /// @return {Number} - Число, округленное вниз до ближайшего
107
109
  /// значения, кратного `$nearest`. Сохраняет единицы
108
110
  /// измерения исходного числа `$value`.
109
- /// @throws {Error} - Может выбросить ошибку если `$value` или
110
- /// `$nearest` не являются числами, или если происходит
111
+ /// @throws {Error} - Может выбросить ошибку если происходит
111
112
  /// деление на ноль.
113
+ /// @throws {Error} - Выбрасывает ошибку, если в параметры передано
114
+ /// значение, не соответствующее типу `number`. Компиляция Sass
115
+ /// будет остановлена с ошибкой.
112
116
  @function number-floor-to($value, $nearest) {
113
- @return math.floor(math.div($value, $nearest)) * $nearest;
117
+
118
+ // Проверка типа первого параметра: ожидается числовое значение.
119
+ // Функция is-number() проверяет, является ли $value числом.
120
+ // Это может быть целое число, дробное число или число с единицами измерения.
121
+ @if not is-number($value) {
122
+
123
+ // Если $value не является числом, возвращаем ошибку через
124
+ // стандартную функцию логирования. Это предотвращает
125
+ // некорректные вычисления с нечисловыми данными.
126
+ @return log-invalid-type(
127
+ 'number-floor-to',
128
+ $value,
129
+ '$value',
130
+ 'number'
131
+ );
132
+
133
+ }
134
+
135
+ // Проверка типа второго параметра: ожидается числовое значение
136
+ // для шага округления. $nearest определяет, до какого ближайшего
137
+ // кратного значения нужно округлить исходное число.
138
+ @else if not is-number($nearest) {
139
+
140
+ // Если $nearest не является числом, возвращаем ошибку.
141
+ // Проверка выполняется только если $value прошел валидацию.
142
+ @return log-invalid-type(
143
+ 'number-floor-to',
144
+ $nearest,
145
+ '$nearest',
146
+ 'number'
147
+ );
148
+
149
+ }
150
+
151
+ // Все параметры прошли валидацию - выполняем округление вниз.
152
+ @else {
153
+
154
+ // Формула округления вниз до ближайшего кратного значения:
155
+ // 1. math.div($value, $nearest) - делим исходное значение на шаг округления
156
+ // 2. math.floor() - округляем результат деления вниз до ближайшего целого
157
+ // 3. * $nearest - умножаем округленное целое на шаг округления
158
+ //
159
+ // Математическая формула:
160
+ // result = floor(value / nearest) × nearest
161
+ //
162
+ // Ключевая особенность: функция всегда округляет ВНИЗ до ближайшего
163
+ // кратного значения, даже если исходное число уже близко к верхнему крайнему.
164
+ @return math.floor(math.div($value, $nearest)) * $nearest;
165
+
166
+ }
167
+
114
168
  }
@@ -1,6 +1,9 @@
1
1
  @use 'sass:math';
2
2
  @use 'sass:meta';
3
3
  @use 'sass:string';
4
+ @use '../../loggers/log-invalid-type' as *;
5
+ @use '../../validators/type-of/is-number' as *;
6
+ @use '../../validators/type-of/is-string' as *;
4
7
 
5
8
  /// Форматирует число, добавляя разделители тысяч для улучшения
6
9
  /// читаемости больших чисел.
@@ -93,30 +96,110 @@
93
96
  /// часть исходного числа игнорируется.
94
97
  /// @throws {Error} - Может выбросить ошибку если `$value`
95
98
  /// не является числом или если `$separator` не является строкой.
99
+ /// @throws {Error} - Выбрасывает ошибку, если в параметры передано
100
+ /// значение, не соответствующее типу `number (`$value`) или
101
+ /// `string` (`$separator`). Компиляция Sass будет остановлена
102
+ /// с ошибкой.
96
103
  @function number-format-with-separator($value, $separator: ",") {
97
104
 
98
- $-result: "";
99
- $-str: meta.inspect(math.abs($value));
100
- $-length: string.length($-str);
101
- $-counter: 0;
105
+ // Проверка типа первого параметра: ожидается числовое значение.
106
+ // Функция is-number() проверяет, является ли $value числом.
107
+ // Это может быть целое число или дробное число.
108
+ @if not is-number($value) {
102
109
 
103
- @for $i from $-length through 1 {
110
+ // Если $value не является числом, возвращаем ошибку через
111
+ // стандартную функцию логирования. Это предотвращает
112
+ // некорректные вычисления с нечисловыми данными.
113
+ @return log-invalid-type(
114
+ 'number-format-with-separator',
115
+ $value,
116
+ '$value',
117
+ 'number'
118
+ );
104
119
 
105
- $char: string.slice($-str, $i, $i);
106
- $-result: $char + $-result;
107
- $-counter: $-counter + 1;
120
+ }
108
121
 
109
- @if $-counter == 3 and $i > 1 {
110
- $-result: $separator + $-result;
111
- $-counter: 0;
112
- }
122
+ // Проверка типа второго параметра: ожидается строковое значение
123
+ // разделителя тысяч. $separator определяет символ, который будет
124
+ // использоваться для разделения групп разрядов (по умолчанию запятая).
125
+ @else if not is-string($separator) {
113
126
 
114
- }
127
+ // Если $separator не является строкой, возвращаем ошибку.
128
+ // Проверка выполняется только если $value прошел валидацию.
129
+ @return log-invalid-type(
130
+ 'number-format-with-separator',
131
+ $separator,
132
+ '$separator',
133
+ 'string'
134
+ );
115
135
 
116
- @if $value < 0 {
117
- $-result: "-" + $-result;
118
136
  }
119
137
 
120
- @return $-result;
138
+ // Все параметры прошли валидацию - выполняем форматирование числа.
139
+ @else {
140
+
141
+ // Инициализация переменной для хранения отформатированной строки.
142
+ // $-result будет содержать число с разделителями тысяч.
143
+ $-result: null;
144
+
145
+ // Преобразование абсолютного значения числа в строку.
146
+ // math.abs() возвращает абсолютное значение (без знака минус).
147
+ // meta.inspect() преобразует число в строковое представление.
148
+ $-str: meta.inspect(math.abs($value));
149
+
150
+ // Определение длины строкового представления числа.
151
+ // string.length() возвращает количество символов в строке.
152
+ $-length: string.length($-str);
153
+
154
+ // Счетчик для отслеживания количества обработанных цифр.
155
+ // Используется для вставки разделителя каждые 3 цифры.
156
+ $-counter: 0;
157
+
158
+ // Обратный цикл по символам строкового представления числа.
159
+ // Переменная $i принимает значения от $-length до 1 включительно.
160
+ // Цикл идет справа налево (от младших разрядов к старшим).
161
+ @for $i from $-length through 1 {
162
+
163
+ // Извлечение текущего символа (цифры) из строки.
164
+ // string.slice() возвращает подстроку, в данном случае один символ.
165
+ $char: string.slice($-str, $i, $i);
166
+
167
+ // Добавление символа в начало результата.
168
+ // Поскольку цикл идет справа налево, каждый новый символ
169
+ // добавляется в начало строки для сохранения правильного порядка.
170
+ $-result: $char + $-result;
171
+
172
+ // Увеличение счетчика обработанных цифр.
173
+ $-counter: $-counter + 1;
174
+
175
+ // Проверка: нужно ли вставить разделитель тысяч.
176
+ // Условие выполняется, если:
177
+ // 1. Обработано 3 цифры ($-counter == 3)
178
+ // 2. Есть еще цифры слева для обработки ($i > 1)
179
+ @if $-counter == 3 and $i > 1 {
180
+
181
+ // Вставка разделителя тысяч в начало результата.
182
+ // Разделитель добавляется перед текущей группой из 3 цифр.
183
+ $-result: $separator + $-result;
184
+
185
+ // Сброс счетчика для начала новой группы.
186
+ $-counter: 0;
187
+
188
+ }
189
+
190
+ }
191
+
192
+ // Обработка отрицательных чисел.
193
+ // Если исходное значение было отрицательным, добавляем знак минус
194
+ // в начало отформатированной строки.
195
+ @if $value < 0 {
196
+ $-result: "-" + $-result;
197
+ }
198
+
199
+ // Возвращаем отформатированную строку с разделителями тысяч.
200
+ // Число разбито на группы по 3 цифры, начиная справа.
201
+ @return $-result;
202
+
203
+ }
121
204
 
122
205
  }
@@ -1,9 +1,11 @@
1
1
  @use 'sass:math';
2
+ @use '../../loggers/log-invalid-type' as *;
3
+ @use '../../validators/type-of/is-number' as *;
2
4
 
3
5
  /// Нормализует число к единичному интервалу [0, 1].
4
6
  ///
5
7
  /// Функция выполняет линейное преобразование числа из
6
- /// исходного диапазона `[$min, $max]` в нормализованный
8
+ /// исходного диапазона `[$value-min, $value-max]` в нормализованный
7
9
  /// диапазон `[0, 1]`. Это фундаментальная математическая
8
10
  /// операция, используемая в статистике, компьютерной графике,
9
11
  /// анимациях и алгоритмах интерполяции.
@@ -33,7 +35,7 @@
33
35
  /// > создания прогресс-баров, цветовых градиентов и других
34
36
  /// > алгоритмов, требующих значений в единичном интервале.
35
37
  /// >
36
- /// > Для значений вне диапазона `[$min, $max]` результат будет
38
+ /// > Для значений вне диапазона `[$value-min, $value-max]` результат будет
37
39
  /// > выходить за пределы [0, 1], что может быть полезно для
38
40
  /// > экстраполяции или обнаружения выбросов.
39
41
  /// ---
@@ -143,18 +145,94 @@
143
145
  /// @param {Number} $value - Число для нормализации.
144
146
  /// Может быть любым числом: целым, дробным, положительным,
145
147
  /// отрицательным, с единицами измерения или без.
146
- /// @param {Number} $min - Нижняя граница исходного диапазона.
148
+ /// @param {Number} $value-min - Нижняя граница исходного диапазона.
147
149
  /// Значение, соответствующее `0` в нормализованном диапазоне.
148
- /// @param {Number} $max - Верхняя граница исходного диапазона.
150
+ /// @param {Number} $value-max - Верхняя граница исходного диапазона.
149
151
  /// Значение, соответствующее `1` в нормализованном диапазоне.
150
152
  /// @return {Number} - Нормализованное значение в диапазоне [0, 1].
151
153
  /// Возвращает дробное безразмерное число. Если `$value` находится
152
- /// между `$min` и `$max`, результат будет в диапазоне [0, 1].
153
- /// Если `$value` меньше `$min`, результат будет отрицательным.
154
- /// Если `$value` больше `$max`, результат будет больше 1.
154
+ /// между `$value-min` и `$value-max`, результат будет в диапазоне [0, 1].
155
+ /// Если `$value` меньше `$value-min`, результат будет отрицательным.
156
+ /// Если `$value` больше `$value-max`, результат будет больше 1.
155
157
  /// @throws {Error} - Может выбросить ошибку деления на ноль, если
156
- /// `$min == $max`. В этом случае знаменатель формулы становится
158
+ /// `$value-min == $value-max`. В этом случае знаменатель формулы становится
157
159
  /// нулем, что приводит к математической неопределенности.
158
- @function number-normalize($value, $min, $max) {
159
- @return math.div($value - $min, $max - $min);
160
+ /// @throws {Error} - Выбрасывает ошибку, если в параметры передано
161
+ /// значение, не соответствующее типу `number`. Компиляция Sass
162
+ /// будет остановлена с ошибкой.
163
+ @function number-normalize($value, $value-min, $value-max) {
164
+
165
+ // Проверка типа первого параметра: ожидается числовое значение.
166
+ // Функция is-number() проверяет, является ли $value числом.
167
+ // $value будет нормализовано в диапазон от 0 до 1.
168
+ @if not is-number($value) {
169
+
170
+ // Если $value не является числом, возвращаем ошибку через
171
+ // стандартную функцию логирования. Это предотвращает
172
+ // некорректные вычисления с нечисловыми данными.
173
+ @return log-invalid-type(
174
+ 'number-normalize',
175
+ $value,
176
+ '$value',
177
+ 'number'
178
+ );
179
+
180
+ }
181
+
182
+ // Проверка типа второго параметра: ожидается числовое значение
183
+ // минимальной границы исходного диапазона. $value-min определяет
184
+ // нижнюю границу диапазона, из которого будет нормализовано число.
185
+ @else if not is-number($value-min) {
186
+
187
+ // Если $value-min не является числом, возвращаем ошибку.
188
+ // Проверка выполняется только если $value прошел валидацию.
189
+ @return log-invalid-type(
190
+ 'number-normalize',
191
+ $value-min,
192
+ '$value-min',
193
+ 'number'
194
+ );
195
+
196
+ }
197
+
198
+ // Проверка типа третьего параметра: ожидается числовое значение
199
+ // максимальной границы исходного диапазона. $value-max определяет
200
+ // верхнюю границу диапазона, из которого будет нормализовано число.
201
+ @else if not is-number($value-max) {
202
+
203
+ // Если $value-max не является числом, возвращаем ошибку.
204
+ // Проверка выполняется только если $value и $value-min
205
+ // прошли валидацию.
206
+ @return log-invalid-type(
207
+ 'number-normalize',
208
+ $value-max,
209
+ '$value-max',
210
+ 'number'
211
+ );
212
+
213
+ }
214
+
215
+ // Все параметры прошли валидацию - выполняем нормализацию.
216
+ @else {
217
+
218
+ // Формула нормализации числа из произвольного диапазона
219
+ // [$value-min, $value-max] в диапазон [0, 1]:
220
+ //
221
+ // Алгоритм вычислений:
222
+ // 1. $value - $value-min - смещаем значение так, чтобы минимальное
223
+ // значение диапазона стало 0
224
+ // 2. $value-max - $value-min - вычисляем ширину исходного диапазона
225
+ // 3. math.div(...) - делим смещенное значение на ширину диапазона
226
+ // для получения нормализованного значения от 0 до 1
227
+ //
228
+ // Математическая формула:
229
+ // result = (value - value-min) ÷ (value-max - value-min)
230
+ //
231
+ // Ключевая особенность: функция преобразует значение из произвольного
232
+ // диапазона в нормализованное значение от 0 до 1, где 0 соответствует
233
+ // $value-min, а 1 соответствует $value-max.
234
+ @return math.div($value - $value-min, $value-max - $value-min);
235
+
236
+ }
237
+
160
238
  }
@@ -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
- /// При `$max < $min` результат может быть неожиданным.
82
- @function number-random-between-int($min, $max) {
83
- @return math.floor($min + math.random() * ($max - $min + 1));
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 {Error} - Не выбрасывает ошибок явно, но при
115
- /// `$max < $min` результат может быть неожиданным (возможны
116
- /// отрицательные значения длины диапазона). Рекомендуется
117
- /// всегда передавать `$min ≤ $max`.
118
- @function number-random-between($min, $max) {
119
- @return $min + math.random() * ($max - $min);
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
  }