@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.
- package/CHANGELOG.md +5 -0
- package/LICENSE +21 -0
- package/README.md +2 -0
- package/_configs.scss +68 -0
- package/index.scss +95 -0
- package/modules/utilities/converters/_convert-camel2kebab.scss +186 -0
- package/modules/utilities/converters/_convert-em2px.scss +239 -0
- package/modules/utilities/converters/_convert-hex2rgb.scss +97 -0
- package/modules/utilities/converters/_convert-hex2rgba.scss +124 -0
- package/modules/utilities/converters/_convert-kebab2camel.scss +232 -0
- package/modules/utilities/converters/_convert-kebab2snake.scss +118 -0
- package/modules/utilities/converters/_convert-px2em.scss +236 -0
- package/modules/utilities/converters/_convert-px2rem.scss +180 -0
- package/modules/utilities/converters/_convert-rem2px.scss +207 -0
- package/modules/utilities/converters/_convert-snake2kebab.scss +173 -0
- package/modules/utilities/getters/color/_get-color-brightness.scss +138 -0
- package/modules/utilities/getters/color/_get-color-darkest.scss +178 -0
- package/modules/utilities/getters/list/_get-list-item-end.scss +114 -0
- package/modules/utilities/getters/list/_get-list-item-start.scss +109 -0
- package/modules/utilities/getters/list/_get-list-item.scss +179 -0
- package/modules/utilities/getters/number/_get-number-from-percent.scss +139 -0
- package/modules/utilities/getters/number/_get-number-height-by-ratio.scss +199 -0
- package/modules/utilities/getters/number/_get-number-max.scss +168 -0
- package/modules/utilities/getters/number/_get-number-min.scss +162 -0
- package/modules/utilities/getters/number/_get-number-percentage-of.scss +149 -0
- package/modules/utilities/getters/number/_get-number-unit.scss +111 -0
- package/modules/utilities/getters/number/_get-number-width-by-ratio.scss +223 -0
- package/modules/utilities/helpers/color/_color-blend-steps.scss +210 -0
- package/modules/utilities/helpers/color/_color-blend.scss +183 -0
- package/modules/utilities/helpers/color/_color-hue-shift.scss +148 -0
- package/modules/utilities/helpers/color/_color-scale.scss +208 -0
- package/modules/utilities/helpers/color/_color-shade.scss +113 -0
- package/modules/utilities/helpers/color/_color-tint.scss +118 -0
- package/modules/utilities/helpers/color/_color-triad.scss +141 -0
- package/modules/utilities/helpers/list/_list-dedupe.scss +146 -0
- package/modules/utilities/helpers/list/_list-insert-at.scss +166 -0
- package/modules/utilities/helpers/list/_list-merge.scss +86 -0
- package/modules/utilities/helpers/list/_list-remove-at.scss +160 -0
- package/modules/utilities/helpers/list/_list-sum-numbers-safe.scss +175 -0
- package/modules/utilities/helpers/list/_list-sum-numbers.scss +128 -0
- package/modules/utilities/helpers/misc/_url-encode.configs.scss +64 -0
- package/modules/utilities/helpers/misc/_url-encode.scss +148 -0
- package/modules/utilities/helpers/number/_number-ceil-to.scss +111 -0
- package/modules/utilities/helpers/number/_number-clamp-max.scss +92 -0
- package/modules/utilities/helpers/number/_number-clamp-min.scss +100 -0
- package/modules/utilities/helpers/number/_number-clamp.scss +109 -0
- package/modules/utilities/helpers/number/_number-denormalize.scss +172 -0
- package/modules/utilities/helpers/number/_number-fibonacci.scss +235 -0
- package/modules/utilities/helpers/number/_number-floor-to.scss +114 -0
- package/modules/utilities/helpers/number/_number-format-with-separator.scss +122 -0
- package/modules/utilities/helpers/number/_number-normalize.scss +160 -0
- package/modules/utilities/helpers/number/_number-random-between-int.scss +84 -0
- package/modules/utilities/helpers/number/_number-random-between.scss +120 -0
- package/modules/utilities/helpers/number/_number-range.scss +268 -0
- package/modules/utilities/helpers/number/_number-round-to-nearest.scss +131 -0
- package/modules/utilities/helpers/number/_number-round-to.scss +118 -0
- package/modules/utilities/helpers/number/_number-strip-unit.scss +97 -0
- package/modules/utilities/helpers/string/_string-capitalize.scss +84 -0
- package/modules/utilities/helpers/string/_string-replace.scss +69 -0
- package/modules/utilities/helpers/string/_string-trim-end.scss +62 -0
- package/modules/utilities/helpers/string/_string-trim-start.scss +62 -0
- package/modules/utilities/helpers/string/_string-trim.scss +69 -0
- package/modules/utilities/loggers/_log-invalid-type.scss +151 -0
- package/modules/utilities/loggers/_log-invalid-value.scss +151 -0
- package/modules/utilities/setters/_index.scss +3 -0
- package/modules/utilities/validators/color/_is-color-light.scss +132 -0
- package/modules/utilities/validators/color/_is-color-list.scss +124 -0
- package/modules/utilities/validators/list/_is-list-contained.scss +65 -0
- package/modules/utilities/validators/misc/_is-time.scss +115 -0
- package/modules/utilities/validators/number/_is-int-even.scss +69 -0
- package/modules/utilities/validators/number/_is-int-odd.scss +70 -0
- package/modules/utilities/validators/number/_is-int.scss +124 -0
- package/modules/utilities/validators/number/_is-number-has-unit.scss +85 -0
- package/modules/utilities/validators/number/_is-number-negative.scss +76 -0
- package/modules/utilities/validators/number/_is-number-positive.scss +74 -0
- package/modules/utilities/validators/number/_is-number-unitless.scss +88 -0
- package/modules/utilities/validators/number/_is-number-zero.scss +75 -0
- package/modules/utilities/validators/string/_is-string-contained.scss +108 -0
- package/modules/utilities/validators/string/_is-string-empty.scss +56 -0
- package/modules/utilities/validators/string/_is-string-ending-with.scss +66 -0
- package/modules/utilities/validators/string/_is-string-starting-with.scss +66 -0
- package/modules/utilities/validators/type-of/_is-boolean.scss +92 -0
- package/modules/utilities/validators/type-of/_is-color.scss +96 -0
- package/modules/utilities/validators/type-of/_is-list.scss +105 -0
- package/modules/utilities/validators/type-of/_is-map.scss +105 -0
- package/modules/utilities/validators/type-of/_is-number.scss +103 -0
- package/modules/utilities/validators/type-of/_is-string.scss +110 -0
- package/modules/utilities/validators/type-of/_is-type.scss +77 -0
- package/package.json +54 -0
- package/package.scss +156 -0
- package/test.md +168 -0
- package/test.scss +405 -0
- 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
|
+
}
|