@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,279 @@
1
+ ////
2
+ /// Система скругления углов темы MOEXP
3
+ /// Border-radius переменные, функции и миксины
4
+ /// @group radius
5
+ /// @author MOEXP Team
6
+ ////
7
+
8
+ // ============================================
9
+ // BORDER RADIUS SYSTEM
10
+ // local\common\theme-moexp\src\scss\abstracts\_radius.scss
11
+ // ============================================
12
+
13
+ @use "sass:map";
14
+ @use "sass:meta";
15
+
16
+ // ─────────────────────────────────────────
17
+ // ПЕРЕМЕННЫЕ (соответствуют Tailwind)
18
+ // ─────────────────────────────────────────
19
+
20
+ /// Без скругления
21
+ /// @type Number
22
+ /// @group radius
23
+ $radius-none: 0 !default;
24
+
25
+ /// Скругление SM (2px) — минимальное
26
+ /// @type Number
27
+ /// @group radius
28
+ $radius-sm: 0.125rem !default;
29
+
30
+ /// Скругление Default (4px) — базовое
31
+ /// @type Number
32
+ /// @group radius
33
+ $radius-default: 0.25rem !default;
34
+
35
+ /// Скругление MD (6px) — среднее
36
+ /// @type Number
37
+ /// @group radius
38
+ $radius-md: 0.375rem !default;
39
+
40
+ /// Скругление LG (8px) — стандартное для карточек ⭐
41
+ /// @type Number
42
+ /// @group radius
43
+ $radius-lg: 0.5rem !default;
44
+
45
+ /// Скругление XL (12px) — увеличенное
46
+ /// @type Number
47
+ /// @group radius
48
+ $radius-xl: 0.75rem !default;
49
+
50
+ /// Скругление 2XL (16px) — большое
51
+ /// @type Number
52
+ /// @group radius
53
+ $radius-2xl: 1rem !default;
54
+
55
+ /// Скругление 3XL (24px) — очень большое
56
+ /// @type Number
57
+ /// @group radius
58
+ $radius-3xl: 1.5rem !default;
59
+
60
+ /// Полное скругление (pill/circle)
61
+ /// @type Number
62
+ /// @group radius
63
+ $radius-full: 9999px !default;
64
+
65
+ /// Карта всех значений border-radius
66
+ /// @type Map
67
+ /// @prop {Number} none [0] - Без скругления
68
+ /// @prop {Number} sm [0.125rem] - 2px
69
+ /// @prop {Number} default [0.25rem] - 4px
70
+ /// @prop {Number} md [0.375rem] - 6px
71
+ /// @prop {Number} lg [0.5rem] - 8px ⭐
72
+ /// @prop {Number} xl [0.75rem] - 12px
73
+ /// @prop {Number} 2xl [1rem] - 16px
74
+ /// @prop {Number} 3xl [1.5rem] - 24px
75
+ /// @prop {Number} full [9999px] - Pill/Circle
76
+ /// @example scss - Получение значения из карты
77
+ /// border-radius: map.get($radii, 'xl');
78
+ /// // => 0.75rem
79
+ /// @group radius
80
+ $radii: (
81
+ none: $radius-none,
82
+ sm: $radius-sm,
83
+ default: $radius-default,
84
+ md: $radius-md,
85
+ lg: $radius-lg,
86
+ xl: $radius-xl,
87
+ 2xl: $radius-2xl,
88
+ 3xl: $radius-3xl,
89
+ full: $radius-full,
90
+ ) !default;
91
+
92
+ // ─────────────────────────────────────────
93
+ // CSS CUSTOM PROPERTY
94
+ // ─────────────────────────────────────────
95
+
96
+ /// Корневая CSS-переменная для динамического радиуса
97
+ /// Используется в calc() для относительных вычислений
98
+ /// @output --radius: 0.5rem (8px)
99
+ /// @group radius
100
+ @mixin radius-root-var {
101
+ :root {
102
+ --radius: #{$radius-lg};
103
+ }
104
+ }
105
+
106
+ // ─────────────────────────────────────────
107
+ // ФУНКЦИЯ
108
+ // ─────────────────────────────────────────
109
+
110
+ /// Получить значение радиуса по ключу
111
+ /// @param {String} $size [lg] - Ключ из карты $radii
112
+ /// @return {Number} Значение border-radius
113
+ /// @throw Ошибка если ключ не найден в $radii
114
+ /// @example scss - Базовое использование
115
+ /// border-radius: get-radius('xl');
116
+ /// // => 0.75rem
117
+ /// @example scss - В кастомном свойстве
118
+ /// .modal {
119
+ /// border-radius: get-radius('2xl');
120
+ /// }
121
+ /// // => border-radius: 1rem;
122
+ /// @group radius
123
+ /// @access public
124
+ @function get-radius($size: lg) {
125
+ $value: map.get($radii, $size);
126
+
127
+ @if not $value {
128
+ @error "Радиус `#{$size}` не найден. Доступные: #{map.keys($radii)}";
129
+ }
130
+
131
+ @return $value;
132
+ }
133
+
134
+ // ─────────────────────────────────────────
135
+ // МИКСИНЫ
136
+ // ─────────────────────────────────────────
137
+
138
+ /// Применяет border-radius
139
+ /// Принимает ключ из $radii или числовое значение
140
+ /// @param {String | Number} $size [lg] - Ключ из $radii или число
141
+ /// @require {function} get-radius
142
+ /// @example scss - С ключом
143
+ /// .card {
144
+ /// @include rounded('xl');
145
+ /// }
146
+ /// // => border-radius: 0.75rem;
147
+ /// @example scss - С числом
148
+ /// .custom {
149
+ /// @include rounded(10px);
150
+ /// }
151
+ /// // => border-radius: 10px;
152
+ /// @output border-radius: {value};
153
+ /// @group radius
154
+ /// @access public
155
+ @mixin rounded($size: lg) {
156
+ @if meta.type-of($size) == number {
157
+ border-radius: $size;
158
+ } @else {
159
+ border-radius: get-radius($size);
160
+ }
161
+ }
162
+
163
+ /// Применяет border-radius через CSS-переменную
164
+ /// Позволяет динамически менять радиус через --radius
165
+ /// @param {Number} $offset [0] - Смещение от базового --radius
166
+ /// @example scss - Базовое использование
167
+ /// .card {
168
+ /// @include rounded-var;
169
+ /// }
170
+ /// // => border-radius: var(--radius);
171
+ /// @example scss - С увеличением
172
+ /// .modal {
173
+ /// @include rounded-var(0.5rem);
174
+ /// }
175
+ /// // => border-radius: calc(var(--radius) + 0.5rem);
176
+ /// @example scss - С уменьшением
177
+ /// .button {
178
+ /// @include rounded-var(-0.25rem);
179
+ /// }
180
+ /// // => border-radius: calc(var(--radius) + -0.25rem);
181
+ /// @output border-radius: var(--radius) или calc(var(--radius) + offset);
182
+ /// @group radius
183
+ /// @access public
184
+ @mixin rounded-var($offset: 0) {
185
+ @if $offset == 0 {
186
+ border-radius: var(--radius);
187
+ } @else {
188
+ border-radius: calc(var(--radius) + #{$offset});
189
+ }
190
+ }
191
+
192
+ /// Скругление верхних углов (top-left и top-right)
193
+ /// @param {String} $size [lg] - Ключ из $radii
194
+ /// @require {function} get-radius
195
+ /// @example scss - Табы или хедер карточки
196
+ /// .card__header {
197
+ /// @include rounded-t('lg');
198
+ /// }
199
+ /// // => border-radius: 0.5rem 0.5rem 0 0;
200
+ /// @output border-radius: {r} {r} 0 0;
201
+ /// @group radius
202
+ /// @access public
203
+ @mixin rounded-t($size: lg) {
204
+ $r: get-radius($size);
205
+ border-radius: $r $r 0 0;
206
+ }
207
+
208
+ /// Скругление нижних углов (bottom-left и bottom-right)
209
+ /// @param {String} $size [lg] - Ключ из $radii
210
+ /// @require {function} get-radius
211
+ /// @example scss - Футер карточки
212
+ /// .card__footer {
213
+ /// @include rounded-b('lg');
214
+ /// }
215
+ /// // => border-radius: 0 0 0.5rem 0.5rem;
216
+ /// @output border-radius: 0 0 {r} {r};
217
+ /// @group radius
218
+ /// @access public
219
+ @mixin rounded-b($size: lg) {
220
+ $r: get-radius($size);
221
+ border-radius: 0 0 $r $r;
222
+ }
223
+
224
+ /// Скругление левых углов (top-left и bottom-left)
225
+ /// @param {String} $size [lg] - Ключ из $radii
226
+ /// @require {function} get-radius
227
+ /// @example scss - Левая часть split-button
228
+ /// .btn-group__first {
229
+ /// @include rounded-l('md');
230
+ /// }
231
+ /// // => border-radius: 0.375rem 0 0 0.375rem;
232
+ /// @output border-radius: {r} 0 0 {r};
233
+ /// @group radius
234
+ /// @access public
235
+ @mixin rounded-l($size: lg) {
236
+ $r: get-radius($size);
237
+ border-radius: $r 0 0 $r;
238
+ }
239
+
240
+ /// Скругление правых углов (top-right и bottom-right)
241
+ /// @param {String} $size [lg] - Ключ из $radii
242
+ /// @require {function} get-radius
243
+ /// @example scss - Правая часть split-button
244
+ /// .btn-group__last {
245
+ /// @include rounded-r('md');
246
+ /// }
247
+ /// // => border-radius: 0 0.375rem 0.375rem 0;
248
+ /// @output border-radius: 0 {r} {r} 0;
249
+ /// @group radius
250
+ /// @access public
251
+ @mixin rounded-r($size: lg) {
252
+ $r: get-radius($size);
253
+ border-radius: 0 $r $r 0;
254
+ }
255
+
256
+ // // Переменная напрямую
257
+ // .element {
258
+ // border-radius: $radius-lg;
259
+ // }
260
+
261
+ // // Функция
262
+ // .element {
263
+ // border-radius: get-radius('xl');
264
+ // }
265
+
266
+ // // Миксин (рекомендуется)
267
+ // .card {
268
+ // @include rounded('lg');
269
+ // }
270
+
271
+ // // Динамический через CSS-переменную
272
+ // .modal {
273
+ // @include rounded-var;
274
+ // }
275
+
276
+ // // Частичное скругление
277
+ // .tab {
278
+ // @include rounded-t('md');
279
+ // }
@@ -0,0 +1,271 @@
1
+ // ============================================
2
+ // SEARCH FORM MIXINS
3
+ // local\common\theme-moexp\src\scss\abstracts\_search-form.scss
4
+ // ============================================
5
+
6
+ ////
7
+ /// Миксины для формы поиска с иконкой внутри
8
+ ///
9
+ /// Предоставляет гибкую систему для создания поисковых форм
10
+ /// в различных контекстах (header, sidebar, hero).
11
+ ///
12
+ /// @group search-form
13
+ /// @author MOEXP Team
14
+ /// @since 1.0.0
15
+ ///
16
+ /// @example scss - Использование в шаблоне
17
+ /// @use "theme-moexp/src/scss/main" as theme;
18
+ ///
19
+ /// .header__search {
20
+ /// @include theme.search-form-base;
21
+ /// @include theme.search-form-theme(primary-foreground);
22
+ /// }
23
+ ////
24
+
25
+ @use "sass:map";
26
+ @use "mixins";
27
+ @use "spacing";
28
+ @use "typography";
29
+ @use "animations";
30
+ @use "radius";
31
+
32
+ // ============================================
33
+ // VARIABLES
34
+ // ============================================
35
+
36
+ /// Ширина формы поиска по умолчанию
37
+ /// @type Length
38
+ /// @group search-form
39
+ $search-form-width: 15rem !default;
40
+
41
+ /// Высота формы поиска по умолчанию
42
+ /// @type Length
43
+ /// @group search-form
44
+ $search-form-height: 2.5rem !default;
45
+
46
+ /// Размер иконки поиска
47
+ /// @type Length
48
+ /// @group search-form
49
+ $search-form-icon-size: 1.2rem !default;
50
+
51
+ /// Отступ справа для иконки
52
+ /// @type Length
53
+ /// @group search-form
54
+ $search-form-icon-offset: 1.25rem !default;
55
+
56
+ // ============================================
57
+ // BASE MIXINS
58
+ // ============================================
59
+
60
+ /// Базовая структура контейнера формы поиска
61
+ /// Устанавливает размеры и relative positioning для абсолютной кнопки
62
+ ///
63
+ /// @param {Length} $width [$search-form-width] - Ширина формы
64
+ /// @param {Length} $height [$search-form-height] - Высота формы
65
+ /// @example scss
66
+ /// .my-search {
67
+ /// @include search-form-base;
68
+ /// }
69
+ /// @example scss - Кастомные размеры
70
+ /// .my-search {
71
+ /// @include search-form-base(20rem, 3rem);
72
+ /// }
73
+ /// @output position, width, height
74
+ /// @group search-form
75
+ /// @access public
76
+ @mixin search-form-base($width: $search-form-width, $height: $search-form-height) {
77
+ position: relative;
78
+ z-index: 20;
79
+ width: $width;
80
+ height: $height;
81
+
82
+ // Доступность: минимальный размер touch target
83
+ min-height: 44px;
84
+ }
85
+
86
+ /// Базовые стили поля ввода поиска
87
+ /// Input занимает 100% размеров контейнера
88
+ ///
89
+ /// @example scss
90
+ /// .my-search__input {
91
+ /// @include search-form-input-base;
92
+ /// }
93
+ /// @output width: 100%, height: 100%, padding, font-size, border-radius
94
+ /// @group search-form
95
+ /// @access public
96
+ @mixin search-form-input-base {
97
+ // Занимаем всё пространство формы
98
+ width: 100%;
99
+ height: 100%;
100
+
101
+ // Отступы
102
+ padding-left: spacing.$spacing-md;
103
+ padding-right: $search-form-icon-offset + $search-form-icon-size + 0.5rem;
104
+
105
+ // Типографика
106
+ font-size: typography.$font-size-sm;
107
+
108
+ // Скругление
109
+ border-radius: radius.$radius-sm;
110
+
111
+ // Убираем стандартные стили
112
+ appearance: none;
113
+ -webkit-appearance: none;
114
+
115
+ &::-webkit-search-cancel-button,
116
+ &::-webkit-search-decoration {
117
+ -webkit-appearance: none;
118
+ appearance: none;
119
+ }
120
+ }
121
+
122
+ /// Базовые стили кнопки поиска (иконка)
123
+ /// Позиционирование и размеры SVG
124
+ ///
125
+ /// @example scss
126
+ /// .my-search__button {
127
+ /// @include search-form-button-base;
128
+ /// }
129
+ /// @output position, размеры, сброс стилей кнопки
130
+ /// @group search-form
131
+ /// @access public
132
+ @mixin search-form-button-base {
133
+ position: absolute;
134
+ right: $search-form-icon-offset;
135
+ top: 50%;
136
+ transform: translateY(-50%);
137
+
138
+ // Сброс стилей кнопки
139
+ padding: 0;
140
+ margin: 0;
141
+ background: transparent;
142
+ border: none;
143
+ cursor: pointer;
144
+
145
+ // Доступность: минимальный размер touch target
146
+ // Увеличиваем кликабельную область
147
+ &::before {
148
+ content: "";
149
+ position: absolute;
150
+ top: 50%;
151
+ left: 50%;
152
+ transform: translate(-50%, -50%);
153
+ width: 44px;
154
+ height: 44px;
155
+ }
156
+
157
+ svg {
158
+ width: $search-form-icon-size;
159
+ height: $search-form-icon-size;
160
+ fill: currentColor;
161
+ display: block;
162
+ }
163
+ }
164
+
165
+ // ============================================
166
+ // THEME MIXINS
167
+ // ============================================
168
+
169
+ /// Тема для поля ввода поиска
170
+ /// Устанавливает цвета фона, границы, текста, placeholder
171
+ ///
172
+ /// @param {String} $color - Имя цвета из палитры темы
173
+ /// @param {Number} $bg-alpha [0.1] - Прозрачность фона
174
+ /// @param {Number} $border-alpha [0.2] - Прозрачность границы
175
+ /// @param {Number} $placeholder-alpha [0.5] - Прозрачность placeholder
176
+ /// @require {mixin} mixins.hsl-prop
177
+ /// @require {mixin} mixins.border-hsl
178
+ /// @require {mixin} animations.input-focus-light
179
+ /// @example scss - На тёмном фоне
180
+ /// .search__input {
181
+ /// @include search-form-input-theme(primary-foreground);
182
+ /// }
183
+ /// @example scss - На светлом фоне
184
+ /// .search__input {
185
+ /// @include search-form-input-theme(primary, 0.05, 0.15);
186
+ /// }
187
+ /// @output background-color, border, color, placeholder, focus
188
+ /// @group search-form
189
+ /// @access public
190
+ @mixin search-form-input-theme($color, $bg-alpha: 0.1, $border-alpha: 0.2, $placeholder-alpha: 0.5) {
191
+ @include mixins.hsl-prop(background-color, $color, $bg-alpha);
192
+ @include mixins.border-hsl(1px, solid, $color, $border-alpha);
193
+ @include mixins.text-color($color);
194
+
195
+ &::placeholder {
196
+ @include mixins.hsl-prop(color, $color, $placeholder-alpha);
197
+ }
198
+
199
+ @include animations.input-focus-light($color);
200
+ }
201
+
202
+ /// Тема для кнопки поиска
203
+ /// Устанавливает цвет иконки и hover-состояние
204
+ ///
205
+ /// @param {String} $color - Имя цвета из палитры темы
206
+ /// @param {Number} $alpha [0.6] - Прозрачность цвета
207
+ /// @param {Number} $hover-alpha [1] - Прозрачность при hover
208
+ /// @require {mixin} mixins.hsl-prop
209
+ /// @require {mixin} animations.transition-colors
210
+ /// @example scss
211
+ /// .search__button {
212
+ /// @include search-form-button-theme(primary-foreground);
213
+ /// }
214
+ /// @output color, transition, hover
215
+ /// @group search-form
216
+ /// @access public
217
+ @mixin search-form-button-theme($color, $alpha: 0.6, $hover-alpha: 1) {
218
+ @include mixins.hsl-prop(color, $color, $alpha);
219
+ @include animations.transition-colors;
220
+
221
+ &:hover {
222
+ @include mixins.hsl-prop(color, $color, $hover-alpha);
223
+ }
224
+
225
+ &:focus {
226
+ outline: none;
227
+ }
228
+
229
+ &:focus-visible {
230
+ @include mixins.focus-ring($color);
231
+ }
232
+ }
233
+
234
+ // ============================================
235
+ // COMPOSITE MIXINS
236
+ // ============================================
237
+
238
+ /// Полный набор стилей для контейнера формы поиска
239
+ /// Комбинирует base + структуру для input и button
240
+ ///
241
+ /// @param {String} $color - Имя цвета темы
242
+ /// @param {Length} $width [$search-form-width] - Ширина формы
243
+ /// @param {Length} $height [$search-form-height] - Высота формы
244
+ /// @example scss - Быстрое создание формы
245
+ /// .header__search-form {
246
+ /// @include search-form($color: primary-foreground);
247
+ /// }
248
+ /// @example scss - Кастомные размеры
249
+ /// .hero__search-form {
250
+ /// @include search-form(primary-foreground, 25rem, 3.5rem);
251
+ /// }
252
+ /// @output Полная структура формы с темой
253
+ /// @group search-form
254
+ /// @access public
255
+ @mixin search-form($color, $width: $search-form-width, $height: $search-form-height) {
256
+ @include search-form-base($width, $height);
257
+
258
+ // Стили для input внутри
259
+ input,
260
+ &__input {
261
+ @include search-form-input-base;
262
+ @include search-form-input-theme($color);
263
+ }
264
+
265
+ // Стили для button внутри
266
+ button,
267
+ &__button {
268
+ @include search-form-button-base;
269
+ @include search-form-button-theme($color);
270
+ }
271
+ }