@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,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, ...