@mr.slonn/my-scss-theme 1.0.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/README.md +182 -0
- package/index.scss +1 -0
- package/package.json +10 -0
- package/scss/.sassdocrc +85 -0
- package/scss/_font-vars.scss +25 -0
- package/scss/_fonts.scss +139 -0
- package/scss/abstracts/_animations.scss +819 -0
- package/scss/abstracts/_breakpoints.scss +865 -0
- package/scss/abstracts/_colors.scss +256 -0
- package/scss/abstracts/_functions.scss +3 -0
- package/scss/abstracts/_grid.scss +816 -0
- package/scss/abstracts/_index.scss +134 -0
- package/scss/abstracts/_mixins.scss +1142 -0
- package/scss/abstracts/_patterns.scss +657 -0
- package/scss/abstracts/_radius.scss +279 -0
- package/scss/abstracts/_search-form.scss +271 -0
- package/scss/abstracts/_spacing.scss +158 -0
- package/scss/abstracts/_typography.scss +477 -0
- package/scss/abstracts/_utilities.scss +0 -0
- package/scss/abstracts/_variables.scss +3 -0
- package/scss/abstracts/breadcrumb/_base.scss +194 -0
- package/scss/abstracts/breadcrumb/_index.scss +12 -0
- package/scss/abstracts/breadcrumb/_variables.scss +54 -0
- package/scss/abstracts/buttons/_base.scss +92 -0
- package/scss/abstracts/buttons/_index.scss +31 -0
- package/scss/abstracts/buttons/_modifiers.scss +114 -0
- package/scss/abstracts/buttons/_variables.scss +98 -0
- package/scss/abstracts/buttons/_variants.scss +295 -0
- package/scss/abstracts/callout/_base.scss +142 -0
- package/scss/abstracts/callout/_index.scss +23 -0
- package/scss/abstracts/callout/_variables.scss +27 -0
- package/scss/abstracts/cards/_base.scss +74 -0
- package/scss/abstracts/cards/_blur.scss +65 -0
- package/scss/abstracts/cards/_featured.scss +363 -0
- package/scss/abstracts/cards/_hover.scss +99 -0
- package/scss/abstracts/cards/_index.scss +51 -0
- package/scss/abstracts/cards/_parts.scss +135 -0
- package/scss/abstracts/cards/_sizes.scss +52 -0
- package/scss/abstracts/cards/_variables.scss +72 -0
- package/scss/abstracts/cards/_variants.scss +143 -0
- package/scss/abstracts/cards/_vertical.scss +218 -0
- package/scss/abstracts/chip/_base.scss +99 -0
- package/scss/abstracts/chip/_icon.scss +73 -0
- package/scss/abstracts/chip/_index.scss +21 -0
- package/scss/abstracts/chip/_variables.scss +57 -0
- package/scss/abstracts/chip/_variants.scss +98 -0
- package/scss/abstracts/file-card/_base.scss +326 -0
- package/scss/abstracts/file-card/_index.scss +12 -0
- package/scss/abstracts/file-card/_variables.scss +79 -0
- package/scss/abstracts/hero/_base.scss +182 -0
- package/scss/abstracts/hero/_index.scss +23 -0
- package/scss/abstracts/hero/_variables.scss +59 -0
- package/scss/abstracts/info-card/_base.scss +152 -0
- package/scss/abstracts/info-card/_index.scss +12 -0
- package/scss/abstracts/info-card/_variables.scss +44 -0
- package/scss/abstracts/news-card/_base.scss +143 -0
- package/scss/abstracts/news-card/_compact.scss +24 -0
- package/scss/abstracts/news-card/_featured.scss +83 -0
- package/scss/abstracts/news-card/_index.scss +31 -0
- package/scss/abstracts/news-card/_variables.scss +44 -0
- package/scss/abstracts/project-card/_base.scss +109 -0
- package/scss/abstracts/project-card/_index.scss +23 -0
- package/scss/abstracts/project-card/_variables.scss +20 -0
- package/scss/abstracts/search-form/_base.scss +132 -0
- package/scss/abstracts/search-form/_composite.scss +54 -0
- package/scss/abstracts/search-form/_index.scss +31 -0
- package/scss/abstracts/search-form/_theme.scss +89 -0
- package/scss/abstracts/search-form/_variables.scss +39 -0
- package/scss/abstracts/section-title/_base.scss +127 -0
- package/scss/abstracts/section-title/_index.scss +23 -0
- package/scss/abstracts/section-title/_variables.scss +27 -0
- package/scss/abstracts/service-card/_base.scss +77 -0
- package/scss/abstracts/service-card/_index.scss +23 -0
- package/scss/abstracts/service-card/_variables.scss +23 -0
- package/scss/abstracts/sidebar-menu/_base.scss +148 -0
- package/scss/abstracts/sidebar-menu/_index.scss +12 -0
- package/scss/abstracts/sidebar-menu/_variables.scss +55 -0
- package/scss/abstracts/stats-card/_base.scss +99 -0
- package/scss/abstracts/stats-card/_index.scss +23 -0
- package/scss/abstracts/stats-card/_variables.scss +32 -0
- package/scss/api.scss +12 -0
- package/scss/components/_breadcrumb.scss +140 -0
- package/scss/components/_buttons.scss +226 -0
- package/scss/components/_callout.scss +118 -0
- package/scss/components/_chip.scss +56 -0
- package/scss/components/_file-card.scss +182 -0
- package/scss/components/_hero.scss +103 -0
- package/scss/components/_index.scss +110 -0
- package/scss/components/_info-card.scss +103 -0
- package/scss/components/_news-card-compact.scss +33 -0
- package/scss/components/_news-card-featured.scss +49 -0
- package/scss/components/_news-card.scss +303 -0
- package/scss/components/_project-card.scss +93 -0
- package/scss/components/_search-form.scss +181 -0
- package/scss/components/_section-title.scss +94 -0
- package/scss/components/_service-card.scss +83 -0
- package/scss/components/_sidebar-menu.scss +82 -0
- package/scss/components/_stats-card.scss +92 -0
- package/scss/components/_tag.scss +144 -0
- package/scss/components/_top-nav.scss +537 -0
- package/scss/main.scss +73 -0
- package/scss/utilities/_index.scss +40 -0
- package/scss/utilities/_visibility.scss +224 -0
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
////
|
|
2
|
+
/// Система скругления углов темы MOEXP
|
|
3
|
+
/// Border-radius переменные, функции и миксины
|
|
4
|
+
/// @group radius
|
|
5
|
+
/// @author MOEXP Team
|
|
6
|
+
////
|
|
7
|
+
|
|
8
|
+
// ============================================
|
|
9
|
+
// BORDER RADIUS SYSTEM
|
|
10
|
+
// local\common\theme-moexp\src\scss\abstracts\_radius.scss
|
|
11
|
+
// ============================================
|
|
12
|
+
|
|
13
|
+
@use "sass:map";
|
|
14
|
+
@use "sass:meta";
|
|
15
|
+
|
|
16
|
+
// ─────────────────────────────────────────
|
|
17
|
+
// ПЕРЕМЕННЫЕ (соответствуют Tailwind)
|
|
18
|
+
// ─────────────────────────────────────────
|
|
19
|
+
|
|
20
|
+
/// Без скругления
|
|
21
|
+
/// @type Number
|
|
22
|
+
/// @group radius
|
|
23
|
+
$radius-none: 0 !default;
|
|
24
|
+
|
|
25
|
+
/// Скругление SM (2px) — минимальное
|
|
26
|
+
/// @type Number
|
|
27
|
+
/// @group radius
|
|
28
|
+
$radius-sm: 0.125rem !default;
|
|
29
|
+
|
|
30
|
+
/// Скругление Default (4px) — базовое
|
|
31
|
+
/// @type Number
|
|
32
|
+
/// @group radius
|
|
33
|
+
$radius-default: 0.25rem !default;
|
|
34
|
+
|
|
35
|
+
/// Скругление MD (6px) — среднее
|
|
36
|
+
/// @type Number
|
|
37
|
+
/// @group radius
|
|
38
|
+
$radius-md: 0.375rem !default;
|
|
39
|
+
|
|
40
|
+
/// Скругление LG (8px) — стандартное для карточек ⭐
|
|
41
|
+
/// @type Number
|
|
42
|
+
/// @group radius
|
|
43
|
+
$radius-lg: 0.5rem !default;
|
|
44
|
+
|
|
45
|
+
/// Скругление XL (12px) — увеличенное
|
|
46
|
+
/// @type Number
|
|
47
|
+
/// @group radius
|
|
48
|
+
$radius-xl: 0.75rem !default;
|
|
49
|
+
|
|
50
|
+
/// Скругление 2XL (16px) — большое
|
|
51
|
+
/// @type Number
|
|
52
|
+
/// @group radius
|
|
53
|
+
$radius-2xl: 1rem !default;
|
|
54
|
+
|
|
55
|
+
/// Скругление 3XL (24px) — очень большое
|
|
56
|
+
/// @type Number
|
|
57
|
+
/// @group radius
|
|
58
|
+
$radius-3xl: 1.5rem !default;
|
|
59
|
+
|
|
60
|
+
/// Полное скругление (pill/circle)
|
|
61
|
+
/// @type Number
|
|
62
|
+
/// @group radius
|
|
63
|
+
$radius-full: 9999px !default;
|
|
64
|
+
|
|
65
|
+
/// Карта всех значений border-radius
|
|
66
|
+
/// @type Map
|
|
67
|
+
/// @prop {Number} none [0] - Без скругления
|
|
68
|
+
/// @prop {Number} sm [0.125rem] - 2px
|
|
69
|
+
/// @prop {Number} default [0.25rem] - 4px
|
|
70
|
+
/// @prop {Number} md [0.375rem] - 6px
|
|
71
|
+
/// @prop {Number} lg [0.5rem] - 8px ⭐
|
|
72
|
+
/// @prop {Number} xl [0.75rem] - 12px
|
|
73
|
+
/// @prop {Number} 2xl [1rem] - 16px
|
|
74
|
+
/// @prop {Number} 3xl [1.5rem] - 24px
|
|
75
|
+
/// @prop {Number} full [9999px] - Pill/Circle
|
|
76
|
+
/// @example scss - Получение значения из карты
|
|
77
|
+
/// border-radius: map.get($radii, 'xl');
|
|
78
|
+
/// // => 0.75rem
|
|
79
|
+
/// @group radius
|
|
80
|
+
$radii: (
|
|
81
|
+
none: $radius-none,
|
|
82
|
+
sm: $radius-sm,
|
|
83
|
+
default: $radius-default,
|
|
84
|
+
md: $radius-md,
|
|
85
|
+
lg: $radius-lg,
|
|
86
|
+
xl: $radius-xl,
|
|
87
|
+
2xl: $radius-2xl,
|
|
88
|
+
3xl: $radius-3xl,
|
|
89
|
+
full: $radius-full,
|
|
90
|
+
) !default;
|
|
91
|
+
|
|
92
|
+
// ─────────────────────────────────────────
|
|
93
|
+
// CSS CUSTOM PROPERTY
|
|
94
|
+
// ─────────────────────────────────────────
|
|
95
|
+
|
|
96
|
+
/// Корневая CSS-переменная для динамического радиуса
|
|
97
|
+
/// Используется в calc() для относительных вычислений
|
|
98
|
+
/// @output --radius: 0.5rem (8px)
|
|
99
|
+
/// @group radius
|
|
100
|
+
@mixin radius-root-var {
|
|
101
|
+
:root {
|
|
102
|
+
--radius: #{$radius-lg};
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// ─────────────────────────────────────────
|
|
107
|
+
// ФУНКЦИЯ
|
|
108
|
+
// ─────────────────────────────────────────
|
|
109
|
+
|
|
110
|
+
/// Получить значение радиуса по ключу
|
|
111
|
+
/// @param {String} $size [lg] - Ключ из карты $radii
|
|
112
|
+
/// @return {Number} Значение border-radius
|
|
113
|
+
/// @throw Ошибка если ключ не найден в $radii
|
|
114
|
+
/// @example scss - Базовое использование
|
|
115
|
+
/// border-radius: get-radius('xl');
|
|
116
|
+
/// // => 0.75rem
|
|
117
|
+
/// @example scss - В кастомном свойстве
|
|
118
|
+
/// .modal {
|
|
119
|
+
/// border-radius: get-radius('2xl');
|
|
120
|
+
/// }
|
|
121
|
+
/// // => border-radius: 1rem;
|
|
122
|
+
/// @group radius
|
|
123
|
+
/// @access public
|
|
124
|
+
@function get-radius($size: lg) {
|
|
125
|
+
$value: map.get($radii, $size);
|
|
126
|
+
|
|
127
|
+
@if not $value {
|
|
128
|
+
@error "Радиус `#{$size}` не найден. Доступные: #{map.keys($radii)}";
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
@return $value;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// ─────────────────────────────────────────
|
|
135
|
+
// МИКСИНЫ
|
|
136
|
+
// ─────────────────────────────────────────
|
|
137
|
+
|
|
138
|
+
/// Применяет border-radius
|
|
139
|
+
/// Принимает ключ из $radii или числовое значение
|
|
140
|
+
/// @param {String | Number} $size [lg] - Ключ из $radii или число
|
|
141
|
+
/// @require {function} get-radius
|
|
142
|
+
/// @example scss - С ключом
|
|
143
|
+
/// .card {
|
|
144
|
+
/// @include rounded('xl');
|
|
145
|
+
/// }
|
|
146
|
+
/// // => border-radius: 0.75rem;
|
|
147
|
+
/// @example scss - С числом
|
|
148
|
+
/// .custom {
|
|
149
|
+
/// @include rounded(10px);
|
|
150
|
+
/// }
|
|
151
|
+
/// // => border-radius: 10px;
|
|
152
|
+
/// @output border-radius: {value};
|
|
153
|
+
/// @group radius
|
|
154
|
+
/// @access public
|
|
155
|
+
@mixin rounded($size: lg) {
|
|
156
|
+
@if meta.type-of($size) == number {
|
|
157
|
+
border-radius: $size;
|
|
158
|
+
} @else {
|
|
159
|
+
border-radius: get-radius($size);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/// Применяет border-radius через CSS-переменную
|
|
164
|
+
/// Позволяет динамически менять радиус через --radius
|
|
165
|
+
/// @param {Number} $offset [0] - Смещение от базового --radius
|
|
166
|
+
/// @example scss - Базовое использование
|
|
167
|
+
/// .card {
|
|
168
|
+
/// @include rounded-var;
|
|
169
|
+
/// }
|
|
170
|
+
/// // => border-radius: var(--radius);
|
|
171
|
+
/// @example scss - С увеличением
|
|
172
|
+
/// .modal {
|
|
173
|
+
/// @include rounded-var(0.5rem);
|
|
174
|
+
/// }
|
|
175
|
+
/// // => border-radius: calc(var(--radius) + 0.5rem);
|
|
176
|
+
/// @example scss - С уменьшением
|
|
177
|
+
/// .button {
|
|
178
|
+
/// @include rounded-var(-0.25rem);
|
|
179
|
+
/// }
|
|
180
|
+
/// // => border-radius: calc(var(--radius) + -0.25rem);
|
|
181
|
+
/// @output border-radius: var(--radius) или calc(var(--radius) + offset);
|
|
182
|
+
/// @group radius
|
|
183
|
+
/// @access public
|
|
184
|
+
@mixin rounded-var($offset: 0) {
|
|
185
|
+
@if $offset == 0 {
|
|
186
|
+
border-radius: var(--radius);
|
|
187
|
+
} @else {
|
|
188
|
+
border-radius: calc(var(--radius) + #{$offset});
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/// Скругление верхних углов (top-left и top-right)
|
|
193
|
+
/// @param {String} $size [lg] - Ключ из $radii
|
|
194
|
+
/// @require {function} get-radius
|
|
195
|
+
/// @example scss - Табы или хедер карточки
|
|
196
|
+
/// .card__header {
|
|
197
|
+
/// @include rounded-t('lg');
|
|
198
|
+
/// }
|
|
199
|
+
/// // => border-radius: 0.5rem 0.5rem 0 0;
|
|
200
|
+
/// @output border-radius: {r} {r} 0 0;
|
|
201
|
+
/// @group radius
|
|
202
|
+
/// @access public
|
|
203
|
+
@mixin rounded-t($size: lg) {
|
|
204
|
+
$r: get-radius($size);
|
|
205
|
+
border-radius: $r $r 0 0;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/// Скругление нижних углов (bottom-left и bottom-right)
|
|
209
|
+
/// @param {String} $size [lg] - Ключ из $radii
|
|
210
|
+
/// @require {function} get-radius
|
|
211
|
+
/// @example scss - Футер карточки
|
|
212
|
+
/// .card__footer {
|
|
213
|
+
/// @include rounded-b('lg');
|
|
214
|
+
/// }
|
|
215
|
+
/// // => border-radius: 0 0 0.5rem 0.5rem;
|
|
216
|
+
/// @output border-radius: 0 0 {r} {r};
|
|
217
|
+
/// @group radius
|
|
218
|
+
/// @access public
|
|
219
|
+
@mixin rounded-b($size: lg) {
|
|
220
|
+
$r: get-radius($size);
|
|
221
|
+
border-radius: 0 0 $r $r;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/// Скругление левых углов (top-left и bottom-left)
|
|
225
|
+
/// @param {String} $size [lg] - Ключ из $radii
|
|
226
|
+
/// @require {function} get-radius
|
|
227
|
+
/// @example scss - Левая часть split-button
|
|
228
|
+
/// .btn-group__first {
|
|
229
|
+
/// @include rounded-l('md');
|
|
230
|
+
/// }
|
|
231
|
+
/// // => border-radius: 0.375rem 0 0 0.375rem;
|
|
232
|
+
/// @output border-radius: {r} 0 0 {r};
|
|
233
|
+
/// @group radius
|
|
234
|
+
/// @access public
|
|
235
|
+
@mixin rounded-l($size: lg) {
|
|
236
|
+
$r: get-radius($size);
|
|
237
|
+
border-radius: $r 0 0 $r;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/// Скругление правых углов (top-right и bottom-right)
|
|
241
|
+
/// @param {String} $size [lg] - Ключ из $radii
|
|
242
|
+
/// @require {function} get-radius
|
|
243
|
+
/// @example scss - Правая часть split-button
|
|
244
|
+
/// .btn-group__last {
|
|
245
|
+
/// @include rounded-r('md');
|
|
246
|
+
/// }
|
|
247
|
+
/// // => border-radius: 0 0.375rem 0.375rem 0;
|
|
248
|
+
/// @output border-radius: 0 {r} {r} 0;
|
|
249
|
+
/// @group radius
|
|
250
|
+
/// @access public
|
|
251
|
+
@mixin rounded-r($size: lg) {
|
|
252
|
+
$r: get-radius($size);
|
|
253
|
+
border-radius: 0 $r $r 0;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
// // Переменная напрямую
|
|
257
|
+
// .element {
|
|
258
|
+
// border-radius: $radius-lg;
|
|
259
|
+
// }
|
|
260
|
+
|
|
261
|
+
// // Функция
|
|
262
|
+
// .element {
|
|
263
|
+
// border-radius: get-radius('xl');
|
|
264
|
+
// }
|
|
265
|
+
|
|
266
|
+
// // Миксин (рекомендуется)
|
|
267
|
+
// .card {
|
|
268
|
+
// @include rounded('lg');
|
|
269
|
+
// }
|
|
270
|
+
|
|
271
|
+
// // Динамический через CSS-переменную
|
|
272
|
+
// .modal {
|
|
273
|
+
// @include rounded-var;
|
|
274
|
+
// }
|
|
275
|
+
|
|
276
|
+
// // Частичное скругление
|
|
277
|
+
// .tab {
|
|
278
|
+
// @include rounded-t('md');
|
|
279
|
+
// }
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// SEARCH FORM MIXINS
|
|
3
|
+
// local\common\theme-moexp\src\scss\abstracts\_search-form.scss
|
|
4
|
+
// ============================================
|
|
5
|
+
|
|
6
|
+
////
|
|
7
|
+
/// Миксины для формы поиска с иконкой внутри
|
|
8
|
+
///
|
|
9
|
+
/// Предоставляет гибкую систему для создания поисковых форм
|
|
10
|
+
/// в различных контекстах (header, sidebar, hero).
|
|
11
|
+
///
|
|
12
|
+
/// @group search-form
|
|
13
|
+
/// @author MOEXP Team
|
|
14
|
+
/// @since 1.0.0
|
|
15
|
+
///
|
|
16
|
+
/// @example scss - Использование в шаблоне
|
|
17
|
+
/// @use "theme-moexp/src/scss/main" as theme;
|
|
18
|
+
///
|
|
19
|
+
/// .header__search {
|
|
20
|
+
/// @include theme.search-form-base;
|
|
21
|
+
/// @include theme.search-form-theme(primary-foreground);
|
|
22
|
+
/// }
|
|
23
|
+
////
|
|
24
|
+
|
|
25
|
+
@use "sass:map";
|
|
26
|
+
@use "mixins";
|
|
27
|
+
@use "spacing";
|
|
28
|
+
@use "typography";
|
|
29
|
+
@use "animations";
|
|
30
|
+
@use "radius";
|
|
31
|
+
|
|
32
|
+
// ============================================
|
|
33
|
+
// VARIABLES
|
|
34
|
+
// ============================================
|
|
35
|
+
|
|
36
|
+
/// Ширина формы поиска по умолчанию
|
|
37
|
+
/// @type Length
|
|
38
|
+
/// @group search-form
|
|
39
|
+
$search-form-width: 15rem !default;
|
|
40
|
+
|
|
41
|
+
/// Высота формы поиска по умолчанию
|
|
42
|
+
/// @type Length
|
|
43
|
+
/// @group search-form
|
|
44
|
+
$search-form-height: 2.5rem !default;
|
|
45
|
+
|
|
46
|
+
/// Размер иконки поиска
|
|
47
|
+
/// @type Length
|
|
48
|
+
/// @group search-form
|
|
49
|
+
$search-form-icon-size: 1.2rem !default;
|
|
50
|
+
|
|
51
|
+
/// Отступ справа для иконки
|
|
52
|
+
/// @type Length
|
|
53
|
+
/// @group search-form
|
|
54
|
+
$search-form-icon-offset: 1.25rem !default;
|
|
55
|
+
|
|
56
|
+
// ============================================
|
|
57
|
+
// BASE MIXINS
|
|
58
|
+
// ============================================
|
|
59
|
+
|
|
60
|
+
/// Базовая структура контейнера формы поиска
|
|
61
|
+
/// Устанавливает размеры и relative positioning для абсолютной кнопки
|
|
62
|
+
///
|
|
63
|
+
/// @param {Length} $width [$search-form-width] - Ширина формы
|
|
64
|
+
/// @param {Length} $height [$search-form-height] - Высота формы
|
|
65
|
+
/// @example scss
|
|
66
|
+
/// .my-search {
|
|
67
|
+
/// @include search-form-base;
|
|
68
|
+
/// }
|
|
69
|
+
/// @example scss - Кастомные размеры
|
|
70
|
+
/// .my-search {
|
|
71
|
+
/// @include search-form-base(20rem, 3rem);
|
|
72
|
+
/// }
|
|
73
|
+
/// @output position, width, height
|
|
74
|
+
/// @group search-form
|
|
75
|
+
/// @access public
|
|
76
|
+
@mixin search-form-base($width: $search-form-width, $height: $search-form-height) {
|
|
77
|
+
position: relative;
|
|
78
|
+
z-index: 20;
|
|
79
|
+
width: $width;
|
|
80
|
+
height: $height;
|
|
81
|
+
|
|
82
|
+
// Доступность: минимальный размер touch target
|
|
83
|
+
min-height: 44px;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/// Базовые стили поля ввода поиска
|
|
87
|
+
/// Input занимает 100% размеров контейнера
|
|
88
|
+
///
|
|
89
|
+
/// @example scss
|
|
90
|
+
/// .my-search__input {
|
|
91
|
+
/// @include search-form-input-base;
|
|
92
|
+
/// }
|
|
93
|
+
/// @output width: 100%, height: 100%, padding, font-size, border-radius
|
|
94
|
+
/// @group search-form
|
|
95
|
+
/// @access public
|
|
96
|
+
@mixin search-form-input-base {
|
|
97
|
+
// Занимаем всё пространство формы
|
|
98
|
+
width: 100%;
|
|
99
|
+
height: 100%;
|
|
100
|
+
|
|
101
|
+
// Отступы
|
|
102
|
+
padding-left: spacing.$spacing-md;
|
|
103
|
+
padding-right: $search-form-icon-offset + $search-form-icon-size + 0.5rem;
|
|
104
|
+
|
|
105
|
+
// Типографика
|
|
106
|
+
font-size: typography.$font-size-sm;
|
|
107
|
+
|
|
108
|
+
// Скругление
|
|
109
|
+
border-radius: radius.$radius-sm;
|
|
110
|
+
|
|
111
|
+
// Убираем стандартные стили
|
|
112
|
+
appearance: none;
|
|
113
|
+
-webkit-appearance: none;
|
|
114
|
+
|
|
115
|
+
&::-webkit-search-cancel-button,
|
|
116
|
+
&::-webkit-search-decoration {
|
|
117
|
+
-webkit-appearance: none;
|
|
118
|
+
appearance: none;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/// Базовые стили кнопки поиска (иконка)
|
|
123
|
+
/// Позиционирование и размеры SVG
|
|
124
|
+
///
|
|
125
|
+
/// @example scss
|
|
126
|
+
/// .my-search__button {
|
|
127
|
+
/// @include search-form-button-base;
|
|
128
|
+
/// }
|
|
129
|
+
/// @output position, размеры, сброс стилей кнопки
|
|
130
|
+
/// @group search-form
|
|
131
|
+
/// @access public
|
|
132
|
+
@mixin search-form-button-base {
|
|
133
|
+
position: absolute;
|
|
134
|
+
right: $search-form-icon-offset;
|
|
135
|
+
top: 50%;
|
|
136
|
+
transform: translateY(-50%);
|
|
137
|
+
|
|
138
|
+
// Сброс стилей кнопки
|
|
139
|
+
padding: 0;
|
|
140
|
+
margin: 0;
|
|
141
|
+
background: transparent;
|
|
142
|
+
border: none;
|
|
143
|
+
cursor: pointer;
|
|
144
|
+
|
|
145
|
+
// Доступность: минимальный размер touch target
|
|
146
|
+
// Увеличиваем кликабельную область
|
|
147
|
+
&::before {
|
|
148
|
+
content: "";
|
|
149
|
+
position: absolute;
|
|
150
|
+
top: 50%;
|
|
151
|
+
left: 50%;
|
|
152
|
+
transform: translate(-50%, -50%);
|
|
153
|
+
width: 44px;
|
|
154
|
+
height: 44px;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
svg {
|
|
158
|
+
width: $search-form-icon-size;
|
|
159
|
+
height: $search-form-icon-size;
|
|
160
|
+
fill: currentColor;
|
|
161
|
+
display: block;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// ============================================
|
|
166
|
+
// THEME MIXINS
|
|
167
|
+
// ============================================
|
|
168
|
+
|
|
169
|
+
/// Тема для поля ввода поиска
|
|
170
|
+
/// Устанавливает цвета фона, границы, текста, placeholder
|
|
171
|
+
///
|
|
172
|
+
/// @param {String} $color - Имя цвета из палитры темы
|
|
173
|
+
/// @param {Number} $bg-alpha [0.1] - Прозрачность фона
|
|
174
|
+
/// @param {Number} $border-alpha [0.2] - Прозрачность границы
|
|
175
|
+
/// @param {Number} $placeholder-alpha [0.5] - Прозрачность placeholder
|
|
176
|
+
/// @require {mixin} mixins.hsl-prop
|
|
177
|
+
/// @require {mixin} mixins.border-hsl
|
|
178
|
+
/// @require {mixin} animations.input-focus-light
|
|
179
|
+
/// @example scss - На тёмном фоне
|
|
180
|
+
/// .search__input {
|
|
181
|
+
/// @include search-form-input-theme(primary-foreground);
|
|
182
|
+
/// }
|
|
183
|
+
/// @example scss - На светлом фоне
|
|
184
|
+
/// .search__input {
|
|
185
|
+
/// @include search-form-input-theme(primary, 0.05, 0.15);
|
|
186
|
+
/// }
|
|
187
|
+
/// @output background-color, border, color, placeholder, focus
|
|
188
|
+
/// @group search-form
|
|
189
|
+
/// @access public
|
|
190
|
+
@mixin search-form-input-theme($color, $bg-alpha: 0.1, $border-alpha: 0.2, $placeholder-alpha: 0.5) {
|
|
191
|
+
@include mixins.hsl-prop(background-color, $color, $bg-alpha);
|
|
192
|
+
@include mixins.border-hsl(1px, solid, $color, $border-alpha);
|
|
193
|
+
@include mixins.text-color($color);
|
|
194
|
+
|
|
195
|
+
&::placeholder {
|
|
196
|
+
@include mixins.hsl-prop(color, $color, $placeholder-alpha);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
@include animations.input-focus-light($color);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/// Тема для кнопки поиска
|
|
203
|
+
/// Устанавливает цвет иконки и hover-состояние
|
|
204
|
+
///
|
|
205
|
+
/// @param {String} $color - Имя цвета из палитры темы
|
|
206
|
+
/// @param {Number} $alpha [0.6] - Прозрачность цвета
|
|
207
|
+
/// @param {Number} $hover-alpha [1] - Прозрачность при hover
|
|
208
|
+
/// @require {mixin} mixins.hsl-prop
|
|
209
|
+
/// @require {mixin} animations.transition-colors
|
|
210
|
+
/// @example scss
|
|
211
|
+
/// .search__button {
|
|
212
|
+
/// @include search-form-button-theme(primary-foreground);
|
|
213
|
+
/// }
|
|
214
|
+
/// @output color, transition, hover
|
|
215
|
+
/// @group search-form
|
|
216
|
+
/// @access public
|
|
217
|
+
@mixin search-form-button-theme($color, $alpha: 0.6, $hover-alpha: 1) {
|
|
218
|
+
@include mixins.hsl-prop(color, $color, $alpha);
|
|
219
|
+
@include animations.transition-colors;
|
|
220
|
+
|
|
221
|
+
&:hover {
|
|
222
|
+
@include mixins.hsl-prop(color, $color, $hover-alpha);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
&:focus {
|
|
226
|
+
outline: none;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
&:focus-visible {
|
|
230
|
+
@include mixins.focus-ring($color);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// ============================================
|
|
235
|
+
// COMPOSITE MIXINS
|
|
236
|
+
// ============================================
|
|
237
|
+
|
|
238
|
+
/// Полный набор стилей для контейнера формы поиска
|
|
239
|
+
/// Комбинирует base + структуру для input и button
|
|
240
|
+
///
|
|
241
|
+
/// @param {String} $color - Имя цвета темы
|
|
242
|
+
/// @param {Length} $width [$search-form-width] - Ширина формы
|
|
243
|
+
/// @param {Length} $height [$search-form-height] - Высота формы
|
|
244
|
+
/// @example scss - Быстрое создание формы
|
|
245
|
+
/// .header__search-form {
|
|
246
|
+
/// @include search-form($color: primary-foreground);
|
|
247
|
+
/// }
|
|
248
|
+
/// @example scss - Кастомные размеры
|
|
249
|
+
/// .hero__search-form {
|
|
250
|
+
/// @include search-form(primary-foreground, 25rem, 3.5rem);
|
|
251
|
+
/// }
|
|
252
|
+
/// @output Полная структура формы с темой
|
|
253
|
+
/// @group search-form
|
|
254
|
+
/// @access public
|
|
255
|
+
@mixin search-form($color, $width: $search-form-width, $height: $search-form-height) {
|
|
256
|
+
@include search-form-base($width, $height);
|
|
257
|
+
|
|
258
|
+
// Стили для input внутри
|
|
259
|
+
input,
|
|
260
|
+
&__input {
|
|
261
|
+
@include search-form-input-base;
|
|
262
|
+
@include search-form-input-theme($color);
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
// Стили для button внутри
|
|
266
|
+
button,
|
|
267
|
+
&__button {
|
|
268
|
+
@include search-form-button-base;
|
|
269
|
+
@include search-form-button-theme($color);
|
|
270
|
+
}
|
|
271
|
+
}
|