@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,148 @@
1
+ @use 'sass:color';
2
+ @use '../../loggers/log-invalid-type' as *;
3
+ @use '../../validators/type-of/is-color' as *;
4
+ @use '../../validators/type-of/is-number' as *;
5
+
6
+ /// Поворачивает цветовой тон (hue) цвета на заданное
7
+ /// количество градусов.
8
+ ///
9
+ /// Функция `color-hue-shift()` изменяет цветовой тон цвета
10
+ /// в HSL-пространстве, сохраняя при этом его насыщенность и
11
+ /// светлоту. Это позволяет создавать вариации цвета,
12
+ /// которые гармонично сочетаются с исходным, сохраняя
13
+ /// одинаковую насыщенность и яркость. Полезно для создания
14
+ /// цветовых палитр, акцентных цветов или динамического
15
+ /// изменения цвета при взаимодействии.
16
+ ///
17
+ /// > Функция возвращает цвет в формате HSL, даже если
18
+ /// > исходный цвет был в другом формате. Используйте
19
+ /// > функцию `meta.inspect()` если нужен HEX формат.
20
+ ///
21
+ /// > Для больших значений $degrees (>360 или <-360)
22
+ /// > результат будет нормализован в диапазон 0-360°.
23
+ /// ---
24
+ /// @name color-hue-shift
25
+ /// @group utilities-helpers
26
+ /// @since 2025.12.27
27
+ /// @access public
28
+ /// @author Murad Rustamov (therteenten)
29
+ /// @link https://sourcecraft.dev/users/therteenten/overview SourceCraft - therteenten
30
+ /// @link https://sourcecraft.dev/omnisass/library SourceCraft - OmniSass
31
+ /// @link https://sass-lang.com/documentation/modules/color#channel См. также: Sass - Функция color.channel()
32
+ /// @link https://en.wikipedia.org/wiki/Hue См. также: Wikipedia - Цветовой тон (Hue)
33
+ /// @link https://color.adobe.com/create/color-wheel См. также: Adobe Color - Цветовой круг
34
+ /// @link https://developer.mozilla.org/en-US/docs/Web/CSS/color_value/hsl См. также: MDN - Функция HSL
35
+ /// @link https://css-tricks.com/hsl-hsla-is-great-for-programmatic-color-control/ См. также: CSS-Tricks - HSL отлично подходит для программного управления цветом
36
+ /// @example scss - Поворот на 180 градусов (дополнительный цвет)
37
+ /// $color: #3498db;
38
+ /// $complementary: color-hue-shift($color, 180);
39
+ /// .element {
40
+ /// color: $color;
41
+ /// background-color: $complementary;
42
+ /// }
43
+ /// @example css - Результат
44
+ /// .element {
45
+ /// color: #3498db;
46
+ /// background-color: hsl(24.0718562874, 69.8744769874%, 53.137254902%);
47
+ /// }
48
+ /// @example scss - Создание гармоничных акцентов (±30 градусов)
49
+ /// $primary: #2ecc71;
50
+ /// $accent-1: color-hue-shift($primary, 30);
51
+ /// $accent-2: color-hue-shift($primary, -30);
52
+ /// @example scss - Динамическое изменение цвета при наведении
53
+ /// .button {
54
+ /// background-color: #e74c3c;
55
+ ///
56
+ /// &:hover {
57
+ /// // Легкое смещение тона для визуальной обратной связи
58
+ /// background-color: color-hue-shift(#e74c3c, 15);
59
+ /// }
60
+ /// }
61
+ /// @example css - Результат
62
+ /// .button {
63
+ /// background-color: #e74c3c;
64
+ /// }
65
+ /// .button:hover {
66
+ /// background-color: hsl(20.6140350877, 78.0821917808%, 57.0588235294%);
67
+ /// }
68
+ /// @example scss - Создание монохромной палитры с вариациями тона
69
+ /// $base-color: #9b59b6;
70
+ /// $palette: (
71
+ /// color-hue-shift($base-color, -20),
72
+ /// $base-color,
73
+ /// color-hue-shift($base-color, 20),
74
+ /// color-hue-shift($base-color, 40)
75
+ /// );
76
+ /// @param {Color} $color - Исходный цвет, тон которого нужно
77
+ /// изменить. Может быть в любом формате, поддерживаемом
78
+ /// Sass (HEX, RGB, HSL, имя цвета).
79
+ /// @param {Number} $degrees - Количество градусов для
80
+ /// поворота тона. Положительные значения вращают по часовой
81
+ /// стрелке, отрицательные - против. Значение автоматически
82
+ /// нормализуется в диапазон 0-360° с помощью оператора %
83
+ /// (прописывать вручную оператор % не нужно).
84
+ /// @return {Color} - Новый цвет в формате HSL с измененным
85
+ /// цветовым тоном, но с сохранением исходных значений
86
+ /// насыщенности и светлоты.
87
+ @function color-hue-shift($color, $degrees) {
88
+
89
+ // Проверка типа первого параметра: ожидается цветовое значение.
90
+ // Функция is-color() проверяет, является ли $color валидным цветом CSS.
91
+ @if not is-color($color) {
92
+
93
+ // Если $color не является цветом, возвращаем ошибку через
94
+ // стандартную функцию логирования. Это предотвращает
95
+ // некорректные вычисления с нецветовыми данными.
96
+ @return log-invalid-type(
97
+ 'color-hue-shift',
98
+ $color,
99
+ '$color',
100
+ 'color'
101
+ );
102
+
103
+ }
104
+
105
+ // Проверка типа второго параметра: ожидается числовое значение
106
+ // угла поворота в градусах. Положительные значения вращают цвет
107
+ // по часовой стрелке на цветовом круге, отрицательные - против.
108
+ @else if not is-number($degrees) {
109
+
110
+ // Если $degrees не является числом, возвращаем ошибку.
111
+ @return log-invalid-type(
112
+ 'color-hue-shift',
113
+ $degrees,
114
+ '$degrees',
115
+ 'number'
116
+ );
117
+
118
+ }
119
+
120
+ // Все параметры прошли валидацию - выполняем изменение оттенка.
121
+ @else {
122
+
123
+ // Вычисление нового значения оттенка (hue).
124
+ // Формула: (текущий оттенок + угол поворота) по модулю 360.
125
+ // Оператор % 360 гарантирует, что результат всегда будет
126
+ // в диапазоне от 0 до 359 градусов (цветовой круг).
127
+ // color.channel() извлекает компонент оттенка из цвета
128
+ // в пространстве HSL.
129
+ $-new-hue: (color.channel($color, "hue", $space: hsl) + $degrees) % 360;
130
+
131
+ // Создание нового цвета с измененным оттенком.
132
+ // Используем функцию hsl() для создания цвета в формате HSL.
133
+ // Компоненты:
134
+ // - $-new-hue: новый оттенок после поворота
135
+ // - saturation: насыщенность исходного цвета (сохраняется)
136
+ // - lightness: яркость исходного цвета (сохраняется)
137
+ //
138
+ // Таким образом, меняется только положение цвета на
139
+ // цветовом круге, сохраняя его насыщенность и яркость.
140
+ @return hsl(
141
+ $-new-hue,
142
+ color.channel($color, "saturation", $space: hsl),
143
+ color.channel($color, "lightness", $space: hsl)
144
+ );
145
+
146
+ }
147
+
148
+ }
@@ -0,0 +1,208 @@
1
+ @use 'sass:color';
2
+ @use 'sass:list';
3
+ @use 'sass:math';
4
+ @use './color-shade' as *;
5
+ @use '../../loggers/log-invalid-type' as *;
6
+ @use '../../validators/type-of/is-color' as *;
7
+ @use '../../validators/type-of/is-number' as *;
8
+
9
+ /// Генерирует монохромную шкалу оттенков путем затемнения
10
+ /// базового цвета.
11
+ ///
12
+ /// Функция `color-scale()` создает последовательность
13
+ /// оттенков от исходного цвета до почти черного, равномерно
14
+ /// распределяя шаги затемнения.
15
+ ///
16
+ /// Идеально подходит для создания вариаций одного цвета для
17
+ /// состояний hover/active, типографических иерархий или
18
+ /// систем теней.
19
+ /// ---
20
+ /// @name color-scale
21
+ /// @group utilities-helpers
22
+ /// @since 2025.12.27
23
+ /// @access public
24
+ /// @author Murad Rustamov (therteenten)
25
+ /// @link https://sourcecraft.dev/users/therteenten/overview SourceCraft - therteenten
26
+ /// @link https://sourcecraft.dev/omnisass/library SourceCraft - OmniSass
27
+ /// @link https://sass-lang.com/documentation/values/lists См. также: Sass - Работа со списками (lists)
28
+ /// @link https://www.smashingmagazine.com/2017/04/developer-guide-color-palettes/ См. также: Smashing Magazine - Гид по созданию цветовых палитр
29
+ /// @link https://refactoringui.com/previews/building-your-color-palette См. также: Refactoring UI - Построение цветовых палитр
30
+ /// @link https://medium.com/@erikdkennedy/color-in-ui-design-a-practical-framework-e18cacd97f9e См. также: Medium - Практический подход к цвету в дизайне
31
+ /// @link https://m2.material.io/design/color/the-color-system.html См. также: Material Design - Система цвета
32
+ /// @example scss - Примеры использования
33
+ /// @use 'sass:list';
34
+ ///
35
+ /// // Миксин, который генерирует CSS-комментарии для каждого шага шкалы
36
+ /// @mixin debug-color-steps($scale) {
37
+ /// @each $-color, $-index in $scale {
38
+ /// /* step #{$-index}: #{$-color} */
39
+ /// }
40
+ /// }
41
+ ///
42
+ /// // Использование миксина с шкалой из 3 шагов
43
+ /// $blue-scale: color-scale(#3498db, 3);
44
+ /// @include debug-color-steps($blue-scale);
45
+ ///
46
+ /// // Миксин для генерации CSS-переменных
47
+ /// @mixin generate-color-vars($scale, $name: 'color') {
48
+ /// @for $i from 1 through list.length($scale) {
49
+ /// --#{$name}-#{$i}: #{list.nth($scale, $i)};
50
+ /// }
51
+ /// }
52
+ ///
53
+ /// // Создание переменных для серой шкалы
54
+ /// $gray-scale: color-scale(#ccc, 4);
55
+ /// :root {
56
+ /// @include generate-color-vars($gray-scale, 'gray');
57
+ /// }
58
+ ///
59
+ /// // Миксин для компонента с состояними и комментариями
60
+ /// @mixin color-stepped-element($base-color, $steps: 3) {
61
+ /// $scale: color-scale($base-color, $steps);
62
+ ///
63
+ /// background-color: list.nth($scale, 1);
64
+ ///
65
+ /// &:hover {
66
+ /// background-color: list.nth($scale, 2);
67
+ /// }
68
+ ///
69
+ /// &:active {
70
+ /// background-color: list.nth($scale, 3);
71
+ /// }
72
+ /// }
73
+ ///
74
+ /// // Применение миксина для alert-компонента
75
+ /// .alert {
76
+ /// @include color-stepped-element(#e74c3c, 2);
77
+ /// }
78
+ ///
79
+ /// // Миксин для отладки с нумерацией от 0
80
+ /// @mixin debug-scale-steps($scale) {
81
+ /// @for $i from 0 to list.length($scale) {
82
+ /// /* step #{$i}: #{list.nth($scale, $i + 1)} */
83
+ /// }
84
+ /// }
85
+ ///
86
+ /// // Пример использования debug-миксина
87
+ /// $test-scale: color-scale(#ff0000, 5);
88
+ /// @include debug-scale-steps($test-scale);
89
+ /// @example css - Результат
90
+ /// /* step : #3498db */
91
+ /// /* step : rgb(34.6666666667, 101.3333333333, 146) */
92
+ /// /* step : rgb(17.3333333333, 50.6666666667, 73) */
93
+ /// /* step : black */
94
+ ///
95
+ /// :root {
96
+ /// --gray-1: #cccccc;
97
+ /// --gray-2: #999999;
98
+ /// --gray-3: #666666;
99
+ /// --gray-4: #333333;
100
+ /// --gray-5: black;
101
+ /// }
102
+ ///
103
+ /// .alert {
104
+ /// background-color: #e74c3c;
105
+ /// }
106
+ /// .alert:hover {
107
+ /// background-color: rgb(115.5, 38, 30);
108
+ /// }
109
+ /// .alert:active {
110
+ /// background-color: black;
111
+ /// }
112
+ ///
113
+ /// /* step 0: red */
114
+ /// /* step 1: #cc0000 */
115
+ /// /* step 2: #990000 */
116
+ /// /* step 3: #660000 */
117
+ /// /* step 4: #330000 */
118
+ /// /* step 5: black */
119
+ /// @param {Color} $color - Исходный цвет, от которого
120
+ /// строится шкала затемнения. Может быть в любом формате,
121
+ /// который поддерживает Sass (HEX, RGB, HSL и т.д.).
122
+ /// @param {Number} $steps [5] - Количество шагов затемнения.
123
+ /// Определяет, сколько промежуточных оттенков будет
124
+ /// создано между исходным цветом и максимально затемненным
125
+ /// вариантом. При `$steps: 5` будет создано 6 цветов
126
+ /// (исходный + 5 затемненных оттенков).
127
+ /// @return {List} - Упорядоченный список (list) цветов, где:
128
+ /// - Первый элемент: исходный цвет (`$color`)
129
+ /// - Последний элемент: `color-shade($color, 100%)`
130
+ /// - Промежуточные элементы: равномерно распределенные оттенки
131
+ /// - Длина списка = `$steps + 1`
132
+ @function color-scale($color, $steps: 5) {
133
+
134
+ // Проверка типа первого параметра: ожидается базовый цвет.
135
+ // Функция is-color() проверяет, является ли $color валидным цветом CSS.
136
+ @if not is-color($color) {
137
+
138
+ // Если $color не является цветом, возвращаем ошибку через
139
+ // стандартную функцию логирования. Это предотвращает
140
+ // некорректные вычисления с нецветовыми данными.
141
+ @return log-invalid-type(
142
+ 'color-scale',
143
+ $color,
144
+ '$color',
145
+ 'color'
146
+ );
147
+
148
+ }
149
+
150
+ // Проверка типа второго параметра: ожидается количество шагов
151
+ // (уровней) в цветовой шкале. Определяет, сколько оттенков
152
+ // будет сгенерировано на основе базового цвета.
153
+ @else if not is-number($steps) {
154
+
155
+ // Если $steps не является числом, возвращаем ошибку.
156
+ @return log-invalid-type(
157
+ 'color-scale',
158
+ $steps,
159
+ '$steps',
160
+ 'number'
161
+ );
162
+
163
+ }
164
+
165
+ // Все параметры прошли валидацию - выполняем генерацию шкалы.
166
+ @else {
167
+
168
+ // Инициализация списка для хранения цветовой палитры.
169
+ // Результатом функции будет список (массив) цветов,
170
+ // представляющих шкалу оттенков базового цвета.
171
+ $-palette: ();
172
+
173
+ // Цикл генерации цветов шкалы.
174
+ // Переменная $i принимает значения от 0 до $steps включительно.
175
+ // Это создает $steps + 1 цвет в итоговом списке.
176
+ @for $i from 0 through $steps {
177
+
178
+ // Вычисление процентного значения для текущего шага.
179
+ // Формула: (текущий шаг) × (100 / общее количество шагов)
180
+ // Пример для 5 шагов: значения будут 0%, 20%, 40%, 60%,
181
+ // 80%, 100%.
182
+ $-percentage: math.div($i * 100, $steps);
183
+
184
+ // Генерация оттенка с помощью вспомогательной функции
185
+ // color-shade().
186
+ // Предполагается, что color-shade($color, $percentage)
187
+ // создает оттенок базового цвета с указанной интенсивностью.
188
+ // - При $percentage = 0% → самый светлый оттенок (близкий
189
+ // к белому)
190
+ // - При $percentage = 100% → самый темный оттенок (близкий
191
+ // к черному)
192
+ $-shade: color-shade($color, $-percentage);
193
+
194
+ // Добавление сгенерированного оттенка в палитру.
195
+ // Функция list.append() добавляет новый элемент в
196
+ // конец списка.
197
+ $-palette: list.append($-palette, $-shade);
198
+
199
+ }
200
+
201
+ // Возвращаем список сгенерированных оттенков.
202
+ // Список содержит $steps + 1 элементов, равномерно распределенных
203
+ // по шкале от самого светлого к самому темному оттенку.
204
+ @return $-palette;
205
+
206
+ }
207
+
208
+ }
@@ -0,0 +1,113 @@
1
+ @use 'sass:color';
2
+ @use '../../loggers/log-invalid-type' as *;
3
+ @use '../../validators/type-of/is-color' as *;
4
+ @use '../../validators/type-of/is-number' as *;
5
+
6
+ /// Создает затемненную версию цвета, добавляя к нему
7
+ /// черный цвет.
8
+ ///
9
+ /// Функция `color-shade()` затемняет исходный цвет, смешивая
10
+ /// его с черным. Процент затемнения определяет, сколько
11
+ /// черного цвета будет добавлено к исходному.
12
+ ///
13
+ /// Это полезно для создания вариаций цветов для состояний
14
+ /// наведения, теней или для построения цветовых палитр с
15
+ /// различными уровнями насыщенности.
16
+ /// ---
17
+ /// @name color-shade
18
+ /// @group utilities-helpers
19
+ /// @since 2025.12.27
20
+ /// @access public
21
+ /// @author Kitty Giraudel
22
+ /// @author Murad Rustamov (therteenten) [адаптация]
23
+ /// @link https://github.com/KittyGiraudel GitHub - Kitty Giraudel
24
+ /// @link https://sourcecraft.dev/users/therteenten/overview SourceCraft - therteenten
25
+ /// @link https://sourcecraft.dev/omnisass/library SourceCraft - OmniSass
26
+ /// @link https://sass-lang.com/documentation/modules/color#mix См. также: Sass — Официальная документация по модулю color
27
+ /// @link https://sass-guidelin.es/ru/ См. также: Sass Guidelines — Руководство по написанию разумного Sass
28
+ /// @link https://www.w3schools.com/sass/sass_functions_color.asp См. также: W3Schools — Справочник по цветовым функциям Sass
29
+ /// @link https://developer.mozilla.org/ru/docs/Web/CSS/color_value См. также: MDN — Значения цвета CSS
30
+ /// @example scss - Пример использования
31
+ /// .button {
32
+ /// background-color: #3498db;
33
+ ///
34
+ /// &:hover {
35
+ /// // Затемняет цвет на 20% для состояния наведения
36
+ /// background-color: color-shade(#3498db, 20);
37
+ /// }
38
+ ///
39
+ /// }
40
+ /// @example css - Результат
41
+ /// .button {
42
+ /// background-color: #3498db;
43
+ /// }
44
+ /// .button:hover {
45
+ /// background-color: rgb(41.6, 121.6, 175.2);
46
+ /// }
47
+ /// @param {Color} $color - Исходный цвет для затемнения.
48
+ /// Может быть в любом формате, который поддерживает Sass
49
+ /// (hex, rgb, rgba, hsl, hsla, имя цвета).
50
+ /// @param {Number} $percentage - Процент затемнения (от 0
51
+ /// до 100). Определяет долю черного цвета в итоговой
52
+ /// смеси. 0 вернет исходный цвет, 100 вернет чистый
53
+ /// черный.
54
+ /// @return {Color} - Затемненный цвет в том же формате,
55
+ /// что и исходный.
56
+ @function color-shade($color, $percentage) {
57
+
58
+ // Проверка типа первого параметра: ожидается базовый цвет.
59
+ // Функция is-color() проверяет, является ли $color валидным цветом CSS.
60
+ @if not is-color($color) {
61
+
62
+ // Если $color не является цветом, возвращаем ошибку через
63
+ // стандартную функцию логирования. Это предотвращает
64
+ // некорректные вычисления с нецветовыми данными.
65
+ @return log-invalid-type(
66
+ 'color-shade',
67
+ $color,
68
+ '$color',
69
+ 'color'
70
+ );
71
+
72
+ }
73
+
74
+ // Проверка типа второго параметра: ожидается процентное значение
75
+ // интенсивности затемнения. Определяет, насколько темным будет
76
+ // итоговый цвет относительно базового.
77
+ @else if not is-number($percentage) {
78
+
79
+ // Если $percentage не является числом, возвращаем ошибку.
80
+ @return log-invalid-type(
81
+ 'color-shade',
82
+ $percentage,
83
+ '$percentage',
84
+ 'number'
85
+ );
86
+
87
+ }
88
+
89
+ // Все параметры прошли валидацию - выполняем затемнение цвета.
90
+ @else {
91
+
92
+ // Формула затемнения: смешивание базового цвета с черным
93
+ // в указанной пропорции.
94
+ //
95
+ // Используем встроенную функцию color.mix():
96
+ // Параметры:
97
+ // - black: первый цвет для смешивания (черный)
98
+ // - $color: второй цвет для смешивания (базовый цвет)
99
+ // - $percentage * 1%: процентное соотношение
100
+ // (сколько процентов черного цвета в смеси)
101
+ //
102
+ // Математика смешивания:
103
+ // - При $percentage = 0% → 100% $color, 0% black (исходный цвет)
104
+ // - При $percentage = 50% → 50% $color, 50% black (среднее затемнение)
105
+ // - При $percentage = 100% → 0% $color, 100% black (полностью черный)
106
+ //
107
+ // Результат: цвет, который является затемненной версией
108
+ // исходного цвета, где процент определяет степень затемнения.
109
+ @return color.mix(black, $color, $percentage * 1%);
110
+
111
+ }
112
+
113
+ }
@@ -0,0 +1,118 @@
1
+ @use 'sass:color';
2
+ @use '../../loggers/log-invalid-type' as *;
3
+ @use '../../validators/type-of/is-color' as *;
4
+ @use '../../validators/type-of/is-number' as *;
5
+
6
+ /// Осветляет исходный цвет, смешивая его с белым.
7
+ ///
8
+ /// Функция `color-tint()` создает более светлые оттенки
9
+ /// цвета путем добавления белого. Это удобно для генерации
10
+ /// цветовых палитр, оформления состояний интерфейса
11
+ /// (например, disabled), градиентов или оттенков фона.
12
+ /// ---
13
+ /// @name color-tint
14
+ /// @group utilities-helpers
15
+ /// @since 2025.12.27
16
+ /// @access public
17
+ /// @author Kitty Giraudel
18
+ /// @author Murad Rustamov (therteenten) [адаптация]
19
+ /// @link https://github.com/KittyGiraudel GitHub - Kitty Giraudel
20
+ /// @link https://sourcecraft.dev/users/therteenten/overview SourceCraft - therteenten
21
+ /// @link https://sourcecraft.dev/omnisass/library SourceCraft - OmniSass
22
+ /// @link https://sass-lang.com/documentation/modules/color#mix См. также: Sass — Официальная документация по модулю color
23
+ /// @link https://sass-guidelin.es/ru/#_2 См. также: Sass Guidelines — Вложенность
24
+ /// @link https://www.w3schools.com/sass/sass_functions_color.php См. также: W3Schools — Справочник по цветовым функциям Sass
25
+ /// @link https://developer.mozilla.org/en-US/docs/Web/CSS/color_value См. также: MDN — CSS Color Values
26
+ /// @link https://css-tricks.com/snippets/sass/tint-shade-functions/ См. также: CSS-Tricks — Функции tint() и shade() на Sass
27
+ /// @example scss - Пример использования
28
+ /// $primary-color: #3498db;
29
+ ///
30
+ /// .card {
31
+ /// background-color: $primary-color;
32
+ ///
33
+ /// &--light {
34
+ /// // Осветлить основной цвет на 40%
35
+ /// background-color: color-tint($primary-color, 40);
36
+ /// }
37
+ ///
38
+ /// &--highlight {
39
+ /// // Очень светлый акцентный фон
40
+ /// background-color: color-tint($primary-color, 85);
41
+ /// }
42
+ /// }
43
+ /// @example css - Результат
44
+ /// .card {
45
+ /// background-color: #3498db;
46
+ /// }
47
+ /// .card--light {
48
+ /// background-color: rgb(133.2, 193.2, 233.4);
49
+ /// }
50
+ /// .card--highlight {
51
+ /// background-color: rgb(224.55, 239.55, 249.6);
52
+ /// }
53
+ /// @param {Color} $color - Исходный цвет для осветления.
54
+ /// Допустимы все форматы Sass (hex, rgb, hsl, имя цвета
55
+ /// и т.д.).
56
+ /// @param {Number} $percentage - Интенсивность осветления
57
+ /// (0 - 100). Указывает долю белого в итоговой смеси.
58
+ /// При 0 вернется исходный цвет, при 100 — чистый белый.
59
+ /// @return {Color} - Осветленный цвет в том же формате,
60
+ /// что и входной.
61
+ @function color-tint($color, $percentage) {
62
+
63
+ // Проверка типа первого параметра: ожидается базовый цвет.
64
+ // Функция is-color() проверяет, является ли $color валидным цветом CSS.
65
+ @if not is-color($color) {
66
+
67
+ // Если $color не является цветом, возвращаем ошибку через
68
+ // стандартную функцию логирования. Это предотвращает
69
+ // некорректные вычисления с нецветовыми данными.
70
+ @return log-invalid-type(
71
+ 'color-tint',
72
+ $color,
73
+ '$color',
74
+ 'color'
75
+ );
76
+
77
+ }
78
+
79
+ // Проверка типа второго параметра: ожидается процентное значение
80
+ // интенсивности осветления. Определяет, насколько светлым будет
81
+ // итоговый цвет относительно базового.
82
+ @else if not is-number($percentage) {
83
+
84
+ // Если $percentage не является числом, возвращаем ошибку.
85
+ @return log-invalid-type(
86
+ 'color-tint',
87
+ $percentage,
88
+ '$percentage',
89
+ 'number'
90
+ );
91
+
92
+ }
93
+
94
+ // Все параметры прошли валидацию - выполняем осветление цвета.
95
+ @else {
96
+
97
+ // Формула осветления: смешивание базового цвета с белым
98
+ // в указанной пропорции.
99
+ //
100
+ // Используем встроенную функцию color.mix():
101
+ // Параметры:
102
+ // - white: первый цвет для смешивания (белый)
103
+ // - $color: второй цвет для смешивания (базовый цвет)
104
+ // - $percentage * 1%: процентное соотношение
105
+ // (сколько процентов белого цвета в смеси)
106
+ //
107
+ // Математика смешивания:
108
+ // - При $percentage = 0% → 100% $color, 0% white (исходный цвет)
109
+ // - При $percentage = 50% → 50% $color, 50% white (среднее осветление)
110
+ // - При $percentage = 100% → 0% $color, 100% white (полностью белый)
111
+ //
112
+ // Результат: цвет, который является осветленной версией
113
+ // исходного цвета, где процент определяет степень осветления.
114
+ @return color.mix(white, $color, $percentage * 1%);
115
+
116
+ }
117
+
118
+ }