@rt-tools/ui-kit 0.4.0 → 0.5.1

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 (27) hide show
  1. package/README.md +1 -1
  2. package/fesm2022/rt-tools-ui-kit.mjs +3500 -3105
  3. package/fesm2022/rt-tools-ui-kit.mjs.map +1 -1
  4. package/package.json +7 -8
  5. package/rt-tools-ui-kit-0.5.1.tgz +0 -0
  6. package/src/lib/ui-kit/action-bar/components/container/rtui-action-bar-container.component.scss +47 -0
  7. package/src/lib/ui-kit/action-bar/stories/component/test-action-bar.component.scss +15 -0
  8. package/src/lib/ui-kit/aside/components/container/aside-container.component.scss +4 -1
  9. package/src/lib/ui-kit/aside/components/panel/aside-panel.component.scss +24 -0
  10. package/src/lib/ui-kit/popover/stories/component/test-popover.component.scss +32 -0
  11. package/src/lib/ui-kit/scrollable/scrollable-container.component.scss +57 -0
  12. package/src/lib/ui-kit/scrollable/stories/component/test-scrollable.component.scss +17 -0
  13. package/src/lib/ui-kit/side-menu/menu/rtui-side-menu.component.scss +219 -4
  14. package/src/lib/ui-kit/side-menu/menu-sub-item/rtui-side-menu-sub-item.component.scss +45 -4
  15. package/src/lib/ui-kit/snack-bar/snack-bar.component.scss +20 -0
  16. package/src/lib/ui-kit/toolbar/stories/component/test-toolbar.component.scss +22 -0
  17. package/src/styles/base/_tokens.scss +5 -0
  18. package/src/styles/color-scheme.spec.ts +4 -1
  19. package/src/styles/components/_rtui_button.scss +13 -547
  20. package/src/styles/components/button/_base.scss +64 -0
  21. package/src/styles/components/button/_map.scss +184 -0
  22. package/src/styles/components/button/_palettes.scss +218 -0
  23. package/src/styles/components/button/_sizes.scss +29 -0
  24. package/src/styles/components/button/_text.scss +68 -0
  25. package/styles/tokens.css +2 -0
  26. package/types/rt-tools-ui-kit.d.ts +585 -449
  27. package/rt-tools-ui-kit-0.4.0.tgz +0 -0
@@ -1,5 +1,19 @@
1
1
  @use '../../../styles/base/mixin' as mixins;
2
2
 
3
+ // Полоса срока: она стягивается слева направо и обрезается тем же путём, каким шла прежде.
4
+ // Обрезка нужна вместе с шириной — у полосы прижаты обе кромки, и одна ширина её не двигает.
5
+ @keyframes rt-snack-bar-progress {
6
+ from {
7
+ width: 100%;
8
+ clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%);
9
+ }
10
+
11
+ to {
12
+ width: 0;
13
+ clip-path: polygon(0 0, 0 0, 0 100%, 0 100%);
14
+ }
15
+ }
16
+
3
17
  $snack-bar: (
4
18
  content: (
5
19
  gap: 1rem,
@@ -92,9 +106,15 @@ $snack-bar: (
92
106
  left: 0;
93
107
  width: 100%;
94
108
  height: var(--rt-snack-bar-progress-height);
109
+ animation: rt-snack-bar-progress var(--rt-snack-bar-progress-duration) linear forwards;
95
110
  background-color: var(--mat-button-filled-container-color);
96
111
  border-bottom-left-radius: var(--mat-snack-bar-container-shape);
97
112
  border-bottom-right-radius: var(--mat-snack-bar-container-shape);
98
113
  }
99
114
  }
100
115
  }
116
+
117
+ // Под указателем срок стоит: сообщение, которое читают, не уходит само.
118
+ :host:hover .rt-snack-bar__progress {
119
+ animation-play-state: paused;
120
+ }
@@ -0,0 +1,22 @@
1
+ :host {
2
+ display: block;
3
+ width: 100%;
4
+ margin: -1rem;
5
+
6
+ .title {
7
+ overflow: hidden;
8
+ padding: 0 1rem;
9
+ font-weight: 500;
10
+ text-overflow: ellipsis;
11
+ white-space: nowrap;
12
+ }
13
+
14
+ .page {
15
+ padding: 0 1rem;
16
+
17
+ &__row {
18
+ padding: 0.75rem 0;
19
+ border-bottom: 1px solid var(--rt-border-neutral-default);
20
+ }
21
+ }
22
+ }
@@ -193,6 +193,11 @@ $semantic: (
193
193
  color-mix(in srgb, var(--rt-color-warning-80) 90%, #fff)
194
194
  ),
195
195
  bg-accent-warning-disabled: color-mix(in srgb, var(--rt-color-warning-80) 38%, transparent),
196
+ /* Подсветка найденного. Жёлтая в обеих темах — так подсвечивает найденное сам браузер,
197
+ и человек читает эту заливку без объяснений. Текст на ней тёмный всегда: жёлтый фон
198
+ светлый в любой теме, и светлая подпись на нём пропадает. */
199
+ bg-accent-highlight: t(#ffeb3b, #ffd54f),
200
+ text-accent-highlight: #181818,
196
201
  bg-accent-danger-subtle: t(var(--rt-color-danger-10), color-mix(in srgb, var(--rt-color-danger-100) 18%, #1c1b1e)),
197
202
  bg-accent-danger-solid: var(--rt-color-danger-100),
198
203
  bg-accent-danger-hover: t(
@@ -230,7 +230,10 @@ describe('rt-tools color schemes', () => {
230
230
  const scheme: Record<string, string> = extractDeclarations(css, '--rt-color-primary-\\d+');
231
231
  // bg-accent-primary-solid === var(--rt-color-primary-100); under the teal scheme that is #008582
232
232
  expect(scheme['--rt-color-primary-100']).toBe('#008582');
233
- expect(normalize(stripMat(css.match(/--rt-bg-accent-primary-solid:\s*([^;]+);/)![1]))).toBe('var(--rt-color-primary-100)');
233
+ const solid: RegExpMatchArray | null = css.match(/--rt-bg-accent-primary-solid:\s*([^;]+);/);
234
+
235
+ expect(solid).not.toBeNull();
236
+ expect(normalize(stripMat(solid?.[1] ?? ''))).toBe('var(--rt-color-primary-100)');
234
237
  });
235
238
  });
236
239
  });
@@ -1,547 +1,13 @@
1
- @use '../base/mixin' as mixins;
2
-
3
- $rtui-button: (
4
- base: (
5
- width: auto,
6
- bg: transparent,
7
- border: 0,
8
- color: var(--rt-text-base-soft),
9
- display: inline-flex,
10
- font-size: 0,
11
- gap: 0,
12
- padding: 0,
13
- shadow: 0,
14
- shadow-blur: 8px,
15
- ),
16
- accent: (
17
- border: 1px solid var(--rt-color-blue-100),
18
- color: var(--rt-text-static-light),
19
- bg: var(--rt-color-blue-60),
20
- hover-bg: var(--rt-color-blue-40),
21
- active-shadow: var(--rt-color-blue-40),
22
- ),
23
- accent-outline: (
24
- border: 1px solid var(--rt-color-blue-100),
25
- bg: var(--rt-color-blue-20),
26
- color: var(--rt-text-accent-info),
27
- hover-border: 1px solid var(--rt-color-blue-80),
28
- hover-bg: var(--rt-bg-base-base),
29
- active-shadow: var(--rt-color-blue-40),
30
- ),
31
- accent-light: (
32
- color: var(--rt-text-accent-info),
33
- bg: var(--rt-color-blue-40),
34
- hover-color: var(--rt-text-accent-info-soft),
35
- hover-bg: var(--rt-color-blue-20),
36
- active-shadow: var(--rt-color-blue-40),
37
- ),
38
- success: (
39
- border: 1px solid var(--rt-color-green-100),
40
- color: var(--rt-text-static-light),
41
- bg: var(--rt-bg-accent-success-solid),
42
- hover-bg: var(--rt-color-green-60),
43
- active-shadow: var(--rt-color-green-40),
44
- ),
45
- success-outline: (
46
- border: 1px solid var(--rt-color-green-100),
47
- bg: var(--rt-color-green-20),
48
- color: var(--rt-text-accent-success),
49
- hover-border: 1px solid var(--rt-color-green-80),
50
- hover-bg: var(--rt-bg-base-base),
51
- active-shadow: var(--rt-color-green-40),
52
- ),
53
- success-light: (
54
- color: var(--rt-text-accent-success),
55
- bg: var(--rt-color-green-20),
56
- hover-color: var(--rt-text-accent-success-soft),
57
- hover-bg: var(--rt-bg-accent-success-subtle),
58
- active-shadow: var(--rt-color-green-40),
59
- ),
60
- secondary: (
61
- border: 1px solid var(--rt-border-neutral-emphasis),
62
- color: var(--rt-text-static-light),
63
- bg: var(--rt-bg-base-emphasis),
64
- hover-bg: var(--rt-bg-base-emphasis-soft),
65
- active-shadow: var(--rt-bg-base-emphasis-soft),
66
- ),
67
- secondary-outline: (
68
- border: 1px solid var(--rt-border-neutral-emphasis),
69
- bg: var(--rt-bg-base-strong),
70
- color: var(--rt-text-base-secondary),
71
- hover-bg: var(--rt-bg-base-base),
72
- active-shadow: var(--rt-bg-base-emphasis-soft),
73
- ),
74
- secondary-light: (
75
- color: var(--rt-text-base-soft),
76
- bg: var(--rt-bg-base-emphasis-soft),
77
- hover-color: var(--rt-text-base-secondary),
78
- hover-bg: var(--rt-bg-base-strong),
79
- active-shadow: var(--rt-bg-base-emphasis-soft),
80
- ),
81
- error: (
82
- border: 1px solid var(--rt-border-accent-danger),
83
- color: var(--rt-text-static-light),
84
- bg: var(--rt-color-red-80),
85
- hover-bg: var(--rt-color-red-60),
86
- active-shadow: var(--rt-color-red-40),
87
- ),
88
- error-outline: (
89
- border: 1px solid var(--rt-border-accent-danger),
90
- bg: var(--rt-bg-accent-danger-subtle),
91
- color: var(--rt-text-accent-danger),
92
- hover-bg: var(--rt-bg-base-base),
93
- active-shadow: var(--rt-color-red-40),
94
- ),
95
- error-light: (
96
- color: var(--rt-text-accent-danger),
97
- bg: var(--rt-color-red-40),
98
- hover-bg: var(--rt-bg-accent-danger-subtle),
99
- active-shadow: var(--rt-color-red-40),
100
- ),
101
- warning: (
102
- border: 1px solid var(--rt-color-orange-100),
103
- color: var(--rt-text-static-light),
104
- bg: var(--rt-bg-accent-warning-solid),
105
- hover-bg: var(--rt-color-orange-60),
106
- active-shadow: var(--rt-color-orange-40),
107
- ),
108
- warning-outline: (
109
- border: 1px solid var(--rt-color-orange-100),
110
- bg: var(--rt-color-orange-10),
111
- color: var(--rt-text-accent-warning),
112
- hover-bg: var(--rt-bg-base-base),
113
- active-shadow: var(--rt-color-orange-40),
114
- ),
115
- warning-light: (
116
- color: var(--rt-text-accent-warning),
117
- bg: var(--rt-color-orange-10),
118
- hover-bg: var(--rt-color-orange-5),
119
- active-shadow: var(--rt-color-orange-40),
120
- ),
121
- accent-text: (
122
- border: 0,
123
- bg: transparent,
124
- color: var(--rt-text-accent-info),
125
- hover-bg: var(--rt-bg-base-hover),
126
- ),
127
- success-text: (
128
- border: 0,
129
- bg: transparent,
130
- color: var(--rt-text-accent-success),
131
- hover-bg: var(--rt-bg-base-hover),
132
- ),
133
- secondary-text: (
134
- border: 0,
135
- bg: transparent,
136
- color: var(--rt-text-base-secondary),
137
- hover-bg: var(--rt-bg-base-hover),
138
- ),
139
- error-text: (
140
- border: 0,
141
- bg: transparent,
142
- color: var(--rt-text-accent-danger),
143
- hover-bg: var(--rt-bg-base-hover),
144
- ),
145
- warning-text: (
146
- border: 0,
147
- bg: transparent,
148
- color: var(--rt-text-accent-warning),
149
- hover-bg: var(--rt-bg-base-hover),
150
- ),
151
- size-sm: (
152
- gap: 4px,
153
- padding: 4px 8px,
154
- font-size: 12px,
155
- width: auto,
156
- display: inline-flex,
157
- ),
158
-
159
- size-md: (
160
- gap: 8px,
161
- padding: 8px 16px,
162
- font-size: 14px,
163
- width: auto,
164
- display: inline-flex,
165
- ),
166
-
167
- size-lg: (
168
- gap: 12px,
169
- padding: 12px 24px,
170
- font-size: 18px,
171
- width: auto,
172
- display: inline-flex,
173
- ),
174
-
175
- size-full: (
176
- width: 100%,
177
- display: flex,
178
- gap: 8px,
179
- padding: 8px 16px,
180
- font-size: 14px,
181
- ),
182
- );
183
-
184
- :root {
185
- @each $element, $elements in $rtui-button {
186
- @each $style-token, $value in $elements {
187
- #{mixins.generateCssVar('rtui-btn', #{$element}, #{$style-token})}: #{$value};
188
- }
189
- }
190
- }
191
-
192
- .rtui-btn {
193
- --width: var(--rt-rtui-btn-base-width);
194
- --bg: var(--rt-rtui-btn-base-bg);
195
- --border: var(--rt-rtui-btn-base-border);
196
- --color: var(--rt-rtui-btn-base-color);
197
- --display: var(--rt-rtui-btn-base-display);
198
- --font-size: var(--rt-rtui-btn-base-font-size);
199
- --gap: var(--rt-rtui-btn-base-gap);
200
- --padding: var(--rt-rtui-btn-base-padding);
201
- --shadow: var(--rt-rtui-btn-base-shadow);
202
- --shadow-blur: var(--rt-rtui-btn-base-shadow-blur);
203
-
204
- display: var(--display);
205
- width: var(--width);
206
- align-items: center;
207
- justify-content: center;
208
- padding: var(--padding);
209
- border: var(--border);
210
- border-radius: 6px;
211
- background-color: var(--bg);
212
- box-shadow: var(--shadow);
213
- color: var(--color);
214
- cursor: pointer;
215
- font-size: var(--font-size);
216
- font-weight: 600;
217
- gap: var(--gap);
218
- line-height: 1;
219
- text-decoration: none;
220
- transition:
221
- background-color 0.15s linear,
222
- color 0.15s linear,
223
- box-shadow 0.15s linear,
224
- border-color 0.15s linear;
225
-
226
- &:focus {
227
- outline: none;
228
- }
229
-
230
- &:focus-visible {
231
- outline: 2px dashed var(--rt-border-focus);
232
- outline-offset: 2px;
233
- }
234
-
235
- &:disabled {
236
- cursor: default;
237
- opacity: 0.75;
238
- pointer-events: none;
239
- }
240
- }
241
-
242
- /* accent */
243
- .rtui-btn-accent {
244
- --border: var(--rt-rtui-btn-accent-border);
245
- --color: var(--rt-rtui-btn-accent-color);
246
- --bg: var(--rt-rtui-btn-accent-bg);
247
-
248
- &:hover {
249
- --bg: var(--rt-rtui-btn-accent-hover-bg);
250
- }
251
-
252
- &:active {
253
- --shadow: var(--rt-rtui-btn-accent-active-shadow);
254
- }
255
- }
256
-
257
- .rtui-btn-accent-outline {
258
- --border: var(--rt-rtui-btn-accent-outline-border);
259
- --bg: var(--rt-rtui-btn-accent-outline-bg);
260
- --color: var(--rt-rtui-btn-accent-outline-color);
261
-
262
- &:hover {
263
- --border: var(--rt-rtui-btn-accent-outline-hover-border);
264
- --bg: var(--rt-rtui-btn-accent-outline-hover-bg);
265
- }
266
-
267
- &:active {
268
- --shadow: var(--rt-rtui-btn-accent-outline-active-shadow);
269
- }
270
- }
271
-
272
- .rtui-btn-accent-light {
273
- --color: var(--rt-rtui-btn-accent-light-color);
274
- --bg: var(--rt-rtui-btn-accent-light-bg);
275
-
276
- &:hover {
277
- --color: var(--rt-rtui-btn-accent-light-hover-color);
278
- --bg: var(--rt-rtui-btn-accent-light-hover-bg);
279
- }
280
-
281
- &:active {
282
- --shadow: var(--rt-rtui-btn-accent-light-active-shadow);
283
- }
284
- }
285
-
286
- /* success */
287
- .rtui-btn-success {
288
- --border: var(--rt-rtui-btn-success-border);
289
- --color: var(--rt-rtui-btn-success-color);
290
- --bg: var(--rt-rtui-btn-success-bg);
291
-
292
- &:hover {
293
- --bg: var(--rt-rtui-btn-success-hover-bg);
294
- }
295
-
296
- &:active {
297
- --shadow: var(--rt-rtui-btn-success-active-shadow);
298
- }
299
- }
300
-
301
- .rtui-btn-success-outline {
302
- --border: var(--rt-rtui-btn-success-outline-border);
303
- --bg: var(--rt-rtui-btn-success-outline-bg);
304
- --color: var(--rt-rtui-btn-success-outline-color);
305
-
306
- &:hover {
307
- --border: var(--rt-rtui-btn-success-outline-hover-border);
308
- --bg: var(--rt-rtui-btn-success-outline-hover-bg);
309
- }
310
-
311
- &:active {
312
- --shadow: var(--rt-rtui-btn-success-outline-active-shadow);
313
- }
314
- }
315
-
316
- .rtui-btn-success-light {
317
- --color: var(--rt-rtui-btn-success-light-color);
318
- --bg: var(--rt-rtui-btn-success-light-bg);
319
-
320
- &:hover {
321
- --color: var(--rt-rtui-btn-success-light-hover-color);
322
- --bg: var(--rt-rtui-btn-success-light-hover-bg);
323
- }
324
-
325
- &:active {
326
- --shadow: var(--rt-rtui-btn-success-light-active-shadow);
327
- }
328
- }
329
-
330
- /* secondary */
331
- .rtui-btn-secondary {
332
- --border: var(--rt-rtui-btn-secondary-border);
333
- --color: var(--rt-rtui-btn-secondary-color);
334
- --bg: var(--rt-rtui-btn-secondary-bg);
335
-
336
- &:hover {
337
- --bg: var(--rt-rtui-btn-secondary-hover-bg);
338
- }
339
-
340
- &:active {
341
- --shadow: var(--rt-rtui-btn-secondary-active-shadow);
342
- }
343
- }
344
-
345
- .rtui-btn-secondary-outline {
346
- --border: var(--rt-rtui-btn-secondary-outline-border);
347
- --bg: var(--rt-rtui-btn-secondary-outline-bg);
348
- --color: var(--rt-rtui-btn-secondary-outline-color);
349
-
350
- &:hover {
351
- --bg: var(--rt-rtui-btn-secondary-outline-hover-bg);
352
- }
353
-
354
- &:active {
355
- --shadow: var(--rt-rtui-btn-secondary-outline-active-shadow);
356
- }
357
- }
358
-
359
- .rtui-btn-secondary-light {
360
- --color: var(--rt-rtui-btn-secondary-light-color);
361
- --bg: var(--rt-rtui-btn-secondary-light-bg);
362
-
363
- &:hover {
364
- --color: var(--rt-rtui-btn-secondary-light-hover-color);
365
- --bg: var(--rt-rtui-btn-secondary-light-hover-bg);
366
- }
367
-
368
- &:active {
369
- --shadow: var(--rt-rtui-btn-secondary-light-active-shadow);
370
- }
371
- }
372
-
373
- /* error */
374
- .rtui-btn-error {
375
- --border: var(--rt-rtui-btn-error-border);
376
- --color: var(--rt-rtui-btn-error-color);
377
- --bg: var(--rt-rtui-btn-error-bg);
378
-
379
- &:hover {
380
- --bg: var(--rt-rtui-btn-error-hover-bg);
381
- }
382
-
383
- &:active {
384
- --shadow: var(--rt-rtui-btn-error-active-shadow);
385
- }
386
- }
387
-
388
- .rtui-btn-error-outline {
389
- --border: var(--rt-rtui-btn-error-outline-border);
390
- --bg: var(--rt-rtui-btn-error-outline-bg);
391
- --color: var(--rt-rtui-btn-error-outline-color);
392
-
393
- &:hover {
394
- --bg: var(--rt-rtui-btn-error-outline-hover-bg);
395
- }
396
-
397
- &:active {
398
- --shadow: var(--rt-rtui-btn-error-outline-active-shadow);
399
- }
400
- }
401
-
402
- .rtui-btn-error-light {
403
- --color: var(--rt-rtui-btn-error-light-color);
404
- --bg: var(--rt-rtui-btn-error-light-bg);
405
-
406
- &:hover {
407
- --bg: var(--rt-rtui-btn-error-light-hover-bg);
408
- }
409
-
410
- &:active {
411
- --shadow: var(--rt-rtui-btn-error-light-active-shadow);
412
- }
413
- }
414
-
415
- /* warning */
416
- .rtui-btn-warning {
417
- --border: var(--rt-rtui-btn-warning-border);
418
- --color: var(--rt-rtui-btn-warning-color);
419
- --bg: var(--rt-rtui-btn-warning-bg);
420
-
421
- &:hover {
422
- --bg: var(--rt-rtui-btn-warning-hover-bg);
423
- }
424
-
425
- &:active {
426
- --shadow: var(--rt-rtui-btn-warning-active-shadow);
427
- }
428
- }
429
-
430
- .rtui-btn-warning-outline {
431
- --border: var(--rt-rtui-btn-warning-outline-border);
432
- --bg: var(--rt-rtui-btn-warning-outline-bg);
433
- --color: var(--rt-rtui-btn-warning-outline-color);
434
-
435
- &:hover {
436
- --bg: var(--rt-rtui-btn-warning-outline-hover-bg);
437
- }
438
-
439
- &:active {
440
- --shadow: var(--rt-rtui-btn-warning-outline-active-shadow);
441
- }
442
- }
443
-
444
- .rtui-btn-warning-light {
445
- --color: var(--rt-rtui-btn-warning-light-color);
446
- --bg: var(--rt-rtui-btn-warning-light-bg);
447
-
448
- &:hover {
449
- --bg: var(--rt-rtui-btn-warning-light-hover-bg);
450
- }
451
-
452
- &:active {
453
- --shadow: var(--rt-rtui-btn-warning-light-active-shadow);
454
- }
455
- }
456
-
457
- /* text — transparent, borderless label with a subtle hover wash.
458
- Shared box matches the legacy text-button (inline-text look). Compound
459
- `.rtui-btn[...-text]` (0,2,0) outranks the size tokens (0,1,0) regardless of order. */
460
- .rtui-btn[class*='-text'] {
461
- --font-size: 16px;
462
- --gap: 8px;
463
- --padding: 0 10px;
464
-
465
- min-height: 30px;
466
- border-radius: 5px;
467
- font-weight: 400;
468
- }
469
-
470
- .rtui-btn-accent-text {
471
- --border: var(--rt-rtui-btn-accent-text-border);
472
- --bg: var(--rt-rtui-btn-accent-text-bg);
473
- --color: var(--rt-rtui-btn-accent-text-color);
474
-
475
- &:hover {
476
- --bg: var(--rt-rtui-btn-accent-text-hover-bg);
477
- }
478
- }
479
-
480
- .rtui-btn-success-text {
481
- --border: var(--rt-rtui-btn-success-text-border);
482
- --bg: var(--rt-rtui-btn-success-text-bg);
483
- --color: var(--rt-rtui-btn-success-text-color);
484
-
485
- &:hover {
486
- --bg: var(--rt-rtui-btn-success-text-hover-bg);
487
- }
488
- }
489
-
490
- /* secondary-text resolves its colour ON the element so the `--rt-text-base-secondary`
491
- semantic (`--mat-sys-on-surface-variant` hybrid) lands where Material is in scope. */
492
- .rtui-btn-secondary-text {
493
- --border: var(--rt-rtui-btn-secondary-text-border);
494
- --bg: var(--rt-rtui-btn-secondary-text-bg);
495
- --color: var(--mat-sys-on-surface-variant, var(--rt-rtui-btn-secondary-text-color));
496
-
497
- &:hover {
498
- --bg: var(--rt-rtui-btn-secondary-text-hover-bg);
499
- }
500
- }
501
-
502
- .rtui-btn-error-text {
503
- --border: var(--rt-rtui-btn-error-text-border);
504
- --bg: var(--rt-rtui-btn-error-text-bg);
505
- --color: var(--rt-rtui-btn-error-text-color);
506
-
507
- &:hover {
508
- --bg: var(--rt-rtui-btn-error-text-hover-bg);
509
- }
510
- }
511
-
512
- .rtui-btn-warning-text {
513
- --border: var(--rt-rtui-btn-warning-text-border);
514
- --bg: var(--rt-rtui-btn-warning-text-bg);
515
- --color: var(--rt-rtui-btn-warning-text-color);
516
-
517
- &:hover {
518
- --bg: var(--rt-rtui-btn-warning-text-hover-bg);
519
- }
520
- }
521
-
522
- /* size */
523
- .rtui-btn-sm {
524
- --gap: var(--rt-rtui-btn-size-sm-gap);
525
- --padding: var(--rt-rtui-btn-size-sm-padding);
526
- --font-size: var(--rt-rtui-btn-size-sm-font-size);
527
- }
528
-
529
- .rtui-btn-md {
530
- --gap: var(--rt-rtui-btn-size-md-gap);
531
- --padding: var(--rt-rtui-btn-size-md-padding);
532
- --font-size: var(--rt-rtui-btn-size-md-font-size);
533
- }
534
-
535
- .rtui-btn-lg {
536
- --gap: var(--rt-rtui-btn-size-lg-gap);
537
- --padding: var(--rt-rtui-btn-size-lg-padding);
538
- --font-size: var(--rt-rtui-btn-size-lg-font-size);
539
- }
540
-
541
- .rtui-btn-full {
542
- --width: var(--rt-rtui-btn-size-full-width);
543
- --display: var(--rt-rtui-btn-size-full-display);
544
- --gap: var(--rt-rtui-btn-size-full-gap);
545
- --padding: var(--rt-rtui-btn-size-full-padding);
546
- --font-size: var(--rt-rtui-btn-size-full-font-size);
547
- }
1
+ // Кнопка кита: вид, размер и состояние. Файл остался входом, а сами правила лежат частями
2
+ // рядом, по предмету: таблица видов — `button/_map.scss`, основа блока — `button/_base.scss`,
3
+ // пятнадцать палитр — `button/_palettes.scss`, виды без фона — `button/_text.scss`, размеры —
4
+ // `button/_sizes.scss`.
5
+ // Порядок подключения — это порядок каскада: правила одного блока равны по силе, и текстовые
6
+ // виды перебивают палитры только потому, что стоят после них.
7
+
8
+ @forward 'button/map';
9
+
10
+ @use 'button/base';
11
+ @use 'button/palettes';
12
+ @use 'button/text';
13
+ @use 'button/sizes';
@@ -0,0 +1,64 @@
1
+ // Основа кнопки: объявление свойств вида на корне страницы и сам блок `.rtui-btn` — раскладка,
2
+ // рамка, тень, состояния наведения, фокуса и отключённости.
3
+ // Часть стилей кнопки — входом остаётся `_rtui_button.scss`.
4
+
5
+ @use '../../base/mixin' as mixins;
6
+ @use 'map' as button;
7
+
8
+ :root {
9
+ @each $element, $elements in button.$rtui-button {
10
+ @each $style-token, $value in $elements {
11
+ #{mixins.generateCssVar('rtui-btn', #{$element}, #{$style-token})}: #{$value};
12
+ }
13
+ }
14
+ }
15
+
16
+ .rtui-btn {
17
+ --width: var(--rt-rtui-btn-base-width);
18
+ --bg: var(--rt-rtui-btn-base-bg);
19
+ --border: var(--rt-rtui-btn-base-border);
20
+ --color: var(--rt-rtui-btn-base-color);
21
+ --display: var(--rt-rtui-btn-base-display);
22
+ --font-size: var(--rt-rtui-btn-base-font-size);
23
+ --gap: var(--rt-rtui-btn-base-gap);
24
+ --padding: var(--rt-rtui-btn-base-padding);
25
+ --shadow: var(--rt-rtui-btn-base-shadow);
26
+ --shadow-blur: var(--rt-rtui-btn-base-shadow-blur);
27
+
28
+ display: var(--display);
29
+ width: var(--width);
30
+ align-items: center;
31
+ justify-content: center;
32
+ padding: var(--padding);
33
+ border: var(--border);
34
+ border-radius: 6px;
35
+ background-color: var(--bg);
36
+ box-shadow: var(--shadow);
37
+ color: var(--color);
38
+ cursor: pointer;
39
+ font-size: var(--font-size);
40
+ font-weight: 600;
41
+ gap: var(--gap);
42
+ line-height: 1;
43
+ text-decoration: none;
44
+ transition:
45
+ background-color 0.15s linear,
46
+ color 0.15s linear,
47
+ box-shadow 0.15s linear,
48
+ border-color 0.15s linear;
49
+
50
+ &:focus {
51
+ outline: none;
52
+ }
53
+
54
+ &:focus-visible {
55
+ outline: 2px dashed var(--rt-border-focus);
56
+ outline-offset: 2px;
57
+ }
58
+
59
+ &:disabled {
60
+ cursor: default;
61
+ opacity: 0.75;
62
+ pointer-events: none;
63
+ }
64
+ }