@omnisass/library 0.2.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 +5 -0
- package/LICENSE +21 -0
- package/README.md +2 -0
- package/_configs.scss +68 -0
- package/index.scss +95 -0
- package/modules/utilities/converters/_convert-camel2kebab.scss +186 -0
- package/modules/utilities/converters/_convert-em2px.scss +239 -0
- package/modules/utilities/converters/_convert-hex2rgb.scss +97 -0
- package/modules/utilities/converters/_convert-hex2rgba.scss +124 -0
- package/modules/utilities/converters/_convert-kebab2camel.scss +232 -0
- package/modules/utilities/converters/_convert-kebab2snake.scss +118 -0
- package/modules/utilities/converters/_convert-px2em.scss +236 -0
- package/modules/utilities/converters/_convert-px2rem.scss +180 -0
- package/modules/utilities/converters/_convert-rem2px.scss +207 -0
- package/modules/utilities/converters/_convert-snake2kebab.scss +173 -0
- package/modules/utilities/getters/color/_get-color-brightness.scss +138 -0
- package/modules/utilities/getters/color/_get-color-darkest.scss +178 -0
- package/modules/utilities/getters/list/_get-list-item-end.scss +114 -0
- package/modules/utilities/getters/list/_get-list-item-start.scss +109 -0
- package/modules/utilities/getters/list/_get-list-item.scss +179 -0
- package/modules/utilities/getters/number/_get-number-from-percent.scss +139 -0
- package/modules/utilities/getters/number/_get-number-height-by-ratio.scss +199 -0
- package/modules/utilities/getters/number/_get-number-max.scss +168 -0
- package/modules/utilities/getters/number/_get-number-min.scss +162 -0
- package/modules/utilities/getters/number/_get-number-percentage-of.scss +149 -0
- package/modules/utilities/getters/number/_get-number-unit.scss +111 -0
- package/modules/utilities/getters/number/_get-number-width-by-ratio.scss +223 -0
- package/modules/utilities/helpers/color/_color-blend-steps.scss +210 -0
- package/modules/utilities/helpers/color/_color-blend.scss +183 -0
- package/modules/utilities/helpers/color/_color-hue-shift.scss +148 -0
- package/modules/utilities/helpers/color/_color-scale.scss +208 -0
- package/modules/utilities/helpers/color/_color-shade.scss +113 -0
- package/modules/utilities/helpers/color/_color-tint.scss +118 -0
- package/modules/utilities/helpers/color/_color-triad.scss +141 -0
- package/modules/utilities/helpers/list/_list-dedupe.scss +146 -0
- package/modules/utilities/helpers/list/_list-insert-at.scss +166 -0
- package/modules/utilities/helpers/list/_list-merge.scss +86 -0
- package/modules/utilities/helpers/list/_list-remove-at.scss +160 -0
- package/modules/utilities/helpers/list/_list-sum-numbers-safe.scss +175 -0
- package/modules/utilities/helpers/list/_list-sum-numbers.scss +128 -0
- package/modules/utilities/helpers/misc/_url-encode.configs.scss +64 -0
- package/modules/utilities/helpers/misc/_url-encode.scss +148 -0
- package/modules/utilities/helpers/number/_number-ceil-to.scss +111 -0
- package/modules/utilities/helpers/number/_number-clamp-max.scss +92 -0
- package/modules/utilities/helpers/number/_number-clamp-min.scss +100 -0
- package/modules/utilities/helpers/number/_number-clamp.scss +109 -0
- package/modules/utilities/helpers/number/_number-denormalize.scss +172 -0
- package/modules/utilities/helpers/number/_number-fibonacci.scss +235 -0
- package/modules/utilities/helpers/number/_number-floor-to.scss +114 -0
- package/modules/utilities/helpers/number/_number-format-with-separator.scss +122 -0
- package/modules/utilities/helpers/number/_number-normalize.scss +160 -0
- package/modules/utilities/helpers/number/_number-random-between-int.scss +84 -0
- package/modules/utilities/helpers/number/_number-random-between.scss +120 -0
- package/modules/utilities/helpers/number/_number-range.scss +268 -0
- package/modules/utilities/helpers/number/_number-round-to-nearest.scss +131 -0
- package/modules/utilities/helpers/number/_number-round-to.scss +118 -0
- package/modules/utilities/helpers/number/_number-strip-unit.scss +97 -0
- package/modules/utilities/helpers/string/_string-capitalize.scss +84 -0
- package/modules/utilities/helpers/string/_string-replace.scss +69 -0
- package/modules/utilities/helpers/string/_string-trim-end.scss +62 -0
- package/modules/utilities/helpers/string/_string-trim-start.scss +62 -0
- package/modules/utilities/helpers/string/_string-trim.scss +69 -0
- package/modules/utilities/loggers/_log-invalid-type.scss +151 -0
- package/modules/utilities/loggers/_log-invalid-value.scss +151 -0
- package/modules/utilities/setters/_index.scss +3 -0
- package/modules/utilities/validators/color/_is-color-light.scss +132 -0
- package/modules/utilities/validators/color/_is-color-list.scss +124 -0
- package/modules/utilities/validators/list/_is-list-contained.scss +65 -0
- package/modules/utilities/validators/misc/_is-time.scss +115 -0
- package/modules/utilities/validators/number/_is-int-even.scss +69 -0
- package/modules/utilities/validators/number/_is-int-odd.scss +70 -0
- package/modules/utilities/validators/number/_is-int.scss +124 -0
- package/modules/utilities/validators/number/_is-number-has-unit.scss +85 -0
- package/modules/utilities/validators/number/_is-number-negative.scss +76 -0
- package/modules/utilities/validators/number/_is-number-positive.scss +74 -0
- package/modules/utilities/validators/number/_is-number-unitless.scss +88 -0
- package/modules/utilities/validators/number/_is-number-zero.scss +75 -0
- package/modules/utilities/validators/string/_is-string-contained.scss +108 -0
- package/modules/utilities/validators/string/_is-string-empty.scss +56 -0
- package/modules/utilities/validators/string/_is-string-ending-with.scss +66 -0
- package/modules/utilities/validators/string/_is-string-starting-with.scss +66 -0
- package/modules/utilities/validators/type-of/_is-boolean.scss +92 -0
- package/modules/utilities/validators/type-of/_is-color.scss +96 -0
- package/modules/utilities/validators/type-of/_is-list.scss +105 -0
- package/modules/utilities/validators/type-of/_is-map.scss +105 -0
- package/modules/utilities/validators/type-of/_is-number.scss +103 -0
- package/modules/utilities/validators/type-of/_is-string.scss +110 -0
- package/modules/utilities/validators/type-of/_is-type.scss +77 -0
- package/package.json +54 -0
- package/package.scss +156 -0
- package/test.md +168 -0
- package/test.scss +405 -0
- package/test.sh +149 -0
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
@use 'sass:math';
|
|
2
|
+
|
|
3
|
+
/// Нормализует число к единичному интервалу [0, 1].
|
|
4
|
+
///
|
|
5
|
+
/// Функция выполняет линейное преобразование числа из
|
|
6
|
+
/// исходного диапазона `[$min, $max]` в нормализованный
|
|
7
|
+
/// диапазон `[0, 1]`. Это фундаментальная математическая
|
|
8
|
+
/// операция, используемая в статистике, компьютерной графике,
|
|
9
|
+
/// анимациях и алгоритмах интерполяции.
|
|
10
|
+
///
|
|
11
|
+
/// Математическая формула:
|
|
12
|
+
/// - `normalized = (value - min) / (max - min)`
|
|
13
|
+
///
|
|
14
|
+
/// Свойства результата:
|
|
15
|
+
/// - Если `value = min` → возвращает `0`
|
|
16
|
+
/// - Если `value = max` → возвращает `1`
|
|
17
|
+
/// - Если `value` находится посередине между `min`
|
|
18
|
+
/// и `max` → возвращает `0.5`
|
|
19
|
+
/// - Результат всегда находится в диапазоне `[0, 1]`
|
|
20
|
+
/// при `min ≤ value ≤ max`
|
|
21
|
+
///
|
|
22
|
+
/// Важные особенности функции:
|
|
23
|
+
/// - Преобразует значение к нормализованному диапазону [0, 1]
|
|
24
|
+
/// - Использует `math.div()` для безопасного деления
|
|
25
|
+
/// - Работает с любыми числовыми значениями
|
|
26
|
+
/// - Возвращает безразмерное дробное число
|
|
27
|
+
/// - Является основой для многих алгоритмов интерполяции
|
|
28
|
+
/// - Полезен для создания прогресс-индикаторов и анимаций
|
|
29
|
+
///
|
|
30
|
+
/// > Нормализация к диапазону [0, 1] является фундаментальной
|
|
31
|
+
/// > операцией в компьютерной графике, статистике и анимациях.
|
|
32
|
+
/// > Полученное значение можно использовать для интерполяции,
|
|
33
|
+
/// > создания прогресс-баров, цветовых градиентов и других
|
|
34
|
+
/// > алгоритмов, требующих значений в единичном интервале.
|
|
35
|
+
/// >
|
|
36
|
+
/// > Для значений вне диапазона `[$min, $max]` результат будет
|
|
37
|
+
/// > выходить за пределы [0, 1], что может быть полезно для
|
|
38
|
+
/// > экстраполяции или обнаружения выбросов.
|
|
39
|
+
/// ---
|
|
40
|
+
/// @name number-normalize
|
|
41
|
+
/// @group utilities-helpers
|
|
42
|
+
/// @since 2025.12.27
|
|
43
|
+
/// @access public
|
|
44
|
+
/// @author Murad Rustamov (therteenten)
|
|
45
|
+
/// @link https://sourcecraft.dev/users/therteenten/overview SourceCraft - therteenten
|
|
46
|
+
/// @link https://sourcecraft.dev/omnisass/library SourceCraft - OmniSass
|
|
47
|
+
/// @link https://sass-lang.com/documentation/values/numbers См. также: Официальная документация Sass - Тип данных "Числа"
|
|
48
|
+
/// @link https://sass-lang.com/documentation/modules/math См. также: Официальная документация Sass - Модуль math
|
|
49
|
+
/// @link https://sass-lang.com/documentation/modules/math#div См. также: Официальная документация Sass - Функция math.div()
|
|
50
|
+
/// @link https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Values_and_Units См. также: MDN Web Docs - CSS значения и единицы измерения
|
|
51
|
+
/// @link https://css-tricks.com/snippets/sass/ См. также: CSS-Tricks - Коллекция сниппетов Sass
|
|
52
|
+
/// @link https://sass-guidelin.es/ru/#section-41 См. также: Sass Guidelines - Раздел про математические операции
|
|
53
|
+
/// @example scss - Базовая нормализация
|
|
54
|
+
/// @debug number-normalize(50, 0, 100); // 0.5
|
|
55
|
+
/// @debug number-normalize(25, 0, 100); // 0.25
|
|
56
|
+
/// @debug number-normalize(75, 0, 100); // 0.75
|
|
57
|
+
/// @debug number-normalize(0, 0, 100); // 0
|
|
58
|
+
/// @debug number-normalize(100, 0, 100); // 1
|
|
59
|
+
/// @example scss - Граничные значения
|
|
60
|
+
/// @debug number-normalize(10, 10, 20); // 0
|
|
61
|
+
/// @debug number-normalize(15, 10, 20); // 0.5
|
|
62
|
+
/// @debug number-normalize(20, 10, 20); // 1
|
|
63
|
+
/// @debug number-normalize(12.5, 10, 20); // 0.25
|
|
64
|
+
/// @debug number-normalize(17.5, 10, 20); // 0.75
|
|
65
|
+
/// @example scss - Нестандартные диапазоны
|
|
66
|
+
/// @debug number-normalize(30, 10, 50); // 0.5
|
|
67
|
+
/// @debug number-normalize(45, 10, 50); // 0.875
|
|
68
|
+
/// @debug number-normalize(10, 10, 50); // 0
|
|
69
|
+
/// @debug number-normalize(50, 10, 50); // 1
|
|
70
|
+
/// @debug number-normalize(25, 10, 50); // 0.375
|
|
71
|
+
/// @example scss - Отрицательные диапазоны
|
|
72
|
+
/// @debug number-normalize(-50, -100, 0); // 0.5
|
|
73
|
+
/// @debug number-normalize(-25, -100, 0); // 0.75
|
|
74
|
+
/// @debug number-normalize(-75, -100, 0); // 0.25
|
|
75
|
+
/// @debug number-normalize(-100, -100, 0); // 0
|
|
76
|
+
/// @debug number-normalize(0, -100, 0); // 1
|
|
77
|
+
/// @example scss - Смешанные положительные/отрицательные
|
|
78
|
+
/// @debug number-normalize(0, -50, 50); // 0.5
|
|
79
|
+
/// @debug number-normalize(25, -50, 50); // 0.75
|
|
80
|
+
/// @debug number-normalize(-25, -50, 50); // 0.25
|
|
81
|
+
/// @debug number-normalize(-50, -50, 50); // 0
|
|
82
|
+
/// @debug number-normalize(50, -50, 50); // 1
|
|
83
|
+
/// @example scss - Дробные числа
|
|
84
|
+
/// @debug number-normalize(2.5, 0, 10); // 0.25
|
|
85
|
+
/// @debug number-normalize(7.5, 0, 10); // 0.75
|
|
86
|
+
/// @debug number-normalize(3.14, 0, 10); // 0.314
|
|
87
|
+
/// @debug number-normalize(1.618, 0, 10); // 0.1618
|
|
88
|
+
/// @debug number-normalize(8.675, 0, 10); // 0.8675
|
|
89
|
+
/// @example scss - Маленькие диапазоны
|
|
90
|
+
/// @debug number-normalize(1.5, 1, 2); // 0.5
|
|
91
|
+
/// @debug number-normalize(1.25, 1, 2); // 0.25
|
|
92
|
+
/// @debug number-normalize(1.75, 1, 2); // 0.75
|
|
93
|
+
/// @debug number-normalize(1.1, 1, 2); // 0.10000000000000009
|
|
94
|
+
/// @debug number-normalize(1.9, 1, 2); // 0.8999999999999999
|
|
95
|
+
/// @example scss - Большие диапазоны
|
|
96
|
+
/// @debug number-normalize(5000, 0, 10000); // 0.5
|
|
97
|
+
/// @debug number-normalize(2500, 0, 10000); // 0.25
|
|
98
|
+
/// @debug number-normalize(7500, 0, 10000); // 0.75
|
|
99
|
+
/// @debug number-normalize(100, 0, 10000); // 0.01
|
|
100
|
+
/// @debug number-normalize(9900, 0, 10000); // 0.99
|
|
101
|
+
/// @example scss - Значения за пределами диапазона
|
|
102
|
+
/// @debug number-normalize(-10, 0, 100); // -0.1
|
|
103
|
+
/// @debug number-normalize(110, 0, 100); // 1.1
|
|
104
|
+
/// @debug number-normalize(150, 0, 100); // 1.5
|
|
105
|
+
/// @debug number-normalize(-50, 0, 100); // -0.5
|
|
106
|
+
/// @debug number-normalize(200, 0, 100); // 2
|
|
107
|
+
/// @example scss - С единицами измерения
|
|
108
|
+
/// @debug number-normalize(25px, 0px, 100px); // 0.25
|
|
109
|
+
/// @debug number-normalize(50px, 0px, 100px); // 0.5
|
|
110
|
+
/// @debug number-normalize(75px, 0px, 100px); // 0.75
|
|
111
|
+
/// @debug number-normalize(0px, 0px, 100px); // 0
|
|
112
|
+
/// @debug number-normalize(100px, 0px, 100px); // 1
|
|
113
|
+
/// @example scss - Разные единицы измерения (конвертируются)
|
|
114
|
+
/// @debug number-normalize(1rem, 0rem, 2rem); // 0.5
|
|
115
|
+
/// @debug number-normalize(1.5rem, 0rem, 2rem); // 0.75
|
|
116
|
+
/// @debug number-normalize(0.5rem, 0rem, 2rem); // 0.25
|
|
117
|
+
/// @debug number-normalize(2rem, 0rem, 2rem); // 1
|
|
118
|
+
/// @debug number-normalize(0rem, 0rem, 2rem); // 0
|
|
119
|
+
/// @example scss - Процентные значения
|
|
120
|
+
/// @debug number-normalize(50%, 0%, 100%); // 0.5
|
|
121
|
+
/// @debug number-normalize(25%, 0%, 100%); // 0.25
|
|
122
|
+
/// @debug number-normalize(75%, 0%, 100%); // 0.75
|
|
123
|
+
/// @debug number-normalize(0%, 0%, 100%); // 0
|
|
124
|
+
/// @debug number-normalize(100%, 0%, 100%); // 1
|
|
125
|
+
/// @example scss - Нецелочисленные границы
|
|
126
|
+
/// @debug number-normalize(3.5, 1.5, 5.5); // 0.5
|
|
127
|
+
/// @debug number-normalize(2.5, 1.5, 5.5); // 0.25
|
|
128
|
+
/// @debug number-normalize(4.5, 1.5, 5.5); // 0.75
|
|
129
|
+
/// @debug number-normalize(1.5, 1.5, 5.5); // 0
|
|
130
|
+
/// @debug number-normalize(5.5, 1.5, 5.5); // 1
|
|
131
|
+
/// @example scss - Очень малые значения
|
|
132
|
+
/// @debug number-normalize(0.5, 0, 1); // 0.5
|
|
133
|
+
/// @debug number-normalize(0.25, 0, 1); // 0.25
|
|
134
|
+
/// @debug number-normalize(0.75, 0, 1); // 0.75
|
|
135
|
+
/// @debug number-normalize(0.001, 0, 1); // 0.001
|
|
136
|
+
/// @debug number-normalize(0.999, 0, 1); // 0.999
|
|
137
|
+
/// @example scss - Симметричные диапазоны
|
|
138
|
+
/// @debug number-normalize(0, -1, 1); // 0.5
|
|
139
|
+
/// @debug number-normalize(0.5, -1, 1); // 0.75
|
|
140
|
+
/// @debug number-normalize(-0.5, -1, 1); // 0.25
|
|
141
|
+
/// @debug number-normalize(1, -1, 1); // 1
|
|
142
|
+
/// @debug number-normalize(-1, -1, 1); // 0
|
|
143
|
+
/// @param {Number} $value - Число для нормализации.
|
|
144
|
+
/// Может быть любым числом: целым, дробным, положительным,
|
|
145
|
+
/// отрицательным, с единицами измерения или без.
|
|
146
|
+
/// @param {Number} $min - Нижняя граница исходного диапазона.
|
|
147
|
+
/// Значение, соответствующее `0` в нормализованном диапазоне.
|
|
148
|
+
/// @param {Number} $max - Верхняя граница исходного диапазона.
|
|
149
|
+
/// Значение, соответствующее `1` в нормализованном диапазоне.
|
|
150
|
+
/// @return {Number} - Нормализованное значение в диапазоне [0, 1].
|
|
151
|
+
/// Возвращает дробное безразмерное число. Если `$value` находится
|
|
152
|
+
/// между `$min` и `$max`, результат будет в диапазоне [0, 1].
|
|
153
|
+
/// Если `$value` меньше `$min`, результат будет отрицательным.
|
|
154
|
+
/// Если `$value` больше `$max`, результат будет больше 1.
|
|
155
|
+
/// @throws {Error} - Может выбросить ошибку деления на ноль, если
|
|
156
|
+
/// `$min == $max`. В этом случае знаменатель формулы становится
|
|
157
|
+
/// нулем, что приводит к математической неопределенности.
|
|
158
|
+
@function number-normalize($value, $min, $max) {
|
|
159
|
+
@return math.div($value - $min, $max - $min);
|
|
160
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
@use 'sass:math';
|
|
2
|
+
|
|
3
|
+
/// Генерирует случайное целое число в заданном диапазоне.
|
|
4
|
+
///
|
|
5
|
+
/// Функция принимает минимальное и максимальное целые значения
|
|
6
|
+
/// и возвращает случайное целое число, равномерно распределенное
|
|
7
|
+
/// в диапазоне [`$min`, `$max`] включительно.
|
|
8
|
+
///
|
|
9
|
+
/// Формула генерации:
|
|
10
|
+
/// `math.floor($min + math.random() * ($max - $min + 1))`
|
|
11
|
+
///
|
|
12
|
+
/// Визуализация работы:
|
|
13
|
+
/// - Генерирует базовое случайное число от 0 до 1 (исключая 1)
|
|
14
|
+
/// - Масштабирует его на длину диапазона плюс 1
|
|
15
|
+
/// - Сдвигает на минимальное значение (`$min`)
|
|
16
|
+
/// - Округляет вниз до ближайшего целого числа
|
|
17
|
+
///
|
|
18
|
+
/// Важные особенности функции:
|
|
19
|
+
/// - Работает только с целыми числами (без единиц измерения)
|
|
20
|
+
/// - Диапазон включает оба конца: `$min` и `$max`
|
|
21
|
+
/// - Равномерное распределение в заданном диапазоне
|
|
22
|
+
/// - Каждый вызов функции возвращает новое случайное значение
|
|
23
|
+
/// - Результат компилируется в CSS как фиксированное целое число
|
|
24
|
+
/// - Может использоваться для генерации случайных индексов,
|
|
25
|
+
/// количеств, таймингов, целочисленных параметров
|
|
26
|
+
///
|
|
27
|
+
/// > Внимание: функция использует `math.random()` и `math.floor()`,
|
|
28
|
+
/// > которые генерируют псевдослучайные числа. При каждом
|
|
29
|
+
/// > запуске компилятора Sass будет генерироваться новая
|
|
30
|
+
/// > последовательность чисел. В отличие от JavaScript, который
|
|
31
|
+
/// > выполняется в браузере, эта функция вычисляется при
|
|
32
|
+
/// > компиляции Sass.
|
|
33
|
+
/// ---
|
|
34
|
+
/// @name number-random-between-int
|
|
35
|
+
/// @group utilities-helpers
|
|
36
|
+
/// @since 2025.12.27
|
|
37
|
+
/// @access public
|
|
38
|
+
/// @author Murad Rustamov (therteenten)
|
|
39
|
+
/// @link https://sourcecraft.dev/users/therteenten/overview SourceCraft - therteenten
|
|
40
|
+
/// @link https://sourcecraft.dev/omnisass/library SourceCraft - OmniSass
|
|
41
|
+
/// @link https://sass-lang.com/documentation/modules/math См. также: Официальная документация Sass - Модуль math
|
|
42
|
+
/// @link https://sass-lang.com/documentation/modules/math#random См. также: Официальная документация Sass - Функция math.random()
|
|
43
|
+
/// @link https://sass-lang.com/documentation/modules/math#floor См. также: Официальная документация Sass - Функция math.floor()
|
|
44
|
+
/// @link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random См. также: MDN Web Docs - JavaScript Math.random()
|
|
45
|
+
/// @link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/floor См. также: MDN Web Docs - JavaScript Math.floor()
|
|
46
|
+
/// @link https://en.wikipedia.org/wiki/Uniform_distribution_(discrete) См. также: Wikipedia - Дискретное равномерное распределение
|
|
47
|
+
/// @link https://stackoverflow.com/questions/1527803/generating-random-whole-numbers-in-javascript-in-a-specific-range См. также: Stack Overflow - Генерация случайных целых чисел в диапазоне
|
|
48
|
+
/// @example scss - Базовая генерация случайных целых чисел
|
|
49
|
+
/// @debug number-random-between-int(1, 10); // например: 7
|
|
50
|
+
/// @debug number-random-between-int(1, 10); // например: 3
|
|
51
|
+
/// @debug number-random-between-int(1, 10); // например: 10
|
|
52
|
+
/// @example scss - Диапазоны с включенными границами
|
|
53
|
+
/// @debug number-random-between-int(0, 100); // например: 42
|
|
54
|
+
/// @debug number-random-between-int(5, 15); // например: 12
|
|
55
|
+
/// @debug number-random-between-int(-10, 10); // например: -3
|
|
56
|
+
/// @debug number-random-between-int(100, 200); // например: 150
|
|
57
|
+
/// @example scss - Отрицательные диапазоны
|
|
58
|
+
/// @debug number-random-between-int(-20, -10); // например: -15
|
|
59
|
+
/// @debug number-random-between-int(-5, 5); // например: 2
|
|
60
|
+
/// @debug number-random-between-int(-100, 0); // например: -73
|
|
61
|
+
/// @example scss - Единичные значения и малые диапазоны
|
|
62
|
+
/// @debug number-random-between-int(5, 5); // всегда: 5
|
|
63
|
+
/// @debug number-random-between-int(0, 1); // например: 0 или 1
|
|
64
|
+
/// @debug number-random-between-int(1, 2); // например: 1 или 2
|
|
65
|
+
/// @debug number-random-between-int(-1, 1); // например: -1, 0 или 1
|
|
66
|
+
/// @example scss - Практическое применение (через переменные)
|
|
67
|
+
/// $columns: number-random-between-int(2, 6); // например: 4
|
|
68
|
+
/// $repeat-count: number-random-between-int(3, 8); // например: 5
|
|
69
|
+
/// $z-index: number-random-between-int(1, 10); // например: 7
|
|
70
|
+
/// @param {Number} $min - Минимальное целое значение диапазона (включительно).
|
|
71
|
+
/// Должно быть целым числом без единиц измерения.
|
|
72
|
+
/// Определяет нижнюю границу генерации.
|
|
73
|
+
/// @param {Number} $max - Максимальное целое значение диапазона (включительно).
|
|
74
|
+
/// Должно быть целым числом без единиц измерения.
|
|
75
|
+
/// Определяет верхнюю границу генерации.
|
|
76
|
+
/// Должно быть больше или равно `$min` для корректных результатов.
|
|
77
|
+
/// @return {Number} - Случайное целое число в диапазоне [`$min`, `$max`].
|
|
78
|
+
/// Всегда возвращает целое число без единиц измерения.
|
|
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));
|
|
84
|
+
}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
@use 'sass:math';
|
|
2
|
+
|
|
3
|
+
/// Генерирует случайное число в заданном диапазоне.
|
|
4
|
+
///
|
|
5
|
+
/// Функция принимает минимальное и максимальное значения
|
|
6
|
+
/// и возвращает случайное число, равномерно распределенное
|
|
7
|
+
/// в диапазоне [`$min`, `$max`] (включительно для `$min`,
|
|
8
|
+
/// исключительно для `$max` для дробных чисел).
|
|
9
|
+
///
|
|
10
|
+
/// Формула генерации:
|
|
11
|
+
/// `$min + math.random() * ($max - $min)`
|
|
12
|
+
///
|
|
13
|
+
/// Визуализация работы:
|
|
14
|
+
/// - Генерирует базовое случайное число от 0 до 1 (исключая 1)
|
|
15
|
+
/// - Масштабирует его на длину диапазона (`$max - $min`)
|
|
16
|
+
/// - Сдвигает на минимальное значение (`$min`)
|
|
17
|
+
///
|
|
18
|
+
/// Важные особенности функции:
|
|
19
|
+
/// - Работает с любыми числовыми значениями (целые, дробные,
|
|
20
|
+
/// положительные, отрицательные, с единицами измерения)
|
|
21
|
+
/// - Возвращает дробное число даже при целых границах
|
|
22
|
+
/// - Для получения целых чисел используйте `math.floor()` или
|
|
23
|
+
/// `math.round()` вместе с функцией
|
|
24
|
+
/// - Равномерное распределение в заданном диапазоне
|
|
25
|
+
/// - Каждый вызов функции возвращает новое случайное значение
|
|
26
|
+
/// - Результат компилируется в CSS как фиксированное значение
|
|
27
|
+
/// - Может использоваться для генерации случайных размеров,
|
|
28
|
+
/// цветов, отступов, анимационных параметров
|
|
29
|
+
///
|
|
30
|
+
/// > Внимание: функция использует `math.random()`, которая
|
|
31
|
+
/// > генерирует псевдослучайные числа.
|
|
32
|
+
/// >
|
|
33
|
+
/// > В отличие от JavaScript `Math.random()`, которая
|
|
34
|
+
/// > выполняется в браузере, `number-random-between()` вычисляется
|
|
35
|
+
/// > при компиляции и возвращает фиксированное значение в CSS.
|
|
36
|
+
/// ---
|
|
37
|
+
/// @name number-random-between
|
|
38
|
+
/// @group utilities-helpers
|
|
39
|
+
/// @since 2025.12.27
|
|
40
|
+
/// @access public
|
|
41
|
+
/// @author Murad Rustamov (therteenten)
|
|
42
|
+
/// @link https://sourcecraft.dev/users/therteenten/overview SourceCraft - therteenten
|
|
43
|
+
/// @link https://sourcecraft.dev/omnisass/library SourceCraft - OmniSass
|
|
44
|
+
/// @link https://sass-lang.com/documentation/modules/math См. также: Официальная документация Sass - Модуль math
|
|
45
|
+
/// @link https://sass-lang.com/documentation/modules/math#random См. также: Официальная документация Sass - Функция math.random()
|
|
46
|
+
/// @link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random См. также: MDN Web Docs - JavaScript Math.random()
|
|
47
|
+
/// @link https://en.wikipedia.org/wiki/Uniform_distribution_(continuous) См. также: Wikipedia - Непрерывное равномерное распределение
|
|
48
|
+
/// @link https://www.w3schools.com/js/js_random.asp См. также: W3Schools - JavaScript Random Numbers
|
|
49
|
+
/// @example scss - Базовая генерация случайных чисел
|
|
50
|
+
/// // Каждый вызов дает разный результат при компиляции
|
|
51
|
+
/// @debug number-random-between(0, 10); // например: 7.244421653570976
|
|
52
|
+
/// @debug number-random-between(0, 10); // например: 8.669635705053507
|
|
53
|
+
/// @debug number-random-between(0, 10); // например: 4.402152393988244
|
|
54
|
+
/// @example scss - Диапазоны с единицами измерения
|
|
55
|
+
/// @debug number-random-between(10px, 50px); // например: 40.47629084995985px
|
|
56
|
+
/// @debug number-random-between(1rem, 3rem); // например: 2.194695513077836rem
|
|
57
|
+
/// @debug number-random-between(0%, 100%); // например: 50.82019390506141%
|
|
58
|
+
/// @example scss - Дробные диапазоны
|
|
59
|
+
/// @debug number-random-between(0.1, 0.9); // например: 0.8165020190345386
|
|
60
|
+
/// @debug number-random-between(1.5, 3.5); // например: 2.1496319539946427
|
|
61
|
+
/// @debug number-random-between(-0.5, 0.5); // например: 0.41678528339764553
|
|
62
|
+
/// @example scss - Отрицательные диапазоны
|
|
63
|
+
/// @debug number-random-between(-10, 10); // например: -8.712447491197564
|
|
64
|
+
/// @debug number-random-between(-100, -50); // например: -86.74387500886313
|
|
65
|
+
/// @debug number-random-between(-5.5, 5.5); // например: -2.7145449118153575
|
|
66
|
+
/// @example scss - Получение целых чисел (с использованием math.floor)
|
|
67
|
+
/// // Целое число от 1 до 10 включительно
|
|
68
|
+
/// $int: math.floor(number-random-between(1, 11));
|
|
69
|
+
/// @debug $int; // например: 9
|
|
70
|
+
///
|
|
71
|
+
/// // Целое число от 0 до 100 включительно
|
|
72
|
+
/// $percentage: math.floor(number-random-between(0, 101));
|
|
73
|
+
/// @debug $percentage; // например: 50
|
|
74
|
+
/// @example scss - Практическое применение
|
|
75
|
+
/// // Случайный отступ
|
|
76
|
+
/// .element {
|
|
77
|
+
/// padding: number-random-between(8px, 24px);
|
|
78
|
+
/// }
|
|
79
|
+
///
|
|
80
|
+
/// // Случайная прозрачность
|
|
81
|
+
/// .overlay {
|
|
82
|
+
/// opacity: number-random-between(0.3, 0.8);
|
|
83
|
+
/// }
|
|
84
|
+
///
|
|
85
|
+
/// // Случайный угол поворота
|
|
86
|
+
/// .decorative {
|
|
87
|
+
/// transform: rotate(number-random-between(-5deg, 5deg));
|
|
88
|
+
/// }
|
|
89
|
+
/// @example css - Результат
|
|
90
|
+
/// .element {
|
|
91
|
+
/// padding: 20.9060027047px;
|
|
92
|
+
/// }
|
|
93
|
+
///
|
|
94
|
+
/// .overlay {
|
|
95
|
+
/// opacity: 0.3586561047;
|
|
96
|
+
/// }
|
|
97
|
+
///
|
|
98
|
+
/// .decorative {
|
|
99
|
+
/// transform: rotate(2.1312623254deg);
|
|
100
|
+
/// }
|
|
101
|
+
/// @param {Number} $min - Минимальное значение диапазона (включительно).
|
|
102
|
+
/// Может быть любым числом: целым, дробным, положительным,
|
|
103
|
+
/// отрицательным, с единицами измерения или без.
|
|
104
|
+
/// Определяет нижнюю границу генерации.
|
|
105
|
+
/// @param {Number} $max - Максимальное значение диапазона (исключительно
|
|
106
|
+
/// для дробных чисел, но практически достижимо).
|
|
107
|
+
/// Может быть любым числом: целым, дробным, положительным,
|
|
108
|
+
/// отрицательным, с единицами измерения или без.
|
|
109
|
+
/// Определяет верхнюю границу генерации.
|
|
110
|
+
/// Должно быть больше или равно `$min` для корректных результатов.
|
|
111
|
+
/// @return {Number} - Случайное число в диапазоне [`$min`, `$max`).
|
|
112
|
+
/// Если параметры имеют единицы измерения, результат будет
|
|
113
|
+
/// иметь те же единицы. Всегда возвращает дробное число.
|
|
114
|
+
/// @throws {Error} - Не выбрасывает ошибок явно, но при
|
|
115
|
+
/// `$max < $min` результат может быть неожиданным (возможны
|
|
116
|
+
/// отрицательные значения длины диапазона). Рекомендуется
|
|
117
|
+
/// всегда передавать `$min ≤ $max`.
|
|
118
|
+
@function number-random-between($min, $max) {
|
|
119
|
+
@return $min + math.random() * ($max - $min);
|
|
120
|
+
}
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
@use 'sass:list';
|
|
2
|
+
|
|
3
|
+
/// Генерирует последовательность чисел в заданном диапазоне
|
|
4
|
+
/// с определенным шагом.
|
|
5
|
+
///
|
|
6
|
+
/// Функция `number-range()` создает упорядоченный список чисел,
|
|
7
|
+
/// равномерно распределенных между начальным и конечным значениями
|
|
8
|
+
/// с заданным шагом. Поддерживает как возрастающие, так и убывающие
|
|
9
|
+
/// последовательности, автоматически определяя направление на основе
|
|
10
|
+
/// входных параметров.
|
|
11
|
+
///
|
|
12
|
+
/// Каждое число в последовательности вычисляется с использованием
|
|
13
|
+
/// модульной арифметики, обеспечивая точное соответствие шагу.
|
|
14
|
+
/// Функция гарантирует включение как начального, так и конечного
|
|
15
|
+
/// значений в результат, если они соответствуют заданному шагу.
|
|
16
|
+
/// Полезно для генерации числовых интервалов, систем отступов,
|
|
17
|
+
/// размеров сеток, z-index слоев и других числовых систем.
|
|
18
|
+
///
|
|
19
|
+
/// > Для создания последовательностей с плавающими числами
|
|
20
|
+
/// > убедитесь, что шаг кратен разнице между значениями,
|
|
21
|
+
/// > чтобы избежать ошибок округления.
|
|
22
|
+
/// ---
|
|
23
|
+
/// @name number-range
|
|
24
|
+
/// @group utilities-helpers
|
|
25
|
+
/// @since 2025.12.27
|
|
26
|
+
/// @access public
|
|
27
|
+
/// @author Murad Rustamov (therteenten)
|
|
28
|
+
/// @link https://sourcecraft.dev/users/therteenten/overview SourceCraft - therteenten
|
|
29
|
+
/// @link https://sourcecraft.dev/omnisass/library SourceCraft - OmniSass
|
|
30
|
+
/// @link https://sass-lang.com/documentation/modules/list См. также: Sass - Модуль list
|
|
31
|
+
/// @link https://sass-lang.com/documentation/at-rules/control/#for См. также: Sass - Циклы @for
|
|
32
|
+
/// @link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from См. также: MDN - Array.from() с диапазоном
|
|
33
|
+
/// @link https://docs.python.org/3/library/functions.html#func-range См. также: Python - Функция range()
|
|
34
|
+
/// @link https://www.w3.org/TR/css-values-4/#numeric-types См. также: W3C - Числовые типы CSS
|
|
35
|
+
/// @example scss - Создание базовой последовательности
|
|
36
|
+
/// @use 'sass:list';
|
|
37
|
+
///
|
|
38
|
+
/// $sequence: number-range(1, 10);
|
|
39
|
+
/// // Возвращает: (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
|
|
40
|
+
///
|
|
41
|
+
/// @each $number in $sequence {
|
|
42
|
+
/// .item-#{$number} {
|
|
43
|
+
/// order: $number;
|
|
44
|
+
/// }
|
|
45
|
+
/// }
|
|
46
|
+
/// @example css - Результат
|
|
47
|
+
/// .item-1 {
|
|
48
|
+
/// order: 1;
|
|
49
|
+
/// }
|
|
50
|
+
/// .item-2 {
|
|
51
|
+
/// order: 2;
|
|
52
|
+
/// }
|
|
53
|
+
/// .item-3 {
|
|
54
|
+
/// order: 3;
|
|
55
|
+
/// }
|
|
56
|
+
/// .item-4 {
|
|
57
|
+
/// order: 4;
|
|
58
|
+
/// }
|
|
59
|
+
/// .item-5 {
|
|
60
|
+
/// order: 5;
|
|
61
|
+
/// }
|
|
62
|
+
/// .item-6 {
|
|
63
|
+
/// order: 6;
|
|
64
|
+
/// }
|
|
65
|
+
/// .item-7 {
|
|
66
|
+
/// order: 7;
|
|
67
|
+
/// }
|
|
68
|
+
/// .item-8 {
|
|
69
|
+
/// order: 8;
|
|
70
|
+
/// }
|
|
71
|
+
/// .item-9 {
|
|
72
|
+
/// order: 9;
|
|
73
|
+
/// }
|
|
74
|
+
/// .item-10 {
|
|
75
|
+
/// order: 10;
|
|
76
|
+
/// }
|
|
77
|
+
/// @example scss - Генерация системы отступов с шагом
|
|
78
|
+
/// @use 'sass:list';
|
|
79
|
+
///
|
|
80
|
+
/// :root {
|
|
81
|
+
/// $spacings: number-range(0, 64, 8);
|
|
82
|
+
///
|
|
83
|
+
/// @for $i from 1 through list.length($spacings) {
|
|
84
|
+
/// $value: list.nth($spacings, $i);
|
|
85
|
+
/// --spacing-#{$value}: #{$value}px;
|
|
86
|
+
/// }
|
|
87
|
+
/// }
|
|
88
|
+
/// @example css - Результат
|
|
89
|
+
/// :root {
|
|
90
|
+
/// --spacing-0: 0px;
|
|
91
|
+
/// --spacing-8: 8px;
|
|
92
|
+
/// --spacing-16: 16px;
|
|
93
|
+
/// --spacing-24: 24px;
|
|
94
|
+
/// --spacing-32: 32px;
|
|
95
|
+
/// --spacing-40: 40px;
|
|
96
|
+
/// --spacing-48: 48px;
|
|
97
|
+
/// --spacing-56: 56px;
|
|
98
|
+
/// --spacing-64: 64px;
|
|
99
|
+
/// }
|
|
100
|
+
/// @example scss - Создание убывающей последовательности для z-index
|
|
101
|
+
/// @use 'sass:list';
|
|
102
|
+
///
|
|
103
|
+
/// $layers: number-range(10, 1);
|
|
104
|
+
/// // Возвращает: (10, 9, 8, 7, 6, 5, 4, 3, 2, 1)
|
|
105
|
+
///
|
|
106
|
+
/// @each $layer in $layers {
|
|
107
|
+
/// .layer-#{$layer} {
|
|
108
|
+
/// z-index: $layer * 10;
|
|
109
|
+
/// opacity: math.div($layer, 10);
|
|
110
|
+
/// }
|
|
111
|
+
/// }
|
|
112
|
+
/// @example css - Результат
|
|
113
|
+
/// .layer-10 {
|
|
114
|
+
/// z-index: 100;
|
|
115
|
+
/// opacity: 1;
|
|
116
|
+
/// }
|
|
117
|
+
/// .layer-9 {
|
|
118
|
+
/// z-index: 90;
|
|
119
|
+
/// opacity: 0.9;
|
|
120
|
+
/// }
|
|
121
|
+
/// .layer-8 {
|
|
122
|
+
/// z-index: 80;
|
|
123
|
+
/// opacity: 0.8;
|
|
124
|
+
/// }
|
|
125
|
+
/// .layer-7 {
|
|
126
|
+
/// z-index: 70;
|
|
127
|
+
/// opacity: 0.7;
|
|
128
|
+
/// }
|
|
129
|
+
/// .layer-6 {
|
|
130
|
+
/// z-index: 60;
|
|
131
|
+
/// opacity: 0.6;
|
|
132
|
+
/// }
|
|
133
|
+
/// .layer-5 {
|
|
134
|
+
/// z-index: 50;
|
|
135
|
+
/// opacity: 0.5;
|
|
136
|
+
/// }
|
|
137
|
+
/// .layer-4 {
|
|
138
|
+
/// z-index: 40;
|
|
139
|
+
/// opacity: 0.4;
|
|
140
|
+
/// }
|
|
141
|
+
/// .layer-3 {
|
|
142
|
+
/// z-index: 30;
|
|
143
|
+
/// opacity: 0.3;
|
|
144
|
+
/// }
|
|
145
|
+
/// .layer-2 {
|
|
146
|
+
/// z-index: 20;
|
|
147
|
+
/// opacity: 0.2;
|
|
148
|
+
/// }
|
|
149
|
+
/// .layer-1 {
|
|
150
|
+
/// z-index: 10;
|
|
151
|
+
/// opacity: 0.1;
|
|
152
|
+
/// }
|
|
153
|
+
/// @example scss - Генерация сетки с динамическими колонками
|
|
154
|
+
/// @use 'sass:list';
|
|
155
|
+
/// @use 'sass:math';
|
|
156
|
+
///
|
|
157
|
+
/// .grid {
|
|
158
|
+
/// display: grid;
|
|
159
|
+
/// grid-template-columns: repeat(12, 1fr);
|
|
160
|
+
/// gap: 1rem;
|
|
161
|
+
/// }
|
|
162
|
+
///
|
|
163
|
+
/// $columns: number-range(1, 12);
|
|
164
|
+
///
|
|
165
|
+
/// @each $col in $columns {
|
|
166
|
+
/// .grid__col--#{$col} {
|
|
167
|
+
/// grid-column: span $col;
|
|
168
|
+
/// width: percentage(math.div($col, 12));
|
|
169
|
+
/// }
|
|
170
|
+
/// }
|
|
171
|
+
/// @example css - Результат
|
|
172
|
+
/// .grid {
|
|
173
|
+
/// display: grid;
|
|
174
|
+
/// grid-template-columns: repeat(12, 1fr);
|
|
175
|
+
/// gap: 1rem;
|
|
176
|
+
/// }
|
|
177
|
+
/// .grid__col--1 {
|
|
178
|
+
/// grid-column: span 1;
|
|
179
|
+
/// width: 8.3333333333%;
|
|
180
|
+
/// }
|
|
181
|
+
/// .grid__col--2 {
|
|
182
|
+
/// grid-column: span 2;
|
|
183
|
+
/// width: 16.6666666667%;
|
|
184
|
+
/// }
|
|
185
|
+
/// .grid__col--3 {
|
|
186
|
+
/// grid-column: span 3;
|
|
187
|
+
/// width: 25%;
|
|
188
|
+
/// }
|
|
189
|
+
/// .grid__col--4 {
|
|
190
|
+
/// grid-column: span 4;
|
|
191
|
+
/// width: 33.3333333333%;
|
|
192
|
+
/// }
|
|
193
|
+
/// .grid__col--5 {
|
|
194
|
+
/// grid-column: span 5;
|
|
195
|
+
/// width: 41.6666666667%;
|
|
196
|
+
/// }
|
|
197
|
+
/// .grid__col--6 {
|
|
198
|
+
/// grid-column: span 6;
|
|
199
|
+
/// width: 50%;
|
|
200
|
+
/// }
|
|
201
|
+
/// .grid__col--7 {
|
|
202
|
+
/// grid-column: span 7;
|
|
203
|
+
/// width: 58.3333333333%;
|
|
204
|
+
/// }
|
|
205
|
+
/// .grid__col--8 {
|
|
206
|
+
/// grid-column: span 8;
|
|
207
|
+
/// width: 66.6666666667%;
|
|
208
|
+
/// }
|
|
209
|
+
/// .grid__col--9 {
|
|
210
|
+
/// grid-column: span 9;
|
|
211
|
+
/// width: 75%;
|
|
212
|
+
/// }
|
|
213
|
+
/// .grid__col--10 {
|
|
214
|
+
/// grid-column: span 10;
|
|
215
|
+
/// width: 83.3333333333%;
|
|
216
|
+
/// }
|
|
217
|
+
/// .grid__col--11 {
|
|
218
|
+
/// grid-column: span 11;
|
|
219
|
+
/// width: 91.6666666667%;
|
|
220
|
+
/// }
|
|
221
|
+
/// .grid__col--12 {
|
|
222
|
+
/// grid-column: span 12;
|
|
223
|
+
/// width: 100%;
|
|
224
|
+
/// }
|
|
225
|
+
/// @param {Number} $start - Начальное значение последовательности.
|
|
226
|
+
/// Включается в результат как первый элемент, если соответствует шагу.
|
|
227
|
+
/// Может быть любым числом (целым или с плавающей точкой).
|
|
228
|
+
/// @param {Number} $end - Конечное значение последовательности.
|
|
229
|
+
/// Включается в результат как последний элемент, если соответствует шагу.
|
|
230
|
+
/// Определяет направление последовательности:
|
|
231
|
+
/// - Если `$start < $end` → возрастающая последовательность
|
|
232
|
+
/// - Если `$start > $end` → убывающая последовательность
|
|
233
|
+
/// - Если `$start == $end` → последовательность из одного элемента
|
|
234
|
+
/// @param {Number} $step [1] - Шаг между соседними элементами.
|
|
235
|
+
/// Определяет расстояние между значениями в последовательности.
|
|
236
|
+
/// Должен быть положительным числом больше нуля.
|
|
237
|
+
/// Фактический шаг применяется в направлении последовательности:
|
|
238
|
+
/// - Возрастающая: `$current + $step`
|
|
239
|
+
/// - Убывающая: `$current - $step`
|
|
240
|
+
/// @return {List} - Упорядоченный список (list) чисел, где:
|
|
241
|
+
/// - Первый элемент: ближайшее к `$start` значение, кратное шагу
|
|
242
|
+
/// - Последний элемент: ближайшее к `$end` значение, кратное шагу
|
|
243
|
+
/// - Все элементы: равномерно распределены с шагом `$step`
|
|
244
|
+
/// - Направление: соответствует соотношению `$start` и `$end`
|
|
245
|
+
@function number-range($from, $to, $step: 1) {
|
|
246
|
+
$-result: ();
|
|
247
|
+
|
|
248
|
+
@if $from < $to {
|
|
249
|
+
@for $i from $from through $to {
|
|
250
|
+
@if ($i - $from) % $step == 0 {
|
|
251
|
+
|
|
252
|
+
$-result: list.append($-result, $i);
|
|
253
|
+
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
} @else {
|
|
257
|
+
@for $i from $from through $to {
|
|
258
|
+
@if ($from - $i) % $step == 0 {
|
|
259
|
+
|
|
260
|
+
$-result: list.append($-result, $i);
|
|
261
|
+
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
@return $-result;
|
|
267
|
+
|
|
268
|
+
}
|