@omnisass/library 0.4.0 → 0.5.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/README.en.md +99 -0
- package/README.md +2 -0
- package/_configs.scss +1 -1
- package/index.scss +11 -5
- package/modules/utilities/getters/map/_get-map-item.scss +159 -0
- package/modules/utilities/helpers/list/_list-sum-numbers-safe.scss +4 -3
- package/modules/utilities/helpers/list/_list-sum-numbers.scss +4 -3
- package/modules/utilities/helpers/map/_map-remove-keys.scss +153 -0
- package/modules/utilities/helpers/misc/_url-encode.scss +5 -4
- package/modules/utilities/helpers/number/_number-ceil-to.scss +5 -3
- package/modules/utilities/helpers/number/_number-clamp-max.scss +5 -3
- package/modules/utilities/helpers/number/_number-clamp-min.scss +5 -3
- package/modules/utilities/helpers/number/_number-clamp.scss +6 -3
- package/modules/utilities/helpers/number/_number-denormalize.scss +6 -3
- package/modules/utilities/helpers/number/_number-fibonacci.scss +4 -3
- package/modules/utilities/helpers/number/_number-floor-to.scss +5 -3
- package/modules/utilities/helpers/number/_number-format-with-separator.scss +5 -4
- package/modules/utilities/helpers/number/_number-normalize.scss +6 -3
- package/modules/utilities/helpers/number/_number-random-between-int.scss +5 -3
- package/modules/utilities/helpers/number/_number-random-between.scss +5 -3
- package/modules/utilities/helpers/number/_number-range.scss +6 -3
- package/modules/utilities/helpers/number/_number-round-to-nearest.scss +5 -3
- package/modules/utilities/helpers/number/_number-round-to.scss +5 -3
- package/modules/utilities/helpers/number/_number-strip-unit.scss +4 -3
- package/modules/utilities/helpers/string/_string-capitalize.scss +4 -3
- package/modules/utilities/helpers/string/_string-lorips.config.scss +0 -2
- package/modules/utilities/helpers/string/_string-replace.scss +6 -3
- package/modules/utilities/helpers/string/_string-trim-end.scss +4 -3
- package/modules/utilities/helpers/string/_string-trim-start.scss +4 -3
- package/modules/utilities/helpers/string/_string-trim.scss +4 -3
- package/modules/utilities/loggers/_log.scss +219 -0
- package/modules/utilities/setters/map/_set-map-item.scss +243 -0
- package/modules/utilities/validators/color/_is-color-light.scss +5 -4
- package/modules/utilities/validators/color/_is-color-list.scss +4 -3
- package/modules/utilities/validators/list/_is-list-contained.scss +5 -4
- package/modules/utilities/validators/number/_is-int-even.scss +4 -3
- package/modules/utilities/validators/number/_is-int-odd.scss +4 -3
- package/modules/utilities/validators/number/_is-int.scss +5 -3
- package/modules/utilities/validators/number/_is-number-has-unit.scss +4 -3
- package/modules/utilities/validators/number/_is-number-negative.scss +4 -3
- package/modules/utilities/validators/number/_is-number-positive.scss +4 -3
- package/modules/utilities/validators/number/_is-number-unitless.scss +4 -3
- package/modules/utilities/validators/number/_is-number-zero.scss +4 -3
- package/modules/utilities/validators/string/_is-string-contained.scss +5 -3
- package/modules/utilities/validators/string/_is-string-empty.scss +4 -3
- package/modules/utilities/validators/string/_is-string-ending-with.scss +5 -3
- package/modules/utilities/validators/string/_is-string-starting-with.scss +5 -3
- package/modules/utilities/validators/type-of/_is-color.scss +0 -4
- package/package.json +25 -16
- package/package.scss +12 -2
- package/CHANGELOG.md +0 -122
- package/test2.sh +0 -158
package/README.en.md
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
[🇷🇺 Русский](./README.md )
|
|
2
|
+
|
|
3
|
+
<p align="left">
|
|
4
|
+
<img src="https://sourcecraft.dev/file?owner=omnisass&repo=library&rev=anvil&path=.omnisass%2Fimages%2Fomnisass_logo_rounded.png" width="150" height="150" alt="Project logo">
|
|
5
|
+
</p>
|
|
6
|
+
|
|
7
|
+
# OmniSass
|
|
8
|
+
> IMPORTANT: The library is currently undergoing testing. It is possible that API changes will be made or some functions will be removed before the final version 1.0.0. It is recommended to use it exclusively for informational purposes.
|
|
9
|
+
|
|
10
|
+
A library of functions and mixins written in the CSS preprocessor language Sass. It is designed to simplify, speed up and improve the process of creating styles for websites.
|
|
11
|
+
|
|
12
|
+
     
|
|
13
|
+
|
|
14
|
+
OmniSass is an extensive, standardized, and carefully documented package that includes solutions built over the years by the community.
|
|
15
|
+
|
|
16
|
+
Most of the features and mixins are the result of the work of many people who have been developing in the Sass language at various times. OmniSass Developer ([@therteenten](https://t.me/therteenten )) He focused on qualitative standardization, documentation, and the creation of a single tool based on disparate elements.
|
|
17
|
+
|
|
18
|
+
## Installing the library
|
|
19
|
+
1. For OmniSass to work, the [`sass`](https://www.npmjs.com/package/sass ) library must be installed:
|
|
20
|
+
|
|
21
|
+
```shell
|
|
22
|
+
npm install sass
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
2. After the installation is complete, you can add the library [`@omnisass/library`](https://www.npmjs.com/package/@omnisass/library ):
|
|
26
|
+
|
|
27
|
+
```shell
|
|
28
|
+
npm install @omnisass/library
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
3. It's done! OmniSass is ready to use.
|
|
32
|
+
|
|
33
|
+
## Usage
|
|
34
|
+
You can embed the module in your style file after installing the necessary libraries.:
|
|
35
|
+
|
|
36
|
+
```scss
|
|
37
|
+
@use '@omnisass/library' as omnisass;
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
1. We're messing up the `@omnisass/library` module
|
|
41
|
+
2. The entire "stuffing" of the module is available in the omnisass space
|
|
42
|
+
|
|
43
|
+
Then we apply one of the functions from the library. For example, `is-boolean`:
|
|
44
|
+
|
|
45
|
+
```scss
|
|
46
|
+
@debug omnisass.is-boolean(true);
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
In the console, we get:
|
|
50
|
+
|
|
51
|
+
```shell
|
|
52
|
+
src/styles/main.scss:3 Debug: true
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Done. We have successfully installed, imported, and used the library in the project.
|
|
56
|
+
|
|
57
|
+
> When compiling Sass without the `--load-path=node_modules` key, you must specify the full path to the library folder to import the module. In our case, if the styles.scss file is located in the ./src/styles/ directory, the following construction should be used: `@use'../../node_modules/@omnisass/library'as omnisass;`.
|
|
58
|
+
|
|
59
|
+
## Useful links
|
|
60
|
+
- [API Documentation (SassDoc)](https://omnisass.sourcecraft.site/sassdocs/)
|
|
61
|
+
- [Organization on SourceCraft](https://sourcecraft.dev/omnisass/overview )
|
|
62
|
+
- [Telegram Channel](https://t.me/omnisass )
|
|
63
|
+
- [List of changes](https://sourcecraft.dev/omnisass/library/browse/CHANGELOG.md?rev=develop )
|
|
64
|
+
|
|
65
|
+
## Thanks
|
|
66
|
+
- [github@takamoso](https://github.com/takamoso ) - for the functions `is-boolean`, `is-list`, etc.
|
|
67
|
+
- [github@KittyGiraudel](https://github.com/KittyGiraudel ) - for the functions `color-shade`, `color-tint`, etc.
|
|
68
|
+
- [github@sindresorhus](https://github.com/sindresorhus ) - for the functions `get-list-item-end`, `get-list-item-start`, etc.
|
|
69
|
+
- [github@selfishprimate](https://github.com/selfishprimate ) - for the [`is-time`] function(https://github.com/selfishprimate/gerillass/blob/master/scss/utilities/_is-time.scss ) and others.
|
|
70
|
+
- [github@pentzzsolt](https://github.com/pentzzsolt ) - for the `is-int` function, etc.
|
|
71
|
+
|
|
72
|
+
> If I forgot to mention you in this list, please write to me on [Telegram](https://t.me/therteenten ).
|
|
73
|
+
|
|
74
|
+
## License
|
|
75
|
+
This project is licensed under the MIT license - for details, see the [LICENSE](LICENSE) file.
|
|
76
|
+
|
|
77
|
+
```
|
|
78
|
+
MIT License
|
|
79
|
+
|
|
80
|
+
Copyright (c) 2025, Murad Rustamov (therteenten) <therteenten@ya.ru>
|
|
81
|
+
|
|
82
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
83
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
84
|
+
in the Software without restriction, including without limitation the rights
|
|
85
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
86
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
87
|
+
furnished to do so, subject to the following conditions:
|
|
88
|
+
|
|
89
|
+
The above copyright notice and this permission notice shall be included in all
|
|
90
|
+
copies or substantial portions of the Software.
|
|
91
|
+
|
|
92
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
93
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
94
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
95
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
96
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
97
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
98
|
+
SOFTWARE.
|
|
99
|
+
```
|
package/README.md
CHANGED
package/_configs.scss
CHANGED
package/index.scss
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
@forward 'configs';
|
|
4
4
|
@forward 'package';
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
// Utilities: Converters
|
|
7
7
|
@forward 'modules/utilities/converters/convert-camel2kebab';
|
|
8
8
|
@forward 'modules/utilities/converters/convert-em2px';
|
|
9
9
|
@forward 'modules/utilities/converters/convert-hex2rgb';
|
|
@@ -15,12 +15,13 @@
|
|
|
15
15
|
@forward 'modules/utilities/converters/convert-rem2px';
|
|
16
16
|
@forward 'modules/utilities/converters/convert-snake2kebab';
|
|
17
17
|
|
|
18
|
-
// Getters
|
|
18
|
+
// Utilities: Getters
|
|
19
19
|
@forward 'modules/utilities/getters/color/get-color-brightness';
|
|
20
20
|
@forward 'modules/utilities/getters/color/get-color-darkest';
|
|
21
21
|
@forward 'modules/utilities/getters/list/get-list-item';
|
|
22
22
|
@forward 'modules/utilities/getters/list/get-list-item-end';
|
|
23
23
|
@forward 'modules/utilities/getters/list/get-list-item-start';
|
|
24
|
+
@forward 'modules/utilities/getters/map/get-map-item';
|
|
24
25
|
@forward 'modules/utilities/getters/misc/get-uid';
|
|
25
26
|
@forward 'modules/utilities/getters/number/get-number-from-percent';
|
|
26
27
|
@forward 'modules/utilities/getters/number/get-number-height-by-ratio';
|
|
@@ -31,7 +32,7 @@
|
|
|
31
32
|
@forward 'modules/utilities/getters/number/get-number-width-by-ratio';
|
|
32
33
|
@forward 'modules/utilities/getters/string/get-string-hash';
|
|
33
34
|
|
|
34
|
-
// Helpers
|
|
35
|
+
// Utilities: Helpers
|
|
35
36
|
@forward 'modules/utilities/helpers/color/color-blend';
|
|
36
37
|
@forward 'modules/utilities/helpers/color/color-blend-steps';
|
|
37
38
|
@forward 'modules/utilities/helpers/color/color-hue-shift';
|
|
@@ -45,6 +46,7 @@
|
|
|
45
46
|
@forward 'modules/utilities/helpers/list/list-remove-at';
|
|
46
47
|
@forward 'modules/utilities/helpers/list/list-sum-numbers';
|
|
47
48
|
@forward 'modules/utilities/helpers/list/list-sum-numbers-safe';
|
|
49
|
+
@forward 'modules/utilities/helpers/map/map-remove-keys';
|
|
48
50
|
@forward 'modules/utilities/helpers/misc/url-encode';
|
|
49
51
|
@forward 'modules/utilities/helpers/number/number-ceil-to';
|
|
50
52
|
@forward 'modules/utilities/helpers/number/number-clamp';
|
|
@@ -71,11 +73,15 @@
|
|
|
71
73
|
@forward 'modules/utilities/helpers/string/string-trim-end';
|
|
72
74
|
@forward 'modules/utilities/helpers/string/string-trim-start';
|
|
73
75
|
|
|
74
|
-
// Loggers
|
|
76
|
+
// Utilities: Loggers
|
|
75
77
|
@forward 'modules/utilities/loggers/log-invalid-type';
|
|
76
78
|
@forward 'modules/utilities/loggers/log-invalid-value';
|
|
79
|
+
@forward 'modules/utilities/loggers/log';
|
|
77
80
|
|
|
78
|
-
//
|
|
81
|
+
// Utilities: Setters
|
|
82
|
+
@forward 'modules/utilities/setters/map/set-map-item';
|
|
83
|
+
|
|
84
|
+
// Utilities: Validators
|
|
79
85
|
@forward 'modules/utilities/validators/color/is-color-light';
|
|
80
86
|
@forward 'modules/utilities/validators/color/is-color-list';
|
|
81
87
|
@forward 'modules/utilities/validators/list/is-list-contained';
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
@use 'sass:map';
|
|
2
|
+
@use '../../loggers/log-invalid-type' as *;
|
|
3
|
+
@use '../../validators/type-of/is-map' as *;
|
|
4
|
+
|
|
5
|
+
/// Безопасно извлекает значение из карты по цепочке ключей.
|
|
6
|
+
///
|
|
7
|
+
/// Функция последовательно проходит по переданным ключам,
|
|
8
|
+
/// углубляясь во вложенные карты, и возвращает значение,
|
|
9
|
+
/// соответствующее последнему ключу. Если на любом уровне
|
|
10
|
+
/// ключ отсутствует, функция возвращает `null`. Это позволяет
|
|
11
|
+
/// избежать ошибок при работе со сложными структурами данных
|
|
12
|
+
/// и избавляет от необходимости писать громоздкие проверки.
|
|
13
|
+
///
|
|
14
|
+
/// Для проверки типа входного параметра используется служебная
|
|
15
|
+
/// функция `log-invalid-type`, которая при несоответствии типа
|
|
16
|
+
/// генерирует предупреждение (или ошибку) и возвращает `null`.
|
|
17
|
+
/// ---
|
|
18
|
+
/// @name get-map-item
|
|
19
|
+
/// @group utilities-getters
|
|
20
|
+
/// @since 2026.03.18
|
|
21
|
+
/// @access public
|
|
22
|
+
/// @author Murad Rustamov (therteenten)
|
|
23
|
+
/// @link https://sourcecraft.dev/users/therteenten/overview SourceCraft - therteenten
|
|
24
|
+
/// @link https://sourcecraft.dev/omnisass/library SourceCraft - OmniSass
|
|
25
|
+
/// @link https://sass-lang.com/documentation/values/maps См. также: Официальная документация Sass - Тип данных "Карты" (`maps`)
|
|
26
|
+
/// @link https://sass-lang.com/documentation/modules/map См. также: Официальная документация Sass - Модуль `sass:map`
|
|
27
|
+
/// @link https://sass-lang.com/documentation/modules/map#get См. также: Официальная документация Sass - Функция `map.get()`
|
|
28
|
+
/// @link https://sass-lang.com/documentation/modules/map#has-key См. также: Официальная документация Sass - Функция `map.has-key()`
|
|
29
|
+
/// @link https://sass-lang.com/documentation/at-rules/function См. также: Официальная документация Sass - Правило `@function`
|
|
30
|
+
/// @link https://sass-guidelin.es/ru/#maps См. также: Sass Guidelines (рус.) - Работа с картами
|
|
31
|
+
/// @link https://www.sitepoint.com/using-sass-maps/ См. также: SitePoint - Using Sass Maps
|
|
32
|
+
/// @link https://css-tricks.com/snippets/sass/deep-getset-maps/ См. также: CSS-Tricks - Deep Get/Set for Sass Maps
|
|
33
|
+
/// @link https://www.smashingmagazine.com/2015/07/real-work-sass-maps/ См. также: Smashing Magazine - Real Work with Sass Maps
|
|
34
|
+
/// @link https://dev.to/sarah_chima/working-with-sass-maps-5cm5 См. также: Dev.to - Working with Sass Maps
|
|
35
|
+
/// @link https://code.tutsplus.com/tutorials/an-introduction-to-sass-maps--cms-22138 См. также: Envato Tuts+ - An Introduction to Sass Maps
|
|
36
|
+
/// @link https://habr.com/ru/post/309656/ См. также: Habr - Карты данных (maps) в Sass
|
|
37
|
+
/// @link https://htmlacademy.ru/blog/boost/tools/sass-maps См. также: HTML Academy - Sass-карты: когда и как применять
|
|
38
|
+
/// @link https://ru.hexlet.io/courses/sass-basics/lessons/maps/theory_unit См. также: Hexlet - Карты (maps) в Sass
|
|
39
|
+
/// @link https://www.youtube.com/watch?v=6kUo6lBF0Cc См. также: YouTube - Уроки Sass #5: Карты данных (Maps)
|
|
40
|
+
/// @link https://www.youtube.com/watch?v=dN_rpAoy8I0 См. также: YouTube - Sass Maps Tutorial (LevelUp Tuts)
|
|
41
|
+
/// @link https://stackoverflow.com/questions/28548587/sass-check-if-key-exists-in-multi-level-map См. также: Stack Overflow - Проверка существования ключа во вложенной карте
|
|
42
|
+
/// @link https://stackoverflow.com/questions/37705095/sass-get-value-from-nested-map См. также: Stack Overflow - Получение значения из вложенной карты
|
|
43
|
+
/// @link https://www.npmjs.com/package/sass См. также: npm - Документация пакета Dart Sass
|
|
44
|
+
/// @link https://github.com/sass/sass/tree/main/spec См. также: GitHub - Спецификация языка Sass
|
|
45
|
+
/// @example scss - Извлечение значения из плоской карты
|
|
46
|
+
/// $breakpoints: (
|
|
47
|
+
/// mobile: 480px,
|
|
48
|
+
/// tablet: 768px,
|
|
49
|
+
/// desktop: 1024px
|
|
50
|
+
/// );
|
|
51
|
+
///
|
|
52
|
+
/// @debug get-map-item($breakpoints, desktop); // 1024px
|
|
53
|
+
///
|
|
54
|
+
/// @example scss - Доступ к вложенным данным конфигурации
|
|
55
|
+
/// $theme: (
|
|
56
|
+
/// colors: (
|
|
57
|
+
/// primary: #3498db,
|
|
58
|
+
/// secondary: #2ecc71
|
|
59
|
+
/// ),
|
|
60
|
+
/// fonts: (
|
|
61
|
+
/// base: 16px,
|
|
62
|
+
/// headings: (
|
|
63
|
+
/// h1: 2rem,
|
|
64
|
+
/// h2: 1.5rem
|
|
65
|
+
/// )
|
|
66
|
+
/// )
|
|
67
|
+
/// );
|
|
68
|
+
///
|
|
69
|
+
/// @debug get-map-item($theme, colors, primary); // #3498db
|
|
70
|
+
/// @debug get-map-item($theme, fonts, headings, h2); // 1.5rem
|
|
71
|
+
///
|
|
72
|
+
/// @example scss - Возврат `null` при отсутствии ключа
|
|
73
|
+
/// @debug get-map-item($theme, colors, accent); // null
|
|
74
|
+
/// @debug get-map-item($theme, missing, key); // null
|
|
75
|
+
///
|
|
76
|
+
/// @example scss - Использование с переменным числом ключей
|
|
77
|
+
/// $keys: ('fonts', 'headings', 'h1');
|
|
78
|
+
/// @debug get-map-item($theme, $keys...); // 2rem
|
|
79
|
+
///
|
|
80
|
+
/// @example scss - Применение для получения параметров темы
|
|
81
|
+
/// @mixin button($color-key) {
|
|
82
|
+
/// $bg: get-map-item($theme, colors, $color-key);
|
|
83
|
+
/// background: $bg;
|
|
84
|
+
/// }
|
|
85
|
+
///
|
|
86
|
+
/// .button-primary { @include button(primary); }
|
|
87
|
+
///
|
|
88
|
+
/// @example css - Результат выполнения
|
|
89
|
+
/// .button-primary {
|
|
90
|
+
/// background: #3498db;
|
|
91
|
+
/// }
|
|
92
|
+
/// @example scss - Защита от ошибок при отсутствии карты
|
|
93
|
+
/// $not-a-map: 'string';
|
|
94
|
+
/// @debug get-map-item($not-a-map, any); // вызывает log-invalid-type и возвращает null
|
|
95
|
+
///
|
|
96
|
+
/// @param {Map} $map - Карта, из которой извлекается значение.
|
|
97
|
+
/// Должна быть типа `map`. В случае передачи другого типа
|
|
98
|
+
/// вызывается `log-invalid-type` и возвращается его результат.
|
|
99
|
+
/// @param {String...} $keys - Один или несколько ключей,
|
|
100
|
+
/// образующих путь к искомому значению. Ключи могут быть
|
|
101
|
+
/// любого типа, поддерживаемого картами Sass (обычно строки).
|
|
102
|
+
/// @return {*} - Значение, находящееся по указанному пути,
|
|
103
|
+
/// или `null`, если хотя бы один из ключей отсутствует,
|
|
104
|
+
/// либо если входная карта имеет неверный тип.
|
|
105
|
+
/// @throws {Error} - Выбрасывает ошибку (или предупреждение)
|
|
106
|
+
/// через функцию `log-invalid-type`, если параметр `$map`
|
|
107
|
+
/// не является картой. Текст ошибки зависит от реализации
|
|
108
|
+
/// `log-invalid-type`, но в стандартном случае возвращается
|
|
109
|
+
/// `null`.
|
|
110
|
+
@function get-map-item($map, $keys...) {
|
|
111
|
+
|
|
112
|
+
// Проверяем, что первый аргумент действительно
|
|
113
|
+
// является картой.
|
|
114
|
+
@if not is-map($map) {
|
|
115
|
+
|
|
116
|
+
// Если это не так, вызываем функцию логирования ошибки
|
|
117
|
+
// и возвращаем её результат.
|
|
118
|
+
// Функция log-invalid-type должна обработать некорректный
|
|
119
|
+
// тип и вернуть null (или выбросить ошибку в зависимости
|
|
120
|
+
// от настроек).
|
|
121
|
+
@return log-invalid-type(
|
|
122
|
+
'get-map-item',
|
|
123
|
+
$map,
|
|
124
|
+
'$map',
|
|
125
|
+
'map'
|
|
126
|
+
);
|
|
127
|
+
|
|
128
|
+
} @else {
|
|
129
|
+
|
|
130
|
+
// Проходим по всем переданным ключам последовательно.
|
|
131
|
+
// На каждом шаге проверяем, существует ли текущий ключ
|
|
132
|
+
// в текущей карте.
|
|
133
|
+
@each $-key in $keys {
|
|
134
|
+
|
|
135
|
+
@if map.has-key($map, $-key) {
|
|
136
|
+
|
|
137
|
+
// Если ключ существует — переходим на уровень глубже,
|
|
138
|
+
// заменяя $map на полученное значение (которое может
|
|
139
|
+
// быть как картой, так и любым другим типом).
|
|
140
|
+
$map: map.get($map, $-key);
|
|
141
|
+
|
|
142
|
+
} @else {
|
|
143
|
+
|
|
144
|
+
// Если на любом уровне ключ не найден — прерываем
|
|
145
|
+
// выполнение и возвращаем null.
|
|
146
|
+
@return null;
|
|
147
|
+
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// После успешного прохождения всех ключей возвращаем
|
|
153
|
+
// итоговое значение. Оно может быть чем угодно: картой,
|
|
154
|
+
// строкой, числом, списком и т.д.
|
|
155
|
+
@return $map;
|
|
156
|
+
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
}
|
|
@@ -84,9 +84,10 @@
|
|
|
84
84
|
/// измерения первого найденного числа.
|
|
85
85
|
/// @throws {Warning} - Выводит предупреждение при обнаружении
|
|
86
86
|
/// чисел с несовместимыми единицами измерения.
|
|
87
|
-
/// @throws {Error} - Выбрасывает ошибку, если в
|
|
88
|
-
/// значение, не соответствующее
|
|
89
|
-
///
|
|
87
|
+
/// @throws {Error} - Выбрасывает ошибку, если в параметр передано
|
|
88
|
+
/// значение, не соответствующее необходимому типу:
|
|
89
|
+
///
|
|
90
|
+
/// - `$list` → `list`
|
|
90
91
|
@function list-sum-numbers-safe($list) {
|
|
91
92
|
|
|
92
93
|
// Проверка типа входного параметра: ожидается список или arglist.
|
|
@@ -66,9 +66,10 @@
|
|
|
66
66
|
/// @throws {Error} - Может выбросить ошибку при попытке
|
|
67
67
|
/// сложить числа с несовместимыми единицами измерения
|
|
68
68
|
/// (например, px + em).
|
|
69
|
-
/// @throws {Error} - Выбрасывает ошибку, если в
|
|
70
|
-
/// значение, не соответствующее
|
|
71
|
-
///
|
|
69
|
+
/// @throws {Error} - Выбрасывает ошибку, если в параметр передано
|
|
70
|
+
/// значение, не соответствующее необходимому типу:
|
|
71
|
+
///
|
|
72
|
+
/// - `$list` → `list`
|
|
72
73
|
@function list-sum-numbers($list) {
|
|
73
74
|
|
|
74
75
|
// Проверка типа входного параметра: ожидается список или arglist.
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
@use 'sass:map';
|
|
2
|
+
@use '../../loggers/log-invalid-type' as *;
|
|
3
|
+
@use '../../validators/type-of/is-map' as *;
|
|
4
|
+
|
|
5
|
+
/// Удаляет указанные ключи из карты.
|
|
6
|
+
///
|
|
7
|
+
/// Функция позволяет удалить один или несколько ключей
|
|
8
|
+
/// из карты за один вызов. В отличие от стандартной
|
|
9
|
+
/// функции `map.remove()`, которая принимает только один
|
|
10
|
+
/// ключ для удаления, эта функция принимает список ключей
|
|
11
|
+
/// и последовательно удаляет их все. Это значительно
|
|
12
|
+
/// упрощает код при необходимости удалить несколько
|
|
13
|
+
/// ключей из одной карты, избавляя от необходимости
|
|
14
|
+
/// писать цепочку вызовов `map.remove()`.
|
|
15
|
+
///
|
|
16
|
+
/// Функция работает путём итеративного обхода списка
|
|
17
|
+
/// удаляемых ключей и применения встроенной функции
|
|
18
|
+
/// `map.remove()` к каждому из них. Исходная карта
|
|
19
|
+
/// остаётся неизменной — функция возвращает новую карту,
|
|
20
|
+
/// из которой удалены указанные ключи. Если переданный
|
|
21
|
+
/// ключ отсутствует в карте, он просто игнорируется,
|
|
22
|
+
/// что делает функцию безопасной в использовании.
|
|
23
|
+
///
|
|
24
|
+
/// Важные особенности функции:
|
|
25
|
+
/// - Удаляет несколько ключей за один вызов
|
|
26
|
+
/// - Возвращает новую карту, не мутируя исходную
|
|
27
|
+
/// - Безопасно игнорирует отсутствующие ключи
|
|
28
|
+
/// - Поддерживает удаление любого количества ключей
|
|
29
|
+
/// - Интегрируется с системой валидации типов
|
|
30
|
+
/// - Позволяет создавать чистые конфигурации
|
|
31
|
+
/// - Упрощает фильтрацию данных
|
|
32
|
+
/// ---
|
|
33
|
+
/// @name map-remove-keys
|
|
34
|
+
/// @group utilities-helpers
|
|
35
|
+
/// @since 2026.03.28
|
|
36
|
+
/// @access public
|
|
37
|
+
/// @author Murad Rustamov (therteenten)
|
|
38
|
+
/// @link https://sourcecraft.dev/users/therteenten/overview SourceCraft - therteenten
|
|
39
|
+
/// @link https://sourcecraft.dev/omnisass/library SourceCraft - OmniSass
|
|
40
|
+
/// @link https://sass-lang.com/documentation/values/maps См. также: Официальная документация Sass - Тип данных "Карты" (`maps`)
|
|
41
|
+
/// @link https://sass-lang.com/documentation/modules/map См. также: Официальная документация Sass - Модуль `sass:map`
|
|
42
|
+
/// @link https://sass-lang.com/documentation/modules/map#remove См. также: Официальная документация Sass - Функция `map.remove()`
|
|
43
|
+
/// @link https://sass-lang.com/documentation/modules/map#merge См. также: Официальная документация Sass - Функция `map.merge()`
|
|
44
|
+
/// @link https://sass-lang.com/documentation/at-rules/function См. также: Официальная документация Sass - Правило `@function`
|
|
45
|
+
/// @link https://sass-guidelin.es/ru/#maps-1 См. также: Sass Guidelines - Работа с картами
|
|
46
|
+
/// @link https://css-tricks.com/snippets/sass/ См. также: CSS-Tricks - Коллекция сниппетов Sass
|
|
47
|
+
/// @link https://www.sitepoint.com/using-sass-maps/ См. также: SitePoint - Использование карт Sass
|
|
48
|
+
/// @link https://www.smashingmagazine.com/2015/07/real-work-sass-maps/ См. также: Smashing Magazine - Реальная работа с картами Sass
|
|
49
|
+
/// @link https://dev.to/sarah_chima/working-with-sass-maps-5cm5 См. также: Dev.to - Работа с картами Sass
|
|
50
|
+
/// @link https://code.tutsplus.com/tutorials/an-introduction-to-sass-maps--cms-22138 См. также: Envato Tuts+ - Введение в карты Sass
|
|
51
|
+
/// @link https://habr.com/ru/post/309656/ См. также: Habr - Карты данных (maps) в Sass
|
|
52
|
+
/// @link https://htmlacademy.ru/blog/boost/tools/sass-maps См. также: HTML Academy - Sass-карты: практическое руководство
|
|
53
|
+
/// @link https://ru.hexlet.io/courses/sass-basics/lessons/maps/theory_unit См. также: Hexlet - Карты в Sass
|
|
54
|
+
/// @link https://www.youtube.com/watch?v=6kUo6lBF0Cc См. также: YouTube - Уроки Sass #5: Карты данных (Maps)
|
|
55
|
+
/// @link https://stackoverflow.com/questions/42841580/remove-multiple-keys-from-sass-map См. также: Stack Overflow - Удаление нескольких ключей из карты Sass
|
|
56
|
+
/// @link https://stackoverflow.com/questions/36586774/sass-remove-map-value См. также: Stack Overflow - Удаление значения из карты Sass
|
|
57
|
+
/// @link https://github.com/sass/sass/tree/main/spec См. также: GitHub - Спецификация языка Sass
|
|
58
|
+
/// @link https://www.npmjs.com/package/sass См. также: npm - Документация пакета Dart Sass
|
|
59
|
+
/// @link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/delete См. также: MDN Web Docs - JavaScript метод Map.delete()
|
|
60
|
+
/// @link https://en.wikipedia.org/wiki/Associative_array См. также: Wikipedia - Ассоциативный массив
|
|
61
|
+
/// @link https://ru.wikipedia.org/wiki/Ассоциативный_массив См. также: Wikipedia - Ассоциативный массив (рус.)
|
|
62
|
+
/// @link https://www.php.net/manual/en/function.unset.php См. также: PHP Manual - Функция unset()
|
|
63
|
+
/// @example scss - Удаление одного ключа из карты
|
|
64
|
+
/// $config: (
|
|
65
|
+
/// debug: true,
|
|
66
|
+
/// theme: 'dark',
|
|
67
|
+
/// language: 'ru'
|
|
68
|
+
/// );
|
|
69
|
+
///
|
|
70
|
+
/// $clean-config: map-remove-keys($config, debug); // Результат: (theme: 'dark', language: 'ru')
|
|
71
|
+
///
|
|
72
|
+
/// @example scss - Безопасное удаление (игнорирование отсутствующих ключей)
|
|
73
|
+
/// $colors: (
|
|
74
|
+
/// primary: #3498db,
|
|
75
|
+
/// secondary: #2ecc71
|
|
76
|
+
/// );
|
|
77
|
+
///
|
|
78
|
+
/// // Ключ 'tertiary' отсутствует, но ошибки не будет
|
|
79
|
+
/// $filtered: map-remove-keys($colors, (secondary, tertiary)); // Результат: (primary: #3498db)
|
|
80
|
+
///
|
|
81
|
+
/// @example scss - Динамическое удаление на основе списка
|
|
82
|
+
/// $theme: (
|
|
83
|
+
/// colors: (
|
|
84
|
+
/// primary: #3498db,
|
|
85
|
+
/// secondary: #2ecc71
|
|
86
|
+
/// ),
|
|
87
|
+
/// spacing: (sm: 8px, md: 16px),
|
|
88
|
+
/// typography: (base: 16px, h1: 2rem)
|
|
89
|
+
/// );
|
|
90
|
+
///
|
|
91
|
+
/// $keys-to-remove: (spacing, typography);
|
|
92
|
+
/// $simplified-theme: map-remove-keys($theme, $keys-to-remove); // Результат: (colors: (primary: #3498db, secondary: #2ecc71))
|
|
93
|
+
///
|
|
94
|
+
/// @example scss - Использование в цикле для удаления из нескольких карт
|
|
95
|
+
/// @function prepare-for-output($data) {
|
|
96
|
+
/// $sensitive-keys: (password, token, credit_card);
|
|
97
|
+
/// @return map-remove-keys($data, $sensitive-keys);
|
|
98
|
+
/// }
|
|
99
|
+
///
|
|
100
|
+
/// $user-data: (
|
|
101
|
+
/// name: 'Alice',
|
|
102
|
+
/// email: 'alice@example.com',
|
|
103
|
+
/// password: 'secret123',
|
|
104
|
+
/// token: 'jwt_token_xyz'
|
|
105
|
+
/// );
|
|
106
|
+
///
|
|
107
|
+
/// $public-data: prepare-for-output($user-data); // Результат: (name: 'Alice', email: 'alice@example.com')
|
|
108
|
+
///
|
|
109
|
+
/// @param {Map} $map - Исходная карта, из которой
|
|
110
|
+
/// удаляются ключи. Остаётся неизменной, функция
|
|
111
|
+
/// возвращает новую карту. Должна быть типа `map`.
|
|
112
|
+
/// @param {List} $remove-keys - Список ключей, которые
|
|
113
|
+
/// нужно удалить из карты. Может быть как одиночным
|
|
114
|
+
/// значением, так и списком. Отсутствующие в карте
|
|
115
|
+
/// ключи безопасно игнорируются.
|
|
116
|
+
/// @return {Map} - Новая карта, из которой удалены
|
|
117
|
+
/// указанные ключи. Если удалены все ключи, возвращает
|
|
118
|
+
/// пустую карту `()`.
|
|
119
|
+
/// @throws {Error} - Выбрасывает ошибку через функцию
|
|
120
|
+
/// `log-invalid-type`, если параметр `$map` не является
|
|
121
|
+
/// картой. Сообщение об ошибке локализовано и содержит
|
|
122
|
+
/// информацию об ожидаемом типе данных.
|
|
123
|
+
@function map-remove-keys($map, $remove-keys) {
|
|
124
|
+
|
|
125
|
+
// Проверяем, что первый аргумент действительно является картой.
|
|
126
|
+
// Если это не так, вызываем функцию логирования ошибки
|
|
127
|
+
// и возвращаем её результат.
|
|
128
|
+
@if not is-map($map) {
|
|
129
|
+
|
|
130
|
+
@return log-invalid-type(
|
|
131
|
+
'map-remove-keys',
|
|
132
|
+
$map,
|
|
133
|
+
'$map',
|
|
134
|
+
'map'
|
|
135
|
+
);
|
|
136
|
+
|
|
137
|
+
} @else {
|
|
138
|
+
|
|
139
|
+
// Проходим по всем ключам из списка удаляемых ключей.
|
|
140
|
+
// Для каждого ключа применяем встроенную функцию map.remove().
|
|
141
|
+
// Если ключ отсутствует в карте, map.remove() просто
|
|
142
|
+
// возвращает карту без изменений — это безопасное поведение.
|
|
143
|
+
@each $key in $remove-keys {
|
|
144
|
+
$map: map.remove($map, $key);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// Возвращаем новую карту без удалённых ключей.
|
|
148
|
+
// Исходная карта остаётся неизменной.
|
|
149
|
+
@return $map;
|
|
150
|
+
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
}
|
|
@@ -67,10 +67,11 @@
|
|
|
67
67
|
/// @return {String} - Закодированная строка, где все символы
|
|
68
68
|
/// из карты замены преобразованы в их процентное
|
|
69
69
|
/// представление.
|
|
70
|
-
/// @throws {Error} - Выбрасывает ошибку, если в
|
|
71
|
-
/// значение, не соответствующее
|
|
72
|
-
///
|
|
73
|
-
///
|
|
70
|
+
/// @throws {Error} - Выбрасывает ошибку, если в параметр передано
|
|
71
|
+
/// значение, не соответствующее необходимому типу:
|
|
72
|
+
///
|
|
73
|
+
/// - `$value` → `string`
|
|
74
|
+
/// - `$chars-map` → `map`
|
|
74
75
|
/// @require {function} string-replace - Вспомогательная
|
|
75
76
|
/// функция замены подстрок в строке. Должна быть определена
|
|
76
77
|
/// и доступна для корректной работы данной функции.
|
|
@@ -105,9 +105,11 @@
|
|
|
105
105
|
/// @return {Number} - Число, округленное вверх до ближайшего
|
|
106
106
|
/// значения, кратного `$nearest`. Сохраняет единицы
|
|
107
107
|
/// измерения исходного числа `$value`.
|
|
108
|
-
/// @throws {Error} - Выбрасывает ошибку, если в
|
|
109
|
-
/// значение, не соответствующее
|
|
110
|
-
///
|
|
108
|
+
/// @throws {Error} - Выбрасывает ошибку, если в параметр передано
|
|
109
|
+
/// значение, не соответствующее необходимому типу:
|
|
110
|
+
///
|
|
111
|
+
/// - `$value` → `number`
|
|
112
|
+
/// - `$nearest` → `number`
|
|
111
113
|
@function number-ceil-to($value, $nearest) {
|
|
112
114
|
|
|
113
115
|
// Проверка типа первого параметра: ожидается числовое значение.
|
|
@@ -86,9 +86,11 @@
|
|
|
86
86
|
/// или `$value-max`. Если `$value` меньше или равно `$value-max`,
|
|
87
87
|
/// возвращается `$value`. В противном случае возвращается
|
|
88
88
|
/// `$value-max`.
|
|
89
|
-
/// @throws {Error} - Выбрасывает ошибку, если в
|
|
90
|
-
/// значение, не соответствующее
|
|
91
|
-
///
|
|
89
|
+
/// @throws {Error} - Выбрасывает ошибку, если в параметр передано
|
|
90
|
+
/// значение, не соответствующее необходимому типу:
|
|
91
|
+
///
|
|
92
|
+
/// - `$value` → `number`
|
|
93
|
+
/// - `$value-max` → `number`
|
|
92
94
|
@function number-clamp-max($value, $value-max) {
|
|
93
95
|
|
|
94
96
|
// Проверка типа первого параметра: ожидается числовое значение.
|
|
@@ -94,9 +94,11 @@
|
|
|
94
94
|
/// или `$value-min`. Если `$value` больше или равно `$value-min`,
|
|
95
95
|
/// возвращается `$value`. В противном случае возвращается
|
|
96
96
|
/// `$value-min`.
|
|
97
|
-
/// @throws {Error} - Выбрасывает ошибку, если в
|
|
98
|
-
/// значение, не соответствующее
|
|
99
|
-
///
|
|
97
|
+
/// @throws {Error} - Выбрасывает ошибку, если в параметр передано
|
|
98
|
+
/// значение, не соответствующее необходимому типу:
|
|
99
|
+
///
|
|
100
|
+
/// - `$value` → `number`
|
|
101
|
+
/// - `$value-min` → `number`
|
|
100
102
|
@function number-clamp-min($value, $value-min) {
|
|
101
103
|
|
|
102
104
|
// Проверка типа первого параметра: ожидается числовое значение.
|
|
@@ -105,9 +105,12 @@
|
|
|
105
105
|
/// диапазона.
|
|
106
106
|
/// @throws {Warning} - когда `$value-min > $value-max` поведение
|
|
107
107
|
/// функции может быть неинтуитивным.
|
|
108
|
-
/// @throws {Error} - Выбрасывает ошибку, если в
|
|
109
|
-
/// значение, не соответствующее
|
|
110
|
-
///
|
|
108
|
+
/// @throws {Error} - Выбрасывает ошибку, если в параметр передано
|
|
109
|
+
/// значение, не соответствующее необходимому типу:
|
|
110
|
+
///
|
|
111
|
+
/// - `$value` → `number`
|
|
112
|
+
/// - `$value-min` → `number`
|
|
113
|
+
/// - `$value-max` → `number`
|
|
111
114
|
@function number-clamp($value, $value-min, $value-max) {
|
|
112
115
|
|
|
113
116
|
// Проверка типа первого параметра: ожидается числовое значение.
|
|
@@ -170,9 +170,12 @@
|
|
|
170
170
|
/// @throws Не выбрасывает ошибок, безопасно обрабатывает все
|
|
171
171
|
/// числовые значения. Формула математически корректна для
|
|
172
172
|
/// любых числовых аргументов.
|
|
173
|
-
/// @throws {Error} - Выбрасывает ошибку, если в
|
|
174
|
-
/// значение, не соответствующее
|
|
175
|
-
///
|
|
173
|
+
/// @throws {Error} - Выбрасывает ошибку, если в параметр передано
|
|
174
|
+
/// значение, не соответствующее необходимому типу:
|
|
175
|
+
///
|
|
176
|
+
/// - `$value` → `number`
|
|
177
|
+
/// - `$value-min` → `number`
|
|
178
|
+
/// - `$value-max` → `number`
|
|
176
179
|
@function number-denormalize($value, $value-min, $value-max) {
|
|
177
180
|
|
|
178
181
|
// Проверка типа первого параметра: ожидается нормализованное числовое значение.
|