@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,194 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// BREADCRUMB — BASE
|
|
3
|
+
// local/common/theme-moexp/src/scss/abstracts/breadcrumb/_base.scss
|
|
4
|
+
// ============================================
|
|
5
|
+
|
|
6
|
+
////
|
|
7
|
+
/// Базовые миксины breadcrumb
|
|
8
|
+
/// @group breadcrumb-base
|
|
9
|
+
/// @author MOEXP Team
|
|
10
|
+
////
|
|
11
|
+
|
|
12
|
+
@use "../typography";
|
|
13
|
+
@use "../spacing";
|
|
14
|
+
@use "../mixins";
|
|
15
|
+
@use "../animations";
|
|
16
|
+
@use "../breakpoints";
|
|
17
|
+
@use "variables" as *;
|
|
18
|
+
|
|
19
|
+
// ─────────────────────────────────────────
|
|
20
|
+
// CONTAINER (nav)
|
|
21
|
+
// ─────────────────────────────────────────
|
|
22
|
+
|
|
23
|
+
/// Базовые стили контейнера nav
|
|
24
|
+
/// @param {Number} $mb [$margin-bottom] - Отступ снизу
|
|
25
|
+
/// @output margin-bottom
|
|
26
|
+
/// @group breadcrumb-base
|
|
27
|
+
@mixin base($mb: $margin-bottom) {
|
|
28
|
+
margin-bottom: $mb;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// ─────────────────────────────────────────
|
|
32
|
+
// LIST (ol)
|
|
33
|
+
// ─────────────────────────────────────────
|
|
34
|
+
|
|
35
|
+
/// Стили списка ol с fallback для gap
|
|
36
|
+
/// @param {String} $color [foreground-muted] - Цвет текста
|
|
37
|
+
/// @output Flex с gap и fallback
|
|
38
|
+
/// @group breadcrumb-base
|
|
39
|
+
@mixin list($color: foreground-muted) {
|
|
40
|
+
display: flex;
|
|
41
|
+
flex-wrap: wrap;
|
|
42
|
+
align-items: center;
|
|
43
|
+
list-style: none;
|
|
44
|
+
margin: 0;
|
|
45
|
+
padding: 0;
|
|
46
|
+
|
|
47
|
+
font-size: typography.$font-size-sm;
|
|
48
|
+
line-height: typography.$line-height-normal;
|
|
49
|
+
overflow-wrap: break-word;
|
|
50
|
+
|
|
51
|
+
@include mixins.text-color($color);
|
|
52
|
+
|
|
53
|
+
// Fallback для gap (mobile)
|
|
54
|
+
> li {
|
|
55
|
+
margin-right: $gap-mobile;
|
|
56
|
+
margin-bottom: $gap-vertical;
|
|
57
|
+
|
|
58
|
+
&:last-child {
|
|
59
|
+
margin-right: 0;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Modern gap (mobile)
|
|
64
|
+
@supports (gap: 1px) {
|
|
65
|
+
gap: $gap-vertical $gap-mobile;
|
|
66
|
+
|
|
67
|
+
> li {
|
|
68
|
+
margin-right: 0;
|
|
69
|
+
margin-bottom: 0;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Desktop: увеличенный gap
|
|
74
|
+
@include breakpoints.sm {
|
|
75
|
+
// Fallback
|
|
76
|
+
> li {
|
|
77
|
+
margin-right: $gap;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// Modern
|
|
81
|
+
@supports (gap: 1px) {
|
|
82
|
+
gap: $gap-vertical $gap;
|
|
83
|
+
|
|
84
|
+
> li {
|
|
85
|
+
margin-right: 0;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// ─────────────────────────────────────────
|
|
92
|
+
// ITEM (li)
|
|
93
|
+
// ─────────────────────────────────────────
|
|
94
|
+
|
|
95
|
+
/// Стили элемента li
|
|
96
|
+
/// @output Inline-flex с выравниванием
|
|
97
|
+
/// @group breadcrumb-base
|
|
98
|
+
@mixin item {
|
|
99
|
+
display: inline-flex;
|
|
100
|
+
align-items: center;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// ─────────────────────────────────────────
|
|
104
|
+
// LINK (a)
|
|
105
|
+
// ─────────────────────────────────────────
|
|
106
|
+
|
|
107
|
+
/// Стили ссылки
|
|
108
|
+
/// @param {String} $hover-color [foreground] - Цвет при hover
|
|
109
|
+
/// @output Ссылка с transition и focus
|
|
110
|
+
/// @group breadcrumb-base
|
|
111
|
+
@mixin link($hover-color: foreground) {
|
|
112
|
+
color: inherit;
|
|
113
|
+
text-decoration: none;
|
|
114
|
+
|
|
115
|
+
@include animations.transition(color, $transition-duration);
|
|
116
|
+
|
|
117
|
+
&:hover {
|
|
118
|
+
@include mixins.text-color($hover-color);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
&:focus-visible {
|
|
122
|
+
@include mixins.focus-ring(ring, 2px, 2px);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// ─────────────────────────────────────────
|
|
127
|
+
// SEPARATOR (li с svg)
|
|
128
|
+
// ─────────────────────────────────────────
|
|
129
|
+
|
|
130
|
+
/// Стили разделителя
|
|
131
|
+
/// @param {String} $color [foreground-muted] - Цвет иконки
|
|
132
|
+
/// @param {Number} $size [$separator-size] - Размер иконки
|
|
133
|
+
/// @output Стили для контейнера SVG
|
|
134
|
+
/// @group breadcrumb-base
|
|
135
|
+
@mixin separator($color: foreground-muted, $size: $separator-size) {
|
|
136
|
+
display: inline-flex;
|
|
137
|
+
align-items: center;
|
|
138
|
+
flex-shrink: 0;
|
|
139
|
+
|
|
140
|
+
@include mixins.text-color($color);
|
|
141
|
+
|
|
142
|
+
svg {
|
|
143
|
+
width: $size;
|
|
144
|
+
height: $size;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// ─────────────────────────────────────────
|
|
149
|
+
// CURRENT (span)
|
|
150
|
+
// ─────────────────────────────────────────
|
|
151
|
+
|
|
152
|
+
/// Стили текущей страницы
|
|
153
|
+
/// @param {String} $color [foreground] - Цвет текста
|
|
154
|
+
/// @output Стили текущего элемента
|
|
155
|
+
/// @group breadcrumb-base
|
|
156
|
+
@mixin current($color: foreground) {
|
|
157
|
+
font-weight: typography.$font-weight-normal;
|
|
158
|
+
|
|
159
|
+
@include mixins.text-color($color);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// ─────────────────────────────────────────
|
|
163
|
+
// VARIANTS
|
|
164
|
+
// ─────────────────────────────────────────
|
|
165
|
+
|
|
166
|
+
/// Вариант на тёмном фоне
|
|
167
|
+
/// @output Переопределение цветов для dark theme
|
|
168
|
+
/// @group breadcrumb-base
|
|
169
|
+
@mixin on-dark {
|
|
170
|
+
@include mixins.text-color(primary-foreground, 0.6);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/// Ссылка на тёмном фоне
|
|
174
|
+
/// @output Hover цвет для dark
|
|
175
|
+
/// @group breadcrumb-base
|
|
176
|
+
@mixin link-on-dark {
|
|
177
|
+
&:hover {
|
|
178
|
+
@include mixins.text-color(primary-foreground);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/// Разделитель на тёмном фоне
|
|
183
|
+
/// @output Цвет разделителя для dark
|
|
184
|
+
/// @group breadcrumb-base
|
|
185
|
+
@mixin separator-on-dark {
|
|
186
|
+
@include mixins.text-color(primary-foreground, 0.4);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/// Текущий элемент на тёмном фоне
|
|
190
|
+
/// @output Цвет current для dark
|
|
191
|
+
/// @group breadcrumb-base
|
|
192
|
+
@mixin current-on-dark {
|
|
193
|
+
@include mixins.text-color(primary-foreground);
|
|
194
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// BREADCRUMB — INDEX
|
|
3
|
+
// local/common/theme-moexp/src/scss/abstracts/breadcrumb/_index.scss
|
|
4
|
+
// ============================================
|
|
5
|
+
|
|
6
|
+
////
|
|
7
|
+
/// Экспорт модуля breadcrumb
|
|
8
|
+
/// @group breadcrumb
|
|
9
|
+
////
|
|
10
|
+
|
|
11
|
+
@forward "variables";
|
|
12
|
+
@forward "base";
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// BREADCRUMB — VARIABLES
|
|
3
|
+
// local/common/theme-moexp/src/scss/abstracts/breadcrumb/_variables.scss
|
|
4
|
+
// ============================================
|
|
5
|
+
|
|
6
|
+
////
|
|
7
|
+
/// Переменные компонента breadcrumb
|
|
8
|
+
/// @group breadcrumb-variables
|
|
9
|
+
/// @author MOEXP Team
|
|
10
|
+
////
|
|
11
|
+
|
|
12
|
+
@use "../spacing";
|
|
13
|
+
@use "../typography";
|
|
14
|
+
@use "../animations";
|
|
15
|
+
|
|
16
|
+
/// Отступ снизу компонента
|
|
17
|
+
/// @type Number
|
|
18
|
+
/// @group breadcrumb-variables
|
|
19
|
+
$margin-bottom: spacing.$spacing-lg !default;
|
|
20
|
+
|
|
21
|
+
/// Gap между элементами (desktop)
|
|
22
|
+
/// @type Number
|
|
23
|
+
/// @group breadcrumb-variables
|
|
24
|
+
$gap: spacing.$gap-sm !default;
|
|
25
|
+
|
|
26
|
+
/// Gap между элементами (mobile)
|
|
27
|
+
/// @type Number
|
|
28
|
+
/// @group breadcrumb-variables
|
|
29
|
+
$gap-mobile: spacing.$spacing-xs !default;
|
|
30
|
+
|
|
31
|
+
/// Вертикальный gap при переносе
|
|
32
|
+
/// @type Number
|
|
33
|
+
/// @group breadcrumb-variables
|
|
34
|
+
$gap-vertical: spacing.$spacing-2xs !default;
|
|
35
|
+
|
|
36
|
+
/// Размер иконки-разделителя
|
|
37
|
+
/// @type Number
|
|
38
|
+
/// @group breadcrumb-variables
|
|
39
|
+
$separator-size: 0.875rem !default;
|
|
40
|
+
|
|
41
|
+
/// Размер иконки (sm)
|
|
42
|
+
/// @type Number
|
|
43
|
+
/// @group breadcrumb-variables
|
|
44
|
+
$separator-size-sm: 0.75rem !default;
|
|
45
|
+
|
|
46
|
+
/// Размер иконки (lg)
|
|
47
|
+
/// @type Number
|
|
48
|
+
/// @group breadcrumb-variables
|
|
49
|
+
$separator-size-lg: 1rem !default;
|
|
50
|
+
|
|
51
|
+
/// Transition duration
|
|
52
|
+
/// @type Number
|
|
53
|
+
/// @group breadcrumb-variables
|
|
54
|
+
$transition-duration: animations.$duration-fast !default;
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// BUTTONS — BASE
|
|
3
|
+
// local/common/theme-moexp/src/scss/abstracts/buttons/_base.scss
|
|
4
|
+
// ============================================
|
|
5
|
+
|
|
6
|
+
////
|
|
7
|
+
/// Базовый миксин кнопки
|
|
8
|
+
/// Фундамент для всех вариантов кнопок
|
|
9
|
+
/// @group buttons-base
|
|
10
|
+
/// @author MOEXP Team
|
|
11
|
+
////
|
|
12
|
+
|
|
13
|
+
@use "sass:map";
|
|
14
|
+
@use "../colors";
|
|
15
|
+
@use "../mixins";
|
|
16
|
+
@use "../animations";
|
|
17
|
+
@use "variables" as *;
|
|
18
|
+
|
|
19
|
+
// ─────────────────────────────────────────
|
|
20
|
+
// БАЗОВЫЙ МИКСИН
|
|
21
|
+
// ─────────────────────────────────────────
|
|
22
|
+
|
|
23
|
+
/// Базовые стили кнопки — используется всеми вариантами
|
|
24
|
+
/// Включает: display, padding, typography, transition, focus, active, disabled
|
|
25
|
+
/// @param {String} $size [md] - Размер кнопки: sm, md, lg
|
|
26
|
+
/// @require {variable} $btn-sizes
|
|
27
|
+
/// @require {variable} $btn-font-weight
|
|
28
|
+
/// @require {variable} $btn-line-height
|
|
29
|
+
/// @require {variable} $btn-transition-duration
|
|
30
|
+
/// @require {mixin} animations.transition
|
|
31
|
+
/// @require {mixin} mixins.focus-ring
|
|
32
|
+
/// @example scss - Создание кастомной кнопки
|
|
33
|
+
/// .my-button {
|
|
34
|
+
/// @include btn-base('lg');
|
|
35
|
+
/// background: purple;
|
|
36
|
+
/// color: white;
|
|
37
|
+
/// }
|
|
38
|
+
/// @example scss - Использование в варианте
|
|
39
|
+
/// @mixin btn-custom($size: md) {
|
|
40
|
+
/// @include btn-base($size);
|
|
41
|
+
/// // кастомные стили...
|
|
42
|
+
/// }
|
|
43
|
+
/// @output Базовые стили кнопки с states (focus, active, disabled)
|
|
44
|
+
/// @group buttons-base
|
|
45
|
+
/// @access public
|
|
46
|
+
@mixin btn-base($size: md) {
|
|
47
|
+
$config: map.get($btn-sizes, $size);
|
|
48
|
+
|
|
49
|
+
display: inline-flex;
|
|
50
|
+
align-items: center;
|
|
51
|
+
justify-content: center;
|
|
52
|
+
gap: 0.5rem;
|
|
53
|
+
|
|
54
|
+
padding: map.get($config, padding-y) map.get($config, padding-x);
|
|
55
|
+
|
|
56
|
+
font-family: inherit;
|
|
57
|
+
font-weight: $btn-font-weight;
|
|
58
|
+
font-size: map.get($config, font-size);
|
|
59
|
+
line-height: $btn-line-height;
|
|
60
|
+
text-decoration: none;
|
|
61
|
+
white-space: nowrap;
|
|
62
|
+
|
|
63
|
+
border: none;
|
|
64
|
+
border-radius: map.get($config, border-radius);
|
|
65
|
+
cursor: pointer;
|
|
66
|
+
|
|
67
|
+
@include animations.transition((background-color, color, border-color, box-shadow, transform), $btn-transition-duration);
|
|
68
|
+
|
|
69
|
+
// Focus — убираем дефолтный outline
|
|
70
|
+
&:focus {
|
|
71
|
+
outline: none;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Focus-visible — кастомный ring для клавиатурной навигации
|
|
75
|
+
&:focus-visible {
|
|
76
|
+
@include mixins.focus-ring(ring);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Active — микро-эффект нажатия
|
|
80
|
+
&:active:not(:disabled) {
|
|
81
|
+
transform: scale(0.98);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Disabled — все варианты отключённого состояния
|
|
85
|
+
&:disabled,
|
|
86
|
+
&[disabled],
|
|
87
|
+
&--disabled {
|
|
88
|
+
opacity: 0.5;
|
|
89
|
+
cursor: not-allowed;
|
|
90
|
+
pointer-events: none;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// BUTTONS — INDEX
|
|
3
|
+
// local/common/theme-moexp/src/scss/abstracts/buttons/_index.scss
|
|
4
|
+
// ============================================
|
|
5
|
+
|
|
6
|
+
////
|
|
7
|
+
/// Точка входа модуля кнопок
|
|
8
|
+
/// Экспортирует все переменные и миксины
|
|
9
|
+
/// @group buttons
|
|
10
|
+
/// @author MOEXP Team
|
|
11
|
+
////
|
|
12
|
+
|
|
13
|
+
// ─────────────────────────────────────────
|
|
14
|
+
// EXPORTS
|
|
15
|
+
// ─────────────────────────────────────────
|
|
16
|
+
|
|
17
|
+
/// Переменные кнопок
|
|
18
|
+
/// @see buttons/_variables.scss
|
|
19
|
+
@forward "variables";
|
|
20
|
+
|
|
21
|
+
/// Базовый миксин
|
|
22
|
+
/// @see buttons/_base.scss
|
|
23
|
+
@forward "base";
|
|
24
|
+
|
|
25
|
+
/// Варианты кнопок
|
|
26
|
+
/// @see buttons/_variants.scss
|
|
27
|
+
@forward "variants";
|
|
28
|
+
|
|
29
|
+
/// Модификаторы кнопок
|
|
30
|
+
/// @see buttons/_modifiers.scss
|
|
31
|
+
@forward "modifiers";
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// BUTTONS — MODIFIERS
|
|
3
|
+
// local/common/theme-moexp/src/scss/abstracts/buttons/_modifiers.scss
|
|
4
|
+
// ============================================
|
|
5
|
+
|
|
6
|
+
////
|
|
7
|
+
/// Модификаторы кнопок
|
|
8
|
+
/// Дополнительные миксины для расширения вариантов
|
|
9
|
+
/// @group buttons-modifiers
|
|
10
|
+
/// @author MOEXP Team
|
|
11
|
+
////
|
|
12
|
+
|
|
13
|
+
@use "../mixins";
|
|
14
|
+
@use "variables" as *;
|
|
15
|
+
|
|
16
|
+
// ─────────────────────────────────────────
|
|
17
|
+
// FULL WIDTH
|
|
18
|
+
// ─────────────────────────────────────────
|
|
19
|
+
|
|
20
|
+
/// Кнопка на всю ширину контейнера
|
|
21
|
+
/// @example scss
|
|
22
|
+
/// .form__submit {
|
|
23
|
+
/// @include btn-primary;
|
|
24
|
+
/// @include btn-full;
|
|
25
|
+
/// }
|
|
26
|
+
/// @example html
|
|
27
|
+
/// <button class="form__submit">Отправить</button>
|
|
28
|
+
/// @output width: 100%;
|
|
29
|
+
/// @group buttons-modifiers
|
|
30
|
+
/// @access public
|
|
31
|
+
@mixin btn-full {
|
|
32
|
+
width: 100%;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// ─────────────────────────────────────────
|
|
36
|
+
// WITH ICON
|
|
37
|
+
// ─────────────────────────────────────────
|
|
38
|
+
|
|
39
|
+
/// Кнопка с иконкой — правильные размеры для svg/icon
|
|
40
|
+
/// @example scss
|
|
41
|
+
/// .btn-with-arrow {
|
|
42
|
+
/// @include btn-primary;
|
|
43
|
+
/// @include btn-with-icon;
|
|
44
|
+
/// }
|
|
45
|
+
/// @example html
|
|
46
|
+
/// <button class="btn-with-arrow">
|
|
47
|
+
/// Next <svg>...</svg>
|
|
48
|
+
/// </button>
|
|
49
|
+
/// @output svg, .icon { flex-shrink: 0; width/height: 1.25em }
|
|
50
|
+
/// @group buttons-modifiers
|
|
51
|
+
/// @access public
|
|
52
|
+
@mixin btn-with-icon {
|
|
53
|
+
svg,
|
|
54
|
+
.icon {
|
|
55
|
+
flex-shrink: 0;
|
|
56
|
+
width: 1.25em;
|
|
57
|
+
height: 1.25em;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// ─────────────────────────────────────────
|
|
62
|
+
// LOADING
|
|
63
|
+
// ─────────────────────────────────────────
|
|
64
|
+
|
|
65
|
+
/// Loading состояние кнопки — спиннер поверх текста
|
|
66
|
+
/// Скрывает текст, показывает анимированный спиннер
|
|
67
|
+
/// @require {mixin} mixins.border-color-hsl
|
|
68
|
+
/// @example scss
|
|
69
|
+
/// .btn-submit {
|
|
70
|
+
/// @include btn-primary;
|
|
71
|
+
///
|
|
72
|
+
/// &.is-loading {
|
|
73
|
+
/// @include btn-loading;
|
|
74
|
+
/// }
|
|
75
|
+
/// }
|
|
76
|
+
/// @example html
|
|
77
|
+
/// <button class="btn-submit is-loading">Submitting...</button>
|
|
78
|
+
/// @output Спиннер поверх прозрачного текста
|
|
79
|
+
/// @group buttons-modifiers
|
|
80
|
+
/// @access public
|
|
81
|
+
@mixin btn-loading {
|
|
82
|
+
position: relative;
|
|
83
|
+
color: transparent !important;
|
|
84
|
+
pointer-events: none;
|
|
85
|
+
|
|
86
|
+
&::after {
|
|
87
|
+
content: "";
|
|
88
|
+
position: absolute;
|
|
89
|
+
width: 1.25em;
|
|
90
|
+
height: 1.25em;
|
|
91
|
+
border: 2px solid currentColor;
|
|
92
|
+
border-right-color: transparent;
|
|
93
|
+
border-radius: 50%;
|
|
94
|
+
animation: btn-spin 0.6s linear infinite;
|
|
95
|
+
|
|
96
|
+
// Возвращаем цвет для спиннера
|
|
97
|
+
@include mixins.border-color-hsl(accent-foreground, 0.8);
|
|
98
|
+
border-right-color: transparent;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// ─────────────────────────────────────────
|
|
103
|
+
// KEYFRAMES
|
|
104
|
+
// ─────────────────────────────────────────
|
|
105
|
+
|
|
106
|
+
/// Keyframes для спиннера (вызвать один раз в компоненте)
|
|
107
|
+
/// @group buttons-modifiers
|
|
108
|
+
@mixin btn-spin-keyframes {
|
|
109
|
+
@keyframes btn-spin {
|
|
110
|
+
to {
|
|
111
|
+
transform: rotate(360deg);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// BUTTONS — VARIABLES
|
|
3
|
+
// local/common/theme-moexp/src/scss/abstracts/buttons/_variables.scss
|
|
4
|
+
// ============================================
|
|
5
|
+
|
|
6
|
+
////
|
|
7
|
+
/// Переменные системы кнопок
|
|
8
|
+
/// Токены дизайна для размеров, отступов и типографики кнопок
|
|
9
|
+
/// @group buttons-variables
|
|
10
|
+
/// @author MOEXP Team
|
|
11
|
+
////
|
|
12
|
+
|
|
13
|
+
@use "sass:map";
|
|
14
|
+
|
|
15
|
+
// ─────────────────────────────────────────
|
|
16
|
+
// БАЗОВЫЕ ПЕРЕМЕННЫЕ
|
|
17
|
+
// ─────────────────────────────────────────
|
|
18
|
+
|
|
19
|
+
/// Вертикальный padding кнопки по умолчанию
|
|
20
|
+
/// @type Number
|
|
21
|
+
/// @group buttons-variables
|
|
22
|
+
$btn-padding-y: 0.75rem !default;
|
|
23
|
+
|
|
24
|
+
/// Горизонтальный padding кнопки по умолчанию
|
|
25
|
+
/// @type Number
|
|
26
|
+
/// @group buttons-variables
|
|
27
|
+
$btn-padding-x: 2rem !default;
|
|
28
|
+
|
|
29
|
+
/// Размер шрифта кнопки по умолчанию
|
|
30
|
+
/// @type Number
|
|
31
|
+
/// @group buttons-variables
|
|
32
|
+
$btn-font-size: 1rem !default;
|
|
33
|
+
|
|
34
|
+
/// Начертание шрифта кнопки
|
|
35
|
+
/// @type Number
|
|
36
|
+
/// @group buttons-variables
|
|
37
|
+
$btn-font-weight: 500 !default;
|
|
38
|
+
|
|
39
|
+
/// Высота строки кнопки
|
|
40
|
+
/// @type Number
|
|
41
|
+
/// @group buttons-variables
|
|
42
|
+
$btn-line-height: 1.5 !default;
|
|
43
|
+
|
|
44
|
+
/// Border-radius кнопки по умолчанию
|
|
45
|
+
/// @type Number
|
|
46
|
+
/// @group buttons-variables
|
|
47
|
+
$btn-border-radius: 0.375rem !default;
|
|
48
|
+
|
|
49
|
+
/// Длительность transition кнопки
|
|
50
|
+
/// @type Number
|
|
51
|
+
/// @group buttons-variables
|
|
52
|
+
$btn-transition-duration: 200ms !default;
|
|
53
|
+
|
|
54
|
+
// ─────────────────────────────────────────
|
|
55
|
+
// КАРТА РАЗМЕРОВ
|
|
56
|
+
// ─────────────────────────────────────────
|
|
57
|
+
|
|
58
|
+
/// Карта размеров кнопок
|
|
59
|
+
/// @type Map
|
|
60
|
+
/// @prop {Map} sm - Маленькая кнопка
|
|
61
|
+
/// @prop {Number} sm.padding-y [0.5rem] - Вертикальный padding
|
|
62
|
+
/// @prop {Number} sm.padding-x [1rem] - Горизонтальный padding
|
|
63
|
+
/// @prop {Number} sm.font-size [0.875rem] - Размер шрифта (14px)
|
|
64
|
+
/// @prop {Number} sm.border-radius [0.25rem] - Скругление
|
|
65
|
+
/// @prop {Map} md - Средняя кнопка (по умолчанию)
|
|
66
|
+
/// @prop {Number} md.padding-y [0.75rem] - Вертикальный padding
|
|
67
|
+
/// @prop {Number} md.padding-x [2rem] - Горизонтальный padding
|
|
68
|
+
/// @prop {Number} md.font-size [1rem] - Размер шрифта (16px)
|
|
69
|
+
/// @prop {Number} md.border-radius [0.375rem] - Скругление
|
|
70
|
+
/// @prop {Map} lg - Большая кнопка
|
|
71
|
+
/// @prop {Number} lg.padding-y [1rem] - Вертикальный padding
|
|
72
|
+
/// @prop {Number} lg.padding-x [2.5rem] - Горизонтальный padding
|
|
73
|
+
/// @prop {Number} lg.font-size [1.125rem] - Размер шрифта (18px)
|
|
74
|
+
/// @prop {Number} lg.border-radius [0.5rem] - Скругление
|
|
75
|
+
/// @example scss - Получение конфига размера
|
|
76
|
+
/// $config: map.get($btn-sizes, 'lg');
|
|
77
|
+
/// padding: map.get($config, 'padding-y') map.get($config, 'padding-x');
|
|
78
|
+
/// @group buttons-variables
|
|
79
|
+
$btn-sizes: (
|
|
80
|
+
sm: (
|
|
81
|
+
padding-y: 0.5rem,
|
|
82
|
+
padding-x: 1rem,
|
|
83
|
+
font-size: 0.875rem,
|
|
84
|
+
border-radius: 0.25rem,
|
|
85
|
+
),
|
|
86
|
+
md: (
|
|
87
|
+
padding-y: 0.75rem,
|
|
88
|
+
padding-x: 2rem,
|
|
89
|
+
font-size: 1rem,
|
|
90
|
+
border-radius: 0.375rem,
|
|
91
|
+
),
|
|
92
|
+
lg: (
|
|
93
|
+
padding-y: 1rem,
|
|
94
|
+
padding-x: 2.5rem,
|
|
95
|
+
font-size: 1.125rem,
|
|
96
|
+
border-radius: 0.5rem,
|
|
97
|
+
),
|
|
98
|
+
) !default;
|