@mednet/ui 0.0.0-stage → 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 (155) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +46 -2
  3. package/THIRD_PARTY_NOTICES.md +27 -0
  4. package/dist/brand/logo/logo-horizontal.d.ts +6 -0
  5. package/dist/brand/logo/logo-horizontal.js +7 -0
  6. package/dist/brand/logo/logo-mark.d.ts +6 -0
  7. package/dist/brand/logo/logo-mark.js +7 -0
  8. package/dist/brand/logo/logo-vertical.d.ts +6 -0
  9. package/dist/brand/logo/logo-vertical.js +7 -0
  10. package/dist/brand/logo.d.ts +18 -0
  11. package/dist/brand/logo.js +12 -0
  12. package/dist/brand/site-footer.d.ts +24 -0
  13. package/dist/brand/site-footer.js +15 -0
  14. package/dist/brand/site-header.d.ts +11 -0
  15. package/dist/brand/site-header.js +7 -0
  16. package/dist/components/accordion.d.ts +6 -0
  17. package/dist/components/accordion.js +17 -0
  18. package/dist/components/alert-dialog.d.ts +18 -0
  19. package/dist/components/alert-dialog.js +42 -0
  20. package/dist/components/alert.d.ts +10 -0
  21. package/dist/components/alert.js +27 -0
  22. package/dist/components/aspect-ratio.d.ts +4 -0
  23. package/dist/components/aspect-ratio.js +8 -0
  24. package/dist/components/attachment.d.ts +23 -0
  25. package/dist/components/attachment.js +68 -0
  26. package/dist/components/avatar.d.ts +11 -0
  27. package/dist/components/avatar.js +23 -0
  28. package/dist/components/badge.d.ts +7 -0
  29. package/dist/components/badge.js +33 -0
  30. package/dist/components/breadcrumb.d.ts +10 -0
  31. package/dist/components/breadcrumb.js +36 -0
  32. package/dist/components/bubble.d.ts +16 -0
  33. package/dist/components/bubble.js +59 -0
  34. package/dist/components/button-group.d.ts +10 -0
  35. package/dist/components/button-group.js +36 -0
  36. package/dist/components/button.d.ts +8 -0
  37. package/dist/components/button.js +34 -0
  38. package/dist/components/calendar.d.ts +10 -0
  39. package/dist/components/calendar.js +76 -0
  40. package/dist/components/card.d.ts +11 -0
  41. package/dist/components/card.js +24 -0
  42. package/dist/components/carousel.d.ts +28 -0
  43. package/dist/components/carousel.js +91 -0
  44. package/dist/components/chart.d.ts +44 -0
  45. package/dist/components/chart.js +132 -0
  46. package/dist/components/checkbox.d.ts +3 -0
  47. package/dist/components/checkbox.js +9 -0
  48. package/dist/components/collapsible.d.ts +5 -0
  49. package/dist/components/collapsible.js +13 -0
  50. package/dist/components/combobox.d.ts +24 -0
  51. package/dist/components/combobox.js +58 -0
  52. package/dist/components/command.d.ts +19 -0
  53. package/dist/components/command.js +35 -0
  54. package/dist/components/context-menu.d.ts +29 -0
  55. package/dist/components/context-menu.js +51 -0
  56. package/dist/components/dialog.d.ts +17 -0
  57. package/dist/components/dialog.js +37 -0
  58. package/dist/components/direction.d.ts +1 -0
  59. package/dist/components/direction.js +2 -0
  60. package/dist/components/drawer.d.ts +16 -0
  61. package/dist/components/drawer.js +75 -0
  62. package/dist/components/dropdown-menu.d.ts +29 -0
  63. package/dist/components/dropdown-menu.js +51 -0
  64. package/dist/components/empty.d.ts +11 -0
  65. package/dist/components/empty.js +33 -0
  66. package/dist/components/field.d.ts +24 -0
  67. package/dist/components/field.js +68 -0
  68. package/dist/components/hover-card.d.ts +5 -0
  69. package/dist/components/hover-card.js +14 -0
  70. package/dist/components/input-group.d.ts +18 -0
  71. package/dist/components/input-group.js +57 -0
  72. package/dist/components/input-otp.d.ts +11 -0
  73. package/dist/components/input-otp.js +21 -0
  74. package/dist/components/input.d.ts +3 -0
  75. package/dist/components/input.js +7 -0
  76. package/dist/components/item.d.ts +22 -0
  77. package/dist/components/item.js +78 -0
  78. package/dist/components/kbd.d.ts +3 -0
  79. package/dist/components/kbd.js +9 -0
  80. package/dist/components/label.d.ts +3 -0
  81. package/dist/components/label.js +7 -0
  82. package/dist/components/marker.d.ts +10 -0
  83. package/dist/components/marker.js +34 -0
  84. package/dist/components/menubar.d.ts +29 -0
  85. package/dist/components/menubar.js +56 -0
  86. package/dist/components/message-scroller.d.ts +10 -0
  87. package/dist/components/message-scroller.js +25 -0
  88. package/dist/components/message.d.ts +10 -0
  89. package/dist/components/message.js +21 -0
  90. package/dist/components/native-select.d.ts +8 -0
  91. package/dist/components/native-select.js +13 -0
  92. package/dist/components/navigation-menu.d.ts +11 -0
  93. package/dist/components/navigation-menu.js +31 -0
  94. package/dist/components/pagination.d.ts +17 -0
  95. package/dist/components/pagination.js +26 -0
  96. package/dist/components/popover.d.ts +9 -0
  97. package/dist/components/popover.js +23 -0
  98. package/dist/components/progress.d.ts +7 -0
  99. package/dist/components/progress.js +20 -0
  100. package/dist/components/questionnaire.d.ts +19 -0
  101. package/dist/components/questionnaire.js +52 -0
  102. package/dist/components/radio-group.d.ts +5 -0
  103. package/dist/components/radio-group.js +12 -0
  104. package/dist/components/resizable.d.ts +7 -0
  105. package/dist/components/resizable.js +14 -0
  106. package/dist/components/scroll-area.d.ts +5 -0
  107. package/dist/components/scroll-area.js +11 -0
  108. package/dist/components/select.d.ts +15 -0
  109. package/dist/components/select.js +34 -0
  110. package/dist/components/separator.d.ts +3 -0
  111. package/dist/components/separator.js +8 -0
  112. package/dist/components/sheet.d.ts +14 -0
  113. package/dist/components/sheet.js +37 -0
  114. package/dist/components/sidebar.d.ts +63 -0
  115. package/dist/components/sidebar.js +256 -0
  116. package/dist/components/skeleton.d.ts +2 -0
  117. package/dist/components/skeleton.js +6 -0
  118. package/dist/components/slider.d.ts +3 -0
  119. package/dist/components/slider.js +12 -0
  120. package/dist/components/spinner.d.ts +2 -0
  121. package/dist/components/spinner.js +7 -0
  122. package/dist/components/switch.d.ts +5 -0
  123. package/dist/components/switch.js +8 -0
  124. package/dist/components/table.d.ts +10 -0
  125. package/dist/components/table.js +28 -0
  126. package/dist/components/tabs.d.ts +10 -0
  127. package/dist/components/tabs.js +29 -0
  128. package/dist/components/textarea.d.ts +3 -0
  129. package/dist/components/textarea.js +6 -0
  130. package/dist/components/toast.d.ts +16 -0
  131. package/dist/components/toast.js +66 -0
  132. package/dist/components/toggle-group.d.ts +11 -0
  133. package/dist/components/toggle-group.js +24 -0
  134. package/dist/components/toggle.d.ts +8 -0
  135. package/dist/components/toggle.js +26 -0
  136. package/dist/components/tooltip.d.ts +6 -0
  137. package/dist/components/tooltip.js +17 -0
  138. package/dist/hooks/use-mobile.d.ts +1 -0
  139. package/dist/hooks/use-mobile.js +15 -0
  140. package/dist/index.d.ts +67 -0
  141. package/dist/index.js +69 -0
  142. package/dist/layouts/app-shell.d.ts +19 -0
  143. package/dist/layouts/app-shell.js +9 -0
  144. package/dist/layouts/public-layout.d.ts +14 -0
  145. package/dist/layouts/public-layout.js +8 -0
  146. package/dist/layouts/skip-link.d.ts +2 -0
  147. package/dist/layouts/skip-link.js +5 -0
  148. package/dist/lib/utils.d.ts +2 -0
  149. package/dist/lib/utils.js +7 -0
  150. package/llms.md +521 -0
  151. package/package.json +128 -3
  152. package/postcss.cjs +163 -0
  153. package/src/brand.css +69 -0
  154. package/src/shadcn-tailwind.css +638 -0
  155. package/src/styles.css +48 -0
@@ -0,0 +1,638 @@
1
+ /* Копия shadcn@4.21.4/dist/tailwind.css (MIT, см. THIRD_PARTY_NOTICES.md). Обновляется pnpm vendor-css, не редактировать. */
2
+ @theme inline {
3
+ @keyframes accordion-down {
4
+ from {
5
+ height: 0;
6
+ }
7
+ to {
8
+ height: var(
9
+ --radix-accordion-content-height,
10
+ var(--accordion-panel-height, auto)
11
+ );
12
+ }
13
+ }
14
+
15
+ @keyframes accordion-up {
16
+ from {
17
+ height: var(
18
+ --radix-accordion-content-height,
19
+ var(--accordion-panel-height, auto)
20
+ );
21
+ }
22
+ to {
23
+ height: 0;
24
+ }
25
+ }
26
+ }
27
+
28
+ /* Custom variants */
29
+ @custom-variant data-open {
30
+ &:where([data-state="open"]),
31
+ &:where([data-open]:not([data-open="false"])) {
32
+ @slot;
33
+ }
34
+ }
35
+
36
+ @custom-variant data-closed {
37
+ &:where([data-state="closed"]),
38
+ &:where([data-closed]:not([data-closed="false"])) {
39
+ @slot;
40
+ }
41
+ }
42
+
43
+ @custom-variant data-checked {
44
+ &:where([data-state="checked"]),
45
+ &:where([data-checked]:not([data-checked="false"])) {
46
+ @slot;
47
+ }
48
+ }
49
+
50
+ @custom-variant data-unchecked {
51
+ &:where([data-state="unchecked"]),
52
+ &:where([data-unchecked]:not([data-unchecked="false"])) {
53
+ @slot;
54
+ }
55
+ }
56
+
57
+ @custom-variant data-selected {
58
+ &:where([data-selected="true"]) {
59
+ @slot;
60
+ }
61
+ }
62
+
63
+ @custom-variant data-disabled {
64
+ &:where([data-disabled="true"]),
65
+ &:where([data-disabled]:not([data-disabled="false"])) {
66
+ @slot;
67
+ }
68
+ }
69
+
70
+ @custom-variant data-active {
71
+ &:where([data-state="active"]),
72
+ &:where([data-active]:not([data-active="false"])) {
73
+ @slot;
74
+ }
75
+ }
76
+
77
+ @custom-variant data-horizontal {
78
+ &:where([data-orientation="horizontal"]) {
79
+ @slot;
80
+ }
81
+ }
82
+
83
+ @custom-variant data-vertical {
84
+ &:where([data-orientation="vertical"]) {
85
+ @slot;
86
+ }
87
+ }
88
+
89
+ @utility no-scrollbar {
90
+ -ms-overflow-style: none;
91
+ scrollbar-width: none;
92
+
93
+ &::-webkit-scrollbar {
94
+ display: none;
95
+ }
96
+ }
97
+
98
+ /* scroll-fade */
99
+ @property --scroll-fade-t {
100
+ syntax: "<length-percentage>";
101
+ inherits: false;
102
+ initial-value: 0px;
103
+ }
104
+ @property --scroll-fade-b {
105
+ syntax: "<length-percentage>";
106
+ inherits: false;
107
+ initial-value: 0px;
108
+ }
109
+ @property --scroll-fade-s {
110
+ syntax: "<length-percentage>";
111
+ inherits: false;
112
+ initial-value: 0px;
113
+ }
114
+ @property --scroll-fade-e {
115
+ syntax: "<length-percentage>";
116
+ inherits: false;
117
+ initial-value: 0px;
118
+ }
119
+ @property --scroll-fade-mask {
120
+ syntax: "*";
121
+ inherits: false;
122
+ }
123
+
124
+ @theme inline {
125
+ @keyframes scroll-fade-reveal-t {
126
+ from {
127
+ --scroll-fade-t: 0px;
128
+ }
129
+ to {
130
+ --scroll-fade-t: var(--_scroll-fade-size-t, var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10))));
131
+ }
132
+ }
133
+ @keyframes scroll-fade-reveal-b {
134
+ from {
135
+ --scroll-fade-b: var(--_scroll-fade-size-b, var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10))));
136
+ }
137
+ to {
138
+ --scroll-fade-b: 0px;
139
+ }
140
+ }
141
+ @keyframes scroll-fade-reveal-s {
142
+ from {
143
+ --scroll-fade-s: 0px;
144
+ }
145
+ to {
146
+ --scroll-fade-s: var(--_scroll-fade-size-s, var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10))));
147
+ }
148
+ }
149
+ @keyframes scroll-fade-reveal-e {
150
+ from {
151
+ --scroll-fade-e: var(--_scroll-fade-size-e, var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10))));
152
+ }
153
+ to {
154
+ --scroll-fade-e: 0px;
155
+ }
156
+ }
157
+ }
158
+
159
+ @utility scroll-fade {
160
+ --_scroll-fade-size-t: var(
161
+ --scroll-fade-t-size,
162
+ var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10)))
163
+ );
164
+ --_scroll-fade-size-b: var(
165
+ --scroll-fade-b-size,
166
+ var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10)))
167
+ );
168
+ --scroll-fade-block: linear-gradient(
169
+ to bottom,
170
+ transparent 0,
171
+ #000 var(--scroll-fade-t, 0px),
172
+ #000 calc(100% - var(--scroll-fade-b, 0px)),
173
+ transparent 100%
174
+ );
175
+ -webkit-mask-image: var(--scroll-fade-mask, var(--scroll-fade-block));
176
+ mask-image: var(--scroll-fade-mask, var(--scroll-fade-block));
177
+ -webkit-mask-composite: source-in;
178
+ mask-composite: intersect;
179
+ -webkit-mask-repeat: no-repeat;
180
+ mask-repeat: no-repeat;
181
+
182
+ @supports (animation-timeline: scroll()) {
183
+ animation:
184
+ scroll-fade-reveal-t 1ms ease-in-out,
185
+ scroll-fade-reveal-b 1ms ease-in-out;
186
+ animation-timeline: scroll(self y), scroll(self y);
187
+ animation-range:
188
+ 0 var(--scroll-fade-reveal, calc(var(--spacing) * 24)),
189
+ calc(100% - var(--scroll-fade-reveal, calc(var(--spacing) * 24))) 100%;
190
+ animation-fill-mode: both;
191
+ }
192
+
193
+ @supports not (animation-timeline: scroll()) {
194
+ --scroll-fade-t: var(--_scroll-fade-size-t);
195
+ --scroll-fade-b: var(--_scroll-fade-size-b);
196
+ }
197
+ }
198
+
199
+ @utility scroll-fade-y {
200
+ --_scroll-fade-size-t: var(
201
+ --scroll-fade-t-size,
202
+ var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10)))
203
+ );
204
+ --_scroll-fade-size-b: var(
205
+ --scroll-fade-b-size,
206
+ var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10)))
207
+ );
208
+ --scroll-fade-block: linear-gradient(
209
+ to bottom,
210
+ transparent 0,
211
+ #000 var(--scroll-fade-t, 0px),
212
+ #000 calc(100% - var(--scroll-fade-b, 0px)),
213
+ transparent 100%
214
+ );
215
+ -webkit-mask-image: var(--scroll-fade-mask, var(--scroll-fade-block));
216
+ mask-image: var(--scroll-fade-mask, var(--scroll-fade-block));
217
+ -webkit-mask-composite: source-in;
218
+ mask-composite: intersect;
219
+ -webkit-mask-repeat: no-repeat;
220
+ mask-repeat: no-repeat;
221
+
222
+ @supports (animation-timeline: scroll()) {
223
+ animation:
224
+ scroll-fade-reveal-t 1ms ease-in-out,
225
+ scroll-fade-reveal-b 1ms ease-in-out;
226
+ animation-timeline: scroll(self y), scroll(self y);
227
+ animation-range:
228
+ 0 var(--scroll-fade-reveal, calc(var(--spacing) * 24)),
229
+ calc(100% - var(--scroll-fade-reveal, calc(var(--spacing) * 24))) 100%;
230
+ animation-fill-mode: both;
231
+ }
232
+
233
+ @supports not (animation-timeline: scroll()) {
234
+ --scroll-fade-t: var(--_scroll-fade-size-t);
235
+ --scroll-fade-b: var(--_scroll-fade-size-b);
236
+ }
237
+ }
238
+
239
+ @utility scroll-fade-x {
240
+ --_scroll-fade-size-s: var(
241
+ --scroll-fade-s-size,
242
+ var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10)))
243
+ );
244
+ --_scroll-fade-size-e: var(
245
+ --scroll-fade-e-size,
246
+ var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10)))
247
+ );
248
+ --scroll-fade-inline: linear-gradient(
249
+ to right,
250
+ transparent 0,
251
+ #000 var(--scroll-fade-s, 0px),
252
+ #000 calc(100% - var(--scroll-fade-e, 0px)),
253
+ transparent 100%
254
+ );
255
+ &:where([dir="rtl"], [dir="rtl"] *) {
256
+ --scroll-fade-inline: linear-gradient(
257
+ to left,
258
+ transparent 0,
259
+ #000 var(--scroll-fade-s, 0px),
260
+ #000 calc(100% - var(--scroll-fade-e, 0px)),
261
+ transparent 100%
262
+ );
263
+ }
264
+ -webkit-mask-image: var(--scroll-fade-mask, var(--scroll-fade-inline));
265
+ mask-image: var(--scroll-fade-mask, var(--scroll-fade-inline));
266
+ -webkit-mask-composite: source-in;
267
+ mask-composite: intersect;
268
+ -webkit-mask-repeat: no-repeat;
269
+ mask-repeat: no-repeat;
270
+
271
+ @supports (animation-timeline: scroll()) {
272
+ animation:
273
+ scroll-fade-reveal-s 1ms ease-in-out,
274
+ scroll-fade-reveal-e 1ms ease-in-out;
275
+ animation-timeline: scroll(self inline), scroll(self inline);
276
+ animation-range:
277
+ 0 var(--scroll-fade-reveal, calc(var(--spacing) * 24)),
278
+ calc(100% - var(--scroll-fade-reveal, calc(var(--spacing) * 24))) 100%;
279
+ animation-fill-mode: both;
280
+ }
281
+
282
+ @supports not (animation-timeline: scroll()) {
283
+ --scroll-fade-s: var(--_scroll-fade-size-s);
284
+ --scroll-fade-e: var(--_scroll-fade-size-e);
285
+ }
286
+ }
287
+
288
+ @utility scroll-fade-t {
289
+ --_scroll-fade-size-t: var(
290
+ --scroll-fade-t-size,
291
+ var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10)))
292
+ );
293
+ --scroll-fade-mask: linear-gradient(
294
+ to bottom,
295
+ transparent 0,
296
+ #000 var(--scroll-fade-t, 0px),
297
+ #000 100%
298
+ );
299
+ -webkit-mask-image: var(--scroll-fade-mask);
300
+ mask-image: var(--scroll-fade-mask);
301
+ -webkit-mask-composite: source-in;
302
+ mask-composite: intersect;
303
+ -webkit-mask-repeat: no-repeat;
304
+ mask-repeat: no-repeat;
305
+
306
+ @supports (animation-timeline: scroll()) {
307
+ animation: scroll-fade-reveal-t 1ms ease-in-out;
308
+ animation-timeline: scroll(self y);
309
+ animation-range: 0 var(--scroll-fade-reveal, calc(var(--spacing) * 24));
310
+ animation-fill-mode: both;
311
+ }
312
+
313
+ @supports not (animation-timeline: scroll()) {
314
+ --scroll-fade-t: var(--_scroll-fade-size-t);
315
+ }
316
+ }
317
+
318
+ @utility scroll-fade-b {
319
+ --_scroll-fade-size-b: var(
320
+ --scroll-fade-b-size,
321
+ var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10)))
322
+ );
323
+ --scroll-fade-mask: linear-gradient(
324
+ to bottom,
325
+ #000 0,
326
+ #000 calc(100% - var(--scroll-fade-b, 0px)),
327
+ transparent 100%
328
+ );
329
+ -webkit-mask-image: var(--scroll-fade-mask);
330
+ mask-image: var(--scroll-fade-mask);
331
+ -webkit-mask-composite: source-in;
332
+ mask-composite: intersect;
333
+ -webkit-mask-repeat: no-repeat;
334
+ mask-repeat: no-repeat;
335
+
336
+ @supports (animation-timeline: scroll()) {
337
+ animation: scroll-fade-reveal-b 1ms ease-in-out;
338
+ animation-timeline: scroll(self y);
339
+ animation-range: calc(
340
+ 100% - var(--scroll-fade-reveal, calc(var(--spacing) * 24))
341
+ )
342
+ 100%;
343
+ animation-fill-mode: both;
344
+ }
345
+
346
+ @supports not (animation-timeline: scroll()) {
347
+ --scroll-fade-b: var(--_scroll-fade-size-b);
348
+ }
349
+ }
350
+
351
+ @utility scroll-fade-l {
352
+ --_scroll-fade-size-s: var(
353
+ --scroll-fade-s-size,
354
+ var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10)))
355
+ );
356
+ --scroll-fade-mask: linear-gradient(
357
+ to right,
358
+ transparent 0,
359
+ #000 var(--scroll-fade-s, 0px),
360
+ #000 100%
361
+ );
362
+ -webkit-mask-image: var(--scroll-fade-mask);
363
+ mask-image: var(--scroll-fade-mask);
364
+ -webkit-mask-composite: source-in;
365
+ mask-composite: intersect;
366
+ -webkit-mask-repeat: no-repeat;
367
+ mask-repeat: no-repeat;
368
+
369
+ @supports (animation-timeline: scroll()) {
370
+ animation: scroll-fade-reveal-s 1ms ease-in-out;
371
+ animation-timeline: scroll(self x);
372
+ animation-range: 0 var(--scroll-fade-reveal, calc(var(--spacing) * 24));
373
+ animation-fill-mode: both;
374
+ }
375
+
376
+ @supports not (animation-timeline: scroll()) {
377
+ --scroll-fade-s: var(--_scroll-fade-size-s);
378
+ }
379
+ }
380
+
381
+ @utility scroll-fade-r {
382
+ --_scroll-fade-size-e: var(
383
+ --scroll-fade-e-size,
384
+ var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10)))
385
+ );
386
+ --scroll-fade-mask: linear-gradient(
387
+ to right,
388
+ #000 0,
389
+ #000 calc(100% - var(--scroll-fade-e, 0px)),
390
+ transparent 100%
391
+ );
392
+ -webkit-mask-image: var(--scroll-fade-mask);
393
+ mask-image: var(--scroll-fade-mask);
394
+ -webkit-mask-composite: source-in;
395
+ mask-composite: intersect;
396
+ -webkit-mask-repeat: no-repeat;
397
+ mask-repeat: no-repeat;
398
+
399
+ @supports (animation-timeline: scroll()) {
400
+ animation: scroll-fade-reveal-e 1ms ease-in-out;
401
+ animation-timeline: scroll(self x);
402
+ animation-range: calc(
403
+ 100% - var(--scroll-fade-reveal, calc(var(--spacing) * 24))
404
+ )
405
+ 100%;
406
+ animation-fill-mode: both;
407
+ }
408
+
409
+ @supports not (animation-timeline: scroll()) {
410
+ --scroll-fade-e: var(--_scroll-fade-size-e);
411
+ }
412
+ }
413
+
414
+ @utility scroll-fade-s {
415
+ --_scroll-fade-size-s: var(
416
+ --scroll-fade-s-size,
417
+ var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10)))
418
+ );
419
+ --scroll-fade-mask: linear-gradient(
420
+ to right,
421
+ transparent 0,
422
+ #000 var(--scroll-fade-s, 0px),
423
+ #000 100%
424
+ );
425
+ &:where([dir="rtl"], [dir="rtl"] *) {
426
+ --scroll-fade-mask: linear-gradient(
427
+ to left,
428
+ transparent 0,
429
+ #000 var(--scroll-fade-s, 0px),
430
+ #000 100%
431
+ );
432
+ }
433
+ -webkit-mask-image: var(--scroll-fade-mask);
434
+ mask-image: var(--scroll-fade-mask);
435
+ -webkit-mask-composite: source-in;
436
+ mask-composite: intersect;
437
+ -webkit-mask-repeat: no-repeat;
438
+ mask-repeat: no-repeat;
439
+
440
+ @supports (animation-timeline: scroll()) {
441
+ animation: scroll-fade-reveal-s 1ms ease-in-out;
442
+ animation-timeline: scroll(self inline);
443
+ animation-range: 0 var(--scroll-fade-reveal, calc(var(--spacing) * 24));
444
+ animation-fill-mode: both;
445
+ }
446
+
447
+ @supports not (animation-timeline: scroll()) {
448
+ --scroll-fade-s: var(--_scroll-fade-size-s);
449
+ }
450
+ }
451
+
452
+ @utility scroll-fade-e {
453
+ --_scroll-fade-size-e: var(
454
+ --scroll-fade-e-size,
455
+ var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10)))
456
+ );
457
+ --scroll-fade-mask: linear-gradient(
458
+ to right,
459
+ #000 0,
460
+ #000 calc(100% - var(--scroll-fade-e, 0px)),
461
+ transparent 100%
462
+ );
463
+ &:where([dir="rtl"], [dir="rtl"] *) {
464
+ --scroll-fade-mask: linear-gradient(
465
+ to left,
466
+ #000 0,
467
+ #000 calc(100% - var(--scroll-fade-e, 0px)),
468
+ transparent 100%
469
+ );
470
+ }
471
+ -webkit-mask-image: var(--scroll-fade-mask);
472
+ mask-image: var(--scroll-fade-mask);
473
+ -webkit-mask-composite: source-in;
474
+ mask-composite: intersect;
475
+ -webkit-mask-repeat: no-repeat;
476
+ mask-repeat: no-repeat;
477
+
478
+ @supports (animation-timeline: scroll()) {
479
+ animation: scroll-fade-reveal-e 1ms ease-in-out;
480
+ animation-timeline: scroll(self inline);
481
+ animation-range: calc(
482
+ 100% - var(--scroll-fade-reveal, calc(var(--spacing) * 24))
483
+ )
484
+ 100%;
485
+ animation-fill-mode: both;
486
+ }
487
+
488
+ @supports not (animation-timeline: scroll()) {
489
+ --scroll-fade-e: var(--_scroll-fade-size-e);
490
+ }
491
+ }
492
+
493
+ @utility scroll-fade-* {
494
+ --scroll-fade-size: calc(var(--spacing) * --value(integer));
495
+ --scroll-fade-size: --value([length], [percentage]);
496
+ }
497
+
498
+ @utility scroll-fade-t-* {
499
+ --scroll-fade-t-size: calc(var(--spacing) * --value(integer));
500
+ --scroll-fade-t-size: --value([length], [percentage]);
501
+ }
502
+
503
+ @utility scroll-fade-b-* {
504
+ --scroll-fade-b-size: calc(var(--spacing) * --value(integer));
505
+ --scroll-fade-b-size: --value([length], [percentage]);
506
+ }
507
+
508
+ @utility scroll-fade-s-* {
509
+ --scroll-fade-s-size: calc(var(--spacing) * --value(integer));
510
+ --scroll-fade-s-size: --value([length], [percentage]);
511
+ }
512
+
513
+ @utility scroll-fade-e-* {
514
+ --scroll-fade-e-size: calc(var(--spacing) * --value(integer));
515
+ --scroll-fade-e-size: --value([length], [percentage]);
516
+ }
517
+
518
+ @utility scroll-fade-none {
519
+ --scroll-fade-mask: none;
520
+ }
521
+
522
+ /* shimmer */
523
+ @property --shimmer-angle {
524
+ syntax: "<angle>";
525
+ inherits: true;
526
+ initial-value: 20deg;
527
+ }
528
+ @property --shimmer-image {
529
+ syntax: "*";
530
+ inherits: false;
531
+ }
532
+ @property --shimmer-text-fill {
533
+ syntax: "*";
534
+ inherits: false;
535
+ }
536
+
537
+ @theme inline {
538
+ @keyframes tw-shimmer {
539
+ from {
540
+ background-position: 100% 0;
541
+ }
542
+ to {
543
+ background-position: 0 0;
544
+ }
545
+ }
546
+ }
547
+
548
+ @utility shimmer {
549
+ --_spread: var(--shimmer-spread, calc(3ch + 40px));
550
+ --_base: currentColor;
551
+ --_highlight: var(
552
+ --shimmer-color,
553
+ oklch(from currentColor l c h / calc(alpha* 0.2))
554
+ );
555
+
556
+ background-image: var(
557
+ --shimmer-image,
558
+ linear-gradient(
559
+ calc(90deg + var(--shimmer-angle)),
560
+ var(--_base) calc(50% - var(--_spread)),
561
+ color-mix(in oklch, var(--_highlight), var(--_base) 50%)
562
+ calc(50% - var(--_spread) * 0.5),
563
+ var(--_highlight) 50%,
564
+ color-mix(in oklch, var(--_highlight), var(--_base) 50%)
565
+ calc(50% + var(--_spread) * 0.5),
566
+ var(--_base) calc(50% + var(--_spread))
567
+ )
568
+ );
569
+ background-repeat: no-repeat;
570
+ background-size: calc(200% + var(--_spread) * 2) 100%;
571
+ background-position: 0 0;
572
+ background-clip: text;
573
+ -webkit-background-clip: text;
574
+ -webkit-text-fill-color: var(--shimmer-text-fill, transparent);
575
+ animation: tw-shimmer var(--shimmer-duration, 2s) linear infinite;
576
+
577
+ @variant dark {
578
+ --_highlight: var(
579
+ --shimmer-color,
580
+ oklch(from currentColor max(0.8, calc(l + 0.4)) c h / calc(alpha + 0.4))
581
+ );
582
+ }
583
+
584
+ &:where([dir="rtl"], [dir="rtl"] *) {
585
+ animation-direction: reverse;
586
+ }
587
+
588
+ @media (prefers-reduced-motion: reduce) {
589
+ animation: none;
590
+ background-image: none;
591
+ -webkit-text-fill-color: currentColor;
592
+ }
593
+ }
594
+
595
+ @utility shimmer-once {
596
+ animation-iteration-count: 1;
597
+ }
598
+
599
+ @utility shimmer-reverse {
600
+ animation-direction: reverse;
601
+ }
602
+
603
+ @utility shimmer-none {
604
+ --shimmer-image: none;
605
+ --shimmer-text-fill: currentColor;
606
+ }
607
+
608
+ @utility shimmer-color-* {
609
+ --shimmer-color: --value(--color, [color]);
610
+ --shimmer-color: color-mix(
611
+ in oklch,
612
+ --value(--color, [color]) calc(--modifier(integer) * 1%),
613
+ transparent
614
+ );
615
+ }
616
+
617
+ @utility shimmer-duration-* {
618
+ --shimmer-duration: calc(--value(integer) * 1ms);
619
+ }
620
+
621
+ @utility shimmer-spread-* {
622
+ --shimmer-spread: calc(var(--spacing) * --value(integer));
623
+ --shimmer-spread: --value([length], [percentage]);
624
+ }
625
+
626
+ @utility shimmer-angle-* {
627
+ --shimmer-angle: calc(--value(integer) * 1deg);
628
+ }
629
+
630
+ /* Kept for backwards compatibility. Unlayered, so it still wins over other
631
+ utilities on a plain .shimmer element. Variants are handled in the utility. */
632
+ @media (prefers-reduced-motion: reduce) {
633
+ .shimmer {
634
+ animation: none;
635
+ background-image: none;
636
+ -webkit-text-fill-color: currentColor;
637
+ }
638
+ }
package/src/styles.css ADDED
@@ -0,0 +1,48 @@
1
+ /*
2
+ * Стили @mednet/ui. Проекту достаточно одной строки в globals.css:
3
+ * @import '@mednet/ui/styles.css';
4
+ * Tailwind подключён развёрнуто: бренд-правки (brand.css) должны стоять в слое utilities
5
+ * раньше утилит Tailwind — тогда они перекрывают сгенерированный класс shadcn, но уступают
6
+ * вариантам (hover:, aria-expanded:) и классам проекта. С обычным @import 'tailwindcss'
7
+ * блок @layer utilities из этого файла попадает после утилит (проверено прототипом).
8
+ */
9
+ @layer theme, base, components, utilities;
10
+ @import 'tailwindcss/theme.css' layer(theme);
11
+ @import 'tailwindcss/preflight.css' layer(base);
12
+ @import './brand.css' layer(utilities);
13
+ @import 'tailwindcss/utilities.css' layer(utilities);
14
+
15
+ /* Тема бренда: палитра Tailwind удалена, цвета только из токенов. */
16
+ @import '@mednet/tokens/theme.css';
17
+ @import 'tw-animate-css';
18
+ @import './shadcn-tailwind.css';
19
+ /* Montserrat self-hosted (спека D11): в 500.css все подмножества с unicode-range — браузер качает только нужные. */
20
+ @import '@fontsource/montserrat/500.css';
21
+ @import '@fontsource/montserrat/600.css';
22
+ @import '@fontsource/montserrat/700.css';
23
+
24
+ /* Классы компонентов живут в dist пакета, а node_modules Tailwind сам не сканирует. */
25
+ @source '../dist';
26
+
27
+ @layer base {
28
+ * {
29
+ @apply border-border outline-ring/50;
30
+ }
31
+
32
+ body {
33
+ @apply bg-background font-sans text-foreground;
34
+ /* текст 500 (спека §5), как body в @mednet/css */
35
+ font-weight: var(--mn-font-weight-body);
36
+ }
37
+
38
+ /* Вес заголовков бренда: Preflight Tailwind сбрасывает его до inherit. Размер — классом text-h1…text-h4 (он же задаёт вес). */
39
+ h1 {
40
+ font-weight: var(--mn-text-h1-font-weight);
41
+ }
42
+
43
+ h2,
44
+ h3,
45
+ h4 {
46
+ font-weight: var(--mn-text-h2-font-weight);
47
+ }
48
+ }