@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,537 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// TOP NAV COMPONENT
|
|
3
|
+
// local/common/theme-moexp/src/scss/components/_top-nav.scss
|
|
4
|
+
// ============================================
|
|
5
|
+
|
|
6
|
+
////
|
|
7
|
+
/// Top Nav — главное меню навигации
|
|
8
|
+
/// Адаптивное меню с burger на mobile и dropdown на desktop
|
|
9
|
+
///
|
|
10
|
+
/// @group components-top-nav
|
|
11
|
+
/// @author MOEXP Team
|
|
12
|
+
/// @since 1.0.0
|
|
13
|
+
////
|
|
14
|
+
|
|
15
|
+
@use "../abstracts/mixins";
|
|
16
|
+
@use "../abstracts/spacing";
|
|
17
|
+
@use "../abstracts/typography";
|
|
18
|
+
@use "../abstracts/breakpoints";
|
|
19
|
+
@use "../abstracts/animations";
|
|
20
|
+
|
|
21
|
+
// ============================================
|
|
22
|
+
// VARIABLES
|
|
23
|
+
// ============================================
|
|
24
|
+
|
|
25
|
+
$top-nav-mobile-width: 280px !default;
|
|
26
|
+
$top-nav-mobile-max-width: 80vw !default;
|
|
27
|
+
$top-nav-dropdown-min-width: 15rem !default;
|
|
28
|
+
$top-nav-z-burger: 98 !default;
|
|
29
|
+
$top-nav-z-overlay: 99 !default;
|
|
30
|
+
$top-nav-z-panel: 100 !default;
|
|
31
|
+
$top-nav-z-dropdown: 100 !default;
|
|
32
|
+
|
|
33
|
+
// ============================================
|
|
34
|
+
// BASE
|
|
35
|
+
// ============================================
|
|
36
|
+
|
|
37
|
+
.top-nav {
|
|
38
|
+
display: flex;
|
|
39
|
+
align-items: center;
|
|
40
|
+
position: relative;
|
|
41
|
+
|
|
42
|
+
// ─────────────────────────────────────────
|
|
43
|
+
// BURGER
|
|
44
|
+
// ─────────────────────────────────────────
|
|
45
|
+
&__burger {
|
|
46
|
+
display: none;
|
|
47
|
+
flex-direction: column;
|
|
48
|
+
justify-content: center;
|
|
49
|
+
gap: 5px;
|
|
50
|
+
|
|
51
|
+
width: 40px;
|
|
52
|
+
height: 40px;
|
|
53
|
+
padding: 8px;
|
|
54
|
+
|
|
55
|
+
background: transparent;
|
|
56
|
+
border: none;
|
|
57
|
+
cursor: pointer;
|
|
58
|
+
z-index: $top-nav-z-burger;
|
|
59
|
+
|
|
60
|
+
@include breakpoints.md-down {
|
|
61
|
+
display: flex;
|
|
62
|
+
// Убрали margin-left: auto — теперь он у &__account
|
|
63
|
+
margin-left: spacing.$spacing-xs;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
svg {
|
|
67
|
+
width: 24px;
|
|
68
|
+
height: 24px;
|
|
69
|
+
color: inherit;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// ─────────────────────────────────────────
|
|
74
|
+
// OVERLAY
|
|
75
|
+
// ─────────────────────────────────────────
|
|
76
|
+
&__overlay {
|
|
77
|
+
display: none;
|
|
78
|
+
|
|
79
|
+
@include breakpoints.md-down {
|
|
80
|
+
display: block;
|
|
81
|
+
position: fixed;
|
|
82
|
+
inset: 0;
|
|
83
|
+
background: rgba(0, 0, 0, 0.5);
|
|
84
|
+
opacity: 0;
|
|
85
|
+
visibility: hidden;
|
|
86
|
+
z-index: $top-nav-z-overlay;
|
|
87
|
+
|
|
88
|
+
// Fallback
|
|
89
|
+
transition:
|
|
90
|
+
opacity 300ms ease-out,
|
|
91
|
+
visibility 300ms ease-out;
|
|
92
|
+
|
|
93
|
+
// Modern
|
|
94
|
+
@supports (transition-behavior: allow-discrete) {
|
|
95
|
+
transition:
|
|
96
|
+
opacity animations.$duration-normal animations.$ease-out,
|
|
97
|
+
visibility animations.$duration-normal animations.$ease-out;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
.top-nav.is-open & {
|
|
101
|
+
opacity: 1;
|
|
102
|
+
visibility: visible;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// ─────────────────────────────────────────
|
|
108
|
+
// PANEL
|
|
109
|
+
// ─────────────────────────────────────────
|
|
110
|
+
&__panel {
|
|
111
|
+
// Desktop: растворяется
|
|
112
|
+
display: contents;
|
|
113
|
+
|
|
114
|
+
@include breakpoints.md-down {
|
|
115
|
+
display: flex;
|
|
116
|
+
flex-direction: column;
|
|
117
|
+
|
|
118
|
+
position: fixed;
|
|
119
|
+
top: 0;
|
|
120
|
+
left: 0;
|
|
121
|
+
bottom: 0;
|
|
122
|
+
|
|
123
|
+
// Fallback
|
|
124
|
+
width: $top-nav-mobile-width;
|
|
125
|
+
|
|
126
|
+
// Modern
|
|
127
|
+
width: min(#{$top-nav-mobile-width}, #{$top-nav-mobile-max-width});
|
|
128
|
+
|
|
129
|
+
@include mixins.bg-color(background-card);
|
|
130
|
+
z-index: $top-nav-z-panel;
|
|
131
|
+
|
|
132
|
+
// Fallback
|
|
133
|
+
transform: translateX(-100%);
|
|
134
|
+
transition: transform 300ms ease-out;
|
|
135
|
+
|
|
136
|
+
// Modern
|
|
137
|
+
@supports (transition-behavior: allow-discrete) {
|
|
138
|
+
transition: transform animations.$duration-normal animations.$ease-out;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
.top-nav.is-open & {
|
|
142
|
+
transform: translateX(0);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// ─────────────────────────────────────────
|
|
148
|
+
// LIST
|
|
149
|
+
// ─────────────────────────────────────────
|
|
150
|
+
&__list {
|
|
151
|
+
display: flex;
|
|
152
|
+
list-style: none;
|
|
153
|
+
margin: 0;
|
|
154
|
+
padding: 0;
|
|
155
|
+
|
|
156
|
+
@include breakpoints.md-down {
|
|
157
|
+
flex-direction: column;
|
|
158
|
+
flex: 1;
|
|
159
|
+
padding: spacing.$spacing-md;
|
|
160
|
+
overflow-y: auto;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// ─────────────────────────────────────────
|
|
165
|
+
// CLOSE
|
|
166
|
+
// ─────────────────────────────────────────
|
|
167
|
+
&__close {
|
|
168
|
+
display: none;
|
|
169
|
+
|
|
170
|
+
@include breakpoints.md-down {
|
|
171
|
+
display: flex;
|
|
172
|
+
align-self: flex-end;
|
|
173
|
+
align-items: center;
|
|
174
|
+
justify-content: center;
|
|
175
|
+
|
|
176
|
+
width: 40px;
|
|
177
|
+
height: 40px;
|
|
178
|
+
margin: spacing.$spacing-md;
|
|
179
|
+
margin-bottom: 0;
|
|
180
|
+
|
|
181
|
+
background: transparent;
|
|
182
|
+
border: none;
|
|
183
|
+
cursor: pointer;
|
|
184
|
+
flex-shrink: 0;
|
|
185
|
+
|
|
186
|
+
@include mixins.text-color(foreground);
|
|
187
|
+
|
|
188
|
+
svg {
|
|
189
|
+
width: 24px;
|
|
190
|
+
height: 24px;
|
|
191
|
+
color: inherit;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
&:hover,
|
|
195
|
+
&:focus-visible {
|
|
196
|
+
@include mixins.text-color(accent);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
&:focus-visible {
|
|
200
|
+
@include mixins.focus-ring(accent);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// ─────────────────────────────────────────
|
|
206
|
+
// ACCOUNT (иконка ЛК слева от burger)
|
|
207
|
+
// ─────────────────────────────────────────
|
|
208
|
+
&__account {
|
|
209
|
+
display: none;
|
|
210
|
+
|
|
211
|
+
@include breakpoints.md-down {
|
|
212
|
+
display: flex;
|
|
213
|
+
margin-left: auto;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
// ─────────────────────────────────────────
|
|
218
|
+
// FOOTER (sticky в мобильном меню)
|
|
219
|
+
// ─────────────────────────────────────────
|
|
220
|
+
&__footer {
|
|
221
|
+
display: none;
|
|
222
|
+
|
|
223
|
+
@include breakpoints.md-down {
|
|
224
|
+
display: flex;
|
|
225
|
+
flex-direction: column;
|
|
226
|
+
flex-shrink: 0;
|
|
227
|
+
|
|
228
|
+
padding: spacing.$spacing-md;
|
|
229
|
+
margin-top: auto; // Прижимаем к низу
|
|
230
|
+
|
|
231
|
+
border-top: 1px solid;
|
|
232
|
+
@include mixins.border-color-hsl(border);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// Вертикальный список контактов
|
|
237
|
+
&__footer-contacts {
|
|
238
|
+
display: flex;
|
|
239
|
+
flex-direction: column;
|
|
240
|
+
margin-bottom: spacing.$spacing-sm;
|
|
241
|
+
|
|
242
|
+
// Fallback для gap
|
|
243
|
+
> .chip,
|
|
244
|
+
> div > .chip {
|
|
245
|
+
margin-bottom: spacing.$spacing-xs;
|
|
246
|
+
|
|
247
|
+
&:last-child {
|
|
248
|
+
margin-bottom: 0;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
// Modern gap
|
|
253
|
+
@supports (gap: 1px) {
|
|
254
|
+
gap: spacing.$spacing-xs;
|
|
255
|
+
|
|
256
|
+
> .chip,
|
|
257
|
+
> div > .chip {
|
|
258
|
+
margin-bottom: 0;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
// Горизонтальный ряд иконок
|
|
264
|
+
&__footer-icons {
|
|
265
|
+
display: flex;
|
|
266
|
+
flex-wrap: wrap;
|
|
267
|
+
flex-direction: row;
|
|
268
|
+
|
|
269
|
+
// Fallback для gap
|
|
270
|
+
> .chip,
|
|
271
|
+
> div > .chip {
|
|
272
|
+
margin-right: spacing.$spacing-xs;
|
|
273
|
+
margin-bottom: spacing.$spacing-xs;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// Modern gap
|
|
277
|
+
@supports (gap: 1px) {
|
|
278
|
+
gap: spacing.$spacing-xs;
|
|
279
|
+
|
|
280
|
+
> .chip,
|
|
281
|
+
> div > .chip {
|
|
282
|
+
margin-right: 0;
|
|
283
|
+
margin-bottom: 0;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
// ─────────────────────────────────────────
|
|
289
|
+
// ITEM
|
|
290
|
+
// ─────────────────────────────────────────
|
|
291
|
+
&__item {
|
|
292
|
+
position: relative;
|
|
293
|
+
|
|
294
|
+
@include breakpoints.md-down {
|
|
295
|
+
width: 100%;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
&:focus-visible {
|
|
299
|
+
@include mixins.focus-ring(accent);
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
// Последний item — dropdown влево
|
|
303
|
+
&:last-child .top-nav__dropdown {
|
|
304
|
+
left: auto;
|
|
305
|
+
right: 0;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
// ─────────────────────────────────────────
|
|
310
|
+
// LINK
|
|
311
|
+
// ─────────────────────────────────────────
|
|
312
|
+
&__link {
|
|
313
|
+
display: block;
|
|
314
|
+
padding: spacing.$spacing-md spacing.$spacing-lg;
|
|
315
|
+
font-weight: typography.$font-weight-medium;
|
|
316
|
+
font-size: typography.$font-size-sm;
|
|
317
|
+
text-align: left;
|
|
318
|
+
text-transform: uppercase;
|
|
319
|
+
text-decoration: none;
|
|
320
|
+
|
|
321
|
+
background: transparent;
|
|
322
|
+
border: none;
|
|
323
|
+
cursor: pointer;
|
|
324
|
+
width: 100%;
|
|
325
|
+
border-bottom: 3px solid transparent;
|
|
326
|
+
|
|
327
|
+
@include mixins.text-color(foreground-body);
|
|
328
|
+
|
|
329
|
+
// Fallback
|
|
330
|
+
transition:
|
|
331
|
+
color 150ms ease-out,
|
|
332
|
+
border-color 150ms ease-out;
|
|
333
|
+
|
|
334
|
+
@supports (transition-behavior: allow-discrete) {
|
|
335
|
+
@include animations.transition((color, border-color), animations.$duration-fast, animations.$ease-out);
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
&:focus {
|
|
339
|
+
outline: none;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
&:focus-visible {
|
|
343
|
+
@include mixins.focus-ring(accent);
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
&:hover {
|
|
347
|
+
@include mixins.text-color(accent);
|
|
348
|
+
@include mixins.border-color-hsl(accent);
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
&--active {
|
|
352
|
+
@include mixins.text-color(accent-on-light);
|
|
353
|
+
@include mixins.border-color-hsl(accent-on-light);
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
@include breakpoints.lg-down {
|
|
357
|
+
padding: spacing.$spacing-md spacing.$spacing-md;
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
@include breakpoints.md-down {
|
|
361
|
+
padding: spacing.$spacing-md spacing.$spacing-sm;
|
|
362
|
+
text-transform: none;
|
|
363
|
+
font-size: typography.$font-size-base;
|
|
364
|
+
|
|
365
|
+
// Левая граница вместо нижней
|
|
366
|
+
border-bottom: none;
|
|
367
|
+
border-left: 3px solid transparent;
|
|
368
|
+
|
|
369
|
+
&:hover,
|
|
370
|
+
&--active {
|
|
371
|
+
border-bottom: none;
|
|
372
|
+
@include mixins.border-color-hsl(accent-on-light);
|
|
373
|
+
@include mixins.bg-color(background-section);
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
// ─────────────────────────────────────────
|
|
379
|
+
// DROPDOWN
|
|
380
|
+
// ─────────────────────────────────────────
|
|
381
|
+
&__dropdown {
|
|
382
|
+
position: absolute;
|
|
383
|
+
top: 100%;
|
|
384
|
+
left: 0;
|
|
385
|
+
min-width: $top-nav-dropdown-min-width;
|
|
386
|
+
z-index: $top-nav-z-dropdown;
|
|
387
|
+
padding: spacing.$spacing-md spacing.$spacing-sm;
|
|
388
|
+
list-style: none;
|
|
389
|
+
margin: 0;
|
|
390
|
+
|
|
391
|
+
@include mixins.bg-color(background-card);
|
|
392
|
+
@include mixins.shadow-lg(shadow);
|
|
393
|
+
|
|
394
|
+
// Скрыто по умолчанию
|
|
395
|
+
opacity: 0;
|
|
396
|
+
visibility: hidden;
|
|
397
|
+
transform: translateY(-0.625rem);
|
|
398
|
+
display: none;
|
|
399
|
+
|
|
400
|
+
// Fallback
|
|
401
|
+
transition:
|
|
402
|
+
opacity 300ms ease-out,
|
|
403
|
+
visibility 300ms ease-out,
|
|
404
|
+
transform 300ms ease-out;
|
|
405
|
+
|
|
406
|
+
@supports (transition-behavior: allow-discrete) {
|
|
407
|
+
@include animations.transition((opacity, visibility, transform), animations.$duration-normal, animations.$ease-out);
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
// Открыто (через JS)
|
|
411
|
+
&--visible {
|
|
412
|
+
display: block;
|
|
413
|
+
opacity: 1;
|
|
414
|
+
visibility: visible;
|
|
415
|
+
transform: translateY(0);
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
// ─────────────────────────────────────────
|
|
419
|
+
// MOBILE DROPDOWN
|
|
420
|
+
// ─────────────────────────────────────────
|
|
421
|
+
@include breakpoints.md-down {
|
|
422
|
+
position: static;
|
|
423
|
+
min-width: 100%;
|
|
424
|
+
padding: 0;
|
|
425
|
+
padding-left: spacing.$spacing-sm;
|
|
426
|
+
|
|
427
|
+
box-shadow: none;
|
|
428
|
+
background: transparent;
|
|
429
|
+
|
|
430
|
+
display: none;
|
|
431
|
+
opacity: 1;
|
|
432
|
+
visibility: visible;
|
|
433
|
+
transform: none;
|
|
434
|
+
|
|
435
|
+
max-height: 0;
|
|
436
|
+
overflow: hidden;
|
|
437
|
+
|
|
438
|
+
// Fallback
|
|
439
|
+
transition: max-height 300ms ease-out;
|
|
440
|
+
|
|
441
|
+
@supports (transition-behavior: allow-discrete) {
|
|
442
|
+
@include animations.transition(max-height, animations.$duration-normal, animations.$ease-out);
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
&--visible {
|
|
446
|
+
display: block;
|
|
447
|
+
max-height: 500px;
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
&--left {
|
|
451
|
+
left: auto;
|
|
452
|
+
right: auto;
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
// Hover открытие только на desktop с hover
|
|
458
|
+
@media (hover: hover) and (min-width: 769px) {
|
|
459
|
+
&__item:hover > &__dropdown {
|
|
460
|
+
display: block;
|
|
461
|
+
opacity: 1;
|
|
462
|
+
visibility: visible;
|
|
463
|
+
transform: translateY(0);
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
// ─────────────────────────────────────────
|
|
468
|
+
// DROPDOWN ITEM
|
|
469
|
+
// ─────────────────────────────────────────
|
|
470
|
+
&__dropdown-item {
|
|
471
|
+
display: block;
|
|
472
|
+
|
|
473
|
+
&:not(:last-child) {
|
|
474
|
+
border-bottom: 1px solid;
|
|
475
|
+
@include mixins.border-color-hsl(background-section);
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
// ─────────────────────────────────────────
|
|
480
|
+
// DROPDOWN LINK
|
|
481
|
+
// ─────────────────────────────────────────
|
|
482
|
+
&__dropdown-link {
|
|
483
|
+
display: block;
|
|
484
|
+
padding: spacing.$spacing-md spacing.$spacing-sm;
|
|
485
|
+
text-decoration: none;
|
|
486
|
+
border-left: 3px solid transparent;
|
|
487
|
+
|
|
488
|
+
@include mixins.text-color(foreground-body);
|
|
489
|
+
|
|
490
|
+
// Fallback
|
|
491
|
+
transition:
|
|
492
|
+
color 150ms ease-out,
|
|
493
|
+
background-color 150ms ease-out,
|
|
494
|
+
border-color 150ms ease-out;
|
|
495
|
+
|
|
496
|
+
@supports (transition-behavior: allow-discrete) {
|
|
497
|
+
@include animations.transition((color, background-color, border-color), animations.$duration-fast);
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
&:hover,
|
|
501
|
+
&:focus-visible {
|
|
502
|
+
@include mixins.text-color(accent);
|
|
503
|
+
@include mixins.bg-color(background-section);
|
|
504
|
+
@include mixins.border-color-hsl(accent);
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
&:focus-visible {
|
|
508
|
+
@include mixins.focus-ring(accent);
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
&--active {
|
|
512
|
+
@include mixins.text-color(accent-on-light);
|
|
513
|
+
@include mixins.bg-color(background-section);
|
|
514
|
+
@include mixins.border-color-hsl(accent-on-light);
|
|
515
|
+
pointer-events: none;
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
@include breakpoints.md-down {
|
|
519
|
+
padding: spacing.$spacing-sm spacing.$spacing-sm;
|
|
520
|
+
font-size: typography.$font-size-sm;
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
// ============================================
|
|
526
|
+
// ACCESSIBILITY
|
|
527
|
+
// ============================================
|
|
528
|
+
|
|
529
|
+
@media (prefers-reduced-motion: reduce) {
|
|
530
|
+
.top-nav__overlay,
|
|
531
|
+
.top-nav__panel,
|
|
532
|
+
.top-nav__link,
|
|
533
|
+
.top-nav__dropdown,
|
|
534
|
+
.top-nav__dropdown-link {
|
|
535
|
+
transition: none !important;
|
|
536
|
+
}
|
|
537
|
+
}
|
package/scss/main.scss
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// MAIN ENTRY POINT
|
|
3
|
+
// local\common\theme-moexp\src\scss\main.scss
|
|
4
|
+
// ============================================
|
|
5
|
+
|
|
6
|
+
////
|
|
7
|
+
/// Главная точка входа темы MOEXP
|
|
8
|
+
///
|
|
9
|
+
/// Этот файл выполняет две функции:
|
|
10
|
+
/// 1. **@forward** — экспортирует абстракции для использования в других модулях
|
|
11
|
+
/// 2. **@use** — генерирует CSS-классы утилит в итоговый бандл
|
|
12
|
+
///
|
|
13
|
+
/// @group main
|
|
14
|
+
/// @author SUSPENDED
|
|
15
|
+
/// @since 1.0.0
|
|
16
|
+
///
|
|
17
|
+
/// @example scss - Использование в компоненте (получаем миксины/переменные)
|
|
18
|
+
/// // components/_card.scss
|
|
19
|
+
/// @use "../main" as theme;
|
|
20
|
+
///
|
|
21
|
+
/// .card {
|
|
22
|
+
/// @include theme.card-elevated;
|
|
23
|
+
/// padding: theme.spacing(4);
|
|
24
|
+
/// border-radius: theme.$radius-md;
|
|
25
|
+
/// }
|
|
26
|
+
///
|
|
27
|
+
/// @example scss - Альтернатива: прямой импорт abstracts
|
|
28
|
+
/// @use "abstracts" as *;
|
|
29
|
+
///
|
|
30
|
+
/// .button {
|
|
31
|
+
/// @include button-primary;
|
|
32
|
+
/// }
|
|
33
|
+
///
|
|
34
|
+
/// @example scss - Компиляция в CSS (Webpack/Vite)
|
|
35
|
+
/// // entry.scss
|
|
36
|
+
/// @use "theme-moexp/main";
|
|
37
|
+
/// // → Получаем все utility-классы в CSS
|
|
38
|
+
////
|
|
39
|
+
|
|
40
|
+
// ─────────────────────────────────────────
|
|
41
|
+
// ABSTRACTS (миксины, функции, переменные)
|
|
42
|
+
// ─────────────────────────────────────────
|
|
43
|
+
@use "api";
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
// ─────────────────────────────────────────
|
|
47
|
+
// UTILITIES (CSS-классы)
|
|
48
|
+
// ─────────────────────────────────────────
|
|
49
|
+
|
|
50
|
+
/// Генерация utility-классов в итоговый CSS
|
|
51
|
+
///
|
|
52
|
+
/// Включает:
|
|
53
|
+
/// - `.hidden`, `.hidden-{bp}-up`, `.hidden-{bp}-down`
|
|
54
|
+
/// - `.mobile-only`, `.desktop-only`
|
|
55
|
+
/// - `.hidden-print`
|
|
56
|
+
/// - и другие утилиты...
|
|
57
|
+
///
|
|
58
|
+
/// @see utilities
|
|
59
|
+
@use "utilities";
|
|
60
|
+
|
|
61
|
+
// ─────────────────────────────────────────
|
|
62
|
+
// COMPONENTS (CSS API)
|
|
63
|
+
// ─────────────────────────────────────────
|
|
64
|
+
|
|
65
|
+
/// Подключение CSS-компонентов темы
|
|
66
|
+
///
|
|
67
|
+
/// Компоненты:
|
|
68
|
+
/// - генерируют готовые CSS-классы
|
|
69
|
+
/// - используются напрямую в HTML
|
|
70
|
+
/// - документируются в папке `components/`
|
|
71
|
+
///
|
|
72
|
+
/// @see components
|
|
73
|
+
@use "components";
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// UTILITIES INDEX
|
|
3
|
+
// local\common\theme-moexp\src\scss\utilities\_index.scss
|
|
4
|
+
// ============================================
|
|
5
|
+
|
|
6
|
+
////
|
|
7
|
+
/// Индекс всех utility-классов
|
|
8
|
+
///
|
|
9
|
+
/// Центральная точка входа для CSS-утилит.
|
|
10
|
+
/// При `@use "utilities"` все классы попадают в итоговый CSS.
|
|
11
|
+
///
|
|
12
|
+
/// @group utilities
|
|
13
|
+
/// @author SUSPENDED
|
|
14
|
+
/// @since 1.0.0
|
|
15
|
+
///
|
|
16
|
+
/// @example scss - Подключение утилит (генерирует CSS)
|
|
17
|
+
/// @use "utilities";
|
|
18
|
+
/// // → .hidden, .hidden-md-up, .mobile-only и т.д.
|
|
19
|
+
///
|
|
20
|
+
/// @example scss - В main.scss
|
|
21
|
+
/// @forward "abstracts";
|
|
22
|
+
/// @use "utilities";
|
|
23
|
+
////
|
|
24
|
+
|
|
25
|
+
// ─────────────────────────────────────────
|
|
26
|
+
// VISIBILITY (видимость)
|
|
27
|
+
// ─────────────────────────────────────────
|
|
28
|
+
|
|
29
|
+
/// Классы управления видимостью
|
|
30
|
+
/// @see utilities-visibility
|
|
31
|
+
@forward "visibility";
|
|
32
|
+
|
|
33
|
+
// ─────────────────────────────────────────
|
|
34
|
+
// TODO: Будущие утилиты
|
|
35
|
+
// ─────────────────────────────────────────
|
|
36
|
+
|
|
37
|
+
// @forward "spacing"; // .mt-4, .px-2, ...
|
|
38
|
+
// @forward "text"; // .text-center, .text-bold, ...
|
|
39
|
+
// @forward "flex"; // .flex, .justify-center, ...
|
|
40
|
+
// @forward "colors"; // .bg-primary, .text-accent, ...
|