@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,303 @@
|
|
|
1
|
+
////
|
|
2
|
+
/// News Card — карточка новости
|
|
3
|
+
/// Featured вариант с изображением и compact без изображения
|
|
4
|
+
/// @group components-news-card
|
|
5
|
+
/// @author MOEXP Team
|
|
6
|
+
////
|
|
7
|
+
|
|
8
|
+
@use "../abstracts/typography";
|
|
9
|
+
@use "../abstracts/spacing";
|
|
10
|
+
@use "../abstracts/mixins";
|
|
11
|
+
@use "../abstracts/radius";
|
|
12
|
+
@use "../abstracts/animations";
|
|
13
|
+
@use "../abstracts/breakpoints";
|
|
14
|
+
@use "../abstracts/cards";
|
|
15
|
+
@use "../font-vars" as fonts;
|
|
16
|
+
|
|
17
|
+
// ============================================
|
|
18
|
+
// ПЕРЕМЕННЫЕ
|
|
19
|
+
// ============================================
|
|
20
|
+
|
|
21
|
+
/// Высота изображения featured
|
|
22
|
+
/// @type Number
|
|
23
|
+
/// @group components-news-card
|
|
24
|
+
$news-card-image-height: 16rem !default;
|
|
25
|
+
|
|
26
|
+
/// Padding контента
|
|
27
|
+
/// @type Number
|
|
28
|
+
/// @group components-news-card
|
|
29
|
+
$news-card-padding: spacing.$spacing-xl !default;
|
|
30
|
+
|
|
31
|
+
/// Transition duration
|
|
32
|
+
/// @type Number
|
|
33
|
+
/// @group components-news-card
|
|
34
|
+
$news-card-transition: 300ms !default;
|
|
35
|
+
|
|
36
|
+
// ============================================
|
|
37
|
+
// МИКСИНЫ
|
|
38
|
+
// ============================================
|
|
39
|
+
|
|
40
|
+
/// Базовые стили карточки
|
|
41
|
+
/// @output Стили контейнера
|
|
42
|
+
/// @group components-news-card
|
|
43
|
+
@mixin news-card-base {
|
|
44
|
+
position: relative;
|
|
45
|
+
overflow: hidden;
|
|
46
|
+
display: block;
|
|
47
|
+
text-decoration: none;
|
|
48
|
+
color: inherit;
|
|
49
|
+
|
|
50
|
+
@include mixins.bg-color(background-card);
|
|
51
|
+
@include mixins.border-hsl(1px, solid, border, 0.5);
|
|
52
|
+
@include radius.rounded(lg);
|
|
53
|
+
@include mixins.shadow-sm;
|
|
54
|
+
|
|
55
|
+
cursor: pointer;
|
|
56
|
+
|
|
57
|
+
@include animations.transition((box-shadow, border-color), $news-card-transition, animations.$ease-in-out);
|
|
58
|
+
|
|
59
|
+
&:hover {
|
|
60
|
+
@include mixins.shadow-xl;
|
|
61
|
+
@include mixins.border-color-hsl(accent, 0.5);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
&:focus-visible {
|
|
65
|
+
@include mixins.focus-ring(ring);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/// Grid layout для featured
|
|
70
|
+
/// @param {String} $image-position [left] - Позиция изображения
|
|
71
|
+
/// @output Grid раскладка
|
|
72
|
+
/// @group components-news-card
|
|
73
|
+
@mixin news-card-grid($image-position: left) {
|
|
74
|
+
display: grid;
|
|
75
|
+
grid-template-columns: 1fr;
|
|
76
|
+
gap: 0;
|
|
77
|
+
|
|
78
|
+
@include breakpoints.md {
|
|
79
|
+
grid-template-columns: 1fr 1fr;
|
|
80
|
+
|
|
81
|
+
@if $image-position == right {
|
|
82
|
+
> *:first-child {
|
|
83
|
+
order: 2;
|
|
84
|
+
}
|
|
85
|
+
> *:last-child {
|
|
86
|
+
order: 1;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/// Обёртка изображения
|
|
93
|
+
/// @output Стили контейнера изображения
|
|
94
|
+
/// @group components-news-card
|
|
95
|
+
@mixin news-card-image-wrap {
|
|
96
|
+
position: relative;
|
|
97
|
+
height: $news-card-image-height;
|
|
98
|
+
overflow: hidden;
|
|
99
|
+
|
|
100
|
+
@include breakpoints.md {
|
|
101
|
+
height: auto;
|
|
102
|
+
min-height: $news-card-image-height;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/// Изображение с hover
|
|
107
|
+
/// @output Стили изображения
|
|
108
|
+
/// @group components-news-card
|
|
109
|
+
@mixin news-card-image {
|
|
110
|
+
width: 100%;
|
|
111
|
+
height: 100%;
|
|
112
|
+
object-fit: cover;
|
|
113
|
+
|
|
114
|
+
@include animations.transition(transform, $news-card-transition, animations.$ease-out);
|
|
115
|
+
|
|
116
|
+
.news-card:hover & {
|
|
117
|
+
transform: scale(1.05);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/// Контент карточки
|
|
122
|
+
/// @output Flex layout
|
|
123
|
+
/// @group components-news-card
|
|
124
|
+
@mixin news-card-content {
|
|
125
|
+
display: flex;
|
|
126
|
+
flex-direction: column;
|
|
127
|
+
justify-content: center;
|
|
128
|
+
padding: $news-card-padding;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/// Мета-информация (дата)
|
|
132
|
+
/// @param {String} $color [accent-on-light] - Цвет
|
|
133
|
+
/// @output Стили meta
|
|
134
|
+
/// @group components-news-card
|
|
135
|
+
@mixin news-card-meta($color: accent-on-light) {
|
|
136
|
+
display: flex;
|
|
137
|
+
align-items: center;
|
|
138
|
+
gap: spacing.$gap-xs;
|
|
139
|
+
margin-bottom: spacing.$spacing-md;
|
|
140
|
+
|
|
141
|
+
@include mixins.text-color($color);
|
|
142
|
+
|
|
143
|
+
svg {
|
|
144
|
+
width: 1.25rem;
|
|
145
|
+
height: 1.25rem;
|
|
146
|
+
flex-shrink: 0;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
span {
|
|
150
|
+
font-size: typography.$font-size-base;
|
|
151
|
+
font-weight: typography.$font-weight-medium;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/// Заголовок с hover
|
|
156
|
+
/// @param {String} $color [foreground] - Цвет
|
|
157
|
+
/// @param {String} $hover-color [accent-on-light] - Цвет при hover
|
|
158
|
+
/// @output Стили заголовка
|
|
159
|
+
/// @group components-news-card
|
|
160
|
+
@mixin news-card-title($color: foreground, $hover-color: accent-on-light) {
|
|
161
|
+
font-family: fonts.$font-literata;
|
|
162
|
+
font-weight: typography.$font-weight-bold;
|
|
163
|
+
font-size: typography.$font-size-2xl;
|
|
164
|
+
line-height: typography.$line-height-tight;
|
|
165
|
+
margin-bottom: spacing.$spacing-md;
|
|
166
|
+
|
|
167
|
+
@include mixins.text-color($color);
|
|
168
|
+
@include animations.transition(color, $news-card-transition);
|
|
169
|
+
|
|
170
|
+
.news-card:hover & {
|
|
171
|
+
@include mixins.text-color($hover-color);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
@include breakpoints.md-down {
|
|
175
|
+
font-size: typography.$font-size-xl;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/// Описание
|
|
180
|
+
/// @param {String} $color [foreground-muted] - Цвет
|
|
181
|
+
/// @output Стили описания
|
|
182
|
+
/// @group components-news-card
|
|
183
|
+
@mixin news-card-description($color: foreground-muted) {
|
|
184
|
+
font-size: typography.$font-size-base;
|
|
185
|
+
line-height: typography.$line-height-relaxed;
|
|
186
|
+
|
|
187
|
+
@include mixins.text-color($color);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// ============================================
|
|
191
|
+
// CSS КЛАССЫ
|
|
192
|
+
// ============================================
|
|
193
|
+
|
|
194
|
+
.news-card {
|
|
195
|
+
@include news-card-base;
|
|
196
|
+
|
|
197
|
+
// ──────────────────────────────
|
|
198
|
+
// Элементы
|
|
199
|
+
// ──────────────────────────────
|
|
200
|
+
|
|
201
|
+
&__grid {
|
|
202
|
+
@include news-card-grid(left);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
&__image-wrap {
|
|
206
|
+
@include news-card-image-wrap;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
&__image {
|
|
210
|
+
@include news-card-image;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
&__content {
|
|
214
|
+
@include news-card-content;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
&__meta {
|
|
218
|
+
@include news-card-meta(accent-on-light);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
&__title {
|
|
222
|
+
@include news-card-title(foreground, accent-on-light);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
&__description {
|
|
226
|
+
@include news-card-description(foreground-muted);
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
// ──────────────────────────────
|
|
230
|
+
// Изображение справа
|
|
231
|
+
// ──────────────────────────────
|
|
232
|
+
|
|
233
|
+
&--image-right {
|
|
234
|
+
.news-card__grid {
|
|
235
|
+
@include news-card-grid(right);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
// ──────────────────────────────
|
|
240
|
+
// Компактный вариант (без изображения)
|
|
241
|
+
// ──────────────────────────────
|
|
242
|
+
|
|
243
|
+
&--compact {
|
|
244
|
+
.news-card__content {
|
|
245
|
+
padding: spacing.$spacing-lg;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
.news-card__title {
|
|
249
|
+
font-size: typography.$font-size-lg;
|
|
250
|
+
margin-bottom: spacing.$spacing-sm;
|
|
251
|
+
|
|
252
|
+
@include breakpoints.md-down {
|
|
253
|
+
font-size: typography.$font-size-base;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
.news-card__meta {
|
|
258
|
+
margin-bottom: spacing.$spacing-sm;
|
|
259
|
+
|
|
260
|
+
svg {
|
|
261
|
+
width: 1rem;
|
|
262
|
+
height: 1rem;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
span {
|
|
266
|
+
font-size: typography.$font-size-sm;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
.news-card__description {
|
|
271
|
+
font-size: typography.$font-size-sm;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
// ──────────────────────────────
|
|
276
|
+
// На тёмном фоне
|
|
277
|
+
// ──────────────────────────────
|
|
278
|
+
|
|
279
|
+
&--on-dark {
|
|
280
|
+
@include mixins.bg-color(primary, 0.1);
|
|
281
|
+
@include mixins.border-hsl(1px, solid, primary-foreground, 0.2);
|
|
282
|
+
|
|
283
|
+
&:hover {
|
|
284
|
+
@include mixins.border-color-hsl(accent, 0.6);
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
.news-card__meta {
|
|
288
|
+
@include mixins.text-color(accent);
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
.news-card__title {
|
|
292
|
+
@include mixins.text-color(primary-foreground);
|
|
293
|
+
|
|
294
|
+
.news-card:hover & {
|
|
295
|
+
@include mixins.text-color(accent);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
.news-card__description {
|
|
300
|
+
@include mixins.text-color(primary-foreground, 0.75);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
////
|
|
2
|
+
/// Project Card — карточка проекта
|
|
3
|
+
/// CSS-классы компонента
|
|
4
|
+
/// @group components-project-card
|
|
5
|
+
/// @author MOEXP Team
|
|
6
|
+
////
|
|
7
|
+
|
|
8
|
+
@use "../abstracts/project-card" as project;
|
|
9
|
+
@use "../abstracts/spacing";
|
|
10
|
+
@use "../abstracts/mixins";
|
|
11
|
+
@use "../abstracts/animations";
|
|
12
|
+
|
|
13
|
+
// ============================================
|
|
14
|
+
// CSS КЛАССЫ
|
|
15
|
+
// ============================================
|
|
16
|
+
|
|
17
|
+
.project-card {
|
|
18
|
+
@include project.base;
|
|
19
|
+
|
|
20
|
+
// ──────────────────────────────
|
|
21
|
+
// Элементы
|
|
22
|
+
// ──────────────────────────────
|
|
23
|
+
|
|
24
|
+
&__year {
|
|
25
|
+
@include project.year(background-section, foreground-muted);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
&__image-wrap {
|
|
29
|
+
@include project.image-wrap;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
&__image {
|
|
33
|
+
@include project.image;
|
|
34
|
+
|
|
35
|
+
.project-card:hover & {
|
|
36
|
+
transform: scale(1.05);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
&__content {
|
|
41
|
+
@include project.content;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
&__meta {
|
|
45
|
+
@include project.meta(project-card-meta-color);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
&__title {
|
|
49
|
+
@include project.title(foreground, accent-on-light);
|
|
50
|
+
|
|
51
|
+
.project-card:hover & {
|
|
52
|
+
@include mixins.text-color(accent-on-light);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
&__description {
|
|
57
|
+
@include project.description(foreground-muted, 2);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// ──────────────────────────────
|
|
61
|
+
// На тёмном фоне
|
|
62
|
+
// ──────────────────────────────
|
|
63
|
+
|
|
64
|
+
&--on-dark {
|
|
65
|
+
@include mixins.bg-color(primary, 0.1);
|
|
66
|
+
@include mixins.border-hsl(1px, solid, primary-foreground, 0.2);
|
|
67
|
+
|
|
68
|
+
&:hover {
|
|
69
|
+
@include mixins.border-color-hsl(accent, 0.6);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
.project-card__year {
|
|
73
|
+
@include mixins.bg-color(primary, 0.3);
|
|
74
|
+
@include mixins.text-color(primary-foreground, 0.9);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
.project-card__meta {
|
|
78
|
+
@include mixins.text-color(accent);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
.project-card__title {
|
|
82
|
+
@include mixins.text-color(primary-foreground);
|
|
83
|
+
|
|
84
|
+
.project-card:hover & {
|
|
85
|
+
@include mixins.text-color(accent);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
.project-card__description {
|
|
90
|
+
@include mixins.text-color(primary-foreground, 0.75);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// SEARCH FORM COMPONENT
|
|
3
|
+
// local\common\theme-moexp\src\scss\components\_search-form.scss
|
|
4
|
+
// ============================================
|
|
5
|
+
|
|
6
|
+
////
|
|
7
|
+
/// Search Form — форма поиска с иконкой внутри поля
|
|
8
|
+
///
|
|
9
|
+
/// Готовые CSS-классы для использования в HTML.
|
|
10
|
+
/// Размеры задаются на уровне формы (.search-form),
|
|
11
|
+
/// input автоматически занимает 100% пространства.
|
|
12
|
+
///
|
|
13
|
+
/// @group components-search-form
|
|
14
|
+
/// @author MOEXP Team
|
|
15
|
+
/// @since 1.0.0
|
|
16
|
+
///
|
|
17
|
+
/// @example html - Базовая форма (на тёмном фоне)
|
|
18
|
+
/// <form class="search-form">
|
|
19
|
+
/// <label for="search-input" class="visually-hidden">Поиск по сайту</label>
|
|
20
|
+
/// <input
|
|
21
|
+
/// id="search-input"
|
|
22
|
+
/// class="search-form__input"
|
|
23
|
+
/// type="search"
|
|
24
|
+
/// name="q"
|
|
25
|
+
/// placeholder="Поиск..."
|
|
26
|
+
/// />
|
|
27
|
+
/// <button class="search-form__button" type="submit" aria-label="Найти">
|
|
28
|
+
/// <svg class="search-form__icon" aria-hidden="true" focusable="false">
|
|
29
|
+
/// <use xlink:href="sprite.svg#SearchTwotone"></use>
|
|
30
|
+
/// </svg>
|
|
31
|
+
/// </button>
|
|
32
|
+
/// </form>
|
|
33
|
+
////
|
|
34
|
+
|
|
35
|
+
@use "../abstracts/search-form" as sf;
|
|
36
|
+
@use "../abstracts/mixins";
|
|
37
|
+
@use "../abstracts/animations";
|
|
38
|
+
|
|
39
|
+
// ============================================
|
|
40
|
+
// BASE
|
|
41
|
+
// ============================================
|
|
42
|
+
|
|
43
|
+
/// Контейнер формы поиска
|
|
44
|
+
/// @output position: relative, width, height для контейнера
|
|
45
|
+
.search-form {
|
|
46
|
+
@include sf.search-form-base;
|
|
47
|
+
|
|
48
|
+
// ----------------------------------------
|
|
49
|
+
// INPUT
|
|
50
|
+
// ----------------------------------------
|
|
51
|
+
|
|
52
|
+
/// Поле ввода поиска (занимает 100% формы)
|
|
53
|
+
/// @output width: 100%, height: 100%, отступы, тема
|
|
54
|
+
&__input {
|
|
55
|
+
@include sf.search-form-input-base;
|
|
56
|
+
@include sf.search-form-input-theme(primary-foreground);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// ----------------------------------------
|
|
60
|
+
// BUTTON
|
|
61
|
+
// ----------------------------------------
|
|
62
|
+
|
|
63
|
+
/// Кнопка поиска (иконка)
|
|
64
|
+
/// @output Позиционирование, сброс стилей, тема
|
|
65
|
+
&__button {
|
|
66
|
+
@include sf.search-form-button-base;
|
|
67
|
+
@include sf.search-form-button-theme(primary-foreground);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// ----------------------------------------
|
|
71
|
+
// ICON
|
|
72
|
+
// ----------------------------------------
|
|
73
|
+
|
|
74
|
+
/// Иконка внутри кнопки
|
|
75
|
+
/// @output Наследует стили из button-base
|
|
76
|
+
&__icon {
|
|
77
|
+
width: sf.$search-form-icon-size;
|
|
78
|
+
height: sf.$search-form-icon-size;
|
|
79
|
+
fill: currentColor;
|
|
80
|
+
display: block;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// ============================================
|
|
85
|
+
// SIZE VARIANTS
|
|
86
|
+
// ============================================
|
|
87
|
+
|
|
88
|
+
/// Маленькая форма поиска
|
|
89
|
+
/// @example html
|
|
90
|
+
/// <form class="search-form search-form--sm">...</form>
|
|
91
|
+
.search-form--sm {
|
|
92
|
+
width: 12rem;
|
|
93
|
+
height: 2rem;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/// Большая форма поиска
|
|
97
|
+
/// @example html
|
|
98
|
+
/// <form class="search-form search-form--lg">...</form>
|
|
99
|
+
.search-form--lg {
|
|
100
|
+
width: 20rem;
|
|
101
|
+
height: 3rem;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/// Форма на всю ширину контейнера
|
|
105
|
+
/// @example html
|
|
106
|
+
/// <form class="search-form search-form--full">...</form>
|
|
107
|
+
.search-form--full {
|
|
108
|
+
width: 100%;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// ============================================
|
|
112
|
+
// CONTEXT VARIANTS
|
|
113
|
+
// ============================================
|
|
114
|
+
|
|
115
|
+
/// Вариант для светлого фона
|
|
116
|
+
.search-form--on-light {
|
|
117
|
+
.search-form__input {
|
|
118
|
+
@include sf.search-form-input-theme(search-on-light-color, 0.05, 0.2, 0.4);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
.search-form__button {
|
|
122
|
+
@include sf.search-form-button-theme(search-on-light-color);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/// Вариант для тёмного фона (явное указание)
|
|
127
|
+
.search-form--on-dark {
|
|
128
|
+
@include mixins.bg-color(primary);
|
|
129
|
+
.search-form__input {
|
|
130
|
+
@include sf.search-form-input-theme(primary-foreground);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
.search-form__button {
|
|
134
|
+
@include sf.search-form-button-theme(primary-foreground);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// ─────────────────────────────────────────
|
|
138
|
+
// В тёмной теме: остаётся светлым (для контраста с primary фоном)
|
|
139
|
+
// ─────────────────────────────────────────
|
|
140
|
+
.dark & {
|
|
141
|
+
.search-form__input {
|
|
142
|
+
@include sf.search-form-input-theme(primary-foreground, 0.15, 0.3, 0.5);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
.search-form__button {
|
|
146
|
+
@include sf.search-form-button-theme(primary-foreground);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// ============================================
|
|
152
|
+
// STATES
|
|
153
|
+
// ============================================
|
|
154
|
+
|
|
155
|
+
/// Отключённое состояние
|
|
156
|
+
.search-form--disabled,
|
|
157
|
+
.search-form[aria-disabled="true"] {
|
|
158
|
+
opacity: 0.5;
|
|
159
|
+
pointer-events: none;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/// Автоопределение disabled по состоянию input
|
|
163
|
+
@supports selector(:has(*)) {
|
|
164
|
+
.search-form:has(input:disabled) {
|
|
165
|
+
opacity: 0.5;
|
|
166
|
+
pointer-events: none;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// .search-overlay {
|
|
171
|
+
// position: fixed;
|
|
172
|
+
// inset: 0;
|
|
173
|
+
// @include mixins.hsl-prop(background-color, "overlay", 0.5);
|
|
174
|
+
// z-index: 10;
|
|
175
|
+
// opacity: 0;
|
|
176
|
+
// transition: opacity 0.3s ease;
|
|
177
|
+
// }
|
|
178
|
+
|
|
179
|
+
// .search-overlay.is-active {
|
|
180
|
+
// opacity: 1;
|
|
181
|
+
// }
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// SECTION TITLE COMPONENT
|
|
3
|
+
// local/common/theme-moexp/src/scss/components/_section-title.scss
|
|
4
|
+
// ============================================
|
|
5
|
+
|
|
6
|
+
////
|
|
7
|
+
/// Section Title — компонент заголовка секции
|
|
8
|
+
/// CSS-классы компонента
|
|
9
|
+
/// @group components-section-title
|
|
10
|
+
/// @author MOEXP Team
|
|
11
|
+
////
|
|
12
|
+
|
|
13
|
+
@use "../abstracts/section-title" as st;
|
|
14
|
+
@use "../abstracts/mixins";
|
|
15
|
+
|
|
16
|
+
// ============================================
|
|
17
|
+
// CSS КЛАССЫ
|
|
18
|
+
// ============================================
|
|
19
|
+
|
|
20
|
+
.section-title {
|
|
21
|
+
@include st.base(center);
|
|
22
|
+
|
|
23
|
+
// ──────────────────────────────
|
|
24
|
+
// Элементы
|
|
25
|
+
// ──────────────────────────────
|
|
26
|
+
|
|
27
|
+
&__slogan {
|
|
28
|
+
@include st.slogan(foreground-muted);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
&__title {
|
|
32
|
+
@include st.title(foreground);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
&__subtitle {
|
|
36
|
+
@include st.subtitle(foreground);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// ──────────────────────────────
|
|
40
|
+
// Модификатор для тёмного фона
|
|
41
|
+
// ──────────────────────────────
|
|
42
|
+
|
|
43
|
+
&--on-dark {
|
|
44
|
+
.section-title__slogan {
|
|
45
|
+
@include mixins.text-color(primary-foreground, 0.7);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
.section-title__title {
|
|
49
|
+
@include mixins.text-color(primary-foreground);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
.section-title__subtitle {
|
|
53
|
+
@include mixins.text-color(primary-foreground, 0.85);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
&--on-accent {
|
|
58
|
+
.section-title__slogan {
|
|
59
|
+
@include mixins.text-color(accent-foreground, 0.7);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
.section-title__title {
|
|
63
|
+
@include mixins.text-color(accent-foreground);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.section-title__subtitle {
|
|
67
|
+
@include mixins.text-color(accent-foreground, 0.85);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// ──────────────────────────────
|
|
72
|
+
// Модификаторы выравнивания
|
|
73
|
+
// ──────────────────────────────
|
|
74
|
+
|
|
75
|
+
&--left {
|
|
76
|
+
@include st.align-left;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
&--right {
|
|
80
|
+
@include st.align-right;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// ──────────────────────────────
|
|
84
|
+
// Модификаторы отступов
|
|
85
|
+
// ──────────────────────────────
|
|
86
|
+
|
|
87
|
+
&--compact {
|
|
88
|
+
@include st.compact;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
&--no-margin {
|
|
92
|
+
@include st.no-margin;
|
|
93
|
+
}
|
|
94
|
+
}
|