@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,97 @@
1
+ @use 'sass:color';
2
+ @use '../validators/type-of/is-color' as *;
3
+ @use '../loggers/log-invalid-type' as *;
4
+
5
+ /// Преобразует цвет из HEX формата в строку формата RGB.
6
+ ///
7
+ /// Функция `convert-hex2rgb()` принимает цвет и возвращает его
8
+ /// представление в виде строки RGB. Использует современные
9
+ /// функции модуля `color` для точного извлечения каналов.
10
+ ///
11
+ /// Полезно для CSS-переменных, создания динамических стилей.
12
+ /// ---
13
+ /// @name convert-hex2rgb
14
+ /// @group utilities-converters
15
+ /// @since 2025.12.27
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://sass-lang.com/documentation/values/colors#rgb-functions См. также: Sass - Цвета и RGB функции
22
+ /// @link https://developer.mozilla.org/en-US/docs/Web/CSS/color_value/rgb См. также: MDN - Функция rgb()
23
+ /// @link https://www.w3schools.com/css/css_colors_rgb.asp См. также: W3Schools - CSS RGB цвета
24
+ /// @link https://css-tricks.com/creating-color-themes-with-custom-properties-and-convert-hex2rgb/ См. также: CSS-Tricks - Темы с CSS-переменными и HEX-to-RGB
25
+ /// @example scss - Пример использования
26
+ /// $brand-blue: #3498db;
27
+ ///
28
+ /// :root {
29
+ /// --color-primary: #{$brand-blue};
30
+ /// --color-primary-rgb: #{convert-hex2rgb($brand-blue)}; // "rgb(52, 152, 219)"
31
+ /// }
32
+ ///
33
+ /// .element {
34
+ /// color: #{convert-hex2rgb(#ff0000)};
35
+ /// }
36
+ /// @example css - Результат
37
+ /// :root {
38
+ /// --color-primary: #3498db;
39
+ /// --color-primary-rgb: rgb(52, 152, 219);
40
+ /// }
41
+ ///
42
+ /// .element {
43
+ /// color: rgb(255, 0, 0);
44
+ /// }
45
+ /// @see convert-hex2rgba
46
+ /// @param {Color} $color - Цвет для преобразования. Функция
47
+ /// ожидает цвет в HEX формате, но может корректно
48
+ /// обработать и другие форматы (rgb, hsl, имена цветов).
49
+ /// Для прозрачных цветов (с альфа-каналом) возвращаемый
50
+ /// RGB не будет содержать информации о прозрачности.
51
+ /// @return {String} - Строка в формате `"rgb(r, g, b)"`,
52
+ /// где `r`, `g`, `b` - числовые значения от 0 до 255.
53
+ /// Если передан некорректный цвет, может вызвать ошибку
54
+ /// Sass.
55
+ @function convert-hex2rgb($color) {
56
+
57
+ // Проверка типа входного параметра: ожидается
58
+ // цветовое значение.
59
+ // Функция is-color() проверяет, является ли $color
60
+ // валидным цветом CSS.
61
+ @if not is-color($color) {
62
+
63
+ // Если $color не является цветом, возвращаем ошибку через
64
+ // стандартную функцию логирования. Это предотвращает
65
+ // выполнение операции конвертации с некорректными данными.
66
+ @return log-invalid-type(
67
+ 'convert-hex2rgb',
68
+ $color,
69
+ '$color',
70
+ 'color'
71
+ );
72
+
73
+ }
74
+
75
+ // Основная логика выполняется только если $value является
76
+ // корректной строкой.
77
+ @else {
78
+
79
+ // Формула преобразования: создаем строку формата rgb()
80
+ // из компонентов цвета.
81
+ //
82
+ // Алгоритм преобразования:
83
+ // 1. Извлекаем красный канал: color.channel($color, "red", $space: rgb)
84
+ // Возвращает числовое значение от 0 до 255
85
+ // 2. Извлекаем зеленый канал: color.channel($color, "green", $space: rgb)
86
+ // 3. Извлекаем синий канал: color.channel($color, "blue", $space: rgb)
87
+ // 4. Формируем строку: rgb(красный, зеленый, синий)
88
+ //
89
+ // Ключевая особенность: функция возвращает строку, а не цветовой тип,
90
+ // из-за интерполяции #{} внутри строки.
91
+ // Это может быть полезно для генерации CSS переменных или
92
+ // вставки значений в CSS-функции.
93
+ @return 'rgb(#{color.channel($color, "red", $space: rgb)}, #{color.channel($color, "green", $space: rgb)}, #{color.channel($color, "blue", $space: rgb)})';
94
+
95
+ }
96
+
97
+ }
@@ -0,0 +1,124 @@
1
+ @use 'sass:color';
2
+ @use '../validators/type-of/is-color' as *;
3
+ @use '../validators/type-of/is-number' as *;
4
+ @use '../loggers/log-invalid-type' as *;
5
+
6
+ /// Преобразует цвет в строку формата RGBA с поддержкой
7
+ /// прозрачности.
8
+ ///
9
+ /// Функция `convert-hex2rgba()` принимает цвет и значение
10
+ /// прозрачности (альфа-канал), возвращая строковое
11
+ /// представление в формате RGBA. Используется для создания
12
+ /// полупрозрачных версий цветов, например, для overlay,
13
+ /// теней или градиентов. Работает с любыми цветовыми
14
+ /// форматами, поддерживаемыми Sass.
15
+ /// ---
16
+ /// @name convert-hex2rgba
17
+ /// @group utilities-converters
18
+ /// @since 2025.12.27
19
+ /// @access public
20
+ /// @author Murad Rustamov (therteenten)
21
+ /// @link https://sourcecraft.dev/users/therteenten/overview SourceCraft - therteenten
22
+ /// @link https://sourcecraft.dev/omnisass/library SourceCraft - OmniSass
23
+ /// @link https://sass-lang.com/documentation/modules/color#channel См. также: Sass - Документация функции color.channel()
24
+ /// @link https://developer.mozilla.org/en-US/docs/Web/CSS/color_value/rgba См. также: MDN - Функция rgba()
25
+ /// @link https://css-tricks.com/the-power-of-rgba/ См. также: CSS-Tricks - Возможности RGBA
26
+ /// @link https://www.w3.org/TR/css-color-4/#rgba-functions См. также: W3C - Спецификация RGBA функций
27
+ /// @link https://webaim.org/resources/contrastchecker/ См. также: WebAIM - Проверка контрастности цветов
28
+ /// @example scss - Пример использования
29
+ /// $primary-color: #3498db;
30
+ ///
31
+ /// .overlay {
32
+ /// // Полупрозрачный overlay основного цвета
33
+ /// background-color: #{convert-hex2rgba($primary-color, 0.3)};
34
+ /// }
35
+ ///
36
+ /// .card {
37
+ /// // Тень с использованием RGBA для плавного эффекта
38
+ /// box-shadow: 0 4px 12px #{convert-hex2rgba(#000000, 0.08)};
39
+ /// }
40
+ ///
41
+ /// // Использование значения по умолчанию (альфа = 1)
42
+ /// .solid-background {
43
+ /// background-color: #{convert-hex2rgba($primary-color)}; // rgba(52, 152, 219, 1)
44
+ /// }
45
+ /// @example css - Результат
46
+ /// .overlay {
47
+ /// background-color: rgba(52, 152, 219, 0.3);
48
+ /// }
49
+ ///
50
+ /// .card {
51
+ /// box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);
52
+ /// }
53
+ ///
54
+ /// .solid-background {
55
+ /// background-color: rgba(52, 152, 219, 1);
56
+ /// }
57
+ /// @see convert-hex2rgb
58
+ /// @param {Color} $color - Исходный цвет для преобразования.
59
+ /// Может быть в HEX, RGB, HSL, HSLA формате или
60
+ /// именованный цвет. Альфа-канал исходного цвета
61
+ /// игнорируется, используется значение параметра `$alpha`.
62
+ /// @param {Number} $alpha [1] - Значение прозрачности от 0.0
63
+ /// до 1.0. 0.0 - полностью прозрачный, 1.0 - полностью
64
+ /// непрозрачный. Может быть дробным числом (например, 0.5
65
+ /// для 50% прозрачности). Параметр имеет значение по
66
+ /// умолчанию 1 (непрозрачный цвет).
67
+ /// @return {String} - Строка в формате `"rgba(r, g, b, a)"`,
68
+ /// где `r`, `g`, `b` - числовые значения от 0 до 255,
69
+ /// `a` - значение прозрачности.
70
+ @function convert-hex2rgba($color, $alpha: 1) {
71
+
72
+ // Проверка типа первого параметра: ожидается
73
+ // цветовое значение.
74
+ // Функция is-color() проверяет, является ли $color
75
+ // валидным цветом CSS.
76
+ @if not is-color($color) {
77
+
78
+ // Если $color не является цветом, логируем ошибку через
79
+ // отладочное сообщение.
80
+ @return log-invalid-type(
81
+ 'convert-hex2rgba',
82
+ $color,
83
+ '$color',
84
+ 'color'
85
+ );
86
+
87
+ }
88
+
89
+ // Проверка типа второго параметра: ожидается числовое значение
90
+ // для альфа-канала (прозрачности).
91
+ @else if not is-number($alpha) {
92
+
93
+ // Если $alpha не является числом, логируем ошибку через
94
+ // отладочное сообщение.
95
+ @return log-invalid-type(
96
+ 'convert-hex2rgba',
97
+ $alpha,
98
+ '$alpha',
99
+ 'number'
100
+ );
101
+
102
+ }
103
+
104
+ // Оба параметра прошли валидацию - выполняем конвертацию.
105
+ @else {
106
+
107
+ // Формула преобразования: создаем строку формата rgba()
108
+ // из компонентов цвета и значения альфа-канала.
109
+ //
110
+ // Алгоритм преобразования:
111
+ // 1. Извлекаем красный канал: color.channel($color, "red", $space: rgb)
112
+ // Возвращает числовое значение от 0 до 255
113
+ // 2. Извлекаем зеленый канал: color.channel($color, "green", $space: rgb)
114
+ // 3. Извлекаем синий канал: color.channel($color, "blue", $space: rgb)
115
+ // 4. Используем переданное значение альфа-канала: $alpha
116
+ // 5. Формируем строку: rgba(красный, зеленый, синий, альфа)
117
+ //
118
+ // Ключевая особенность: функция возвращает строку, а не
119
+ // цветовой тип, из-за интерполяции #{} внутри строки.
120
+ @return 'rgba(#{color.channel($color, "red", $space: rgb)}, #{color.channel($color, "green", $space: rgb)}, #{color.channel($color, "blue", $space: rgb)}, #{$alpha})';
121
+
122
+ }
123
+
124
+ }
@@ -0,0 +1,232 @@
1
+ @use 'sass:string';
2
+ @use '../loggers/log-invalid-type' as *;
3
+ @use '../validators/type-of/is-string' as *;
4
+
5
+ /// Конвертирует строку из `kebab-case` (кебаб-нотация) в
6
+ /// `camelCase` (верблюжья нотация).
7
+ ///
8
+ /// Функция проходит по каждому символу входной строки,
9
+ /// игнорируя дефисы и преобразуя символы, следующие за
10
+ /// дефисами, в верхний регистр. Это позволяет преобразовывать
11
+ /// CSS-классы и HTML-атрибуты в формате kebab-case в имена
12
+ /// переменных JavaScript/TypeScript в camelCase.
13
+ ///
14
+ /// Важные особенности функции:
15
+ /// - Сохраняет исходный регистр символов (кроме следующих за
16
+ /// дефисами)
17
+ /// - Игнорирует дефисы в исходной строке
18
+ /// - Преобразует символы после дефисов в верхний регистр
19
+ /// - Итеративно обрабатывает каждый символ строки
20
+ /// - Возвращает строку в camelCase нотации
21
+ /// - Полезно для преобразования CSS-селекторов в JS-свойства
22
+ /// - Используется для консистентного именования в коде
23
+ /// - Обрабатывает строки любой длины
24
+ /// - Не изменяет цифры и специальные символы (кроме дефисов)
25
+ /// - Учитывает граничные случаи (пустая строка, несколько
26
+ /// дефисов подряд)
27
+ /// - Обеспечивает обратное преобразование к `convert-camel2kebab`
28
+ /// ---
29
+ /// @name convert-kebab2camel
30
+ /// @group utilities-converters
31
+ /// @since 2026.01.13
32
+ /// @access public
33
+ /// @author Murad Rustamov (therteenten)
34
+ /// @link https://sourcecraft.dev/users/therteenten/overview SourceCraft - therteenten
35
+ /// @link https://sourcecraft.dev/omnisass/library SourceCraft - OmniSass
36
+ /// @link https://sass-lang.com/documentation/modules/string См. также: Официальная документация Sass - Модуль String
37
+ /// @link https://sass-lang.com/documentation/values/strings См. также: Официальная документация Sass - Тип данных "Строки"
38
+ /// @link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Object_initializer См. также: MDN Web Docs - Object initializer
39
+ /// @link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Grammar_and_types#variable_names См. также: MDN Web Docs - Имена переменных в JavaScript
40
+ /// @link https://developer.mozilla.org/en-US/docs/Learn/HTML/Howto/Use_data_attributes См. также: MDN Web Docs - Использование data-атрибутов
41
+ /// @link https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_selectors См. также: MDN Web Docs - CSS селекторы
42
+ /// @link https://css-tricks.com/snippets/sass/string-case-conversion-functions/ См. также: CSS-Tricks - Функции преобразования регистра строк в Sass
43
+ /// @link https://css-tricks.com/whats-the-difference-between-kebab-case-camel-case-and-snake-case/ См. также: CSS-Tricks - Разница между kebab-case, camelCase и snake_case
44
+ /// @link https://sass-guidelin.es/ru/#section-42 См. также: Sass Guidelines - Раздел про строки
45
+ /// @link https://www.w3schools.com/js/js_conventions.asp См. также: W3Schools - Соглашения по коду JavaScript
46
+ /// @example scss - Базовые преобразования
47
+ /// @debug convert-kebab2camel('camel-case'); // 'camelCase'
48
+ /// @debug convert-kebab2camel('background-color'); // 'backgroundColor'
49
+ /// @debug convert-kebab2camel('font-size'); // 'fontSize'
50
+ /// @debug convert-kebab2camel('border-radius'); // 'borderRadius'
51
+ /// @debug convert-kebab2camel('padding-left'); // 'paddingLeft'
52
+ /// @debug convert-kebab2camel('margin-bottom'); // 'marginBottom'
53
+ /// @example scss - Множественные дефисы
54
+ /// @debug convert-kebab2camel('border-top-left-radius'); // 'borderTopLeftRadius'
55
+ /// @debug convert-kebab2camel('font-weight-bold'); // 'fontWeightBold'
56
+ /// @debug convert-kebab2camel('text-decoration-line'); // 'textDecorationLine'
57
+ /// @debug convert-kebab2camel('background-image-url'); // 'backgroundImageUrl'
58
+ /// @debug convert-kebab2camel('grid-template-columns'); // 'gridTemplateColumns'
59
+ /// @debug convert-kebab2camel('transition-property-all'); // 'transitionPropertyAll'
60
+ /// @example scss - Преобразование CSS-классов в JS-свойства
61
+ /// // Конвертация CSS-классов для использования в JavaScript
62
+ /// $css-classes: 'modal-header', 'btn-primary', 'input-disabled';
63
+ ///
64
+ /// @each $class in $css-classes {
65
+ /// $js-property: convert-kebab2camel($class);
66
+ /// @debug $js-property;
67
+ /// // modal-header → modalHeader
68
+ /// // btn-primary → btnPrimary
69
+ /// // input-disabled → inputDisabled
70
+ /// }
71
+ /// @example scss - Интеграция с конфигурационными объектами
72
+ /// // Конвертация CSS-свойств в имена JS-переменных
73
+ /// $css-properties: (
74
+ /// 'primary-color': #3498db,
75
+ /// 'secondary-color': #2ecc71,
76
+ /// 'font-size-base': 16px,
77
+ /// 'border-radius-sm': 4px
78
+ /// );
79
+ ///
80
+ /// // Создание JS-объекта конфигурации
81
+ /// $js-config: ();
82
+ ///
83
+ /// @each $key, $value in $css-properties {
84
+ /// $js-key: convert-kebab2camel($key);
85
+ /// $js-config: map.merge($js-config, ($js-key: $value));
86
+ /// }
87
+ ///
88
+ /// @debug $js-config;
89
+ /// // (primaryColor: #3498db, secondaryColor: #2ecc71,
90
+ /// // fontSizeBase: 16px, borderRadiusSm: 4px)
91
+ /// @example css - Практическое применение в Sass/SCSS
92
+ /// // Использование функции для генерации CSS-переменных
93
+ /// $theme-colors: (
94
+ /// primary-color: #3498db,
95
+ /// secondary-color: #2ecc71,
96
+ /// accent-color: #e74c3c
97
+ /// );
98
+ ///
99
+ /// :root {
100
+ /// @each $name, $color in $theme-colors {
101
+ /// --#{convert-kebab2camel($name)}: #{$color};
102
+ /// }
103
+ /// }
104
+ /// @example css - Результат
105
+ /// :root {
106
+ /// --primaryColor: #3498db;
107
+ /// --secondaryColor: #2ecc71;
108
+ /// --accentColor: #e74c3c;
109
+ /// }
110
+ /// @example scss - Обратное преобразование данных из CSS
111
+ /// // Получение данных из data-атрибутов и преобразование в camelCase
112
+ /// $data-attributes: (
113
+ /// 'data-user-id': '12345',
114
+ /// 'data-is-active': 'true',
115
+ /// 'data-role-name': 'admin'
116
+ /// );
117
+ ///
118
+ /// @each $attr, $value in $data-attributes {
119
+ /// // Убираем префикс 'data-' и преобразуем в camelCase
120
+ /// $attr-name: string.slice($attr, 6); // 'user-id', 'is-active', 'role-name'
121
+ /// $js-property: convert-kebab2camel($attr-name);
122
+ /// @debug $js-property + ': ' + $value;
123
+ /// // userId: 12345
124
+ /// // isActive: true
125
+ /// // roleName: admin
126
+ /// }
127
+ /// @example css - Применение для data-атрибутов
128
+ /// // Генерация CSS для элементов с data-атрибутами
129
+ /// .user-profile[data-user-id="12345"] {
130
+ /// color: blue;
131
+ /// }
132
+ ///
133
+ /// .button[data-is-active="true"] {
134
+ /// background-color: green;
135
+ /// }
136
+ ///
137
+ /// .admin-panel[data-role-name="admin"] {
138
+ /// border: 2px solid red;
139
+ /// }
140
+ /// @param {String} $value - Строка в kebab-case нотации для
141
+ /// конвертации. Может содержать буквы, цифры, дефисы и
142
+ /// другие символы. Функция игнорирует дефисы и
143
+ /// преобразует символы, следующие за дефисами, в верхний
144
+ /// регистр.
145
+ /// @return {String} - Строка в camelCase нотации, где все
146
+ /// дефисы удалены, а символы, которые следовали за
147
+ /// дефисами, преобразованы в верхний регистр. Первый
148
+ /// символ остается в исходном регистре.
149
+ /// @throws {Error} - Может выбросить ошибку при передаче
150
+ /// нестроковых значений. Аргумент должен быть строкой
151
+ /// для корректной работы строковых функций Sass.
152
+ @function convert-kebab2camel($value) {
153
+
154
+ // Переменная для накопления результата преобразования.
155
+ $-result: "";
156
+
157
+ // Проверка типа входного параметра: ожидается строковое значение.
158
+ // Функция is-string() проверяет, является ли $value строкой
159
+ // (тип данных string).
160
+ @if not is-string($value) {
161
+
162
+ // Если $value не является строкой, возвращаем ошибку через
163
+ // стандартную функцию логирования. Это предотвращает
164
+ // выполнение операции замены с некорректными данными.
165
+ @return log-invalid-type(
166
+ 'convert-kebab2camel',
167
+ $value,
168
+ '$value',
169
+ 'string'
170
+ );
171
+
172
+ }
173
+
174
+ // Основная логика выполняется только если $value является
175
+ // корректной строкой.
176
+ @else {
177
+
178
+ // Флаг, указывающий, что следующий символ должен быть
179
+ // преобразован в верхний регистр. Устанавливается в true,
180
+ // когда встречается дефис "-" в исходной строке.
181
+ $-capitalize-next: false;
182
+
183
+ // Определение длины входной строки для организации цикла.
184
+ // Функция string.length() возвращает количество символов
185
+ // в строке.
186
+ $-length: string.length($value);
187
+
188
+ // Цикл по всем символам строки от первого до последнего.
189
+ // Индекс $i последовательно принимает значения от 1 до $-length.
190
+ @for $i from 1 through $-length {
191
+
192
+ // Извлечение текущего символа строки по индексу $i.
193
+ // Функция string.slice() возвращает подстроку,
194
+ // в данном случае - один символ.
195
+ $-char: string.slice($value, $i, $i);
196
+
197
+ // Проверка: является ли текущий символ дефисом "-".
198
+ @if $-char == "-" {
199
+
200
+ // Если символ - дефис, устанавливаем флаг, что
201
+ // следующий символ должен быть заглавным.
202
+ // Сам дефис не добавляется к результату.
203
+ $-capitalize-next: true;
204
+
205
+ }
206
+
207
+ // Проверка: установлен ли флаг заглавного регистра
208
+ // для текущего символа.
209
+ @else if $-capitalize-next {
210
+
211
+ // Если флаг установлен, добавляем символ в верхнем
212
+ // регистре к результату и сбрасываем флаг.
213
+ $-result: $-result + string.to-upper-case($-char);
214
+ $-capitalize-next: false;
215
+
216
+ } @else {
217
+
218
+ // Если символ не дефис и флаг не установлен,
219
+ // добавляем символ как есть (в исходном регистре).
220
+ $-result: $-result + $-char;
221
+
222
+ }
223
+
224
+ }
225
+
226
+ // Возвращаем итоговую строку после преобразования всех
227
+ // символов.
228
+ @return $-result;
229
+
230
+ }
231
+
232
+ }
@@ -0,0 +1,118 @@
1
+ @use '../helpers/string/string-replace' as *;
2
+ @use '../loggers/log-invalid-type' as *;
3
+ @use '../validators/type-of/is-string' as *;
4
+
5
+ /// Преобразует строку из `kebab-case` (кебаб-нотация) в
6
+ /// `snake_case` (змеиная нотация).
7
+ ///
8
+ /// Функция заменяет все дефисы (`-`) на символы нижнего
9
+ /// подчеркивания (`_`) в переданной строке. Это преобразование
10
+ /// позволяет конвертировать CSS-классы и имена переменных из
11
+ /// frontend-разработки в формат, используемый в backend-языках
12
+ /// программирования, таких как Python, Ruby и PHP.
13
+ ///
14
+ /// Важные особенности функции:
15
+ /// - Заменяет все вхождения дефисов на нижние подчеркивания
16
+ /// - Сохраняет все остальные символы без изменений
17
+ /// - Не изменяет регистр символов
18
+ /// - Работает с любыми строками, содержащими дефисы
19
+ /// - Простая и эффективная реализация через замену символов
20
+ /// - Полезно для конвертации имен из frontend в backend
21
+ /// - Используется для унификации именования в full-stack проектах
22
+ /// - Поддерживает строки любой длины и сложности
23
+ /// - Обрабатывает множественные дефисы подряд
24
+ /// - Учитывает граничные случаи (пустая строка, отсутствие
25
+ /// дефисов)
26
+ /// ---
27
+ /// @name convert-kebab2snake
28
+ /// @group utilities-converters
29
+ /// @since 2026.01.13
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/modules/string См. также: Официальная документация Sass - Модуль String
35
+ /// @link https://sass-lang.com/documentation/values/strings См. также: Официальная документация Sass - Тип данных "Строки"
36
+ /// @link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace См. также: MDN Web Docs - Метод String.replace()
37
+ /// @link https://developer.mozilla.org/en-US/docs/Glossary/Snake_case См. также: MDN Web Docs - Глоссарий: Snake_case
38
+ /// @link https://developer.mozilla.org/en-US/docs/Glossary/Kebab-case См. также: MDN Web Docs - Глоссарий: Kebab-case
39
+ /// @link https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_selectors См. также: MDN Web Docs - CSS селекторы
40
+ /// @link https://css-tricks.com/snippets/sass/string-replace-function/ См. также: CSS-Tricks - Функция замены строк в Sass
41
+ /// @link https://css-tricks.com/whats-the-difference-between-kebab-case-camel-case-and-snake-case/ См. также: CSS-Tricks - Разница между kebab-case, camelCase и snake_case
42
+ /// @link https://sass-guidelin.es/ru/#section-42 См. также: Sass Guidelines - Раздел про строки
43
+ /// @link https://www.python.org/dev/peps/pep-0008/ См. также: PEP 8 - Style Guide for Python Code
44
+ /// @link https://rubystyle.guide/#naming См. также: Ruby Style Guide - Именование
45
+ /// @example scss - Базовые преобразования
46
+ /// @debug convert-kebab2snake('kebab-case'); // 'kebab_case'
47
+ /// @debug convert-kebab2snake('background-color'); // 'background_color'
48
+ /// @debug convert-kebab2snake('font-size'); // 'font_size'
49
+ /// @debug convert-kebab2snake('border-radius'); // 'border_radius'
50
+ /// @debug convert-kebab2snake('padding-left'); // 'padding_left'
51
+ /// @debug convert-kebab2snake('margin-bottom'); // 'margin_bottom'
52
+ /// @example scss - Множественные дефисы
53
+ /// @debug convert-kebab2snake('border-top-left-radius'); // 'border_top_left_radius'
54
+ /// @debug convert-kebab2snake('font-weight-bold'); // 'font_weight_bold'
55
+ /// @debug convert-kebab2snake('text-decoration-line'); // 'text_decoration_line'
56
+ /// @debug convert-kebab2snake('background-image-url'); // 'background_image_url'
57
+ /// @debug convert-kebab2snake('grid-template-columns'); // 'grid_template_columns'
58
+ /// @debug convert-kebab2snake('transition-property-all'); // 'transition_property_all'
59
+ /// @example scss - Сложные случаи с цифрами и аббревиатурами
60
+ /// @debug convert-kebab2snake('xml-http-request'); // 'xml_http_request'
61
+ /// @debug convert-kebab2snake('css-animation'); // 'css_animation'
62
+ /// @debug convert-kebab2snake('html5-canvas'); // 'html5_canvas'
63
+ /// @debug convert-kebab2snake('ui-component'); // 'ui_component'
64
+ /// @debug convert-kebab2snake('api-endpoint'); // 'api_endpoint'
65
+ /// @debug convert-kebab2snake('user-id'); // 'user_id'
66
+ /// @example scss - Граничные случаи
67
+ /// @debug convert-kebab2snake('single'); // 'single'
68
+ /// @debug convert-kebab2snake(''); // '' (пустая строка)
69
+ /// @debug convert-kebab2snake('already_snake'); // 'already_snake' (без изменений)
70
+ /// @debug convert-kebab2snake('multiple---hyphens'); // 'multiple___hyphens'
71
+ /// @debug convert-kebab2snake('-leading-hyphen'); // '_leading_hyphen'
72
+ /// @debug convert-kebab2snake('trailing-hyphen-'); // 'trailing_hyphen_'
73
+ /// @param {String} $value - Строка в kebab-case нотации для
74
+ /// конвертации. Может содержать буквы, цифры, дефисы и
75
+ /// другие символы. Функция заменяет все вхождения `-` на
76
+ /// `_`, сохраняя остальные символы без изменений.
77
+ /// @return {String} - Строка в snake_case нотации, где все
78
+ /// дефисы заменены на символы нижнего подчеркивания.
79
+ /// Результат подходит для использования в backend-языках
80
+ /// программирования, конфигурационных файлах и API-запросах.
81
+ /// @throws {Error} - Может выбросить ошибку при передаче
82
+ /// нестроковых значений или если функция `string-replace`
83
+ /// не определена. Требуется наличие функции `string-replace`
84
+ /// в модуле `helpers` для корректной работы.
85
+ /// @requires {function} string-replace - Вспомогательная
86
+ /// функция замены подстрок в строке.
87
+ /// Должна быть определена и доступна для корректной работы
88
+ /// данной функции.
89
+ @function convert-kebab2snake($value) {
90
+
91
+ // Проверка типа входного параметра: ожидается строковое значение.
92
+ // Функция is-string() проверяет, является ли $value строкой
93
+ // (тип данных string).
94
+ @if not is-string($value) {
95
+
96
+ // Если $value не является строкой, возвращаем ошибку через
97
+ // стандартную функцию логирования. Это предотвращает
98
+ // выполнение операции замены с некорректными данными.
99
+ @return log-invalid-type(
100
+ 'convert-kebab2snake',
101
+ $value,
102
+ '$value',
103
+ 'string'
104
+ );
105
+
106
+ }
107
+
108
+ // Основная логика выполняется только если $value является
109
+ // корректной строкой.
110
+ @else {
111
+
112
+ // Формула преобразования: заменяем все дефисы "-" на
113
+ // нижние подчеркивания "_".
114
+ @return string-replace($value, "-", "_");
115
+
116
+ }
117
+
118
+ }