@ryanhelsing/ry-ui 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 (63) hide show
  1. package/README.md +223 -0
  2. package/dist/components/ry-accordion.d.ts +24 -0
  3. package/dist/components/ry-accordion.d.ts.map +1 -0
  4. package/dist/components/ry-alert.d.ts +19 -0
  5. package/dist/components/ry-alert.d.ts.map +1 -0
  6. package/dist/components/ry-button.d.ts +19 -0
  7. package/dist/components/ry-button.d.ts.map +1 -0
  8. package/dist/components/ry-code.d.ts +27 -0
  9. package/dist/components/ry-code.d.ts.map +1 -0
  10. package/dist/components/ry-color-input.d.ts +28 -0
  11. package/dist/components/ry-color-input.d.ts.map +1 -0
  12. package/dist/components/ry-color-picker.d.ts +52 -0
  13. package/dist/components/ry-color-picker.d.ts.map +1 -0
  14. package/dist/components/ry-drawer.d.ts +28 -0
  15. package/dist/components/ry-drawer.d.ts.map +1 -0
  16. package/dist/components/ry-dropdown.d.ts +24 -0
  17. package/dist/components/ry-dropdown.d.ts.map +1 -0
  18. package/dist/components/ry-example.d.ts +23 -0
  19. package/dist/components/ry-example.d.ts.map +1 -0
  20. package/dist/components/ry-field.d.ts +18 -0
  21. package/dist/components/ry-field.d.ts.map +1 -0
  22. package/dist/components/ry-icon.d.ts +27 -0
  23. package/dist/components/ry-icon.d.ts.map +1 -0
  24. package/dist/components/ry-knob.d.ts +27 -0
  25. package/dist/components/ry-knob.d.ts.map +1 -0
  26. package/dist/components/ry-modal.d.ts +23 -0
  27. package/dist/components/ry-modal.d.ts.map +1 -0
  28. package/dist/components/ry-select.d.ts +29 -0
  29. package/dist/components/ry-select.d.ts.map +1 -0
  30. package/dist/components/ry-slider.d.ts +30 -0
  31. package/dist/components/ry-slider.d.ts.map +1 -0
  32. package/dist/components/ry-switch.d.ts +22 -0
  33. package/dist/components/ry-switch.d.ts.map +1 -0
  34. package/dist/components/ry-tabs.d.ts +21 -0
  35. package/dist/components/ry-tabs.d.ts.map +1 -0
  36. package/dist/components/ry-theme-toggle.d.ts +21 -0
  37. package/dist/components/ry-theme-toggle.d.ts.map +1 -0
  38. package/dist/components/ry-toast.d.ts +31 -0
  39. package/dist/components/ry-toast.d.ts.map +1 -0
  40. package/dist/components/ry-toggle-button.d.ts +31 -0
  41. package/dist/components/ry-toggle-button.d.ts.map +1 -0
  42. package/dist/components/ry-tooltip.d.ts +23 -0
  43. package/dist/components/ry-tooltip.d.ts.map +1 -0
  44. package/dist/core/ry-element.d.ts +66 -0
  45. package/dist/core/ry-element.d.ts.map +1 -0
  46. package/dist/core/ry-icons.d.ts +38 -0
  47. package/dist/core/ry-icons.d.ts.map +1 -0
  48. package/dist/core/ry-transform.d.ts +35 -0
  49. package/dist/core/ry-transform.d.ts.map +1 -0
  50. package/dist/css/ry-base.css +155 -0
  51. package/dist/css/ry-components.css +1195 -0
  52. package/dist/css/ry-layout.css +240 -0
  53. package/dist/css/ry-structure.css +1737 -0
  54. package/dist/css/ry-theme.css +1433 -0
  55. package/dist/css/ry-tokens.css +145 -0
  56. package/dist/css/ry-ui.css +1207 -0
  57. package/dist/ry-ui.d.ts +54 -0
  58. package/dist/ry-ui.d.ts.map +1 -0
  59. package/dist/ry-ui.js +2433 -0
  60. package/dist/ry-ui.js.map +1 -0
  61. package/dist/types.d.ts +33 -0
  62. package/dist/types.d.ts.map +1 -0
  63. package/package.json +40 -0
@@ -0,0 +1,1195 @@
1
+ /**
2
+ * ry-ui Component Styles
3
+ *
4
+ * Styles for interactive and display components.
5
+ */
6
+
7
+ /* ═══════════════════════════════════════════════════════════════
8
+ BUTTONS
9
+ ═══════════════════════════════════════════════════════════════ */
10
+
11
+ .ry-btn,
12
+ ry-button {
13
+ display: inline-flex;
14
+ align-items: center;
15
+ justify-content: center;
16
+ gap: var(--ry-space-2);
17
+
18
+ padding: var(--ry-space-2) var(--ry-space-4);
19
+
20
+ font-family: var(--ry-font-sans);
21
+ font-size: var(--ry-text-sm);
22
+ font-weight: var(--ry-font-medium);
23
+ line-height: var(--ry-leading-normal);
24
+ text-decoration: none;
25
+ white-space: nowrap;
26
+
27
+ background-color: var(--ry-color-primary);
28
+ color: var(--ry-color-text-inverse);
29
+ border: var(--ry-border-width) solid transparent;
30
+ border-radius: var(--ry-radius-md);
31
+
32
+ cursor: pointer;
33
+ user-select: none;
34
+
35
+ transition-property: background-color, border-color, color, box-shadow;
36
+ transition-duration: var(--ry-duration-fast);
37
+ transition-timing-function: var(--ry-ease);
38
+ }
39
+
40
+ .ry-btn:hover,
41
+ ry-button:hover {
42
+ background-color: var(--ry-color-primary-hover);
43
+ }
44
+
45
+ .ry-btn:active,
46
+ ry-button:active {
47
+ background-color: var(--ry-color-primary-active);
48
+ }
49
+
50
+ .ry-btn:disabled,
51
+ .ry-btn[aria-disabled="true"],
52
+ ry-button[disabled] {
53
+ opacity: 0.5;
54
+ cursor: not-allowed;
55
+ pointer-events: none;
56
+ }
57
+
58
+ /* Button variants */
59
+ .ry-btn--secondary,
60
+ ry-button[variant="secondary"] {
61
+ background-color: var(--ry-color-secondary);
62
+ }
63
+ .ry-btn--secondary:hover,
64
+ ry-button[variant="secondary"]:hover {
65
+ background-color: var(--ry-color-secondary-hover);
66
+ }
67
+
68
+ .ry-btn--outline,
69
+ ry-button[variant="outline"] {
70
+ background-color: transparent;
71
+ color: var(--ry-color-primary);
72
+ border-color: var(--ry-color-primary);
73
+ }
74
+ .ry-btn--outline:hover,
75
+ ry-button[variant="outline"]:hover {
76
+ background-color: var(--ry-color-primary);
77
+ color: var(--ry-color-text-inverse);
78
+ }
79
+
80
+ .ry-btn--ghost,
81
+ ry-button[variant="ghost"] {
82
+ background-color: transparent;
83
+ color: var(--ry-color-text);
84
+ }
85
+ .ry-btn--ghost:hover,
86
+ ry-button[variant="ghost"]:hover {
87
+ background-color: var(--ry-color-bg-muted);
88
+ }
89
+
90
+ .ry-btn--danger,
91
+ ry-button[variant="danger"] {
92
+ background-color: var(--ry-color-danger);
93
+ }
94
+ .ry-btn--danger:hover,
95
+ ry-button[variant="danger"]:hover {
96
+ background-color: #dc2626;
97
+ }
98
+
99
+ /* Button sizes */
100
+ .ry-btn--sm,
101
+ ry-button[size="sm"] {
102
+ padding: var(--ry-space-1) var(--ry-space-3);
103
+ font-size: var(--ry-text-xs);
104
+ }
105
+
106
+ .ry-btn--lg,
107
+ ry-button[size="lg"] {
108
+ padding: var(--ry-space-3) var(--ry-space-6);
109
+ font-size: var(--ry-text-base);
110
+ }
111
+
112
+ /* ═══════════════════════════════════════════════════════════════
113
+ CARDS
114
+ ═══════════════════════════════════════════════════════════════ */
115
+
116
+ ry-card {
117
+ display: block;
118
+ padding: var(--ry-space-6);
119
+ background-color: var(--ry-color-bg);
120
+ border: var(--ry-border-width) solid var(--ry-color-border);
121
+ border-radius: var(--ry-radius-lg);
122
+ box-shadow: var(--ry-shadow-sm);
123
+ }
124
+
125
+ ry-card h3 {
126
+ margin: 0 0 var(--ry-space-2) 0;
127
+ font-size: var(--ry-text-lg);
128
+ font-weight: var(--ry-font-semibold);
129
+ }
130
+
131
+ ry-card p {
132
+ margin: 0 0 var(--ry-space-4) 0;
133
+ color: var(--ry-color-text-muted);
134
+ }
135
+
136
+ ry-card p:last-child {
137
+ margin-bottom: 0;
138
+ }
139
+
140
+ /* ═══════════════════════════════════════════════════════════════
141
+ BADGES
142
+ ═══════════════════════════════════════════════════════════════ */
143
+
144
+ .ry-badge,
145
+ ry-badge {
146
+ display: inline-flex;
147
+ align-items: center;
148
+ padding: var(--ry-space-1) var(--ry-space-2);
149
+
150
+ font-size: var(--ry-text-xs);
151
+ font-weight: var(--ry-font-medium);
152
+ line-height: 1;
153
+
154
+ background-color: var(--ry-color-bg-muted);
155
+ color: var(--ry-color-text);
156
+ border-radius: var(--ry-radius-full);
157
+ }
158
+
159
+ .ry-badge--primary,
160
+ ry-badge[variant="primary"] {
161
+ background-color: var(--ry-color-primary);
162
+ color: var(--ry-color-text-inverse);
163
+ }
164
+
165
+ .ry-badge--success,
166
+ ry-badge[variant="success"] {
167
+ background-color: var(--ry-color-success);
168
+ color: var(--ry-color-text-inverse);
169
+ }
170
+
171
+ .ry-badge--warning,
172
+ ry-badge[variant="warning"] {
173
+ background-color: var(--ry-color-warning);
174
+ color: var(--ry-color-text);
175
+ }
176
+
177
+ .ry-badge--danger,
178
+ ry-badge[variant="danger"] {
179
+ background-color: var(--ry-color-danger);
180
+ color: var(--ry-color-text-inverse);
181
+ }
182
+
183
+ /* ═══════════════════════════════════════════════════════════════
184
+ ALERTS
185
+ ═══════════════════════════════════════════════════════════════ */
186
+
187
+ .ry-alert,
188
+ ry-alert {
189
+ display: flex;
190
+ gap: var(--ry-space-3);
191
+ padding: var(--ry-space-4);
192
+
193
+ background-color: var(--ry-color-bg-subtle);
194
+ border: var(--ry-border-width) solid var(--ry-color-border);
195
+ border-radius: var(--ry-radius-lg);
196
+ }
197
+
198
+ .ry-alert--info,
199
+ ry-alert[type="info"] {
200
+ background-color: #ecfeff;
201
+ border-color: #06b6d4;
202
+ color: #0e7490;
203
+ }
204
+
205
+ .ry-alert--success,
206
+ ry-alert[type="success"] {
207
+ background-color: #f0fdf4;
208
+ border-color: #22c55e;
209
+ color: #15803d;
210
+ }
211
+
212
+ .ry-alert--warning,
213
+ ry-alert[type="warning"] {
214
+ background-color: #fffbeb;
215
+ border-color: #f59e0b;
216
+ color: #b45309;
217
+ }
218
+
219
+ .ry-alert--danger,
220
+ ry-alert[type="danger"] {
221
+ background-color: #fef2f2;
222
+ border-color: #ef4444;
223
+ color: #b91c1c;
224
+ }
225
+
226
+ .ry-alert__title,
227
+ ry-alert [slot="title"] {
228
+ margin: 0 0 var(--ry-space-1) 0;
229
+ font-weight: var(--ry-font-semibold);
230
+ }
231
+
232
+ .ry-alert__content,
233
+ ry-alert p {
234
+ margin: 0;
235
+ }
236
+
237
+ /* ═══════════════════════════════════════════════════════════════
238
+ FORM ELEMENTS
239
+ ═══════════════════════════════════════════════════════════════ */
240
+
241
+ .ry-input,
242
+ ry-field input,
243
+ ry-field textarea,
244
+ ry-field select {
245
+ display: block;
246
+ width: 100%;
247
+ padding: var(--ry-space-2) var(--ry-space-3);
248
+
249
+ font-family: var(--ry-font-sans);
250
+ font-size: var(--ry-text-base);
251
+ line-height: var(--ry-leading-normal);
252
+ color: var(--ry-color-text);
253
+
254
+ background-color: var(--ry-color-bg);
255
+ border: var(--ry-border-width) solid var(--ry-color-border);
256
+ border-radius: var(--ry-radius-md);
257
+
258
+ transition: border-color var(--ry-duration-fast) var(--ry-ease),
259
+ box-shadow var(--ry-duration-fast) var(--ry-ease);
260
+ }
261
+
262
+ .ry-input:hover,
263
+ ry-field input:hover,
264
+ ry-field textarea:hover {
265
+ border-color: var(--ry-color-border-strong);
266
+ }
267
+
268
+ .ry-input:focus,
269
+ ry-field input:focus,
270
+ ry-field textarea:focus {
271
+ outline: none;
272
+ border-color: var(--ry-color-primary);
273
+ box-shadow: var(--ry-focus-ring);
274
+ }
275
+
276
+ .ry-input::placeholder,
277
+ ry-field input::placeholder,
278
+ ry-field textarea::placeholder {
279
+ color: var(--ry-color-text-muted);
280
+ }
281
+
282
+ .ry-input:disabled,
283
+ ry-field input:disabled,
284
+ ry-field textarea:disabled {
285
+ background-color: var(--ry-color-bg-muted);
286
+ cursor: not-allowed;
287
+ opacity: 0.5;
288
+ }
289
+
290
+ .ry-label,
291
+ ry-field label {
292
+ display: block;
293
+ margin-bottom: var(--ry-space-2);
294
+ font-size: var(--ry-text-sm);
295
+ font-weight: var(--ry-font-medium);
296
+ color: var(--ry-color-text);
297
+ }
298
+
299
+ .ry-form-group,
300
+ ry-field {
301
+ display: block;
302
+ margin-bottom: var(--ry-space-4);
303
+ }
304
+
305
+ /* ═══════════════════════════════════════════════════════════════
306
+ ACCORDION
307
+ ═══════════════════════════════════════════════════════════════ */
308
+
309
+ ry-accordion {
310
+ border: var(--ry-border-width) solid var(--ry-color-border);
311
+ border-radius: var(--ry-radius-lg);
312
+ overflow: hidden;
313
+ }
314
+
315
+ .ry-accordion__item,
316
+ ry-accordion-item {
317
+ border-bottom: var(--ry-border-width) solid var(--ry-color-border);
318
+ }
319
+
320
+ .ry-accordion__item:last-child,
321
+ ry-accordion-item:last-child {
322
+ border-bottom: none;
323
+ }
324
+
325
+ .ry-accordion__trigger {
326
+ display: flex;
327
+ align-items: center;
328
+ justify-content: space-between;
329
+ width: 100%;
330
+ padding: var(--ry-space-4) var(--ry-space-6);
331
+
332
+ font-family: var(--ry-font-sans);
333
+ font-size: var(--ry-text-base);
334
+ font-weight: var(--ry-font-medium);
335
+ text-align: left;
336
+ color: var(--ry-color-text);
337
+
338
+ background-color: transparent;
339
+ border: none;
340
+ cursor: pointer;
341
+
342
+ transition: background-color var(--ry-duration-fast) var(--ry-ease);
343
+ }
344
+
345
+ .ry-accordion__trigger:hover {
346
+ background-color: var(--ry-color-bg-subtle);
347
+ }
348
+
349
+ .ry-accordion__trigger:focus-visible {
350
+ outline: none;
351
+ box-shadow: inset var(--ry-focus-ring);
352
+ }
353
+
354
+ .ry-accordion__icon {
355
+ flex-shrink: 0;
356
+ transition: transform var(--ry-duration-normal) var(--ry-ease);
357
+ }
358
+
359
+ .ry-accordion__item[data-ry-state="open"] .ry-accordion__icon {
360
+ transform: rotate(180deg);
361
+ }
362
+
363
+ .ry-accordion__panel {
364
+ overflow: hidden;
365
+ }
366
+
367
+ .ry-accordion__item[data-ry-state="closed"] .ry-accordion__panel {
368
+ display: none;
369
+ }
370
+
371
+ .ry-accordion__content {
372
+ padding: var(--ry-space-4) var(--ry-space-6);
373
+ color: var(--ry-color-text-muted);
374
+ }
375
+
376
+ /* ═══════════════════════════════════════════════════════════════
377
+ TABS
378
+ ═══════════════════════════════════════════════════════════════ */
379
+
380
+ ry-tabs {
381
+ display: block;
382
+ }
383
+
384
+ .ry-tabs__list {
385
+ display: flex;
386
+ gap: var(--ry-space-1);
387
+ border-bottom: var(--ry-border-width) solid var(--ry-color-border);
388
+ margin-bottom: var(--ry-space-4);
389
+ }
390
+
391
+ .ry-tabs__trigger {
392
+ padding: var(--ry-space-2) var(--ry-space-4);
393
+
394
+ font-family: var(--ry-font-sans);
395
+ font-size: var(--ry-text-sm);
396
+ font-weight: var(--ry-font-medium);
397
+ color: var(--ry-color-text-muted);
398
+
399
+ background: transparent;
400
+ border: none;
401
+ border-bottom: 2px solid transparent;
402
+ margin-bottom: -1px;
403
+ cursor: pointer;
404
+
405
+ transition: color var(--ry-duration-fast) var(--ry-ease),
406
+ border-color var(--ry-duration-fast) var(--ry-ease);
407
+ }
408
+
409
+ .ry-tabs__trigger:hover {
410
+ color: var(--ry-color-text);
411
+ }
412
+
413
+ .ry-tabs__trigger[aria-selected="true"] {
414
+ color: var(--ry-color-primary);
415
+ border-bottom-color: var(--ry-color-primary);
416
+ }
417
+
418
+ .ry-tabs__trigger:focus-visible {
419
+ outline: none;
420
+ box-shadow: var(--ry-focus-ring);
421
+ border-radius: var(--ry-radius-sm);
422
+ }
423
+
424
+ .ry-tabs__panel,
425
+ ry-tab {
426
+ display: none;
427
+ }
428
+
429
+ .ry-tabs__panel[data-ry-state="active"],
430
+ ry-tab[active],
431
+ ry-tab[data-ry-state="active"] {
432
+ display: block;
433
+ }
434
+
435
+ /* Before JS loads, show first panel */
436
+ ry-tabs:not(:defined) .ry-tabs__panel:first-of-type,
437
+ ry-tabs:not(:defined) ry-tab:first-of-type {
438
+ display: block;
439
+ }
440
+
441
+ /* ═══════════════════════════════════════════════════════════════
442
+ MODAL
443
+ ═══════════════════════════════════════════════════════════════ */
444
+
445
+ ry-modal {
446
+ display: contents;
447
+ }
448
+
449
+ .ry-modal__backdrop {
450
+ position: fixed;
451
+ inset: 0;
452
+ z-index: var(--ry-z-modal-backdrop);
453
+ background-color: var(--ry-color-overlay);
454
+
455
+ opacity: 0;
456
+ visibility: hidden;
457
+ transition: opacity var(--ry-duration-normal) var(--ry-ease),
458
+ visibility var(--ry-duration-normal) var(--ry-ease);
459
+ }
460
+
461
+ ry-modal[data-ry-state="open"] .ry-modal__backdrop {
462
+ opacity: 1;
463
+ visibility: visible;
464
+ }
465
+
466
+ .ry-modal__dialog {
467
+ position: fixed;
468
+ top: 50%;
469
+ left: 50%;
470
+ z-index: var(--ry-z-modal);
471
+
472
+ width: 100%;
473
+ max-width: 32rem;
474
+ max-height: calc(100vh - var(--ry-space-8));
475
+
476
+ background-color: var(--ry-color-bg);
477
+ border-radius: var(--ry-radius-xl);
478
+ box-shadow: var(--ry-shadow-xl);
479
+
480
+ overflow: auto;
481
+
482
+ opacity: 0;
483
+ visibility: hidden;
484
+ transform: translate(-50%, -50%) scale(0.95);
485
+ transition: opacity var(--ry-duration-normal) var(--ry-ease),
486
+ visibility var(--ry-duration-normal) var(--ry-ease),
487
+ transform var(--ry-duration-normal) var(--ry-ease);
488
+ }
489
+
490
+ ry-modal[data-ry-state="open"] .ry-modal__dialog {
491
+ opacity: 1;
492
+ visibility: visible;
493
+ transform: translate(-50%, -50%) scale(1);
494
+ }
495
+
496
+ .ry-modal__header {
497
+ display: flex;
498
+ align-items: center;
499
+ justify-content: space-between;
500
+ padding: var(--ry-space-4) var(--ry-space-6);
501
+ border-bottom: var(--ry-border-width) solid var(--ry-color-border);
502
+ }
503
+
504
+ .ry-modal__title {
505
+ margin: 0;
506
+ font-size: var(--ry-text-lg);
507
+ font-weight: var(--ry-font-semibold);
508
+ }
509
+
510
+ .ry-modal__close {
511
+ display: flex;
512
+ align-items: center;
513
+ justify-content: center;
514
+ width: 2rem;
515
+ height: 2rem;
516
+ padding: 0;
517
+
518
+ font-size: var(--ry-text-xl);
519
+ background: transparent;
520
+ border: none;
521
+ border-radius: var(--ry-radius-md);
522
+ color: var(--ry-color-text-muted);
523
+ cursor: pointer;
524
+
525
+ transition: background-color var(--ry-duration-fast) var(--ry-ease),
526
+ color var(--ry-duration-fast) var(--ry-ease);
527
+ }
528
+
529
+ .ry-modal__close:hover {
530
+ background-color: var(--ry-color-bg-muted);
531
+ color: var(--ry-color-text);
532
+ }
533
+
534
+ .ry-modal__body {
535
+ padding: var(--ry-space-6);
536
+ }
537
+
538
+ .ry-modal__footer {
539
+ display: flex;
540
+ justify-content: flex-end;
541
+ gap: var(--ry-space-3);
542
+ padding: var(--ry-space-4) var(--ry-space-6);
543
+ border-top: var(--ry-border-width) solid var(--ry-color-border);
544
+ background-color: var(--ry-color-bg-subtle);
545
+ }
546
+
547
+ /* ═══════════════════════════════════════════════════════════════
548
+ DROPDOWN
549
+ ═══════════════════════════════════════════════════════════════ */
550
+
551
+ ry-dropdown {
552
+ position: relative;
553
+ display: inline-block;
554
+ }
555
+
556
+ .ry-dropdown__menu,
557
+ ry-menu {
558
+ position: absolute;
559
+ top: 100%;
560
+ left: 0;
561
+ z-index: var(--ry-z-dropdown);
562
+
563
+ min-width: 12rem;
564
+ margin-top: var(--ry-space-1);
565
+ padding: var(--ry-space-1);
566
+
567
+ background-color: var(--ry-color-bg);
568
+ border: var(--ry-border-width) solid var(--ry-color-border);
569
+ border-radius: var(--ry-radius-lg);
570
+ box-shadow: var(--ry-shadow-lg);
571
+
572
+ opacity: 0;
573
+ visibility: hidden;
574
+ transform: translateY(-0.5rem);
575
+ transition: opacity var(--ry-duration-fast) var(--ry-ease),
576
+ visibility var(--ry-duration-fast) var(--ry-ease),
577
+ transform var(--ry-duration-fast) var(--ry-ease);
578
+ }
579
+
580
+ ry-dropdown[data-ry-state="open"] .ry-dropdown__menu,
581
+ ry-dropdown[data-ry-state="open"] ry-menu {
582
+ opacity: 1;
583
+ visibility: visible;
584
+ transform: translateY(0);
585
+ }
586
+
587
+ .ry-dropdown__item,
588
+ ry-menu-item {
589
+ display: block;
590
+ width: 100%;
591
+ padding: var(--ry-space-2) var(--ry-space-3);
592
+
593
+ font-family: var(--ry-font-sans);
594
+ font-size: var(--ry-text-sm);
595
+ text-align: left;
596
+ text-decoration: none;
597
+ color: var(--ry-color-text);
598
+
599
+ background: transparent;
600
+ border: none;
601
+ border-radius: var(--ry-radius-md);
602
+ cursor: pointer;
603
+
604
+ transition: background-color var(--ry-duration-fast) var(--ry-ease);
605
+ }
606
+
607
+ .ry-dropdown__item:hover,
608
+ ry-menu-item:hover {
609
+ background-color: var(--ry-color-bg-muted);
610
+ }
611
+
612
+ .ry-dropdown__item:focus-visible,
613
+ ry-menu-item:focus-visible {
614
+ outline: none;
615
+ box-shadow: inset var(--ry-focus-ring);
616
+ }
617
+
618
+ .ry-dropdown__divider {
619
+ height: 1px;
620
+ margin: var(--ry-space-1) 0;
621
+ background-color: var(--ry-color-border);
622
+ }
623
+
624
+ /* ═══════════════════════════════════════════════════════════════
625
+ KEYFRAMES
626
+ ═══════════════════════════════════════════════════════════════ */
627
+
628
+ @keyframes ry-fade-in {
629
+ from { opacity: 0; }
630
+ to { opacity: 1; }
631
+ }
632
+
633
+ @keyframes ry-fade-out {
634
+ from { opacity: 1; }
635
+ to { opacity: 0; }
636
+ }
637
+
638
+ @keyframes ry-slide-up {
639
+ from { transform: translateY(1rem); opacity: 0; }
640
+ to { transform: translateY(0); opacity: 1; }
641
+ }
642
+
643
+ @keyframes ry-slide-down {
644
+ from { transform: translateY(-1rem); opacity: 0; }
645
+ to { transform: translateY(0); opacity: 1; }
646
+ }
647
+
648
+ @keyframes ry-scale-in {
649
+ from { transform: scale(0.95); opacity: 0; }
650
+ to { transform: scale(1); opacity: 1; }
651
+ }
652
+
653
+ /* ═══════════════════════════════════════════════════════════════
654
+ SWITCH
655
+ ═══════════════════════════════════════════════════════════════ */
656
+
657
+ ry-switch {
658
+ display: inline-flex;
659
+ align-items: center;
660
+ gap: var(--ry-space-3);
661
+ cursor: pointer;
662
+ user-select: none;
663
+ }
664
+
665
+ ry-switch[disabled] {
666
+ opacity: 0.5;
667
+ cursor: not-allowed;
668
+ }
669
+
670
+ .ry-switch__track {
671
+ position: relative;
672
+ display: inline-flex;
673
+ width: 2.75rem;
674
+ height: 1.5rem;
675
+ flex-shrink: 0;
676
+
677
+ background-color: var(--ry-color-bg-muted);
678
+ border: var(--ry-border-width) solid var(--ry-color-border);
679
+ border-radius: var(--ry-radius-full);
680
+
681
+ transition: background-color var(--ry-duration-fast) var(--ry-ease),
682
+ border-color var(--ry-duration-fast) var(--ry-ease);
683
+ }
684
+
685
+ ry-switch[checked] .ry-switch__track {
686
+ background-color: var(--ry-color-primary);
687
+ border-color: var(--ry-color-primary);
688
+ }
689
+
690
+ .ry-switch__thumb {
691
+ position: absolute;
692
+ top: 2px;
693
+ left: 2px;
694
+ width: 1.125rem;
695
+ height: 1.125rem;
696
+
697
+ background-color: var(--ry-color-bg);
698
+ border-radius: var(--ry-radius-full);
699
+ box-shadow: var(--ry-shadow-sm);
700
+
701
+ transition: transform var(--ry-duration-fast) var(--ry-ease);
702
+ }
703
+
704
+ ry-switch[checked] .ry-switch__thumb {
705
+ transform: translateX(1.25rem);
706
+ }
707
+
708
+ .ry-switch__label {
709
+ font-size: var(--ry-text-sm);
710
+ font-weight: var(--ry-font-medium);
711
+ color: var(--ry-color-text);
712
+ }
713
+
714
+ .ry-switch__input {
715
+ position: absolute;
716
+ width: 1px;
717
+ height: 1px;
718
+ margin: -1px;
719
+ padding: 0;
720
+ overflow: hidden;
721
+ clip: rect(0, 0, 0, 0);
722
+ border: 0;
723
+ }
724
+
725
+ ry-switch:focus-visible {
726
+ outline: none;
727
+ }
728
+
729
+ ry-switch:focus-visible .ry-switch__track {
730
+ box-shadow: var(--ry-focus-ring);
731
+ }
732
+
733
+ /* ═══════════════════════════════════════════════════════════════
734
+ TOOLTIP
735
+ ═══════════════════════════════════════════════════════════════ */
736
+
737
+ ry-tooltip {
738
+ position: relative;
739
+ display: inline-block;
740
+ }
741
+
742
+ .ry-tooltip__content {
743
+ position: absolute;
744
+ z-index: var(--ry-z-tooltip);
745
+
746
+ padding: var(--ry-space-2) var(--ry-space-3);
747
+
748
+ font-size: var(--ry-text-xs);
749
+ font-weight: var(--ry-font-medium);
750
+ line-height: var(--ry-leading-tight);
751
+ white-space: nowrap;
752
+
753
+ background-color: var(--ry-color-text);
754
+ color: var(--ry-color-text-inverse);
755
+ border-radius: var(--ry-radius-md);
756
+
757
+ opacity: 0;
758
+ visibility: hidden;
759
+ pointer-events: none;
760
+
761
+ transition: opacity var(--ry-duration-fast) var(--ry-ease),
762
+ visibility var(--ry-duration-fast) var(--ry-ease);
763
+ }
764
+
765
+ ry-tooltip[data-ry-state="open"] .ry-tooltip__content {
766
+ opacity: 1;
767
+ visibility: visible;
768
+ }
769
+
770
+ /* Position offsets */
771
+ ry-tooltip[data-ry-position="top"] .ry-tooltip__content {
772
+ margin-bottom: var(--ry-space-2);
773
+ }
774
+
775
+ ry-tooltip[data-ry-position="bottom"] .ry-tooltip__content {
776
+ margin-top: var(--ry-space-2);
777
+ }
778
+
779
+ ry-tooltip[data-ry-position="left"] .ry-tooltip__content {
780
+ margin-right: var(--ry-space-2);
781
+ }
782
+
783
+ ry-tooltip[data-ry-position="right"] .ry-tooltip__content {
784
+ margin-left: var(--ry-space-2);
785
+ }
786
+
787
+ /* ═══════════════════════════════════════════════════════════════
788
+ DRAWER
789
+ ═══════════════════════════════════════════════════════════════ */
790
+
791
+ ry-drawer {
792
+ display: contents;
793
+ }
794
+
795
+ .ry-drawer__backdrop {
796
+ position: fixed;
797
+ inset: 0;
798
+ z-index: var(--ry-z-modal-backdrop);
799
+ background-color: var(--ry-color-overlay);
800
+
801
+ opacity: 0;
802
+ visibility: hidden;
803
+ transition: opacity var(--ry-duration-normal) var(--ry-ease),
804
+ visibility var(--ry-duration-normal) var(--ry-ease);
805
+ }
806
+
807
+ ry-drawer[data-ry-state="open"] .ry-drawer__backdrop {
808
+ opacity: 1;
809
+ visibility: visible;
810
+ }
811
+
812
+ .ry-drawer__panel {
813
+ position: fixed;
814
+ z-index: var(--ry-z-modal);
815
+
816
+ background-color: var(--ry-color-bg);
817
+ box-shadow: var(--ry-shadow-xl);
818
+
819
+ opacity: 0;
820
+ visibility: hidden;
821
+ transition: opacity var(--ry-duration-normal) var(--ry-ease),
822
+ visibility var(--ry-duration-normal) var(--ry-ease),
823
+ transform var(--ry-duration-normal) var(--ry-ease);
824
+ }
825
+
826
+ ry-drawer[data-ry-state="open"] .ry-drawer__panel {
827
+ opacity: 1;
828
+ visibility: visible;
829
+ }
830
+
831
+ /* Left drawer */
832
+ .ry-drawer__panel[data-ry-side="left"] {
833
+ top: 0;
834
+ left: 0;
835
+ bottom: 0;
836
+ width: 20rem;
837
+ max-width: 100%;
838
+ transform: translateX(-100%);
839
+ }
840
+
841
+ ry-drawer[data-ry-state="open"] .ry-drawer__panel[data-ry-side="left"] {
842
+ transform: translateX(0);
843
+ }
844
+
845
+ /* Right drawer */
846
+ .ry-drawer__panel[data-ry-side="right"] {
847
+ top: 0;
848
+ right: 0;
849
+ bottom: 0;
850
+ width: 20rem;
851
+ max-width: 100%;
852
+ transform: translateX(100%);
853
+ }
854
+
855
+ ry-drawer[data-ry-state="open"] .ry-drawer__panel[data-ry-side="right"] {
856
+ transform: translateX(0);
857
+ }
858
+
859
+ /* Top drawer */
860
+ .ry-drawer__panel[data-ry-side="top"] {
861
+ top: 0;
862
+ left: 0;
863
+ right: 0;
864
+ height: auto;
865
+ max-height: 80vh;
866
+ transform: translateY(-100%);
867
+ }
868
+
869
+ ry-drawer[data-ry-state="open"] .ry-drawer__panel[data-ry-side="top"] {
870
+ transform: translateY(0);
871
+ }
872
+
873
+ /* Bottom drawer */
874
+ .ry-drawer__panel[data-ry-side="bottom"] {
875
+ bottom: 0;
876
+ left: 0;
877
+ right: 0;
878
+ height: auto;
879
+ max-height: 80vh;
880
+ border-radius: var(--ry-radius-xl) var(--ry-radius-xl) 0 0;
881
+ transform: translateY(100%);
882
+ }
883
+
884
+ ry-drawer[data-ry-state="open"] .ry-drawer__panel[data-ry-side="bottom"] {
885
+ transform: translateY(0);
886
+ }
887
+
888
+ .ry-drawer__close {
889
+ position: absolute;
890
+ top: var(--ry-space-4);
891
+ right: var(--ry-space-4);
892
+
893
+ display: flex;
894
+ align-items: center;
895
+ justify-content: center;
896
+ width: 2rem;
897
+ height: 2rem;
898
+ padding: 0;
899
+
900
+ font-size: var(--ry-text-xl);
901
+ background: transparent;
902
+ border: none;
903
+ border-radius: var(--ry-radius-md);
904
+ color: var(--ry-color-text-muted);
905
+ cursor: pointer;
906
+
907
+ transition: background-color var(--ry-duration-fast) var(--ry-ease),
908
+ color var(--ry-duration-fast) var(--ry-ease);
909
+ }
910
+
911
+ .ry-drawer__close:hover {
912
+ background-color: var(--ry-color-bg-muted);
913
+ color: var(--ry-color-text);
914
+ }
915
+
916
+ .ry-drawer__content {
917
+ padding: var(--ry-space-6);
918
+ padding-top: var(--ry-space-12);
919
+ overflow-y: auto;
920
+ height: 100%;
921
+ }
922
+
923
+ /* ═══════════════════════════════════════════════════════════════
924
+ TOAST
925
+ ═══════════════════════════════════════════════════════════════ */
926
+
927
+ .ry-toast-container {
928
+ position: fixed;
929
+ top: var(--ry-space-4);
930
+ right: var(--ry-space-4);
931
+ z-index: var(--ry-z-toast);
932
+
933
+ display: flex;
934
+ flex-direction: column;
935
+ gap: var(--ry-space-3);
936
+
937
+ max-width: 24rem;
938
+ pointer-events: none;
939
+ }
940
+
941
+ ry-toast {
942
+ display: flex;
943
+ align-items: flex-start;
944
+ gap: var(--ry-space-3);
945
+
946
+ padding: var(--ry-space-4);
947
+
948
+ font-family: var(--ry-font-sans);
949
+ background-color: var(--ry-color-bg);
950
+ border: var(--ry-border-width) solid var(--ry-color-border);
951
+ border-radius: var(--ry-radius-lg);
952
+ box-shadow: var(--ry-shadow-lg);
953
+
954
+ pointer-events: auto;
955
+
956
+ opacity: 0;
957
+ transform: translateX(1rem);
958
+ transition: opacity var(--ry-duration-normal) var(--ry-ease),
959
+ transform var(--ry-duration-normal) var(--ry-ease);
960
+ }
961
+
962
+ ry-toast[data-ry-state="visible"] {
963
+ opacity: 1;
964
+ transform: translateX(0);
965
+ }
966
+
967
+ ry-toast[data-ry-state="hiding"] {
968
+ opacity: 0;
969
+ transform: translateX(1rem);
970
+ }
971
+
972
+ .ry-toast__icon {
973
+ flex-shrink: 0;
974
+ width: 1.25rem;
975
+ height: 1.25rem;
976
+ display: flex;
977
+ align-items: center;
978
+ justify-content: center;
979
+ font-size: var(--ry-text-sm);
980
+ }
981
+
982
+ ry-toast[type="info"] .ry-toast__icon {
983
+ color: #06b6d4;
984
+ }
985
+
986
+ ry-toast[type="success"] .ry-toast__icon {
987
+ color: var(--ry-color-success);
988
+ }
989
+
990
+ ry-toast[type="warning"] .ry-toast__icon {
991
+ color: var(--ry-color-warning);
992
+ }
993
+
994
+ ry-toast[type="error"] .ry-toast__icon {
995
+ color: var(--ry-color-danger);
996
+ }
997
+
998
+ .ry-toast__content {
999
+ flex: 1;
1000
+ font-size: var(--ry-text-sm);
1001
+ color: var(--ry-color-text);
1002
+ line-height: var(--ry-leading-normal);
1003
+ }
1004
+
1005
+ .ry-toast__close {
1006
+ flex-shrink: 0;
1007
+ display: flex;
1008
+ align-items: center;
1009
+ justify-content: center;
1010
+ width: 1.5rem;
1011
+ height: 1.5rem;
1012
+ padding: 0;
1013
+ margin: calc(var(--ry-space-1) * -1);
1014
+
1015
+ font-size: var(--ry-text-lg);
1016
+ background: transparent;
1017
+ border: none;
1018
+ border-radius: var(--ry-radius-sm);
1019
+ color: var(--ry-color-text-muted);
1020
+ cursor: pointer;
1021
+
1022
+ transition: background-color var(--ry-duration-fast) var(--ry-ease),
1023
+ color var(--ry-duration-fast) var(--ry-ease);
1024
+ }
1025
+
1026
+ .ry-toast__close:hover {
1027
+ background-color: var(--ry-color-bg-muted);
1028
+ color: var(--ry-color-text);
1029
+ }
1030
+
1031
+ /* ═══════════════════════════════════════════════════════════════
1032
+ SELECT
1033
+ ═══════════════════════════════════════════════════════════════ */
1034
+
1035
+ ry-select {
1036
+ position: relative;
1037
+ display: inline-block;
1038
+ min-width: 12rem;
1039
+ }
1040
+
1041
+ ry-select[disabled] {
1042
+ opacity: 0.5;
1043
+ cursor: not-allowed;
1044
+ }
1045
+
1046
+ .ry-select__trigger {
1047
+ display: flex;
1048
+ align-items: center;
1049
+ justify-content: space-between;
1050
+ gap: var(--ry-space-2);
1051
+
1052
+ width: 100%;
1053
+ padding: var(--ry-space-2) var(--ry-space-3);
1054
+
1055
+ font-family: var(--ry-font-sans);
1056
+ font-size: var(--ry-text-base);
1057
+ line-height: var(--ry-leading-normal);
1058
+
1059
+ background-color: var(--ry-color-bg);
1060
+ border: var(--ry-border-width) solid var(--ry-color-border);
1061
+ border-radius: var(--ry-radius-md);
1062
+
1063
+ cursor: pointer;
1064
+
1065
+ transition: border-color var(--ry-duration-fast) var(--ry-ease),
1066
+ box-shadow var(--ry-duration-fast) var(--ry-ease);
1067
+ }
1068
+
1069
+ ry-select:hover .ry-select__trigger {
1070
+ border-color: var(--ry-color-border-strong);
1071
+ }
1072
+
1073
+ ry-select:focus-visible .ry-select__trigger {
1074
+ outline: none;
1075
+ border-color: var(--ry-color-primary);
1076
+ box-shadow: var(--ry-focus-ring);
1077
+ }
1078
+
1079
+ ry-select[data-ry-state="open"] .ry-select__trigger {
1080
+ border-color: var(--ry-color-primary);
1081
+ }
1082
+
1083
+ .ry-select__value {
1084
+ flex: 1;
1085
+ overflow: hidden;
1086
+ text-overflow: ellipsis;
1087
+ white-space: nowrap;
1088
+ color: var(--ry-color-text-muted);
1089
+ }
1090
+
1091
+ .ry-select__value--selected {
1092
+ color: var(--ry-color-text);
1093
+ }
1094
+
1095
+ .ry-select__arrow {
1096
+ flex-shrink: 0;
1097
+ font-size: var(--ry-text-xs);
1098
+ color: var(--ry-color-text-muted);
1099
+ transition: transform var(--ry-duration-fast) var(--ry-ease);
1100
+ }
1101
+
1102
+ ry-select[data-ry-state="open"] .ry-select__arrow {
1103
+ transform: rotate(180deg);
1104
+ }
1105
+
1106
+ .ry-select__dropdown {
1107
+ position: absolute;
1108
+ top: 100%;
1109
+ left: 0;
1110
+ right: 0;
1111
+ z-index: var(--ry-z-dropdown);
1112
+
1113
+ margin-top: var(--ry-space-1);
1114
+ padding: var(--ry-space-1);
1115
+ max-height: 15rem;
1116
+ overflow-y: auto;
1117
+
1118
+ background-color: var(--ry-color-bg);
1119
+ border: var(--ry-border-width) solid var(--ry-color-border);
1120
+ border-radius: var(--ry-radius-lg);
1121
+ box-shadow: var(--ry-shadow-lg);
1122
+
1123
+ opacity: 0;
1124
+ visibility: hidden;
1125
+ transform: translateY(-0.5rem);
1126
+ transition: opacity var(--ry-duration-fast) var(--ry-ease),
1127
+ visibility var(--ry-duration-fast) var(--ry-ease),
1128
+ transform var(--ry-duration-fast) var(--ry-ease);
1129
+ }
1130
+
1131
+ ry-select[data-ry-state="open"] .ry-select__dropdown {
1132
+ opacity: 1;
1133
+ visibility: visible;
1134
+ transform: translateY(0);
1135
+ }
1136
+
1137
+ /* Dropdown flipped to top when near bottom of screen */
1138
+ ry-select[data-ry-position="top"] .ry-select__dropdown {
1139
+ top: auto;
1140
+ bottom: 100%;
1141
+ margin-top: 0;
1142
+ margin-bottom: var(--ry-space-1);
1143
+ transform: translateY(0.5rem);
1144
+ }
1145
+
1146
+ ry-select[data-ry-position="top"][data-ry-state="open"] .ry-select__dropdown {
1147
+ transform: translateY(0);
1148
+ }
1149
+
1150
+ .ry-select__option {
1151
+ padding: var(--ry-space-2) var(--ry-space-3);
1152
+
1153
+ font-size: var(--ry-text-sm);
1154
+ color: var(--ry-color-text);
1155
+
1156
+ border-radius: var(--ry-radius-md);
1157
+ cursor: pointer;
1158
+
1159
+ transition: background-color var(--ry-duration-fast) var(--ry-ease);
1160
+ }
1161
+
1162
+ .ry-select__option:hover,
1163
+ .ry-select__option[data-highlighted] {
1164
+ background-color: var(--ry-color-bg-muted);
1165
+ }
1166
+
1167
+ .ry-select__option[aria-selected="true"] {
1168
+ background-color: var(--ry-color-primary);
1169
+ color: var(--ry-color-text-inverse);
1170
+ }
1171
+
1172
+ .ry-select__option[data-disabled] {
1173
+ opacity: 0.5;
1174
+ cursor: not-allowed;
1175
+ }
1176
+
1177
+ .ry-select__option[data-disabled]:hover {
1178
+ background-color: transparent;
1179
+ }
1180
+
1181
+ .ry-select__native {
1182
+ position: absolute;
1183
+ width: 1px;
1184
+ height: 1px;
1185
+ margin: -1px;
1186
+ padding: 0;
1187
+ overflow: hidden;
1188
+ clip: rect(0, 0, 0, 0);
1189
+ border: 0;
1190
+ }
1191
+
1192
+ /* Hide placeholder ry-option elements */
1193
+ ry-option {
1194
+ display: none;
1195
+ }