@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.
- package/CHANGELOG.md +120 -3
- package/README.md +94 -0
- package/index.scss +6 -0
- package/modules/utilities/converters/_convert-camel2kebab.scss +5 -4
- package/modules/utilities/converters/_convert-em2px.scss +5 -3
- package/modules/utilities/converters/_convert-hex2rgb.scss +4 -0
- package/modules/utilities/converters/_convert-hex2rgba.scss +5 -0
- package/modules/utilities/converters/_convert-kebab2camel.scss +5 -4
- package/modules/utilities/converters/_convert-kebab2snake.scss +4 -4
- package/modules/utilities/converters/_convert-px2em.scss +5 -4
- package/modules/utilities/converters/_convert-px2rem.scss +5 -4
- package/modules/utilities/converters/_convert-rem2px.scss +5 -3
- package/modules/utilities/converters/_convert-snake2kebab.scss +4 -4
- package/modules/utilities/getters/color/_get-color-brightness.scss +4 -0
- package/modules/utilities/getters/color/_get-color-darkest.scss +5 -1
- package/modules/utilities/getters/list/_get-list-item-end.scss +4 -2
- package/modules/utilities/getters/list/_get-list-item-start.scss +4 -2
- package/modules/utilities/getters/list/_get-list-item.scss +6 -4
- package/modules/utilities/getters/misc/_get-uid.scss +135 -0
- package/modules/utilities/getters/number/_get-number-from-percent.scss +6 -2
- package/modules/utilities/getters/number/_get-number-height-by-ratio.scss +5 -0
- package/modules/utilities/getters/number/_get-number-max.scss +4 -0
- package/modules/utilities/getters/number/_get-number-min.scss +4 -0
- package/modules/utilities/getters/number/_get-number-percentage-of.scss +6 -1
- package/modules/utilities/getters/number/_get-number-unit.scss +4 -2
- package/modules/utilities/getters/number/_get-number-width-by-ratio.scss +5 -0
- package/modules/utilities/getters/string/_get-string-hash.scss +143 -0
- package/modules/utilities/helpers/color/_color-blend-steps.scss +6 -0
- package/modules/utilities/helpers/color/_color-blend.scss +6 -0
- package/modules/utilities/helpers/color/_color-hue-shift.scss +5 -0
- package/modules/utilities/helpers/color/_color-scale.scss +5 -0
- package/modules/utilities/helpers/color/_color-shade.scss +5 -0
- package/modules/utilities/helpers/color/_color-tint.scss +5 -0
- package/modules/utilities/helpers/color/_color-triad.scss +4 -1
- package/modules/utilities/helpers/list/_list-dedupe.scss +4 -0
- package/modules/utilities/helpers/list/_list-insert-at.scss +5 -0
- package/modules/utilities/helpers/list/_list-merge.scss +54 -8
- package/modules/utilities/helpers/list/_list-remove-at.scss +5 -0
- package/modules/utilities/helpers/list/_list-sum-numbers-safe.scss +3 -0
- package/modules/utilities/helpers/list/_list-sum-numbers.scss +3 -0
- package/modules/utilities/helpers/misc/_url-encode.scss +7 -8
- package/modules/utilities/helpers/number/_number-ceil-to.scss +56 -4
- package/modules/utilities/helpers/number/_number-clamp-max.scss +65 -10
- package/modules/utilities/helpers/number/_number-clamp-min.scss +65 -10
- package/modules/utilities/helpers/number/_number-clamp.scss +88 -12
- package/modules/utilities/helpers/number/_number-denormalize.scss +87 -9
- package/modules/utilities/helpers/number/_number-fibonacci.scss +62 -9
- package/modules/utilities/helpers/number/_number-floor-to.scss +57 -3
- package/modules/utilities/helpers/number/_number-format-with-separator.scss +99 -16
- package/modules/utilities/helpers/number/_number-normalize.scss +88 -10
- package/modules/utilities/helpers/number/_number-random-between-int.scss +74 -13
- package/modules/utilities/helpers/number/_number-random-between.scss +76 -15
- package/modules/utilities/helpers/number/_number-range.scss +105 -12
- package/modules/utilities/helpers/number/_number-round-to-nearest.scss +58 -1
- package/modules/utilities/helpers/number/_number-round-to.scss +65 -2
- package/modules/utilities/helpers/number/_number-strip-unit.scss +43 -9
- package/modules/utilities/helpers/string/_string-capitalize.scss +46 -5
- package/modules/utilities/helpers/string/_string-count.scss +173 -0
- package/modules/utilities/helpers/string/_string-lorips.config.scss +81 -0
- package/modules/utilities/helpers/string/_string-lorips.scss +198 -0
- package/modules/utilities/helpers/string/_string-repeat.scss +147 -0
- package/modules/utilities/helpers/string/_string-replace.scss +82 -4
- package/modules/utilities/helpers/string/_string-reverse.scss +139 -0
- package/modules/utilities/helpers/string/_string-trim-end.scss +49 -6
- package/modules/utilities/helpers/string/_string-trim-start.scss +49 -6
- package/modules/utilities/helpers/string/_string-trim.scss +56 -11
- package/modules/utilities/loggers/_log-invalid-type.scss +1 -1
- package/modules/utilities/loggers/_log-invalid-value.scss +1 -1
- package/modules/utilities/validators/color/_is-color-light.scss +61 -4
- package/modules/utilities/validators/color/_is-color-list.scss +41 -9
- package/modules/utilities/validators/list/_is-list-contained.scss +42 -3
- package/modules/utilities/validators/misc/_is-time.scss +29 -0
- package/modules/utilities/validators/number/_is-int-even.scss +50 -8
- package/modules/utilities/validators/number/_is-int-odd.scss +51 -9
- package/modules/utilities/validators/number/_is-int.scss +71 -12
- package/modules/utilities/validators/number/_is-number-has-unit.scss +55 -13
- package/modules/utilities/validators/number/_is-number-negative.scss +53 -11
- package/modules/utilities/validators/number/_is-number-positive.scss +52 -10
- package/modules/utilities/validators/number/_is-number-unitless.scss +53 -12
- package/modules/utilities/validators/number/_is-number-zero.scss +54 -10
- package/modules/utilities/validators/string/_is-string-contained.scss +59 -4
- package/modules/utilities/validators/string/_is-string-empty.scss +48 -8
- package/modules/utilities/validators/string/_is-string-ending-with.scss +64 -5
- package/modules/utilities/validators/string/_is-string-starting-with.scss +60 -8
- package/package.json +1 -1
- package/package.scss +9 -8
- package/test2.sh +158 -0
- 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
|
-
|
|
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
|
-
|
|
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.
|