@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,303 @@
1
+ ////
2
+ /// News Card — карточка новости
3
+ /// Featured вариант с изображением и compact без изображения
4
+ /// @group components-news-card
5
+ /// @author MOEXP Team
6
+ ////
7
+
8
+ @use "../abstracts/typography";
9
+ @use "../abstracts/spacing";
10
+ @use "../abstracts/mixins";
11
+ @use "../abstracts/radius";
12
+ @use "../abstracts/animations";
13
+ @use "../abstracts/breakpoints";
14
+ @use "../abstracts/cards";
15
+ @use "../font-vars" as fonts;
16
+
17
+ // ============================================
18
+ // ПЕРЕМЕННЫЕ
19
+ // ============================================
20
+
21
+ /// Высота изображения featured
22
+ /// @type Number
23
+ /// @group components-news-card
24
+ $news-card-image-height: 16rem !default;
25
+
26
+ /// Padding контента
27
+ /// @type Number
28
+ /// @group components-news-card
29
+ $news-card-padding: spacing.$spacing-xl !default;
30
+
31
+ /// Transition duration
32
+ /// @type Number
33
+ /// @group components-news-card
34
+ $news-card-transition: 300ms !default;
35
+
36
+ // ============================================
37
+ // МИКСИНЫ
38
+ // ============================================
39
+
40
+ /// Базовые стили карточки
41
+ /// @output Стили контейнера
42
+ /// @group components-news-card
43
+ @mixin news-card-base {
44
+ position: relative;
45
+ overflow: hidden;
46
+ display: block;
47
+ text-decoration: none;
48
+ color: inherit;
49
+
50
+ @include mixins.bg-color(background-card);
51
+ @include mixins.border-hsl(1px, solid, border, 0.5);
52
+ @include radius.rounded(lg);
53
+ @include mixins.shadow-sm;
54
+
55
+ cursor: pointer;
56
+
57
+ @include animations.transition((box-shadow, border-color), $news-card-transition, animations.$ease-in-out);
58
+
59
+ &:hover {
60
+ @include mixins.shadow-xl;
61
+ @include mixins.border-color-hsl(accent, 0.5);
62
+ }
63
+
64
+ &:focus-visible {
65
+ @include mixins.focus-ring(ring);
66
+ }
67
+ }
68
+
69
+ /// Grid layout для featured
70
+ /// @param {String} $image-position [left] - Позиция изображения
71
+ /// @output Grid раскладка
72
+ /// @group components-news-card
73
+ @mixin news-card-grid($image-position: left) {
74
+ display: grid;
75
+ grid-template-columns: 1fr;
76
+ gap: 0;
77
+
78
+ @include breakpoints.md {
79
+ grid-template-columns: 1fr 1fr;
80
+
81
+ @if $image-position == right {
82
+ > *:first-child {
83
+ order: 2;
84
+ }
85
+ > *:last-child {
86
+ order: 1;
87
+ }
88
+ }
89
+ }
90
+ }
91
+
92
+ /// Обёртка изображения
93
+ /// @output Стили контейнера изображения
94
+ /// @group components-news-card
95
+ @mixin news-card-image-wrap {
96
+ position: relative;
97
+ height: $news-card-image-height;
98
+ overflow: hidden;
99
+
100
+ @include breakpoints.md {
101
+ height: auto;
102
+ min-height: $news-card-image-height;
103
+ }
104
+ }
105
+
106
+ /// Изображение с hover
107
+ /// @output Стили изображения
108
+ /// @group components-news-card
109
+ @mixin news-card-image {
110
+ width: 100%;
111
+ height: 100%;
112
+ object-fit: cover;
113
+
114
+ @include animations.transition(transform, $news-card-transition, animations.$ease-out);
115
+
116
+ .news-card:hover & {
117
+ transform: scale(1.05);
118
+ }
119
+ }
120
+
121
+ /// Контент карточки
122
+ /// @output Flex layout
123
+ /// @group components-news-card
124
+ @mixin news-card-content {
125
+ display: flex;
126
+ flex-direction: column;
127
+ justify-content: center;
128
+ padding: $news-card-padding;
129
+ }
130
+
131
+ /// Мета-информация (дата)
132
+ /// @param {String} $color [accent-on-light] - Цвет
133
+ /// @output Стили meta
134
+ /// @group components-news-card
135
+ @mixin news-card-meta($color: accent-on-light) {
136
+ display: flex;
137
+ align-items: center;
138
+ gap: spacing.$gap-xs;
139
+ margin-bottom: spacing.$spacing-md;
140
+
141
+ @include mixins.text-color($color);
142
+
143
+ svg {
144
+ width: 1.25rem;
145
+ height: 1.25rem;
146
+ flex-shrink: 0;
147
+ }
148
+
149
+ span {
150
+ font-size: typography.$font-size-base;
151
+ font-weight: typography.$font-weight-medium;
152
+ }
153
+ }
154
+
155
+ /// Заголовок с hover
156
+ /// @param {String} $color [foreground] - Цвет
157
+ /// @param {String} $hover-color [accent-on-light] - Цвет при hover
158
+ /// @output Стили заголовка
159
+ /// @group components-news-card
160
+ @mixin news-card-title($color: foreground, $hover-color: accent-on-light) {
161
+ font-family: fonts.$font-literata;
162
+ font-weight: typography.$font-weight-bold;
163
+ font-size: typography.$font-size-2xl;
164
+ line-height: typography.$line-height-tight;
165
+ margin-bottom: spacing.$spacing-md;
166
+
167
+ @include mixins.text-color($color);
168
+ @include animations.transition(color, $news-card-transition);
169
+
170
+ .news-card:hover & {
171
+ @include mixins.text-color($hover-color);
172
+ }
173
+
174
+ @include breakpoints.md-down {
175
+ font-size: typography.$font-size-xl;
176
+ }
177
+ }
178
+
179
+ /// Описание
180
+ /// @param {String} $color [foreground-muted] - Цвет
181
+ /// @output Стили описания
182
+ /// @group components-news-card
183
+ @mixin news-card-description($color: foreground-muted) {
184
+ font-size: typography.$font-size-base;
185
+ line-height: typography.$line-height-relaxed;
186
+
187
+ @include mixins.text-color($color);
188
+ }
189
+
190
+ // ============================================
191
+ // CSS КЛАССЫ
192
+ // ============================================
193
+
194
+ .news-card {
195
+ @include news-card-base;
196
+
197
+ // ──────────────────────────────
198
+ // Элементы
199
+ // ──────────────────────────────
200
+
201
+ &__grid {
202
+ @include news-card-grid(left);
203
+ }
204
+
205
+ &__image-wrap {
206
+ @include news-card-image-wrap;
207
+ }
208
+
209
+ &__image {
210
+ @include news-card-image;
211
+ }
212
+
213
+ &__content {
214
+ @include news-card-content;
215
+ }
216
+
217
+ &__meta {
218
+ @include news-card-meta(accent-on-light);
219
+ }
220
+
221
+ &__title {
222
+ @include news-card-title(foreground, accent-on-light);
223
+ }
224
+
225
+ &__description {
226
+ @include news-card-description(foreground-muted);
227
+ }
228
+
229
+ // ──────────────────────────────
230
+ // Изображение справа
231
+ // ──────────────────────────────
232
+
233
+ &--image-right {
234
+ .news-card__grid {
235
+ @include news-card-grid(right);
236
+ }
237
+ }
238
+
239
+ // ──────────────────────────────
240
+ // Компактный вариант (без изображения)
241
+ // ──────────────────────────────
242
+
243
+ &--compact {
244
+ .news-card__content {
245
+ padding: spacing.$spacing-lg;
246
+ }
247
+
248
+ .news-card__title {
249
+ font-size: typography.$font-size-lg;
250
+ margin-bottom: spacing.$spacing-sm;
251
+
252
+ @include breakpoints.md-down {
253
+ font-size: typography.$font-size-base;
254
+ }
255
+ }
256
+
257
+ .news-card__meta {
258
+ margin-bottom: spacing.$spacing-sm;
259
+
260
+ svg {
261
+ width: 1rem;
262
+ height: 1rem;
263
+ }
264
+
265
+ span {
266
+ font-size: typography.$font-size-sm;
267
+ }
268
+ }
269
+
270
+ .news-card__description {
271
+ font-size: typography.$font-size-sm;
272
+ }
273
+ }
274
+
275
+ // ──────────────────────────────
276
+ // На тёмном фоне
277
+ // ──────────────────────────────
278
+
279
+ &--on-dark {
280
+ @include mixins.bg-color(primary, 0.1);
281
+ @include mixins.border-hsl(1px, solid, primary-foreground, 0.2);
282
+
283
+ &:hover {
284
+ @include mixins.border-color-hsl(accent, 0.6);
285
+ }
286
+
287
+ .news-card__meta {
288
+ @include mixins.text-color(accent);
289
+ }
290
+
291
+ .news-card__title {
292
+ @include mixins.text-color(primary-foreground);
293
+
294
+ .news-card:hover & {
295
+ @include mixins.text-color(accent);
296
+ }
297
+ }
298
+
299
+ .news-card__description {
300
+ @include mixins.text-color(primary-foreground, 0.75);
301
+ }
302
+ }
303
+ }
@@ -0,0 +1,93 @@
1
+ ////
2
+ /// Project Card — карточка проекта
3
+ /// CSS-классы компонента
4
+ /// @group components-project-card
5
+ /// @author MOEXP Team
6
+ ////
7
+
8
+ @use "../abstracts/project-card" as project;
9
+ @use "../abstracts/spacing";
10
+ @use "../abstracts/mixins";
11
+ @use "../abstracts/animations";
12
+
13
+ // ============================================
14
+ // CSS КЛАССЫ
15
+ // ============================================
16
+
17
+ .project-card {
18
+ @include project.base;
19
+
20
+ // ──────────────────────────────
21
+ // Элементы
22
+ // ──────────────────────────────
23
+
24
+ &__year {
25
+ @include project.year(background-section, foreground-muted);
26
+ }
27
+
28
+ &__image-wrap {
29
+ @include project.image-wrap;
30
+ }
31
+
32
+ &__image {
33
+ @include project.image;
34
+
35
+ .project-card:hover & {
36
+ transform: scale(1.05);
37
+ }
38
+ }
39
+
40
+ &__content {
41
+ @include project.content;
42
+ }
43
+
44
+ &__meta {
45
+ @include project.meta(project-card-meta-color);
46
+ }
47
+
48
+ &__title {
49
+ @include project.title(foreground, accent-on-light);
50
+
51
+ .project-card:hover & {
52
+ @include mixins.text-color(accent-on-light);
53
+ }
54
+ }
55
+
56
+ &__description {
57
+ @include project.description(foreground-muted, 2);
58
+ }
59
+
60
+ // ──────────────────────────────
61
+ // На тёмном фоне
62
+ // ──────────────────────────────
63
+
64
+ &--on-dark {
65
+ @include mixins.bg-color(primary, 0.1);
66
+ @include mixins.border-hsl(1px, solid, primary-foreground, 0.2);
67
+
68
+ &:hover {
69
+ @include mixins.border-color-hsl(accent, 0.6);
70
+ }
71
+
72
+ .project-card__year {
73
+ @include mixins.bg-color(primary, 0.3);
74
+ @include mixins.text-color(primary-foreground, 0.9);
75
+ }
76
+
77
+ .project-card__meta {
78
+ @include mixins.text-color(accent);
79
+ }
80
+
81
+ .project-card__title {
82
+ @include mixins.text-color(primary-foreground);
83
+
84
+ .project-card:hover & {
85
+ @include mixins.text-color(accent);
86
+ }
87
+ }
88
+
89
+ .project-card__description {
90
+ @include mixins.text-color(primary-foreground, 0.75);
91
+ }
92
+ }
93
+ }
@@ -0,0 +1,181 @@
1
+ // ============================================
2
+ // SEARCH FORM COMPONENT
3
+ // local\common\theme-moexp\src\scss\components\_search-form.scss
4
+ // ============================================
5
+
6
+ ////
7
+ /// Search Form — форма поиска с иконкой внутри поля
8
+ ///
9
+ /// Готовые CSS-классы для использования в HTML.
10
+ /// Размеры задаются на уровне формы (.search-form),
11
+ /// input автоматически занимает 100% пространства.
12
+ ///
13
+ /// @group components-search-form
14
+ /// @author MOEXP Team
15
+ /// @since 1.0.0
16
+ ///
17
+ /// @example html - Базовая форма (на тёмном фоне)
18
+ /// <form class="search-form">
19
+ /// <label for="search-input" class="visually-hidden">Поиск по сайту</label>
20
+ /// <input
21
+ /// id="search-input"
22
+ /// class="search-form__input"
23
+ /// type="search"
24
+ /// name="q"
25
+ /// placeholder="Поиск..."
26
+ /// />
27
+ /// <button class="search-form__button" type="submit" aria-label="Найти">
28
+ /// <svg class="search-form__icon" aria-hidden="true" focusable="false">
29
+ /// <use xlink:href="sprite.svg#SearchTwotone"></use>
30
+ /// </svg>
31
+ /// </button>
32
+ /// </form>
33
+ ////
34
+
35
+ @use "../abstracts/search-form" as sf;
36
+ @use "../abstracts/mixins";
37
+ @use "../abstracts/animations";
38
+
39
+ // ============================================
40
+ // BASE
41
+ // ============================================
42
+
43
+ /// Контейнер формы поиска
44
+ /// @output position: relative, width, height для контейнера
45
+ .search-form {
46
+ @include sf.search-form-base;
47
+
48
+ // ----------------------------------------
49
+ // INPUT
50
+ // ----------------------------------------
51
+
52
+ /// Поле ввода поиска (занимает 100% формы)
53
+ /// @output width: 100%, height: 100%, отступы, тема
54
+ &__input {
55
+ @include sf.search-form-input-base;
56
+ @include sf.search-form-input-theme(primary-foreground);
57
+ }
58
+
59
+ // ----------------------------------------
60
+ // BUTTON
61
+ // ----------------------------------------
62
+
63
+ /// Кнопка поиска (иконка)
64
+ /// @output Позиционирование, сброс стилей, тема
65
+ &__button {
66
+ @include sf.search-form-button-base;
67
+ @include sf.search-form-button-theme(primary-foreground);
68
+ }
69
+
70
+ // ----------------------------------------
71
+ // ICON
72
+ // ----------------------------------------
73
+
74
+ /// Иконка внутри кнопки
75
+ /// @output Наследует стили из button-base
76
+ &__icon {
77
+ width: sf.$search-form-icon-size;
78
+ height: sf.$search-form-icon-size;
79
+ fill: currentColor;
80
+ display: block;
81
+ }
82
+ }
83
+
84
+ // ============================================
85
+ // SIZE VARIANTS
86
+ // ============================================
87
+
88
+ /// Маленькая форма поиска
89
+ /// @example html
90
+ /// <form class="search-form search-form--sm">...</form>
91
+ .search-form--sm {
92
+ width: 12rem;
93
+ height: 2rem;
94
+ }
95
+
96
+ /// Большая форма поиска
97
+ /// @example html
98
+ /// <form class="search-form search-form--lg">...</form>
99
+ .search-form--lg {
100
+ width: 20rem;
101
+ height: 3rem;
102
+ }
103
+
104
+ /// Форма на всю ширину контейнера
105
+ /// @example html
106
+ /// <form class="search-form search-form--full">...</form>
107
+ .search-form--full {
108
+ width: 100%;
109
+ }
110
+
111
+ // ============================================
112
+ // CONTEXT VARIANTS
113
+ // ============================================
114
+
115
+ /// Вариант для светлого фона
116
+ .search-form--on-light {
117
+ .search-form__input {
118
+ @include sf.search-form-input-theme(search-on-light-color, 0.05, 0.2, 0.4);
119
+ }
120
+
121
+ .search-form__button {
122
+ @include sf.search-form-button-theme(search-on-light-color);
123
+ }
124
+ }
125
+
126
+ /// Вариант для тёмного фона (явное указание)
127
+ .search-form--on-dark {
128
+ @include mixins.bg-color(primary);
129
+ .search-form__input {
130
+ @include sf.search-form-input-theme(primary-foreground);
131
+ }
132
+
133
+ .search-form__button {
134
+ @include sf.search-form-button-theme(primary-foreground);
135
+ }
136
+
137
+ // ─────────────────────────────────────────
138
+ // В тёмной теме: остаётся светлым (для контраста с primary фоном)
139
+ // ─────────────────────────────────────────
140
+ .dark & {
141
+ .search-form__input {
142
+ @include sf.search-form-input-theme(primary-foreground, 0.15, 0.3, 0.5);
143
+ }
144
+
145
+ .search-form__button {
146
+ @include sf.search-form-button-theme(primary-foreground);
147
+ }
148
+ }
149
+ }
150
+
151
+ // ============================================
152
+ // STATES
153
+ // ============================================
154
+
155
+ /// Отключённое состояние
156
+ .search-form--disabled,
157
+ .search-form[aria-disabled="true"] {
158
+ opacity: 0.5;
159
+ pointer-events: none;
160
+ }
161
+
162
+ /// Автоопределение disabled по состоянию input
163
+ @supports selector(:has(*)) {
164
+ .search-form:has(input:disabled) {
165
+ opacity: 0.5;
166
+ pointer-events: none;
167
+ }
168
+ }
169
+
170
+ // .search-overlay {
171
+ // position: fixed;
172
+ // inset: 0;
173
+ // @include mixins.hsl-prop(background-color, "overlay", 0.5);
174
+ // z-index: 10;
175
+ // opacity: 0;
176
+ // transition: opacity 0.3s ease;
177
+ // }
178
+
179
+ // .search-overlay.is-active {
180
+ // opacity: 1;
181
+ // }
@@ -0,0 +1,94 @@
1
+ // ============================================
2
+ // SECTION TITLE COMPONENT
3
+ // local/common/theme-moexp/src/scss/components/_section-title.scss
4
+ // ============================================
5
+
6
+ ////
7
+ /// Section Title — компонент заголовка секции
8
+ /// CSS-классы компонента
9
+ /// @group components-section-title
10
+ /// @author MOEXP Team
11
+ ////
12
+
13
+ @use "../abstracts/section-title" as st;
14
+ @use "../abstracts/mixins";
15
+
16
+ // ============================================
17
+ // CSS КЛАССЫ
18
+ // ============================================
19
+
20
+ .section-title {
21
+ @include st.base(center);
22
+
23
+ // ──────────────────────────────
24
+ // Элементы
25
+ // ──────────────────────────────
26
+
27
+ &__slogan {
28
+ @include st.slogan(foreground-muted);
29
+ }
30
+
31
+ &__title {
32
+ @include st.title(foreground);
33
+ }
34
+
35
+ &__subtitle {
36
+ @include st.subtitle(foreground);
37
+ }
38
+
39
+ // ──────────────────────────────
40
+ // Модификатор для тёмного фона
41
+ // ──────────────────────────────
42
+
43
+ &--on-dark {
44
+ .section-title__slogan {
45
+ @include mixins.text-color(primary-foreground, 0.7);
46
+ }
47
+
48
+ .section-title__title {
49
+ @include mixins.text-color(primary-foreground);
50
+ }
51
+
52
+ .section-title__subtitle {
53
+ @include mixins.text-color(primary-foreground, 0.85);
54
+ }
55
+ }
56
+
57
+ &--on-accent {
58
+ .section-title__slogan {
59
+ @include mixins.text-color(accent-foreground, 0.7);
60
+ }
61
+
62
+ .section-title__title {
63
+ @include mixins.text-color(accent-foreground);
64
+ }
65
+
66
+ .section-title__subtitle {
67
+ @include mixins.text-color(accent-foreground, 0.85);
68
+ }
69
+ }
70
+
71
+ // ──────────────────────────────
72
+ // Модификаторы выравнивания
73
+ // ──────────────────────────────
74
+
75
+ &--left {
76
+ @include st.align-left;
77
+ }
78
+
79
+ &--right {
80
+ @include st.align-right;
81
+ }
82
+
83
+ // ──────────────────────────────
84
+ // Модификаторы отступов
85
+ // ──────────────────────────────
86
+
87
+ &--compact {
88
+ @include st.compact;
89
+ }
90
+
91
+ &--no-margin {
92
+ @include st.no-margin;
93
+ }
94
+ }