@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.
Files changed (93) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/LICENSE +21 -0
  3. package/README.md +2 -0
  4. package/_configs.scss +68 -0
  5. package/index.scss +95 -0
  6. package/modules/utilities/converters/_convert-camel2kebab.scss +186 -0
  7. package/modules/utilities/converters/_convert-em2px.scss +239 -0
  8. package/modules/utilities/converters/_convert-hex2rgb.scss +97 -0
  9. package/modules/utilities/converters/_convert-hex2rgba.scss +124 -0
  10. package/modules/utilities/converters/_convert-kebab2camel.scss +232 -0
  11. package/modules/utilities/converters/_convert-kebab2snake.scss +118 -0
  12. package/modules/utilities/converters/_convert-px2em.scss +236 -0
  13. package/modules/utilities/converters/_convert-px2rem.scss +180 -0
  14. package/modules/utilities/converters/_convert-rem2px.scss +207 -0
  15. package/modules/utilities/converters/_convert-snake2kebab.scss +173 -0
  16. package/modules/utilities/getters/color/_get-color-brightness.scss +138 -0
  17. package/modules/utilities/getters/color/_get-color-darkest.scss +178 -0
  18. package/modules/utilities/getters/list/_get-list-item-end.scss +114 -0
  19. package/modules/utilities/getters/list/_get-list-item-start.scss +109 -0
  20. package/modules/utilities/getters/list/_get-list-item.scss +179 -0
  21. package/modules/utilities/getters/number/_get-number-from-percent.scss +139 -0
  22. package/modules/utilities/getters/number/_get-number-height-by-ratio.scss +199 -0
  23. package/modules/utilities/getters/number/_get-number-max.scss +168 -0
  24. package/modules/utilities/getters/number/_get-number-min.scss +162 -0
  25. package/modules/utilities/getters/number/_get-number-percentage-of.scss +149 -0
  26. package/modules/utilities/getters/number/_get-number-unit.scss +111 -0
  27. package/modules/utilities/getters/number/_get-number-width-by-ratio.scss +223 -0
  28. package/modules/utilities/helpers/color/_color-blend-steps.scss +210 -0
  29. package/modules/utilities/helpers/color/_color-blend.scss +183 -0
  30. package/modules/utilities/helpers/color/_color-hue-shift.scss +148 -0
  31. package/modules/utilities/helpers/color/_color-scale.scss +208 -0
  32. package/modules/utilities/helpers/color/_color-shade.scss +113 -0
  33. package/modules/utilities/helpers/color/_color-tint.scss +118 -0
  34. package/modules/utilities/helpers/color/_color-triad.scss +141 -0
  35. package/modules/utilities/helpers/list/_list-dedupe.scss +146 -0
  36. package/modules/utilities/helpers/list/_list-insert-at.scss +166 -0
  37. package/modules/utilities/helpers/list/_list-merge.scss +86 -0
  38. package/modules/utilities/helpers/list/_list-remove-at.scss +160 -0
  39. package/modules/utilities/helpers/list/_list-sum-numbers-safe.scss +175 -0
  40. package/modules/utilities/helpers/list/_list-sum-numbers.scss +128 -0
  41. package/modules/utilities/helpers/misc/_url-encode.configs.scss +64 -0
  42. package/modules/utilities/helpers/misc/_url-encode.scss +148 -0
  43. package/modules/utilities/helpers/number/_number-ceil-to.scss +111 -0
  44. package/modules/utilities/helpers/number/_number-clamp-max.scss +92 -0
  45. package/modules/utilities/helpers/number/_number-clamp-min.scss +100 -0
  46. package/modules/utilities/helpers/number/_number-clamp.scss +109 -0
  47. package/modules/utilities/helpers/number/_number-denormalize.scss +172 -0
  48. package/modules/utilities/helpers/number/_number-fibonacci.scss +235 -0
  49. package/modules/utilities/helpers/number/_number-floor-to.scss +114 -0
  50. package/modules/utilities/helpers/number/_number-format-with-separator.scss +122 -0
  51. package/modules/utilities/helpers/number/_number-normalize.scss +160 -0
  52. package/modules/utilities/helpers/number/_number-random-between-int.scss +84 -0
  53. package/modules/utilities/helpers/number/_number-random-between.scss +120 -0
  54. package/modules/utilities/helpers/number/_number-range.scss +268 -0
  55. package/modules/utilities/helpers/number/_number-round-to-nearest.scss +131 -0
  56. package/modules/utilities/helpers/number/_number-round-to.scss +118 -0
  57. package/modules/utilities/helpers/number/_number-strip-unit.scss +97 -0
  58. package/modules/utilities/helpers/string/_string-capitalize.scss +84 -0
  59. package/modules/utilities/helpers/string/_string-replace.scss +69 -0
  60. package/modules/utilities/helpers/string/_string-trim-end.scss +62 -0
  61. package/modules/utilities/helpers/string/_string-trim-start.scss +62 -0
  62. package/modules/utilities/helpers/string/_string-trim.scss +69 -0
  63. package/modules/utilities/loggers/_log-invalid-type.scss +151 -0
  64. package/modules/utilities/loggers/_log-invalid-value.scss +151 -0
  65. package/modules/utilities/setters/_index.scss +3 -0
  66. package/modules/utilities/validators/color/_is-color-light.scss +132 -0
  67. package/modules/utilities/validators/color/_is-color-list.scss +124 -0
  68. package/modules/utilities/validators/list/_is-list-contained.scss +65 -0
  69. package/modules/utilities/validators/misc/_is-time.scss +115 -0
  70. package/modules/utilities/validators/number/_is-int-even.scss +69 -0
  71. package/modules/utilities/validators/number/_is-int-odd.scss +70 -0
  72. package/modules/utilities/validators/number/_is-int.scss +124 -0
  73. package/modules/utilities/validators/number/_is-number-has-unit.scss +85 -0
  74. package/modules/utilities/validators/number/_is-number-negative.scss +76 -0
  75. package/modules/utilities/validators/number/_is-number-positive.scss +74 -0
  76. package/modules/utilities/validators/number/_is-number-unitless.scss +88 -0
  77. package/modules/utilities/validators/number/_is-number-zero.scss +75 -0
  78. package/modules/utilities/validators/string/_is-string-contained.scss +108 -0
  79. package/modules/utilities/validators/string/_is-string-empty.scss +56 -0
  80. package/modules/utilities/validators/string/_is-string-ending-with.scss +66 -0
  81. package/modules/utilities/validators/string/_is-string-starting-with.scss +66 -0
  82. package/modules/utilities/validators/type-of/_is-boolean.scss +92 -0
  83. package/modules/utilities/validators/type-of/_is-color.scss +96 -0
  84. package/modules/utilities/validators/type-of/_is-list.scss +105 -0
  85. package/modules/utilities/validators/type-of/_is-map.scss +105 -0
  86. package/modules/utilities/validators/type-of/_is-number.scss +103 -0
  87. package/modules/utilities/validators/type-of/_is-string.scss +110 -0
  88. package/modules/utilities/validators/type-of/_is-type.scss +77 -0
  89. package/package.json +54 -0
  90. package/package.scss +156 -0
  91. package/test.md +168 -0
  92. package/test.scss +405 -0
  93. 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
+ }