@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,172 @@
|
|
|
1
|
+
/// Денормализует число из единичного интервала [0, 1] в
|
|
2
|
+
/// исходный диапазон.
|
|
3
|
+
///
|
|
4
|
+
/// Функция выполняет обратное линейное преобразование числа
|
|
5
|
+
/// из нормализованного диапазона `[0, 1]` обратно в исходный
|
|
6
|
+
/// диапазон `[$min, $max]`. Это операция, обратная функции
|
|
7
|
+
/// `number-normalize()`, и восстанавливает исходное значение
|
|
8
|
+
/// после нормализации.
|
|
9
|
+
///
|
|
10
|
+
/// Математическая формула:
|
|
11
|
+
/// - `denormalized = value * (max - min) + min`
|
|
12
|
+
///
|
|
13
|
+
/// Свойства результата:
|
|
14
|
+
/// - Если `value = 0` → возвращает `min`
|
|
15
|
+
/// - Если `value = 1` → возвращает `max`
|
|
16
|
+
/// - Если `value = 0.5` → возвращает значение посередине
|
|
17
|
+
/// между `min` и `max`
|
|
18
|
+
/// - Если `value` находится вне [0, 1] → выполняет
|
|
19
|
+
/// экстраполяцию
|
|
20
|
+
///
|
|
21
|
+
/// Важные особенности функции:
|
|
22
|
+
/// - Выполняет обратное преобразование к `number-normalize()`
|
|
23
|
+
/// - Восстанавливает исходные единицы измерения, если они были
|
|
24
|
+
/// - Работает с любыми числовыми значениями
|
|
25
|
+
/// - Поддерживает экстраполяцию для значений вне [0, 1]
|
|
26
|
+
/// - Сохраняет линейное соответствие между диапазонами
|
|
27
|
+
/// - Основная операция для интерполяции и ремаппинга значений
|
|
28
|
+
///
|
|
29
|
+
/// > Эта функция является точной обратной операцией к
|
|
30
|
+
/// > `number-normalize()`. Для любого значения `x` в диапазоне
|
|
31
|
+
/// > `[$min, $max]` выполняется тождество:
|
|
32
|
+
/// > `number-denormalize(number-normalize(x, $min, $max), $min, $max) == x`.
|
|
33
|
+
/// > Функция также поддерживает экстраполяцию для значений
|
|
34
|
+
/// > вне диапазона [0, 1], что полезно для выхода за пределы
|
|
35
|
+
/// > исходного диапазона или для работы с выбросами.
|
|
36
|
+
/// ---
|
|
37
|
+
/// @name number-denormalize
|
|
38
|
+
/// @group utilities-helpers
|
|
39
|
+
/// @since 2025.12.27
|
|
40
|
+
/// @access public
|
|
41
|
+
/// @author Murad Rustamov (therteenten)
|
|
42
|
+
/// @link https://sourcecraft.dev/users/therteenten/overview SourceCraft - therteenten
|
|
43
|
+
/// @link https://sourcecraft.dev/omnisass/library SourceCraft - OmniSass
|
|
44
|
+
/// @link https://sass-lang.com/documentation/values/numbers См. также: Официальная документация Sass - Тип данных "Числа"
|
|
45
|
+
/// @link https://sass-lang.com/documentation/modules/math См. также: Официальная документация Sass - Модуль math
|
|
46
|
+
/// @link https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Values_and_Units См. также: MDN Web Docs - CSS значения и единицы измерения
|
|
47
|
+
/// @link https://css-tricks.com/snippets/sass/ См. также: CSS-Tricks - Коллекция сниппетов Sass
|
|
48
|
+
/// @link https://sass-guidelin.es/ru/#section-41 См. также: Sass Guidelines - Раздел про математические операции
|
|
49
|
+
/// @example scss - Базовая денормализация
|
|
50
|
+
/// @debug number-denormalize(0.5, 0, 100); // 50
|
|
51
|
+
/// @debug number-denormalize(0.25, 0, 100); // 25
|
|
52
|
+
/// @debug number-denormalize(0.75, 0, 100); // 75
|
|
53
|
+
/// @debug number-denormalize(0, 0, 100); // 0
|
|
54
|
+
/// @debug number-denormalize(1, 0, 100); // 100
|
|
55
|
+
/// @example scss - Обратное преобразование (round-trip)
|
|
56
|
+
/// // Доказательство корректности: денормализация нормализованного значения
|
|
57
|
+
/// // должна давать исходное значение
|
|
58
|
+
/// $original: 42;
|
|
59
|
+
/// $normalized: math.div($original - 0, 100 - 0); // 0.42
|
|
60
|
+
/// $denormalized: number-denormalize($normalized, 0, 100); // 42
|
|
61
|
+
/// @debug $original == $denormalized; // true
|
|
62
|
+
///
|
|
63
|
+
/// // С нестандартным диапазоном
|
|
64
|
+
/// $original: 35;
|
|
65
|
+
/// $normalized: math.div($original - 10, 50 - 10); // 0.625
|
|
66
|
+
/// $denormalized: number-denormalize($normalized, 10, 50); // 35
|
|
67
|
+
/// @debug $original == $denormalized; // true
|
|
68
|
+
/// @example scss - Нестандартные диапазоны
|
|
69
|
+
/// @debug number-denormalize(0.5, 10, 50); // 30
|
|
70
|
+
/// @debug number-denormalize(0.25, 10, 50); // 20
|
|
71
|
+
/// @debug number-denormalize(0.75, 10, 50); // 40
|
|
72
|
+
/// @debug number-denormalize(0, 10, 50); // 10
|
|
73
|
+
/// @debug number-denormalize(1, 10, 50); // 50
|
|
74
|
+
/// @example scss - Отрицательные диапазоны
|
|
75
|
+
/// @debug number-denormalize(0.5, -100, 0); // -50
|
|
76
|
+
/// @debug number-denormalize(0.25, -100, 0); // -75
|
|
77
|
+
/// @debug number-denormalize(0.75, -100, 0); // -25
|
|
78
|
+
/// @debug number-denormalize(0, -100, 0); // -100
|
|
79
|
+
/// @debug number-denormalize(1, -100, 0); // 0
|
|
80
|
+
/// @example scss - Смешанные положительные/отрицательные
|
|
81
|
+
/// @debug number-denormalize(0.5, -50, 50); // 0
|
|
82
|
+
/// @debug number-denormalize(0.25, -50, 50); // -25
|
|
83
|
+
/// @debug number-denormalize(0.75, -50, 50); // 25
|
|
84
|
+
/// @debug number-denormalize(0, -50, 50); // -50
|
|
85
|
+
/// @debug number-denormalize(1, -50, 50); // 50
|
|
86
|
+
/// @example scss - Дробные нормализованные значения
|
|
87
|
+
/// @debug number-denormalize(0.314, 0, 10); // 3.14
|
|
88
|
+
/// @debug number-denormalize(0.1618, 0, 10); // 1.6179999999999999
|
|
89
|
+
/// @debug number-denormalize(0.8675, 0, 10); // 8.675
|
|
90
|
+
/// @debug number-denormalize(0.12345, 0, 1); // 0.12345
|
|
91
|
+
/// @debug number-denormalize(0.98765, 0, 1); // 0.98765
|
|
92
|
+
/// @example scss - Маленькие диапазоны
|
|
93
|
+
/// @debug number-denormalize(0.5, 1, 2); // 1.5
|
|
94
|
+
/// @debug number-denormalize(0.25, 1, 2); // 1.25
|
|
95
|
+
/// @debug number-denormalize(0.75, 1, 2); // 1.75
|
|
96
|
+
/// @debug number-denormalize(0.1, 1, 2); // 1.1
|
|
97
|
+
/// @debug number-denormalize(0.9, 1, 2); // 1.9
|
|
98
|
+
/// @example scss - Большие диапазоны
|
|
99
|
+
/// @debug number-denormalize(0.5, 0, 10000); // 5000
|
|
100
|
+
/// @debug number-denormalize(0.25, 0, 10000); // 2500
|
|
101
|
+
/// @debug number-denormalize(0.75, 0, 10000); // 7500
|
|
102
|
+
/// @debug number-denormalize(0.01, 0, 10000); // 100
|
|
103
|
+
/// @debug number-denormalize(0.99, 0, 10000); // 9900
|
|
104
|
+
/// @example scss - Экстраполяция (значения вне [0, 1])
|
|
105
|
+
/// @debug number-denormalize(-0.1, 0, 100); // -10
|
|
106
|
+
/// @debug number-denormalize(1.1, 0, 100); // 110.00000000000001
|
|
107
|
+
/// @debug number-denormalize(1.5, 0, 100); // 150
|
|
108
|
+
/// @debug number-denormalize(-0.5, 0, 100); // -50
|
|
109
|
+
/// @debug number-denormalize(2.0, 0, 100); // 200
|
|
110
|
+
/// @example scss - Восстановление единиц измерения
|
|
111
|
+
/// @debug number-denormalize(0.25, 0px, 100px); // 25px
|
|
112
|
+
/// @debug number-denormalize(0.5, 0px, 100px); // 50px
|
|
113
|
+
/// @debug number-denormalize(0.75, 0px, 100px); // 75px
|
|
114
|
+
/// @debug number-denormalize(0, 0px, 100px); // 0px
|
|
115
|
+
/// @debug number-denormalize(1, 0px, 100px); // 100px
|
|
116
|
+
/// @example scss - Разные единицы измерения
|
|
117
|
+
/// @debug number-denormalize(0.5, 0rem, 2rem); // 1rem
|
|
118
|
+
/// @debug number-denormalize(0.75, 0rem, 2rem); // 1.5rem
|
|
119
|
+
/// @debug number-denormalize(0.25, 0rem, 2rem); // 0.5rem
|
|
120
|
+
/// @debug number-denormalize(0, 0rem, 2rem); // 0rem
|
|
121
|
+
/// @debug number-denormalize(1, 0rem, 2rem); // 2rem
|
|
122
|
+
/// @example scss - Процентные диапазоны
|
|
123
|
+
/// @debug number-denormalize(0.5, 0%, 100%); // 50%
|
|
124
|
+
/// @debug number-denormalize(0.25, 0%, 100%); // 25%
|
|
125
|
+
/// @debug number-denormalize(0.75, 0%, 100%); // 75%
|
|
126
|
+
/// @debug number-denormalize(0, 0%, 100%); // 0%
|
|
127
|
+
/// @debug number-denormalize(1, 0%, 100%); // 100%
|
|
128
|
+
/// @example scss - Нецелочисленные границы
|
|
129
|
+
/// @debug number-denormalize(0.5, 1.5, 5.5); // 3.5
|
|
130
|
+
/// @debug number-denormalize(0.25, 1.5, 5.5); // 2.5
|
|
131
|
+
/// @debug number-denormalize(0.75, 1.5, 5.5); // 4.5
|
|
132
|
+
/// @debug number-denormalize(0, 1.5, 5.5); // 1.5
|
|
133
|
+
/// @debug number-denormalize(1, 1.5, 5.5); // 5.5
|
|
134
|
+
/// @example scss - Очень малые нормализованные значения
|
|
135
|
+
/// @debug number-denormalize(0.5, 0, 1); // 0.5
|
|
136
|
+
/// @debug number-denormalize(0.25, 0, 1); // 0.25
|
|
137
|
+
/// @debug number-denormalize(0.75, 0, 1); // 0.75
|
|
138
|
+
/// @debug number-denormalize(0.001, 0, 1); // 0.001
|
|
139
|
+
/// @debug number-denormalize(0.999, 0, 1); // 0.999
|
|
140
|
+
/// @example scss - Симметричные диапазоны
|
|
141
|
+
/// @debug number-denormalize(0.5, -1, 1); // 0
|
|
142
|
+
/// @debug number-denormalize(0.75, -1, 1); // 0.5
|
|
143
|
+
/// @debug number-denormalize(0.25, -1, 1); // -0.5
|
|
144
|
+
/// @debug number-denormalize(1, -1, 1); // 1
|
|
145
|
+
/// @debug number-denormalize(0, -1, 1); // -1
|
|
146
|
+
/// @example scss - Инверсная проверка
|
|
147
|
+
/// // Для любого x в [min, max] должно выполняться:
|
|
148
|
+
/// // number-denormalize(number-normalize(x, min, max), min, max) == x
|
|
149
|
+
/// @debug number-denormalize(number-normalize(30, 10, 50), 10, 50); // 30
|
|
150
|
+
/// @debug number-denormalize(number-normalize(-25, -50, 50), -50, 50); // -25
|
|
151
|
+
/// @debug number-denormalize(number-normalize(7.5, 0, 10), 0, 10); // 7.5
|
|
152
|
+
/// @debug number-denormalize(number-normalize(75%, 0%, 100%), 0%, 100%); // 75%
|
|
153
|
+
/// @debug number-denormalize(number-normalize(1.75, 1, 2), 1, 2); // 1.75
|
|
154
|
+
/// @param {Number} $value - Нормализованное значение в
|
|
155
|
+
/// диапазоне [0, 1]. Обычно полученное с помощью
|
|
156
|
+
/// `number-normalize()`. Может быть любым числом, включая
|
|
157
|
+
/// значения вне [0, 1] для экстраполяции.
|
|
158
|
+
/// @param {Number} $min - Нижняя граница целевого диапазона.
|
|
159
|
+
/// Значение, соответствующее `0` в нормализованном диапазоне.
|
|
160
|
+
/// @param {Number} $max - Верхняя граница целевого диапазона.
|
|
161
|
+
/// Значение, соответствующее `1` в нормализованном диапазоне.
|
|
162
|
+
/// @return {Number} - Денормализованное значение в целевом
|
|
163
|
+
/// диапазоне. Восстанавливает исходные единицы измерения
|
|
164
|
+
/// из `$min` и `$max`. Для `$value` в [0, 1] результат
|
|
165
|
+
/// будет в диапазоне `[$min, $max]`. Для значений вне [0, 1]
|
|
166
|
+
/// выполняет линейную экстраполяцию.
|
|
167
|
+
/// @throws Не выбрасывает ошибок, безопасно обрабатывает все
|
|
168
|
+
/// числовые значения. Формула математически корректна для
|
|
169
|
+
/// любых числовых аргументов.
|
|
170
|
+
@function number-denormalize($value, $min, $max) {
|
|
171
|
+
@return $value * ($max - $min) + $min;
|
|
172
|
+
}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
@use 'sass:list';
|
|
2
|
+
|
|
3
|
+
/// Генерирует последовательность чисел Фибоначчи.
|
|
4
|
+
///
|
|
5
|
+
/// Функция `number-fibonacci()` создает упорядоченный
|
|
6
|
+
/// список первых `$n` чисел последовательности Фибоначчи,
|
|
7
|
+
/// начиная с 1. Последовательность Фибоначчи — это ряд
|
|
8
|
+
/// чисел, где каждое последующее число является суммой двух
|
|
9
|
+
/// предыдущих: 1, 1, 2, 3, 5, 8, 13, 21, ...
|
|
10
|
+
///
|
|
11
|
+
/// Эта функция реализует классическую итеративную версию
|
|
12
|
+
/// генерации чисел Фибоначчи с линейной сложностью O(n).
|
|
13
|
+
/// Результат всегда начинается с 1 и включает ровно `$n`
|
|
14
|
+
/// первых чисел последовательности.
|
|
15
|
+
///
|
|
16
|
+
/// Числа Фибоначчи широко используются в дизайне, типографике,
|
|
17
|
+
/// создании гармоничных пропорций и масштабируемых систем:
|
|
18
|
+
/// - Золотое сечение (φ ≈ 1.618)
|
|
19
|
+
/// - Модульные сетки и композиция
|
|
20
|
+
/// - Шкалы размеров и отступов
|
|
21
|
+
/// - Анимации с естественным ускорением
|
|
22
|
+
///
|
|
23
|
+
/// > Числа Фибоначчи растут экспоненциально: `F(n) ≈ φ^n / √5`.
|
|
24
|
+
/// > Уже на 50-м числе значение превышает 12 миллионов.
|
|
25
|
+
/// ---
|
|
26
|
+
/// @name number-fibonacci
|
|
27
|
+
/// @group utilities-helpers
|
|
28
|
+
/// @since 2025.12.28
|
|
29
|
+
/// @access public
|
|
30
|
+
/// @author Murad Rustamov (therteenten)
|
|
31
|
+
/// @link https://sourcecraft.dev/users/therteenten/overview SourceCraft - therteenten
|
|
32
|
+
/// @link https://sourcecraft.dev/omnisass/library SourceCraft - OmniSass
|
|
33
|
+
/// @link https://sass-lang.com/documentation/modules/list См. также: Sass - Модуль list
|
|
34
|
+
/// @link https://sass-lang.com/documentation/at-rules/control/#for См. также: Sass - Циклы @for
|
|
35
|
+
/// @link https://ru.wikipedia.org/wiki/Числа_Фибоначчи См. также: Википедия - Числа Фибоначчи
|
|
36
|
+
/// @link https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Grid_Layout См. также: MDN - CSS Grid Layout
|
|
37
|
+
/// @link https://www.smashingmagazine.com/2008/05/applying-mathematics-to-web-design/ См. также: Smashing Magazine - Математика в веб-дизайне
|
|
38
|
+
/// @link https://www.w3.org/TR/css-values-4/#numeric-types См. также: W3C - Числовые типы CSS
|
|
39
|
+
/// @example scss - Генерация базовой последовательности Фибоначчи
|
|
40
|
+
/// @use 'sass:list';
|
|
41
|
+
///
|
|
42
|
+
/// $fibonacci: number-fibonacci(8);
|
|
43
|
+
/// // Возвращает: (1, 1, 2, 3, 5, 8, 13, 21)
|
|
44
|
+
///
|
|
45
|
+
/// @each $number in $fibonacci {
|
|
46
|
+
/// .scale-#{$number} {
|
|
47
|
+
/// font-size: #{$number * 4}px;
|
|
48
|
+
/// line-height: 1.2;
|
|
49
|
+
/// }
|
|
50
|
+
/// }
|
|
51
|
+
/// @example css - Результат
|
|
52
|
+
/// .scale-1 {
|
|
53
|
+
/// font-size: 4px;
|
|
54
|
+
/// line-height: 1.2;
|
|
55
|
+
/// }
|
|
56
|
+
/// .scale-1 {
|
|
57
|
+
/// font-size: 4px;
|
|
58
|
+
/// line-height: 1.2;
|
|
59
|
+
/// }
|
|
60
|
+
/// .scale-2 {
|
|
61
|
+
/// font-size: 8px;
|
|
62
|
+
/// line-height: 1.2;
|
|
63
|
+
/// }
|
|
64
|
+
/// .scale-3 {
|
|
65
|
+
/// font-size: 12px;
|
|
66
|
+
/// line-height: 1.2;
|
|
67
|
+
/// }
|
|
68
|
+
/// .scale-5 {
|
|
69
|
+
/// font-size: 20px;
|
|
70
|
+
/// line-height: 1.2;
|
|
71
|
+
/// }
|
|
72
|
+
/// .scale-8 {
|
|
73
|
+
/// font-size: 32px;
|
|
74
|
+
/// line-height: 1.2;
|
|
75
|
+
/// }
|
|
76
|
+
/// .scale-13 {
|
|
77
|
+
/// font-size: 52px;
|
|
78
|
+
/// line-height: 1.2;
|
|
79
|
+
/// }
|
|
80
|
+
/// .scale-21 {
|
|
81
|
+
/// font-size: 84px;
|
|
82
|
+
/// line-height: 1.2;
|
|
83
|
+
/// }
|
|
84
|
+
/// @example scss - Создание пропорциональной сетки на основе Фибоначчи
|
|
85
|
+
/// @use 'sass:list';
|
|
86
|
+
/// @use 'sass:math';
|
|
87
|
+
///
|
|
88
|
+
/// $fib-grid: number-fibonacci(6);
|
|
89
|
+
/// // Возвращает: (1, 1, 2, 3, 5, 8)
|
|
90
|
+
///
|
|
91
|
+
/// .container {
|
|
92
|
+
/// display: grid;
|
|
93
|
+
/// grid-template-columns: repeat(#{list.length($fib-grid)}, 1fr);
|
|
94
|
+
/// gap: 1rem;
|
|
95
|
+
/// }
|
|
96
|
+
///
|
|
97
|
+
/// @for $i from 1 through list.length($fib-grid) {
|
|
98
|
+
/// $fib-value: list.nth($fib-grid, $i);
|
|
99
|
+
/// .cell-#{$i} {
|
|
100
|
+
/// grid-column: span $fib-value;
|
|
101
|
+
/// padding: #{$fib-value * 0.5}rem;
|
|
102
|
+
/// }
|
|
103
|
+
/// }
|
|
104
|
+
/// @example css - Результат
|
|
105
|
+
/// .container {
|
|
106
|
+
/// display: grid;
|
|
107
|
+
/// grid-template-columns: repeat(6, 1fr);
|
|
108
|
+
/// gap: 1rem;
|
|
109
|
+
/// }
|
|
110
|
+
/// .cell-1 {
|
|
111
|
+
/// grid-column: span 1;
|
|
112
|
+
/// padding: 0.5rem;
|
|
113
|
+
/// }
|
|
114
|
+
/// .cell-2 {
|
|
115
|
+
/// grid-column: span 1;
|
|
116
|
+
/// padding: 0.5rem;
|
|
117
|
+
/// }
|
|
118
|
+
/// .cell-3 {
|
|
119
|
+
/// grid-column: span 2;
|
|
120
|
+
/// padding: 1rem;
|
|
121
|
+
/// }
|
|
122
|
+
/// .cell-4 {
|
|
123
|
+
/// grid-column: span 3;
|
|
124
|
+
/// padding: 1.5rem;
|
|
125
|
+
/// }
|
|
126
|
+
/// .cell-5 {
|
|
127
|
+
/// grid-column: span 5;
|
|
128
|
+
/// padding: 2.5rem;
|
|
129
|
+
/// }
|
|
130
|
+
/// .cell-6 {
|
|
131
|
+
/// grid-column: span 8;
|
|
132
|
+
/// padding: 4rem;
|
|
133
|
+
/// }
|
|
134
|
+
/// @example scss - Генерация гармоничных отступов по Фибоначчи
|
|
135
|
+
/// @use 'sass:list';
|
|
136
|
+
///
|
|
137
|
+
/// :root {
|
|
138
|
+
/// $fibonacci-spacing: number-fibonacci(7);
|
|
139
|
+
/// // Возвращает: (1, 1, 2, 3, 5, 8, 13)
|
|
140
|
+
///
|
|
141
|
+
/// @for $i from 1 through list.length($fibonacci-spacing) {
|
|
142
|
+
/// $value: list.nth($fibonacci-spacing, $i);
|
|
143
|
+
/// --space-#{$i}: #{$value * 0.25}rem;
|
|
144
|
+
/// }
|
|
145
|
+
/// }
|
|
146
|
+
/// @example css - Результат
|
|
147
|
+
/// :root {
|
|
148
|
+
/// --space-1: 0.25rem;
|
|
149
|
+
/// --space-2: 0.25rem;
|
|
150
|
+
/// --space-3: 0.5rem;
|
|
151
|
+
/// --space-4: 0.75rem;
|
|
152
|
+
/// --space-5: 1.25rem;
|
|
153
|
+
/// --space-6: 2rem;
|
|
154
|
+
/// --space-7: 3.25rem;
|
|
155
|
+
/// }
|
|
156
|
+
/// @example scss - Анимация с естественным ускорением по Фибоначчи
|
|
157
|
+
/// @use 'sass:list';
|
|
158
|
+
///
|
|
159
|
+
/// $timing-steps: number-fibonacci(6);
|
|
160
|
+
/// // Возвращает: (1, 1, 2, 3, 5, 8)
|
|
161
|
+
///
|
|
162
|
+
/// @keyframes natural-slide {
|
|
163
|
+
/// @for $i from 1 through list.length($timing-steps) {
|
|
164
|
+
/// $step: $i - 1;
|
|
165
|
+
/// $fib-value: list.nth($timing-steps, $i);
|
|
166
|
+
/// $percentage: math.div($step * 100, list.length($timing-steps) - 1);
|
|
167
|
+
///
|
|
168
|
+
/// #{$percentage}% {
|
|
169
|
+
/// transform: translateX(#{$fib-value * 10}px);
|
|
170
|
+
/// animation-timing-function: cubic-bezier(0.25, 0.1, 0.25, 1);
|
|
171
|
+
/// }
|
|
172
|
+
/// }
|
|
173
|
+
/// }
|
|
174
|
+
///
|
|
175
|
+
/// .element {
|
|
176
|
+
/// animation: natural-slide 2s infinite;
|
|
177
|
+
/// }
|
|
178
|
+
/// @example css - Результат
|
|
179
|
+
/// @keyframes natural-slide {
|
|
180
|
+
/// 0% {
|
|
181
|
+
/// transform: translateX(10px);
|
|
182
|
+
/// animation-timing-function: cubic-bezier(0.25, 0.1, 0.25, 1);
|
|
183
|
+
/// }
|
|
184
|
+
/// 20% {
|
|
185
|
+
/// transform: translateX(10px);
|
|
186
|
+
/// animation-timing-function: cubic-bezier(0.25, 0.1, 0.25, 1);
|
|
187
|
+
/// }
|
|
188
|
+
/// 40% {
|
|
189
|
+
/// transform: translateX(20px);
|
|
190
|
+
/// animation-timing-function: cubic-bezier(0.25, 0.1, 0.25, 1);
|
|
191
|
+
/// }
|
|
192
|
+
/// 60% {
|
|
193
|
+
/// transform: translateX(30px);
|
|
194
|
+
/// animation-timing-function: cubic-bezier(0.25, 0.1, 0.25, 1);
|
|
195
|
+
/// }
|
|
196
|
+
/// 80% {
|
|
197
|
+
/// transform: translateX(50px);
|
|
198
|
+
/// animation-timing-function: cubic-bezier(0.25, 0.1, 0.25, 1);
|
|
199
|
+
/// }
|
|
200
|
+
/// 100% {
|
|
201
|
+
/// transform: translateX(80px);
|
|
202
|
+
/// animation-timing-function: cubic-bezier(0.25, 0.1, 0.25, 1);
|
|
203
|
+
/// }
|
|
204
|
+
/// }
|
|
205
|
+
/// .element {
|
|
206
|
+
/// animation: natural-slide 2s infinite;
|
|
207
|
+
/// }
|
|
208
|
+
/// @param {Number} $n - Количество чисел Фибоначчи для генерации.
|
|
209
|
+
/// Определяет длину возвращаемой последовательности.
|
|
210
|
+
/// Должно быть положительным целым числом больше 0.
|
|
211
|
+
/// Для больших значений (n > 40) может вызвать переполнение
|
|
212
|
+
/// из-за экспоненциального роста чисел.
|
|
213
|
+
/// @return {List} - Упорядоченный список (list) чисел Фибоначчи, где:
|
|
214
|
+
/// - Количество элементов: ровно `$n`
|
|
215
|
+
/// - Первый элемент: всегда 1
|
|
216
|
+
/// - Второй элемент: всегда 1 (если `$n > 1`)
|
|
217
|
+
/// - Каждый последующий элемент: сумма двух предыдущих
|
|
218
|
+
/// - Все элементы: целые положительные числа
|
|
219
|
+
@function number-fibonacci($n) {
|
|
220
|
+
$-result: ();
|
|
221
|
+
$-a: 0;
|
|
222
|
+
$-b: 1;
|
|
223
|
+
|
|
224
|
+
@for $i from 1 through $n {
|
|
225
|
+
|
|
226
|
+
$-result: list.append($-result, $-b);
|
|
227
|
+
$-temp: $-a + $-b;
|
|
228
|
+
$-a: $-b;
|
|
229
|
+
$-b: $-temp;
|
|
230
|
+
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
@return $-result;
|
|
234
|
+
|
|
235
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
@use 'sass:math';
|
|
2
|
+
|
|
3
|
+
/// Округляет число вниз до ближайшего кратного значения.
|
|
4
|
+
///
|
|
5
|
+
/// Функция выполняет округление числа вниз (в сторону
|
|
6
|
+
/// отрицательной бесконечности) до ближайшего значения,
|
|
7
|
+
/// кратного указанному числу.
|
|
8
|
+
///
|
|
9
|
+
/// Используется для выравнивания значений по сетке или
|
|
10
|
+
/// заданному шагу, гарантируя, что результат не превысит
|
|
11
|
+
/// исходное значение.
|
|
12
|
+
///
|
|
13
|
+
/// Важные особенности функции:
|
|
14
|
+
/// - Всегда округляет вниз (в сторону уменьшения)
|
|
15
|
+
/// - Работает с положительными и отрицательными числами
|
|
16
|
+
/// - Сохраняет единицы измерения исходного числа
|
|
17
|
+
/// - Использует `math.floor()` для округления вниз
|
|
18
|
+
/// - Поддерживает дробные значения для `$nearest`
|
|
19
|
+
/// - Использует математически корректное деление через
|
|
20
|
+
/// `math.div()`
|
|
21
|
+
/// ---
|
|
22
|
+
/// @name number-floor-to
|
|
23
|
+
/// @group utilities-helpers
|
|
24
|
+
/// @since 2025.12.27
|
|
25
|
+
/// @access public
|
|
26
|
+
/// @author Murad Rustamov (therteenten)
|
|
27
|
+
/// @link https://sourcecraft.dev/users/therteenten/overview SourceCraft - therteenten
|
|
28
|
+
/// @link https://sourcecraft.dev/omnisass/library SourceCraft - OmniSass
|
|
29
|
+
/// @link https://sass-lang.com/documentation/modules/math#floor См. также: Официальная документация Sass - Функция math.floor()
|
|
30
|
+
/// @link https://sass-lang.com/documentation/modules/math#div См. также: Официальная документация Sass - Функция math.div()
|
|
31
|
+
/// @link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/floor MDN Web Docs - Math.floor()
|
|
32
|
+
/// @link https://en.wikipedia.org/wiki/Floor_and_ceiling_functions См. также: Википедия - Функции пол и потолок
|
|
33
|
+
/// @link https://mathworld.wolfram.com/FloorFunction.html См. также: Wolfram MathWorld - Функция пол
|
|
34
|
+
/// @link https://www.britannica.com/science/floor-function См. также: Britannica - Функция пол в математике
|
|
35
|
+
/// @link https://www.khanacademy.org/math/algebra/x2f8bb11595b61c86:functions/x2f8bb11595b61c86:graphs-of-piecewise-linear-functions/v/floor-function См. также: Khan Academy - Функция пол
|
|
36
|
+
/// @link https://www.mathsisfun.com/sets/function-floor-ceiling.html См. также: Maths is Fun - Функции пол и потолок
|
|
37
|
+
/// @link https://css-tricks.com/snippets/sass/ См. также: CSS-Tricks - Коллекция сниппетов Sass
|
|
38
|
+
/// @link https://sass-guidelin.es/ru/#math-functions См. также: Sass Guidelines - Математические функции
|
|
39
|
+
/// @link https://frontender.info/sass-numbers/ См. также: Frontender Magazine - Работа с числами в Sass
|
|
40
|
+
/// @link https://www.w3schools.com/sass/sass_functions_numeric.php См. также: W3Schools - Числовые функции в Sass
|
|
41
|
+
/// @link https://habr.com/ru/post/247887/ См. также: Habr - Статья "Sass для верстальщика: числа и математика"
|
|
42
|
+
/// @example scss - Округление вниз до ближайшего кратного
|
|
43
|
+
/// @debug number-floor-to(13, 5); // 10
|
|
44
|
+
/// @debug number-floor-to(17, 10); // 10
|
|
45
|
+
/// @debug number-floor-to(23, 4); // 20
|
|
46
|
+
/// @debug number-floor-to(100, 50); // 100
|
|
47
|
+
/// @debug number-floor-to(101, 50); // 100
|
|
48
|
+
/// @example scss - Округление дробных чисел
|
|
49
|
+
/// @debug number-floor-to(12.3, 5); // 10
|
|
50
|
+
/// @debug number-floor-to(3.14, 1); // 3
|
|
51
|
+
/// @debug number-floor-to(7.89, 2.5); // 7.5
|
|
52
|
+
/// @debug number-floor-to(0.333, 0.25); // 0.25
|
|
53
|
+
/// @example scss - Округление отрицательных чисел
|
|
54
|
+
/// @debug number-floor-to(-13, 5); // -15
|
|
55
|
+
/// @debug number-floor-to(-17, 10); // -20
|
|
56
|
+
/// @debug number-floor-to(-23, 4); // -24
|
|
57
|
+
/// @debug number-floor-to(-3.5, 1); // -4
|
|
58
|
+
/// @example scss - Округление чисел с единицами измерения
|
|
59
|
+
/// @debug number-floor-to(13px, 5px); // 10px
|
|
60
|
+
/// @debug number-floor-to(1.7rem, 0.5rem); // 1.5rem
|
|
61
|
+
/// @debug number-floor-to(45%, 10%); // 40%
|
|
62
|
+
/// @debug number-floor-to(120deg, 90deg); // 90deg
|
|
63
|
+
/// @example scss - Практическое использование для гарантированного размера
|
|
64
|
+
/// $available-width: 287px;
|
|
65
|
+
/// $column-size: 70px;
|
|
66
|
+
/// $max-columns: math.div(number-floor-to($available-width, $column-size), $column-size);
|
|
67
|
+
/// // $max-columns: 4 (280px / 70px)
|
|
68
|
+
/// .grid {
|
|
69
|
+
/// grid-template-columns: repeat($max-columns, 1fr);
|
|
70
|
+
/// }
|
|
71
|
+
/// @example css - Результат
|
|
72
|
+
/// .grid {
|
|
73
|
+
/// grid-template-columns: repeat(4, 1fr);
|
|
74
|
+
/// }
|
|
75
|
+
/// @example scss - Практическое использование для бюджета
|
|
76
|
+
/// $budget: 1450;
|
|
77
|
+
/// $item-price: 300;
|
|
78
|
+
/// $max-items: math.div(number-floor-to($budget, $item-price), $item-price);
|
|
79
|
+
/// // $max-items: 4 (1200 / 300)
|
|
80
|
+
/// // Можно купить максимум 4 предмета, не превышая бюджет
|
|
81
|
+
/// @example scss - Практическое использование для времени
|
|
82
|
+
/// $total-seconds: 3675;
|
|
83
|
+
/// $minute: 60;
|
|
84
|
+
/// $full-minutes: number-floor-to($total-seconds, $minute);
|
|
85
|
+
/// // $full-minutes: 3660 секунд (61 минута)
|
|
86
|
+
/// .timer {
|
|
87
|
+
/// content: "#{math.div($full-minutes, $minute)} мин";
|
|
88
|
+
/// }
|
|
89
|
+
/// @example css - Результат
|
|
90
|
+
/// .timer {
|
|
91
|
+
/// content: "61 мин";
|
|
92
|
+
/// }
|
|
93
|
+
/// @example scss - Математическое применение для дискретизации
|
|
94
|
+
/// // Дискретизация непрерывного значения
|
|
95
|
+
/// $continuous-value: 7.8;
|
|
96
|
+
/// $quantization-step: 0.5;
|
|
97
|
+
/// $discrete-value: number-floor-to($continuous-value, $quantization-step);
|
|
98
|
+
/// // $discrete-value: 7.5
|
|
99
|
+
/// @param {Number} $value - Число для округления. Может быть
|
|
100
|
+
/// любым числом: положительным, отрицательным, целым,
|
|
101
|
+
/// дробным, с единицами измерения или без них.
|
|
102
|
+
/// @param {Number} $nearest - Кратное значение, до которого
|
|
103
|
+
/// нужно округлить. Определяет шаг округления. Может быть
|
|
104
|
+
/// дробным числом. Рекомендуется использовать те же единицы
|
|
105
|
+
/// измерения, что и у `$value`.
|
|
106
|
+
/// @return {Number} - Число, округленное вниз до ближайшего
|
|
107
|
+
/// значения, кратного `$nearest`. Сохраняет единицы
|
|
108
|
+
/// измерения исходного числа `$value`.
|
|
109
|
+
/// @throws {Error} - Может выбросить ошибку если `$value` или
|
|
110
|
+
/// `$nearest` не являются числами, или если происходит
|
|
111
|
+
/// деление на ноль.
|
|
112
|
+
@function number-floor-to($value, $nearest) {
|
|
113
|
+
@return math.floor(math.div($value, $nearest)) * $nearest;
|
|
114
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
@use 'sass:math';
|
|
2
|
+
@use 'sass:meta';
|
|
3
|
+
@use 'sass:string';
|
|
4
|
+
|
|
5
|
+
/// Форматирует число, добавляя разделители тысяч для улучшения
|
|
6
|
+
/// читаемости больших чисел.
|
|
7
|
+
///
|
|
8
|
+
/// Функция преобразует число в строку с разделителями тысяч,
|
|
9
|
+
/// используя указанный разделитель. Разделитель вставляется
|
|
10
|
+
/// между каждой группой из трех цифр, начиная справа (от
|
|
11
|
+
/// десятичной точки). Функция работает с целыми числами и
|
|
12
|
+
/// сохраняет знак отрицательных чисел.
|
|
13
|
+
///
|
|
14
|
+
/// Важные особенности функции:
|
|
15
|
+
/// - Работает только с целыми числами
|
|
16
|
+
/// - Поддерживает отрицательные числа
|
|
17
|
+
/// - Использует математический модуль `math.abs()` для
|
|
18
|
+
/// обработки знака
|
|
19
|
+
/// - Использует строковые функции `meta.inspect()`,
|
|
20
|
+
/// `string.length()` и `string.slice()`
|
|
21
|
+
/// - Разделитель вставляется между каждой группой из трех
|
|
22
|
+
/// цифр справа налево
|
|
23
|
+
/// - Использует локальные переменные с префиксом `$-` для
|
|
24
|
+
/// избежания конфликтов
|
|
25
|
+
/// ---
|
|
26
|
+
/// @name number-format-with-separator
|
|
27
|
+
/// @group utilities-helpers
|
|
28
|
+
/// @since 2025.12.27
|
|
29
|
+
/// @access public
|
|
30
|
+
/// @author Murad Rustamov (therteenten)
|
|
31
|
+
/// @link https://sourcecraft.dev/users/therteenten/overview SourceCraft - therteenten
|
|
32
|
+
/// @link https://sourcecraft.dev/omnisass/library SourceCraft - OmniSass
|
|
33
|
+
/// @link https://sass-lang.com/documentation/modules/math#abs См. также: Официальная документация Sass - Функция math.abs()
|
|
34
|
+
/// @link https://sass-lang.com/documentation/modules/string См. также: Официальная документация Sass - Строковые функции
|
|
35
|
+
/// @link https://sass-lang.com/documentation/breaking-changes/css-parser См. также: Официальная документация Sass - Функция inspect()
|
|
36
|
+
/// @link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toLocaleString MDN Web Docs - Number.toLocaleString()
|
|
37
|
+
/// @link https://css-tricks.com/snippets/sass/number-formatting-mixin/ CSS-Tricks - Миксин форматирования чисел
|
|
38
|
+
/// @example scss - Форматирование с разделителем по умолчанию (запятая)
|
|
39
|
+
/// @debug number-format-with-separator(1000); // "1,000"
|
|
40
|
+
/// @debug number-format-with-separator(1000000); // "1,000,000"
|
|
41
|
+
/// @debug number-format-with-separator(123456789); // "123,456,789"
|
|
42
|
+
/// @debug number-format-with-separator(42); // "42"
|
|
43
|
+
/// @debug number-format-with-separator(999); // "999"
|
|
44
|
+
/// @example scss - Форматирование с различными разделителями
|
|
45
|
+
/// @debug number-format-with-separator(1000, " "); // "1 000"
|
|
46
|
+
/// @debug number-format-with-separator(1000000, "."); // "1.000.000"
|
|
47
|
+
/// @debug number-format-with-separator(123456789, "'"); // "123'456'789"
|
|
48
|
+
/// @debug number-format-with-separator(987654, " "); // "987 654" (неразрывный пробел)
|
|
49
|
+
/// @example scss - Форматирование отрицательных чисел
|
|
50
|
+
/// @debug number-format-with-separator(-1000); // "-1,000"
|
|
51
|
+
/// @debug number-format-with-separator(-1234567); // "-1,234,567"
|
|
52
|
+
/// @debug number-format-with-separator(-42); // "-42"
|
|
53
|
+
/// @example scss - Практическое использование для цен и статистики
|
|
54
|
+
/// $population: 7812345;
|
|
55
|
+
/// $formatted-population: number-format-with-separator($population);
|
|
56
|
+
/// // $formatted-population: "7,812,345"
|
|
57
|
+
/// .city-stats::before {
|
|
58
|
+
/// content: "Население: #{$formatted-population} человек";
|
|
59
|
+
/// }
|
|
60
|
+
/// @example css - Результат
|
|
61
|
+
/// .city-stats::before {
|
|
62
|
+
/// content: "Население: 7,812,345 человек";
|
|
63
|
+
/// }
|
|
64
|
+
/// @example scss - Практическое использование с различными разделителями
|
|
65
|
+
/// $revenue: 1500000;
|
|
66
|
+
/// $formatted-revenue-eu: number-format-with-separator($revenue, " ");
|
|
67
|
+
/// $formatted-revenue-us: number-format-with-separator($revenue, ",");
|
|
68
|
+
/// // $formatted-revenue-eu: "1 500 000"
|
|
69
|
+
/// // $formatted-revenue-us: "1,500,000"
|
|
70
|
+
/// .revenue-eu::after {
|
|
71
|
+
/// content: "#{$formatted-revenue-eu} €";
|
|
72
|
+
/// }
|
|
73
|
+
/// .revenue-us::after {
|
|
74
|
+
/// content: "$#{$formatted-revenue-us}";
|
|
75
|
+
/// }
|
|
76
|
+
/// @example css - Результат
|
|
77
|
+
/// .revenue-eu::after {
|
|
78
|
+
/// content: "1 500 000 €";
|
|
79
|
+
/// }
|
|
80
|
+
/// .revenue-us::after {
|
|
81
|
+
/// content: "$1,500,000";
|
|
82
|
+
/// }
|
|
83
|
+
/// @param {Number} $value - Число для форматирования. Дробная
|
|
84
|
+
/// часть (если есть) будет игнорироваться, так как функция
|
|
85
|
+
/// работает только с целой частью числа. Поддерживает
|
|
86
|
+
/// отрицательные числа.
|
|
87
|
+
/// @param {String} $separator [","] - Строка-разделитель,
|
|
88
|
+
/// которая будет вставляться между группами из трех цифр.
|
|
89
|
+
/// По умолчанию используется запятая (","). Может быть
|
|
90
|
+
/// любым строковым символом или последовательностью символов.
|
|
91
|
+
/// @return {String} - Отформатированная строка с разделителями
|
|
92
|
+
/// тысяч. Отрицательные числа начинаются с минуса, дробная
|
|
93
|
+
/// часть исходного числа игнорируется.
|
|
94
|
+
/// @throws {Error} - Может выбросить ошибку если `$value`
|
|
95
|
+
/// не является числом или если `$separator` не является строкой.
|
|
96
|
+
@function number-format-with-separator($value, $separator: ",") {
|
|
97
|
+
|
|
98
|
+
$-result: "";
|
|
99
|
+
$-str: meta.inspect(math.abs($value));
|
|
100
|
+
$-length: string.length($-str);
|
|
101
|
+
$-counter: 0;
|
|
102
|
+
|
|
103
|
+
@for $i from $-length through 1 {
|
|
104
|
+
|
|
105
|
+
$char: string.slice($-str, $i, $i);
|
|
106
|
+
$-result: $char + $-result;
|
|
107
|
+
$-counter: $-counter + 1;
|
|
108
|
+
|
|
109
|
+
@if $-counter == 3 and $i > 1 {
|
|
110
|
+
$-result: $separator + $-result;
|
|
111
|
+
$-counter: 0;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
@if $value < 0 {
|
|
117
|
+
$-result: "-" + $-result;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
@return $-result;
|
|
121
|
+
|
|
122
|
+
}
|