@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
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
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
|
+
}
|