@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
@@ -0,0 +1,135 @@
1
+ @use 'sass:math';
2
+ @use 'sass:string';
3
+ @use '../../loggers/log-invalid-type' as *;
4
+ @use '../../validators/type-of/is-number' as *;
5
+ @use '../../validators/type-of/is-string' as *;
6
+
7
+ /// Генерирует уникальный строковый идентификатор с префиксом.
8
+ ///
9
+ /// Функция создает гарантированно уникальный идентификатор,
10
+ /// комбинируя пользовательский префикс, случайное число и
11
+ /// встроенный уникальный временной штамп Sass. Это позволяет
12
+ /// создавать идентификаторы, которые практически исключают
13
+ /// вероятность коллизий даже при массовой генерации в разных
14
+ /// контекстах выполнения.
15
+ ///
16
+ /// Важные особенности функции:
17
+ /// - Поддерживает настраиваемый префикс для семантического
18
+ /// обозначения типа идентификатора
19
+ /// - Использует криптографически безопасный генератор
20
+ /// случайных чисел Sass
21
+ /// - Добавляет встроенный временной штамп для уникальности
22
+ /// - Выполняет строгую проверку типов входных параметров
23
+ /// - Возвращает строку, готовую к использованию как CSS ID
24
+ /// или имя класса
25
+ /// - Полезна для генерации уникальных имен в CSS-in-JS
26
+ /// решениях
27
+ /// - Может использоваться для создания ключей в картах
28
+ /// - Обеспечивает уникальность в пределах одной компиляции
29
+ /// - Совместима с модульной системой Sass
30
+ /// ---
31
+ /// @name get-uid
32
+ /// @group utilities-getters
33
+ /// @since 2026.01.18
34
+ /// @access public
35
+ /// @author Murad Rustamov (therteenten)
36
+ /// @link https://sourcecraft.dev/users/therteenten/overview SourceCraft - therteenten
37
+ /// @link https://sourcecraft.dev/omnisass/library SourceCraft - OmniSass
38
+ /// @link https://sass-lang.com/documentation/modules/math См. также: Официальная документация Sass - Модуль Math
39
+ /// @link https://sass-lang.com/documentation/modules/string См. также: Официальная документация Sass - Модуль String
40
+ /// @link https://sass-lang.com/documentation/values/numbers См. также: Официальная документация Sass - Тип данных "Числа"
41
+ /// @link https://sass-lang.com/documentation/values/strings См. также: Официальная документация Sass - Тип данных "Строки"
42
+ /// @link https://developer.mozilla.org/en-US/docs/Web/API/Crypto/randomUUID См. также: MDN Web Docs - Метод Crypto.randomUUID()
43
+ /// @link https://developer.mozilla.org/en-US/docs/Glossary/CSS_keyword См. также: MDN Web Docs - Глоссарий: CSS Keyword
44
+ /// @link https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/id См. также: MDN Web Docs - Глобальный атрибут id
45
+ /// @link https://css-tricks.com/snippets/sass/unique-id-function/ См. также: CSS-Tricks - Функция уникального ID в Sass
46
+ /// @link https://css-tricks.com/sass-generate-ids-classes/ См. также: CSS-Tricks - Генерация ID и классов в Sass
47
+ /// @link https://sass-guidelin.es/ru/#section-44 См. также: Sass Guidelines - Раздел про функции
48
+ /// @link https://github.com/sass/sass/issues/2848 См. также: GitHub - Обсуждение уникальных ID в Sass
49
+ /// @example scss - Базовое использование с префиксом по умолчанию
50
+ /// @debug get-uid(); // "id-384756-uasgd7234"
51
+ /// @debug get-uid(); // "id-928173-kjhasd872"
52
+ /// @debug get-uid(); // "id-102938-poiuy1234"
53
+ /// @example scss - Использование с кастомным префиксом
54
+ /// @debug get-uid('user-'); // "user-473829-oiuyt9876"
55
+ /// @debug get-uid('modal-'); // "modal-192837-zxcvb4567"
56
+ /// @debug get-uid('component-'); // "component-564738-mnbvc0987"
57
+ /// @example scss - Использование с разным диапазоном случайных чисел
58
+ /// @debug get-uid('id-', 1000); // "id-423-iuyt6543"
59
+ /// @debug get-uid('id-', 9999999); // "id-7823491-zxcv5432"
60
+ /// @debug get-uid('id-', 100); // "id-87-asdfg1234"
61
+ /// @param {String} $prefix ["id-"] - Префикс для
62
+ /// идентификатора. Добавляется в начало строки ID,
63
+ /// позволяя семантически группировать идентификаторы
64
+ /// по назначению. Должен быть строковым значением.
65
+ /// @param {Number} $random-max [1000000] - Максимальное
66
+ /// значение для генерации случайного числа. Определяет
67
+ /// диапазон случайной части идентификатора (от 1 до
68
+ /// указанного значения). Должен быть числовым значением.
69
+ /// @return {String} - Уникальный строковый идентификатор
70
+ /// в формате "префикс-случайное_число-временной_штамп".
71
+ /// Гарантирует уникальность в пределах текущей сессии
72
+ /// компиляции Sass.
73
+ /// @throws {Error} - Выбрасывает ошибку, если в параметр передано
74
+ /// значение, не соответствующее необходимому типу:
75
+ ///
76
+ /// - `$prefix` → `string`
77
+ /// - `$random-max` → `number`
78
+ @function get-uid($prefix: "id-", $random-max: 1000000) {
79
+
80
+ // Проверка типа первого параметра: ожидается строковый префикс.
81
+ // Префикс позволяет семантически обозначать тип идентификатора
82
+ // (например, 'user-', 'modal-', 'component-'), что улучшает
83
+ // читаемость и отладку сгенерированных идентификаторов.
84
+ @if not is-string($prefix) {
85
+
86
+ // Если $prefix не является строкой, возвращаем ошибку через
87
+ // стандартную функцию логирования. Это предотвращает
88
+ // некорректную конкатенацию с нестроковыми значениями.
89
+ @return log-invalid-type(
90
+ 'get-uid',
91
+ $prefix,
92
+ '$prefix',
93
+ 'string'
94
+ );
95
+
96
+ }
97
+
98
+ // Проверка типа второго параметра: ожидается числовое значение
99
+ // для диапазона случайных чисел. Параметр определяет верхнюю
100
+ // границу для генератора случайных чисел (math.random).
101
+ @else if not is-number($random-max) {
102
+
103
+ // Если $random-max не является числом, возвращаем ошибку.
104
+ // Проверка выполняется только если $prefix прошел валидацию.
105
+ @return log-invalid-type(
106
+ 'get-uid',
107
+ $random-max,
108
+ '$random-max',
109
+ 'number'
110
+ );
111
+
112
+ }
113
+
114
+ // Все параметры прошли валидацию - генерируем уникальный ID.
115
+ @else {
116
+
117
+ // Генерация случайного числа в диапазоне от 1 до $random-max.
118
+ // Функция math.random() использует криптографически безопасный
119
+ // генератор, обеспечивающий хорошее распределение значений.
120
+ $-random: math.random($random-max);
121
+
122
+ // Генерация уникального временного штампа.
123
+ // Функция string.unique-id() возвращает гарантированно
124
+ // уникальную строку в пределах текущей компиляции Sass,
125
+ // основанную на времени и случайных факторах.
126
+ $-timestamp: string.unique-id();
127
+
128
+ // Конкатенация всех компонентов в финальный идентификатор.
129
+ // Формат: префикс + случайное_число + разделитель + штамп.
130
+ // Разделитель '-' улучшает читаемость и парсинг при отладке.
131
+ @return $prefix + $-random + "-" + $-timestamp;
132
+
133
+ }
134
+
135
+ }
@@ -96,8 +96,12 @@
96
96
  /// указанный процент от целого. Возвращает значение в тех же
97
97
  /// единицах измерения, что и параметр `$whole`.
98
98
  /// @throws {Error} - Может выбросить ошибку если `$percentage`
99
- /// не содержит единицы измерения '%' или если параметры
100
- /// не являются числами.
99
+ /// не содержит единицы измерения '%'.
100
+ /// @throws {Error} - Выбрасывает ошибку, если в параметр передано
101
+ /// значение, не соответствующее необходимому типу:
102
+ ///
103
+ /// - `$percentage` → `number`
104
+ /// - `$whole` → `number`
101
105
  @function get-number-from-percent($percentage, $whole) {
102
106
 
103
107
  // ВАЛИДАЦИЯ ВХОДНЫХ ПАРАМЕТРОВ
@@ -152,6 +152,11 @@
152
152
  /// @throws {Error} - Выбрасывает ошибку деления на ноль, если
153
153
  /// `$ratio = 0`. Это соответствует математически невозможной
154
154
  /// ситуации, когда высота была бы бесконечной.
155
+ /// @throws {Error} - Выбрасывает ошибку, если в параметр передано
156
+ /// значение, не соответствующее необходимому типу:
157
+ ///
158
+ /// - `$width` → `number`
159
+ /// - `$ratio` → `number`
155
160
  @function get-number-height-by-ratio($width, $ratio) {
156
161
 
157
162
  @if not is-number($width) {
@@ -73,6 +73,10 @@
73
73
  /// значения.
74
74
  /// @throws {Error} - Может выбросить ошибку при попытке
75
75
  /// сравнить числа с несовместимыми единицами измерения.
76
+ /// @throws {Error} - Выбрасывает ошибку, если в параметр передано
77
+ /// значение, не соответствующее необходимому типу:
78
+ ///
79
+ /// - `$list` → `list`
76
80
  @function get-number-max($list) {
77
81
 
78
82
  // Переменная для хранения текущего максимального значения.
@@ -72,6 +72,10 @@
72
72
  /// значения.
73
73
  /// @throws {Error} - Может выбросить ошибку при попытке
74
74
  /// сравнить числа с несовместимыми единицами измерения.
75
+ /// @throws {Error} - Выбрасывает ошибку, если в параметр передано
76
+ /// значение, не соответствующее необходимому типу:
77
+ ///
78
+ /// - `$list` → `list`
75
79
  @function get-number-min($list) {
76
80
 
77
81
  // Инициализация переменной для хранения результата.
@@ -89,7 +89,12 @@
89
89
  /// представляющее отношение части к целому. Возвращаемое значение
90
90
  /// можно использовать напрямую в CSS-свойствах.
91
91
  /// @throws {Error} - Может выбросить ошибку деления на ноль,
92
- /// если `$whole` равно 0, или если параметры не являются числами.
92
+ /// если `$whole` равно 0.
93
+ /// @throws {Error} - Выбрасывает ошибку, если в параметр передано
94
+ /// значение, не соответствующее необходимому типу:
95
+ ///
96
+ /// - `$part` → `number`
97
+ /// - `$whole` → `number`
93
98
  @function get-number-percentage-of($part, $whole) {
94
99
 
95
100
  @if not is-number($part) {
@@ -64,8 +64,10 @@
64
64
  /// возвращается строка с этими единицами. Для
65
65
  /// безразмерных чисел и нечисловых значений
66
66
  /// возвращается пустая строка (`''`).
67
- /// @throws {Error} - Не выбрасывает ошибок, только
68
- /// если значение является числом.
67
+ /// @throws {Error} - Выбрасывает ошибку, если в параметр передано
68
+ /// значение, не соответствующее необходимому типу:
69
+ ///
70
+ /// - `$value` → `number`
69
71
  @function get-number-unit($value) {
70
72
 
71
73
  @if not is-number($value) {
@@ -155,6 +155,11 @@
155
155
  /// @return {Number} - Ширина элемента, рассчитанная по формуле
156
156
  /// `width = height × ratio`. Сохраняет единицы измерения
157
157
  /// параметра `$height`.
158
+ /// @throws {Error} - Выбрасывает ошибку, если в параметр передано
159
+ /// значение, не соответствующее необходимому типу:
160
+ ///
161
+ /// - `$height` → `number`
162
+ /// - `$ratio` → `number`
158
163
  @function get-number-width-by-ratio($height, $ratio) {
159
164
 
160
165
  @if not is-number($height) {
@@ -0,0 +1,143 @@
1
+ @use 'sass:string';
2
+ @use '../../loggers/log-invalid-type' as *;
3
+ @use '../../validators/type-of/is-string' as *;
4
+
5
+ /// Вычисляет числовой хеш-код для строки по алгоритму DJB2.
6
+ ///
7
+ /// Функция преобразует произвольную строку в числовой хеш-код
8
+ /// фиксированной длины (до 6 знаков). Алгоритм использует
9
+ /// мультипликативный подход с множителем 31 и модульной
10
+ /// арифметикой, что обеспечивает хорошее распределение
11
+ /// значений при минимальных коллизиях для коротких строк.
12
+ ///
13
+ /// Важные особенности функции:
14
+ /// - Реализует упрощенную версию алгоритма хеширования DJB2
15
+ /// - Использует множитель 31 для оптимального распределения
16
+ /// - Ограничивает результат модулем 1,000,000 (6 знаков)
17
+ /// - Работает только с алфавитно-цифровыми символами
18
+ /// - Возвращает 0 для пустой строки или некорректных символов
19
+ /// - Выполняет строгую проверку типа входного параметра
20
+ /// - Подходит для создания коротких уникальных идентификаторов
21
+ /// - Может использоваться для быстрого сравнения строк
22
+ /// - Полезна для генерации ключей в картах или массивах
23
+ /// - Обеспечивает детерминированный результат для одинаковых
24
+ /// входных данных
25
+ /// - Алгоритм использует ограниченный набор символов
26
+ /// (a-z, A-Z, 0-9). Символы вне этого набора игнорируются
27
+ /// и не влияют на итоговый хеш. Для поддержки Unicode или
28
+ /// расширенных символов потребуется модификация функции.
29
+ /// - Множитель 31 выбран как простое число, что
30
+ /// способствует хорошему распределению хеш-значений.
31
+ /// Этот множитель используется в реализации hashCode()
32
+ /// языка Java для строк.
33
+ /// - Модуль 1000000 ограничивает результат 6 знаками,
34
+ /// что удобно для генерации коротких идентификаторов.
35
+ /// При необходимости большего диапазона значение модуля
36
+ /// можно увеличить.
37
+ /// ---
38
+ /// @name get-string-hash
39
+ /// @group utilities-getters
40
+ /// @since 2026.01.18
41
+ /// @access public
42
+ /// @author Murad Rustamov (therteenten)
43
+ /// @link https://sourcecraft.dev/users/therteenten/overview SourceCraft - therteenten
44
+ /// @link https://sourcecraft.dev/omnisass/library SourceCraft - OmniSass
45
+ /// @link https://sass-lang.com/documentation/modules/string См. также: Официальная документация Sass - Модуль String
46
+ /// @link https://sass-lang.com/documentation/values/numbers См. также: Официальная документация Sass - Тип данных "Числа"
47
+ /// @link https://sass-lang.com/documentation/values/strings См. также: Официальная документация Sass - Тип данных "Строки"
48
+ /// @link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/charCodeAt См. также: MDN Web Docs - Метод String.charCodeAt()
49
+ /// @link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/hashCode См. также: MDN Web Docs - Метод String.hashCode()
50
+ /// @link https://en.wikipedia.org/wiki/Hash_function См. также: Wikipedia - Хеш-функция
51
+ /// @link https://en.wikipedia.org/wiki/Java_hashCode() См. также: Wikipedia - Метод hashCode() в Java
52
+ /// @link https://en.wikipedia.org/wiki/DJB2 См. также: Wikipedia - Алгоритм хеширования DJB2
53
+ /// @link https://css-tricks.com/snippets/sass/string-hashing-function/ См. также: CSS-Tricks - Функция хеширования строк в Sass
54
+ /// @link https://css-tricks.com/sass-generate-unique-ids/ См. также: CSS-Tricks - Генерация уникальных ID в Sass
55
+ /// @link https://sass-guidelin.es/ru/#section-44 См. также: Sass Guidelines - Раздел про функции
56
+ /// @link https://github.com/sass/sass/issues/2864 См. также: GitHub - Обсуждение хеш-функций в Sass
57
+ /// @link https://www.strchr.com/hash_functions См. также: strchr.com - Сравнение хеш-функций
58
+ /// @example scss - Хеширование простых строк
59
+ /// @debug get-string-hash('hello'); // 549042
60
+ /// @debug get-string-hash('world'); // 705522
61
+ /// @debug get-string-hash('test'); // 601234
62
+ /// @debug get-string-hash(''); // 32
63
+ /// @example scss - Хеширование строк с разным регистром
64
+ /// @debug get-string-hash('Hello'); // 560588
65
+ /// @debug get-string-hash('HELLO'); // 360972
66
+ /// @debug get-string-hash('hElLo'); // 324414
67
+ /// @example scss - Хеширование алфавитно-цифровых строк
68
+ /// @debug get-string-hash('abc123'); // 619221
69
+ /// @debug get-string-hash('ABC123'); // 763259
70
+ /// @debug get-string-hash('user42'); // 927145
71
+ /// @param {String} $string - Строка для хеширования.
72
+ /// Функция ожидает строку, содержащую символы из набора
73
+ /// a-z, A-Z, 0-9. Для символов вне этого набора функция
74
+ /// string.index() вернет null, что приведет к нулевому
75
+ /// вкладу в хеш-значение. Пустая строка вернет 0.
76
+ /// @return {Number} - Числовой хеш-код в диапазоне от 0 до
77
+ /// 999999 (включительно). Результат детерминирован - одна
78
+ /// и та же строка всегда дает одинаковый хеш-код в
79
+ /// пределах одной версии функции.
80
+ /// @throws {Error} - Выбрасывает ошибку, если в параметр передано
81
+ /// значение, не соответствующее необходимому типу:
82
+ ///
83
+ /// - `$string` → `string`
84
+ @function get-string-hash($string) {
85
+
86
+ // Проверка типа входного параметра: ожидается строковое значение.
87
+ // Функция предназначена для работы исключительно со строками,
88
+ // так как алгоритм хеширования оперирует последовательностью символов.
89
+ @if not is-string($string) {
90
+
91
+ // Если $string не является строкой, возвращаем ошибку через
92
+ // стандартную функцию логирования. Это предотвращает
93
+ // некорректные операции с нестроковыми типами данных.
94
+ @return log-invalid-type(
95
+ 'get-string-hash',
96
+ $string,
97
+ '$string',
98
+ 'string'
99
+ );
100
+
101
+ }
102
+
103
+ // Параметр прошел валидацию - вычисляем хеш-код строки.
104
+ @else {
105
+
106
+ // Инициализация переменной для хранения хеш-значения.
107
+ // Начальное значение 0 обеспечивает корректную работу
108
+ // алгоритма для пустых строк и первого символа.
109
+ $-hash: 0;
110
+
111
+ // Определение длины входной строки.
112
+ // Длина используется для итерации по всем символам строки
113
+ // в цикле for.
114
+ $-length: string.length($string);
115
+
116
+ // Итерация по всем символам строки от первого до последнего.
117
+ // Каждый символ вносит свой вклад в итоговое хеш-значение
118
+ // согласно алгоритму DJB2.
119
+ @for $i from 1 through $-length {
120
+
121
+ // Извлечение текущего символа строки по индексу.
122
+ // Индексация в Sass начинается с 1 (не с 0).
123
+ $-char: string.slice($string, $i, $i);
124
+
125
+ // Вычисление нового значения хеша по формуле:
126
+ // hash = ((hash * 31) + char_index) % 1000000
127
+ // Где:
128
+ // - hash * 31: сдвиг предыдущего значения
129
+ // - char_index: позиция символа в алфавите (1-62)
130
+ // - % 1000000: ограничение результата 6 знаками
131
+ // string.index() возвращает позицию символа в строке
132
+ // алфавита или null для отсутствующих символов.
133
+ $-hash: (($-hash * 31) + string.index("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", $-char)) % 1000000;
134
+
135
+ }
136
+
137
+ // Возвращаем вычисленный хеш-код строки.
138
+ // Значение всегда будет в диапазоне 0-999999 включительно.
139
+ @return $-hash;
140
+
141
+ }
142
+
143
+ }
@@ -117,6 +117,12 @@
117
117
  /// - Последний элемент: чистый `$color-end` (100% смешивания)
118
118
  /// - Промежуточные элементы: равномерно распределенные смеси
119
119
  /// - Всего элементов: `$steps + 2`
120
+ /// @throws {Error} - Выбрасывает ошибку, если в параметр передано
121
+ /// значение, не соответствующее необходимому типу:
122
+ ///
123
+ /// - `$color-start` → `color`
124
+ /// - `$color-start` → `color`
125
+ /// - `$steps` → `number`
120
126
  @function color-blend-steps($color-start, $color-end, $steps: 5) {
121
127
 
122
128
  // Инициализация списка для хранения промежуточных цветов.
@@ -107,6 +107,12 @@
107
107
  /// интерполяцией между `$color-from` и `$color-to` в указанной пропорции.
108
108
  /// Использует цветовое пространство по умолчанию для
109
109
  /// смешивания (обычно sRGB).
110
+ /// @throws {Error} - Выбрасывает ошибку, если в параметр передано
111
+ /// значение, не соответствующее необходимому типу:
112
+ ///
113
+ /// - `$color-from` → `color`
114
+ /// - `$color-to` → `color`
115
+ /// - `$percentage` → `number`
110
116
  @function color-blend($color-from, $color-to, $percentage) {
111
117
 
112
118
  // Проверка типа первого параметра: ожидается начальный цвет.
@@ -84,6 +84,11 @@
84
84
  /// @return {Color} - Новый цвет в формате HSL с измененным
85
85
  /// цветовым тоном, но с сохранением исходных значений
86
86
  /// насыщенности и светлоты.
87
+ /// @throws {Error} - Выбрасывает ошибку, если в параметр передано
88
+ /// значение, не соответствующее необходимому типу:
89
+ ///
90
+ /// - `$color` → `color`
91
+ /// - `$degrees` → `number`
87
92
  @function color-hue-shift($color, $degrees) {
88
93
 
89
94
  // Проверка типа первого параметра: ожидается цветовое значение.
@@ -129,6 +129,11 @@
129
129
  /// - Последний элемент: `color-shade($color, 100%)`
130
130
  /// - Промежуточные элементы: равномерно распределенные оттенки
131
131
  /// - Длина списка = `$steps + 1`
132
+ /// @throws {Error} - Выбрасывает ошибку, если в параметр передано
133
+ /// значение, не соответствующее необходимому типу:
134
+ ///
135
+ /// - `$color` → `color`
136
+ /// - `$steps` → `number`
132
137
  @function color-scale($color, $steps: 5) {
133
138
 
134
139
  // Проверка типа первого параметра: ожидается базовый цвет.
@@ -53,6 +53,11 @@
53
53
  /// черный.
54
54
  /// @return {Color} - Затемненный цвет в том же формате,
55
55
  /// что и исходный.
56
+ /// @throws {Error} - Выбрасывает ошибку, если в параметр передано
57
+ /// значение, не соответствующее необходимому типу:
58
+ ///
59
+ /// - `$color` → `color`
60
+ /// - `$percentage` → `number`
56
61
  @function color-shade($color, $percentage) {
57
62
 
58
63
  // Проверка типа первого параметра: ожидается базовый цвет.
@@ -58,6 +58,11 @@
58
58
  /// При 0 вернется исходный цвет, при 100 — чистый белый.
59
59
  /// @return {Color} - Осветленный цвет в том же формате,
60
60
  /// что и входной.
61
+ /// @throws {Error} - Выбрасывает ошибку, если в параметр передано
62
+ /// значение, не соответствующее необходимому типу:
63
+ ///
64
+ /// - `$color` → `color`
65
+ /// - `$percentage` → `number`
61
66
  @function color-tint($color, $percentage) {
62
67
 
63
68
  // Проверка типа первого параметра: ожидается базовый цвет.
@@ -74,7 +74,6 @@
74
74
  /// (HEX, RGB, HSL, имя цвета).
75
75
  /// Цветовой тон (hue) этого цвета используется как отправная
76
76
  /// точка для расчета двух дополнительных цветов.
77
- ///
78
77
  /// @return {List} - Список (list) из трех строковых
79
78
  /// представлений цветов в формате, который Sass использует
80
79
  /// для внутреннего хранения (обычно HEX для цветов в
@@ -84,6 +83,10 @@
84
83
  /// - Первый элемент: строковое представление исходного цвета
85
84
  /// - Второй элемент: цвет со смещением +120° по цветовому кругу
86
85
  /// - Третий элемент: цвет со смещением +240° по цветовому кругу
86
+ /// @throws {Error} - Выбрасывает ошибку, если в параметр передано
87
+ /// значение, не соответствующее необходимому типу:
88
+ ///
89
+ /// - `$color` → `color`
87
90
  @function color-triad($color) {
88
91
 
89
92
  // Проверка типа входного параметра: ожидается цветовое значение.
@@ -90,6 +90,10 @@
90
90
  /// Сохраняет порядок элементов, оставляя только первое
91
91
  /// вхождение каждого значения. Если исходный список
92
92
  /// пустой, возвращает пустой список.
93
+ /// @throws {Error} - Выбрасывает ошибку, если в параметр передано
94
+ /// значение, не соответствующее необходимому типу:
95
+ ///
96
+ /// - `$list` → `list`
93
97
  @function list-dedupe($list) {
94
98
 
95
99
  // Проверка типа входного параметра: ожидается список или arglist.
@@ -76,6 +76,11 @@
76
76
  /// `$index` не является числом или если индекс меньше 1,
77
77
  /// а также предупреждение, если индекс превышает длину
78
78
  /// списка.
79
+ /// @throws {Error} - Выбрасывает ошибку, если в параметр передано
80
+ /// значение, не соответствующее необходимому типу:
81
+ ///
82
+ /// - `$list` → `list`
83
+ /// - `$index` → `number`
79
84
  @function list-insert-at($list, $value, $index) {
80
85
 
81
86
  // Проверка типа первого параметра: ожидается список или arglist.
@@ -1,4 +1,6 @@
1
1
  @use 'sass:list';
2
+ @use '../../loggers/log-invalid-type' as *;
3
+ @use '../../validators/type-of/is-list' as *;
2
4
 
3
5
  /// Объединяет несколько списков в один плоский список.
4
6
  ///
@@ -62,25 +64,69 @@
62
64
  /// .test {
63
65
  /// transition: opacity transform 0.3s 0.5s;
64
66
  /// }
65
- /// @param {ArgList} $lists... - Произвольное количество
67
+ /// @param {ArgList | List} $lists... - Произвольное количество
66
68
  /// списков для объединения. Каждый аргумент должен быть
67
69
  /// списком. Функция использует `arglist` для поддержки
68
70
  /// переменного числа аргументов.
69
71
  /// @return {List} - Новый список, содержащий все элементы из
70
72
  /// входных списков в порядке их следования. Если ни одного
71
73
  /// списка не передано, возвращается пустой список `()`.
72
- /// @throws Не выбрасывает ошибок, но если передать не список,
74
+ /// @throws {Warning} - Если передать не список,
73
75
  /// элемент будет добавлен как есть (не рекомендуется).
76
+ /// @throws {Error} - Выбрасывает ошибку, если в параметр передано
77
+ /// значение, не соответствующее необходимому типу:
78
+ ///
79
+ /// - `$lists` → `list`, 'arglist'
74
80
  @function list-merge($lists...) {
75
81
 
76
- $-result: ();
82
+ // Проверка типа входных параметров.
83
+ // Параметр $lists является arglist (переменное число аргументов),
84
+ // но функция также должна принимать единичный список.
85
+ // Функция is-list() проверяет, является ли $lists списком или arglist.
86
+ @if not is-list($lists) {
87
+
88
+ // Если $lists не является списком или arglist, возвращаем ошибку.
89
+ // Это предотвращает некорректные операции с некорректными данными.
90
+ @return log-invalid-type(
91
+ 'list-merge',
92
+ $lists,
93
+ '$lists',
94
+ ('arglist', 'list')
95
+ );
77
96
 
78
- @each $-list in $lists {
79
- @each $-item in $-list {
80
- $-result: list.append($-result, $-item);
81
- }
82
97
  }
83
98
 
84
- @return $-result;
99
+ // Основная логика выполняется только если $lists является
100
+ // корректным списком или arglist.
101
+ @else {
102
+
103
+ // Инициализация переменной для хранения результата.
104
+ // $-result будет содержать объединенный список всех элементов
105
+ // из переданных списков.
106
+ $-result: ();
107
+
108
+ // Внешний цикл: итерация по всем переданным спискам.
109
+ // Переменная $-list содержит текущий обрабатываемый список.
110
+ @each $-list in $lists {
111
+
112
+ // Внутренний цикл: итерация по всем элементам текущего списка.
113
+ // Переменная $-item содержит текущий обрабатываемый элемент.
114
+ @each $-item in $-list {
115
+
116
+ // Добавление элемента в результирующий список.
117
+ // Функция list.append() добавляет элемент в конец списка,
118
+ // сохраняя порядок элементов из исходных списков.
119
+ $-result: list.append($-result, $-item);
120
+
121
+ }
122
+
123
+ }
124
+
125
+ // Возвращаем объединенный список.
126
+ // Результат содержит все элементы из всех переданных списков
127
+ // в том порядке, в котором они были переданы.
128
+ @return $-result;
129
+
130
+ }
85
131
 
86
132
  }
@@ -84,6 +84,11 @@
84
84
  /// @throws {Error} - Не выбрасывает ошибок при невалидных
85
85
  /// индексах, но может выбросить ошибку если `$index` не
86
86
  /// является числом.
87
+ /// @throws {Error} - Выбрасывает ошибку, если в параметр передано
88
+ /// значение, не соответствующее необходимому типу:
89
+ ///
90
+ /// - `$list` → `list`
91
+ /// - `$index` → `number`
87
92
  @function list-remove-at($list, $index) {
88
93
 
89
94
  // Проверка типа первого параметра: ожидается список или arglist.
@@ -84,6 +84,9 @@
84
84
  /// измерения первого найденного числа.
85
85
  /// @throws {Warning} - Выводит предупреждение при обнаружении
86
86
  /// чисел с несовместимыми единицами измерения.
87
+ /// @throws {Error} - Выбрасывает ошибку, если в параметры передано
88
+ /// значение, не соответствующее типу `list`. Компиляция Sass
89
+ /// будет остановлена с ошибкой.
87
90
  @function list-sum-numbers-safe($list) {
88
91
 
89
92
  // Проверка типа входного параметра: ожидается список или arglist.
@@ -66,6 +66,9 @@
66
66
  /// @throws {Error} - Может выбросить ошибку при попытке
67
67
  /// сложить числа с несовместимыми единицами измерения
68
68
  /// (например, px + em).
69
+ /// @throws {Error} - Выбрасывает ошибку, если в параметры передано
70
+ /// значение, не соответствующее типу `list`. Компиляция Sass
71
+ /// будет остановлена с ошибкой.
69
72
  @function list-sum-numbers($list) {
70
73
 
71
74
  // Проверка типа входного параметра: ожидается список или arglist.