@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,363 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// CARDS — FEATURED
|
|
3
|
+
// local/common/theme-moexp/src/scss/abstracts/cards/_featured.scss
|
|
4
|
+
// ============================================
|
|
5
|
+
|
|
6
|
+
////
|
|
7
|
+
/// Featured карточки с изображением
|
|
8
|
+
/// Горизонтальная и вертикальная раскладка
|
|
9
|
+
/// @group cards-featured
|
|
10
|
+
/// @author MOEXP Team
|
|
11
|
+
////
|
|
12
|
+
|
|
13
|
+
@use "../mixins";
|
|
14
|
+
@use "../radius";
|
|
15
|
+
@use "../spacing";
|
|
16
|
+
@use "../typography";
|
|
17
|
+
@use "../animations";
|
|
18
|
+
@use "../breakpoints";
|
|
19
|
+
@use "variables" as *;
|
|
20
|
+
|
|
21
|
+
// ─────────────────────────────────────────
|
|
22
|
+
// FEATURED CONTAINER
|
|
23
|
+
// ─────────────────────────────────────────
|
|
24
|
+
|
|
25
|
+
/// Карточка с изображением — контейнер
|
|
26
|
+
/// Горизонтальная раскладка на десктопе
|
|
27
|
+
/// @param {String} $image-position [left] - Позиция изображения: left или right
|
|
28
|
+
/// @require {mixin} mixins.bg-color
|
|
29
|
+
/// @require {mixin} mixins.border-hsl
|
|
30
|
+
/// @require {mixin} radius.rounded
|
|
31
|
+
/// @require {mixin} mixins.shadow-sm
|
|
32
|
+
/// @require {mixin} animations.transition
|
|
33
|
+
/// @require {mixin} mixins.shadow-xl
|
|
34
|
+
/// @require {mixin} mixins.border-color-hsl
|
|
35
|
+
/// @example scss
|
|
36
|
+
/// .news-featured {
|
|
37
|
+
/// @include card-featured('right');
|
|
38
|
+
/// }
|
|
39
|
+
/// @output Контейнер featured карточки
|
|
40
|
+
/// @group cards-featured
|
|
41
|
+
/// @access public
|
|
42
|
+
@mixin card-featured($image-position: left) {
|
|
43
|
+
position: relative;
|
|
44
|
+
overflow: hidden;
|
|
45
|
+
|
|
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), $card-featured-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
|
+
|
|
65
|
+
// ─────────────────────────────────────────
|
|
66
|
+
// FEATURED GRID
|
|
67
|
+
// ─────────────────────────────────────────
|
|
68
|
+
|
|
69
|
+
/// Grid layout для featured card
|
|
70
|
+
/// @param {String} $image-position [left] - Позиция изображения: left или right
|
|
71
|
+
/// @require {mixin} breakpoints.md
|
|
72
|
+
/// @example scss
|
|
73
|
+
/// .news-featured__grid {
|
|
74
|
+
/// @include card-featured-grid('right');
|
|
75
|
+
/// }
|
|
76
|
+
/// @output Grid с адаптивной раскладкой
|
|
77
|
+
/// @group cards-featured
|
|
78
|
+
/// @access public
|
|
79
|
+
@mixin card-featured-grid($image-position: left) {
|
|
80
|
+
display: grid;
|
|
81
|
+
grid-template-columns: 1fr;
|
|
82
|
+
gap: 0;
|
|
83
|
+
|
|
84
|
+
@include breakpoints.md {
|
|
85
|
+
grid-template-columns: 1fr 1fr;
|
|
86
|
+
|
|
87
|
+
@if $image-position == right {
|
|
88
|
+
// Изображение справа — меняем порядок
|
|
89
|
+
> *:first-child {
|
|
90
|
+
order: 2;
|
|
91
|
+
}
|
|
92
|
+
> *:last-child {
|
|
93
|
+
order: 1;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// ─────────────────────────────────────────
|
|
100
|
+
// FEATURED IMAGE
|
|
101
|
+
// ─────────────────────────────────────────
|
|
102
|
+
|
|
103
|
+
/// Контейнер изображения featured card
|
|
104
|
+
/// @require {mixin} breakpoints.md
|
|
105
|
+
/// @example scss
|
|
106
|
+
/// .news-featured__image-wrap {
|
|
107
|
+
/// @include card-featured-image-wrapper;
|
|
108
|
+
/// }
|
|
109
|
+
/// @output Контейнер с адаптивной высотой
|
|
110
|
+
/// @group cards-featured
|
|
111
|
+
/// @access public
|
|
112
|
+
@mixin card-featured-image-wrapper {
|
|
113
|
+
position: relative;
|
|
114
|
+
height: $card-featured-image-height;
|
|
115
|
+
overflow: hidden;
|
|
116
|
+
|
|
117
|
+
@include breakpoints.md {
|
|
118
|
+
height: auto;
|
|
119
|
+
min-height: $card-featured-image-height;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/// Изображение featured card с hover эффектом
|
|
124
|
+
/// @require {mixin} animations.transition
|
|
125
|
+
/// @example scss
|
|
126
|
+
/// .news-featured__image {
|
|
127
|
+
/// @include card-featured-image;
|
|
128
|
+
/// }
|
|
129
|
+
/// @output Изображение cover с scale при hover родителя
|
|
130
|
+
/// @group cards-featured
|
|
131
|
+
/// @access public
|
|
132
|
+
@mixin card-featured-image {
|
|
133
|
+
width: 100%;
|
|
134
|
+
height: 100%;
|
|
135
|
+
object-fit: cover;
|
|
136
|
+
|
|
137
|
+
@include animations.transition(transform, $card-featured-transition, animations.$ease-out);
|
|
138
|
+
|
|
139
|
+
// Hover на родителе (group hover)
|
|
140
|
+
.card-featured:hover &,
|
|
141
|
+
[class*="card"]:hover & {
|
|
142
|
+
transform: scale(1.05);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// ─────────────────────────────────────────
|
|
147
|
+
// FEATURED CONTENT
|
|
148
|
+
// ─────────────────────────────────────────
|
|
149
|
+
|
|
150
|
+
/// Контент featured card
|
|
151
|
+
/// @example scss
|
|
152
|
+
/// .news-featured__content {
|
|
153
|
+
/// @include card-featured-content;
|
|
154
|
+
/// }
|
|
155
|
+
/// @output Flex column с центрированием
|
|
156
|
+
/// @group cards-featured
|
|
157
|
+
/// @access public
|
|
158
|
+
@mixin card-featured-content {
|
|
159
|
+
display: flex;
|
|
160
|
+
flex-direction: column;
|
|
161
|
+
justify-content: center;
|
|
162
|
+
padding: $card-featured-padding;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/// Мета-информация featured card (дата, категория)
|
|
166
|
+
/// @param {String} $color [accent-on-light] - Цвет текста
|
|
167
|
+
/// @require {mixin} mixins.text-color
|
|
168
|
+
/// @example scss
|
|
169
|
+
/// .news-featured__meta {
|
|
170
|
+
/// @include card-featured-meta('primary');
|
|
171
|
+
/// }
|
|
172
|
+
/// @output Flex строка с иконкой и текстом
|
|
173
|
+
/// @group cards-featured
|
|
174
|
+
/// @access public
|
|
175
|
+
@mixin card-featured-meta($color: accent-on-light) {
|
|
176
|
+
display: flex;
|
|
177
|
+
align-items: center;
|
|
178
|
+
gap: 0.5rem;
|
|
179
|
+
margin-bottom: 1rem;
|
|
180
|
+
|
|
181
|
+
@include mixins.text-color($color);
|
|
182
|
+
|
|
183
|
+
svg {
|
|
184
|
+
width: 1.25rem;
|
|
185
|
+
height: 1.25rem;
|
|
186
|
+
flex-shrink: 0;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
span {
|
|
190
|
+
font-size: typography.$font-size-base;
|
|
191
|
+
font-weight: typography.$font-weight-medium;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/// Заголовок featured card с hover эффектом
|
|
196
|
+
/// @param {String} $color [foreground] - Цвет текста
|
|
197
|
+
/// @param {String} $hover-color [accent] - Цвет при hover
|
|
198
|
+
/// @require {mixin} mixins.text-color
|
|
199
|
+
/// @require {mixin} animations.transition
|
|
200
|
+
/// @example scss
|
|
201
|
+
/// .news-featured__title {
|
|
202
|
+
/// @include card-featured-title('foreground', 'accent-on-light');
|
|
203
|
+
/// }
|
|
204
|
+
/// @output Заголовок с hover цветом
|
|
205
|
+
/// @group cards-featured
|
|
206
|
+
/// @access public
|
|
207
|
+
@mixin card-featured-title($color: foreground, $hover-color: accent) {
|
|
208
|
+
font-weight: typography.$font-weight-bold;
|
|
209
|
+
font-size: typography.$font-size-2xl;
|
|
210
|
+
line-height: typography.$line-height-tight;
|
|
211
|
+
margin-bottom: 1rem;
|
|
212
|
+
|
|
213
|
+
@include mixins.text-color($color);
|
|
214
|
+
@include animations.transition(color, $card-featured-transition);
|
|
215
|
+
|
|
216
|
+
.card-featured:hover &,
|
|
217
|
+
[class*="card"]:hover & {
|
|
218
|
+
@include mixins.text-color($hover-color);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/// Описание featured card
|
|
223
|
+
/// @param {String} $color [foreground-muted] - Цвет текста
|
|
224
|
+
/// @require {mixin} mixins.text-color
|
|
225
|
+
/// @example scss
|
|
226
|
+
/// .news-featured__description {
|
|
227
|
+
/// @include card-featured-description;
|
|
228
|
+
/// }
|
|
229
|
+
/// @output Параграф с muted цветом
|
|
230
|
+
/// @group cards-featured
|
|
231
|
+
/// @access public
|
|
232
|
+
@mixin card-featured-description($color: foreground-muted) {
|
|
233
|
+
font-size: typography.$font-size-base;
|
|
234
|
+
line-height: typography.$line-height-relaxed;
|
|
235
|
+
|
|
236
|
+
@include mixins.text-color($color);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
// ─────────────────────────────────────────
|
|
240
|
+
// ВЕРТИКАЛЬНАЯ FEATURED CARD
|
|
241
|
+
// ─────────────────────────────────────────
|
|
242
|
+
|
|
243
|
+
/// Вертикальная featured карточка (изображение сверху)
|
|
244
|
+
/// @require {mixin} mixins.bg-color
|
|
245
|
+
/// @require {mixin} mixins.border-hsl
|
|
246
|
+
/// @require {mixin} radius.rounded
|
|
247
|
+
/// @require {mixin} animations.transition
|
|
248
|
+
/// @require {mixin} mixins.shadow-xl
|
|
249
|
+
/// @require {mixin} mixins.border-color-hsl
|
|
250
|
+
/// @example scss
|
|
251
|
+
/// .project-card {
|
|
252
|
+
/// @include card-featured-vertical;
|
|
253
|
+
/// }
|
|
254
|
+
/// @output Вертикальная карточка с hover
|
|
255
|
+
/// @group cards-featured
|
|
256
|
+
/// @access public
|
|
257
|
+
@mixin card-featured-vertical {
|
|
258
|
+
position: relative;
|
|
259
|
+
overflow: hidden;
|
|
260
|
+
|
|
261
|
+
display: block;
|
|
262
|
+
text-decoration: none;
|
|
263
|
+
color: inherit;
|
|
264
|
+
|
|
265
|
+
@include mixins.bg-color(background-card);
|
|
266
|
+
@include mixins.border-hsl(1px, solid, border, 0.5);
|
|
267
|
+
@include radius.rounded(lg);
|
|
268
|
+
|
|
269
|
+
cursor: pointer;
|
|
270
|
+
|
|
271
|
+
@include animations.transition((box-shadow, border-color), $card-featured-transition, animations.$ease-in-out);
|
|
272
|
+
|
|
273
|
+
&:hover {
|
|
274
|
+
@include mixins.shadow-xl;
|
|
275
|
+
@include mixins.border-color-hsl(accent, 0.5);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
/// Обёртка изображения вертикальной featured карточки
|
|
280
|
+
/// @example scss
|
|
281
|
+
/// .project-card__image-wrap {
|
|
282
|
+
/// @include card-featured-vertical-image-wrapper;
|
|
283
|
+
/// }
|
|
284
|
+
/// @output Контейнер с фиксированной высотой
|
|
285
|
+
/// @group cards-featured
|
|
286
|
+
/// @access public
|
|
287
|
+
@mixin card-featured-vertical-image-wrapper {
|
|
288
|
+
position: relative;
|
|
289
|
+
height: $card-featured-image-height;
|
|
290
|
+
overflow: hidden;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/// Контент вертикальной featured карточки
|
|
294
|
+
/// @example scss
|
|
295
|
+
/// .project-card__content {
|
|
296
|
+
/// @include card-featured-vertical-content;
|
|
297
|
+
/// }
|
|
298
|
+
/// @output Padding контента
|
|
299
|
+
/// @group cards-featured
|
|
300
|
+
/// @access public
|
|
301
|
+
@mixin card-featured-vertical-content {
|
|
302
|
+
padding: spacing.$spacing-lg;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
// ─────────────────────────────────────────
|
|
306
|
+
// КОМБИНИРОВАННЫЙ МИКСИН
|
|
307
|
+
// ─────────────────────────────────────────
|
|
308
|
+
|
|
309
|
+
/// Полный набор стилей featured card через селекторы
|
|
310
|
+
/// @param {String} $selector-image ['.card-featured__image-wrap'] - Селектор обёртки изображения
|
|
311
|
+
/// @param {String} $selector-img ['.card-featured__image'] - Селектор изображения
|
|
312
|
+
/// @param {String} $selector-content ['.card-featured__content'] - Селектор контента
|
|
313
|
+
/// @param {String} $selector-meta ['.card-featured__meta'] - Селектор мета
|
|
314
|
+
/// @param {String} $selector-title ['.card-featured__title'] - Селектор заголовка
|
|
315
|
+
/// @param {String} $selector-desc ['.card-featured__description'] - Селектор описания
|
|
316
|
+
/// @example scss
|
|
317
|
+
/// .news-featured {
|
|
318
|
+
/// @include card-featured-full(
|
|
319
|
+
/// '.news-featured__image-wrap',
|
|
320
|
+
/// '.news-featured__image',
|
|
321
|
+
/// '.news-featured__content',
|
|
322
|
+
/// '.news-featured__meta',
|
|
323
|
+
/// '.news-featured__title',
|
|
324
|
+
/// '.news-featured__description'
|
|
325
|
+
/// );
|
|
326
|
+
/// }
|
|
327
|
+
/// @output Полный набор стилей
|
|
328
|
+
/// @group cards-featured
|
|
329
|
+
/// @access public
|
|
330
|
+
@mixin card-featured-full(
|
|
331
|
+
$selector-image: ".card-featured__image-wrap",
|
|
332
|
+
$selector-img: ".card-featured__image",
|
|
333
|
+
$selector-content: ".card-featured__content",
|
|
334
|
+
$selector-meta: ".card-featured__meta",
|
|
335
|
+
$selector-title: ".card-featured__title",
|
|
336
|
+
$selector-desc: ".card-featured__description"
|
|
337
|
+
) {
|
|
338
|
+
@include card-featured;
|
|
339
|
+
|
|
340
|
+
#{$selector-image} {
|
|
341
|
+
@include card-featured-image-wrapper;
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
#{$selector-img} {
|
|
345
|
+
@include card-featured-image;
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
#{$selector-content} {
|
|
349
|
+
@include card-featured-content;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
#{$selector-meta} {
|
|
353
|
+
@include card-featured-meta;
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
#{$selector-title} {
|
|
357
|
+
@include card-featured-title;
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
#{$selector-desc} {
|
|
361
|
+
@include card-featured-description;
|
|
362
|
+
}
|
|
363
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// CARDS — HOVER
|
|
3
|
+
// local/common/theme-moexp/src/scss/abstracts/cards/_hover.scss
|
|
4
|
+
// ============================================
|
|
5
|
+
|
|
6
|
+
////
|
|
7
|
+
/// Hover-эффекты для карточек
|
|
8
|
+
/// Shadow, lift, scale анимации
|
|
9
|
+
/// @group cards-hover
|
|
10
|
+
/// @author MOEXP Team
|
|
11
|
+
////
|
|
12
|
+
|
|
13
|
+
@use "../mixins";
|
|
14
|
+
@use "../animations";
|
|
15
|
+
@use "variables" as *;
|
|
16
|
+
|
|
17
|
+
// ─────────────────────────────────────────
|
|
18
|
+
// HOVER SHADOW
|
|
19
|
+
// ─────────────────────────────────────────
|
|
20
|
+
|
|
21
|
+
/// Hover с увеличением тени и опциональным accent border
|
|
22
|
+
/// @param {Boolean} $border-accent [true] - Менять цвет бордера на accent при hover
|
|
23
|
+
/// @require {mixin} animations.transition
|
|
24
|
+
/// @require {mixin} mixins.shadow-lg
|
|
25
|
+
/// @require {mixin} mixins.border-color-hsl
|
|
26
|
+
/// @example scss
|
|
27
|
+
/// .card {
|
|
28
|
+
/// @include card-base;
|
|
29
|
+
/// @include card-hover-shadow;
|
|
30
|
+
/// }
|
|
31
|
+
/// @example scss - Без accent border
|
|
32
|
+
/// .card {
|
|
33
|
+
/// @include card-base;
|
|
34
|
+
/// @include card-hover-shadow(false);
|
|
35
|
+
/// }
|
|
36
|
+
/// @output transition + &:hover { shadow, border-color? }
|
|
37
|
+
/// @group cards-hover
|
|
38
|
+
/// @access public
|
|
39
|
+
@mixin card-hover-shadow($border-accent: true) {
|
|
40
|
+
@include animations.transition((box-shadow, border-color, transform), $card-transition-duration, animations.$ease-in-out);
|
|
41
|
+
|
|
42
|
+
&:hover {
|
|
43
|
+
@include mixins.shadow-lg;
|
|
44
|
+
|
|
45
|
+
@if $border-accent {
|
|
46
|
+
@include mixins.border-color-hsl(accent, 0.5);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// ─────────────────────────────────────────
|
|
52
|
+
// HOVER LIFT
|
|
53
|
+
// ─────────────────────────────────────────
|
|
54
|
+
|
|
55
|
+
/// Hover с подъёмом вверх (translateY)
|
|
56
|
+
/// @param {Number} $y [-4px] - Смещение по Y при hover
|
|
57
|
+
/// @require {mixin} animations.transition
|
|
58
|
+
/// @require {mixin} mixins.shadow-lg
|
|
59
|
+
/// @example scss
|
|
60
|
+
/// .card {
|
|
61
|
+
/// @include card-base;
|
|
62
|
+
/// @include card-hover-lift(-6px);
|
|
63
|
+
/// }
|
|
64
|
+
/// @output transition + &:hover { transform, shadow }
|
|
65
|
+
/// @group cards-hover
|
|
66
|
+
/// @access public
|
|
67
|
+
@mixin card-hover-lift($y: -4px) {
|
|
68
|
+
@include animations.transition((box-shadow, border-color, transform), $card-transition-duration, animations.$ease-out);
|
|
69
|
+
|
|
70
|
+
&:hover {
|
|
71
|
+
transform: translateY($y);
|
|
72
|
+
@include mixins.shadow-lg;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// ─────────────────────────────────────────
|
|
77
|
+
// HOVER SCALE
|
|
78
|
+
// ─────────────────────────────────────────
|
|
79
|
+
|
|
80
|
+
/// Hover с масштабированием
|
|
81
|
+
/// @param {Number} $scale [1.02] - Масштаб при hover
|
|
82
|
+
/// @require {mixin} animations.transition
|
|
83
|
+
/// @require {mixin} mixins.shadow-lg
|
|
84
|
+
/// @example scss
|
|
85
|
+
/// .card {
|
|
86
|
+
/// @include card-base;
|
|
87
|
+
/// @include card-hover-scale(1.03);
|
|
88
|
+
/// }
|
|
89
|
+
/// @output transition + &:hover { transform, shadow }
|
|
90
|
+
/// @group cards-hover
|
|
91
|
+
/// @access public
|
|
92
|
+
@mixin card-hover-scale($scale: 1.02) {
|
|
93
|
+
@include animations.transition((box-shadow, border-color, transform), $card-transition-duration, animations.$ease-out);
|
|
94
|
+
|
|
95
|
+
&:hover {
|
|
96
|
+
transform: scale($scale);
|
|
97
|
+
@include mixins.shadow-lg;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// CARDS — INDEX
|
|
3
|
+
// local/common/theme-moexp/src/scss/abstracts/cards/_index.scss
|
|
4
|
+
// ============================================
|
|
5
|
+
|
|
6
|
+
////
|
|
7
|
+
/// Точка входа модуля карточек
|
|
8
|
+
/// Экспортирует все переменные и миксины
|
|
9
|
+
/// @group cards
|
|
10
|
+
/// @author MOEXP Team
|
|
11
|
+
////
|
|
12
|
+
|
|
13
|
+
// ─────────────────────────────────────────
|
|
14
|
+
// EXPORTS
|
|
15
|
+
// ─────────────────────────────────────────
|
|
16
|
+
|
|
17
|
+
/// Переменные карточек
|
|
18
|
+
/// @see cards/_variables.scss
|
|
19
|
+
@forward "variables";
|
|
20
|
+
|
|
21
|
+
/// Базовые миксины
|
|
22
|
+
/// @see cards/_base.scss
|
|
23
|
+
@forward "base";
|
|
24
|
+
|
|
25
|
+
/// Hover-эффекты
|
|
26
|
+
/// @see cards/_hover.scss
|
|
27
|
+
@forward "hover";
|
|
28
|
+
|
|
29
|
+
/// Варианты карточек
|
|
30
|
+
/// @see cards/_variants.scss
|
|
31
|
+
@forward "variants";
|
|
32
|
+
|
|
33
|
+
/// Размеры карточек
|
|
34
|
+
/// @see cards/_sizes.scss
|
|
35
|
+
@forward "sizes";
|
|
36
|
+
|
|
37
|
+
/// Части карточек
|
|
38
|
+
/// @see cards/_parts.scss
|
|
39
|
+
@forward "parts";
|
|
40
|
+
|
|
41
|
+
/// Blur-эффекты
|
|
42
|
+
/// @see cards/_blur.scss
|
|
43
|
+
@forward "blur";
|
|
44
|
+
|
|
45
|
+
/// Featured карточки
|
|
46
|
+
/// @see cards/_featured.scss
|
|
47
|
+
@forward "featured";
|
|
48
|
+
|
|
49
|
+
/// Вертикальные карточки
|
|
50
|
+
/// @see cards/_vertical.scss
|
|
51
|
+
@forward "vertical";
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// CARDS — PARTS
|
|
3
|
+
// local/common/theme-moexp/src/scss/abstracts/cards/_parts.scss
|
|
4
|
+
// ============================================
|
|
5
|
+
|
|
6
|
+
////
|
|
7
|
+
/// Части карточек
|
|
8
|
+
/// Header, Body, Footer, Icon, Title
|
|
9
|
+
/// @group cards-parts
|
|
10
|
+
/// @author MOEXP Team
|
|
11
|
+
////
|
|
12
|
+
|
|
13
|
+
@use "../mixins";
|
|
14
|
+
@use "../radius";
|
|
15
|
+
@use "../spacing";
|
|
16
|
+
@use "../animations";
|
|
17
|
+
@use "variables" as *;
|
|
18
|
+
|
|
19
|
+
// ─────────────────────────────────────────
|
|
20
|
+
// HEADER
|
|
21
|
+
// ─────────────────────────────────────────
|
|
22
|
+
|
|
23
|
+
/// Header карточки
|
|
24
|
+
/// @example scss
|
|
25
|
+
/// .card__header {
|
|
26
|
+
/// @include card-header;
|
|
27
|
+
/// }
|
|
28
|
+
/// @output margin-bottom: 1rem;
|
|
29
|
+
/// @group cards-parts
|
|
30
|
+
/// @access public
|
|
31
|
+
@mixin card-header {
|
|
32
|
+
margin-bottom: spacing.$spacing-md;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// ─────────────────────────────────────────
|
|
36
|
+
// BODY
|
|
37
|
+
// ─────────────────────────────────────────
|
|
38
|
+
|
|
39
|
+
/// Body карточки — flex: 1 для растягивания
|
|
40
|
+
/// @example scss
|
|
41
|
+
/// .card__body {
|
|
42
|
+
/// @include card-body;
|
|
43
|
+
/// }
|
|
44
|
+
/// @output flex: 1;
|
|
45
|
+
/// @group cards-parts
|
|
46
|
+
/// @access public
|
|
47
|
+
@mixin card-body {
|
|
48
|
+
flex: 1;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// ─────────────────────────────────────────
|
|
52
|
+
// FOOTER
|
|
53
|
+
// ─────────────────────────────────────────
|
|
54
|
+
|
|
55
|
+
/// Footer карточки — с верхней границей
|
|
56
|
+
/// @require {mixin} mixins.border-hsl
|
|
57
|
+
/// @example scss
|
|
58
|
+
/// .card__footer {
|
|
59
|
+
/// @include card-footer;
|
|
60
|
+
/// }
|
|
61
|
+
/// @output margin-top, padding-top, border-top
|
|
62
|
+
/// @group cards-parts
|
|
63
|
+
/// @access public
|
|
64
|
+
@mixin card-footer {
|
|
65
|
+
margin-top: spacing.$spacing-md;
|
|
66
|
+
padding-top: spacing.$spacing-md;
|
|
67
|
+
@include mixins.border-hsl(1px, solid, border, 0.3);
|
|
68
|
+
border-width: 1px 0 0 0;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// ─────────────────────────────────────────
|
|
72
|
+
// ICON
|
|
73
|
+
// ─────────────────────────────────────────
|
|
74
|
+
|
|
75
|
+
/// Иконка в карточке — квадратная с фоном
|
|
76
|
+
/// @param {Number} $size [48px] - Размер контейнера
|
|
77
|
+
/// @param {String} $bg [accent] - Цвет фона
|
|
78
|
+
/// @param {Number} $bg-alpha [0.1] - Прозрачность фона
|
|
79
|
+
/// @require {mixin} mixins.bg-color
|
|
80
|
+
/// @require {mixin} mixins.text-color
|
|
81
|
+
/// @require {mixin} radius.rounded
|
|
82
|
+
/// @example scss
|
|
83
|
+
/// .card__icon {
|
|
84
|
+
/// @include card-icon(56px, 'primary', 0.15);
|
|
85
|
+
/// }
|
|
86
|
+
/// @example html
|
|
87
|
+
/// <div class="card__icon"><svg>...</svg></div>
|
|
88
|
+
/// @output Квадратный контейнер с центрированной иконкой
|
|
89
|
+
/// @group cards-parts
|
|
90
|
+
/// @access public
|
|
91
|
+
@mixin card-icon($size: 48px, $bg: accent, $bg-alpha: 0.1) {
|
|
92
|
+
display: flex;
|
|
93
|
+
align-items: center;
|
|
94
|
+
justify-content: center;
|
|
95
|
+
|
|
96
|
+
width: $size;
|
|
97
|
+
height: $size;
|
|
98
|
+
margin-bottom: spacing.$spacing-md;
|
|
99
|
+
|
|
100
|
+
@include mixins.bg-color($bg, $bg-alpha);
|
|
101
|
+
@include mixins.text-color($bg);
|
|
102
|
+
@include radius.rounded(lg);
|
|
103
|
+
|
|
104
|
+
svg {
|
|
105
|
+
width: calc($size * 0.5);
|
|
106
|
+
height: calc($size * 0.5);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// ─────────────────────────────────────────
|
|
111
|
+
// TITLE WITH HOVER
|
|
112
|
+
// ─────────────────────────────────────────
|
|
113
|
+
|
|
114
|
+
/// Заголовок карточки с hover эффектом (универсальный)
|
|
115
|
+
/// @param {String} $color [foreground] - Цвет текста
|
|
116
|
+
/// @param {String} $hover-color [accent] - Цвет при hover
|
|
117
|
+
/// @require {mixin} mixins.text-color
|
|
118
|
+
/// @require {mixin} animations.transition
|
|
119
|
+
/// @example scss
|
|
120
|
+
/// .card__title {
|
|
121
|
+
/// @include card-title-hover;
|
|
122
|
+
/// }
|
|
123
|
+
/// @output Цвет с transition при hover родителя
|
|
124
|
+
/// @group cards-parts
|
|
125
|
+
/// @access public
|
|
126
|
+
@mixin card-title-hover($color: foreground, $hover-color: accent) {
|
|
127
|
+
@include mixins.text-color($color);
|
|
128
|
+
@include animations.transition(color, $card-transition-duration);
|
|
129
|
+
|
|
130
|
+
// Hover на родителе
|
|
131
|
+
[class*="card"]:hover &,
|
|
132
|
+
a:hover & {
|
|
133
|
+
@include mixins.text-color($hover-color);
|
|
134
|
+
}
|
|
135
|
+
}
|