@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,6 +1,6 @@
1
- @forward 'url-encode.configs';
1
+ @forward './url-encode.configs';
2
2
 
3
- @use 'url-encode.configs' as configs;
3
+ @use './url-encode.configs' as configs;
4
4
  @use '../string/string-replace' as *;
5
5
  @use '../../loggers/log-invalid-type' as *;
6
6
  @use '../../validators/type-of/is-map' as *;
@@ -66,12 +66,11 @@
66
66
  /// значение - процентное представление символа.
67
67
  /// @return {String} - Закодированная строка, где все символы
68
68
  /// из карты замены преобразованы в их процентное
69
- /// представление. Строка безопасна для использования в
70
- /// любой части URL (path, query, fragment).
71
- /// @throws {Error} - Может выбросить ошибку при передаче
72
- /// нестрокового значения или если функция `string-replace`
73
- /// не определена. Требуется наличие функции `string-replace`
74
- /// в доступном scope.
69
+ /// представление.
70
+ /// @throws {Error} - Выбрасывает ошибку, если в параметры передано
71
+ /// значение, не соответствующее типу `string` (`$value`) или
72
+ /// `map` (`$chars-map`). Компиляция Sass будет остановлена
73
+ /// с ошибкой.
75
74
  /// @require {function} string-replace - Вспомогательная
76
75
  /// функция замены подстрок в строке. Должна быть определена
77
76
  /// и доступна для корректной работы данной функции.
@@ -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
  ///
@@ -103,9 +105,59 @@
103
105
  /// @return {Number} - Число, округленное вверх до ближайшего
104
106
  /// значения, кратного `$nearest`. Сохраняет единицы
105
107
  /// измерения исходного числа `$value`.
106
- /// @throws {Error} - Может выбросить ошибку если `$value` или
107
- /// `$nearest` не являются числами, или если происходит
108
- /// деление на ноль.
108
+ /// @throws {Error} - Выбрасывает ошибку, если в параметры передано
109
+ /// значение, не соответствующее типу `number`. Компиляция Sass
110
+ /// будет остановлена с ошибкой.
109
111
  @function number-ceil-to($value, $nearest) {
110
- @return math.ceil(math.div($value, $nearest)) * $nearest;
112
+
113
+ // Проверка типа первого параметра: ожидается числовое значение.
114
+ // Функция is-number() проверяет, является ли $value числом.
115
+ // Это может быть целое число, дробное число или число с единицами измерения.
116
+ @if not is-number($value) {
117
+
118
+ // Если $value не является числом, возвращаем ошибку через
119
+ // стандартную функцию логирования. Это предотвращает
120
+ // некорректные вычисления с нечисловыми данными.
121
+ @return log-invalid-type(
122
+ 'number-ceil-to',
123
+ $value,
124
+ '$value',
125
+ 'number'
126
+ );
127
+
128
+ }
129
+
130
+ // Проверка типа второго параметра: ожидается числовое значение
131
+ // для шага округления. $nearest определяет, до какого ближайшего
132
+ // кратного значения нужно округлить исходное число.
133
+ @else if not is-number($nearest) {
134
+
135
+ // Если $nearest не является числом, возвращаем ошибку.
136
+ // Проверка выполняется только если $value прошел валидацию.
137
+ @return log-invalid-type(
138
+ 'number-ceil-to',
139
+ $nearest,
140
+ '$nearest',
141
+ 'number'
142
+ );
143
+
144
+ }
145
+
146
+ // Все параметры прошли валидацию - выполняем округление вверх.
147
+ @else {
148
+
149
+ // Формула округления вверх до ближайшего кратного значения:
150
+ // 1. math.div($value, $nearest) - делим исходное значение на шаг округления
151
+ // 2. math.ceil() - округляем результат деления вверх до ближайшего целого
152
+ // 3. * $nearest - умножаем округленное целое на шаг округления
153
+ //
154
+ // Математическая формула:
155
+ // result = ceil(value / nearest) × nearest
156
+ //
157
+ // Ключевая особенность: функция всегда округляет ВВЕРХ до ближайшего
158
+ // кратного значения, даже если исходное число уже близко к нижнему крайнему.
159
+ @return math.ceil(math.div($value, $nearest)) * $nearest;
160
+
161
+ }
162
+
111
163
  }
@@ -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
  /// значение.
@@ -13,7 +15,7 @@
13
15
  /// - Если `value ≤ max` → возвращает `value`
14
16
  ///
15
17
  /// Важные особенности функции:
16
- /// - Гарантирует, что результат будет не больше `$max`
18
+ /// - Гарантирует, что результат будет не больше `$value-max`
17
19
  /// - Использует встроенную функцию `math.min()`
18
20
  /// - Работает с любыми числовыми значениями (целые, дробные,
19
21
  /// с единицами)
@@ -78,15 +80,68 @@
78
80
  /// сверху. Может быть любым числом: целым, дробным,
79
81
  /// положительным, отрицательным, с единицами измерения
80
82
  /// или без.
81
- /// @param {Number} $max - Максимальное допустимое значение.
82
- /// Если `$value` больше `$max`, возвращается `$max`.
83
+ /// @param {Number} $value-max - Максимальное допустимое значение.
84
+ /// Если `$value` больше `$value-max`, возвращается `$value-max`.
83
85
  /// @return {Number} - Наименьшее из двух значений: `$value`
84
- /// или `$max`. Если `$value` меньше или равно `$max`,
86
+ /// или `$value-max`. Если `$value` меньше или равно `$value-max`,
85
87
  /// возвращается `$value`. В противном случае возвращается
86
- /// `$max`.
87
- /// @throws Не выбрасывает ошибок, безопасно обрабатывает
88
- /// все числовые значения. Оба аргумента должны быть
89
- /// числами для корректной работы.
90
- @function number-clamp-max($value, $max) {
91
- @return math.min($value, $max);
88
+ /// `$value-max`.
89
+ /// @throws {Error} - Выбрасывает ошибку, если в параметры передано
90
+ /// значение, не соответствующее типу `number`. Компиляция Sass
91
+ /// будет остановлена с ошибкой.
92
+ @function number-clamp-max($value, $value-max) {
93
+
94
+ // Проверка типа первого параметра: ожидается числовое значение.
95
+ // Функция is-number() проверяет, является ли $value числом.
96
+ // Это может быть целое число, дробное число или число с единицами измерения.
97
+ @if not is-number($value) {
98
+
99
+ // Если $value не является числом, возвращаем ошибку через
100
+ // стандартную функцию логирования. Это предотвращает
101
+ // некорректные вычисления с нечисловыми данными.
102
+ @return log-invalid-type(
103
+ 'number-clamp-max',
104
+ $value,
105
+ '$value',
106
+ 'number'
107
+ );
108
+
109
+ }
110
+
111
+ // Проверка типа второго параметра: ожидается числовое значение
112
+ // максимального предела. $value-max определяет верхнюю границу,
113
+ // которую не может превышать возвращаемое значение.
114
+ @else if not is-number($value-max) {
115
+
116
+ // Если $value-max не является числом, возвращаем ошибку.
117
+ // Проверка выполняется только если $value прошел валидацию.
118
+ @return log-invalid-type(
119
+ 'number-clamp-max',
120
+ $value-max,
121
+ '$value-max',
122
+ 'number'
123
+ );
124
+
125
+ }
126
+
127
+ // Все параметры прошли валидацию - выполняем ограничение сверху.
128
+ @else {
129
+
130
+ // Формула ограничения значения сверху:
131
+ // Используем встроенную функцию math.min() для выбора
132
+ // меньшего из двух значений.
133
+ //
134
+ // Логика работы:
135
+ // - Если $value меньше или равен $value-max, возвращается $value
136
+ // - Если $value больше $value-max, возвращается $value-max
137
+ //
138
+ // Математическая формула:
139
+ // result = min(value, max-value)
140
+ //
141
+ // Ключевая особенность: функция гарантирует, что возвращаемое
142
+ // значение никогда не превысит указанный максимальный предел.
143
+ @return math.min($value, $value-max);
144
+
145
+ }
146
+
92
147
  }
@@ -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
  ///
@@ -12,7 +14,7 @@
12
14
  /// - Если `value ≥ min` → возвращает `value`
13
15
  ///
14
16
  /// Важные особенности функции:
15
- /// - Гарантирует, что результат будет не меньше `$min`
17
+ /// - Гарантирует, что результат будет не меньше `$value-min`
16
18
  /// - Использует встроенную функцию `math.max()`
17
19
  /// - Работает с любыми числовыми значениями (целые, дробные,
18
20
  /// с единицами)
@@ -86,15 +88,68 @@
86
88
  /// снизу. Может быть любым числом: целым, дробным,
87
89
  /// положительным, отрицательным, с единицами измерения или
88
90
  /// без.
89
- /// @param {Number} $min - Минимальное допустимое значение.
90
- /// Если `$value` меньше `$min`, возвращается `$min`.
91
+ /// @param {Number} $value-min - Минимальное допустимое значение.
92
+ /// Если `$value` меньше `$value-min`, возвращается `$value-min`.
91
93
  /// @return {Number} - Наибольшее из двух значений: `$value`
92
- /// или `$min`. Если `$value` больше или равно `$min`,
94
+ /// или `$value-min`. Если `$value` больше или равно `$value-min`,
93
95
  /// возвращается `$value`. В противном случае возвращается
94
- /// `$min`.
95
- /// @throws Не выбрасывает ошибок, безопасно обрабатывает все
96
- /// числовые значения. Оба аргумента должны быть числами
97
- /// для корректной работы.
98
- @function number-clamp-min($value, $min) {
99
- @return math.max($value, $min);
96
+ /// `$value-min`.
97
+ /// @throws {Error} - Выбрасывает ошибку, если в параметры передано
98
+ /// значение, не соответствующее типу `number`. Компиляция Sass
99
+ /// будет остановлена с ошибкой.
100
+ @function number-clamp-min($value, $value-min) {
101
+
102
+ // Проверка типа первого параметра: ожидается числовое значение.
103
+ // Функция is-number() проверяет, является ли $value числом.
104
+ // Это может быть целое число, дробное число или число с единицами измерения.
105
+ @if not is-number($value) {
106
+
107
+ // Если $value не является числом, возвращаем ошибку через
108
+ // стандартную функцию логирования. Это предотвращает
109
+ // некорректные вычисления с нечисловыми данными.
110
+ @return log-invalid-type(
111
+ 'number-clamp-min',
112
+ $value,
113
+ '$value',
114
+ 'number'
115
+ );
116
+
117
+ }
118
+
119
+ // Проверка типа второго параметра: ожидается числовое значение
120
+ // минимального предела. $value-min определяет нижнюю границу,
121
+ // ниже которой не может опускаться возвращаемое значение.
122
+ @else if not is-number($value-min) {
123
+
124
+ // Если $value-min не является числом, возвращаем ошибку.
125
+ // Проверка выполняется только если $value прошел валидацию.
126
+ @return log-invalid-type(
127
+ 'number-clamp-min',
128
+ $value-min,
129
+ '$value-min',
130
+ 'number'
131
+ );
132
+
133
+ }
134
+
135
+ // Все параметры прошли валидацию - выполняем ограничение снизу.
136
+ @else {
137
+
138
+ // Формула ограничения значения снизу:
139
+ // Используем встроенную функцию math.max() для выбора
140
+ // большего из двух значений.
141
+ //
142
+ // Логика работы:
143
+ // - Если $value больше или равен $value-min, возвращается $value
144
+ // - Если $value меньше $value-min, возвращается $value-min
145
+ //
146
+ // Математическая формула:
147
+ // result = max(value, min-value)
148
+ //
149
+ // Ключевая особенность: функция гарантирует, что возвращаемое
150
+ // значение никогда не будет меньше указанного минимального предела.
151
+ @return math.max($value, $value-min);
152
+
153
+ }
154
+
100
155
  }
@@ -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
  ///
@@ -16,7 +18,7 @@
16
18
  /// - Если `min ≤ value ≤ max` → возвращает `value`
17
19
  ///
18
20
  /// Важные особенности функции:
19
- /// - Гарантирует, что результат будет в диапазоне `[$min, $max]`
21
+ /// - Гарантирует, что результат будет в диапазоне `[$value-min, $value-max]`
20
22
  /// - Использует встроенные функции `math.max()` и `math.min()`
21
23
  /// - Работает с любыми числовыми значениями (целые, дробные,
22
24
  /// с единицами)
@@ -32,7 +34,7 @@
32
34
  /// > `number-clamp()` вычисляется один раз при компиляции и
33
35
  /// > возвращает фиксированное значение. Для обеспечения
34
36
  /// > корректной работы рекомендуется всегда передавать
35
- /// > `$min ≤ $max`. При `$min > $max` функция все равно
37
+ /// > `$value-min ≤ $value-max`. При `$value-min > $value-max` функция все равно
36
38
  /// > работает, но результат может отличаться от ожидаемого.
37
39
  /// ---
38
40
  /// @name number-clamp
@@ -92,18 +94,92 @@
92
94
  /// @param {Number} $value - Число, которое нужно ограничить.
93
95
  /// Может быть любым числом: целым, дробным, положительным,
94
96
  /// отрицательным, с единицами измерения или без.
95
- /// @param {Number} $min - Минимальное допустимое значение.
96
- /// Если `$value` меньше `$min`, возвращается `$min`.
97
- /// @param {Number} $max - Максимальное допустимое значение.
98
- /// Если `$value` больше `$max`, возвращается `$max`.
97
+ /// @param {Number} $value-min - Минимальное допустимое значение.
98
+ /// Если `$value` меньше `$value-min`, возвращается `$value-min`.
99
+ /// @param {Number} $value-max - Максимальное допустимое значение.
100
+ /// Если `$value` больше `$value-max`, возвращается `$value-max`.
99
101
  /// @return {Number} - Значение `$value`, ограниченное
100
- /// диапазоном `[$min, $max]`. Если `$value` находится в
102
+ /// диапазоном `[$value-min, $value-max]`. Если `$value` находится в
101
103
  /// пределах диапазона, возвращается исходное значение. В
102
104
  /// противном случае возвращается соответствующая граница
103
105
  /// диапазона.
104
- /// @throws {Error} - Не выбрасывает ошибок, даже при
105
- /// некорректных диапазонах (когда `$min > $max`). Однако
106
- /// в таких случаях поведение функции может быть неинтуитивным.
107
- @function number-clamp($value, $min, $max) {
108
- @return math.min(math.max($value, $min), $max);
106
+ /// @throws {Warning} - когда `$value-min > $value-max` поведение
107
+ /// функции может быть неинтуитивным.
108
+ /// @throws {Error} - Выбрасывает ошибку, если в параметры передано
109
+ /// значение, не соответствующее типу `number`. Компиляция Sass
110
+ /// будет остановлена с ошибкой.
111
+ @function number-clamp($value, $value-min, $value-max) {
112
+
113
+ // Проверка типа первого параметра: ожидается числовое значение.
114
+ // Функция is-number() проверяет, является ли $value числом.
115
+ // Это может быть целое число, дробное число или число с единицами измерения.
116
+ @if not is-number($value) {
117
+
118
+ // Если $value не является числом, возвращаем ошибку через
119
+ // стандартную функцию логирования. Это предотвращает
120
+ // некорректные вычисления с нечисловыми данными.
121
+ @return log-invalid-type(
122
+ 'number-clamp',
123
+ $value,
124
+ '$value',
125
+ 'number'
126
+ );
127
+
128
+ }
129
+
130
+ // Проверка типа второго параметра: ожидается числовое значение
131
+ // минимального предела. $value-min определяет нижнюю границу,
132
+ // ниже которой не может опускаться возвращаемое значение.
133
+ @else if not is-number($value-min) {
134
+
135
+ // Если $value-min не является числом, возвращаем ошибку.
136
+ // Проверка выполняется только если $value прошел валидацию.
137
+ @return log-invalid-type(
138
+ 'number-clamp',
139
+ $value-min,
140
+ '$value-min',
141
+ 'number'
142
+ );
143
+
144
+ }
145
+
146
+ // Проверка типа третьего параметра: ожидается числовое значение
147
+ // максимального предела. $value-max определяет верхнюю границу,
148
+ // которую не может превышать возвращаемое значение.
149
+ @else if not is-number($value-max) {
150
+
151
+ // Если $value-max не является числом, возвращаем ошибку.
152
+ // Проверка выполняется только если $value и $value-min
153
+ // прошли валидацию.
154
+ @return log-invalid-type(
155
+ 'number-clamp',
156
+ $value-max,
157
+ '$value-max',
158
+ 'number'
159
+ );
160
+
161
+ }
162
+
163
+ // Все параметры прошли валидацию - выполняем ограничение диапазона.
164
+ @else {
165
+
166
+ // Формула ограничения значения в заданном диапазоне:
167
+ // Используем комбинацию встроенных функций math.max() и math.min().
168
+ //
169
+ // Логика работы:
170
+ // 1. math.max($value, $value-min) - гарантирует, что значение
171
+ // не будет меньше минимального предела
172
+ // 2. math.min(..., $value-max) - гарантирует, что значение
173
+ // не будет больше максимального предела
174
+ //
175
+ // Математическая формула:
176
+ // result = min(max(value, min-value), max-value)
177
+ //
178
+ // Ключевая особенность: функция гарантирует, что возвращаемое
179
+ // значение всегда будет находиться в диапазоне между $value-min
180
+ // и $value-max включительно.
181
+ @return math.min(math.max($value, $value-min), $value-max);
182
+
183
+ }
184
+
109
185
  }
@@ -1,9 +1,12 @@
1
+ @use '../../loggers/log-invalid-type' as *;
2
+ @use '../../validators/type-of/is-number' as *;
3
+
1
4
  /// Денормализует число из единичного интервала [0, 1] в
2
5
  /// исходный диапазон.
3
6
  ///
4
7
  /// Функция выполняет обратное линейное преобразование числа
5
8
  /// из нормализованного диапазона `[0, 1]` обратно в исходный
6
- /// диапазон `[$min, $max]`. Это операция, обратная функции
9
+ /// диапазон `[$value-min, $value-max]`. Это операция, обратная функции
7
10
  /// `number-normalize()`, и восстанавливает исходное значение
8
11
  /// после нормализации.
9
12
  ///
@@ -28,8 +31,8 @@
28
31
  ///
29
32
  /// > Эта функция является точной обратной операцией к
30
33
  /// > `number-normalize()`. Для любого значения `x` в диапазоне
31
- /// > `[$min, $max]` выполняется тождество:
32
- /// > `number-denormalize(number-normalize(x, $min, $max), $min, $max) == x`.
34
+ /// > `[$value-min, $value-max]` выполняется тождество:
35
+ /// > `number-denormalize(number-normalize(x, $value-min, $value-max), $value-min, $value-max) == x`.
33
36
  /// > Функция также поддерживает экстраполяцию для значений
34
37
  /// > вне диапазона [0, 1], что полезно для выхода за пределы
35
38
  /// > исходного диапазона или для работы с выбросами.
@@ -155,18 +158,93 @@
155
158
  /// диапазоне [0, 1]. Обычно полученное с помощью
156
159
  /// `number-normalize()`. Может быть любым числом, включая
157
160
  /// значения вне [0, 1] для экстраполяции.
158
- /// @param {Number} $min - Нижняя граница целевого диапазона.
161
+ /// @param {Number} $value-min - Нижняя граница целевого диапазона.
159
162
  /// Значение, соответствующее `0` в нормализованном диапазоне.
160
- /// @param {Number} $max - Верхняя граница целевого диапазона.
163
+ /// @param {Number} $value-max - Верхняя граница целевого диапазона.
161
164
  /// Значение, соответствующее `1` в нормализованном диапазоне.
162
165
  /// @return {Number} - Денормализованное значение в целевом
163
166
  /// диапазоне. Восстанавливает исходные единицы измерения
164
- /// из `$min` и `$max`. Для `$value` в [0, 1] результат
165
- /// будет в диапазоне `[$min, $max]`. Для значений вне [0, 1]
167
+ /// из `$value-min` и `$value-max`. Для `$value` в [0, 1] результат
168
+ /// будет в диапазоне `[$value-min, $value-max]`. Для значений вне [0, 1]
166
169
  /// выполняет линейную экстраполяцию.
167
170
  /// @throws Не выбрасывает ошибок, безопасно обрабатывает все
168
171
  /// числовые значения. Формула математически корректна для
169
172
  /// любых числовых аргументов.
170
- @function number-denormalize($value, $min, $max) {
171
- @return $value * ($max - $min) + $min;
173
+ /// @throws {Error} - Выбрасывает ошибку, если в параметры передано
174
+ /// значение, не соответствующее типу `number`. Компиляция Sass
175
+ /// будет остановлена с ошибкой.
176
+ @function number-denormalize($value, $value-min, $value-max) {
177
+
178
+ // Проверка типа первого параметра: ожидается нормализованное числовое значение.
179
+ // Функция is-number() проверяет, является ли $value числом.
180
+ // $value должно быть числом в диапазоне от 0 до 1 (нормализованное значение).
181
+ @if not is-number($value) {
182
+
183
+ // Если $value не является числом, возвращаем ошибку через
184
+ // стандартную функцию логирования. Это предотвращает
185
+ // некорректные вычисления с нечисловыми данными.
186
+ @return log-invalid-type(
187
+ 'number-denormalize',
188
+ $value,
189
+ '$value',
190
+ 'number'
191
+ );
192
+
193
+ }
194
+
195
+ // Проверка типа второго параметра: ожидается числовое значение
196
+ // минимальной границы диапазона. $value-min определяет нижнее
197
+ // значение целевого диапазона, в который будет денормализовано число.
198
+ @else if not is-number($value-min) {
199
+
200
+ // Если $value-min не является числом, возвращаем ошибку.
201
+ // Проверка выполняется только если $value прошел валидацию.
202
+ @return log-invalid-type(
203
+ 'number-denormalize',
204
+ $value-min,
205
+ '$value-min',
206
+ 'number'
207
+ );
208
+
209
+ }
210
+
211
+ // Проверка типа третьего параметра: ожидается числовое значение
212
+ // максимальной границы диапазона. $value-max определяет верхнее
213
+ // значение целевого диапазона, в который будет денормализовано число.
214
+ @else if not is-number($value-max) {
215
+
216
+ // Если $value-max не является числом, возвращаем ошибку.
217
+ // Проверка выполняется только если $value и $value-min
218
+ // прошли валидацию.
219
+ @return log-invalid-type(
220
+ 'number-denormalize',
221
+ $value-max,
222
+ '$value-max',
223
+ 'number'
224
+ );
225
+
226
+ }
227
+
228
+ // Все параметры прошли валидацию - выполняем денормализацию.
229
+ @else {
230
+
231
+ // Формула денормализации числа из диапазона [0, 1]
232
+ // в произвольный диапазон [$value-min, $value-max]:
233
+ //
234
+ // Алгоритм вычислений:
235
+ // 1. ($value-max - $value-min) - вычисляем ширину целевого диапазона
236
+ // 2. $value * ... - умножаем нормализованное значение на ширину диапазона
237
+ // 3. ... + $value-min - добавляем минимальное значение для смещения
238
+ // результата в нужный диапазон
239
+ //
240
+ // Математическая формула:
241
+ // result = value × (value-max - value-min) + value-min
242
+ //
243
+ // Ключевая особенность: функция преобразует нормализованное значение
244
+ // (обычно в диапазоне от 0 до 1) в значение в произвольном диапазоне,
245
+ // сохраняя относительное положение в пределах диапазона.
246
+ @return $value * ($value-max - $value-min) + $value-min;
247
+
248
+ }
249
+
172
250
  }
@@ -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
  ///
@@ -216,20 +218,71 @@
216
218
  /// - Второй элемент: всегда 1 (если `$n > 1`)
217
219
  /// - Каждый последующий элемент: сумма двух предыдущих
218
220
  /// - Все элементы: целые положительные числа
221
+ /// @throws {Error} - Выбрасывает ошибку, если в параметры передано
222
+ /// значение, не соответствующее типу `number`. Компиляция Sass
223
+ /// будет остановлена с ошибкой.
219
224
  @function number-fibonacci($n) {
220
- $-result: ();
221
- $-a: 0;
222
- $-b: 1;
223
225
 
224
- @for $i from 1 through $n {
226
+ // Проверка типа входного параметра: ожидается числовое значение.
227
+ // Функция is-number() проверяет, является ли $n числом.
228
+ // $n определяет количество чисел Фибоначчи, которые нужно сгенерировать.
229
+ @if not is-number($n) {
225
230
 
226
- $-result: list.append($-result, $-b);
227
- $-temp: $-a + $-b;
228
- $-a: $-b;
229
- $-b: $-temp;
231
+ // Если $n не является числом, возвращаем ошибку через
232
+ // стандартную функцию логирования. Это предотвращает
233
+ // некорректные вычисления с нечисловыми данными.
234
+ @return log-invalid-type(
235
+ 'number-fibonacci',
236
+ $n,
237
+ '$n',
238
+ 'number'
239
+ );
230
240
 
231
241
  }
232
242
 
233
- @return $-result;
243
+ // Основная логика выполняется только если $n является
244
+ // корректным числом.
245
+ @else {
246
+
247
+ // Инициализация переменной для хранения результата.
248
+ // $-result будет содержать список чисел Фибоначчи.
249
+ $-result: ();
250
+
251
+ // Инициализация начальных значений последовательности Фибоначчи.
252
+ // $-a и $-b представляют два предыдущих числа в последовательности.
253
+ // Последовательность Фибоначчи начинается с: 0, 1, 1, 2, 3, 5, 8...
254
+ // Для генерации n чисел мы начинаем с $-a = 0, $-b = 1.
255
+ $-a: 0;
256
+ $-b: 1;
257
+
258
+ // Цикл генерации чисел Фибоначчи.
259
+ // Переменная $i принимает значения от 1 до $n включительно.
260
+ // На каждой итерации генерируется одно число Фибоначчи.
261
+ @for $i from 1 through $n {
262
+
263
+ // Добавление текущего числа Фибоначчи в список результата.
264
+ // На первой итерации $-b = 1 (первое число Фибоначчи).
265
+ // Функция list.append() добавляет число в конец списка.
266
+ $-result: list.append($-result, $-b);
267
+
268
+ // Вычисление следующего числа Фибоначчи.
269
+ // Алгоритм:
270
+ // 1. $-temp: временная переменная для хранения суммы двух предыдущих чисел
271
+ // 2. $-a: обновление для следующей итерации (становится предыдущим $-b)
272
+ // 3. $-b: обновление для следующей итерации (становится вычисленной суммой)
273
+ $-temp: $-a + $-b;
274
+ $-a: $-b;
275
+ $-b: $-temp;
276
+
277
+ }
278
+
279
+ // Возвращаем список сгенерированных чисел Фибоначчи.
280
+ // Список содержит $n чисел, начиная с 1 (первое число Фибоначчи).
281
+ // Классическая последовательность Фибоначчи начинается с 0, 1,
282
+ // но данная реализация начинает с 1 для более практического использования
283
+ // в дизайне (золотое сечение, пропорции и т.д.).
284
+ @return $-result;
285
+
286
+ }
234
287
 
235
288
  }