@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,52 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// CARDS — SIZES
|
|
3
|
+
// local/common/theme-moexp/src/scss/abstracts/cards/_sizes.scss
|
|
4
|
+
// ============================================
|
|
5
|
+
|
|
6
|
+
////
|
|
7
|
+
/// Размеры карточек
|
|
8
|
+
/// Модификаторы padding и radius
|
|
9
|
+
/// @group cards-sizes
|
|
10
|
+
/// @author MOEXP Team
|
|
11
|
+
////
|
|
12
|
+
|
|
13
|
+
@use "../radius";
|
|
14
|
+
@use "variables" as *;
|
|
15
|
+
|
|
16
|
+
// ─────────────────────────────────────────
|
|
17
|
+
// SMALL
|
|
18
|
+
// ─────────────────────────────────────────
|
|
19
|
+
|
|
20
|
+
/// Маленькая карточка — меньше padding и radius
|
|
21
|
+
/// @require {mixin} radius.rounded
|
|
22
|
+
/// @example scss
|
|
23
|
+
/// .card--sm {
|
|
24
|
+
/// @include card-base;
|
|
25
|
+
/// @include card-sm;
|
|
26
|
+
/// }
|
|
27
|
+
/// @output padding: 1rem; border-radius: md;
|
|
28
|
+
/// @group cards-sizes
|
|
29
|
+
/// @access public
|
|
30
|
+
@mixin card-sm {
|
|
31
|
+
padding: $card-padding-sm;
|
|
32
|
+
@include radius.rounded(md);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// ─────────────────────────────────────────
|
|
36
|
+
// LARGE
|
|
37
|
+
// ─────────────────────────────────────────
|
|
38
|
+
|
|
39
|
+
/// Большая карточка — больше padding и radius
|
|
40
|
+
/// @require {mixin} radius.rounded
|
|
41
|
+
/// @example scss
|
|
42
|
+
/// .card--lg {
|
|
43
|
+
/// @include card-base;
|
|
44
|
+
/// @include card-lg;
|
|
45
|
+
/// }
|
|
46
|
+
/// @output padding: 2rem; border-radius: xl;
|
|
47
|
+
/// @group cards-sizes
|
|
48
|
+
/// @access public
|
|
49
|
+
@mixin card-lg {
|
|
50
|
+
padding: $card-padding-lg;
|
|
51
|
+
@include radius.rounded(xl);
|
|
52
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// CARDS — VARIABLES
|
|
3
|
+
// local/common/theme-moexp/src/scss/abstracts/cards/_variables.scss
|
|
4
|
+
// ============================================
|
|
5
|
+
|
|
6
|
+
////
|
|
7
|
+
/// Переменные системы карточек
|
|
8
|
+
/// Токены дизайна для размеров, отступов и анимаций
|
|
9
|
+
/// @group cards-variables
|
|
10
|
+
/// @author MOEXP Team
|
|
11
|
+
////
|
|
12
|
+
|
|
13
|
+
@use "../spacing";
|
|
14
|
+
@use "../radius";
|
|
15
|
+
|
|
16
|
+
// ─────────────────────────────────────────
|
|
17
|
+
// БАЗОВЫЕ ПЕРЕМЕННЫЕ
|
|
18
|
+
// ─────────────────────────────────────────
|
|
19
|
+
|
|
20
|
+
/// Стандартный padding карточки (1.5rem / 24px)
|
|
21
|
+
/// @type Number
|
|
22
|
+
/// @group cards-variables
|
|
23
|
+
$card-padding: spacing.$spacing-lg !default;
|
|
24
|
+
|
|
25
|
+
/// Маленький padding карточки (1rem / 16px)
|
|
26
|
+
/// @type Number
|
|
27
|
+
/// @group cards-variables
|
|
28
|
+
$card-padding-sm: spacing.$spacing-md !default;
|
|
29
|
+
|
|
30
|
+
/// Большой padding карточки (2rem / 32px)
|
|
31
|
+
/// @type Number
|
|
32
|
+
/// @group cards-variables
|
|
33
|
+
$card-padding-lg: spacing.$spacing-xl !default;
|
|
34
|
+
|
|
35
|
+
/// Border-radius карточки (8px)
|
|
36
|
+
/// @type Number
|
|
37
|
+
/// @group cards-variables
|
|
38
|
+
$card-radius: radius.$radius-lg !default;
|
|
39
|
+
|
|
40
|
+
/// Прозрачность border по умолчанию
|
|
41
|
+
/// @type Number
|
|
42
|
+
/// @group cards-variables
|
|
43
|
+
$card-border-alpha: 0.5 !default;
|
|
44
|
+
|
|
45
|
+
/// Прозрачность фона по умолчанию
|
|
46
|
+
/// @type Number
|
|
47
|
+
/// @group cards-variables
|
|
48
|
+
$card-bg-alpha: 0.95 !default;
|
|
49
|
+
|
|
50
|
+
/// Длительность transition карточки
|
|
51
|
+
/// @type Number
|
|
52
|
+
/// @group cards-variables
|
|
53
|
+
$card-transition-duration: 300ms !default;
|
|
54
|
+
|
|
55
|
+
// ─────────────────────────────────────────
|
|
56
|
+
// FEATURED CARD ПЕРЕМЕННЫЕ
|
|
57
|
+
// ─────────────────────────────────────────
|
|
58
|
+
|
|
59
|
+
/// Высота изображения featured card (16rem / 256px)
|
|
60
|
+
/// @type Number
|
|
61
|
+
/// @group cards-featured
|
|
62
|
+
$card-featured-image-height: 16rem !default;
|
|
63
|
+
|
|
64
|
+
/// Padding контента featured card (2rem / 32px)
|
|
65
|
+
/// @type Number
|
|
66
|
+
/// @group cards-featured
|
|
67
|
+
$card-featured-padding: spacing.$spacing-xl !default;
|
|
68
|
+
|
|
69
|
+
/// Длительность transition featured card
|
|
70
|
+
/// @type Number
|
|
71
|
+
/// @group cards-featured
|
|
72
|
+
$card-featured-transition: 300ms !default;
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// CARDS — VARIANTS
|
|
3
|
+
// local/common/theme-moexp/src/scss/abstracts/cards/_variants.scss
|
|
4
|
+
// ============================================
|
|
5
|
+
|
|
6
|
+
////
|
|
7
|
+
/// Готовые варианты карточек
|
|
8
|
+
/// Interactive, Service, Static, Link, Glass-interactive
|
|
9
|
+
/// @group cards-variants
|
|
10
|
+
/// @author MOEXP Team
|
|
11
|
+
////
|
|
12
|
+
|
|
13
|
+
@use "../mixins";
|
|
14
|
+
@use "../radius";
|
|
15
|
+
@use "../animations";
|
|
16
|
+
@use "variables" as *;
|
|
17
|
+
@use "base" as *;
|
|
18
|
+
@use "hover" as *;
|
|
19
|
+
|
|
20
|
+
// ─────────────────────────────────────────
|
|
21
|
+
// INTERACTIVE
|
|
22
|
+
// ─────────────────────────────────────────
|
|
23
|
+
|
|
24
|
+
/// Стандартная интерактивная карточка
|
|
25
|
+
/// Соответствует Tailwind: rounded-lg border shadow-sm p-6
|
|
26
|
+
/// hover:shadow-lg transition-all bg-card/95 border-border/50 hover:border-accent/50
|
|
27
|
+
/// @require {mixin} card-base
|
|
28
|
+
/// @require {mixin} card-hover-shadow
|
|
29
|
+
/// @example scss
|
|
30
|
+
/// .service-card {
|
|
31
|
+
/// @include card-interactive;
|
|
32
|
+
/// }
|
|
33
|
+
/// @output Полные стили интерактивной карточки
|
|
34
|
+
/// @group cards-variants
|
|
35
|
+
/// @access public
|
|
36
|
+
@mixin card-interactive {
|
|
37
|
+
@include card-base;
|
|
38
|
+
@include card-hover-shadow(true);
|
|
39
|
+
cursor: pointer;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// ─────────────────────────────────────────
|
|
43
|
+
// SERVICE
|
|
44
|
+
// ─────────────────────────────────────────
|
|
45
|
+
|
|
46
|
+
/// Service Card — карточка услуги
|
|
47
|
+
/// Из оригинального Tailwind шаблона
|
|
48
|
+
/// @require {mixin} mixins.bg-color
|
|
49
|
+
/// @require {mixin} mixins.border-hsl
|
|
50
|
+
/// @require {mixin} radius.rounded-var
|
|
51
|
+
/// @require {mixin} animations.transition
|
|
52
|
+
/// @require {mixin} mixins.shadow-lg
|
|
53
|
+
/// @require {mixin} mixins.border-color-hsl
|
|
54
|
+
/// @example scss
|
|
55
|
+
/// .services__item {
|
|
56
|
+
/// @include card-service;
|
|
57
|
+
/// }
|
|
58
|
+
/// @output Карточка услуги с hover эффектами
|
|
59
|
+
/// @group cards-variants
|
|
60
|
+
/// @access public
|
|
61
|
+
@mixin card-service {
|
|
62
|
+
position: relative;
|
|
63
|
+
overflow: hidden;
|
|
64
|
+
|
|
65
|
+
padding: $card-padding;
|
|
66
|
+
|
|
67
|
+
@include mixins.bg-color(background-card);
|
|
68
|
+
@include mixins.border-hsl(1px, solid, border, 0.5);
|
|
69
|
+
@include radius.rounded-var(-4px); // calc(var(--radius) - 4px)
|
|
70
|
+
|
|
71
|
+
@include animations.transition(all, $card-transition-duration, animations.$ease-in-out);
|
|
72
|
+
|
|
73
|
+
&:hover {
|
|
74
|
+
@include mixins.shadow-lg;
|
|
75
|
+
@include mixins.border-color-hsl(accent, 0.5);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// ─────────────────────────────────────────
|
|
80
|
+
// GLASS INTERACTIVE
|
|
81
|
+
// ─────────────────────────────────────────
|
|
82
|
+
|
|
83
|
+
/// Карточка с glassmorphism и интерактивностью
|
|
84
|
+
/// @require {mixin} card-glass
|
|
85
|
+
/// @require {mixin} card-hover-shadow
|
|
86
|
+
/// @example scss
|
|
87
|
+
/// .overlay-card {
|
|
88
|
+
/// @include card-glass-interactive;
|
|
89
|
+
/// }
|
|
90
|
+
/// @output Glass карточка с hover
|
|
91
|
+
/// @group cards-variants
|
|
92
|
+
/// @access public
|
|
93
|
+
@mixin card-glass-interactive {
|
|
94
|
+
@include card-glass;
|
|
95
|
+
@include card-hover-shadow(true);
|
|
96
|
+
cursor: pointer;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// ─────────────────────────────────────────
|
|
100
|
+
// STATIC
|
|
101
|
+
// ─────────────────────────────────────────
|
|
102
|
+
|
|
103
|
+
/// Простая карточка без hover эффектов
|
|
104
|
+
/// Для статичного контента
|
|
105
|
+
/// @require {mixin} card-base
|
|
106
|
+
/// @example scss
|
|
107
|
+
/// .info-card {
|
|
108
|
+
/// @include card-static;
|
|
109
|
+
/// }
|
|
110
|
+
/// @output Статичная карточка
|
|
111
|
+
/// @group cards-variants
|
|
112
|
+
/// @access public
|
|
113
|
+
@mixin card-static {
|
|
114
|
+
@include card-base(background-card, 1, border, 0.3);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// ─────────────────────────────────────────
|
|
118
|
+
// LINK
|
|
119
|
+
// ─────────────────────────────────────────
|
|
120
|
+
|
|
121
|
+
/// Карточка-ссылка — вся кликабельная
|
|
122
|
+
/// С focus-visible для accessibility
|
|
123
|
+
/// @require {mixin} card-interactive
|
|
124
|
+
/// @require {mixin} mixins.focus-ring
|
|
125
|
+
/// @example scss
|
|
126
|
+
/// a.project-card {
|
|
127
|
+
/// @include card-link;
|
|
128
|
+
/// }
|
|
129
|
+
/// @example html
|
|
130
|
+
/// <a href="/project" class="project-card">...</a>
|
|
131
|
+
/// @output Кликабельная карточка с focus ring
|
|
132
|
+
/// @group cards-variants
|
|
133
|
+
/// @access public
|
|
134
|
+
@mixin card-link {
|
|
135
|
+
@include card-interactive;
|
|
136
|
+
text-decoration: none;
|
|
137
|
+
color: inherit;
|
|
138
|
+
display: block;
|
|
139
|
+
|
|
140
|
+
&:focus-visible {
|
|
141
|
+
@include mixins.focus-ring(ring);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// CARDS — VERTICAL
|
|
3
|
+
// local/common/theme-moexp/src/scss/abstracts/cards/_vertical.scss
|
|
4
|
+
// ============================================
|
|
5
|
+
|
|
6
|
+
////
|
|
7
|
+
/// Вертикальные карточки (изображение сверху)
|
|
8
|
+
/// Контейнер, изображение, контент, мета, title, description
|
|
9
|
+
/// @group cards-vertical
|
|
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
|
+
// VERTICAL CONTAINER
|
|
22
|
+
// ─────────────────────────────────────────
|
|
23
|
+
|
|
24
|
+
/// Вертикальная карточка — контейнер
|
|
25
|
+
/// @require {mixin} mixins.bg-color
|
|
26
|
+
/// @require {mixin} mixins.border-hsl
|
|
27
|
+
/// @require {mixin} radius.rounded
|
|
28
|
+
/// @require {mixin} mixins.shadow-sm
|
|
29
|
+
/// @require {mixin} animations.transition
|
|
30
|
+
/// @require {mixin} mixins.shadow-lg
|
|
31
|
+
/// @require {mixin} mixins.border-color-hsl
|
|
32
|
+
/// @example scss
|
|
33
|
+
/// .article-card {
|
|
34
|
+
/// @include card-vertical;
|
|
35
|
+
/// }
|
|
36
|
+
/// @output Контейнер вертикальной карточки
|
|
37
|
+
/// @group cards-vertical
|
|
38
|
+
/// @access public
|
|
39
|
+
@mixin card-vertical {
|
|
40
|
+
position: relative;
|
|
41
|
+
overflow: hidden;
|
|
42
|
+
display: block;
|
|
43
|
+
text-decoration: none;
|
|
44
|
+
color: inherit;
|
|
45
|
+
|
|
46
|
+
@include mixins.bg-color(background-card);
|
|
47
|
+
@include mixins.border-hsl(1px, solid, border, 0.5);
|
|
48
|
+
@include radius.rounded(lg);
|
|
49
|
+
@include mixins.shadow-sm;
|
|
50
|
+
|
|
51
|
+
cursor: pointer;
|
|
52
|
+
|
|
53
|
+
@include animations.transition((box-shadow, border-color), $card-transition-duration, animations.$ease-in-out);
|
|
54
|
+
|
|
55
|
+
&:hover {
|
|
56
|
+
@include mixins.shadow-lg;
|
|
57
|
+
@include mixins.border-color-hsl(accent, 0.5);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// ─────────────────────────────────────────
|
|
62
|
+
// VERTICAL IMAGE
|
|
63
|
+
// ─────────────────────────────────────────
|
|
64
|
+
|
|
65
|
+
/// Обёртка изображения вертикальной карточки
|
|
66
|
+
/// @param {Number} $height [12rem] - Высота изображения
|
|
67
|
+
/// @param {Number} $aspect-ratio [null] - Или aspect-ratio (16/9, 4/3)
|
|
68
|
+
/// @example scss - С фиксированной высотой
|
|
69
|
+
/// .article-card__image-wrap {
|
|
70
|
+
/// @include card-vertical-image-wrap(10rem);
|
|
71
|
+
/// }
|
|
72
|
+
/// @example scss - С aspect-ratio
|
|
73
|
+
/// .article-card__image-wrap {
|
|
74
|
+
/// @include card-vertical-image-wrap($aspect-ratio: 16/9);
|
|
75
|
+
/// }
|
|
76
|
+
/// @output Контейнер изображения
|
|
77
|
+
/// @group cards-vertical
|
|
78
|
+
/// @access public
|
|
79
|
+
@mixin card-vertical-image-wrap($height: 12rem, $aspect-ratio: null) {
|
|
80
|
+
position: relative;
|
|
81
|
+
overflow: hidden;
|
|
82
|
+
|
|
83
|
+
@if $aspect-ratio {
|
|
84
|
+
aspect-ratio: $aspect-ratio;
|
|
85
|
+
} @else {
|
|
86
|
+
height: $height;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/// Изображение вертикальной карточки с hover
|
|
91
|
+
/// @require {mixin} animations.transition
|
|
92
|
+
/// @example scss
|
|
93
|
+
/// .article-card__image {
|
|
94
|
+
/// @include card-vertical-image;
|
|
95
|
+
/// }
|
|
96
|
+
/// @output Изображение со scale при hover
|
|
97
|
+
/// @group cards-vertical
|
|
98
|
+
/// @access public
|
|
99
|
+
@mixin card-vertical-image {
|
|
100
|
+
width: 100%;
|
|
101
|
+
height: 100%;
|
|
102
|
+
// object-fit: cover;
|
|
103
|
+
|
|
104
|
+
@include animations.transition(transform, $card-transition-duration, animations.$ease-out);
|
|
105
|
+
|
|
106
|
+
[class*="card"]:hover &,
|
|
107
|
+
a:hover & {
|
|
108
|
+
transform: scale(1.05);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// ─────────────────────────────────────────
|
|
113
|
+
// VERTICAL CONTENT
|
|
114
|
+
// ─────────────────────────────────────────
|
|
115
|
+
|
|
116
|
+
/// Контент вертикальной карточки
|
|
117
|
+
/// @param {Number} $padding [$card-padding] - Padding
|
|
118
|
+
/// @example scss
|
|
119
|
+
/// .article-card__content {
|
|
120
|
+
/// @include card-vertical-content;
|
|
121
|
+
/// }
|
|
122
|
+
/// @output Padding контента
|
|
123
|
+
/// @group cards-vertical
|
|
124
|
+
/// @access public
|
|
125
|
+
@mixin card-vertical-content($padding: $card-padding) {
|
|
126
|
+
padding: $padding;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/// Мета вертикальной карточки (дата, категория)
|
|
130
|
+
/// @param {String} $color [accent-on-light] - Цвет текста
|
|
131
|
+
/// @require {mixin} mixins.text-color
|
|
132
|
+
/// @example scss
|
|
133
|
+
/// .article-card__meta {
|
|
134
|
+
/// @include card-vertical-meta;
|
|
135
|
+
/// }
|
|
136
|
+
/// @output Flex строка с иконкой
|
|
137
|
+
/// @group cards-vertical
|
|
138
|
+
/// @access public
|
|
139
|
+
@mixin card-vertical-meta($color: accent-on-light) {
|
|
140
|
+
display: flex;
|
|
141
|
+
align-items: center;
|
|
142
|
+
gap: 0.5rem;
|
|
143
|
+
margin-bottom: 0.75rem;
|
|
144
|
+
|
|
145
|
+
@include mixins.text-color($color);
|
|
146
|
+
font-size: typography.$font-size-sm;
|
|
147
|
+
|
|
148
|
+
svg {
|
|
149
|
+
width: 1rem;
|
|
150
|
+
height: 1rem;
|
|
151
|
+
flex-shrink: 0;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/// Заголовок вертикальной карточки с hover
|
|
156
|
+
/// @param {String} $color [foreground] - Цвет текста
|
|
157
|
+
/// @param {String} $hover-color [accent-on-light] - Цвет при hover
|
|
158
|
+
/// @require {mixin} mixins.text-color
|
|
159
|
+
/// @require {mixin} animations.transition
|
|
160
|
+
/// @example scss
|
|
161
|
+
/// .article-card__title {
|
|
162
|
+
/// @include card-vertical-title;
|
|
163
|
+
/// }
|
|
164
|
+
/// @output Заголовок с hover цветом
|
|
165
|
+
/// @group cards-vertical
|
|
166
|
+
/// @access public
|
|
167
|
+
@mixin card-vertical-title($color: foreground, $hover-color: accent-on-light) {
|
|
168
|
+
font-weight: typography.$font-weight-semibold;
|
|
169
|
+
font-size: typography.$font-size-lg;
|
|
170
|
+
line-height: typography.$line-height-snug;
|
|
171
|
+
margin-bottom: 0.5rem;
|
|
172
|
+
|
|
173
|
+
@include mixins.text-color($color);
|
|
174
|
+
@include animations.transition(color, $card-transition-duration);
|
|
175
|
+
|
|
176
|
+
[class*="card"]:hover &,
|
|
177
|
+
a:hover & {
|
|
178
|
+
@include mixins.text-color($hover-color);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/// Описание вертикальной карточки с truncate
|
|
183
|
+
/// @param {String} $color [foreground-muted] - Цвет текста
|
|
184
|
+
/// @param {Number} $lines [3] - Количество строк для truncate
|
|
185
|
+
/// @require {mixin} mixins.text-color
|
|
186
|
+
/// @require {mixin} mixins.text-truncate
|
|
187
|
+
/// @example scss
|
|
188
|
+
/// .article-card__description {
|
|
189
|
+
/// @include card-vertical-description('foreground-muted', 2);
|
|
190
|
+
/// }
|
|
191
|
+
/// @output Описание с line-clamp
|
|
192
|
+
/// @group cards-vertical
|
|
193
|
+
/// @access public
|
|
194
|
+
@mixin card-vertical-description($color: foreground-muted, $lines: 3) {
|
|
195
|
+
font-size: typography.$font-size-sm;
|
|
196
|
+
line-height: typography.$line-height-relaxed;
|
|
197
|
+
|
|
198
|
+
@include mixins.text-color($color);
|
|
199
|
+
@include mixins.text-truncate($lines);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
// ─────────────────────────────────────────
|
|
203
|
+
// IMAGE COVER UTILITY
|
|
204
|
+
// ─────────────────────────────────────────
|
|
205
|
+
|
|
206
|
+
/// Изображение cover — заполняет контейнер
|
|
207
|
+
/// @example scss
|
|
208
|
+
/// .card__img {
|
|
209
|
+
/// @include image-cover;
|
|
210
|
+
/// }
|
|
211
|
+
/// @output width: 100%; height: 100%; object-fit: cover;
|
|
212
|
+
/// @group cards-vertical
|
|
213
|
+
/// @access public
|
|
214
|
+
@mixin image-cover {
|
|
215
|
+
width: 100%;
|
|
216
|
+
height: 100%;
|
|
217
|
+
object-fit: cover;
|
|
218
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
////
|
|
2
|
+
/// Chip Base — базовые миксины
|
|
3
|
+
/// @group chip-base
|
|
4
|
+
/// @author MOEXP Team
|
|
5
|
+
////
|
|
6
|
+
|
|
7
|
+
@use "../mixins";
|
|
8
|
+
@use "../animations";
|
|
9
|
+
@use "../spacing";
|
|
10
|
+
@use "variables" as *;
|
|
11
|
+
|
|
12
|
+
// ============================================
|
|
13
|
+
// CHIP BASE
|
|
14
|
+
// ============================================
|
|
15
|
+
|
|
16
|
+
/// Базовый chip — контейнер с flex-выравниванием
|
|
17
|
+
/// @param {String} $color [$chip-color-default] - Цвет текста
|
|
18
|
+
/// @example scss
|
|
19
|
+
/// .my-chip {
|
|
20
|
+
/// @include chip-base;
|
|
21
|
+
/// }
|
|
22
|
+
/// @output inline-flex контейнер с gap и transition
|
|
23
|
+
/// @group chip-base
|
|
24
|
+
/// @access public
|
|
25
|
+
@mixin chip-base($color: $chip-color-default) {
|
|
26
|
+
display: inline-flex;
|
|
27
|
+
align-items: center;
|
|
28
|
+
font-size: inherit;
|
|
29
|
+
line-height: 1;
|
|
30
|
+
text-decoration: none;
|
|
31
|
+
cursor: pointer;
|
|
32
|
+
|
|
33
|
+
// Сброс для button
|
|
34
|
+
background: transparent;
|
|
35
|
+
border: none;
|
|
36
|
+
padding: 0;
|
|
37
|
+
|
|
38
|
+
@include mixins.flex-gap(spacing.$gap-xs);
|
|
39
|
+
@include mixins.text-color($color);
|
|
40
|
+
@include animations.transition-colors;
|
|
41
|
+
@include animations.focus-visible-ring;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// ============================================
|
|
45
|
+
// CHIP ICON
|
|
46
|
+
// ============================================
|
|
47
|
+
|
|
48
|
+
/// Иконка внутри chip
|
|
49
|
+
/// @param {Number} $size [$chip-icon-size] - Размер иконки
|
|
50
|
+
/// @example scss
|
|
51
|
+
/// .my-chip__icon {
|
|
52
|
+
/// @include chip-icon;
|
|
53
|
+
/// }
|
|
54
|
+
/// @output SVG-иконка с fill: currentColor
|
|
55
|
+
/// @group chip-base
|
|
56
|
+
/// @access public
|
|
57
|
+
@mixin chip-icon($size: $chip-icon-size) {
|
|
58
|
+
width: $size;
|
|
59
|
+
height: $size;
|
|
60
|
+
min-width: $size;
|
|
61
|
+
min-height: $size;
|
|
62
|
+
flex-shrink: 0;
|
|
63
|
+
fill: currentColor;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// ============================================
|
|
67
|
+
// CHIP TEXT
|
|
68
|
+
// ============================================
|
|
69
|
+
|
|
70
|
+
/// Текст внутри chip
|
|
71
|
+
/// @example scss
|
|
72
|
+
/// .my-chip__text {
|
|
73
|
+
/// @include chip-text;
|
|
74
|
+
/// }
|
|
75
|
+
/// @output Текстовый элемент
|
|
76
|
+
/// @group chip-base
|
|
77
|
+
/// @access public
|
|
78
|
+
@mixin chip-text {
|
|
79
|
+
line-height: inherit;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// ============================================
|
|
83
|
+
// CHIP DISABLED
|
|
84
|
+
// ============================================
|
|
85
|
+
|
|
86
|
+
/// Disabled состояние chip
|
|
87
|
+
/// @param {Number} $opacity [$chip-opacity-disabled] - Прозрачность
|
|
88
|
+
/// @example scss
|
|
89
|
+
/// .my-chip:disabled {
|
|
90
|
+
/// @include chip-disabled;
|
|
91
|
+
/// }
|
|
92
|
+
/// @output opacity + pointer-events: none
|
|
93
|
+
/// @group chip-base
|
|
94
|
+
/// @access public
|
|
95
|
+
@mixin chip-disabled($opacity: $chip-opacity-disabled) {
|
|
96
|
+
opacity: $opacity;
|
|
97
|
+
cursor: not-allowed;
|
|
98
|
+
pointer-events: none;
|
|
99
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
////
|
|
2
|
+
/// Chip Icon — миксины для работы с иконками
|
|
3
|
+
/// @group chip-icon
|
|
4
|
+
/// @author MOEXP Team
|
|
5
|
+
////
|
|
6
|
+
|
|
7
|
+
@use "variables" as *;
|
|
8
|
+
|
|
9
|
+
// ============================================
|
|
10
|
+
// ICON ONLY
|
|
11
|
+
// ============================================
|
|
12
|
+
|
|
13
|
+
/// Chip только с иконкой (без текста)
|
|
14
|
+
/// Требует aria-label для accessibility
|
|
15
|
+
/// @example scss
|
|
16
|
+
/// .social-icon {
|
|
17
|
+
/// @include chip-base;
|
|
18
|
+
/// @include chip-icon-only;
|
|
19
|
+
/// }
|
|
20
|
+
/// @output Минимальные стили (наследует от base)
|
|
21
|
+
/// @group chip-icon
|
|
22
|
+
/// @access public
|
|
23
|
+
@mixin chip-icon-only {
|
|
24
|
+
// Базовые стили наследуются от chip-base
|
|
25
|
+
// Можно добавить специфичные стили при необходимости
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// ============================================
|
|
29
|
+
// DUAL ICON (для toggle)
|
|
30
|
+
// ============================================
|
|
31
|
+
|
|
32
|
+
/// Контейнер для двух иконок (toggle состояния)
|
|
33
|
+
/// Используется для accessibility-toggle, theme-toggle
|
|
34
|
+
/// @param {String} $active-class ['accessibility-icon--active'] - Класс активной иконки
|
|
35
|
+
/// @example scss
|
|
36
|
+
/// .toggle-chip {
|
|
37
|
+
/// @include chip-base;
|
|
38
|
+
/// @include chip-dual-icon;
|
|
39
|
+
/// }
|
|
40
|
+
/// @example html
|
|
41
|
+
/// <button class="toggle-chip">
|
|
42
|
+
/// <svg class="toggle-chip__icon toggle-chip__icon--default">...</svg>
|
|
43
|
+
/// <svg class="toggle-chip__icon toggle-chip__icon--active">...</svg>
|
|
44
|
+
/// </button>
|
|
45
|
+
/// @output Скрытие/показ иконок через CSS
|
|
46
|
+
/// @group chip-icon
|
|
47
|
+
/// @access public
|
|
48
|
+
@mixin chip-dual-icon($active-class: "accessibility-icon--active") {
|
|
49
|
+
// Активная иконка скрыта по умолчанию
|
|
50
|
+
.#{$active-class} {
|
|
51
|
+
display: none;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/// Показать активную иконку (для состояния active)
|
|
56
|
+
/// @param {String} $default-class ['accessibility-icon--default'] - Класс дефолтной иконки
|
|
57
|
+
/// @param {String} $active-class ['accessibility-icon--active'] - Класс активной иконки
|
|
58
|
+
/// @example scss
|
|
59
|
+
/// .toggle-chip.is-active {
|
|
60
|
+
/// @include chip-dual-icon-active;
|
|
61
|
+
/// }
|
|
62
|
+
/// @output Переключение видимости иконок
|
|
63
|
+
/// @group chip-icon
|
|
64
|
+
/// @access public
|
|
65
|
+
@mixin chip-dual-icon-active($default-class: "accessibility-icon--default", $active-class: "accessibility-icon--active") {
|
|
66
|
+
.#{$default-class} {
|
|
67
|
+
display: none;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.#{$active-class} {
|
|
71
|
+
display: block;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
////
|
|
2
|
+
/// Chip Index — точка входа модуля
|
|
3
|
+
/// @group chip
|
|
4
|
+
/// @author MOEXP Team
|
|
5
|
+
////
|
|
6
|
+
|
|
7
|
+
/// Переменные
|
|
8
|
+
/// @access public
|
|
9
|
+
@forward "variables";
|
|
10
|
+
|
|
11
|
+
/// Базовые миксины
|
|
12
|
+
/// @access public
|
|
13
|
+
@forward "base";
|
|
14
|
+
|
|
15
|
+
/// Варианты оформления
|
|
16
|
+
/// @access public
|
|
17
|
+
@forward "variants";
|
|
18
|
+
|
|
19
|
+
/// Работа с иконками
|
|
20
|
+
/// @access public
|
|
21
|
+
@forward "icon";
|