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