@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,83 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// NEWS CARD — FEATURED
|
|
3
|
+
// local/common/theme-moexp/src/scss/abstracts/news-card/_featured.scss
|
|
4
|
+
// ============================================
|
|
5
|
+
|
|
6
|
+
////
|
|
7
|
+
/// Featured карточка новости (с изображением)
|
|
8
|
+
/// Горизонтальная раскладка на десктопе
|
|
9
|
+
/// @group news-card-featured
|
|
10
|
+
/// @author MOEXP Team
|
|
11
|
+
////
|
|
12
|
+
|
|
13
|
+
@use "../mixins";
|
|
14
|
+
@use "../animations";
|
|
15
|
+
@use "../breakpoints";
|
|
16
|
+
@use "variables" as *;
|
|
17
|
+
|
|
18
|
+
// ─────────────────────────────────────────
|
|
19
|
+
// GRID (вложенный контейнер)
|
|
20
|
+
// ─────────────────────────────────────────
|
|
21
|
+
|
|
22
|
+
/// Grid layout — применяется к __grid, НЕ к контейнеру
|
|
23
|
+
/// @param {String} $image-position [left] - Позиция изображения
|
|
24
|
+
/// @group news-card-featured
|
|
25
|
+
/// @access public
|
|
26
|
+
@mixin news-card-featured-grid($image-position: left) {
|
|
27
|
+
display: grid;
|
|
28
|
+
grid-template-columns: 1fr;
|
|
29
|
+
gap: 0;
|
|
30
|
+
|
|
31
|
+
@include breakpoints.md {
|
|
32
|
+
grid-template-columns: 1fr 1fr;
|
|
33
|
+
|
|
34
|
+
@if $image-position == right {
|
|
35
|
+
> *:first-child {
|
|
36
|
+
order: 2;
|
|
37
|
+
}
|
|
38
|
+
> *:last-child {
|
|
39
|
+
order: 1;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// ─────────────────────────────────────────
|
|
46
|
+
// IMAGE WRAPPER
|
|
47
|
+
// ─────────────────────────────────────────
|
|
48
|
+
|
|
49
|
+
/// Обёртка изображения
|
|
50
|
+
/// @group news-card-featured
|
|
51
|
+
/// @access public
|
|
52
|
+
@mixin news-card-featured-image-wrap {
|
|
53
|
+
position: relative;
|
|
54
|
+
height: $news-card-featured-image-height;
|
|
55
|
+
overflow: hidden;
|
|
56
|
+
|
|
57
|
+
@include breakpoints.md {
|
|
58
|
+
height: auto;
|
|
59
|
+
min-height: $news-card-featured-image-height;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// ─────────────────────────────────────────
|
|
64
|
+
// IMAGE
|
|
65
|
+
// ─────────────────────────────────────────
|
|
66
|
+
|
|
67
|
+
/// Изображение с hover эффектом
|
|
68
|
+
/// @param {String} $parent-selector - Селектор родителя для hover
|
|
69
|
+
/// @group news-card-featured
|
|
70
|
+
/// @access public
|
|
71
|
+
@mixin news-card-featured-image($parent-selector: null) {
|
|
72
|
+
width: 100%;
|
|
73
|
+
height: 100%;
|
|
74
|
+
object-fit: cover;
|
|
75
|
+
|
|
76
|
+
@include animations.transition(transform, $news-card-transition, animations.$ease-out);
|
|
77
|
+
|
|
78
|
+
@if $parent-selector {
|
|
79
|
+
#{$parent-selector}:hover & {
|
|
80
|
+
transform: scale(1.05);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// NEWS CARD — INDEX
|
|
3
|
+
// local/common/theme-moexp/src/scss/abstracts/news-card/_index.scss
|
|
4
|
+
// ============================================
|
|
5
|
+
|
|
6
|
+
////
|
|
7
|
+
/// Точка входа модуля карточек новостей
|
|
8
|
+
/// Экспортирует все переменные и миксины
|
|
9
|
+
/// @group news-card
|
|
10
|
+
/// @author MOEXP Team
|
|
11
|
+
////
|
|
12
|
+
|
|
13
|
+
// ─────────────────────────────────────────
|
|
14
|
+
// EXPORTS
|
|
15
|
+
// ─────────────────────────────────────────
|
|
16
|
+
|
|
17
|
+
/// Переменные
|
|
18
|
+
/// @see news-card/_variables.scss
|
|
19
|
+
@forward "variables";
|
|
20
|
+
|
|
21
|
+
/// Базовые миксины
|
|
22
|
+
/// @see news-card/_base.scss
|
|
23
|
+
@forward "base";
|
|
24
|
+
|
|
25
|
+
/// Featured (с изображением)
|
|
26
|
+
/// @see news-card/_featured.scss
|
|
27
|
+
@forward "featured";
|
|
28
|
+
|
|
29
|
+
/// Compact (без изображения)
|
|
30
|
+
/// @see news-card/_compact.scss
|
|
31
|
+
@forward "compact";
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// NEWS CARD — VARIABLES
|
|
3
|
+
// local/common/theme-moexp/src/scss/abstracts/news-card/_variables.scss
|
|
4
|
+
// ============================================
|
|
5
|
+
|
|
6
|
+
////
|
|
7
|
+
/// Переменные для карточек новостей
|
|
8
|
+
/// @group news-card
|
|
9
|
+
/// @author MOEXP Team
|
|
10
|
+
////
|
|
11
|
+
|
|
12
|
+
@use "../spacing";
|
|
13
|
+
|
|
14
|
+
// ─────────────────────────────────────────
|
|
15
|
+
// ОБЩИЕ
|
|
16
|
+
// ─────────────────────────────────────────
|
|
17
|
+
|
|
18
|
+
/// Transition duration
|
|
19
|
+
/// @type Number
|
|
20
|
+
/// @group news-card
|
|
21
|
+
$news-card-transition: 300ms !default;
|
|
22
|
+
|
|
23
|
+
/// Padding контента
|
|
24
|
+
/// @type Number
|
|
25
|
+
/// @group news-card
|
|
26
|
+
$news-card-padding: spacing.$spacing-xl !default;
|
|
27
|
+
|
|
28
|
+
// ─────────────────────────────────────────
|
|
29
|
+
// FEATURED (с изображением)
|
|
30
|
+
// ─────────────────────────────────────────
|
|
31
|
+
|
|
32
|
+
/// Высота изображения featured
|
|
33
|
+
/// @type Number
|
|
34
|
+
/// @group news-card
|
|
35
|
+
$news-card-featured-image-height: 16rem !default;
|
|
36
|
+
|
|
37
|
+
// ─────────────────────────────────────────
|
|
38
|
+
// COMPACT (без изображения)
|
|
39
|
+
// ─────────────────────────────────────────
|
|
40
|
+
|
|
41
|
+
/// Padding compact карточки
|
|
42
|
+
/// @type Number
|
|
43
|
+
/// @group news-card
|
|
44
|
+
$news-card-compact-padding: spacing.$spacing-lg !default;
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// PROJECT CARD — BASE
|
|
3
|
+
// local/common/theme-moexp/src/scss/abstracts/project-card/_base.scss
|
|
4
|
+
// ============================================
|
|
5
|
+
|
|
6
|
+
////
|
|
7
|
+
/// Базовые миксины карточки проекта
|
|
8
|
+
/// @group project-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 "../cards";
|
|
18
|
+
@use "variables" as *;
|
|
19
|
+
|
|
20
|
+
// ─────────────────────────────────────────
|
|
21
|
+
// БАЗОВЫЕ МИКСИНЫ
|
|
22
|
+
// ─────────────────────────────────────────
|
|
23
|
+
|
|
24
|
+
/// Базовые стили карточки
|
|
25
|
+
/// @output Стили контейнера
|
|
26
|
+
/// @group project-card-base
|
|
27
|
+
@mixin base {
|
|
28
|
+
@include cards.card-vertical;
|
|
29
|
+
|
|
30
|
+
&:focus-visible {
|
|
31
|
+
@include mixins.focus-ring(ring);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/// Badge года
|
|
36
|
+
/// @param {String} $bg-color [background-section] - Фон
|
|
37
|
+
/// @param {String} $text-color [foreground-muted] - Цвет текста
|
|
38
|
+
/// @output Стили badge
|
|
39
|
+
/// @group project-card-base
|
|
40
|
+
@mixin year($bg-color: background-section, $text-color: foreground-muted) {
|
|
41
|
+
position: absolute;
|
|
42
|
+
top: spacing.$spacing-lg;
|
|
43
|
+
left: spacing.$spacing-lg;
|
|
44
|
+
z-index: 1;
|
|
45
|
+
|
|
46
|
+
padding: spacing.$spacing-xs spacing.$spacing-sm;
|
|
47
|
+
|
|
48
|
+
font-size: typography.$font-size-xs;
|
|
49
|
+
font-weight: typography.$font-weight-semibold;
|
|
50
|
+
line-height: typography.$line-height-normal;
|
|
51
|
+
|
|
52
|
+
@include mixins.bg-color($bg-color);
|
|
53
|
+
@include mixins.text-color($text-color);
|
|
54
|
+
@include radius.rounded(sm);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/// Обёртка изображения
|
|
58
|
+
/// @param {Number} $height [$image-height] - Высота
|
|
59
|
+
/// @output Стили контейнера изображения
|
|
60
|
+
/// @group project-card-base
|
|
61
|
+
@mixin image-wrap($height: $image-height) {
|
|
62
|
+
@include cards.card-vertical-image-wrap($height);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/// Изображение с hover
|
|
66
|
+
/// @output Стили изображения
|
|
67
|
+
/// @group project-card-base
|
|
68
|
+
@mixin image {
|
|
69
|
+
@include cards.image-cover;
|
|
70
|
+
|
|
71
|
+
@include animations.transition(transform, $transition, animations.$ease-out);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/// Контент карточки
|
|
75
|
+
/// @output Padding контента
|
|
76
|
+
/// @group project-card-base
|
|
77
|
+
@mixin content {
|
|
78
|
+
@include cards.card-vertical-content;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/// Мета-информация (локация)
|
|
82
|
+
/// @param {String} $color [accent-on-light] - Цвет
|
|
83
|
+
/// @output Стили meta
|
|
84
|
+
/// @group project-card-base
|
|
85
|
+
@mixin meta($color: accent-on-light) {
|
|
86
|
+
@include cards.card-vertical-meta($color);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/// Заголовок с hover
|
|
90
|
+
/// @param {String} $color [foreground] - Цвет
|
|
91
|
+
/// @param {String} $hover-color [accent-on-light] - Цвет при hover
|
|
92
|
+
/// @output Стили заголовка
|
|
93
|
+
/// @group project-card-base
|
|
94
|
+
@mixin title($color: foreground, $hover-color: accent-on-light) {
|
|
95
|
+
@include cards.card-vertical-title($color, $hover-color);
|
|
96
|
+
|
|
97
|
+
span {
|
|
98
|
+
font-weight: typography.$font-weight-bold;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/// Описание
|
|
103
|
+
/// @param {String} $color [foreground-muted] - Цвет
|
|
104
|
+
/// @param {Number} $lines [2] - Количество строк для truncate
|
|
105
|
+
/// @output Стили описания
|
|
106
|
+
/// @group project-card-base
|
|
107
|
+
@mixin description($color: foreground-muted, $lines: 2) {
|
|
108
|
+
@include cards.card-vertical-description($color, $lines);
|
|
109
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// PROJECT CARD — INDEX
|
|
3
|
+
// local/common/theme-moexp/src/scss/abstracts/project-card/_index.scss
|
|
4
|
+
// ============================================
|
|
5
|
+
|
|
6
|
+
////
|
|
7
|
+
/// Точка входа модуля карточки проекта
|
|
8
|
+
/// Экспортирует все переменные и миксины
|
|
9
|
+
/// @group project-card
|
|
10
|
+
/// @author MOEXP Team
|
|
11
|
+
////
|
|
12
|
+
|
|
13
|
+
// ─────────────────────────────────────────
|
|
14
|
+
// EXPORTS
|
|
15
|
+
// ─────────────────────────────────────────
|
|
16
|
+
|
|
17
|
+
/// Переменные
|
|
18
|
+
/// @see project-card/_variables.scss
|
|
19
|
+
@forward "variables";
|
|
20
|
+
|
|
21
|
+
/// Базовые миксины
|
|
22
|
+
/// @see project-card/_base.scss
|
|
23
|
+
@forward "base";
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// PROJECT CARD — VARIABLES
|
|
3
|
+
// local/common/theme-moexp/src/scss/abstracts/project-card/_variables.scss
|
|
4
|
+
// ============================================
|
|
5
|
+
|
|
6
|
+
////
|
|
7
|
+
/// Переменные карточки проекта
|
|
8
|
+
/// @group project-card-variables
|
|
9
|
+
/// @author MOEXP Team
|
|
10
|
+
////
|
|
11
|
+
|
|
12
|
+
/// Высота изображения
|
|
13
|
+
/// @type Number
|
|
14
|
+
/// @group project-card-variables
|
|
15
|
+
$image-height: 12rem !default;
|
|
16
|
+
|
|
17
|
+
/// Transition duration
|
|
18
|
+
/// @type Number
|
|
19
|
+
/// @group project-card-variables
|
|
20
|
+
$transition: 300ms !default;
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// SEARCH FORM — BASE
|
|
3
|
+
// local/common/theme-moexp/src/scss/abstracts/search-form/_base.scss
|
|
4
|
+
// ============================================
|
|
5
|
+
|
|
6
|
+
////
|
|
7
|
+
/// Базовые миксины формы поиска
|
|
8
|
+
/// Структура контейнера, input и button
|
|
9
|
+
/// @group search-form
|
|
10
|
+
/// @author MOEXP Team
|
|
11
|
+
////
|
|
12
|
+
|
|
13
|
+
@use "../spacing";
|
|
14
|
+
@use "../typography";
|
|
15
|
+
@use "../radius";
|
|
16
|
+
@use "variables" as *;
|
|
17
|
+
|
|
18
|
+
// ─────────────────────────────────────────
|
|
19
|
+
// CONTAINER
|
|
20
|
+
// ─────────────────────────────────────────
|
|
21
|
+
|
|
22
|
+
/// Базовая структура контейнера формы поиска
|
|
23
|
+
/// Устанавливает размеры и relative positioning для абсолютной кнопки
|
|
24
|
+
///
|
|
25
|
+
/// @param {Length} $width [$search-form-width] - Ширина формы
|
|
26
|
+
/// @param {Length} $height [$search-form-height] - Высота формы
|
|
27
|
+
/// @example scss
|
|
28
|
+
/// .my-search {
|
|
29
|
+
/// @include search-form-base;
|
|
30
|
+
/// }
|
|
31
|
+
/// @example scss - Кастомные размеры
|
|
32
|
+
/// .my-search {
|
|
33
|
+
/// @include search-form-base(20rem, 3rem);
|
|
34
|
+
/// }
|
|
35
|
+
/// @output position, width, height
|
|
36
|
+
/// @group search-form
|
|
37
|
+
/// @access public
|
|
38
|
+
@mixin search-form-base($width: $search-form-width, $height: $search-form-height) {
|
|
39
|
+
position: relative;
|
|
40
|
+
width: $width;
|
|
41
|
+
height: $height;
|
|
42
|
+
|
|
43
|
+
// Доступность: минимальный размер touch target
|
|
44
|
+
min-height: 44px;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// ─────────────────────────────────────────
|
|
48
|
+
// INPUT
|
|
49
|
+
// ─────────────────────────────────────────
|
|
50
|
+
|
|
51
|
+
/// Базовые стили поля ввода поиска
|
|
52
|
+
/// Input занимает 100% размеров контейнера
|
|
53
|
+
///
|
|
54
|
+
/// @example scss
|
|
55
|
+
/// .my-search__input {
|
|
56
|
+
/// @include search-form-input-base;
|
|
57
|
+
/// }
|
|
58
|
+
/// @output width: 100%, height: 100%, padding, font-size, border-radius
|
|
59
|
+
/// @group search-form
|
|
60
|
+
/// @access public
|
|
61
|
+
@mixin search-form-input-base {
|
|
62
|
+
// Занимаем всё пространство формы
|
|
63
|
+
width: 100%;
|
|
64
|
+
height: 100%;
|
|
65
|
+
|
|
66
|
+
// Отступы
|
|
67
|
+
padding-left: spacing.$spacing-md;
|
|
68
|
+
padding-right: $search-form-icon-offset + $search-form-icon-size + 0.5rem;
|
|
69
|
+
|
|
70
|
+
// Типографика
|
|
71
|
+
font-size: typography.$font-size-sm;
|
|
72
|
+
|
|
73
|
+
// Скругление
|
|
74
|
+
border-radius: radius.$radius-sm;
|
|
75
|
+
|
|
76
|
+
// Убираем стандартные стили
|
|
77
|
+
appearance: none;
|
|
78
|
+
-webkit-appearance: none;
|
|
79
|
+
|
|
80
|
+
&::-webkit-search-cancel-button,
|
|
81
|
+
&::-webkit-search-decoration {
|
|
82
|
+
-webkit-appearance: none;
|
|
83
|
+
appearance: none;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// ─────────────────────────────────────────
|
|
88
|
+
// BUTTON
|
|
89
|
+
// ─────────────────────────────────────────
|
|
90
|
+
|
|
91
|
+
/// Базовые стили кнопки поиска (иконка)
|
|
92
|
+
/// Позиционирование и размеры SVG
|
|
93
|
+
///
|
|
94
|
+
/// @example scss
|
|
95
|
+
/// .my-search__button {
|
|
96
|
+
/// @include search-form-button-base;
|
|
97
|
+
/// }
|
|
98
|
+
/// @output position, размеры, сброс стилей кнопки
|
|
99
|
+
/// @group search-form
|
|
100
|
+
/// @access public
|
|
101
|
+
@mixin search-form-button-base {
|
|
102
|
+
position: absolute;
|
|
103
|
+
right: $search-form-icon-offset;
|
|
104
|
+
top: 50%;
|
|
105
|
+
transform: translateY(-50%);
|
|
106
|
+
|
|
107
|
+
// Сброс стилей кнопки
|
|
108
|
+
padding: 0;
|
|
109
|
+
margin: 0;
|
|
110
|
+
background: transparent;
|
|
111
|
+
border: none;
|
|
112
|
+
cursor: pointer;
|
|
113
|
+
|
|
114
|
+
// Доступность: минимальный размер touch target
|
|
115
|
+
// Увеличиваем кликабельную область
|
|
116
|
+
&::before {
|
|
117
|
+
content: "";
|
|
118
|
+
position: absolute;
|
|
119
|
+
top: 50%;
|
|
120
|
+
left: 50%;
|
|
121
|
+
transform: translate(-50%, -50%);
|
|
122
|
+
width: 44px;
|
|
123
|
+
height: 44px;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
svg {
|
|
127
|
+
width: $search-form-icon-size;
|
|
128
|
+
height: $search-form-icon-size;
|
|
129
|
+
fill: currentColor;
|
|
130
|
+
display: block;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// SEARCH FORM — COMPOSITE
|
|
3
|
+
// local/common/theme-moexp/src/scss/abstracts/search-form/_composite.scss
|
|
4
|
+
// ============================================
|
|
5
|
+
|
|
6
|
+
////
|
|
7
|
+
/// Комбинированные миксины формы поиска
|
|
8
|
+
/// Быстрое создание полной формы одним вызовом
|
|
9
|
+
/// @group search-form
|
|
10
|
+
/// @author MOEXP Team
|
|
11
|
+
////
|
|
12
|
+
|
|
13
|
+
@use "variables" as *;
|
|
14
|
+
@use "base" as *;
|
|
15
|
+
@use "theme" as *;
|
|
16
|
+
|
|
17
|
+
// ─────────────────────────────────────────
|
|
18
|
+
// FULL SEARCH FORM
|
|
19
|
+
// ─────────────────────────────────────────
|
|
20
|
+
|
|
21
|
+
/// Полный набор стилей для контейнера формы поиска
|
|
22
|
+
/// Комбинирует base + структуру для input и button
|
|
23
|
+
///
|
|
24
|
+
/// @param {String} $color - Имя цвета темы
|
|
25
|
+
/// @param {Length} $width [$search-form-width] - Ширина формы
|
|
26
|
+
/// @param {Length} $height [$search-form-height] - Высота формы
|
|
27
|
+
/// @example scss - Быстрое создание формы
|
|
28
|
+
/// .header__search-form {
|
|
29
|
+
/// @include search-form($color: primary-foreground);
|
|
30
|
+
/// }
|
|
31
|
+
/// @example scss - Кастомные размеры
|
|
32
|
+
/// .hero__search-form {
|
|
33
|
+
/// @include search-form(primary-foreground, 25rem, 3.5rem);
|
|
34
|
+
/// }
|
|
35
|
+
/// @output Полная структура формы с темой
|
|
36
|
+
/// @group search-form
|
|
37
|
+
/// @access public
|
|
38
|
+
@mixin search-form($color, $width: $search-form-width, $height: $search-form-height) {
|
|
39
|
+
@include search-form-base($width, $height);
|
|
40
|
+
|
|
41
|
+
// Стили для input внутри
|
|
42
|
+
input,
|
|
43
|
+
&__input {
|
|
44
|
+
@include search-form-input-base;
|
|
45
|
+
@include search-form-input-theme($color);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Стили для button внутри
|
|
49
|
+
button,
|
|
50
|
+
&__button {
|
|
51
|
+
@include search-form-button-base;
|
|
52
|
+
@include search-form-button-theme($color);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// SEARCH FORM — INDEX
|
|
3
|
+
// local/common/theme-moexp/src/scss/abstracts/search-form/_index.scss
|
|
4
|
+
// ============================================
|
|
5
|
+
|
|
6
|
+
////
|
|
7
|
+
/// Точка входа модуля формы поиска
|
|
8
|
+
/// Экспортирует все переменные и миксины
|
|
9
|
+
/// @group search-form
|
|
10
|
+
/// @author MOEXP Team
|
|
11
|
+
////
|
|
12
|
+
|
|
13
|
+
// ─────────────────────────────────────────
|
|
14
|
+
// EXPORTS
|
|
15
|
+
// ─────────────────────────────────────────
|
|
16
|
+
|
|
17
|
+
/// Переменные формы поиска
|
|
18
|
+
/// @see search-form/_variables.scss
|
|
19
|
+
@forward "variables";
|
|
20
|
+
|
|
21
|
+
/// Базовые миксины
|
|
22
|
+
/// @see search-form/_base.scss
|
|
23
|
+
@forward "base";
|
|
24
|
+
|
|
25
|
+
/// Темизация
|
|
26
|
+
/// @see search-form/_theme.scss
|
|
27
|
+
@forward "theme";
|
|
28
|
+
|
|
29
|
+
/// Комбинированные миксины
|
|
30
|
+
/// @see search-form/_composite.scss
|
|
31
|
+
@forward "composite";
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// SEARCH FORM — THEME
|
|
3
|
+
// local/common/theme-moexp/src/scss/abstracts/search-form/_theme.scss
|
|
4
|
+
// ============================================
|
|
5
|
+
|
|
6
|
+
////
|
|
7
|
+
/// Темизация формы поиска
|
|
8
|
+
/// Цвета для input и button в разных контекстах
|
|
9
|
+
/// @group search-form
|
|
10
|
+
/// @author MOEXP Team
|
|
11
|
+
////
|
|
12
|
+
|
|
13
|
+
@use "../mixins";
|
|
14
|
+
@use "../animations";
|
|
15
|
+
|
|
16
|
+
// ─────────────────────────────────────────
|
|
17
|
+
// INPUT THEME
|
|
18
|
+
// ─────────────────────────────────────────
|
|
19
|
+
|
|
20
|
+
/// Тема для поля ввода поиска
|
|
21
|
+
/// Устанавливает цвета фона, границы, текста, placeholder
|
|
22
|
+
///
|
|
23
|
+
/// @param {String} $color - Имя цвета из палитры темы
|
|
24
|
+
/// @param {Number} $bg-alpha [0.1] - Прозрачность фона
|
|
25
|
+
/// @param {Number} $border-alpha [0.2] - Прозрачность границы
|
|
26
|
+
/// @param {Number} $placeholder-alpha [0.5] - Прозрачность placeholder
|
|
27
|
+
/// @require {mixin} mixins.hsl-prop
|
|
28
|
+
/// @require {mixin} mixins.border-hsl
|
|
29
|
+
/// @require {mixin} mixins.text-color
|
|
30
|
+
/// @require {mixin} animations.input-focus-light
|
|
31
|
+
/// @example scss - На тёмном фоне
|
|
32
|
+
/// .search__input {
|
|
33
|
+
/// @include search-form-input-theme(primary-foreground);
|
|
34
|
+
/// }
|
|
35
|
+
/// @example scss - На светлом фоне
|
|
36
|
+
/// .search__input {
|
|
37
|
+
/// @include search-form-input-theme(primary, 0.05, 0.15);
|
|
38
|
+
/// }
|
|
39
|
+
/// @output background-color, border, color, placeholder, focus
|
|
40
|
+
/// @group search-form
|
|
41
|
+
/// @access public
|
|
42
|
+
@mixin search-form-input-theme($color, $bg-alpha: 0.1, $border-alpha: 0.2, $placeholder-alpha: 0.5) {
|
|
43
|
+
@include mixins.hsl-prop(background-color, $color, $bg-alpha);
|
|
44
|
+
@include mixins.border-hsl(1px, solid, $color, $border-alpha);
|
|
45
|
+
@include mixins.text-color($color);
|
|
46
|
+
|
|
47
|
+
&::placeholder {
|
|
48
|
+
@include mixins.hsl-prop(color, $color, $placeholder-alpha);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
@include animations.input-focus-light($color);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// ─────────────────────────────────────────
|
|
55
|
+
// BUTTON THEME
|
|
56
|
+
// ─────────────────────────────────────────
|
|
57
|
+
|
|
58
|
+
/// Тема для кнопки поиска
|
|
59
|
+
/// Устанавливает цвет иконки и hover-состояние
|
|
60
|
+
///
|
|
61
|
+
/// @param {String} $color - Имя цвета из палитры темы
|
|
62
|
+
/// @param {Number} $alpha [0.6] - Прозрачность цвета
|
|
63
|
+
/// @param {Number} $hover-alpha [1] - Прозрачность при hover
|
|
64
|
+
/// @require {mixin} mixins.hsl-prop
|
|
65
|
+
/// @require {mixin} mixins.focus-ring
|
|
66
|
+
/// @require {mixin} animations.transition-colors
|
|
67
|
+
/// @example scss
|
|
68
|
+
/// .search__button {
|
|
69
|
+
/// @include search-form-button-theme(primary-foreground);
|
|
70
|
+
/// }
|
|
71
|
+
/// @output color, transition, hover
|
|
72
|
+
/// @group search-form
|
|
73
|
+
/// @access public
|
|
74
|
+
@mixin search-form-button-theme($color, $alpha: 0.6, $hover-alpha: 1) {
|
|
75
|
+
@include mixins.hsl-prop(color, $color, $alpha);
|
|
76
|
+
@include animations.transition-colors;
|
|
77
|
+
|
|
78
|
+
&:hover {
|
|
79
|
+
@include mixins.hsl-prop(color, $color, $hover-alpha);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
&:focus {
|
|
83
|
+
outline: none;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
&:focus-visible {
|
|
87
|
+
@include mixins.focus-ring($color);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// SEARCH FORM — VARIABLES
|
|
3
|
+
// local/common/theme-moexp/src/scss/abstracts/search-form/_variables.scss
|
|
4
|
+
// ============================================
|
|
5
|
+
|
|
6
|
+
////
|
|
7
|
+
/// Переменные формы поиска
|
|
8
|
+
/// Токены дизайна для размеров и позиционирования
|
|
9
|
+
/// @group search-form
|
|
10
|
+
/// @author MOEXP Team
|
|
11
|
+
////
|
|
12
|
+
|
|
13
|
+
// ─────────────────────────────────────────
|
|
14
|
+
// РАЗМЕРЫ ФОРМЫ
|
|
15
|
+
// ─────────────────────────────────────────
|
|
16
|
+
|
|
17
|
+
/// Ширина формы поиска по умолчанию
|
|
18
|
+
/// @type Length
|
|
19
|
+
/// @group search-form
|
|
20
|
+
$search-form-width: 15rem !default;
|
|
21
|
+
|
|
22
|
+
/// Высота формы поиска по умолчанию
|
|
23
|
+
/// @type Length
|
|
24
|
+
/// @group search-form
|
|
25
|
+
$search-form-height: 2.5rem !default;
|
|
26
|
+
|
|
27
|
+
// ─────────────────────────────────────────
|
|
28
|
+
// ИКОНКА
|
|
29
|
+
// ─────────────────────────────────────────
|
|
30
|
+
|
|
31
|
+
/// Размер иконки поиска
|
|
32
|
+
/// @type Length
|
|
33
|
+
/// @group search-form
|
|
34
|
+
$search-form-icon-size: 1.2rem !default;
|
|
35
|
+
|
|
36
|
+
/// Отступ справа для иконки
|
|
37
|
+
/// @type Length
|
|
38
|
+
/// @group search-form
|
|
39
|
+
$search-form-icon-offset: 1.25rem !default;
|