@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,865 @@
1
+ // ============================================
2
+ // BREAKPOINTS
3
+ // local\common\theme-moexp\src\scss\abstracts\_breakpoints.scss
4
+ // ============================================
5
+
6
+ ////
7
+ /// Система брейкпоинтов для адаптивной вёрстки
8
+ /// @group breakpoints
9
+ /// @author Theme Developer
10
+ ////
11
+
12
+ @use "sass:map";
13
+ @use "sass:meta";
14
+
15
+ // ─────────────────────────────────────────
16
+ // БРЕЙКПОИНТЫ НА ОСНОВЕ СТАТИСТИКИ
17
+ // ─────────────────────────────────────────
18
+ //
19
+ // Визуальная карта устройств:
20
+ //
21
+ // 0 360 414 480 640 768 1024 1280 1440 1536 1920 2560
22
+ // │─────────│────│────│──────│──────│───────────│───────────│───────────│──────│───────────│─────────────│
23
+ // │ xs │ sm │ md │ lg │ xl │ 2xl │ 3xl │ 4xl │
24
+ // │ │ │ │ │ │ │ │ │
25
+ // │ Старые │ Смартфоны │Табл. │ Ноутбуки │ Ноутбуки │ MacBook │ Full HD (36% трафика) │ 2K/4K │
26
+ // │ телефоны│ iPhone 12-14 │ │ бюджетные │ средние │ 1536×864 │ 1920×1080 │ 2560×1440│
27
+ // │ 360×800 │ 390-414px │768px │ 1366×768 │ 1280×720 │ │ │ │
28
+ // └─────────┴────────────────┴──────┴───────────┴───────────┴───────────┴───────────────────────┴──────────┘
29
+
30
+ /// Карта брейкпоинтов (mobile-first)
31
+ /// @type Map
32
+ /// @prop {Length} xs [360px] - Минимальный смартфон (~0.07% трафика)
33
+ /// @prop {Length} sm [480px] - Большие смартфоны, iPhone XR/XS (~0.05%)
34
+ /// @prop {Length} md [768px] - Планшеты, iPad (~0.3%)
35
+ /// @prop {Length} lg [1024px] - Маленькие ноутбуки, iPad Pro landscape
36
+ /// @prop {Length} xl [1280px] - Ноутбуки (~0.9%)
37
+ /// @prop {Length} xxl [1536px] - MacBook, HiDPI ноутбуки (~3.3%)
38
+ /// @prop {Length} xxxl [1920px] - Full HD мониторы (~36% трафика)
39
+ /// @prop {Length} xxxxl [2560px] - 2K/4K мониторы (~2.5%)
40
+ /// @example scss - Использование в миксине media
41
+ /// @include media(md) { ... }
42
+ /// @include media(lg, max) { ... }
43
+ /// @group breakpoints
44
+ $breakpoints: (
45
+ xs: 360px,
46
+ sm: 480px,
47
+ md: 768px,
48
+ lg: 1024px,
49
+ xl: 1280px,
50
+ xxl: 1536px,
51
+ xxxl: 1920px,
52
+ xxxxl: 2560px,
53
+ ) !default;
54
+
55
+ // ─────────────────────────────────────────
56
+ // Контейнеры (max-width для .container)
57
+ // ─────────────────────────────────────────
58
+
59
+ /// Карта ширин контейнеров для каждого брейкпоинта
60
+ /// @type Map
61
+ /// @prop {Length} xs [100%] - Мобильные: полная ширина
62
+ /// @prop {Length} sm [100%] - Большие мобильные: полная ширина
63
+ /// @prop {Length} md [720px] - Планшеты
64
+ /// @prop {Length} lg [960px] - Ноутбуки
65
+ /// @prop {Length} xl [1140px] - Большие ноутбуки
66
+ /// @prop {Length} 2xl [1320px] - MacBook
67
+ /// @prop {Length} 3xl [1440px] - Full HD (комфортная ширина)
68
+ /// @prop {Length} 4xl [1600px] - Ultrawide
69
+ /// @group breakpoints
70
+ $containers: (
71
+ xs: 100%,
72
+ sm: 100%,
73
+ md: 720px,
74
+ lg: 960px,
75
+ xl: 1140px,
76
+ 2xl: 1320px,
77
+ 3xl: 1440px,
78
+ 4xl: 1600px,
79
+ ) !default;
80
+
81
+ // ─────────────────────────────────────────
82
+ // Переменные для прямого доступа
83
+ // ─────────────────────────────────────────
84
+
85
+ /// Брейкпоинт XS (минимальный смартфон)
86
+ /// @type Length
87
+ /// @group breakpoints
88
+ $breakpoint-xs: 360px !default;
89
+
90
+ /// Брейкпоинт SM (большие смартфоны)
91
+ /// @type Length
92
+ /// @group breakpoints
93
+ $breakpoint-sm: 480px !default;
94
+
95
+ /// Брейкпоинт MD (планшеты)
96
+ /// @type Length
97
+ /// @group breakpoints
98
+ $breakpoint-md: 768px !default;
99
+
100
+ /// Брейкпоинт LG (ноутбуки)
101
+ /// @type Length
102
+ /// @group breakpoints
103
+ $breakpoint-lg: 1024px !default;
104
+
105
+ /// Брейкпоинт XL (большие ноутбуки)
106
+ /// @type Length
107
+ /// @group breakpoints
108
+ $breakpoint-xl: 1280px !default;
109
+
110
+ /// Брейкпоинт XXL (MacBook, HiDPI)
111
+ /// @type Length
112
+ /// @group breakpoints
113
+ $breakpoint-xxl: 1536px !default;
114
+
115
+ /// Брейкпоинт XXXL (Full HD)
116
+ /// @type Length
117
+ /// @group breakpoints
118
+ $breakpoint-xxxl: 1920px !default;
119
+
120
+ /// Брейкпоинт XXXXL (2K/4K)
121
+ /// @type Length
122
+ /// @group breakpoints
123
+ $breakpoint-xxxxl: 2560px !default;
124
+
125
+ // ============================================
126
+ // УНИВЕРСАЛЬНЫЙ MEDIA МИКСИН
127
+ // ============================================
128
+
129
+ /// Универсальный media query миксин
130
+ /// @param {String|Length} $breakpoint - Имя брейкпоинта (xs, sm, md...) или число в px
131
+ /// @param {String} $type [min] - Тип запроса: min, max, min-max
132
+ /// @param {String|Length} $breakpoint-end [null] - Конечный брейкпоинт для диапазона
133
+ /// @output Media query с переданным контентом
134
+ /// @example scss - min-width (mobile-first)
135
+ /// .element {
136
+ /// @include media(md) {
137
+ /// display: flex;
138
+ /// }
139
+ /// }
140
+ /// @example scss - max-width
141
+ /// .element {
142
+ /// @include media(lg, max) {
143
+ /// display: block;
144
+ /// }
145
+ /// }
146
+ /// @example scss - диапазон
147
+ /// .element {
148
+ /// @include media(md, min-max, lg) {
149
+ /// padding: 1rem;
150
+ /// }
151
+ /// }
152
+ /// @example scss - произвольное значение
153
+ /// .element {
154
+ /// @include media(600px) {
155
+ /// font-size: 1.2rem;
156
+ /// }
157
+ /// }
158
+ /// @group breakpoints
159
+ @mixin media($breakpoint, $type: min, $breakpoint-end: null) {
160
+ $value: _get-breakpoint-value($breakpoint);
161
+
162
+ @if $type == min {
163
+ @media (min-width: $value) {
164
+ @content;
165
+ }
166
+ } @else if $type == max {
167
+ @media (max-width: ($value - 1px)) {
168
+ @content;
169
+ }
170
+ } @else if $type == min-max {
171
+ @if not $breakpoint-end {
172
+ @error "Для `min-max` укажите второй брейкпоинт";
173
+ }
174
+
175
+ $value-end: _get-breakpoint-value($breakpoint-end);
176
+
177
+ @media (min-width: $value) and (max-width: ($value-end - 1px)) {
178
+ @content;
179
+ }
180
+ }
181
+ }
182
+
183
+ /// Получает значение брейкпоинта из карты или возвращает число
184
+ /// @access private
185
+ /// @param {String|Length} $breakpoint - Имя или значение брейкпоинта
186
+ /// @return {Length} - Значение в px
187
+ /// @throw Ошибка если брейкпоинт не найден
188
+ /// @group breakpoints
189
+ @function _get-breakpoint-value($breakpoint) {
190
+ @if meta.type-of($breakpoint) == number {
191
+ @return $breakpoint;
192
+ }
193
+
194
+ $value: map.get($breakpoints, $breakpoint);
195
+
196
+ @if not $value {
197
+ @error "Брейкпоинт `#{$breakpoint}` не найден. Доступные: #{map.keys($breakpoints)}";
198
+ }
199
+
200
+ @return $value;
201
+ }
202
+
203
+ // ============================================
204
+ // UP (min-width) — mobile-first
205
+ // ============================================
206
+
207
+ /// Media query от XS (360px) и выше
208
+ /// @content Стили для XS+
209
+ /// @output @media (min-width: 360px)
210
+ /// @group breakpoints
211
+ @mixin xs-up {
212
+ @include media(xs) {
213
+ @content;
214
+ }
215
+ }
216
+
217
+ /// Media query от SM (480px) и выше
218
+ /// @content Стили для SM+
219
+ /// @output @media (min-width: 480px)
220
+ /// @group breakpoints
221
+ @mixin sm-up {
222
+ @include media(sm) {
223
+ @content;
224
+ }
225
+ }
226
+
227
+ /// Media query от MD (768px) и выше
228
+ /// @content Стили для MD+
229
+ /// @output @media (min-width: 768px)
230
+ /// @group breakpoints
231
+ @mixin md-up {
232
+ @include media(md) {
233
+ @content;
234
+ }
235
+ }
236
+
237
+ /// Media query от LG (1024px) и выше
238
+ /// @content Стили для LG+
239
+ /// @output @media (min-width: 1024px)
240
+ /// @group breakpoints
241
+ @mixin lg-up {
242
+ @include media(lg) {
243
+ @content;
244
+ }
245
+ }
246
+
247
+ /// Media query от XL (1280px) и выше
248
+ /// @content Стили для XL+
249
+ /// @output @media (min-width: 1280px)
250
+ /// @group breakpoints
251
+ @mixin xl-up {
252
+ @include media(xl) {
253
+ @content;
254
+ }
255
+ }
256
+
257
+ /// Media query от XXL (1536px) и выше
258
+ /// @content Стили для XXL+
259
+ /// @output @media (min-width: 1536px)
260
+ /// @group breakpoints
261
+ @mixin xxl-up {
262
+ @include media(xxl) {
263
+ @content;
264
+ }
265
+ }
266
+
267
+ /// Media query от XXXL (1920px) и выше
268
+ /// @content Стили для XXXL+
269
+ /// @output @media (min-width: 1920px)
270
+ /// @group breakpoints
271
+ @mixin xxxl-up {
272
+ @include media(xxxl) {
273
+ @content;
274
+ }
275
+ }
276
+
277
+ /// Media query от XXXXL (2560px) и выше
278
+ /// @content Стили для XXXXL+
279
+ /// @output @media (min-width: 2560px)
280
+ /// @group breakpoints
281
+ @mixin xxxxl-up {
282
+ @include media(xxxxl) {
283
+ @content;
284
+ }
285
+ }
286
+
287
+ // ─────────────────────────────────────────
288
+ // Короткие алиасы (без суффикса -up)
289
+ // ─────────────────────────────────────────
290
+
291
+ /// Алиас для xs-up
292
+ /// @content Стили для XS+
293
+ /// @see {mixin} xs-up
294
+ /// @group breakpoints
295
+ @mixin xs {
296
+ @include media(xs) {
297
+ @content;
298
+ }
299
+ }
300
+
301
+ /// Алиас для sm-up
302
+ /// @content Стили для SM+
303
+ /// @see {mixin} sm-up
304
+ /// @group breakpoints
305
+ @mixin sm {
306
+ @include media(sm) {
307
+ @content;
308
+ }
309
+ }
310
+
311
+ /// Алиас для md-up
312
+ /// @content Стили для MD+
313
+ /// @see {mixin} md-up
314
+ /// @group breakpoints
315
+ @mixin md {
316
+ @include media(md) {
317
+ @content;
318
+ }
319
+ }
320
+
321
+ /// Алиас для lg-up
322
+ /// @content Стили для LG+
323
+ /// @see {mixin} lg-up
324
+ /// @group breakpoints
325
+ @mixin lg {
326
+ @include media(lg) {
327
+ @content;
328
+ }
329
+ }
330
+
331
+ /// Алиас для xl-up
332
+ /// @content Стили для XL+
333
+ /// @see {mixin} xl-up
334
+ /// @group breakpoints
335
+ @mixin xl {
336
+ @include media(xl) {
337
+ @content;
338
+ }
339
+ }
340
+
341
+ /// Алиас для xxl-up
342
+ /// @content Стили для XXL+
343
+ /// @see {mixin} xxl-up
344
+ /// @group breakpoints
345
+ @mixin xxl {
346
+ @include media(xxl) {
347
+ @content;
348
+ }
349
+ }
350
+
351
+ /// Алиас для xxxl-up
352
+ /// @content Стили для XXXL+
353
+ /// @see {mixin} xxxl-up
354
+ /// @group breakpoints
355
+ @mixin xxxl {
356
+ @include media(xxxl) {
357
+ @content;
358
+ }
359
+ }
360
+
361
+ /// Алиас для xxxxl-up
362
+ /// @content Стили для XXXXL+
363
+ /// @see {mixin} xxxxl-up
364
+ /// @group breakpoints
365
+ @mixin xxxxl {
366
+ @include media(xxxxl) {
367
+ @content;
368
+ }
369
+ }
370
+
371
+ // ─────────────────────────────────────────
372
+ // Семантические алиасы
373
+ // ─────────────────────────────────────────
374
+
375
+ /// Мобильные устройства (от 360px)
376
+ /// @content Стили для мобильных+
377
+ /// @see {mixin} xs
378
+ /// @group breakpoints
379
+ @mixin mobile {
380
+ @include media(xs) {
381
+ @content;
382
+ }
383
+ }
384
+
385
+ /// Большие мобильные (от 480px)
386
+ /// @content Стили для больших мобильных+
387
+ /// @see {mixin} sm
388
+ /// @group breakpoints
389
+ @mixin mobile-lg {
390
+ @include media(sm) {
391
+ @content;
392
+ }
393
+ }
394
+
395
+ /// Планшеты (от 768px)
396
+ /// @content Стили для планшетов+
397
+ /// @see {mixin} md
398
+ /// @group breakpoints
399
+ @mixin tablet {
400
+ @include media(md) {
401
+ @content;
402
+ }
403
+ }
404
+
405
+ /// Ноутбуки (от 1024px)
406
+ /// @content Стили для ноутбуков+
407
+ /// @see {mixin} lg
408
+ /// @group breakpoints
409
+ @mixin laptop {
410
+ @include media(lg) {
411
+ @content;
412
+ }
413
+ }
414
+
415
+ /// Большие ноутбуки (от 1280px)
416
+ /// @content Стили для больших ноутбуков+
417
+ /// @see {mixin} xl
418
+ /// @group breakpoints
419
+ @mixin laptop-lg {
420
+ @include media(xl) {
421
+ @content;
422
+ }
423
+ }
424
+
425
+ /// Десктопы (от 1536px)
426
+ /// @content Стили для десктопов+
427
+ /// @see {mixin} xxl
428
+ /// @group breakpoints
429
+ @mixin desktop {
430
+ @include media(xxl) {
431
+ @content;
432
+ }
433
+ }
434
+
435
+ /// Full HD десктопы (от 1920px)
436
+ /// @content Стили для Full HD+
437
+ /// @see {mixin} xxxl
438
+ /// @group breakpoints
439
+ @mixin desktop-fhd {
440
+ @include media(xxxl) {
441
+ @content;
442
+ }
443
+ }
444
+
445
+ /// 2K/4K десктопы (от 2560px)
446
+ /// @content Стили для 2K/4K+
447
+ /// @see {mixin} xxxxl
448
+ /// @group breakpoints
449
+ @mixin desktop-2k {
450
+ @include media(xxxxl) {
451
+ @content;
452
+ }
453
+ }
454
+
455
+ // ============================================
456
+ // DOWN (max-width)
457
+ // ============================================
458
+
459
+ /// Media query до XS (менее 360px)
460
+ /// @content Стили для <360px
461
+ /// @output @media (max-width: 359px)
462
+ /// @group breakpoints
463
+ @mixin xs-down {
464
+ @include media(xs, max) {
465
+ @content;
466
+ }
467
+ }
468
+
469
+ /// Media query до SM (менее 480px)
470
+ /// @content Стили для <480px
471
+ /// @output @media (max-width: 479px)
472
+ /// @group breakpoints
473
+ @mixin sm-down {
474
+ @include media(sm, max) {
475
+ @content;
476
+ }
477
+ }
478
+
479
+ /// Media query до MD (менее 768px)
480
+ /// @content Стили для <768px
481
+ /// @output @media (max-width: 767px)
482
+ /// @group breakpoints
483
+ @mixin md-down {
484
+ @include media(md, max) {
485
+ @content;
486
+ }
487
+ }
488
+
489
+ /// Media query до LG (менее 1024px)
490
+ /// @content Стили для <1024px
491
+ /// @output @media (max-width: 1023px)
492
+ /// @group breakpoints
493
+ @mixin lg-down {
494
+ @include media(lg, max) {
495
+ @content;
496
+ }
497
+ }
498
+
499
+ /// Media query до XL (менее 1280px)
500
+ /// @content Стили для <1280px
501
+ /// @output @media (max-width: 1279px)
502
+ /// @group breakpoints
503
+ @mixin xl-down {
504
+ @include media(xl, max) {
505
+ @content;
506
+ }
507
+ }
508
+
509
+ /// Media query до XXL (менее 1536px)
510
+ /// @content Стили для <1536px
511
+ /// @output @media (max-width: 1535px)
512
+ /// @group breakpoints
513
+ @mixin xxl-down {
514
+ @include media(xxl, max) {
515
+ @content;
516
+ }
517
+ }
518
+
519
+ /// Media query до XXXL (менее 1920px)
520
+ /// @content Стили для <1920px
521
+ /// @output @media (max-width: 1919px)
522
+ /// @group breakpoints
523
+ @mixin xxxl-down {
524
+ @include media(xxxl, max) {
525
+ @content;
526
+ }
527
+ }
528
+
529
+ /// Media query до XXXXL (менее 2560px)
530
+ /// @content Стили для <2560px
531
+ /// @output @media (max-width: 2559px)
532
+ /// @group breakpoints
533
+ @mixin xxxxl-down {
534
+ @include media(xxxxl, max) {
535
+ @content;
536
+ }
537
+ }
538
+
539
+ // ============================================
540
+ // ONLY (диапазоны)
541
+ // ============================================
542
+
543
+ /// Только XS (360px - 479px)
544
+ /// @content Стили только для XS
545
+ /// @output @media (min-width: 360px) and (max-width: 479px)
546
+ /// @group breakpoints
547
+ @mixin xs-only {
548
+ @include media(xs, min-max, sm) {
549
+ @content;
550
+ }
551
+ }
552
+
553
+ /// Только SM (480px - 767px)
554
+ /// @content Стили только для SM
555
+ /// @output @media (min-width: 480px) and (max-width: 767px)
556
+ /// @group breakpoints
557
+ @mixin sm-only {
558
+ @include media(sm, min-max, md) {
559
+ @content;
560
+ }
561
+ }
562
+
563
+ /// Только MD (768px - 1023px)
564
+ /// @content Стили только для MD
565
+ /// @output @media (min-width: 768px) and (max-width: 1023px)
566
+ /// @group breakpoints
567
+ @mixin md-only {
568
+ @include media(md, min-max, lg) {
569
+ @content;
570
+ }
571
+ }
572
+
573
+ /// Только LG (1024px - 1279px)
574
+ /// @content Стили только для LG
575
+ /// @output @media (min-width: 1024px) and (max-width: 1279px)
576
+ /// @group breakpoints
577
+ @mixin lg-only {
578
+ @include media(lg, min-max, xl) {
579
+ @content;
580
+ }
581
+ }
582
+
583
+ /// Только XL (1280px - 1535px)
584
+ /// @content Стили только для XL
585
+ /// @output @media (min-width: 1280px) and (max-width: 1535px)
586
+ /// @group breakpoints
587
+ @mixin xl-only {
588
+ @include media(xl, min-max, xxl) {
589
+ @content;
590
+ }
591
+ }
592
+
593
+ /// Только XXL (1536px - 1919px)
594
+ /// @content Стили только для XXL
595
+ /// @output @media (min-width: 1536px) and (max-width: 1919px)
596
+ /// @group breakpoints
597
+ @mixin xxl-only {
598
+ @include media(xxl, min-max, xxxl) {
599
+ @content;
600
+ }
601
+ }
602
+
603
+ /// Только XXXL (1920px - 2559px)
604
+ /// @content Стили только для XXXL
605
+ /// @output @media (min-width: 1920px) and (max-width: 2559px)
606
+ /// @group breakpoints
607
+ @mixin xxxl-only {
608
+ @include media(xxxl, min-max, xxxxl) {
609
+ @content;
610
+ }
611
+ }
612
+
613
+ // ============================================
614
+ // HIDE / SHOW
615
+ // ============================================
616
+
617
+ /// Скрыть элемент от указанного брейкпоинта и выше
618
+ /// @param {String|Length} $breakpoint - Брейкпоинт от которого скрывать
619
+ /// @output display: none с !important
620
+ /// @example scss
621
+ /// .mobile-menu {
622
+ /// @include hide-up(lg); // Скрыть на десктопе
623
+ /// }
624
+ /// @group breakpoints
625
+ @mixin hide-up($breakpoint) {
626
+ @include media($breakpoint) {
627
+ display: none !important;
628
+ }
629
+ }
630
+
631
+ /// Скрыть элемент до указанного брейкпоинта
632
+ /// @param {String|Length} $breakpoint - Брейкпоинт до которого скрывать
633
+ /// @output display: none с !important
634
+ /// @example scss
635
+ /// .sidebar {
636
+ /// @include hide-down(lg); // Скрыть на мобильных
637
+ /// }
638
+ /// @group breakpoints
639
+ @mixin hide-down($breakpoint) {
640
+ @include media($breakpoint, max) {
641
+ display: none !important;
642
+ }
643
+ }
644
+
645
+ /// Скрыть элемент в диапазоне брейкпоинтов
646
+ /// @param {String|Length} $from - Начальный брейкпоинт
647
+ /// @param {String|Length} $to - Конечный брейкпоинт
648
+ /// @output display: none с !important
649
+ /// @example scss
650
+ /// .promo {
651
+ /// @include hide-between(sm, lg); // Скрыть только на планшетах
652
+ /// }
653
+ /// @group breakpoints
654
+ @mixin hide-between($from, $to) {
655
+ @include media($from, min-max, $to) {
656
+ display: none !important;
657
+ }
658
+ }
659
+
660
+ /// Показать элемент от указанного брейкпоинта и выше (скрыт по умолчанию)
661
+ /// @param {String|Length} $breakpoint - Брейкпоинт от которого показывать
662
+ /// @output display: none → display: revert
663
+ /// @example scss
664
+ /// .desktop-widget {
665
+ /// @include show-up(lg); // Показать только на десктопе
666
+ /// }
667
+ /// @group breakpoints
668
+ @mixin show-up($breakpoint) {
669
+ display: none !important;
670
+
671
+ @include media($breakpoint) {
672
+ display: revert !important;
673
+ }
674
+ }
675
+
676
+ /// Показать элемент до указанного брейкпоинта (скрыт по умолчанию)
677
+ /// @param {String|Length} $breakpoint - Брейкпоинт до которого показывать
678
+ /// @output display: none → display: revert
679
+ /// @example scss
680
+ /// .mobile-widget {
681
+ /// @include show-down(lg); // Показать только на мобильных
682
+ /// }
683
+ /// @group breakpoints
684
+ @mixin show-down($breakpoint) {
685
+ display: none !important;
686
+
687
+ @include media($breakpoint, max) {
688
+ display: revert !important;
689
+ }
690
+ }
691
+
692
+ /// Показать элемент в диапазоне брейкпоинтов (скрыт по умолчанию)
693
+ /// @param {String|Length} $from - Начальный брейкпоинт
694
+ /// @param {String|Length} $to - Конечный брейкпоинт
695
+ /// @output display: none → display: revert
696
+ /// @example scss
697
+ /// .tablet-banner {
698
+ /// @include show-between(sm, lg); // Показать только на планшетах
699
+ /// }
700
+ /// @group breakpoints
701
+ @mixin show-between($from, $to) {
702
+ display: none !important;
703
+
704
+ @include media($from, min-max, $to) {
705
+ display: revert !important;
706
+ }
707
+ }
708
+
709
+ // ─────────────────────────────────────────
710
+ // Семантические hide/show
711
+ // ─────────────────────────────────────────
712
+
713
+ /// Скрыть на мобильных (до LG)
714
+ /// @content Не требует контента
715
+ /// @see {mixin} hide-down
716
+ /// @group breakpoints
717
+ @mixin hide-mobile {
718
+ @include hide-down(lg);
719
+ }
720
+
721
+ /// Скрыть на десктопе (от LG)
722
+ /// @content Не требует контента
723
+ /// @see {mixin} hide-up
724
+ /// @group breakpoints
725
+ @mixin hide-desktop {
726
+ @include hide-up(lg);
727
+ }
728
+
729
+ /// Показать только на мобильных (до LG)
730
+ /// @content Не требует контента
731
+ /// @see {mixin} hide-up
732
+ /// @group breakpoints
733
+ @mixin mobile-only {
734
+ @include hide-up(lg);
735
+ }
736
+
737
+ /// Показать только на десктопе (от LG)
738
+ /// @content Не требует контента
739
+ /// @see {mixin} hide-down
740
+ /// @group breakpoints
741
+ @mixin desktop-only {
742
+ @include hide-down(lg);
743
+ }
744
+
745
+ // ============================================
746
+ // ДОПОЛНИТЕЛЬНЫЕ МЕДИА-ЗАПРОСЫ
747
+ // ============================================
748
+
749
+ /// Стили только для устройств с hover (мышь)
750
+ /// @content Стили для hover-устройств
751
+ /// @output @media (hover: hover) and (pointer: fine)
752
+ /// @example scss
753
+ /// .button {
754
+ /// @include hover {
755
+ /// transform: scale(1.05);
756
+ /// }
757
+ /// }
758
+ /// @group breakpoints
759
+ @mixin hover {
760
+ @media (hover: hover) and (pointer: fine) {
761
+ &:hover {
762
+ @content;
763
+ }
764
+ }
765
+ }
766
+
767
+ /// Стили для тач-устройств
768
+ /// @content Стили для тач-устройств
769
+ /// @output @media (hover: none) and (pointer: coarse)
770
+ /// @example scss
771
+ /// .slider {
772
+ /// @include touch {
773
+ /// scroll-snap-type: x mandatory;
774
+ /// }
775
+ /// }
776
+ /// @group breakpoints
777
+ @mixin touch {
778
+ @media (hover: none) and (pointer: coarse) {
779
+ @content;
780
+ }
781
+ }
782
+
783
+ /// Стили для пользователей с настройкой "уменьшить движение"
784
+ /// @content Стили для reduced-motion
785
+ /// @output @media (prefers-reduced-motion: reduce)
786
+ /// @example scss
787
+ /// .animated {
788
+ /// @include reduced-motion {
789
+ /// animation: none;
790
+ /// }
791
+ /// }
792
+ /// @group breakpoints
793
+ @mixin reduced-motion {
794
+ @media (prefers-reduced-motion: reduce) {
795
+ @content;
796
+ }
797
+ }
798
+
799
+ /// Стили для тёмной системной темы
800
+ /// @content Стили для тёмной темы
801
+ /// @output @media (prefers-color-scheme: dark)
802
+ /// @example scss
803
+ /// body {
804
+ /// @include prefers-dark {
805
+ /// background: #000;
806
+ /// }
807
+ /// }
808
+ /// @group breakpoints
809
+ @mixin prefers-dark {
810
+ @media (prefers-color-scheme: dark) {
811
+ @content;
812
+ }
813
+ }
814
+
815
+ /// Стили для печати
816
+ /// @content Стили для печати
817
+ /// @output @media print
818
+ /// @example scss
819
+ /// .no-print {
820
+ /// @include print {
821
+ /// display: none;
822
+ /// }
823
+ /// }
824
+ /// @group breakpoints
825
+ @mixin print {
826
+ @media print {
827
+ @content;
828
+ }
829
+ }
830
+
831
+ /// Стили для альбомной ориентации
832
+ /// @content Стили для landscape
833
+ /// @output @media (orientation: landscape)
834
+ /// @group breakpoints
835
+ @mixin landscape {
836
+ @media (orientation: landscape) {
837
+ @content;
838
+ }
839
+ }
840
+
841
+ /// Стили для портретной ориентации
842
+ /// @content Стили для portrait
843
+ /// @output @media (orientation: portrait)
844
+ /// @group breakpoints
845
+ @mixin portrait {
846
+ @media (orientation: portrait) {
847
+ @content;
848
+ }
849
+ }
850
+
851
+ /// Стили для Retina / HiDPI экранов
852
+ /// @content Стили для 2x+ плотности
853
+ /// @output @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi)
854
+ /// @example scss
855
+ /// .logo {
856
+ /// @include retina {
857
+ /// background-image: url('logo@2x.png');
858
+ /// }
859
+ /// }
860
+ /// @group breakpoints
861
+ @mixin retina {
862
+ @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {
863
+ @content;
864
+ }
865
+ }