@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.
Files changed (52) hide show
  1. package/README.en.md +99 -0
  2. package/README.md +2 -0
  3. package/_configs.scss +1 -1
  4. package/index.scss +11 -5
  5. package/modules/utilities/getters/map/_get-map-item.scss +159 -0
  6. package/modules/utilities/helpers/list/_list-sum-numbers-safe.scss +4 -3
  7. package/modules/utilities/helpers/list/_list-sum-numbers.scss +4 -3
  8. package/modules/utilities/helpers/map/_map-remove-keys.scss +153 -0
  9. package/modules/utilities/helpers/misc/_url-encode.scss +5 -4
  10. package/modules/utilities/helpers/number/_number-ceil-to.scss +5 -3
  11. package/modules/utilities/helpers/number/_number-clamp-max.scss +5 -3
  12. package/modules/utilities/helpers/number/_number-clamp-min.scss +5 -3
  13. package/modules/utilities/helpers/number/_number-clamp.scss +6 -3
  14. package/modules/utilities/helpers/number/_number-denormalize.scss +6 -3
  15. package/modules/utilities/helpers/number/_number-fibonacci.scss +4 -3
  16. package/modules/utilities/helpers/number/_number-floor-to.scss +5 -3
  17. package/modules/utilities/helpers/number/_number-format-with-separator.scss +5 -4
  18. package/modules/utilities/helpers/number/_number-normalize.scss +6 -3
  19. package/modules/utilities/helpers/number/_number-random-between-int.scss +5 -3
  20. package/modules/utilities/helpers/number/_number-random-between.scss +5 -3
  21. package/modules/utilities/helpers/number/_number-range.scss +6 -3
  22. package/modules/utilities/helpers/number/_number-round-to-nearest.scss +5 -3
  23. package/modules/utilities/helpers/number/_number-round-to.scss +5 -3
  24. package/modules/utilities/helpers/number/_number-strip-unit.scss +4 -3
  25. package/modules/utilities/helpers/string/_string-capitalize.scss +4 -3
  26. package/modules/utilities/helpers/string/_string-lorips.config.scss +0 -2
  27. package/modules/utilities/helpers/string/_string-replace.scss +6 -3
  28. package/modules/utilities/helpers/string/_string-trim-end.scss +4 -3
  29. package/modules/utilities/helpers/string/_string-trim-start.scss +4 -3
  30. package/modules/utilities/helpers/string/_string-trim.scss +4 -3
  31. package/modules/utilities/loggers/_log.scss +219 -0
  32. package/modules/utilities/setters/map/_set-map-item.scss +243 -0
  33. package/modules/utilities/validators/color/_is-color-light.scss +5 -4
  34. package/modules/utilities/validators/color/_is-color-list.scss +4 -3
  35. package/modules/utilities/validators/list/_is-list-contained.scss +5 -4
  36. package/modules/utilities/validators/number/_is-int-even.scss +4 -3
  37. package/modules/utilities/validators/number/_is-int-odd.scss +4 -3
  38. package/modules/utilities/validators/number/_is-int.scss +5 -3
  39. package/modules/utilities/validators/number/_is-number-has-unit.scss +4 -3
  40. package/modules/utilities/validators/number/_is-number-negative.scss +4 -3
  41. package/modules/utilities/validators/number/_is-number-positive.scss +4 -3
  42. package/modules/utilities/validators/number/_is-number-unitless.scss +4 -3
  43. package/modules/utilities/validators/number/_is-number-zero.scss +4 -3
  44. package/modules/utilities/validators/string/_is-string-contained.scss +5 -3
  45. package/modules/utilities/validators/string/_is-string-empty.scss +4 -3
  46. package/modules/utilities/validators/string/_is-string-ending-with.scss +5 -3
  47. package/modules/utilities/validators/string/_is-string-starting-with.scss +5 -3
  48. package/modules/utilities/validators/type-of/_is-color.scss +0 -4
  49. package/package.json +25 -16
  50. package/package.scss +12 -2
  51. package/CHANGELOG.md +0 -122
  52. 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
+ ![NPM Version](https://img.shields.io/npm/v/%40omnisass%2Flibrary?logo=npm&label=%40omnisass%2Flibrary&labelColor=%23CB3837&color=white) ![NPM Downloads](https://img.shields.io/npm/dw/%40omnisass%2Flibrary?logo=npm&logoColor=white&labelColor=%23CB3837&color=white) ![NPM Last Update](https://img.shields.io/npm/last-update/%40omnisass%2Flibrary?logo=npm&logoColor=white&labelColor=%23CB3837&color=white) ![NPM Collaborators](https://img.shields.io/npm/collaborators/%40omnisass%2Flibrary?logo=npm&logoColor=white&labelColor=%23CB3837&color=white) ![NPM License](https://img.shields.io/npm/l/%40omnisass%2Flibrary?logo=ReadMe&logoColor=white&labelColor=%23018EF5&color=white) ![NPM (prod) Dependency Version](https://img.shields.io/npm/dependency-version/%40omnisass%2Flibrary/sass?logo=Sass&logoColor=white&labelColor=%23CC6699&color=white)
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
@@ -1,3 +1,5 @@
1
+ [🇬🇧 English](./README.en.md)
2
+
1
3
  <p align="left">
2
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="Логотип проекта">
3
5
  </p>
package/_configs.scss CHANGED
@@ -25,7 +25,7 @@
25
25
  /// @name set-strict-mode
26
26
  /// @access public
27
27
  /// @example scss Отключение режима
28
- /// @use 'omnisass' as libomnisass with (
28
+ /// @use 'omnisass' as omnisass with (
29
29
  /// $set-strict-mode: false
30
30
  /// );
31
31
  /// @type Boolean
package/index.scss CHANGED
@@ -3,7 +3,7 @@
3
3
  @forward 'configs';
4
4
  @forward 'package';
5
5
 
6
- /// Converters
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
- // Validators
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
- /// значение, не соответствующее типу `list`. Компиляция Sass
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
- /// значение, не соответствующее типу `list`. Компиляция Sass
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
- /// значение, не соответствующее типу `string` (`$value`) или
72
- /// `map` (`$chars-map`). Компиляция Sass будет остановлена
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
- /// значение, не соответствующее типу `number`. Компиляция Sass
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
- /// значение, не соответствующее типу `number`. Компиляция Sass
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
- /// значение, не соответствующее типу `number`. Компиляция Sass
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
- /// значение, не соответствующее типу `number`. Компиляция Sass
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
- /// значение, не соответствующее типу `number`. Компиляция Sass
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
  // Проверка типа первого параметра: ожидается нормализованное числовое значение.