@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,182 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// HERO — BASE
|
|
3
|
+
// local/common/theme-moexp/src/scss/abstracts/hero/_base.scss
|
|
4
|
+
// ============================================
|
|
5
|
+
|
|
6
|
+
////
|
|
7
|
+
/// Базовые миксины Hero-секции
|
|
8
|
+
/// @group hero
|
|
9
|
+
/// @author MOEXP Team
|
|
10
|
+
////
|
|
11
|
+
|
|
12
|
+
@use "../mixins";
|
|
13
|
+
@use "../spacing";
|
|
14
|
+
@use "../breakpoints";
|
|
15
|
+
@use "variables" as *;
|
|
16
|
+
|
|
17
|
+
// ─────────────────────────────────────────
|
|
18
|
+
// HERO BASE (секция)
|
|
19
|
+
// ─────────────────────────────────────────
|
|
20
|
+
|
|
21
|
+
/// Базовые стили Hero-секции
|
|
22
|
+
/// Включает overflow: hidden и position: relative
|
|
23
|
+
/// @example scss
|
|
24
|
+
/// .hero {
|
|
25
|
+
/// @include hero-base;
|
|
26
|
+
/// }
|
|
27
|
+
/// @output overflow: hidden, position: relative
|
|
28
|
+
/// @group hero
|
|
29
|
+
/// @access public
|
|
30
|
+
@mixin hero-base {
|
|
31
|
+
position: relative;
|
|
32
|
+
overflow: hidden;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// ─────────────────────────────────────────
|
|
36
|
+
// HERO CONTAINER (внутренний контейнер)
|
|
37
|
+
// ─────────────────────────────────────────
|
|
38
|
+
|
|
39
|
+
/// Контейнер контента Hero
|
|
40
|
+
/// Ограничивает ширину и задаёт z-index
|
|
41
|
+
/// @param {Length} $max-width [$hero-container-max-width] - Максимальная ширина
|
|
42
|
+
/// @param {Length} $padding-y [$hero-container-padding-y] - Вертикальные отступы
|
|
43
|
+
/// @param {Number} $z-index [$hero-content-z-index] - z-index контента
|
|
44
|
+
/// @example scss
|
|
45
|
+
/// .hero__container {
|
|
46
|
+
/// @include hero-container;
|
|
47
|
+
/// }
|
|
48
|
+
/// @example scss - Кастомная ширина
|
|
49
|
+
/// .hero__container {
|
|
50
|
+
/// @include hero-container(60rem, 3rem);
|
|
51
|
+
/// }
|
|
52
|
+
/// @output max-width, padding, position, z-index
|
|
53
|
+
/// @group hero
|
|
54
|
+
/// @access public
|
|
55
|
+
@mixin hero-container($max-width: $hero-container-max-width, $padding-y: $hero-container-padding-y, $z-index: $hero-content-z-index) {
|
|
56
|
+
position: relative;
|
|
57
|
+
z-index: $z-index;
|
|
58
|
+
max-width: $max-width;
|
|
59
|
+
padding: $padding-y 0;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// ─────────────────────────────────────────
|
|
63
|
+
// HERO ACTIONS (кнопки)
|
|
64
|
+
// ─────────────────────────────────────────
|
|
65
|
+
|
|
66
|
+
/// Контейнер кнопок Hero
|
|
67
|
+
/// Flex с gap и fallback, адаптивная ширина кнопок
|
|
68
|
+
/// @param {Length} $gap [spacing.$gap-md] - Отступ между кнопками
|
|
69
|
+
/// @param {String} $btn-selector [".btn"] - Селектор кнопок для fallback
|
|
70
|
+
/// @require {mixin} mixins.flex-gap
|
|
71
|
+
/// @require {mixin} breakpoints.sm-down
|
|
72
|
+
/// @example scss
|
|
73
|
+
/// .hero__actions {
|
|
74
|
+
/// @include hero-actions;
|
|
75
|
+
/// }
|
|
76
|
+
/// @example scss - Кастомный gap
|
|
77
|
+
/// .hero__actions {
|
|
78
|
+
/// @include hero-actions(spacing.$gap-lg, ".hero__btn");
|
|
79
|
+
/// }
|
|
80
|
+
/// @output flex, flex-wrap, gap с fallback
|
|
81
|
+
/// @group hero
|
|
82
|
+
/// @access public
|
|
83
|
+
@mixin hero-actions($gap: spacing.$gap-md, $btn-selector: ".btn") {
|
|
84
|
+
display: flex;
|
|
85
|
+
flex-wrap: wrap;
|
|
86
|
+
@include mixins.flex-gap($gap, both, $btn-selector);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/// Кнопка Hero (модификатор для адаптива)
|
|
90
|
+
/// На мобильных — 100% ширина
|
|
91
|
+
/// @require {mixin} breakpoints.sm-down
|
|
92
|
+
/// @example scss
|
|
93
|
+
/// .hero__actions-btn {
|
|
94
|
+
/// @include hero-actions-btn;
|
|
95
|
+
/// }
|
|
96
|
+
/// @output width: 100% на sm и меньше
|
|
97
|
+
/// @group hero
|
|
98
|
+
/// @access public
|
|
99
|
+
@mixin hero-actions-btn {
|
|
100
|
+
@include breakpoints.sm-down {
|
|
101
|
+
width: 100%;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// ─────────────────────────────────────────
|
|
106
|
+
// HERO BACKGROUND (picture)
|
|
107
|
+
// ─────────────────────────────────────────
|
|
108
|
+
|
|
109
|
+
/// Фоновое изображение Hero (picture элемент)
|
|
110
|
+
/// @param {Number} $z-index [$hero-bg-z-index] - z-index
|
|
111
|
+
/// @param {String} $position [$hero-bg-position] - object-position
|
|
112
|
+
/// @require {mixin} mixins.bg-picture
|
|
113
|
+
/// @example scss
|
|
114
|
+
/// .hero__bg {
|
|
115
|
+
/// @include hero-bg;
|
|
116
|
+
/// }
|
|
117
|
+
/// @example scss - Кастомная позиция
|
|
118
|
+
/// .hero__bg {
|
|
119
|
+
/// @include hero-bg(0, center top);
|
|
120
|
+
/// }
|
|
121
|
+
/// @output Абсолютное позиционирование с object-fit: cover
|
|
122
|
+
/// @group hero
|
|
123
|
+
/// @access public
|
|
124
|
+
@mixin hero-bg($z-index: $hero-bg-z-index, $position: $hero-bg-position) {
|
|
125
|
+
@include mixins.bg-picture($z-index, $position);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// ─────────────────────────────────────────
|
|
129
|
+
// HERO OVERLAY (градиент)
|
|
130
|
+
// ─────────────────────────────────────────
|
|
131
|
+
|
|
132
|
+
/// Gradient overlay для Hero
|
|
133
|
+
/// Применяется к ::after псевдоэлементу
|
|
134
|
+
/// @param {String} $color [$hero-overlay-color] - Цвет градиента
|
|
135
|
+
/// @param {Number} $z-index [$hero-overlay-z-index] - z-index
|
|
136
|
+
/// @require {mixin} mixins.gradient-overlay-right
|
|
137
|
+
/// @example scss
|
|
138
|
+
/// .hero::after {
|
|
139
|
+
/// @include hero-overlay;
|
|
140
|
+
/// }
|
|
141
|
+
/// @example scss - Кастомный цвет
|
|
142
|
+
/// .hero::after {
|
|
143
|
+
/// @include hero-overlay(accent);
|
|
144
|
+
/// }
|
|
145
|
+
/// @output content, position, inset, z-index, gradient
|
|
146
|
+
/// @group hero
|
|
147
|
+
/// @access public
|
|
148
|
+
@mixin hero-overlay($color: $hero-overlay-color, $z-index: $hero-overlay-z-index) {
|
|
149
|
+
content: "";
|
|
150
|
+
position: absolute;
|
|
151
|
+
inset: 0;
|
|
152
|
+
z-index: $z-index;
|
|
153
|
+
@include mixins.gradient-overlay-right($color);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// ─────────────────────────────────────────
|
|
157
|
+
// HERO COMPOSITE (всё вместе)
|
|
158
|
+
// ─────────────────────────────────────────
|
|
159
|
+
|
|
160
|
+
/// Полный набор стилей Hero-секции
|
|
161
|
+
/// Комбинирует hero-base + overlay
|
|
162
|
+
/// @param {String} $overlay-color [$hero-overlay-color] - Цвет overlay
|
|
163
|
+
/// @require {mixin} hero-base
|
|
164
|
+
/// @require {mixin} hero-overlay
|
|
165
|
+
/// @example scss
|
|
166
|
+
/// .hero {
|
|
167
|
+
/// @include hero($overlay-color: primary);
|
|
168
|
+
///
|
|
169
|
+
/// &__container { @include hero-container; }
|
|
170
|
+
/// &__bg { @include hero-bg; }
|
|
171
|
+
/// &__actions { @include hero-actions; }
|
|
172
|
+
/// }
|
|
173
|
+
/// @output Полная структура Hero с overlay
|
|
174
|
+
/// @group hero
|
|
175
|
+
/// @access public
|
|
176
|
+
@mixin hero($overlay-color: $hero-overlay-color) {
|
|
177
|
+
@include hero-base;
|
|
178
|
+
|
|
179
|
+
&::after {
|
|
180
|
+
@include hero-overlay($overlay-color);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// HERO — INDEX
|
|
3
|
+
// local/common/theme-moexp/src/scss/abstracts/hero/_index.scss
|
|
4
|
+
// ============================================
|
|
5
|
+
|
|
6
|
+
////
|
|
7
|
+
/// Точка входа модуля Hero-секции
|
|
8
|
+
/// Экспортирует все переменные и миксины
|
|
9
|
+
/// @group hero
|
|
10
|
+
/// @author MOEXP Team
|
|
11
|
+
////
|
|
12
|
+
|
|
13
|
+
// ─────────────────────────────────────────
|
|
14
|
+
// EXPORTS
|
|
15
|
+
// ─────────────────────────────────────────
|
|
16
|
+
|
|
17
|
+
/// Переменные Hero
|
|
18
|
+
/// @see hero/_variables.scss
|
|
19
|
+
@forward "variables";
|
|
20
|
+
|
|
21
|
+
/// Базовые миксины
|
|
22
|
+
/// @see hero/_base.scss
|
|
23
|
+
@forward "base";
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// HERO — VARIABLES
|
|
3
|
+
// local/common/theme-moexp/src/scss/abstracts/hero/_variables.scss
|
|
4
|
+
// ============================================
|
|
5
|
+
|
|
6
|
+
////
|
|
7
|
+
/// Переменные для Hero-секции
|
|
8
|
+
/// @group hero
|
|
9
|
+
/// @author MOEXP Team
|
|
10
|
+
////
|
|
11
|
+
|
|
12
|
+
@use "../spacing";
|
|
13
|
+
|
|
14
|
+
// ─────────────────────────────────────────
|
|
15
|
+
// CONTAINER
|
|
16
|
+
// ─────────────────────────────────────────
|
|
17
|
+
|
|
18
|
+
/// Максимальная ширина контента Hero
|
|
19
|
+
/// @type Length
|
|
20
|
+
/// @group hero
|
|
21
|
+
$hero-container-max-width: 48rem !default;
|
|
22
|
+
|
|
23
|
+
/// Вертикальный padding контейнера
|
|
24
|
+
/// @type Length
|
|
25
|
+
/// @group hero
|
|
26
|
+
$hero-container-padding-y: spacing.$spacing-lg !default;
|
|
27
|
+
|
|
28
|
+
/// z-index контента (над overlay)
|
|
29
|
+
/// @type Number
|
|
30
|
+
/// @group hero
|
|
31
|
+
$hero-content-z-index: 2 !default;
|
|
32
|
+
|
|
33
|
+
// ─────────────────────────────────────────
|
|
34
|
+
// BACKGROUND
|
|
35
|
+
// ─────────────────────────────────────────
|
|
36
|
+
|
|
37
|
+
/// z-index фонового изображения
|
|
38
|
+
/// @type Number
|
|
39
|
+
/// @group hero
|
|
40
|
+
$hero-bg-z-index: 0 !default;
|
|
41
|
+
|
|
42
|
+
/// Позиция фона по умолчанию
|
|
43
|
+
/// @type String
|
|
44
|
+
/// @group hero
|
|
45
|
+
$hero-bg-position: bottom center !default;
|
|
46
|
+
|
|
47
|
+
// ─────────────────────────────────────────
|
|
48
|
+
// OVERLAY
|
|
49
|
+
// ─────────────────────────────────────────
|
|
50
|
+
|
|
51
|
+
/// z-index overlay (между bg и контентом)
|
|
52
|
+
/// @type Number
|
|
53
|
+
/// @group hero
|
|
54
|
+
$hero-overlay-z-index: 1 !default;
|
|
55
|
+
|
|
56
|
+
/// Цвет overlay по умолчанию
|
|
57
|
+
/// @type String
|
|
58
|
+
/// @group hero
|
|
59
|
+
$hero-overlay-color: primary !default;
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// INFO CARD — BASE
|
|
3
|
+
// local/common/theme-moexp/src/scss/abstracts/info-card/_base.scss
|
|
4
|
+
// ============================================
|
|
5
|
+
|
|
6
|
+
////
|
|
7
|
+
/// Базовые миксины info-card
|
|
8
|
+
/// @group info-card-base
|
|
9
|
+
/// @author MOEXP Team
|
|
10
|
+
////
|
|
11
|
+
|
|
12
|
+
@use "../typography";
|
|
13
|
+
@use "../spacing";
|
|
14
|
+
@use "../mixins";
|
|
15
|
+
@use "../radius";
|
|
16
|
+
@use "../../font-vars" as fonts;
|
|
17
|
+
@use "variables" as *;
|
|
18
|
+
|
|
19
|
+
// ─────────────────────────────────────────
|
|
20
|
+
// CONTAINER
|
|
21
|
+
// ─────────────────────────────────────────
|
|
22
|
+
|
|
23
|
+
/// Базовые стили контейнера
|
|
24
|
+
/// @output Стили карточки
|
|
25
|
+
/// @group info-card-base
|
|
26
|
+
@mixin base {
|
|
27
|
+
padding: $padding;
|
|
28
|
+
|
|
29
|
+
@include mixins.bg-color(background-card);
|
|
30
|
+
@include mixins.border-hsl(1px, solid, border, 0.5);
|
|
31
|
+
@include radius.rounded(sm);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// ─────────────────────────────────────────
|
|
35
|
+
// TITLE
|
|
36
|
+
// ─────────────────────────────────────────
|
|
37
|
+
|
|
38
|
+
/// Заголовок карточки
|
|
39
|
+
/// @param {String} $color [foreground] - Цвет текста
|
|
40
|
+
/// @param {String} $font-family [fonts.$font-golos-text] - Шрифт
|
|
41
|
+
/// @output Стили заголовка
|
|
42
|
+
/// @group info-card-base
|
|
43
|
+
@mixin title($color: foreground, $font-family: fonts.$font-golos-text) {
|
|
44
|
+
margin: 0 0 $title-margin-bottom;
|
|
45
|
+
font-family: $font-family;
|
|
46
|
+
font-size: typography.$font-size-base;
|
|
47
|
+
font-weight: typography.$font-weight-semibold;
|
|
48
|
+
line-height: typography.$line-height-snug;
|
|
49
|
+
|
|
50
|
+
@include mixins.text-color($color);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// ─────────────────────────────────────────
|
|
54
|
+
// HIGHLIGHT
|
|
55
|
+
// ─────────────────────────────────────────
|
|
56
|
+
|
|
57
|
+
/// Акцентное значение (телефон, цена и т.д.)
|
|
58
|
+
/// @param {String} $color [accent] - Цвет текста
|
|
59
|
+
/// @param {String} $font-family [fonts.$font-golos-text] - Шрифт
|
|
60
|
+
/// @output Стили акцентного значения
|
|
61
|
+
/// @group info-card-base
|
|
62
|
+
@mixin highlight($color: accent, $font-family: fonts.$font-golos-text) {
|
|
63
|
+
display: inline-block;
|
|
64
|
+
margin: 0 0 $highlight-margin-bottom;
|
|
65
|
+
font-family: $font-family;
|
|
66
|
+
font-size: typography.$font-size-base;
|
|
67
|
+
font-weight: typography.$font-weight-bold;
|
|
68
|
+
line-height: typography.$line-height-snug;
|
|
69
|
+
|
|
70
|
+
@include mixins.text-color($color);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// ─────────────────────────────────────────
|
|
74
|
+
// SUBTITLE
|
|
75
|
+
// ─────────────────────────────────────────
|
|
76
|
+
|
|
77
|
+
/// Подзаголовок секции
|
|
78
|
+
/// @param {String} $color [foreground] - Цвет текста
|
|
79
|
+
/// @output Стили подзаголовка
|
|
80
|
+
/// @group info-card-base
|
|
81
|
+
@mixin subtitle($color: foreground) {
|
|
82
|
+
margin: 0 0 $subtitle-margin-bottom;
|
|
83
|
+
font-size: typography.$font-size-sm;
|
|
84
|
+
font-weight: typography.$font-weight-semibold;
|
|
85
|
+
line-height: typography.$line-height-normal;
|
|
86
|
+
|
|
87
|
+
@include mixins.text-color($color);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// ─────────────────────────────────────────
|
|
91
|
+
// LIST
|
|
92
|
+
// ─────────────────────────────────────────
|
|
93
|
+
|
|
94
|
+
/// Список элементов с fallback для gap
|
|
95
|
+
/// @output Flex column с gap
|
|
96
|
+
/// @group info-card-base
|
|
97
|
+
@mixin list {
|
|
98
|
+
display: flex;
|
|
99
|
+
flex-direction: column;
|
|
100
|
+
|
|
101
|
+
// Fallback для gap
|
|
102
|
+
> * {
|
|
103
|
+
margin-bottom: $list-gap;
|
|
104
|
+
|
|
105
|
+
&:last-child {
|
|
106
|
+
margin-bottom: 0;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// Modern gap
|
|
111
|
+
@supports (gap: 1px) {
|
|
112
|
+
gap: $list-gap;
|
|
113
|
+
|
|
114
|
+
> * {
|
|
115
|
+
margin-bottom: 0;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// ─────────────────────────────────────────
|
|
121
|
+
// ITEM
|
|
122
|
+
// ─────────────────────────────────────────
|
|
123
|
+
|
|
124
|
+
/// Элемент списка
|
|
125
|
+
/// @output Стили элемента
|
|
126
|
+
/// @group info-card-base
|
|
127
|
+
@mixin item {
|
|
128
|
+
font-size: typography.$font-size-sm;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/// Описание элемента (label)
|
|
132
|
+
/// @param {String} $color [foreground-muted] - Цвет текста
|
|
133
|
+
/// @output Стили описания
|
|
134
|
+
/// @group info-card-base
|
|
135
|
+
@mixin label($color: foreground-muted) {
|
|
136
|
+
margin: 0;
|
|
137
|
+
font-weight: typography.$font-weight-semibold;
|
|
138
|
+
line-height: typography.$line-height-normal;
|
|
139
|
+
|
|
140
|
+
@include mixins.text-color($color);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/// Значение элемента
|
|
144
|
+
/// @param {String} $color [foreground] - Цвет текста
|
|
145
|
+
/// @output Стили значения
|
|
146
|
+
/// @group info-card-base
|
|
147
|
+
@mixin value($color: foreground) {
|
|
148
|
+
margin: 0;
|
|
149
|
+
line-height: typography.$line-height-snug;
|
|
150
|
+
|
|
151
|
+
@include mixins.text-color($color);
|
|
152
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// INFO CARD — INDEX
|
|
3
|
+
// local/common/theme-moexp/src/scss/abstracts/info-card/_index.scss
|
|
4
|
+
// ============================================
|
|
5
|
+
|
|
6
|
+
////
|
|
7
|
+
/// Экспорт модуля info-card
|
|
8
|
+
/// @group info-card
|
|
9
|
+
////
|
|
10
|
+
|
|
11
|
+
@forward "variables";
|
|
12
|
+
@forward "base";
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// INFO CARD — VARIABLES
|
|
3
|
+
// local/common/theme-moexp/src/scss/abstracts/info-card/_variables.scss
|
|
4
|
+
// ============================================
|
|
5
|
+
|
|
6
|
+
////
|
|
7
|
+
/// Переменные компонента info-card
|
|
8
|
+
/// @group info-card-variables
|
|
9
|
+
/// @author MOEXP Team
|
|
10
|
+
////
|
|
11
|
+
|
|
12
|
+
@use "../spacing";
|
|
13
|
+
@use "../typography";
|
|
14
|
+
@use "../radius";
|
|
15
|
+
|
|
16
|
+
/// Padding карточки
|
|
17
|
+
/// @type Number
|
|
18
|
+
/// @group info-card-variables
|
|
19
|
+
$padding: spacing.$spacing-lg !default;
|
|
20
|
+
|
|
21
|
+
/// Скругление
|
|
22
|
+
/// @type Number
|
|
23
|
+
/// @group info-card-variables
|
|
24
|
+
$border-radius: radius.$radius-sm !default;
|
|
25
|
+
|
|
26
|
+
/// Отступ после заголовка
|
|
27
|
+
/// @type Number
|
|
28
|
+
/// @group info-card-variables
|
|
29
|
+
$title-margin-bottom: spacing.$spacing-md !default;
|
|
30
|
+
|
|
31
|
+
/// Отступ после highlight
|
|
32
|
+
/// @type Number
|
|
33
|
+
/// @group info-card-variables
|
|
34
|
+
$highlight-margin-bottom: spacing.$spacing-md !default;
|
|
35
|
+
|
|
36
|
+
/// Отступ после subtitle
|
|
37
|
+
/// @type Number
|
|
38
|
+
/// @group info-card-variables
|
|
39
|
+
$subtitle-margin-bottom: spacing.$spacing-sm !default;
|
|
40
|
+
|
|
41
|
+
/// Gap между элементами списка
|
|
42
|
+
/// @type Number
|
|
43
|
+
/// @group info-card-variables
|
|
44
|
+
$list-gap: spacing.$spacing-sm !default;
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// NEWS CARD — BASE
|
|
3
|
+
// local/common/theme-moexp/src/scss/abstracts/news-card/_base.scss
|
|
4
|
+
// ============================================
|
|
5
|
+
|
|
6
|
+
////
|
|
7
|
+
/// Базовые миксины для карточек новостей
|
|
8
|
+
/// Общие стили для featured и compact
|
|
9
|
+
/// @group news-card
|
|
10
|
+
/// @author MOEXP Team
|
|
11
|
+
////
|
|
12
|
+
|
|
13
|
+
@use "../mixins";
|
|
14
|
+
@use "../radius";
|
|
15
|
+
@use "../spacing";
|
|
16
|
+
@use "../typography";
|
|
17
|
+
@use "../animations";
|
|
18
|
+
@use "variables" as *;
|
|
19
|
+
|
|
20
|
+
// ─────────────────────────────────────────
|
|
21
|
+
// CONTAINER (ссылка-обёртка)
|
|
22
|
+
// ─────────────────────────────────────────
|
|
23
|
+
|
|
24
|
+
/// Базовые стили контейнера карточки (элемент <a>)
|
|
25
|
+
/// @group news-card
|
|
26
|
+
/// @access public
|
|
27
|
+
@mixin news-card-base {
|
|
28
|
+
position: relative;
|
|
29
|
+
overflow: hidden;
|
|
30
|
+
display: block;
|
|
31
|
+
text-decoration: none;
|
|
32
|
+
color: inherit;
|
|
33
|
+
|
|
34
|
+
@include mixins.bg-color(background-card);
|
|
35
|
+
@include mixins.border-hsl(1px, solid, border, 0.5);
|
|
36
|
+
@include radius.rounded(lg);
|
|
37
|
+
@include mixins.shadow-sm;
|
|
38
|
+
|
|
39
|
+
cursor: pointer;
|
|
40
|
+
|
|
41
|
+
@include animations.transition((box-shadow, border-color), $news-card-transition, animations.$ease-in-out);
|
|
42
|
+
|
|
43
|
+
&:hover {
|
|
44
|
+
@include mixins.shadow-xl;
|
|
45
|
+
@include mixins.border-color-hsl(accent, 0.5);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
&:focus-visible {
|
|
49
|
+
@include mixins.focus-ring(ring);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// ─────────────────────────────────────────
|
|
54
|
+
// CONTENT
|
|
55
|
+
// ─────────────────────────────────────────
|
|
56
|
+
|
|
57
|
+
/// Контент карточки
|
|
58
|
+
/// @param {Number} $padding [$news-card-padding] - Padding
|
|
59
|
+
/// @group news-card
|
|
60
|
+
/// @access public
|
|
61
|
+
@mixin news-card-content($padding: $news-card-padding) {
|
|
62
|
+
display: flex;
|
|
63
|
+
flex-direction: column;
|
|
64
|
+
justify-content: center;
|
|
65
|
+
padding: $padding;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// ─────────────────────────────────────────
|
|
69
|
+
// META (дата, категория)
|
|
70
|
+
// ─────────────────────────────────────────
|
|
71
|
+
|
|
72
|
+
/// Мета-информация карточки
|
|
73
|
+
/// @param {String} $color [accent-on-light] - Цвет текста
|
|
74
|
+
/// @group news-card
|
|
75
|
+
/// @access public
|
|
76
|
+
@mixin news-card-meta($color: accent-on-light) {
|
|
77
|
+
display: flex;
|
|
78
|
+
align-items: center;
|
|
79
|
+
gap: spacing.$gap-xs;
|
|
80
|
+
margin-bottom: spacing.$spacing-md;
|
|
81
|
+
|
|
82
|
+
@include mixins.text-color($color);
|
|
83
|
+
|
|
84
|
+
svg {
|
|
85
|
+
width: 1.25rem;
|
|
86
|
+
height: 1.25rem;
|
|
87
|
+
flex-shrink: 0;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
span {
|
|
91
|
+
font-size: typography.$font-size-base;
|
|
92
|
+
font-weight: typography.$font-weight-medium;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// ─────────────────────────────────────────
|
|
97
|
+
// TITLE
|
|
98
|
+
// ─────────────────────────────────────────
|
|
99
|
+
|
|
100
|
+
/// Заголовок карточки с hover
|
|
101
|
+
/// @param {String} $color [foreground] - Цвет текста
|
|
102
|
+
/// @param {String} $hover-color [accent] - Цвет при hover
|
|
103
|
+
/// @param {String} $size [2xl] - Размер шрифта (2xl, xl, lg)
|
|
104
|
+
/// @param {String} $parent-selector - Селектор родителя для hover
|
|
105
|
+
/// @group news-card
|
|
106
|
+
/// @access public
|
|
107
|
+
@mixin news-card-title($color: foreground, $hover-color: accent, $size: 2xl, $parent-selector: null) {
|
|
108
|
+
font-weight: typography.$font-weight-bold;
|
|
109
|
+
line-height: typography.$line-height-tight;
|
|
110
|
+
margin-bottom: spacing.$spacing-md;
|
|
111
|
+
|
|
112
|
+
@if $size == 2xl {
|
|
113
|
+
font-size: typography.$font-size-2xl;
|
|
114
|
+
} @else if $size == xl {
|
|
115
|
+
font-size: typography.$font-size-xl;
|
|
116
|
+
} @else {
|
|
117
|
+
font-size: typography.$font-size-lg;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
@include mixins.text-color($color);
|
|
121
|
+
@include animations.transition(color, $news-card-transition);
|
|
122
|
+
|
|
123
|
+
@if $parent-selector {
|
|
124
|
+
#{$parent-selector}:hover & {
|
|
125
|
+
@include mixins.text-color($hover-color);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// ─────────────────────────────────────────
|
|
131
|
+
// DESCRIPTION
|
|
132
|
+
// ─────────────────────────────────────────
|
|
133
|
+
|
|
134
|
+
/// Описание карточки
|
|
135
|
+
/// @param {String} $color [foreground-muted] - Цвет текста
|
|
136
|
+
/// @group news-card
|
|
137
|
+
/// @access public
|
|
138
|
+
@mixin news-card-description($color: foreground-muted) {
|
|
139
|
+
font-size: typography.$font-size-base;
|
|
140
|
+
line-height: typography.$line-height-relaxed;
|
|
141
|
+
|
|
142
|
+
@include mixins.text-color($color);
|
|
143
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// NEWS CARD — COMPACT
|
|
3
|
+
// local/common/theme-moexp/src/scss/abstracts/news-card/_compact.scss
|
|
4
|
+
// ============================================
|
|
5
|
+
|
|
6
|
+
////
|
|
7
|
+
/// Compact карточка новости (без изображения)
|
|
8
|
+
/// @group news-card-compact
|
|
9
|
+
/// @author MOEXP Team
|
|
10
|
+
////
|
|
11
|
+
|
|
12
|
+
@use "variables" as *;
|
|
13
|
+
@use "base" as *;
|
|
14
|
+
|
|
15
|
+
// ─────────────────────────────────────────
|
|
16
|
+
// CONTENT
|
|
17
|
+
// ─────────────────────────────────────────
|
|
18
|
+
|
|
19
|
+
/// Контент compact карточки (меньший padding)
|
|
20
|
+
/// @group news-card-compact
|
|
21
|
+
/// @access public
|
|
22
|
+
@mixin news-card-compact-content {
|
|
23
|
+
@include news-card-content($news-card-compact-padding);
|
|
24
|
+
}
|