@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
package/CHANGELOG.md ADDED
@@ -0,0 +1,5 @@
1
+ # История изменений OmniSass
2
+ Обратите внимание, что данный текст представляет собой краткое изложение истории разработки проекта по версиям. Для более детального ознакомления с изменениями рекомендуется обратиться к соответствующему [разделу](https://sourcecraft.dev/therteenten/omnisass/commits/?rev=master) в SourceCraft.
3
+
4
+ ## 0.0.1 - Alpha Public Preview
5
+ ...
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025, Murad Rustamov (therteenten) <therteenten@ya.ru>
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,2 @@
1
+ # OmniSass
2
+ Библиотека функций и миксинов, написанная на языке CSS-препроцессора Sass. Она предназначена для того, чтобы упростить, ускорить и улучшить процесс создания стилей для веб-сайтов.
package/_configs.scss ADDED
@@ -0,0 +1,68 @@
1
+ ////
2
+ /// Настоятельно рекомендуется обратить внимание на тот факт,
3
+ /// что конфигурационные параметры, представленные в данном файле,
4
+ /// регламентируют глобальные настройки библиотеки. В то же время,
5
+ /// специализированные параметры, относящиеся к конкретным миксинам
6
+ /// и функциям, локализованы в соответствующих директориях,
7
+ /// предназначенных для этих сущностей. Это архитектурное решение
8
+ /// обеспечивает модульность и гибкость конфигурации, позволяя
9
+ /// осуществлять тонкую настройку отдельных модулей.
10
+ ///
11
+ /// При использовании этого модуля пространство имён для этих
12
+ /// конфигов рекомендуется указывать как `libconfigs`.
13
+ /// ---
14
+ /// @group libconfigs
15
+ ////
16
+
17
+ /// Включает или выключает строгий режим компиляции OmniSass.
18
+ ///
19
+ /// Когда строгий режим включен (`true`), компилятор будет
20
+ /// выбрасывать ошибки при использовании устаревших функций,
21
+ /// нерекомендуемых практик или потенциально проблемных
22
+ /// конструкций. Это помогает писать более чистый и совместимый
23
+ /// код.
24
+ /// ---
25
+ /// @name set-strict-mode
26
+ /// @access public
27
+ /// @example scss Отключение режима
28
+ /// @use 'omnisass' as libomnisass with (
29
+ /// $set-strict-mode: false
30
+ /// );
31
+ /// @type Boolean
32
+ $set-strict-mode: true !default;
33
+
34
+ /// RUSSIAN:
35
+ /// Устанавливает язык для системных сообщений и логов
36
+ /// компилятора.
37
+ ///
38
+ /// Определяет язык, на котором будут выводиться предупреждения,
39
+ /// ошибки и другие системные сообщения во время компиляции
40
+ /// Sass-кода. Поддерживаемые значения: 'ru' (русский), 'en'
41
+ /// (английский).
42
+ ///
43
+ /// > Наличие новых языков можно проверить в документации.
44
+ ///
45
+ /// ENGLISH:
46
+ /// Sets the language for system messages and compiler logs.
47
+ ///
48
+ /// Defines the language in which warnings, errors, and other
49
+ /// system messages will be displayed during compilation of
50
+ /// the Sass code. Supported values: 'ru' (Russian), 'en'
51
+ /// (English).
52
+ ///
53
+ /// > The availability of new languages can be checked in the
54
+ /// > documentation.
55
+ /// ---
56
+ /// @name set-loglang
57
+ /// @access public
58
+ /// @example scss Отключение режима
59
+ /// @use 'omnisass' as libomnisass with (
60
+ /// $set-loglang: 'en'
61
+ /// );
62
+ /// @type String
63
+ $set-loglang: 'ru' !default;
64
+
65
+ /// @name set-fingerprint
66
+ /// @access public
67
+ /// @type Boolean
68
+ $set-fingerprint: true !default;
package/index.scss ADDED
@@ -0,0 +1,95 @@
1
+ @charset "UTF-8";
2
+
3
+ @forward 'configs';
4
+ @forward 'package';
5
+
6
+ /// Converters
7
+ @forward 'modules/utilities/converters/convert-camel2kebab';
8
+ @forward 'modules/utilities/converters/convert-em2px';
9
+ @forward 'modules/utilities/converters/convert-hex2rgb';
10
+ @forward 'modules/utilities/converters/convert-hex2rgba';
11
+ @forward 'modules/utilities/converters/convert-kebab2camel';
12
+ @forward 'modules/utilities/converters/convert-kebab2snake';
13
+ @forward 'modules/utilities/converters/convert-px2em';
14
+ @forward 'modules/utilities/converters/convert-px2rem';
15
+ @forward 'modules/utilities/converters/convert-rem2px';
16
+ @forward 'modules/utilities/converters/convert-snake2kebab';
17
+
18
+ // Getters
19
+ @forward 'modules/utilities/getters/color/get-color-brightness';
20
+ @forward 'modules/utilities/getters/color/get-color-darkest';
21
+ @forward 'modules/utilities/getters/list/get-list-item';
22
+ @forward 'modules/utilities/getters/list/get-list-item-end';
23
+ @forward 'modules/utilities/getters/list/get-list-item-start';
24
+ @forward 'modules/utilities/getters/number/get-number-from-percent';
25
+ @forward 'modules/utilities/getters/number/get-number-height-by-ratio';
26
+ @forward 'modules/utilities/getters/number/get-number-max';
27
+ @forward 'modules/utilities/getters/number/get-number-min';
28
+ @forward 'modules/utilities/getters/number/get-number-percentage-of';
29
+ @forward 'modules/utilities/getters/number/get-number-unit';
30
+ @forward 'modules/utilities/getters/number/get-number-width-by-ratio';
31
+
32
+ // Helpers
33
+ @forward 'modules/utilities/helpers/color/color-blend';
34
+ @forward 'modules/utilities/helpers/color/color-blend-steps';
35
+ @forward 'modules/utilities/helpers/color/color-hue-shift';
36
+ @forward 'modules/utilities/helpers/color/color-scale';
37
+ @forward 'modules/utilities/helpers/color/color-shade';
38
+ @forward 'modules/utilities/helpers/color/color-tint';
39
+ @forward 'modules/utilities/helpers/color/color-triad';
40
+ @forward 'modules/utilities/helpers/list/list-dedupe';
41
+ @forward 'modules/utilities/helpers/list/list-insert-at';
42
+ @forward 'modules/utilities/helpers/list/list-merge';
43
+ @forward 'modules/utilities/helpers/list/list-remove-at';
44
+ @forward 'modules/utilities/helpers/list/list-sum-numbers';
45
+ @forward 'modules/utilities/helpers/list/list-sum-numbers-safe';
46
+ @forward 'modules/utilities/helpers/misc/url-encode';
47
+ @forward 'modules/utilities/helpers/number/number-ceil-to';
48
+ @forward 'modules/utilities/helpers/number/number-clamp';
49
+ @forward 'modules/utilities/helpers/number/number-clamp-max';
50
+ @forward 'modules/utilities/helpers/number/number-clamp-min';
51
+ @forward 'modules/utilities/helpers/number/number-denormalize';
52
+ @forward 'modules/utilities/helpers/number/number-fibonacci';
53
+ @forward 'modules/utilities/helpers/number/number-floor-to';
54
+ @forward 'modules/utilities/helpers/number/number-format-with-separator';
55
+ @forward 'modules/utilities/helpers/number/number-normalize';
56
+ @forward 'modules/utilities/helpers/number/number-random-between';
57
+ @forward 'modules/utilities/helpers/number/number-random-between-int';
58
+ @forward 'modules/utilities/helpers/number/number-range';
59
+ @forward 'modules/utilities/helpers/number/number-round-to';
60
+ @forward 'modules/utilities/helpers/number/number-round-to-nearest';
61
+ @forward 'modules/utilities/helpers/number/number-strip-unit';
62
+ @forward 'modules/utilities/helpers/string/string-capitalize';
63
+ @forward 'modules/utilities/helpers/string/string-replace';
64
+ @forward 'modules/utilities/helpers/string/string-trim';
65
+ @forward 'modules/utilities/helpers/string/string-trim-end';
66
+ @forward 'modules/utilities/helpers/string/string-trim-start';
67
+
68
+ // Loggers
69
+ @forward 'modules/utilities/loggers/log-invalid-type';
70
+ @forward 'modules/utilities/loggers/log-invalid-value';
71
+
72
+ // Validators
73
+ @forward 'modules/utilities/validators/color/is-color-light';
74
+ @forward 'modules/utilities/validators/color/is-color-list';
75
+ @forward 'modules/utilities/validators/list/is-list-contained';
76
+ @forward 'modules/utilities/validators/misc/is-time';
77
+ @forward 'modules/utilities/validators/number/is-int';
78
+ @forward 'modules/utilities/validators/number/is-int-even';
79
+ @forward 'modules/utilities/validators/number/is-int-odd';
80
+ @forward 'modules/utilities/validators/number/is-number-has-unit';
81
+ @forward 'modules/utilities/validators/number/is-number-negative';
82
+ @forward 'modules/utilities/validators/number/is-number-positive';
83
+ @forward 'modules/utilities/validators/number/is-number-unitless';
84
+ @forward 'modules/utilities/validators/number/is-number-zero';
85
+ @forward 'modules/utilities/validators/string/is-string-contained';
86
+ @forward 'modules/utilities/validators/string/is-string-empty';
87
+ @forward 'modules/utilities/validators/string/is-string-ending-with';
88
+ @forward 'modules/utilities/validators/string/is-string-starting-with';
89
+ @forward 'modules/utilities/validators/type-of/is-boolean';
90
+ @forward 'modules/utilities/validators/type-of/is-color';
91
+ @forward 'modules/utilities/validators/type-of/is-list';
92
+ @forward 'modules/utilities/validators/type-of/is-map';
93
+ @forward 'modules/utilities/validators/type-of/is-number';
94
+ @forward 'modules/utilities/validators/type-of/is-string';
95
+ @forward 'modules/utilities/validators/type-of/is-type';
@@ -0,0 +1,186 @@
1
+ @use 'sass:string';
2
+ @use '../loggers/log-invalid-type' as *;
3
+ @use '../validators/type-of/is-string' as *;
4
+
5
+ /// Конвертирует строку из `camelCase` (верблюжья нотация) в
6
+ /// `kebab-case` (кебаб-нотация или дефисная нотация).
7
+ ///
8
+ /// Функция проходит по каждому символу входной строки и
9
+ /// преобразует заглавные буквы в строчные с добавлением дефиса
10
+ /// перед ними (кроме первого символа). Это позволяет
11
+ /// преобразовывать имена переменных JavaScript/TypeScript или
12
+ /// названия классов в формате, совместимом с CSS-нотацией.
13
+ ///
14
+ /// Важные особенности функции:
15
+ /// - Сохраняет регистр исходных символов (преобразует к нижнему)
16
+ /// - Добавляет дефис перед заглавными буквами (кроме первой)
17
+ /// - Итеративно обрабатывает каждый символ строки
18
+ /// - Возвращает строку в нижнем регистре с дефисами
19
+ /// - Полезно для генерации CSS-классов из JS-объектов
20
+ /// - Используется для консистентного именования стилей
21
+ /// - Обрабатывает строки любой длины
22
+ /// - Не изменяет цифры и специальные символы в строке
23
+ /// - Учитывает граничные случаи (пустая строка, одиночный символ)
24
+ /// - Обеспечивает двустороннюю совместимость naming convention
25
+ /// ---
26
+ /// @name convert-camel2kebab
27
+ /// @group utilities-converters
28
+ /// @since 2026.01.13
29
+ /// @access public
30
+ /// @author Murad Rustamov (therteenten)
31
+ /// @link https://sourcecraft.dev/users/therteenten/overview SourceCraft - therteenten
32
+ /// @link https://sourcecraft.dev/omnisass/library SourceCraft - OmniSass
33
+ /// @link https://sass-lang.com/documentation/modules/string См. также: Официальная документация Sass - Модуль String
34
+ /// @link https://sass-lang.com/documentation/values/strings См. также: Официальная документация Sass - Тип данных "Строки"
35
+ /// @link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Object_initializer См. также: MDN Web Docs - Object initializer
36
+ /// @link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Grammar_and_types#variable_names См. также: MDN Web Docs - Имена переменных в JavaScript
37
+ /// @link https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_nesting/Using_CSS_nesting См. также: MDN Web Docs - Использование CSS Nesting
38
+ /// @link https://developer.mozilla.org/en-US/docs/Learn/Getting_started_with_the_web/JavaScript_basics См. также: MDN Web Docs - Основы JavaScript
39
+ /// @link https://css-tricks.com/snippets/sass/string-case-conversion-functions/ См. также: CSS-Tricks - Функции преобразования регистра строк в Sass
40
+ /// @link https://css-tricks.com/sass-techniques-from-the-trenches/ См. также: CSS-Tricks - Sass техники из практики
41
+ /// @link https://sass-guidelin.es/ru/#section-42 См. также: Sass Guidelines - Раздел про строки
42
+ /// @link https://www.w3schools.com/js/js_conventions.asp См. также: W3Schools - Соглашения по коду JavaScript
43
+ /// @example scss - Базовые преобразования
44
+ /// @debug convert-camel2kebab('camelCase'); // 'camel-case'
45
+ /// @debug convert-camel2kebab('backgroundColor'); // 'background-color'
46
+ /// @debug convert-camel2kebab('fontSize'); // 'font-size'
47
+ /// @debug convert-camel2kebab('borderRadius'); // 'border-radius'
48
+ /// @debug convert-camel2kebab('paddingLeft'); // 'padding-left'
49
+ /// @debug convert-camel2kebab('marginBottom'); // 'margin-bottom'
50
+ /// @example scss - Граничные случаи
51
+ /// @debug convert-camel2kebab('single'); // 'single'
52
+ /// @debug convert-camel2kebab(''); // '' (пустая строка)
53
+ /// @debug convert-camel2kebab('A'); // 'a'
54
+ /// @debug convert-camel2kebab('AB'); // 'a-b'
55
+ /// @debug convert-camel2kebab('AlreadyKebab'); // 'already-kebab'
56
+ /// @debug convert-camel2kebab('lowercase'); // 'lowercase'
57
+ /// @example scss - Компоненты и классы
58
+ /// @debug convert-camel2kebab('ButtonPrimary'); // 'button-primary'
59
+ /// @debug convert-camel2kebab('ModalHeader'); // 'modal-header'
60
+ /// @debug convert-camel2kebab('CardContent'); // 'card-content'
61
+ /// @debug convert-camel2kebab('InputGroup'); // 'input-group'
62
+ /// @debug convert-camel2kebab('NavBar'); // 'nav-bar'
63
+ /// @debug convert-camel2kebab('SideMenu'); // 'side-menu'
64
+ /// @example scss - Интеграция с JavaScript объектами
65
+ /// // Преобразование ключей объекта JS в CSS-классы
66
+ /// $js-config: (
67
+ /// primaryColor: 'blue',
68
+ /// secondaryColor: 'gray',
69
+ /// fontSizeSmall: 12px,
70
+ /// borderRadiusLarge: 8px
71
+ /// );
72
+ ///
73
+ /// @each $key, $value in $js-config {
74
+ /// .#{convert-camel2kebab($key)} {
75
+ /// content: $value;
76
+ /// }
77
+ /// }
78
+ /// @example css - Результат
79
+ /// .primary-color {
80
+ /// content: "blue";
81
+ /// }
82
+ ///
83
+ /// .secondary-color {
84
+ /// content: "gray";
85
+ /// }
86
+ ///
87
+ /// .font-size-small {
88
+ /// content: 12px;
89
+ /// }
90
+ ///
91
+ /// .border-radius-large {
92
+ /// content: 8px;
93
+ /// }
94
+ /// @param {String} $value - Строка в `camelCase` нотации для
95
+ /// конвертации. Может содержать буквы (верхний и нижний
96
+ /// регистр), цифры и специальные символы. Функция
97
+ /// преобразует заглавные буквы в строчные и добавляет
98
+ /// дефисы перед ними.
99
+ /// @return {String} - Строка в kebab-case нотации, где все
100
+ /// символы преобразованы к нижнему регистру, а перед
101
+ /// заглавными буквами (кроме первой) добавлены дефисы.
102
+ /// Результат готов к использованию как CSS-класс или
103
+ /// часть селектора.
104
+ /// @throws {Error} - Может выбросить ошибку при передаче
105
+ /// нестроковых значений. Аргумент должен быть строкой
106
+ /// для корректной работы строковых функций Sass.
107
+ @function convert-camel2kebab($value) {
108
+
109
+ // Переменная для накопления результата преобразования.
110
+ // Инициализируется пустой строкой.
111
+ $-result: '';
112
+
113
+ // Проверка типа входного параметра: ожидается строковое значение.
114
+ // Функция is-string() проверяет, является ли $value строкой
115
+ // (тип данных string).
116
+ @if not is-string($value) {
117
+
118
+ // Если $value не является строкой, возвращаем ошибку через
119
+ // стандартную функцию логирования. Это предотвращает
120
+ // выполнение операции преобразования с некорректными данными.
121
+ @return log-invalid-type(
122
+ 'convert-camel2kebab',
123
+ $value,
124
+ '$value',
125
+ 'string'
126
+ );
127
+
128
+ }
129
+
130
+ // Основная логика выполняется только если $value является
131
+ // корректной строкой.
132
+ @else {
133
+
134
+ // Определение длины входной строки для организации цикла.
135
+ // Функция string.length() возвращает количество символов
136
+ // в строке.
137
+ $-length: string.length($value);
138
+
139
+ // Цикл по всем символам строки от первого до последнего.
140
+ // Индекс $i последовательно принимает значения от 1 до $-length.
141
+ @for $i from 1 through $-length {
142
+
143
+ // Извлечение текущего символа строки по индексу $i.
144
+ // Функция string.slice() возвращает подстроку,
145
+ // в данном случае - один символ.
146
+ $-char: string.slice($value, $i, $i);
147
+
148
+ // Проверка: является ли текущий символ заглавной буквой
149
+ // и не является ли он первым символом в строке.
150
+ // Условие $-char == string.to-upper-case($-char) проверяет,
151
+ // что символ в верхнем регистре (сравнивая его с его же
152
+ // версией в верхнем регистре).
153
+ // Условие $i > 1 гарантирует, что мы не добавляем дефис
154
+ // перед первым символом (даже если он заглавный).
155
+ @if $-char == string.to-upper-case($-char) and $i > 1 {
156
+
157
+ // Если символ - заглавная буква и не первый в строке:
158
+ // 1. Добавляем дефис "-" к результату
159
+ // 2. Добавляем символ, преобразованный в нижний регистр
160
+ //
161
+ // Это преобразует camelCase в kebab-case:
162
+ // Пример: "camelCase" → "camel-case"
163
+ // "C" (на позиции 6) → "-c"
164
+ $-result: $-result + '-' + string.to-lower-case($-char);
165
+
166
+ } @else {
167
+
168
+ // Если символ не является заглавной буквой ИЛИ
169
+ // это первый символ в строке:
170
+ // Добавляем символ, преобразованный в нижний регистр.
171
+ //
172
+ // Это гарантирует, что вся строка будет в нижнем регистре
173
+ // и первый символ никогда не получит дефис перед собой.
174
+ $-result: $-result + string.to-lower-case($-char);
175
+
176
+ }
177
+
178
+ }
179
+
180
+ // Возвращаем итоговую строку после преобразования
181
+ // всех символов.
182
+ @return $-result;
183
+
184
+ }
185
+
186
+ }
@@ -0,0 +1,239 @@
1
+ @use '../helpers/number/number-strip-unit' as *;
2
+ @use '../loggers/log-invalid-type' as *;
3
+ @use '../validators/type-of/is-number' as *;
4
+
5
+ /// Конвертирует значения из относительных единиц (`em`) в
6
+ /// пиксели (`px`).
7
+ ///
8
+ /// Функция выполняет преобразование значений в единицах `em`
9
+ /// в пиксели относительно заданного базового размера. Это
10
+ /// особенно полезно для обратных расчетов, когда необходимо
11
+ /// получить точное пиксельное значение из относительного,
12
+ /// учитывая контекст родительского элемента.
13
+ ///
14
+ /// Важные особенности функции:
15
+ /// - Преобразует `em` в `px` с указанием единиц `px`
16
+ /// - Поддерживает кастомный базовый размер (по умолчанию 16px)
17
+ /// - Удаляет единицы измерения для корректного математического
18
+ /// расчета
19
+ /// - Возвращает результат с единицами `px` для семантической
20
+ /// ясности
21
+ /// - Обрабатывает целые и дробные значения
22
+ /// - Полезен для расчета точных размеров из относительных
23
+ /// величин
24
+ /// - Обеспечивает обратное преобразование к `convert-px2em`
25
+ /// - Учитывает относительную природу `em` единиц
26
+ /// ---
27
+ /// @name convert-em2px
28
+ /// @group utilities-converters
29
+ /// @since 2025.12.27
30
+ /// @access public
31
+ /// @author Murad Rustamov (therteenten)
32
+ /// @link https://sourcecraft.dev/users/therteenten/overview SourceCraft - therteenten
33
+ /// @link https://sourcecraft.dev/omnisass/library SourceCraft - OmniSass
34
+ /// @link https://sass-lang.com/documentation/values/numbers См. также: Официальная документация Sass - Тип данных "Числа"
35
+ /// @link https://sass-lang.com/documentation/values/numbers#units См. также: Официальная документация Sass - Единицы измерения в числах
36
+ /// @link https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/Values_and_units См. также: MDN Web Docs - Значения и единицы измерения CSS
37
+ /// @link https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/Sizing_items_in_CSS См. также: MDN Web Docs - Размеры элементов в CSS
38
+ /// @link https://developer.mozilla.org/en-US/docs/Web/CSS/length См. также: MDN Web Docs - CSS-тип <length>
39
+ /// @link https://css-tricks.com/snippets/sass/ См. также: CSS-Tricks - Коллекция сниппетов Sass
40
+ /// @link https://css-tricks.com/snippets/css/guide-to-em-and-rem-units-in-css/ См. также: CSS-Tricks - Руководство по em и rem единицам в CSS
41
+ /// @link https://sass-guidelin.es/ru/#section-41 См. также: Sass Guidelines - Раздел про математические операции
42
+ /// @link https://www.w3schools.com/css/css_units.asp См. также: W3Schools - CSS единицы измерения
43
+ /// @example scss - Стандартное преобразование (базовый размер 16px)
44
+ /// @debug convert-em2px(1em); // 16px
45
+ /// @debug convert-em2px(0.5em); // 8px
46
+ /// @debug convert-em2px(1.5em); // 24px
47
+ /// @debug convert-em2px(2em); // 32px
48
+ /// @debug convert-em2px(3em); // 48px
49
+ /// @debug convert-em2px(0.25em); // 4px
50
+ /// @debug convert-em2px(0.0625em); // 1px
51
+ /// @example scss - Дробные значения em
52
+ /// @debug convert-em2px(0.78125em); // 12.5px
53
+ /// @debug convert-em2px(1.171875em); // 18.75px
54
+ /// @debug convert-em2px(0.03125em); // 0.5px
55
+ /// @debug convert-em2px(0.9em); // 14.4px
56
+ /// @debug convert-em2px(1.125em); // 18px
57
+ /// @debug convert-em2px(1.333em); // 21.328px
58
+ /// @example scss - Кастомный базовый размер
59
+ /// @debug convert-em2px(1em, 10px); // 10px (база 10px)
60
+ /// @debug convert-em2px(2em, 10px); // 20px (база 10px)
61
+ /// @debug convert-em2px(0.8em, 10px); // 8px (база 10px)
62
+ /// @debug convert-em2px(0.8em, 20px); // 16px (база 20px)
63
+ /// @debug convert-em2px(1.2em, 20px); // 24px (база 20px)
64
+ /// @debug convert-em2px(0.5em, 20px); // 10px (база 20px)
65
+ /// @example scss - Граничные случаи
66
+ /// @debug convert-em2px(0em); // 0px
67
+ /// @debug convert-em2px(0em, 16px); // 0px
68
+ /// @debug convert-em2px(10em); // 160px
69
+ /// @debug convert-em2px(62.5em); // 1000px
70
+ /// @debug convert-em2px(0.01em, 100px); // 1px
71
+ /// @debug convert-em2px(100em); // 1600px
72
+ /// @example scss - Отрицательные значения
73
+ /// @debug convert-em2px(-1em); // -16px
74
+ /// @debug convert-em2px(-0.5em); // -8px
75
+ /// @debug convert-em2px(-1.5em); // -24px
76
+ /// @debug convert-em2px(-2em, 8px); // -16px
77
+ /// @example scss - Безразмерные числа как аргументы
78
+ /// @debug convert-em2px(1, 16); // 16px (без единиц, но работает)
79
+ /// @debug convert-em2px(0.5, 16); // 8px
80
+ /// @debug convert-em2px(1.5, 16); // 24px
81
+ /// @example scss - Обратное преобразование (round-trip)
82
+ /// // Прямое и обратное преобразование должно давать исходное значение
83
+ /// $original-px: 24px;
84
+ /// $converted-em: math.div($original-px, 16px); // 1.5em
85
+ /// $restored-px: convert-em2px($converted-em); // 24px
86
+ /// @debug $original-px == $restored-px; // true
87
+ ///
88
+ /// // С кастомной базой
89
+ /// $base: 20px;
90
+ /// $original-px: 30px;
91
+ /// $converted-em: math.div($original-px, $base); // 1.5em
92
+ /// $restored-px: convert-em2px($converted-em, $base); // 30px
93
+ /// @example scss - Контекст вложенности em
94
+ /// // em зависят от контекста родительского элемента
95
+ /// .parent { font-size: 20px; }
96
+ /// .child {
97
+ /// // 1em внутри .parent равно 20px
98
+ /// $px-value: convert-em2px(1em, 20px); // 20px
99
+ /// // 0.5em внутри .parent равно 10px
100
+ /// $px-value: convert-em2px(0.5em, 20px); // 10px
101
+ /// }
102
+ ///
103
+ /// // Вложенные em множатся
104
+ /// .grandparent { font-size: 16px; }
105
+ /// .parent { font-size: 1.5em; } // 24px
106
+ /// .child {
107
+ /// // 1em внутри .parent равно 24px, а не 16px!
108
+ /// $px-value: convert-em2px(1em, 24px); // 24px
109
+ /// }
110
+ /// @example css - Результат
111
+ /// .parent {
112
+ /// font-size: 20px;
113
+ /// }
114
+ ///
115
+ /// .grandparent {
116
+ /// font-size: 16px;
117
+ /// }
118
+ ///
119
+ /// .parent {
120
+ /// font-size: 1.5em;
121
+ /// }
122
+ /// @example scss - Использование в реальных сценариях
123
+ /// // Расчет точных размеров для фиксированных элементов
124
+ /// $spacing-small: convert-em2px(0.5em); // 8px
125
+ /// $spacing-medium: convert-em2px(1em); // 16px
126
+ /// $spacing-large: convert-em2px(1.5em); // 24px
127
+ ///
128
+ /// // Для обеспечения обратной совместимости
129
+ /// .legacy-element {
130
+ /// // Старый код использует px, новый использует em
131
+ /// padding: convert-em2px(1em); // 16px для обратной совместимости
132
+ /// font-size: convert-em2px(1.125em); // 18px
133
+ /// }
134
+ ///
135
+ /// // Для сложных вложенных структур
136
+ /// .container {
137
+ /// font-size: 18px;
138
+ ///
139
+ /// .nested-element {
140
+ /// // Все em внутри относятся к font-size: 18px контейнера
141
+ /// padding: convert-em2px(0.5em, 18px); // 9px
142
+ /// margin: convert-em2px(1em, 18px); // 18px
143
+ /// border-width: convert-em2px(0.111em, 18px); // 2px
144
+ /// }
145
+ /// }
146
+ ///
147
+ /// // Для медиа-запросов с учетом контекста
148
+ /// $parent-font-size: 14px;
149
+ /// @media (min-width: 768px) {
150
+ /// .responsive-element {
151
+ /// // Em рассчитываются относительно текущего контекста
152
+ /// font-size: convert-em2px(1.2em, $parent-font-size); // 16.8px
153
+ /// }
154
+ /// }
155
+ /// @example css - Результат
156
+ /// .legacy-element {
157
+ /// padding: 16px;
158
+ /// font-size: 18px;
159
+ /// }
160
+ ///
161
+ /// .container {
162
+ /// font-size: 18px;
163
+ /// }
164
+ /// .container .nested-element {
165
+ /// padding: 9px;
166
+ /// margin: 18px;
167
+ /// border-width: 1.998px;
168
+ /// }
169
+ ///
170
+ /// @media (min-width: 768px) {
171
+ /// .responsive-element {
172
+ /// font-size: 16.8px;
173
+ /// }
174
+ /// }
175
+ /// @param {Number} $em - Значение в единицах `em` для
176
+ /// конвертации. Может быть целым или дробным числом,
177
+ /// положительным или отрицательным. Единицы измерения (`em`)
178
+ /// удаляются для расчета, но ожидается, что значение
179
+ /// изначально выражено в `em`.
180
+ /// @param {Number} $base [16px] - Базовый размер в пикселях
181
+ /// для расчета. По умолчанию используется `16px`, что
182
+ /// соответствует стандартному размеру шрифта в большинстве
183
+ /// браузеров. Может быть любым положительным числом (обычно
184
+ /// в пикселях). Важно, что параметр представляет размер
185
+ /// шрифта родительского элемента, относительно которого
186
+ /// рассчитываются `em`.
187
+ /// @return {Number} - Значение в единицах `px`, рассчитанное
188
+ /// по формуле: `($em * $base) * 1px`. Возвращает дробное
189
+ /// или целое число с единицами измерения `px`.
190
+ /// @throws {Error} - Может выбросить ошибку при передаче
191
+ /// нечисловых значений. Для корректной работы оба
192
+ /// аргумента должны быть числами.
193
+ @function convert-em2px($em, $base: 16px) {
194
+
195
+ // Проверка типа первого параметра: ожидается числовое
196
+ // значение в единицах em. Единица em является относительной
197
+ // и рассчитывается относительно размера шрифта родительского
198
+ // элемента.
199
+ @if not is-number($em) {
200
+
201
+ // Если $em не является числом, логируем ошибку через
202
+ // отладочное сообщение.
203
+ @return log-invalid-type(
204
+ 'convert-em2px',
205
+ $em,
206
+ '$em',
207
+ 'number'
208
+ );
209
+
210
+ }
211
+
212
+ // Основная логика выполняется только если $value является
213
+ // корректной строкой.
214
+ @else {
215
+
216
+ // Формула конвертации: px = em × базовый_размер_шрифта.
217
+ //
218
+ // Алгоритм вычислений:
219
+ // 1. number-strip-unit($em) - удаляем единицу измерения
220
+ // 'em' из первого значения
221
+ // Пример: 1.5em → 1.5 (число без единиц)
222
+ // 2. number-strip-unit($base) - удаляем единицу измерения
223
+ // из базового размера
224
+ // Пример: 16px → 16 (число без единиц)
225
+ // 3. Умножаем безразмерные числа: (число em) × (базовый размер)
226
+ // Пример: 1.5 × 16 = 24
227
+ // 4. Умножаем результат на 1px для добавления единицы
228
+ // измерения пикселей
229
+ // Пример: 24 × 1px = 24px
230
+ //
231
+ // Ключевая особенность: результат в пикселях зависит от
232
+ // базового размера шрифта. В отличие от rem, который зависит
233
+ // от корневого элемента, em зависит от размера шрифта
234
+ // непосредственного родителя.
235
+ @return number-strip-unit($em) * number-strip-unit($base) * 1px;
236
+
237
+ }
238
+
239
+ }