@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.
Files changed (103) hide show
  1. package/README.md +182 -0
  2. package/index.scss +1 -0
  3. package/package.json +10 -0
  4. package/scss/.sassdocrc +85 -0
  5. package/scss/_font-vars.scss +25 -0
  6. package/scss/_fonts.scss +139 -0
  7. package/scss/abstracts/_animations.scss +819 -0
  8. package/scss/abstracts/_breakpoints.scss +865 -0
  9. package/scss/abstracts/_colors.scss +256 -0
  10. package/scss/abstracts/_functions.scss +3 -0
  11. package/scss/abstracts/_grid.scss +816 -0
  12. package/scss/abstracts/_index.scss +134 -0
  13. package/scss/abstracts/_mixins.scss +1142 -0
  14. package/scss/abstracts/_patterns.scss +657 -0
  15. package/scss/abstracts/_radius.scss +279 -0
  16. package/scss/abstracts/_search-form.scss +271 -0
  17. package/scss/abstracts/_spacing.scss +158 -0
  18. package/scss/abstracts/_typography.scss +477 -0
  19. package/scss/abstracts/_utilities.scss +0 -0
  20. package/scss/abstracts/_variables.scss +3 -0
  21. package/scss/abstracts/breadcrumb/_base.scss +194 -0
  22. package/scss/abstracts/breadcrumb/_index.scss +12 -0
  23. package/scss/abstracts/breadcrumb/_variables.scss +54 -0
  24. package/scss/abstracts/buttons/_base.scss +92 -0
  25. package/scss/abstracts/buttons/_index.scss +31 -0
  26. package/scss/abstracts/buttons/_modifiers.scss +114 -0
  27. package/scss/abstracts/buttons/_variables.scss +98 -0
  28. package/scss/abstracts/buttons/_variants.scss +295 -0
  29. package/scss/abstracts/callout/_base.scss +142 -0
  30. package/scss/abstracts/callout/_index.scss +23 -0
  31. package/scss/abstracts/callout/_variables.scss +27 -0
  32. package/scss/abstracts/cards/_base.scss +74 -0
  33. package/scss/abstracts/cards/_blur.scss +65 -0
  34. package/scss/abstracts/cards/_featured.scss +363 -0
  35. package/scss/abstracts/cards/_hover.scss +99 -0
  36. package/scss/abstracts/cards/_index.scss +51 -0
  37. package/scss/abstracts/cards/_parts.scss +135 -0
  38. package/scss/abstracts/cards/_sizes.scss +52 -0
  39. package/scss/abstracts/cards/_variables.scss +72 -0
  40. package/scss/abstracts/cards/_variants.scss +143 -0
  41. package/scss/abstracts/cards/_vertical.scss +218 -0
  42. package/scss/abstracts/chip/_base.scss +99 -0
  43. package/scss/abstracts/chip/_icon.scss +73 -0
  44. package/scss/abstracts/chip/_index.scss +21 -0
  45. package/scss/abstracts/chip/_variables.scss +57 -0
  46. package/scss/abstracts/chip/_variants.scss +98 -0
  47. package/scss/abstracts/file-card/_base.scss +326 -0
  48. package/scss/abstracts/file-card/_index.scss +12 -0
  49. package/scss/abstracts/file-card/_variables.scss +79 -0
  50. package/scss/abstracts/hero/_base.scss +182 -0
  51. package/scss/abstracts/hero/_index.scss +23 -0
  52. package/scss/abstracts/hero/_variables.scss +59 -0
  53. package/scss/abstracts/info-card/_base.scss +152 -0
  54. package/scss/abstracts/info-card/_index.scss +12 -0
  55. package/scss/abstracts/info-card/_variables.scss +44 -0
  56. package/scss/abstracts/news-card/_base.scss +143 -0
  57. package/scss/abstracts/news-card/_compact.scss +24 -0
  58. package/scss/abstracts/news-card/_featured.scss +83 -0
  59. package/scss/abstracts/news-card/_index.scss +31 -0
  60. package/scss/abstracts/news-card/_variables.scss +44 -0
  61. package/scss/abstracts/project-card/_base.scss +109 -0
  62. package/scss/abstracts/project-card/_index.scss +23 -0
  63. package/scss/abstracts/project-card/_variables.scss +20 -0
  64. package/scss/abstracts/search-form/_base.scss +132 -0
  65. package/scss/abstracts/search-form/_composite.scss +54 -0
  66. package/scss/abstracts/search-form/_index.scss +31 -0
  67. package/scss/abstracts/search-form/_theme.scss +89 -0
  68. package/scss/abstracts/search-form/_variables.scss +39 -0
  69. package/scss/abstracts/section-title/_base.scss +127 -0
  70. package/scss/abstracts/section-title/_index.scss +23 -0
  71. package/scss/abstracts/section-title/_variables.scss +27 -0
  72. package/scss/abstracts/service-card/_base.scss +77 -0
  73. package/scss/abstracts/service-card/_index.scss +23 -0
  74. package/scss/abstracts/service-card/_variables.scss +23 -0
  75. package/scss/abstracts/sidebar-menu/_base.scss +148 -0
  76. package/scss/abstracts/sidebar-menu/_index.scss +12 -0
  77. package/scss/abstracts/sidebar-menu/_variables.scss +55 -0
  78. package/scss/abstracts/stats-card/_base.scss +99 -0
  79. package/scss/abstracts/stats-card/_index.scss +23 -0
  80. package/scss/abstracts/stats-card/_variables.scss +32 -0
  81. package/scss/api.scss +12 -0
  82. package/scss/components/_breadcrumb.scss +140 -0
  83. package/scss/components/_buttons.scss +226 -0
  84. package/scss/components/_callout.scss +118 -0
  85. package/scss/components/_chip.scss +56 -0
  86. package/scss/components/_file-card.scss +182 -0
  87. package/scss/components/_hero.scss +103 -0
  88. package/scss/components/_index.scss +110 -0
  89. package/scss/components/_info-card.scss +103 -0
  90. package/scss/components/_news-card-compact.scss +33 -0
  91. package/scss/components/_news-card-featured.scss +49 -0
  92. package/scss/components/_news-card.scss +303 -0
  93. package/scss/components/_project-card.scss +93 -0
  94. package/scss/components/_search-form.scss +181 -0
  95. package/scss/components/_section-title.scss +94 -0
  96. package/scss/components/_service-card.scss +83 -0
  97. package/scss/components/_sidebar-menu.scss +82 -0
  98. package/scss/components/_stats-card.scss +92 -0
  99. package/scss/components/_tag.scss +144 -0
  100. package/scss/components/_top-nav.scss +537 -0
  101. package/scss/main.scss +73 -0
  102. package/scss/utilities/_index.scss +40 -0
  103. 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
+ }