@omnisass/library 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/LICENSE +21 -0
  3. package/README.md +2 -0
  4. package/_configs.scss +68 -0
  5. package/index.scss +95 -0
  6. package/modules/utilities/converters/_convert-camel2kebab.scss +186 -0
  7. package/modules/utilities/converters/_convert-em2px.scss +239 -0
  8. package/modules/utilities/converters/_convert-hex2rgb.scss +97 -0
  9. package/modules/utilities/converters/_convert-hex2rgba.scss +124 -0
  10. package/modules/utilities/converters/_convert-kebab2camel.scss +232 -0
  11. package/modules/utilities/converters/_convert-kebab2snake.scss +118 -0
  12. package/modules/utilities/converters/_convert-px2em.scss +236 -0
  13. package/modules/utilities/converters/_convert-px2rem.scss +180 -0
  14. package/modules/utilities/converters/_convert-rem2px.scss +207 -0
  15. package/modules/utilities/converters/_convert-snake2kebab.scss +173 -0
  16. package/modules/utilities/getters/color/_get-color-brightness.scss +138 -0
  17. package/modules/utilities/getters/color/_get-color-darkest.scss +178 -0
  18. package/modules/utilities/getters/list/_get-list-item-end.scss +114 -0
  19. package/modules/utilities/getters/list/_get-list-item-start.scss +109 -0
  20. package/modules/utilities/getters/list/_get-list-item.scss +179 -0
  21. package/modules/utilities/getters/number/_get-number-from-percent.scss +139 -0
  22. package/modules/utilities/getters/number/_get-number-height-by-ratio.scss +199 -0
  23. package/modules/utilities/getters/number/_get-number-max.scss +168 -0
  24. package/modules/utilities/getters/number/_get-number-min.scss +162 -0
  25. package/modules/utilities/getters/number/_get-number-percentage-of.scss +149 -0
  26. package/modules/utilities/getters/number/_get-number-unit.scss +111 -0
  27. package/modules/utilities/getters/number/_get-number-width-by-ratio.scss +223 -0
  28. package/modules/utilities/helpers/color/_color-blend-steps.scss +210 -0
  29. package/modules/utilities/helpers/color/_color-blend.scss +183 -0
  30. package/modules/utilities/helpers/color/_color-hue-shift.scss +148 -0
  31. package/modules/utilities/helpers/color/_color-scale.scss +208 -0
  32. package/modules/utilities/helpers/color/_color-shade.scss +113 -0
  33. package/modules/utilities/helpers/color/_color-tint.scss +118 -0
  34. package/modules/utilities/helpers/color/_color-triad.scss +141 -0
  35. package/modules/utilities/helpers/list/_list-dedupe.scss +146 -0
  36. package/modules/utilities/helpers/list/_list-insert-at.scss +166 -0
  37. package/modules/utilities/helpers/list/_list-merge.scss +86 -0
  38. package/modules/utilities/helpers/list/_list-remove-at.scss +160 -0
  39. package/modules/utilities/helpers/list/_list-sum-numbers-safe.scss +175 -0
  40. package/modules/utilities/helpers/list/_list-sum-numbers.scss +128 -0
  41. package/modules/utilities/helpers/misc/_url-encode.configs.scss +64 -0
  42. package/modules/utilities/helpers/misc/_url-encode.scss +148 -0
  43. package/modules/utilities/helpers/number/_number-ceil-to.scss +111 -0
  44. package/modules/utilities/helpers/number/_number-clamp-max.scss +92 -0
  45. package/modules/utilities/helpers/number/_number-clamp-min.scss +100 -0
  46. package/modules/utilities/helpers/number/_number-clamp.scss +109 -0
  47. package/modules/utilities/helpers/number/_number-denormalize.scss +172 -0
  48. package/modules/utilities/helpers/number/_number-fibonacci.scss +235 -0
  49. package/modules/utilities/helpers/number/_number-floor-to.scss +114 -0
  50. package/modules/utilities/helpers/number/_number-format-with-separator.scss +122 -0
  51. package/modules/utilities/helpers/number/_number-normalize.scss +160 -0
  52. package/modules/utilities/helpers/number/_number-random-between-int.scss +84 -0
  53. package/modules/utilities/helpers/number/_number-random-between.scss +120 -0
  54. package/modules/utilities/helpers/number/_number-range.scss +268 -0
  55. package/modules/utilities/helpers/number/_number-round-to-nearest.scss +131 -0
  56. package/modules/utilities/helpers/number/_number-round-to.scss +118 -0
  57. package/modules/utilities/helpers/number/_number-strip-unit.scss +97 -0
  58. package/modules/utilities/helpers/string/_string-capitalize.scss +84 -0
  59. package/modules/utilities/helpers/string/_string-replace.scss +69 -0
  60. package/modules/utilities/helpers/string/_string-trim-end.scss +62 -0
  61. package/modules/utilities/helpers/string/_string-trim-start.scss +62 -0
  62. package/modules/utilities/helpers/string/_string-trim.scss +69 -0
  63. package/modules/utilities/loggers/_log-invalid-type.scss +151 -0
  64. package/modules/utilities/loggers/_log-invalid-value.scss +151 -0
  65. package/modules/utilities/setters/_index.scss +3 -0
  66. package/modules/utilities/validators/color/_is-color-light.scss +132 -0
  67. package/modules/utilities/validators/color/_is-color-list.scss +124 -0
  68. package/modules/utilities/validators/list/_is-list-contained.scss +65 -0
  69. package/modules/utilities/validators/misc/_is-time.scss +115 -0
  70. package/modules/utilities/validators/number/_is-int-even.scss +69 -0
  71. package/modules/utilities/validators/number/_is-int-odd.scss +70 -0
  72. package/modules/utilities/validators/number/_is-int.scss +124 -0
  73. package/modules/utilities/validators/number/_is-number-has-unit.scss +85 -0
  74. package/modules/utilities/validators/number/_is-number-negative.scss +76 -0
  75. package/modules/utilities/validators/number/_is-number-positive.scss +74 -0
  76. package/modules/utilities/validators/number/_is-number-unitless.scss +88 -0
  77. package/modules/utilities/validators/number/_is-number-zero.scss +75 -0
  78. package/modules/utilities/validators/string/_is-string-contained.scss +108 -0
  79. package/modules/utilities/validators/string/_is-string-empty.scss +56 -0
  80. package/modules/utilities/validators/string/_is-string-ending-with.scss +66 -0
  81. package/modules/utilities/validators/string/_is-string-starting-with.scss +66 -0
  82. package/modules/utilities/validators/type-of/_is-boolean.scss +92 -0
  83. package/modules/utilities/validators/type-of/_is-color.scss +96 -0
  84. package/modules/utilities/validators/type-of/_is-list.scss +105 -0
  85. package/modules/utilities/validators/type-of/_is-map.scss +105 -0
  86. package/modules/utilities/validators/type-of/_is-number.scss +103 -0
  87. package/modules/utilities/validators/type-of/_is-string.scss +110 -0
  88. package/modules/utilities/validators/type-of/_is-type.scss +77 -0
  89. package/package.json +54 -0
  90. package/package.scss +156 -0
  91. package/test.md +168 -0
  92. package/test.scss +405 -0
  93. package/test.sh +149 -0
@@ -0,0 +1,236 @@
1
+ @use 'sass:math';
2
+ @use '../helpers/number/number-strip-unit' as *;
3
+ @use '../loggers/log-invalid-type' as *;
4
+ @use '../validators/type-of/is-number' as *;
5
+
6
+ /// Конвертирует значения из пикселей (`px`) в относительные
7
+ /// единицы (`em`).
8
+ ///
9
+ /// Функция выполняет преобразование пиксельных значений в
10
+ /// единицы `em` относительно заданного базового размера. Это
11
+ /// особенно полезно для создания масштабируемых интерфейсов,
12
+ /// которые корректно работают при изменении пользователем
13
+ /// размера шрифта в браузере.
14
+ ///
15
+ /// Важные особенности функции:
16
+ /// - Преобразует пиксели в em с указанием единиц `em`
17
+ /// - Поддерживает кастомный базовый размер (по умолчанию 16px)
18
+ /// - Удаляет единицы измерения для корректного математического
19
+ /// расчета
20
+ /// - Использует `math.div()` для безопасного деления
21
+ /// - Возвращает результат с единицами `em` для семантической
22
+ /// ясности
23
+ /// - Обрабатывает целые и дробные значения
24
+ /// - Относится к размеру шрифта родительского элемента
25
+ ///
26
+ /// > Единица `em` является относительной и зависит от размера
27
+ /// > шрифта родительского элемента. Это важно учитывать при
28
+ /// > вложенных структурах, так как `em` могут наследоваться
29
+ /// > и множиться. Для независимых от контекста величин
30
+ /// > рассмотрите использование единиц `rem`.
31
+ /// ---
32
+ /// @name convert-px2em
33
+ /// @group utilities-converters
34
+ /// @since 2025.12.27
35
+ /// @access public
36
+ /// @author Murad Rustamov (therteenten)
37
+ /// @link https://sourcecraft.dev/users/therteenten/overview SourceCraft - therteenten
38
+ /// @link https://sourcecraft.dev/omnisass/library SourceCraft - OmniSass
39
+ /// @link https://sass-lang.com/documentation/values/numbers См. также: Официальная документация Sass - Тип данных "Числа"
40
+ /// @link https://sass-lang.com/documentation/values/numbers#units См. также: Официальная документация Sass - Единицы измерения в числах
41
+ /// @link https://sass-lang.com/documentation/modules/math#div См. также: Официальная документация Sass - Функция math.div()
42
+ /// @link https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/Values_and_units См. также: MDN Web Docs - Значения и единицы измерения CSS
43
+ /// @link https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/Sizing_items_in_CSS См. также: MDN Web Docs - Размеры элементов в CSS
44
+ /// @link https://developer.mozilla.org/en-US/docs/Web/CSS/length См. также: MDN Web Docs - CSS-тип <length>
45
+ /// @link https://css-tricks.com/snippets/sass/ См. также: CSS-Tricks - Коллекция сниппетов Sass
46
+ /// @link https://css-tricks.com/snippets/css/guide-to-em-and-rem-units-in-css/ См. также: CSS-Tricks - Руководство по em и rem единицам в CSS
47
+ /// @link https://sass-guidelin.es/ru/#section-41 См. также: Sass Guidelines - Раздел про математические операции
48
+ /// @link https://www.w3schools.com/css/css_units.asp См. также: W3Schools - CSS единицы измерения
49
+ /// @example scss - Стандартное преобразование (базовый размер 16px)
50
+ /// @debug convert-px2em(16px); // 1em
51
+ /// @debug convert-px2em(8px); // 0.5em
52
+ /// @debug convert-px2em(24px); // 1.5em
53
+ /// @debug convert-px2em(32px); // 2em
54
+ /// @debug convert-px2em(48px); // 3em
55
+ /// @debug convert-px2em(4px); // 0.25em
56
+ /// @debug convert-px2em(1px); // 0.0625em
57
+ /// @example scss - Дробные значения
58
+ /// @debug convert-px2em(12.5px); // 0.78125em
59
+ /// @debug convert-px2em(18.75px); // 1.171875em
60
+ /// @debug convert-px2em(0.5px); // 0.03125em
61
+ /// @debug convert-px2em(14.4px); // 0.9em
62
+ /// @example scss - Кастомный базовый размер
63
+ /// @debug convert-px2em(16px, 10px); // 1.6em (база 10px)
64
+ /// @debug convert-px2em(20px, 10px); // 2em (база 10px)
65
+ /// @debug convert-px2em(8px, 10px); // 0.8em (база 10px)
66
+ /// @debug convert-px2em(16px, 20px); // 0.8em (база 20px)
67
+ /// @debug convert-px2em(24px, 20px); // 1.2em (база 20px)
68
+ /// @debug convert-px2em(10px, 20px); // 0.5em (база 20px)
69
+ /// @example scss - Граничные случаи
70
+ /// @debug convert-px2em(0px); // 0em
71
+ /// @debug convert-px2em(0px, 16px); // 0em
72
+ /// @debug convert-px2em(160px); // 10em
73
+ /// @debug convert-px2em(1000px); // 62.5em
74
+ /// @debug convert-px2em(1px, 100px); // 0.01em
75
+ /// @example scss - Отрицательные значения
76
+ /// @debug convert-px2em(-16px); // -1em
77
+ /// @debug convert-px2em(-8px); // -0.5em
78
+ /// @debug convert-px2em(-24px); // -1.5em
79
+ /// @debug convert-px2em(-16px, 8px); // -2em
80
+ /// @example scss - Безразмерные числа как аргументы
81
+ /// @debug convert-px2em(16, 16); // 1em (без единиц, но работает)
82
+ /// @debug convert-px2em(8, 16); // 0.5em
83
+ /// @debug convert-px2em(24, 16); // 1.5em
84
+ /// @example scss - Сравнение em и rem
85
+ /// // em - относительно родительского элемента
86
+ /// .parent { font-size: 20px; }
87
+ /// .child {
88
+ /// font-size: convert-px2em(16px); // 0.8em (относительно 20px родителя)
89
+ /// }
90
+ ///
91
+ /// // rem - относительно корневого элемента (html)
92
+ /// html { font-size: 16px; }
93
+ /// .element {
94
+ /// font-size: convert-px2em(16px); // 1em (но ведет себя как 1rem в контексте html)
95
+ /// }
96
+ /// @example css - Результат
97
+ /// .parent {
98
+ /// font-size: 20px;
99
+ /// }
100
+ ///
101
+ /// .child {
102
+ /// font-size: 1em;
103
+ /// }
104
+ ///
105
+ /// html {
106
+ /// font-size: 16px;
107
+ /// }
108
+ ///
109
+ /// .element {
110
+ /// font-size: 1em;
111
+ /// }
112
+ /// @example scss - Использование в реальных сценариях
113
+ /// $spacing-small: convert-px2em(8px); // 0.5em
114
+ /// $spacing-medium: convert-px2em(16px); // 1em
115
+ /// $spacing-large: convert-px2em(24px); // 1.5em
116
+ ///
117
+ /// .element {
118
+ /// padding: convert-px2em(16px);
119
+ /// margin-bottom: convert-px2em(8px);
120
+ /// font-size: convert-px2em(18px, 16px); // 1.125em
121
+ /// }
122
+ ///
123
+ /// // Для кастомной типографической базы
124
+ /// $base-font-size: 20px;
125
+ /// .heading {
126
+ /// font-size: convert-px2em(24px, $base-font-size); // 1.2em
127
+ /// margin-bottom: convert-px2em(16px, $base-font-size); // 0.8em
128
+ /// }
129
+ /// @example css - Результат
130
+ /// .element {
131
+ /// padding: 1em;
132
+ /// margin-bottom: 0.5em;
133
+ /// font-size: 1.125em;
134
+ /// }
135
+ ///
136
+ /// .heading {
137
+ /// font-size: 1.2em;
138
+ /// margin-bottom: 0.8em;
139
+ /// }
140
+ /// @example scss - Комплексное использование с вложенностью
141
+ /// .container {
142
+ /// font-size: 20px;
143
+ ///
144
+ /// .nested-element {
145
+ /// // Все em внутри будут относиться к font-size: 20px контейнера
146
+ /// padding: convert-px2em(10px, 20px); // 0.5em
147
+ /// margin: convert-px2em(20px, 20px); // 1em
148
+ /// border-width: convert-px2em(2px, 20px); // 0.1em
149
+ /// }
150
+ /// }
151
+ /// @example css - Результат
152
+ /// .container {
153
+ /// font-size: 20px;
154
+ /// }
155
+ /// .container .nested-element {
156
+ /// padding: 0.5em;
157
+ /// margin: 1em;
158
+ /// border-width: 0.1em;
159
+ /// }
160
+ /// @param {Number} $px - Значение в пикселях для конвертации.
161
+ /// Может быть целым или дробным числом, положительным или
162
+ /// отрицательным. Единицы измерения (`px`) удаляются для
163
+ /// расчета, но ожидается, что значение изначально выражено
164
+ /// в пикселях.
165
+ /// @param {Number} $base [16px] - Базовый размер в пикселях
166
+ /// для расчета. По умолчанию используется 16px, что
167
+ /// соответствует стандартному размеру шрифта в большинстве
168
+ /// браузеров. Может быть любым положительным числом (обычно
169
+ /// в пикселях).
170
+ /// @return {Number} - Значение в единицах `em`, рассчитанное
171
+ /// по формуле: `($px / $base) * 1em`. Возвращает дробное
172
+ /// или целое число с единицами измерения `em`.
173
+ /// @throws {Error} - Может выбросить ошибку деления на ноль,
174
+ /// если `$base` равен 0 после удаления единиц измерения.
175
+ /// Также может выбросить ошибку при передаче нечисловых
176
+ /// значений.
177
+ @function convert-px2em($px, $base: 16px) {
178
+
179
+ // Проверка типа первого параметра: ожидается числовое
180
+ // значение в пикселях.
181
+ @if not is-number($px) {
182
+
183
+ // Если $px не является числом, возвращаем ошибку через
184
+ // стандартную функцию логирования. Это предотвращает
185
+ // некорректные вычисления с нечисловыми данными.
186
+ @return log-invalid-type(
187
+ 'convert-px2em',
188
+ $px,
189
+ '$px',
190
+ 'number'
191
+ );
192
+
193
+ }
194
+
195
+ // Проверка типа второго параметра: ожидается числовое
196
+ // значение базового размера.
197
+ @else if not is-number($base) {
198
+
199
+ // Если $base не является числом, возвращаем ошибку.
200
+ // Проверка выполняется только если $px прошел валидацию.
201
+ @return log-invalid-type(
202
+ 'convert-px2em',
203
+ $base,
204
+ '$base',
205
+ 'number'
206
+ );
207
+
208
+ }
209
+
210
+ // Оба параметра прошли валидацию - выполняем конвертацию.
211
+ @else {
212
+
213
+ // Формула конвертации: em = px ÷ базовый_размер_шрифта.
214
+ //
215
+ // Алгоритм вычислений:
216
+ // 1. number-strip-unit($px) - удаляем единицу измерения
217
+ // 'px' из первого значения
218
+ // Пример: 24px → 24 (число без единиц)
219
+ // 2. number-strip-unit($base) - удаляем единицу измерения
220
+ // из базового размера
221
+ // Пример: 16px → 16 (число без единиц)
222
+ // 3. Делим безразмерные числа: (число px) ÷ (базовый размер)
223
+ // Используем math.div() для безопасного деления
224
+ // Пример: math.div(24, 16) = 1.5
225
+ // 4. Умножаем результат на 1em для добавления единицы
226
+ // измерения em
227
+ // Пример: 1.5 × 1em = 1.5em
228
+ //
229
+ // Ключевая особенность: результат в em зависит от размера
230
+ // шрифта родительского элемента. Если размер шрифта родителя
231
+ // изменяется, em значения адаптируются относительно него.
232
+ @return math.div(number-strip-unit($px), number-strip-unit($base)) * 1em;
233
+
234
+ }
235
+
236
+ }
@@ -0,0 +1,180 @@
1
+ @use 'sass:math';
2
+ @use '../helpers/number/number-strip-unit' as *;
3
+ @use '../loggers/log-invalid-type' as *;
4
+ @use '../validators/type-of/is-number' as *;
5
+
6
+ /// Конвертирует значения из пикселей (`px`) в относительные
7
+ /// единицы (`rem`).
8
+ ///
9
+ /// Функция выполняет преобразование пиксельных значений в
10
+ /// единицы `rem` относительно заданного базового размера. Это
11
+ /// особенно полезно для создания масштабируемых интерфейсов,
12
+ /// которые корректно работают при изменении пользователем
13
+ /// размера шрифта в браузере.
14
+ ///
15
+ /// Важные особенности функции:
16
+ /// - Преобразует пиксели в rem с указанием единиц `rem`
17
+ /// - Поддерживает кастомный базовый размер (по умолчанию 16px)
18
+ /// - Удаляет единицы измерения для корректного математического
19
+ /// расчета
20
+ /// - Использует `math.div()` для безопасного деления
21
+ /// - Возвращает результат с единицами `rem` для семантической
22
+ /// ясности
23
+ /// - Обрабатывает целые и дробные значения
24
+ /// ---
25
+ /// @name convert-px2rem
26
+ /// @group utilities-converters
27
+ /// @since 2025.12.27
28
+ /// @access public
29
+ /// @author Murad Rustamov (therteenten)
30
+ /// @link https://sourcecraft.dev/users/therteenten/overview SourceCraft - therteenten
31
+ /// @link https://sourcecraft.dev/omnisass/library SourceCraft - OmniSass
32
+ /// @link https://sass-lang.com/documentation/values/numbers См. также: Официальная документация Sass - Тип данных "Числа"
33
+ /// @link https://sass-lang.com/documentation/values/numbers#units См. также: Официальная документация Sass - Единицы измерения в числах
34
+ /// @link https://sass-lang.com/documentation/modules/math#div См. также: Официальная документация Sass - Функция math.div()
35
+ /// @link https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/Values_and_units См. также: MDN Web Docs - Значения и единицы измерения CSS
36
+ /// @link https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/Sizing_itrems_in_CSS См. также: MDN Web Docs - Размеры элементов в CSS
37
+ /// @link https://developer.mozilla.org/en-US/docs/Web/CSS/length См. также: MDN Web Docs - CSS-тип <length>
38
+ /// @link https://css-tricks.com/snippets/sass/ См. также: CSS-Tricks - Коллекция сниппетов Sass
39
+ /// @link https://sass-guidelin.es/ru/#section-41 См. также: Sass Guidelines - Раздел про математические операции
40
+ /// @link https://www.w3schools.com/css/css_units.asp См. также: W3Schools - CSS единицы измерения
41
+ /// @example scss - Стандартное преобразование (базовый размер 16px)
42
+ /// @debug convert-px2rem(16px); // 1rem
43
+ /// @debug convert-px2rem(8px); // 0.5rem
44
+ /// @debug convert-px2rem(24px); // 1.5rem
45
+ /// @debug convert-px2rem(32px); // 2rem
46
+ /// @debug convert-px2rem(48px); // 3rem
47
+ /// @debug convert-px2rem(4px); // 0.25rem
48
+ /// @debug convert-px2rem(1px); // 0.0625rem
49
+ /// @example scss - Дробные значения
50
+ /// @debug convert-px2rem(12.5px); // 0.78125rem
51
+ /// @debug convert-px2rem(18.75px); // 1.171875rem
52
+ /// @debug convert-px2rem(0.5px); // 0.03125rem
53
+ /// @debug convert-px2rem(14.4px); // 0.9rem
54
+ /// @example scss - Кастомный базовый размер
55
+ /// @debug convert-px2rem(16px, 10px); // 1.6rem (база 10px)
56
+ /// @debug convert-px2rem(20px, 10px); // 2rem (база 10px)
57
+ /// @debug convert-px2rem(8px, 10px); // 0.8rem (база 10px)
58
+ /// @debug convert-px2rem(16px, 20px); // 0.8rem (база 20px)
59
+ /// @debug convert-px2rem(24px, 20px); // 1.2rem (база 20px)
60
+ /// @debug convert-px2rem(10px, 20px); // 0.5rem (база 20px)
61
+ /// @example scss - Граничные случаи
62
+ /// @debug convert-px2rem(0px); // 0rem
63
+ /// @debug convert-px2rem(0px, 16px); // 0rem
64
+ /// @debug convert-px2rem(160px); // 10rem
65
+ /// @debug convert-px2rem(1000px); // 62.5rem
66
+ /// @debug convert-px2rem(1px, 100px); // 0.01rem
67
+ /// @example scss - Отрицательные значения
68
+ /// @debug convert-px2rem(-16px); // -1rem
69
+ /// @debug convert-px2rem(-8px); // -0.5rem
70
+ /// @debug convert-px2rem(-24px); // -1.5rem
71
+ /// @debug convert-px2rem(-16px, 8px); // -2rem
72
+ /// @example scss - Безразмерные числа как аргументы
73
+ /// @debug convert-px2rem(16, 16); // 1rem (без единиц, но работает)
74
+ /// @debug convert-px2rem(8, 16); // 0.5rem
75
+ /// @debug convert-px2rem(24, 16); // 1.5rem
76
+ /// @example scss - Использование в реальных сценариях
77
+ /// $spacing-small: convert-px2rem(8px); // 0.5rem
78
+ /// $spacing-medium: convert-px2rem(16px); // 1rem
79
+ /// $spacing-large: convert-px2rem(24px); // 1.5rem
80
+ ///
81
+ /// .elrement {
82
+ /// padding: convert-px2rem(16px);
83
+ /// margin-bottom: convert-px2rem(8px);
84
+ /// font-size: convert-px2rem(18px, 16px); // 1.125rem
85
+ /// }
86
+ ///
87
+ /// // Для кастомной типографической базы
88
+ /// $base-font-size: 20px;
89
+ /// .heading {
90
+ /// font-size: convert-px2rem(24px, $base-font-size); // 1.2rem
91
+ /// margin-bottom: convert-px2rem(16px, $base-font-size); // 0.8rem
92
+ /// }
93
+ /// @example css - Результат
94
+ /// .elrement {
95
+ /// padding: 1rem;
96
+ /// margin-bottom: 0.5rem;
97
+ /// font-size: 1.125rem;
98
+ /// }
99
+ ///
100
+ /// .heading {
101
+ /// font-size: 1.2rem;
102
+ /// margin-bottom: 0.8rem;
103
+ /// }
104
+ /// @param {Number} $px - Значение в пикселях для конвертации.
105
+ /// Может быть целым или дробным числом, положительным или
106
+ /// отрицательным. Единицы измерения (`px`) удаляются для
107
+ /// расчета, но ожидается, что значение изначально выражено
108
+ /// в пикселях.
109
+ /// @param {Number} $base [16px] - Базовый размер в пикселях
110
+ /// для расчета. По умолчанию используется `16px`, что
111
+ /// соответствует стандартному размеру шрифта в большинстве
112
+ /// браузеров. Может быть любым положительным числом (обычно
113
+ /// в пикселях).
114
+ /// @return {Number} - Значение в единицах `rem`, рассчитанное
115
+ /// по формуле: `($px / $base) * 1rem`. Возвращает дробное
116
+ /// или целое число с единицами измерения `rem`.
117
+ /// @throws {Error} - Может выбросить ошибку деления на ноль,
118
+ /// если `$base` равен 0 после удаления единиц измерения.
119
+ /// Также может выбросить ошибку при передаче нечисловых
120
+ /// значений.
121
+ @function convert-px2rem($px, $base: 16px) {
122
+
123
+ // Проверка типа первого параметра: ожидается числовое
124
+ // значение в пикселях.
125
+ @if not is-number($px) {
126
+
127
+ // Если $px не является числом, возвращаем ошибку через
128
+ // стандартную функцию логирования. Это предотвращает
129
+ // некорректные вычисления с нечисловыми данными.
130
+ @return log-invalid-type(
131
+ 'convert-px2rem',
132
+ $px,
133
+ '$px',
134
+ 'number'
135
+ );
136
+
137
+ }
138
+
139
+ // Проверка типа второго параметра: ожидается числовое
140
+ // значение базового размера.
141
+ @else if not is-number($base) {
142
+
143
+ // Если $base не является числом, возвращаем ошибку.
144
+ // Проверка выполняется только если $px прошел валидацию.
145
+ @return log-invalid-type(
146
+ 'convert-px2rem',
147
+ $base,
148
+ '$base',
149
+ 'number'
150
+ );
151
+
152
+ }
153
+
154
+ // Оба параметра прошли валидацию - выполняем конвертацию.
155
+ @else {
156
+
157
+ // Формула конвертации: rem = px ÷ базовый_размер_шрифта.
158
+ //
159
+ // Алгоритм вычислений:
160
+ // 1. number-strip-unit($px) - удаляем единицу измерения
161
+ // 'px' из первого значения
162
+ // Пример: 24px → 24 (число без единиц)
163
+ // 2. number-strip-unit($base) - удаляем единицу измерения
164
+ // из базового размера
165
+ // Пример: 16px → 16 (число без единиц)
166
+ // 3. Делим безразмерные числа: (число px) ÷ (базовый размер)
167
+ // Используем math.div() для безопасного деления
168
+ // Пример: math.div(24, 16) = 1.5
169
+ // 4. Умножаем результат на 1rem для добавления единицы
170
+ // измерения rem
171
+ // Пример: 1.5 × 1rem = 1.5rem
172
+ //
173
+ // Ключевая особенность: результат в rem зависит от базового
174
+ // размера шрифта. Если пользователь изменит размер шрифта
175
+ // в браузере, rem значения адаптируются.
176
+ @return math.div(number-strip-unit($px), number-strip-unit($base)) * 1rem;
177
+
178
+ }
179
+
180
+ }
@@ -0,0 +1,207 @@
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
+ /// Конвертирует значения из относительных единиц (`rem`) в
6
+ /// пиксели (`px`).
7
+ ///
8
+ /// Функция выполняет преобразование значений в единицах `rem`
9
+ /// в пиксели относительно заданного базового размера. Это
10
+ /// особенно полезно для обратных расчетов, когда необходимо
11
+ /// получить точное пиксельное значение из относительного, или
12
+ /// для обеспечения обратной совместимости.
13
+ ///
14
+ /// Важные особенности функции:
15
+ /// - Преобразует rem в px с указанием единиц `px`
16
+ /// - Поддерживает кастомный базовый размер (по умолчанию 16px)
17
+ /// - Удаляет единицы измерения для корректного математического
18
+ /// расчета
19
+ /// - Возвращает результат с единицами `px` для семантической
20
+ /// ясности
21
+ /// - Обрабатывает целые и дробные значения
22
+ /// - Полезен для расчета точных размеров из относительных величин
23
+ /// - Обеспечивает обратное преобразование к `convert-px2rem`
24
+ /// ---
25
+ /// @name convert-rem2px
26
+ /// @group utilities-converters
27
+ /// @since 2025.12.27
28
+ /// @access public
29
+ /// @author Murad Rustamov (therteenten)
30
+ /// @link https://sourcecraft.dev/users/therteenten/overview SourceCraft - therteenten
31
+ /// @link https://sourcecraft.dev/omnisass/library SourceCraft - OmniSass
32
+ /// @link https://sass-lang.com/documentation/values/numbers См. также: Официальная документация Sass - Тип данных "Числа"
33
+ /// @link https://sass-lang.com/documentation/values/numbers#units См. также: Официальная документация Sass - Единицы измерения в числах
34
+ /// @link https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/Values_and_units См. также: MDN Web Docs - Значения и единицы измерения CSS
35
+ /// @link https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/Sizing_items_in_CSS См. также: MDN Web Docs - Размеры элементов в CSS
36
+ /// @link https://developer.mozilla.org/en-US/docs/Web/CSS/length См. также: MDN Web Docs - CSS-тип <length>
37
+ /// @link https://css-tricks.com/snippets/sass/ См. также: CSS-Tricks - Коллекция сниппетов Sass
38
+ /// @link https://css-tricks.com/snippets/css/guide-to-em-and-rem-units-in-css/ См. также: CSS-Tricks - Руководство по em и rem единицам в CSS
39
+ /// @link https://sass-guidelin.es/ru/#section-41 См. также: Sass Guidelines - Раздел про математические операции
40
+ /// @link https://www.w3schools.com/css/css_units.asp См. также: W3Schools - CSS единицы измерения
41
+ /// @example scss - Стандартное преобразование (базовый размер 16px)
42
+ /// @debug convert-rem2px(1rem); // 16px
43
+ /// @debug convert-rem2px(0.5rem); // 8px
44
+ /// @debug convert-rem2px(1.5rem); // 24px
45
+ /// @debug convert-rem2px(2rem); // 32px
46
+ /// @debug convert-rem2px(3rem); // 48px
47
+ /// @debug convert-rem2px(0.25rem); // 4px
48
+ /// @debug convert-rem2px(0.0625rem); // 1px
49
+ /// @example scss - Дробные значения rem
50
+ /// @debug convert-rem2px(0.78125rem); // 12.5px
51
+ /// @debug convert-rem2px(1.171875rem); // 18.75px
52
+ /// @debug convert-rem2px(0.03125rem); // 0.5px
53
+ /// @debug convert-rem2px(0.9rem); // 14.4px
54
+ /// @debug convert-rem2px(1.125rem); // 18px
55
+ /// @debug convert-rem2px(1.333rem); // 21.328px
56
+ /// @example scss - Кастомный базовый размер
57
+ /// @debug convert-rem2px(1rem, 10px); // 10px (база 10px)
58
+ /// @debug convert-rem2px(2rem, 10px); // 20px (база 10px)
59
+ /// @debug convert-rem2px(0.8rem, 10px); // 8px (база 10px)
60
+ /// @debug convert-rem2px(0.8rem, 20px); // 16px (база 20px)
61
+ /// @debug convert-rem2px(1.2rem, 20px); // 24px (база 20px)
62
+ /// @debug convert-rem2px(0.5rem, 20px); // 10px (база 20px)
63
+ /// @example scss - Граничные случаи
64
+ /// @debug convert-rem2px(0rem); // 0px
65
+ /// @debug convert-rem2px(0rem, 16px); // 0px
66
+ /// @debug convert-rem2px(10rem); // 160px
67
+ /// @debug convert-rem2px(62.5rem); // 1000px
68
+ /// @debug convert-rem2px(0.01rem, 100px); // 1px
69
+ /// @debug convert-rem2px(100rem); // 1600px
70
+ /// @example scss - Отрицательные значения
71
+ /// @debug convert-rem2px(-1rem); // -16px
72
+ /// @debug convert-rem2px(-0.5rem); // -8px
73
+ /// @debug convert-rem2px(-1.5rem); // -24px
74
+ /// @debug convert-rem2px(-2rem, 8px); // -16px
75
+ /// @example scss - Безразмерные числа как аргументы
76
+ /// @debug convert-rem2px(1, 16); // 16px (без единиц, но работает)
77
+ /// @debug convert-rem2px(0.5, 16); // 8px
78
+ /// @debug convert-rem2px(1.5, 16); // 24px
79
+ /// @example scss - Обратное преобразование (round-trip)
80
+ /// // Прямое и обратное преобразование должно давать исходное значение
81
+ /// $original-px: 24px;
82
+ /// $converted-rem: math.div($original-px, 16px); // 1.5rem
83
+ /// $restored-px: convert-rem2px($converted-rem); // 24px
84
+ /// @debug $original-px == $restored-px; // true
85
+ ///
86
+ /// // С кастомной базой
87
+ /// $base: 20px;
88
+ /// $original-px: 30px;
89
+ /// $converted-rem: math.div($original-px, $base); // 1.5rem
90
+ /// $restored-px: convert-rem2px($converted-rem, $base); // 30px
91
+ /// @example scss - Использование в реальных сценариях
92
+ /// // Расчет точных размеров для фиксированных элементов
93
+ /// $spacing-small: convert-rem2px(0.5rem); // 8px
94
+ /// $spacing-medium: convert-rem2px(1rem); // 16px
95
+ /// $spacing-large: convert-rem2px(1.5rem); // 24px
96
+ ///
97
+ /// // Для обеспечения обратной совместимости
98
+ /// .legacy-element {
99
+ /// // Старый код использует px, новый использует rem
100
+ /// padding: convert-rem2px(1rem); // 16px для обратной совместимости
101
+ /// font-size: convert-rem2px(1.125rem); // 18px
102
+ /// }
103
+ ///
104
+ /// // Для медиа-запросов, где нужны точные пиксели
105
+ /// $breakpoint: convert-rem2px(48rem); // 768px (если база 16px)
106
+ /// @media (min-width: $breakpoint) {
107
+ /// .container { max-width: convert-rem2px(75rem); } // 1200px
108
+ /// }
109
+ ///
110
+ /// // Для кастомной типографической базы
111
+ /// $base-font-size: 20px;
112
+ /// .heading {
113
+ /// // Получаем точный размер в пикселях из относительного
114
+ /// font-size: convert-rem2px(1.2rem, $base-font-size); // 24px
115
+ /// line-height: convert-rem2px(1.8rem, $base-font-size); // 36px
116
+ /// }
117
+ /// @example css - Результат
118
+ /// .legacy-element {
119
+ /// padding: 16px;
120
+ /// font-size: 18px;
121
+ /// }
122
+ ///
123
+ /// @media (min-width: 768px) {
124
+ /// .container {
125
+ /// max-width: 1200px;
126
+ /// }
127
+ /// }
128
+ /// .heading {
129
+ /// font-size: 24px;
130
+ /// line-height: 36px;
131
+ /// }
132
+ /// @param {Number} $rem - Значение в единицах `rem` для
133
+ /// конвертации. Может быть целым или дробным числом,
134
+ /// положительным или отрицательным. Единицы измерения
135
+ /// (`rem`) удаляются для расчета, но ожидается, что
136
+ /// значение изначально выражено в rem.
137
+ /// @param {Number} $base [16px] - Базовый размер в пикселях
138
+ /// для расчета. По умолчанию используется 16px, что
139
+ /// соответствует стандартному размеру шрифта в большинстве
140
+ /// браузеров. Может быть любым положительным числом
141
+ /// (обычно в пикселях).
142
+ /// @return {Number} - Значение в единицах `px`, рассчитанное
143
+ /// по формуле: `($rem * $base) * 1px`. Возвращает дробное
144
+ /// или целое число с единицами измерения `px`.
145
+ /// @throws {Error} - Может выбросить ошибку при передаче
146
+ /// нечисловых значений. Для корректной работы оба аргумента
147
+ /// должны быть числами.
148
+ @function convert-rem2px($rem, $base: 16px) {
149
+
150
+ // Проверка типа первого параметра: ожидается числовое
151
+ // значение в rem.
152
+ @if not is-number($rem) {
153
+
154
+ // Если $rem не является числом, возвращаем ошибку через
155
+ // стандартную функцию логирования. Это предотвращает
156
+ // некорректные вычисления с нечисловыми данными.
157
+ @return log-invalid-type(
158
+ 'convert-rem2px',
159
+ $rem,
160
+ '$rem',
161
+ 'number'
162
+ );
163
+
164
+ }
165
+
166
+ // Проверка типа второго параметра: ожидается числовое
167
+ // значение базового размера.
168
+ @else if not is-number($base) {
169
+
170
+ // Если $base не является числом, возвращаем ошибку.
171
+ // Проверка выполняется только если $rem прошел валидацию.
172
+ @return log-invalid-type(
173
+ 'convert-rem2px',
174
+ $base,
175
+ '$base',
176
+ 'number'
177
+ );
178
+
179
+ }
180
+
181
+ // Оба параметра прошли валидацию - выполняем конвертацию.
182
+ @else {
183
+
184
+ // Формула конвертации: px = rem × базовый_размер_шрифта.
185
+ //
186
+ // Алгоритм вычислений:
187
+ // 1. number-strip-unit($rem) - удаляем единицу измерения
188
+ // 'rem' из первого значения
189
+ // Пример: 1.5rem → 1.5 (число без единиц)
190
+ // 2. number-strip-unit($base) - удаляем единицу измерения
191
+ // из базового размера
192
+ // Пример: 16px → 16 (число без единиц)
193
+ // 3. Умножаем оба безразмерных числа: (число rem) × (базовый
194
+ // размер)
195
+ // Пример: 1.5 × 16 = 24
196
+ // 4. Умножаем результат на 1px для добавления единицы
197
+ // измерения пикселей
198
+ // Пример: 24 × 1px = 24px
199
+ //
200
+ // Важно: функция предполагает, что $base передается в
201
+ // пикселях. Если $base будет в других единицах, результат
202
+ // будет неожиданным.
203
+ @return number-strip-unit($rem) * number-strip-unit($base) * 1px;
204
+
205
+ }
206
+
207
+ }