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