@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,62 @@
1
+ @use 'sass:string';
2
+
3
+ /// Удаляет пробелы с начала строки (слева).
4
+ ///
5
+ /// Функция последовательно проверяет и удаляет пробелы с начала
6
+ /// строки, пока не встретит непробельный символ.
7
+ ///
8
+ /// Возвращает строку без начальных пробелов.
9
+ ///
10
+ /// Важные особенности функции:
11
+ /// - Использует цикл `@while` для последовательного удаления начальных пробелов
12
+ /// - Проверяет первый символ строки на равенство пробелу
13
+ /// - Использует `string.slice()` для создания подстрок без начальных пробелов
14
+ /// - Удаляет только пробелы (символ " "), не удаляет другие whitespace-символы
15
+ /// - Сохраняет все пробелы в конце строки и между словами
16
+ /// - Полезен для обработки выровненных текстов или значений с отступами
17
+ /// ---
18
+ /// @name string-trim-start
19
+ /// @group utilities-helpers
20
+ /// @since 2026.01.03
21
+ /// @access public
22
+ /// @author Murad Rustamov (therteenten)
23
+ /// @link https://sourcecraft.dev/users/therteenten/overview SourceCraft - therteenten
24
+ /// @link https://sourcecraft.dev/omnisass/library SourceCraft - OmniSass
25
+ /// @link https://sass-lang.com/documentation/values/strings См. также: Официальная документация Sass - Тип данных "Строки"
26
+ /// @link https://sass-lang.com/documentation/modules/string#slice См. также: Официальная документация Sass - Функция string.slice()
27
+ /// @link https://sass-lang.com/documentation/at-rules/control См. также: Официальная документация Sass - Управляющие директивы
28
+ /// @link https://developer.mozilla.org/en-US/docs/Web/CSS/string_value См. также: MDN Web Docs - CSS-тип <string>
29
+ /// @link https://sass-lang.com/documentation/values/strings#interpolation См. также: Официальная документация Sass - Интерполяция строк
30
+ /// @link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/trimStart См. также: MDN Web Docs - JavaScript метод trimStart()
31
+ /// @example scss - Удаление начальных пробелов
32
+ /// @debug string-trim-start(' hello'); // "hello"
33
+ /// @debug string-trim-start(' world'); // "world"
34
+ /// @debug string-trim-start(' test '); // "test " (конечные пробелы сохраняются)
35
+ /// @example scss - Строки без начальных пробелов
36
+ /// @debug string-trim-start('hello'); // "hello"
37
+ /// @debug string-trim-start('hello '); // "hello "
38
+ /// @debug string-trim-start(''); // ""
39
+ /// @example scss - Граничные случаи
40
+ /// @debug string-trim-start(' '); // "" (только пробелы)
41
+ /// @debug string-trim-start(' a b '); // "a b " (сохраняет внутренние и конечные пробелы)
42
+ /// @debug string-trim-start(' hello world'); // "hello world"
43
+ /// @example scss - Сравнение с полным trim
44
+ /// @debug string-trim-start(' text '); // "text "
45
+ /// @debug string-trim(' text '); // "text" (удаляет и конечные пробелы)
46
+ /// @param {String} $string - Строка, из которой нужно удалить
47
+ /// начальные пробелы.
48
+ /// @return {String} - Возвращает новую строку, в которой удалены
49
+ /// все пробелы с начала оригинальной строки.
50
+ /// Если строка состоит только из пробелов, возвращается пустая строка.
51
+ /// @throws {Error} - Не выбрасывает ошибок. Если передано нестроковое
52
+ /// значение, функция может вернуть неожиданный результат или вызвать
53
+ /// ошибку выполнения.
54
+ @function string-trim-start($string) {
55
+
56
+ @while string.slice($string, 1, 1) == " " {
57
+ $string: string.slice($string, 2);
58
+ }
59
+
60
+ @return $string;
61
+
62
+ }
@@ -0,0 +1,69 @@
1
+ @use 'sass:string';
2
+
3
+ /// Удаляет пробелы с начала и конца строки.
4
+ ///
5
+ /// Функция последовательно проверяет и удаляет пробелы с начала
6
+ /// строки, затем с конца строки, пока не встретит непробельный
7
+ /// символ.
8
+ ///
9
+ /// Возвращает строку без начальных и конечных пробелов.
10
+ ///
11
+ /// Важные особенности функции:
12
+ /// - Использует циклы `@while` для последовательного удаления пробелов
13
+ /// - Проверяет первый и последний символы строки на равенство пробелу
14
+ /// - Использует `string.slice()` для создания подстрок без пробелов
15
+ /// - Удаляет только пробелы (символ " "), не удаляет другие whitespace-символы
16
+ /// - Сохраняет оригинальные пробелы внутри строки
17
+ /// ---
18
+ /// @name string-trim
19
+ /// @group utilities-helpers
20
+ /// @since 2026.01.03
21
+ /// @access public
22
+ /// @author Murad Rustamov (therteenten)
23
+ /// @link https://sourcecraft.dev/users/therteenten/overview SourceCraft - therteenten
24
+ /// @link https://sourcecraft.dev/omnisass/library SourceCraft - OmniSass
25
+ /// @link https://sass-lang.com/documentation/values/strings См. также: Официальная документация Sass - Тип данных "Строки"
26
+ /// @link https://sass-lang.com/documentation/modules/string#slice См. также: Официальная документация Sass - Функция string.slice()
27
+ /// @link https://sass-lang.com/documentation/at-rules/control См. также: Официальная документация Sass - Управляющие директивы
28
+ /// @link https://developer.mozilla.org/en-US/docs/Web/CSS/string_value См. также: MDN Web Docs - CSS-тип <string>
29
+ /// @link https://sass-lang.com/documentation/values/strings#interpolation См. также: Официальная документация Sass - Интерполяция строк
30
+ /// @link https://sass-lang.com/documentation/values/strings#quotes См. также: Официальная документация Sass - Кавычки в строках
31
+ /// @example scss - Удаление пробелов с обеих сторон
32
+ /// @debug string-trim(' hello '); // "hello"
33
+ /// @debug string-trim(' test '); // "test"
34
+ /// @debug string-trim(' multiple words '); // "multiple words"
35
+ /// @example scss - Только начальные или конечные пробелы
36
+ /// @debug string-trim(' leading'); // "leading"
37
+ /// @debug string-trim('trailing '); // "trailing"
38
+ /// @debug string-trim(' both '); // "both"
39
+ /// @example scss - Строки без внешних пробелов
40
+ /// @debug string-trim('hello'); // "hello"
41
+ /// @debug string-trim(''); // ""
42
+ /// @debug string-trim('inner space'); // "inner space"
43
+ /// @example scss - Граничные случаи
44
+ /// @debug string-trim(' '); // "" (только пробелы)
45
+ /// @debug string-trim(' a '); // "a" (один символ с пробелами)
46
+ /// @debug string-trim(' a b '); // "a b" (внутренние пробелы сохраняются)
47
+ /// @param {String} $string - Строка, из которой нужно удалить
48
+ /// начальные и конечные пробелы.
49
+ /// @return {String} - Возвращает новую строку, в которой удалены
50
+ /// все пробелы с начала и конца оригинальной строки.
51
+ /// Если строка состоит только из пробелов, возвращается пустая строка.
52
+ /// @throws {Error} - Не выбрасывает ошибок. Если передано нестроковое
53
+ /// значение, функция может вернуть неожиданный результат или вызвать
54
+ /// ошибку выполнения.
55
+ @function string-trim($string) {
56
+
57
+ // Убираем пробелы в начале
58
+ @while string.slice($string, 1, 1) == " " {
59
+ $string: string.slice($string, 2);
60
+ }
61
+
62
+ // Убираем пробелы в конце
63
+ @while string.slice($string, -1) == " " {
64
+ $string: string.slice($string, 1, -2);
65
+ }
66
+
67
+ @return $string;
68
+
69
+ }
@@ -0,0 +1,151 @@
1
+ @use '../../../configs' as libconfigs;
2
+ @use '../validators/type-of/is-type' as *;
3
+
4
+ /// Логирует ошибку или предупреждение о несоответствии типа
5
+ /// параметра ожидаемым типам.
6
+ ///
7
+ /// Функция генерирует детализированное сообщение об ошибке или
8
+ /// предупреждение, когда переданный параметр имеет тип, не
9
+ /// соответствующий ожидаемым типам. Поддерживает два режима
10
+ /// работы: строгий (выбрасывает ошибку) и нестрогий (выводит
11
+ /// предупреждение). Сообщения локализованы на русский и
12
+ /// английский языки и включают название функции для лучшей
13
+ /// идентификации источника проблемы.
14
+ ///
15
+ /// Важные особенности функции:
16
+ /// - Поддерживает строгий и нестрогий режимы работы
17
+ /// - Предоставляет локализованные сообщения (русский/английский)
18
+ /// - Включает название функции в сообщение об ошибке
19
+ /// - Выводит детальную информацию об ожидаемых и полученных типах
20
+ /// - Генерирует структурированные отладочные сообщения
21
+ /// - Позволяет гибко настраивать поведение через конфигурацию
22
+ /// - Сохраняет целостность типов в библиотеках и фреймворках
23
+ /// - Упрощает отладку неправильного использования функций
24
+ /// - Обеспечивает единообразную обработку ошибок типов
25
+ /// - Интегрируется с системой конфигурации проекта
26
+ /// - Возвращает `null` для совместимости с другими функциями
27
+ /// ---
28
+ /// @name log-invalid-type
29
+ /// @group utilities-loggers
30
+ /// @since 2026.01.13
31
+ /// @access public
32
+ /// @author Murad Rustamov (therteenten)
33
+ /// @link https://sourcecraft.dev/users/therteenten/overview SourceCraft - therteenten
34
+ /// @link https://sourcecraft.dev/omnisass/library SourceCraft - OmniSass
35
+ /// @link https://sass-lang.com/documentation/values См. также: Официальная документация Sass - Типы данных
36
+ /// @link https://sass-lang.com/documentation/style-rules/error См. также: Официальная документация Sass - Директива @error
37
+ /// @link https://sass-lang.com/documentation/at-rules/warn См. также: Официальная документация Sass - Директива @warn
38
+ /// @link https://sass-lang.com/documentation/at-rules/debug См. также: Официальная документация Sass - Директива @debug
39
+ /// @link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/typeof См. также: MDN Web Docs - Оператор typeof
40
+ /// @link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypeError См. также: MDN Web Docs - Ошибка TypeError
41
+ /// @link https://developer.mozilla.org/en-US/docs/Learn/JavaScript/First_steps/Useful_string_methods См. также: MDN Web Docs - Методы работы со строками
42
+ /// @link https://css-tricks.com/sass-techniques-from-the-trenches/ См. также: CSS-Tricks - Sass техники из практики
43
+ /// @link https://css-tricks.com/debugging-sass/ См. также: CSS-Tricks - Отладка Sass
44
+ /// @link https://sass-guidelin.es/ru/#section-7 См. также: Sass Guidelines - Раздел про обработку ошибок
45
+ /// @link https://www.w3schools.com/js/js_typeof.asp См. также: W3Schools - JavaScript Typeof
46
+ /// @example scss - Интеграция с системой конфигурации
47
+ /// // Настройка поведения через глобальные конфигурации
48
+ /// // $set-strict-mode: true; // Строгий режим
49
+ /// // $set-strict-mode: false; // Нестрогий режим
50
+ /// // $set-loglang: 'en'; // Английский язык
51
+ /// // $set-loglang: 'ru'; // Русский язык
52
+ ///
53
+ /// @function calculate-margin($base, $multiplier) {
54
+ /// @if is-type($base) != 'number' {
55
+ /// @return log-invalid-type(
56
+ /// 'calculate-margin',
57
+ /// $base,
58
+ /// '$base',
59
+ /// ('number')
60
+ /// );
61
+ /// }
62
+ /// @return $base * $multiplier;
63
+ /// }
64
+ ///
65
+ /// // Поведение зависит от глобальных настроек
66
+ /// @debug calculate-margin(10px, 2); // 20px
67
+ /// @debug calculate-margin('10px', 2); // ⛔ Error или ⚠️ Warning (с указанием функции «calculate-margin»)
68
+ /// @param {String} $function-name - Название функции, в которой
69
+ /// произошла ошибка типа. Используется для идентификации
70
+ /// источника ошибки в стеке вызовов. Должно быть строковым
71
+ /// значением. Включается в сообщение об ошибке для лучшей
72
+ /// идентификации.
73
+ /// @param {*} $parameter - Фактическое значение параметра,
74
+ /// тип которого проверяется. Может быть любого типа,
75
+ /// функция определит его тип с помощью `is-type()`.
76
+ /// @param {String} $parameter-name - Имя параметра в виде
77
+ /// строки (например, '$value', '$options'). Используется
78
+ /// в сообщении об ошибке для идентификации проблемного
79
+ /// параметра.
80
+ /// @param {List | String} $expected-types - Список ожидаемых типов
81
+ /// параметра. Может содержать один или несколько типов
82
+ /// в виде строк (например, `'map', `('number')` или
83
+ /// `('string', 'list', 'map')`). Отображается в
84
+ /// сообщении об ошибке.
85
+ /// @return {Null} - Всегда возвращает `null`. Это позволяет
86
+ /// использовать функцию в выражениях возврата, не нарушая
87
+ /// сигнатуры других функций.
88
+ /// @throws {Error} - Выбрасывает ошибку в строгом режиме
89
+ /// (`$set-strict-mode: true`). Ошибка содержит
90
+ /// локализованное сообщение о несоответствии типа с
91
+ /// указанием названия функции.
92
+ /// @throws {Warning} - Выводит предупреждение в нестрогом
93
+ /// режиме (`$set-strict-mode: false`).
94
+ /// Дополнительно выводит отладочные сообщения с помощью
95
+ /// `@debug` для детальной диагностики.
96
+ /// @require {function} is-type - Вспомогательная функция
97
+ /// определения типа значения. Должна быть определена
98
+ /// и доступна для корректной работы данной функции.
99
+ /// @require {variable} $set-strict-mode - Глобальная переменная,
100
+ /// определяющая режим работы. Если `true` - выбрасывает
101
+ /// ошибку, если `false` - выводит предупреждение.
102
+ /// @require {variable} $set-loglang - Глобальная переменная,
103
+ /// определяющая язык сообщений. Поддерживает значения `'ru'`
104
+ /// (русский) и другие (английский).
105
+ @function log-invalid-type(
106
+ $function-name,
107
+ $parameter,
108
+ $parameter-name,
109
+ $expected-types) {
110
+
111
+ // Получаем глобальные настройки из конфигурации
112
+ $-strict-mode: libconfigs.$set-strict-mode; // Режим работы: true = ошибки (строгий), false = предупреждения
113
+ $-loglang: libconfigs.$set-loglang; // Язык вывода сообщений
114
+ $-log-message: ''; // Текст сообщения об ошибке
115
+
116
+ // Определяем язык на основе глобальной настройки
117
+ @if $-loglang != 'ru' {
118
+ // Английская версия сообщения
119
+ // is-type($parameter) - вспомогательная функция,
120
+ // возвращающая тип значения
121
+ $-log-message: 'The parameter «#{$parameter-name}» of the function «#{$function-name}» received an unexpected type «#{is-type($parameter)}», although «#{$expected-types}» is expected';
122
+ } @else {
123
+ // Русская версия сообщения
124
+ $-log-message: 'Параметр «#{$parameter-name}» функции «#{$function-name}» получил неожиданный тип «#{is-type($parameter)}», хотя ожидается «#{$expected-types}»';
125
+ }
126
+
127
+ // Если строгий режим отключен
128
+ @if $-strict-mode == false {
129
+ // Выводим предупреждение (не останавливает компиляцию)
130
+ @warn '⚠️ ' + $-log-message;
131
+
132
+ // Детальная отладочная информация:
133
+ @debug '🟦 ┌ #{$parameter-name}'; // Имя параметра
134
+ @debug '🟥 └⤬ #{is-type($parameter)}'; // Фактический тип параметра (с ошибкой)
135
+
136
+ // Выводим список ожидаемых типов
137
+ @each $type in $expected-types {
138
+ @debug '✅ └─ #{$type}'; // Каждый ожидаемый тип
139
+ }
140
+
141
+ } @else {
142
+ // Строгий режим - выводим ошибку
143
+ // (останавливает компиляцию)
144
+ @error '⛔ ' + $-log-message;
145
+ }
146
+
147
+ // Всегда возвращаем null для использования
148
+ // в качестве заглушки
149
+ @return null;
150
+
151
+ }
@@ -0,0 +1,151 @@
1
+ @use '../../../configs' as libconfigs;
2
+
3
+ /// Логирует ошибку или предупреждение о недопустимом значении
4
+ /// параметра, когда передано значение, не входящее в список
5
+ /// разрешенных.
6
+ ///
7
+ /// Функция генерирует детализированное сообщение об ошибке или
8
+ /// предупреждение, когда переданный параметр имеет значение,
9
+ /// не соответствующее ожидаемому набору допустимых значений.
10
+ /// Поддерживает два режима работы: строгий (выбрасывает ошибку)
11
+ /// и нестрогий (выводит предупреждение). Сообщения локализованы
12
+ /// на русский и английский языки и включают название функции
13
+ /// для лучшей идентификации источника проблемы.
14
+ ///
15
+ /// Важные особенности функции:
16
+ /// - Поддерживает строгий и нестрогий режимы работы
17
+ /// - Предоставляет локализованные сообщения (русский/английский)
18
+ /// - Включает название функции в сообщение об ошибке
19
+ /// - Выводит детальную информацию о допустимых и полученных значениях
20
+ /// - Генерирует структурированные отладочные сообщения
21
+ /// - Позволяет гибко настраивать поведение через конфигурацию
22
+ /// - Сохраняет целостность данных в библиотеках и фреймворках
23
+ /// - Упрощает отладку неправильного использования функций
24
+ /// - Обеспечивает единообразную обработку ошибок значений
25
+ /// - Интегрируется с системой конфигурации проекта
26
+ /// - Возвращает `null` для совместимости с другими функциями
27
+ /// ---
28
+ /// @name log-invalid-value
29
+ /// @group utilities-loggers
30
+ /// @since 2026.01.14
31
+ /// @access public
32
+ /// @author Murad Rustamov (therteenten)
33
+ /// @link https://sourcecraft.dev/users/therteenten/overview SourceCraft - therteenten
34
+ /// @link https://sourcecraft.dev/omnisass/library SourceCraft - OmniSass
35
+ /// @link https://sass-lang.com/documentation/values См. также: Официальная документация Sass - Типы данных
36
+ /// @link https://sass-lang.com/documentation/style-rules/error См. также: Официальная документация Sass - Директива @error
37
+ /// @link https://sass-lang.com/documentation/at-rules/warn См. также: Официальная документация Sass - Директива @warn
38
+ /// @link https://sass-lang.com/documentation/at-rules/debug См. также: Официальная документация Sass - Директива @debug
39
+ /// @link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RangeError См. также: MDN Web Docs - Ошибка RangeError
40
+ /// @link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypeError См. также: MDN Web Docs - Ошибка TypeError
41
+ /// @link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/switch См. также: MDN Web Docs - Оператор switch
42
+ /// @link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/throw См. также: MDN Web Docs - Оператор throw
43
+ /// @link https://css-tricks.com/sass-techniques-from-the-trenches/ См. также: CSS-Tricks - Sass техники из практики
44
+ /// @link https://css-tricks.com/debugging-sass/ См. также: CSS-Tricks - Отладка Sass
45
+ /// @link https://sass-guidelin.es/ru/#section-7 См. также: Sass Guidelines - Раздел про обработку ошибок
46
+ /// @link https://www.w3schools.com/js/js_errors.asp См. также: W3Schools - JavaScript Ошибки
47
+ /// @example scss - Строгий режим (выбрасывает ошибку)
48
+ /// // В строгом режиме функция выбрасывает ошибку
49
+ /// // libconfigs.$set-strict-mode: true;
50
+ /// // libconfigs.$set-loglang: 'en';
51
+ ///
52
+ /// @function get-color($theme) {
53
+ /// @if not index(('light', 'dark', 'auto'), $theme) {
54
+ /// @return log-invalid-value(
55
+ /// 'get-color',
56
+ /// $theme,
57
+ /// '$theme',
58
+ /// ('light', 'dark', 'auto')
59
+ /// );
60
+ /// }
61
+ /// @if $theme == 'light' { @return #ffffff; }
62
+ /// @if $theme == 'dark' { @return #000000; }
63
+ /// @if $theme == 'auto' { @return #888888; }
64
+ /// }
65
+ ///
66
+ /// @debug get-color('light'); // #ffffff
67
+ /// @debug get-color('dark'); // #000000
68
+ /// @debug get-color('blue'); // ⛔ Error: An incorrect value was passed to the parameter «$theme» of the function «get-color». The parameter takes specific values: «light, dark, auto».
69
+ /// @param {String} $function-name - Название функции, в которой
70
+ /// произошла ошибка значения. Используется для идентификации
71
+ /// источника ошибки в стеке вызовов. Должно быть строковым
72
+ /// значением. Включается в сообщение об ошибке для лучшей
73
+ /// идентификации.
74
+ /// @param {*} $parameter - Фактическое значение параметра,
75
+ /// которое проверяется на соответствие допустимым значениям.
76
+ /// Может быть любого типа (строка, число, список и т.д.).
77
+ /// @param {String} $parameter-name - Имя параметра в виде
78
+ /// строки (например, '$variant', '$size'). Используется
79
+ /// в сообщении об ошибке для идентификации проблемного
80
+ /// параметра.
81
+ /// @param {List} $expected-values - Список допустимых значений
82
+ /// параметра. Может содержать одно или несколько значений
83
+ /// в виде списка (например, `('light', 'dark')` или
84
+ /// `(1, 2, 3, 4)`). Отображается в сообщении об ошибке.
85
+ /// @return {Null} - Всегда возвращает `null`. Это позволяет
86
+ /// использовать функцию в выражениях возврата, не нарушая
87
+ /// сигнатуры других функций.
88
+ /// @throws {Error} - Выбрасывает ошибку в строгом режиме
89
+ /// (`$set-strict-mode: true`). Ошибка содержит
90
+ /// локализованное сообщение о недопустимом значении с
91
+ /// указанием названия функции и списка допустимых значений.
92
+ /// @throws {Warning} - Выводит предупреждение в нестрогом
93
+ /// режиме (`$set-strict-mode: false`).
94
+ /// Дополнительно выводит отладочные сообщения с помощью
95
+ /// `@debug` для детальной диагностики.
96
+ /// @require {variable} $set-strict-mode - Глобальная переменная,
97
+ /// определяющая режим работы. Если `true` - выбрасывает
98
+ /// ошибку, если `false` - выводит предупреждение.
99
+ /// @require {variable} $set-loglang - Глобальная переменная,
100
+ /// определяющая язык сообщений. Поддерживает значения `'ru'`
101
+ /// (русский) и другие (английский).
102
+ @function log-invalid-value(
103
+ $function-name,
104
+ $parameter,
105
+ $parameter-name,
106
+ $expected-values) {
107
+
108
+ // Получаем глобальные настройки из конфигурационного
109
+ // файла:
110
+ $-strict-mode: libconfigs.$set-strict-mode; // true = строгий режим (ошибки), false = режим предупреждений
111
+ $-loglang: libconfigs.$set-loglang; // язык сообщений ('ru' = русский, любое другое = английский)
112
+ $-log-message: ''; // переменная для хранения текста сообщения
113
+
114
+ // Если язык НЕ русский, используем английский текст
115
+ @if $-loglang != 'ru' {
116
+ // Английская версия: сообщает о неверном значении и
117
+ // показывает ожидаемые варианты:
118
+ $-log-message: 'An incorrect value was passed to the parameter «#{$parameter-name}» of the function «#{$function-name}». The parameter takes specific values: «#{$expected-values}».';
119
+ } @else {
120
+ // Русская версия: то же сообщение на русском языке:
121
+ $-log-message: 'В параметр «#{$parameter-name}» функции «#{$function-name}» передано неверное значение. Параметр принимает конкретные значения: «#{$expected-values}».';
122
+ }
123
+
124
+ // Если строгий режим ВЫКЛЮЧЕН (false)
125
+ @if $-strict-mode == false {
126
+
127
+ // Выводим предупреждение в консоль (не останавливает
128
+ // компиляцию):
129
+ @warn '⚠️ ' + $-log-message;
130
+
131
+ // Дополнительная отладочная информация для разработчика:
132
+ @debug '🟦 ┌ #{$parameter-name}'; // Синяя строка: показывает имя проблемного параметра
133
+ @debug '🟥 └⤬ #{$parameter}'; // Красная строка с крестиком: показывает переданное неверное значение
134
+
135
+ // Перебираем все ожидаемые значения и выводим их:
136
+ @each $value in $expected-values {
137
+ @debug '✅ └─ #{$value}'; // Зеленая строка с галочкой: каждое допустимое значение
138
+ }
139
+
140
+ } @else {
141
+ // СТРОГИЙ РЕЖИМ ВКЛЮЧЕН (true)
142
+ // Выводим ошибку, которая ПРЕРЫВАЕТ компиляцию:
143
+ @error '⛔ ' + $-log-message;
144
+ }
145
+
146
+ // Функция всегда возвращает `null`. Это удобно, чтобы
147
+ // использовать вызов этой функции как "заглушку".
148
+ // Например: `@return log-invalid-value(...);`
149
+ @return null;
150
+
151
+ }
@@ -0,0 +1,3 @@
1
+ ////
2
+ /// @group utilities-setters
3
+ ////
@@ -0,0 +1,132 @@
1
+ @use 'sass:color';
2
+
3
+ /// Определяет, является ли цвет светлым (по пороговому
4
+ /// значению светлоты).
5
+ ///
6
+ /// Функция `is-color-light()` анализирует цвет и возвращает
7
+ /// `true`, если его светлота (lightness в HSL) превышает
8
+ /// заданный порог. Это особенно полезно для автоматического
9
+ /// выбора контрастного цвета текста, создания доступных
10
+ /// интерфейсов или применения стилей в зависимости от тона
11
+ /// фонового цвета.
12
+ /// ---
13
+ /// @name is-color-light
14
+ /// @group utilities-validators
15
+ /// @since 2026.01.03
16
+ /// @access public
17
+ /// @author Murad Rustamov (therteenten)
18
+ /// @link https://sourcecraft.dev/users/therteenten/overview SourceCraft - therteenten
19
+ /// @link https://sourcecraft.dev/omnisass/library SourceCraft - OmniSass
20
+ /// @link https://sass-lang.com/documentation/modules/color#channel См. также: Sass - Документация функции color.channel()
21
+ /// @link https://developer.mozilla.org/en-US/docs/Web/Accessibility/Understanding_WCAG/Perceivable/Color_contrast См. также: MDN - Понимание WCAG: Контрастность цветов
22
+ /// @link https://webaim.org/resources/contrastchecker/ См. также: WebAIM - Проверка контрастности цветов
23
+ /// @link https://www.w3.org/TR/WCAG21/#contrast-minimum См. также: W3C - Рекомендации по минимальному контрасту
24
+ /// @link https://css-tricks.com/switch-font-color-for-different-backgrounds-with-css/ См. также: CSS-Tricks - Смена цвета текста для разных фонов
25
+ /// @link https://css-tricks.com/8-digit-hex-codes/ См. также: CSS-Tricks - Цвета с альфа-каналом в HEX
26
+ /// @example scss - Пример использования
27
+ /// $primary: #3498db;
28
+ /// $dark-bg: #2c3e50;
29
+ /// $light-bg: #ecf0f1;
30
+ ///
31
+ /// // Автоматический выбор цвета текста
32
+ /// .card {
33
+ /// &--dark {
34
+ /// background-color: $dark-bg;
35
+ /// color: if(is-color-light($dark-bg), #000, #fff); // белый текст
36
+ /// }
37
+ ///
38
+ /// &--light {
39
+ /// background-color: $light-bg;
40
+ /// color: if(is-color-light($light-bg), #000, #fff); // черный текст
41
+ /// }
42
+ /// }
43
+ ///
44
+ /// // Динамическое изменение стиля с порогом по умолчанию (50%)
45
+ /// .badge {
46
+ /// background-color: $primary;
47
+ ///
48
+ /// @if is-color-light($primary) {
49
+ /// border: 1px solid color.scale($primary, $lightness: -20%)
50
+ /// } @else {
51
+ /// border: 1px solid color.adjust($primary, $lightness: -20%)
52
+ /// }
53
+ /// }
54
+ ///
55
+ /// // Использование кастомного порога
56
+ /// .notification {
57
+ /// background-color: #777; // средне-серый
58
+ ///
59
+ /// @if is-color-light(#777, 60%) {
60
+ /// // Этот код не выполнится, т.к. светлота #777 около 46%
61
+ /// color: #222;
62
+ /// } @else {
63
+ /// color: #eee;
64
+ /// }
65
+ /// }
66
+ /// @example css - Результат
67
+ /// .card--dark {
68
+ /// background-color: #2c3e50;
69
+ /// color: #fff;
70
+ /// }
71
+ /// .card--light {
72
+ /// background-color: #ecf0f1;
73
+ /// color: #000;
74
+ /// }
75
+ ///
76
+ /// .badge {
77
+ /// background-color: #4d4d4d;
78
+ /// border: 1px solid #1a1a1a;
79
+ /// }
80
+ ///
81
+ /// .notification {
82
+ /// background-color: #777;
83
+ /// color: #eee;
84
+ /// }
85
+ /// @example scss - Пример использования (`@debug`)
86
+ /// // Основные цвета
87
+ /// @debug is-color-light(#ffffff); // true (100% lightness)
88
+ /// @debug is-color-light(#000000); // false (0% lightness)
89
+ ///
90
+ /// // Серые оттенки - lightness равна примерно процентному значению в HEX
91
+ /// @debug is-color-light(#f8f9fa); // true (~98% lightness)
92
+ /// @debug is-color-light(#cccccc); // true (~80% lightness)
93
+ /// @debug is-color-light(#888888); // true (~53% lightness) - это ключевая ошибка!
94
+ /// @debug is-color-light(#808080); // true (ровно 50% lightness) - не false!
95
+ /// @debug is-color-light(#777777); // false (~47% lightness)
96
+ /// @debug is-color-light(#333333); // false (~20% lightness)
97
+ ///
98
+ /// // Именованные цвета - реальные значения lightnes
99
+ /// @debug is-color-light(white); // true (100%)
100
+ /// @debug is-color-light(black); // false (0%)
101
+ /// @debug is-color-light(red); // true (50%) - по умолчанию true!
102
+ /// @debug is-color-light(lime); // true (100%)
103
+ /// @debug is-color-light(yellow); // true (97%)
104
+ /// @debug is-color-light(blue); // false (50%) - по умолчанию false!
105
+ /// @debug is-color-light(green); // false (50%) - по умолчанию false!
106
+ /// @debug is-color-light(purple); // false (50%) - по умолчанию false!
107
+ ///
108
+ /// // Цвета с использованием различных форматов
109
+ /// @debug is-color-light(rgb(128, 128, 128)); // true (50% lightness)
110
+ /// @debug is-color-light(rgba(127, 127, 127, 0.5)); // false (49.8% lightness)
111
+ /// @debug is-color-light(hsl(0, 100%, 50%)); // true (50% lightness - красный)
112
+ /// @debug is-color-light(hsl(240, 100%, 50%)); // false (50% lightness - синий)
113
+ ///
114
+ /// // С кастомным порогом
115
+ /// @debug is-color-light(#aaaaaa, 60%); // true (67% lightness)
116
+ /// @debug is-color-light(#aaaaaa, 70%); // false (67% lightness < 70%)
117
+ /// @debug is-color-light(#444444, 40%); // false (27% lightness)
118
+ /// @debug is-color-light(#444444, 20%); // true (27% lightness > 20%)
119
+ /// @param {Color} $color - Цвет для проверки. Может быть в
120
+ /// любом формате, который поддерживает Sass (HEX, RGB,
121
+ /// HSL, имя цвета).
122
+ /// @param {Number} $threshold [50] - Пороговое значение
123
+ /// светлоты в процентах (0% - 100%). По умолчанию
124
+ /// используется значение 50%, которое является
125
+ /// общепринятым разделением между светлыми и темными
126
+ /// тонами. Можно изменить для тонкой настройки.
127
+ /// @return {Boolean} - Возвращает `true`, если светлота
128
+ /// цвета больше порогового значения, и `false` в противном
129
+ /// случае.
130
+ @function is-color-light($color, $threshold: 50) {
131
+ @return color.channel($color, "lightness", $space: hsl) > $threshold;
132
+ }