@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,57 @@
|
|
|
1
|
+
////
|
|
2
|
+
/// Chip Variables — дизайн-токены для chip
|
|
3
|
+
/// @group chip-variables
|
|
4
|
+
/// @author MOEXP Team
|
|
5
|
+
////
|
|
6
|
+
|
|
7
|
+
// ============================================
|
|
8
|
+
// SIZE
|
|
9
|
+
// ============================================
|
|
10
|
+
|
|
11
|
+
/// Размер иконки относительно font-size
|
|
12
|
+
/// @type Number
|
|
13
|
+
$chip-icon-size: 1.2em !default;
|
|
14
|
+
|
|
15
|
+
/// Gap между иконкой и текстом
|
|
16
|
+
/// @type String
|
|
17
|
+
$chip-gap: "gap-xs" !default;
|
|
18
|
+
|
|
19
|
+
// ============================================
|
|
20
|
+
// COLORS
|
|
21
|
+
// ============================================
|
|
22
|
+
|
|
23
|
+
/// Цвет текста по умолчанию
|
|
24
|
+
/// @type String
|
|
25
|
+
$chip-color-default: "foreground-body" !default;
|
|
26
|
+
|
|
27
|
+
/// Цвет hover по умолчанию
|
|
28
|
+
/// @type String
|
|
29
|
+
$chip-color-hover: "accent" !default;
|
|
30
|
+
|
|
31
|
+
/// Цвет текста на тёмном фоне
|
|
32
|
+
/// @type String
|
|
33
|
+
$chip-color-on-dark: "primary-foreground" !default;
|
|
34
|
+
|
|
35
|
+
/// Цвет hover на тёмном фоне
|
|
36
|
+
/// @type String
|
|
37
|
+
$chip-color-hover-on-dark: "primary-foreground" !default;
|
|
38
|
+
|
|
39
|
+
/// Цвет текста на светлом фоне
|
|
40
|
+
/// @type String
|
|
41
|
+
$chip-color-on-light: "foreground-body" !default;
|
|
42
|
+
|
|
43
|
+
/// Цвет hover на светлом фоне
|
|
44
|
+
/// @type String
|
|
45
|
+
$chip-color-hover-on-light: "accent-on-light" !default;
|
|
46
|
+
|
|
47
|
+
// ============================================
|
|
48
|
+
// OPACITY
|
|
49
|
+
// ============================================
|
|
50
|
+
|
|
51
|
+
/// Прозрачность текста по умолчанию
|
|
52
|
+
/// @type Number
|
|
53
|
+
$chip-opacity: 0.9 !default;
|
|
54
|
+
|
|
55
|
+
/// Прозрачность disabled состояния
|
|
56
|
+
/// @type Number
|
|
57
|
+
$chip-opacity-disabled: 0.5 !default;
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
////
|
|
2
|
+
/// Chip Variants — варианты оформления
|
|
3
|
+
/// @group chip-variants
|
|
4
|
+
/// @author MOEXP Team
|
|
5
|
+
////
|
|
6
|
+
|
|
7
|
+
@use "../mixins";
|
|
8
|
+
@use "../animations";
|
|
9
|
+
@use "variables" as *;
|
|
10
|
+
|
|
11
|
+
// ============================================
|
|
12
|
+
// LINK VARIANT
|
|
13
|
+
// ============================================
|
|
14
|
+
|
|
15
|
+
/// Chip-ссылка — основной интерактивный вариант
|
|
16
|
+
/// @param {String} $color [$chip-color-default] - Цвет текста
|
|
17
|
+
/// @param {String} $color-hover [$chip-color-hover] - Цвет при hover
|
|
18
|
+
/// @param {Number} $opacity [$chip-opacity] - Прозрачность
|
|
19
|
+
/// @example scss
|
|
20
|
+
/// .contact-link {
|
|
21
|
+
/// @include chip-base;
|
|
22
|
+
/// @include chip-link;
|
|
23
|
+
/// }
|
|
24
|
+
/// @output Цвет текста с hover-эффектом
|
|
25
|
+
/// @group chip-variants
|
|
26
|
+
/// @access public
|
|
27
|
+
@mixin chip-link($color: $chip-color-default, $color-hover: $chip-color-hover, $opacity: $chip-opacity) {
|
|
28
|
+
@include mixins.text-color($color, $opacity);
|
|
29
|
+
@include animations.hover-text-color($color-hover);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// ============================================
|
|
33
|
+
// CONTEXT VARIANTS
|
|
34
|
+
// ============================================
|
|
35
|
+
|
|
36
|
+
/// Chip на тёмном фоне (header, hero, footer)
|
|
37
|
+
/// @param {String} $color [$chip-color-on-dark] - Цвет текста
|
|
38
|
+
/// @param {String} $color-hover [$chip-color-hover-on-dark] - Цвет при hover
|
|
39
|
+
/// @param {Number} $opacity [$chip-opacity] - Прозрачность
|
|
40
|
+
/// @example scss
|
|
41
|
+
/// .header-contact {
|
|
42
|
+
/// @include chip-base;
|
|
43
|
+
/// @include chip-on-dark;
|
|
44
|
+
/// }
|
|
45
|
+
/// @output Светлый цвет текста
|
|
46
|
+
/// @group chip-variants
|
|
47
|
+
/// @access public
|
|
48
|
+
@mixin chip-on-dark($color: $chip-color-on-dark, $color-hover: $chip-color-hover-on-dark, $opacity: $chip-opacity) {
|
|
49
|
+
@include mixins.text-color($color, $opacity);
|
|
50
|
+
@include animations.hover-text-color($color-hover);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/// Chip на светлом фоне (явное указание)
|
|
54
|
+
/// @param {String} $color [$chip-color-on-light] - Цвет текста
|
|
55
|
+
/// @param {String} $color-hover [$chip-color-hover-on-light] - Цвет при hover
|
|
56
|
+
/// @param {Number} $opacity [$chip-opacity] - Прозрачность
|
|
57
|
+
/// @example scss
|
|
58
|
+
/// .footer-contact {
|
|
59
|
+
/// @include chip-base;
|
|
60
|
+
/// @include chip-on-light;
|
|
61
|
+
/// }
|
|
62
|
+
/// @output Тёмный цвет текста с hover на accent-on-light
|
|
63
|
+
/// @group chip-variants
|
|
64
|
+
/// @access public
|
|
65
|
+
@mixin chip-on-light($color: $chip-color-on-light, $color-hover: $chip-color-hover-on-light, $opacity: $chip-opacity) {
|
|
66
|
+
@include mixins.text-color($color, $opacity);
|
|
67
|
+
@include animations.hover-text-color($color-hover);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// ============================================
|
|
71
|
+
// COMPOSITE VARIANTS
|
|
72
|
+
// ============================================
|
|
73
|
+
|
|
74
|
+
/// Полный chip для тёмного фона — base + on-dark
|
|
75
|
+
/// @example scss
|
|
76
|
+
/// .header__contact {
|
|
77
|
+
/// @include chip-dark;
|
|
78
|
+
/// }
|
|
79
|
+
/// @output Полный chip для header/footer
|
|
80
|
+
/// @group chip-variants
|
|
81
|
+
/// @access public
|
|
82
|
+
@mixin chip-dark {
|
|
83
|
+
@include chip-base($chip-color-on-dark);
|
|
84
|
+
@include chip-on-dark;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/// Полный chip для светлого фона — base + on-light
|
|
88
|
+
/// @example scss
|
|
89
|
+
/// .sidebar__contact {
|
|
90
|
+
/// @include chip-light;
|
|
91
|
+
/// }
|
|
92
|
+
/// @output Полный chip для светлых секций
|
|
93
|
+
/// @group chip-variants
|
|
94
|
+
/// @access public
|
|
95
|
+
@mixin chip-light {
|
|
96
|
+
@include chip-base($chip-color-on-light);
|
|
97
|
+
@include chip-on-light;
|
|
98
|
+
}
|
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// FILE CARD — BASE
|
|
3
|
+
// local/common/theme-moexp/src/scss/abstracts/file-card/_base.scss
|
|
4
|
+
// ============================================
|
|
5
|
+
|
|
6
|
+
////
|
|
7
|
+
/// Базовые миксины file-card
|
|
8
|
+
/// @group file-card-base
|
|
9
|
+
/// @author MOEXP Team
|
|
10
|
+
////
|
|
11
|
+
|
|
12
|
+
@use "../typography";
|
|
13
|
+
@use "../spacing";
|
|
14
|
+
@use "../mixins";
|
|
15
|
+
@use "../radius";
|
|
16
|
+
@use "../animations";
|
|
17
|
+
@use "../breakpoints";
|
|
18
|
+
@use "../../font-vars" as fonts;
|
|
19
|
+
@use "variables" as *;
|
|
20
|
+
|
|
21
|
+
// ─────────────────────────────────────────
|
|
22
|
+
// LIST (контейнер карточек)
|
|
23
|
+
// ─────────────────────────────────────────
|
|
24
|
+
|
|
25
|
+
/// Список карточек файлов
|
|
26
|
+
/// @output Контейнер с border и скруглением
|
|
27
|
+
/// @group file-card-base
|
|
28
|
+
@mixin list {
|
|
29
|
+
@include mixins.bg-color(background-card);
|
|
30
|
+
@include mixins.border-hsl(1px, solid, border, 0.5);
|
|
31
|
+
@include radius.rounded(sm);
|
|
32
|
+
overflow: hidden;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// ─────────────────────────────────────────
|
|
36
|
+
// CARD
|
|
37
|
+
// ─────────────────────────────────────────
|
|
38
|
+
|
|
39
|
+
/// Базовые стили карточки
|
|
40
|
+
/// @output Flex row с hover
|
|
41
|
+
/// @group file-card-base
|
|
42
|
+
@mixin card {
|
|
43
|
+
@include mixins.flex-row($gap, flex-start, center, "> *");
|
|
44
|
+
padding: $padding;
|
|
45
|
+
|
|
46
|
+
@include animations.transition(background-color, $transition-duration);
|
|
47
|
+
|
|
48
|
+
&:hover {
|
|
49
|
+
@include mixins.bg-color(background-section, 0.5);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// // Разделитель между карточками
|
|
53
|
+
// &:not(:last-child) {
|
|
54
|
+
// border-bottom: 1px solid;
|
|
55
|
+
// @include mixins.border-color-hsl(border, 0.5);
|
|
56
|
+
// }
|
|
57
|
+
|
|
58
|
+
// Адаптив
|
|
59
|
+
@include breakpoints.md-down {
|
|
60
|
+
flex-wrap: wrap;
|
|
61
|
+
padding: $padding-nested;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/// Вложенная карточка
|
|
66
|
+
/// @output Стили с левым бордером и фоном
|
|
67
|
+
/// @group file-card-base
|
|
68
|
+
@mixin card-nested {
|
|
69
|
+
padding: $padding-nested $padding;
|
|
70
|
+
|
|
71
|
+
// Левый акцентный бордер
|
|
72
|
+
border-left: 2px solid;
|
|
73
|
+
@include mixins.border-color-hsl(accent, 0.3);
|
|
74
|
+
|
|
75
|
+
// Фон секции
|
|
76
|
+
@include mixins.bg-color(background, 0.6);
|
|
77
|
+
|
|
78
|
+
&:hover {
|
|
79
|
+
@include mixins.bg-color(background-section, 0.8);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
@include breakpoints.md-down {
|
|
83
|
+
border-left-width: 2px;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// ─────────────────────────────────────────
|
|
88
|
+
// ICON (тип файла)
|
|
89
|
+
// ─────────────────────────────────────────
|
|
90
|
+
|
|
91
|
+
/// Контейнер иконки типа файла
|
|
92
|
+
/// @param {Number} $size [$icon-size] - Размер контейнера
|
|
93
|
+
/// @param {Number} $svg-size [$icon-svg-size] - Размер SVG
|
|
94
|
+
/// @output Квадратный контейнер с центрированием
|
|
95
|
+
/// @group file-card-base
|
|
96
|
+
@mixin icon($size: $icon-size, $svg-size: $icon-svg-size) {
|
|
97
|
+
@include mixins.flex-center;
|
|
98
|
+
flex-shrink: 0;
|
|
99
|
+
width: $size;
|
|
100
|
+
height: $size;
|
|
101
|
+
|
|
102
|
+
@include mixins.bg-color(background-section);
|
|
103
|
+
@include radius.rounded(sm);
|
|
104
|
+
|
|
105
|
+
svg,
|
|
106
|
+
img {
|
|
107
|
+
width: $svg-size;
|
|
108
|
+
height: $svg-size;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
@include breakpoints.md-down {
|
|
112
|
+
display: none;
|
|
113
|
+
// width: $icon-size-nested;
|
|
114
|
+
// height: $icon-size-nested;
|
|
115
|
+
|
|
116
|
+
// svg,
|
|
117
|
+
// img {
|
|
118
|
+
// width: $icon-svg-size-nested;
|
|
119
|
+
// height: $icon-svg-size-nested;
|
|
120
|
+
// }
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/// Цвет SVG иконки
|
|
125
|
+
/// @param {String} $color [accent] - Цвет
|
|
126
|
+
/// @output Цвет текста для SVG
|
|
127
|
+
/// @group file-card-base
|
|
128
|
+
@mixin icon-color($color: accent) {
|
|
129
|
+
@include mixins.text-color($color);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// ─────────────────────────────────────────
|
|
133
|
+
// CONTENT
|
|
134
|
+
// ─────────────────────────────────────────
|
|
135
|
+
|
|
136
|
+
/// Контент карточки (название + описание)
|
|
137
|
+
/// @output Flex grow с min-width
|
|
138
|
+
/// @group file-card-base
|
|
139
|
+
@mixin content {
|
|
140
|
+
flex: 1;
|
|
141
|
+
min-width: 0; // Для text-overflow
|
|
142
|
+
|
|
143
|
+
@include breakpoints.md-down {
|
|
144
|
+
flex: 1 1 100%;
|
|
145
|
+
order: 2;
|
|
146
|
+
margin-top: spacing.$spacing-sm;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/// Название файла
|
|
151
|
+
/// @param {String} $color [foreground] - Цвет
|
|
152
|
+
/// @output Стили заголовка
|
|
153
|
+
/// @group file-card-base
|
|
154
|
+
@mixin title($color: foreground) {
|
|
155
|
+
margin: 0 0 spacing.$spacing-xs;
|
|
156
|
+
font-family: fonts.$font-golos-text;
|
|
157
|
+
font-size: typography.$font-size-base;
|
|
158
|
+
font-weight: typography.$font-weight-semibold;
|
|
159
|
+
line-height: typography.$line-height-snug;
|
|
160
|
+
|
|
161
|
+
@include mixins.text-color($color);
|
|
162
|
+
|
|
163
|
+
@include breakpoints.md-down {
|
|
164
|
+
font-size: typography.$font-size-sm;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/// Описание файла
|
|
169
|
+
/// @param {String} $color [foreground-muted] - Цвет
|
|
170
|
+
/// @output Стили описания
|
|
171
|
+
/// @group file-card-base
|
|
172
|
+
@mixin description($color: foreground-muted) {
|
|
173
|
+
margin: 0;
|
|
174
|
+
font-size: typography.$font-size-sm;
|
|
175
|
+
line-height: typography.$line-height-relaxed;
|
|
176
|
+
|
|
177
|
+
@include mixins.text-color($color);
|
|
178
|
+
|
|
179
|
+
@include breakpoints.md-down {
|
|
180
|
+
font-size: typography.$font-size-xs;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
// ─────────────────────────────────────────
|
|
185
|
+
// ACTIONS (meta + download wrapper)
|
|
186
|
+
// ─────────────────────────────────────────
|
|
187
|
+
|
|
188
|
+
/// Контейнер для meta и download
|
|
189
|
+
/// @output Flex row с выравниванием
|
|
190
|
+
/// @group file-card-base
|
|
191
|
+
@mixin actions {
|
|
192
|
+
@include mixins.flex-row(spacing.$gap-md, flex-end, stretch, "> *");
|
|
193
|
+
flex-shrink: 0;
|
|
194
|
+
|
|
195
|
+
@include breakpoints.md-down {
|
|
196
|
+
order: 3;
|
|
197
|
+
// width: 100%;
|
|
198
|
+
justify-content: space-between;
|
|
199
|
+
margin-top: spacing.$spacing-sm;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// ─────────────────────────────────────────
|
|
204
|
+
// META (дата + размер)
|
|
205
|
+
// ─────────────────────────────────────────
|
|
206
|
+
|
|
207
|
+
/// Мета-информация
|
|
208
|
+
/// @output Flex column с выравниванием
|
|
209
|
+
/// @group file-card-base
|
|
210
|
+
@mixin meta {
|
|
211
|
+
flex: 1;
|
|
212
|
+
@include mixins.flex-column(0, space-between, flex-end);
|
|
213
|
+
flex-shrink: 0;
|
|
214
|
+
|
|
215
|
+
@include breakpoints.md-down {
|
|
216
|
+
order: 1;
|
|
217
|
+
@include mixins.flex-row($gap-nested, $align: center);
|
|
218
|
+
//align-items: flex-start;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/// Дата файла
|
|
223
|
+
/// @param {String} $color [foreground-muted] - Цвет
|
|
224
|
+
/// @output Стили даты
|
|
225
|
+
/// @group file-card-base
|
|
226
|
+
@mixin date($color: foreground-muted) {
|
|
227
|
+
margin: 0;
|
|
228
|
+
font-size: typography.$font-size-sm;
|
|
229
|
+
line-height: typography.$line-height-normal;
|
|
230
|
+
|
|
231
|
+
@include mixins.text-color($color);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/// Размер файла
|
|
235
|
+
/// @param {String} $color [foreground-caption] - Цвет
|
|
236
|
+
/// @output Стили размера
|
|
237
|
+
/// @group file-card-base
|
|
238
|
+
@mixin size($color: foreground-caption) {
|
|
239
|
+
margin: 0;
|
|
240
|
+
font-size: typography.$font-size-sm;
|
|
241
|
+
line-height: typography.$line-height-normal;
|
|
242
|
+
|
|
243
|
+
@include mixins.text-color($color);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
// ─────────────────────────────────────────
|
|
247
|
+
// DOWNLOAD BUTTON
|
|
248
|
+
// ─────────────────────────────────────────
|
|
249
|
+
|
|
250
|
+
/// Кнопка скачивания
|
|
251
|
+
/// @param {Number} $size [$download-size] - Размер кнопки
|
|
252
|
+
/// @param {String} $bg [accent] - Цвет фона
|
|
253
|
+
/// @param {String} $color [accent-foreground] - Цвет иконки
|
|
254
|
+
/// @output Квадратная кнопка с hover/focus
|
|
255
|
+
/// @group file-card-base
|
|
256
|
+
@mixin download($size: $download-size, $bg: accent, $color: accent-foreground) {
|
|
257
|
+
@include mixins.flex-center;
|
|
258
|
+
flex-shrink: 0;
|
|
259
|
+
width: $size;
|
|
260
|
+
height: $size;
|
|
261
|
+
|
|
262
|
+
text-decoration: none;
|
|
263
|
+
border: none;
|
|
264
|
+
cursor: pointer;
|
|
265
|
+
|
|
266
|
+
@include mixins.bg-color($bg);
|
|
267
|
+
@include mixins.text-color($color);
|
|
268
|
+
@include radius.rounded(sm);
|
|
269
|
+
|
|
270
|
+
@include animations.transition((background-color, transform), $transition-duration);
|
|
271
|
+
|
|
272
|
+
svg {
|
|
273
|
+
width: $download-icon-size;
|
|
274
|
+
height: $download-icon-size;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
&:hover {
|
|
278
|
+
@include mixins.bg-color($bg, 0.9);
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
&:active {
|
|
282
|
+
transform: scale(0.95);
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
&:focus-visible {
|
|
286
|
+
@include mixins.focus-ring(ring);
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
@include breakpoints.md-down {
|
|
290
|
+
order: 0;
|
|
291
|
+
width: $download-size-nested * 0.85;
|
|
292
|
+
height: $download-size-nested * 0.85;
|
|
293
|
+
background: none;
|
|
294
|
+
@include mixins.text-color($bg);
|
|
295
|
+
|
|
296
|
+
&:hover {
|
|
297
|
+
@include mixins.bg-color($color, 0.9);
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
svg {
|
|
301
|
+
width: calc(#{$download-icon-size} * 0.85);
|
|
302
|
+
height: calc(#{$download-icon-size} * 0.85);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
// ─────────────────────────────────────────
|
|
308
|
+
// NESTED CONTAINER
|
|
309
|
+
// ─────────────────────────────────────────
|
|
310
|
+
|
|
311
|
+
/// Контейнер вложенных файлов
|
|
312
|
+
/// Отступ = icon-size + gap (до правого края иконки родителя)
|
|
313
|
+
/// @output Padding left для выравнивания
|
|
314
|
+
/// @group file-card-base
|
|
315
|
+
@mixin nested {
|
|
316
|
+
// padding родителя + icon-size + gap = выравнивание под контент
|
|
317
|
+
padding-left: calc(#{$padding} + #{$icon-size});
|
|
318
|
+
padding-top: $gap-nested;
|
|
319
|
+
padding-bottom: $gap-nested;
|
|
320
|
+
@include mixins.flex-column($gap-nested);
|
|
321
|
+
|
|
322
|
+
@include breakpoints.md-down {
|
|
323
|
+
// padding-left: calc(#{$padding-nested} + #{$icon-size-nested} + #{$gap-nested});
|
|
324
|
+
padding-left: $gap-nested;
|
|
325
|
+
}
|
|
326
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// FILE CARD — INDEX
|
|
3
|
+
// local/common/theme-moexp/src/scss/abstracts/file-card/_index.scss
|
|
4
|
+
// ============================================
|
|
5
|
+
|
|
6
|
+
////
|
|
7
|
+
/// Экспорт модуля file-card
|
|
8
|
+
/// @group file-card
|
|
9
|
+
////
|
|
10
|
+
|
|
11
|
+
@forward "variables";
|
|
12
|
+
@forward "base";
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// FILE CARD — VARIABLES
|
|
3
|
+
// local/common/theme-moexp/src/scss/abstracts/file-card/_variables.scss
|
|
4
|
+
// ============================================
|
|
5
|
+
|
|
6
|
+
////
|
|
7
|
+
/// Переменные компонента file-card
|
|
8
|
+
/// @group file-card-variables
|
|
9
|
+
/// @author MOEXP Team
|
|
10
|
+
////
|
|
11
|
+
|
|
12
|
+
@use "../spacing";
|
|
13
|
+
@use "../typography";
|
|
14
|
+
@use "../animations";
|
|
15
|
+
|
|
16
|
+
/// Padding карточки
|
|
17
|
+
/// @type Number
|
|
18
|
+
/// @group file-card-variables
|
|
19
|
+
$padding: spacing.$spacing-lg !default;
|
|
20
|
+
|
|
21
|
+
/// Padding вложенной карточки
|
|
22
|
+
/// @type Number
|
|
23
|
+
/// @group file-card-variables
|
|
24
|
+
$padding-nested: spacing.$spacing-md !default;
|
|
25
|
+
|
|
26
|
+
/// Gap между элементами
|
|
27
|
+
/// @type Number
|
|
28
|
+
/// @group file-card-variables
|
|
29
|
+
$gap: spacing.$gap-lg !default;
|
|
30
|
+
|
|
31
|
+
/// Gap для вложенной карточки
|
|
32
|
+
/// @type Number
|
|
33
|
+
/// @group file-card-variables
|
|
34
|
+
$gap-nested: spacing.$gap-md !default;
|
|
35
|
+
|
|
36
|
+
/// Размер контейнера иконки типа файла
|
|
37
|
+
/// @type Number
|
|
38
|
+
/// @group file-card-variables
|
|
39
|
+
$icon-size: 4rem !default;
|
|
40
|
+
|
|
41
|
+
/// Размер контейнера иконки (nested)
|
|
42
|
+
/// @type Number
|
|
43
|
+
/// @group file-card-variables
|
|
44
|
+
$icon-size-nested: 3rem !default;
|
|
45
|
+
|
|
46
|
+
/// Размер SVG иконки внутри контейнера (50%)
|
|
47
|
+
/// @type Number
|
|
48
|
+
/// @group file-card-variables
|
|
49
|
+
$icon-svg-size: 2rem !default;
|
|
50
|
+
|
|
51
|
+
/// Размер SVG иконки (nested)
|
|
52
|
+
/// @type Number
|
|
53
|
+
/// @group file-card-variables
|
|
54
|
+
$icon-svg-size-nested: 1.5rem !default;
|
|
55
|
+
|
|
56
|
+
/// Размер кнопки скачивания
|
|
57
|
+
/// @type Number
|
|
58
|
+
/// @group file-card-variables
|
|
59
|
+
$download-size: 3rem !default;
|
|
60
|
+
|
|
61
|
+
/// Размер кнопки скачивания (nested)
|
|
62
|
+
/// @type Number
|
|
63
|
+
/// @group file-card-variables
|
|
64
|
+
$download-size-nested: 2.5rem !default;
|
|
65
|
+
|
|
66
|
+
/// Размер иконки скачивания
|
|
67
|
+
/// @type Number
|
|
68
|
+
/// @group file-card-variables
|
|
69
|
+
$download-icon-size: 1.5rem !default;
|
|
70
|
+
|
|
71
|
+
/// Отступ вложенных элементов слева
|
|
72
|
+
/// @type Number
|
|
73
|
+
/// @group file-card-variables
|
|
74
|
+
$nested-indent: spacing.$spacing-2xl !default;
|
|
75
|
+
|
|
76
|
+
/// Transition duration
|
|
77
|
+
/// @type Number
|
|
78
|
+
/// @group file-card-variables
|
|
79
|
+
$transition-duration: animations.$duration-fast !default;
|