@ryanhelsing/ry-ui 1.0.1 → 1.0.3

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 (59) hide show
  1. package/AGENTS.md +56 -0
  2. package/README.md +28 -1
  3. package/dist/components/ry-carousel.d.ts +21 -0
  4. package/dist/components/ry-carousel.d.ts.map +1 -0
  5. package/dist/components/ry-dropdown.d.ts.map +1 -1
  6. package/dist/components/ry-example.d.ts +1 -1
  7. package/dist/components/ry-feature.d.ts +21 -0
  8. package/dist/components/ry-feature.d.ts.map +1 -0
  9. package/dist/components/ry-gradient-picker.d.ts +39 -0
  10. package/dist/components/ry-gradient-picker.d.ts.map +1 -0
  11. package/dist/components/ry-hero.d.ts +16 -0
  12. package/dist/components/ry-hero.d.ts.map +1 -0
  13. package/dist/components/ry-number-select.d.ts +30 -0
  14. package/dist/components/ry-number-select.d.ts.map +1 -0
  15. package/dist/components/ry-pricing.d.ts +21 -0
  16. package/dist/components/ry-pricing.d.ts.map +1 -0
  17. package/dist/components/ry-select.d.ts +8 -1
  18. package/dist/components/ry-select.d.ts.map +1 -1
  19. package/dist/components/ry-stat.d.ts +17 -0
  20. package/dist/components/ry-stat.d.ts.map +1 -0
  21. package/dist/components/ry-tag-input.d.ts +18 -0
  22. package/dist/components/ry-tag-input.d.ts.map +1 -0
  23. package/dist/components/ry-tag.d.ts +19 -0
  24. package/dist/components/ry-tag.d.ts.map +1 -0
  25. package/dist/components/ry-tree.d.ts +41 -0
  26. package/dist/components/ry-tree.d.ts.map +1 -0
  27. package/dist/core/ry-icons.d.ts.map +1 -1
  28. package/dist/core/ry-transform.d.ts.map +1 -1
  29. package/dist/css/ry-structure.css +1020 -95
  30. package/dist/css/ry-theme.css +772 -145
  31. package/dist/css/ry-tokens.css +112 -24
  32. package/dist/css/ry-ui.css +4713 -927
  33. package/dist/ry-ui.d.ts +12 -0
  34. package/dist/ry-ui.d.ts.map +1 -1
  35. package/dist/ry-ui.js +1838 -544
  36. package/dist/ry-ui.js.map +1 -1
  37. package/dist/themes/dark.css +7 -90
  38. package/dist/themes/light.css +6 -35
  39. package/dist/themes/ocean.css +22 -26
  40. package/docs/components/accordion.md +31 -0
  41. package/docs/components/button.md +65 -0
  42. package/docs/components/color.md +84 -0
  43. package/docs/components/display.md +69 -0
  44. package/docs/components/drawer.md +36 -0
  45. package/docs/components/dropdown.md +33 -0
  46. package/docs/components/forms.md +86 -0
  47. package/docs/components/knob.md +42 -0
  48. package/docs/components/layout.md +189 -0
  49. package/docs/components/modal.md +38 -0
  50. package/docs/components/number-select.md +42 -0
  51. package/docs/components/slider.md +48 -0
  52. package/docs/components/tabs.md +30 -0
  53. package/docs/components/theme-toggle.md +36 -0
  54. package/docs/components/toast.md +27 -0
  55. package/docs/components/tooltip.md +14 -0
  56. package/docs/components/tree.md +46 -0
  57. package/docs/theming.md +182 -0
  58. package/package.json +5 -3
  59. package/USING_CDN.md +0 -390
@@ -6,6 +6,8 @@
6
6
  * Override these styles or swap with your own theme.
7
7
  */
8
8
 
9
+ @layer ry-theme {
10
+
9
11
  /* ═══════════════════════════════════════════════════════════════
10
12
  BASE / BODY
11
13
  ═══════════════════════════════════════════════════════════════ */
@@ -18,11 +20,7 @@ html {
18
20
  FOCUS STYLES
19
21
  ═══════════════════════════════════════════════════════════════ */
20
22
 
21
- [class^="ry-"]:focus-visible,
22
- [class*=" ry-"]:focus-visible,
23
- ry-button:focus-visible,
24
- .ry-btn:focus-visible,
25
- .ry-input:focus-visible {
23
+ :is([class^="ry-"], [class*=" ry-"], ry-button, .ry-btn, .ry-input):focus-visible {
26
24
  outline: none;
27
25
  box-shadow: var(--ry-focus-ring);
28
26
  }
@@ -39,7 +37,7 @@ ry-page {
39
37
  background-color: var(--ry-color-bg);
40
38
  }
41
39
 
42
- ry-page h1, ry-page h2, ry-page h3, ry-page h4, ry-page h5, ry-page h6 {
40
+ ry-page :is(h1, h2, h3, h4, h5, h6) {
43
41
  margin: 0 0 var(--ry-space-4) 0;
44
42
  font-weight: var(--ry-font-semibold);
45
43
  line-height: var(--ry-leading-tight);
@@ -70,7 +68,7 @@ ry-page a:hover {
70
68
 
71
69
  ry-header {
72
70
  background-color: var(--ry-color-bg);
73
- border-bottom: var(--ry-border-width) solid var(--ry-color-border);
71
+ border-block-end: var(--ry-border-width) solid var(--ry-color-border);
74
72
  }
75
73
 
76
74
  /* ═══════════════════════════════════════════════════════════════
@@ -79,7 +77,7 @@ ry-header {
79
77
 
80
78
  ry-footer {
81
79
  background-color: var(--ry-color-bg-subtle);
82
- border-top: var(--ry-border-width) solid var(--ry-color-border);
80
+ border-block-start: var(--ry-border-width) solid var(--ry-color-border);
83
81
  color: var(--ry-color-text-muted);
84
82
  }
85
83
 
@@ -124,8 +122,7 @@ ry-divider {
124
122
  BUTTONS
125
123
  ═══════════════════════════════════════════════════════════════ */
126
124
 
127
- .ry-btn,
128
- ry-button {
125
+ :is(.ry-btn, ry-button) {
129
126
  font-family: var(--ry-font-sans);
130
127
  font-size: var(--ry-text-sm);
131
128
  font-weight: var(--ry-font-medium);
@@ -142,71 +139,57 @@ ry-button {
142
139
  transition-timing-function: var(--ry-ease);
143
140
  }
144
141
 
145
- .ry-btn:hover,
146
- ry-button:hover {
142
+ :is(.ry-btn, ry-button):hover {
147
143
  background-color: var(--ry-color-primary-hover);
148
144
  }
149
145
 
150
- .ry-btn:active,
151
- ry-button:active {
146
+ :is(.ry-btn, ry-button):active {
152
147
  background-color: var(--ry-color-primary-active);
153
148
  }
154
149
 
155
- .ry-btn:disabled,
156
- .ry-btn[aria-disabled="true"],
157
- ry-button[disabled] {
150
+ :is(.ry-btn:disabled, .ry-btn[aria-disabled="true"], ry-button[disabled]) {
158
151
  opacity: 0.5;
159
152
  }
160
153
 
161
154
  /* Button variants */
162
- .ry-btn--secondary,
163
- ry-button[variant="secondary"] {
155
+ :is(.ry-btn--secondary, ry-button[variant="secondary"]) {
164
156
  background-color: var(--ry-color-secondary);
165
157
  }
166
- .ry-btn--secondary:hover,
167
- ry-button[variant="secondary"]:hover {
158
+ :is(.ry-btn--secondary, ry-button[variant="secondary"]):hover {
168
159
  background-color: var(--ry-color-secondary-hover);
169
160
  }
170
161
 
171
- .ry-btn--outline,
172
- ry-button[variant="outline"] {
162
+ :is(.ry-btn--outline, ry-button[variant="outline"]) {
173
163
  background-color: transparent;
174
164
  color: var(--ry-color-primary);
175
165
  border-color: var(--ry-color-primary);
176
166
  }
177
- .ry-btn--outline:hover,
178
- ry-button[variant="outline"]:hover {
167
+ :is(.ry-btn--outline, ry-button[variant="outline"]):hover {
179
168
  background-color: var(--ry-color-primary);
180
169
  color: var(--ry-color-text-inverse);
181
170
  }
182
171
 
183
- .ry-btn--ghost,
184
- ry-button[variant="ghost"] {
172
+ :is(.ry-btn--ghost, ry-button[variant="ghost"]) {
185
173
  background-color: transparent;
186
174
  color: var(--ry-color-text);
187
175
  }
188
- .ry-btn--ghost:hover,
189
- ry-button[variant="ghost"]:hover {
176
+ :is(.ry-btn--ghost, ry-button[variant="ghost"]):hover {
190
177
  background-color: var(--ry-color-bg-muted);
191
178
  }
192
179
 
193
- .ry-btn--danger,
194
- ry-button[variant="danger"] {
180
+ :is(.ry-btn--danger, ry-button[variant="danger"]) {
195
181
  background-color: var(--ry-color-danger);
196
182
  }
197
- .ry-btn--danger:hover,
198
- ry-button[variant="danger"]:hover {
199
- background-color: var(--ry-color-danger-hover, #dc2626);
183
+ :is(.ry-btn--danger, ry-button[variant="danger"]):hover {
184
+ background-color: var(--ry-color-danger-hover);
200
185
  }
201
186
 
202
187
  /* Button sizes (typography only - padding is structural) */
203
- .ry-btn--sm,
204
- ry-button[size="sm"] {
188
+ :is(.ry-btn--sm, ry-button[size="sm"]) {
205
189
  font-size: var(--ry-text-xs);
206
190
  }
207
191
 
208
- .ry-btn--lg,
209
- ry-button[size="lg"] {
192
+ :is(.ry-btn--lg, ry-button[size="lg"]) {
210
193
  font-size: var(--ry-text-base);
211
194
  }
212
195
 
@@ -418,6 +401,213 @@ ry-knob[color="danger"] [data-ry-target="ring"] {
418
401
  }
419
402
  ry-knob[color="danger"] [data-ry-target="indicator"] { background-color: var(--ry-color-danger); }
420
403
 
404
+ /* ═══════════════════════════════════════════════════════════════
405
+ NUMBER SELECT
406
+ ═══════════════════════════════════════════════════════════════ */
407
+
408
+ .ry-number-select__btn {
409
+ background: var(--ry-color-bg);
410
+ border: var(--ry-border-width) solid var(--ry-color-border);
411
+ color: var(--ry-color-text);
412
+ transition: background-color var(--ry-duration-fast) var(--ry-ease),
413
+ border-color var(--ry-duration-fast) var(--ry-ease);
414
+ }
415
+
416
+ .ry-number-select__btn:hover {
417
+ background-color: var(--ry-color-bg-muted);
418
+ border-color: var(--ry-color-border-strong);
419
+ }
420
+
421
+ .ry-number-select__btn:active {
422
+ background-color: var(--ry-color-bg-subtle);
423
+ }
424
+
425
+ .ry-number-select__decrement {
426
+ border-start-start-radius: var(--ry-radius-md);
427
+ border-end-start-radius: var(--ry-radius-md);
428
+ border-start-end-radius: 0;
429
+ border-end-end-radius: 0;
430
+ border-inline-end: none;
431
+ }
432
+
433
+ .ry-number-select__increment {
434
+ border-start-start-radius: 0;
435
+ border-end-start-radius: 0;
436
+ border-start-end-radius: var(--ry-radius-md);
437
+ border-end-end-radius: var(--ry-radius-md);
438
+ border-inline-start: none;
439
+ }
440
+
441
+ /* Single-button rounding */
442
+ ry-number-select[arrows="start"] .ry-number-select__decrement {
443
+ border-radius: var(--ry-radius-md);
444
+ border-inline-end: var(--ry-border-width) solid var(--ry-color-border);
445
+ }
446
+
447
+ ry-number-select[arrows="end"] .ry-number-select__increment {
448
+ border-radius: var(--ry-radius-md);
449
+ border-inline-start: var(--ry-border-width) solid var(--ry-color-border);
450
+ }
451
+
452
+ .ry-number-select__display {
453
+ background-color: var(--ry-color-bg);
454
+ border-block-start: var(--ry-border-width) solid var(--ry-color-border);
455
+ border-block-end: var(--ry-border-width) solid var(--ry-color-border);
456
+ }
457
+
458
+ /* Display borders when both arrows */
459
+ ry-number-select:not([arrows]) .ry-number-select__display,
460
+ ry-number-select[arrows="both"] .ry-number-select__display {
461
+ border-inline-start: none;
462
+ border-inline-end: none;
463
+ }
464
+
465
+ /* No arrows: full border + radius */
466
+ ry-number-select[arrows="none"] .ry-number-select__display {
467
+ border: var(--ry-border-width) solid var(--ry-color-border);
468
+ border-radius: var(--ry-radius-md);
469
+ }
470
+
471
+ /* Start only: display gets end border + end radius */
472
+ ry-number-select[arrows="start"] .ry-number-select__display {
473
+ border-inline-end: var(--ry-border-width) solid var(--ry-color-border);
474
+ border-inline-start: none;
475
+ border-start-start-radius: 0;
476
+ border-end-start-radius: 0;
477
+ border-start-end-radius: var(--ry-radius-md);
478
+ border-end-end-radius: var(--ry-radius-md);
479
+ }
480
+
481
+ /* End only: display gets start border + start radius */
482
+ ry-number-select[arrows="end"] .ry-number-select__display {
483
+ border-inline-start: var(--ry-border-width) solid var(--ry-color-border);
484
+ border-inline-end: none;
485
+ border-start-start-radius: var(--ry-radius-md);
486
+ border-end-start-radius: var(--ry-radius-md);
487
+ border-start-end-radius: 0;
488
+ border-end-end-radius: 0;
489
+ }
490
+
491
+ /* Stacked: top-rounded increment, bottom-rounded decrement, no radius on display */
492
+ ry-number-select[arrows="stacked"] .ry-number-select__increment {
493
+ border: var(--ry-border-width) solid var(--ry-color-border);
494
+ border-block-end: none;
495
+ border-radius: var(--ry-radius-md) var(--ry-radius-md) 0 0;
496
+ }
497
+
498
+ ry-number-select[arrows="stacked"] .ry-number-select__decrement {
499
+ border: var(--ry-border-width) solid var(--ry-color-border);
500
+ border-block-start: none;
501
+ border-radius: 0 0 var(--ry-radius-md) var(--ry-radius-md);
502
+ }
503
+
504
+ ry-number-select[arrows="stacked"] .ry-number-select__display {
505
+ border: var(--ry-border-width) solid var(--ry-color-border);
506
+ border-block-start: none;
507
+ border-block-end: none;
508
+ border-radius: 0;
509
+ }
510
+
511
+ /* Stacked-end: display start-rounded, buttons end-rounded */
512
+ ry-number-select[arrows="stacked-end"] .ry-number-select__display {
513
+ border: var(--ry-border-width) solid var(--ry-color-border);
514
+ border-inline-end: none;
515
+ border-start-start-radius: var(--ry-radius-md);
516
+ border-end-start-radius: var(--ry-radius-md);
517
+ border-start-end-radius: 0;
518
+ border-end-end-radius: 0;
519
+ }
520
+
521
+ ry-number-select[arrows="stacked-end"] .ry-number-select__increment {
522
+ border: var(--ry-border-width) solid var(--ry-color-border);
523
+ border-block-end: none;
524
+ border-start-end-radius: var(--ry-radius-md);
525
+ border-start-start-radius: 0;
526
+ border-end-start-radius: 0;
527
+ border-end-end-radius: 0;
528
+ }
529
+
530
+ ry-number-select[arrows="stacked-end"] .ry-number-select__decrement {
531
+ border: var(--ry-border-width) solid var(--ry-color-border);
532
+ border-end-end-radius: var(--ry-radius-md);
533
+ border-start-start-radius: 0;
534
+ border-start-end-radius: 0;
535
+ border-end-start-radius: 0;
536
+ }
537
+
538
+ /* Stacked-start: buttons start-rounded, display end-rounded */
539
+ ry-number-select[arrows="stacked-start"] .ry-number-select__display {
540
+ border: var(--ry-border-width) solid var(--ry-color-border);
541
+ border-inline-start: none;
542
+ border-start-start-radius: 0;
543
+ border-end-start-radius: 0;
544
+ border-start-end-radius: var(--ry-radius-md);
545
+ border-end-end-radius: var(--ry-radius-md);
546
+ }
547
+
548
+ ry-number-select[arrows="stacked-start"] .ry-number-select__increment {
549
+ border: var(--ry-border-width) solid var(--ry-color-border);
550
+ border-block-end: none;
551
+ border-start-start-radius: var(--ry-radius-md);
552
+ border-start-end-radius: 0;
553
+ border-end-start-radius: 0;
554
+ border-end-end-radius: 0;
555
+ }
556
+
557
+ ry-number-select[arrows="stacked-start"] .ry-number-select__decrement {
558
+ border: var(--ry-border-width) solid var(--ry-color-border);
559
+ border-end-start-radius: var(--ry-radius-md);
560
+ border-start-start-radius: 0;
561
+ border-start-end-radius: 0;
562
+ border-end-end-radius: 0;
563
+ }
564
+
565
+ .ry-number-select__value {
566
+ font-family: var(--ry-font-mono);
567
+ font-size: var(--ry-text-sm);
568
+ font-weight: var(--ry-font-medium);
569
+ color: var(--ry-color-text);
570
+ }
571
+
572
+ .ry-number-select__input {
573
+ font-family: var(--ry-font-mono);
574
+ font-size: var(--ry-text-sm);
575
+ font-weight: var(--ry-font-medium);
576
+ color: var(--ry-color-text);
577
+ background: transparent;
578
+ border: none;
579
+ border-block-end: 2px solid var(--ry-color-primary);
580
+ }
581
+
582
+ .ry-number-select__display:focus-visible {
583
+ outline: none;
584
+ box-shadow: var(--ry-focus-ring);
585
+ border-color: var(--ry-color-primary);
586
+ }
587
+
588
+ .ry-number-select__affix {
589
+ font-family: var(--ry-font-mono);
590
+ font-size: var(--ry-text-sm);
591
+ color: var(--ry-color-text-muted);
592
+ }
593
+
594
+ .ry-number-select__label {
595
+ font-size: var(--ry-text-sm);
596
+ color: var(--ry-color-text-muted);
597
+ }
598
+
599
+ ry-number-select[disabled] {
600
+ opacity: 0.5;
601
+ }
602
+
603
+ ry-number-select[size="xs"] .ry-number-select__value {
604
+ font-size: var(--ry-text-xs);
605
+ }
606
+
607
+ ry-number-select[size="xs"] .ry-number-select__affix {
608
+ font-size: var(--ry-text-xs);
609
+ }
610
+
421
611
  /* ═══════════════════════════════════════════════════════════════
422
612
  CARDS
423
613
  ═══════════════════════════════════════════════════════════════ */
@@ -442,8 +632,7 @@ ry-card p {
442
632
  BADGES
443
633
  ═══════════════════════════════════════════════════════════════ */
444
634
 
445
- .ry-badge,
446
- ry-badge {
635
+ :is(.ry-badge, ry-badge) {
447
636
  font-size: var(--ry-text-xs);
448
637
  font-weight: var(--ry-font-medium);
449
638
  background-color: var(--ry-color-bg-muted);
@@ -451,26 +640,22 @@ ry-badge {
451
640
  border-radius: var(--ry-radius-full);
452
641
  }
453
642
 
454
- .ry-badge--primary,
455
- ry-badge[variant="primary"] {
643
+ :is(.ry-badge--primary, ry-badge[variant="primary"]) {
456
644
  background-color: var(--ry-color-primary);
457
645
  color: var(--ry-color-text-inverse);
458
646
  }
459
647
 
460
- .ry-badge--success,
461
- ry-badge[variant="success"] {
648
+ :is(.ry-badge--success, ry-badge[variant="success"]) {
462
649
  background-color: var(--ry-color-success);
463
650
  color: var(--ry-color-text-inverse);
464
651
  }
465
652
 
466
- .ry-badge--warning,
467
- ry-badge[variant="warning"] {
653
+ :is(.ry-badge--warning, ry-badge[variant="warning"]) {
468
654
  background-color: var(--ry-color-warning);
469
655
  color: var(--ry-color-text);
470
656
  }
471
657
 
472
- .ry-badge--danger,
473
- ry-badge[variant="danger"] {
658
+ :is(.ry-badge--danger, ry-badge[variant="danger"]) {
474
659
  background-color: var(--ry-color-danger);
475
660
  color: var(--ry-color-text-inverse);
476
661
  }
@@ -479,43 +664,37 @@ ry-badge[variant="danger"] {
479
664
  ALERTS
480
665
  ═══════════════════════════════════════════════════════════════ */
481
666
 
482
- .ry-alert,
483
- ry-alert {
667
+ :is(.ry-alert, ry-alert) {
484
668
  background-color: var(--ry-color-bg-subtle);
485
669
  border: var(--ry-border-width) solid var(--ry-color-border);
486
670
  border-radius: var(--ry-radius-lg);
487
671
  }
488
672
 
489
- .ry-alert--info,
490
- ry-alert[type="info"] {
491
- background-color: var(--ry-color-info-bg, #ecfeff);
673
+ :is(.ry-alert--info, ry-alert[type="info"]) {
674
+ background-color: var(--ry-color-info-bg);
492
675
  border-color: var(--ry-color-info);
493
- color: var(--ry-color-info-text, #0e7490);
676
+ color: var(--ry-color-info-text);
494
677
  }
495
678
 
496
- .ry-alert--success,
497
- ry-alert[type="success"] {
498
- background-color: var(--ry-color-success-bg, #f0fdf4);
679
+ :is(.ry-alert--success, ry-alert[type="success"]) {
680
+ background-color: var(--ry-color-success-bg);
499
681
  border-color: var(--ry-color-success);
500
- color: var(--ry-color-success-text, #15803d);
682
+ color: var(--ry-color-success-text);
501
683
  }
502
684
 
503
- .ry-alert--warning,
504
- ry-alert[type="warning"] {
505
- background-color: var(--ry-color-warning-bg, #fffbeb);
685
+ :is(.ry-alert--warning, ry-alert[type="warning"]) {
686
+ background-color: var(--ry-color-warning-bg);
506
687
  border-color: var(--ry-color-warning);
507
- color: var(--ry-color-warning-text, #b45309);
688
+ color: var(--ry-color-warning-text);
508
689
  }
509
690
 
510
- .ry-alert--danger,
511
- ry-alert[type="danger"] {
512
- background-color: var(--ry-color-danger-bg, #fef2f2);
691
+ :is(.ry-alert--danger, ry-alert[type="danger"]) {
692
+ background-color: var(--ry-color-danger-bg);
513
693
  border-color: var(--ry-color-danger);
514
- color: var(--ry-color-danger-text, #b91c1c);
694
+ color: var(--ry-color-danger-text);
515
695
  }
516
696
 
517
- .ry-alert__title,
518
- ry-alert [slot="title"] {
697
+ :is(.ry-alert__title, ry-alert [slot="title"]) {
519
698
  font-weight: var(--ry-font-semibold);
520
699
  }
521
700
 
@@ -523,10 +702,7 @@ ry-alert [slot="title"] {
523
702
  FORM ELEMENTS
524
703
  ═══════════════════════════════════════════════════════════════ */
525
704
 
526
- .ry-input,
527
- ry-field input,
528
- ry-field textarea,
529
- ry-field select {
705
+ :is(.ry-input, ry-field input, ry-field textarea, ry-field select) {
530
706
  font-family: var(--ry-font-sans);
531
707
  font-size: var(--ry-text-base);
532
708
  line-height: var(--ry-leading-normal);
@@ -540,35 +716,26 @@ ry-field select {
540
716
  box-shadow var(--ry-duration-fast) var(--ry-ease);
541
717
  }
542
718
 
543
- .ry-input:hover,
544
- ry-field input:hover,
545
- ry-field textarea:hover {
719
+ :is(.ry-input, ry-field input, ry-field textarea):hover {
546
720
  border-color: var(--ry-color-border-strong);
547
721
  }
548
722
 
549
- .ry-input:focus,
550
- ry-field input:focus,
551
- ry-field textarea:focus {
723
+ :is(.ry-input, ry-field input, ry-field textarea):focus {
552
724
  outline: none;
553
725
  border-color: var(--ry-color-primary);
554
726
  box-shadow: var(--ry-focus-ring);
555
727
  }
556
728
 
557
- .ry-input::placeholder,
558
- ry-field input::placeholder,
559
- ry-field textarea::placeholder {
729
+ :is(.ry-input, ry-field input, ry-field textarea)::placeholder {
560
730
  color: var(--ry-color-text-muted);
561
731
  }
562
732
 
563
- .ry-input:disabled,
564
- ry-field input:disabled,
565
- ry-field textarea:disabled {
733
+ :is(.ry-input, ry-field input, ry-field textarea):disabled {
566
734
  background-color: var(--ry-color-bg-muted);
567
735
  opacity: 0.5;
568
736
  }
569
737
 
570
- .ry-label,
571
- ry-field label {
738
+ :is(.ry-label, ry-field label) {
572
739
  font-size: var(--ry-text-sm);
573
740
  font-weight: var(--ry-font-medium);
574
741
  color: var(--ry-color-text);
@@ -583,14 +750,12 @@ ry-accordion {
583
750
  border-radius: var(--ry-radius-lg);
584
751
  }
585
752
 
586
- .ry-accordion__item,
587
- ry-accordion-item {
588
- border-bottom: var(--ry-border-width) solid var(--ry-color-border);
753
+ :is(.ry-accordion__item, ry-accordion-item) {
754
+ border-block-end: var(--ry-border-width) solid var(--ry-color-border);
589
755
  }
590
756
 
591
- .ry-accordion__item:last-child,
592
- ry-accordion-item:last-child {
593
- border-bottom: none;
757
+ :is(.ry-accordion__item, ry-accordion-item):last-child {
758
+ border-block-end: none;
594
759
  }
595
760
 
596
761
  .ry-accordion__trigger {
@@ -620,7 +785,7 @@ ry-accordion-item:last-child {
620
785
  ═══════════════════════════════════════════════════════════════ */
621
786
 
622
787
  .ry-tabs__list {
623
- border-bottom: var(--ry-border-width) solid var(--ry-color-border);
788
+ border-block-end: var(--ry-border-width) solid var(--ry-color-border);
624
789
  }
625
790
 
626
791
  .ry-tabs__trigger {
@@ -639,7 +804,7 @@ ry-accordion-item:last-child {
639
804
 
640
805
  .ry-tabs__trigger[aria-selected="true"] {
641
806
  color: var(--ry-color-primary);
642
- border-bottom-color: var(--ry-color-primary);
807
+ border-block-end-color: var(--ry-color-primary);
643
808
  }
644
809
 
645
810
  .ry-tabs__trigger:focus-visible {
@@ -663,7 +828,7 @@ ry-accordion-item:last-child {
663
828
  }
664
829
 
665
830
  .ry-modal__header {
666
- border-bottom: var(--ry-border-width) solid var(--ry-color-border);
831
+ border-block-end: var(--ry-border-width) solid var(--ry-color-border);
667
832
  }
668
833
 
669
834
  .ry-modal__title {
@@ -686,7 +851,7 @@ ry-accordion-item:last-child {
686
851
  }
687
852
 
688
853
  .ry-modal__footer {
689
- border-top: var(--ry-border-width) solid var(--ry-color-border);
854
+ border-block-start: var(--ry-border-width) solid var(--ry-color-border);
690
855
  background-color: var(--ry-color-bg-subtle);
691
856
  }
692
857
 
@@ -694,16 +859,14 @@ ry-accordion-item:last-child {
694
859
  DROPDOWN
695
860
  ═══════════════════════════════════════════════════════════════ */
696
861
 
697
- .ry-dropdown__menu,
698
- ry-menu {
862
+ :is(.ry-dropdown__menu, ry-menu) {
699
863
  background-color: var(--ry-color-bg);
700
864
  border: var(--ry-border-width) solid var(--ry-color-border);
701
865
  border-radius: var(--ry-radius-lg);
702
866
  box-shadow: var(--ry-shadow-lg);
703
867
  }
704
868
 
705
- .ry-dropdown__item,
706
- ry-menu-item {
869
+ :is(.ry-dropdown__item, ry-menu-item) {
707
870
  font-family: var(--ry-font-sans);
708
871
  font-size: var(--ry-text-sm);
709
872
  color: var(--ry-color-text);
@@ -712,13 +875,11 @@ ry-menu-item {
712
875
  transition: background-color var(--ry-duration-fast) var(--ry-ease);
713
876
  }
714
877
 
715
- .ry-dropdown__item:hover,
716
- ry-menu-item:hover {
878
+ :is(.ry-dropdown__item, ry-menu-item):hover {
717
879
  background-color: var(--ry-color-bg-muted);
718
880
  }
719
881
 
720
- .ry-dropdown__item:focus-visible,
721
- ry-menu-item:focus-visible {
882
+ :is(.ry-dropdown__item, ry-menu-item):focus-visible {
722
883
  outline: none;
723
884
  box-shadow: inset var(--ry-focus-ring);
724
885
  }
@@ -920,8 +1081,7 @@ ry-select[data-ry-state="open"] .ry-select__trigger {
920
1081
  transition: background-color var(--ry-duration-fast) var(--ry-ease);
921
1082
  }
922
1083
 
923
- .ry-select__option:hover,
924
- .ry-select__option[data-highlighted] {
1084
+ .ry-select__option:is(:hover, [data-highlighted]) {
925
1085
  background-color: var(--ry-color-bg-muted);
926
1086
  }
927
1087
 
@@ -938,106 +1098,131 @@ ry-select[data-ry-state="open"] .ry-select__trigger {
938
1098
  background-color: transparent;
939
1099
  }
940
1100
 
1101
+ /* Multi-select checkmarks */
1102
+ .ry-select__check {
1103
+ color: var(--ry-color-primary);
1104
+ }
1105
+
1106
+ .ry-select__clear {
1107
+ background: transparent;
1108
+ color: var(--ry-color-text-muted);
1109
+ border-radius: var(--ry-radius-full);
1110
+ transition: color var(--ry-duration-fast) var(--ry-ease);
1111
+ }
1112
+
1113
+ .ry-select__clear:hover {
1114
+ color: var(--ry-color-text);
1115
+ }
1116
+
1117
+ /* Multi: checkmark is the indicator, no bg change on selected */
1118
+ ry-select[multiple] .ry-select__option[aria-selected="true"] {
1119
+ background-color: transparent;
1120
+ color: var(--ry-color-text);
1121
+ }
1122
+
1123
+ ry-select[multiple] .ry-select__option[aria-selected="true"]:is(:hover, [data-highlighted]) {
1124
+ background-color: var(--ry-color-bg-muted);
1125
+ }
1126
+
941
1127
  /* ═══════════════════════════════════════════════════════════════
942
1128
  CODE
943
1129
  ═══════════════════════════════════════════════════════════════ */
944
1130
 
945
1131
  ry-code {
946
- background-color: var(--ry-code-bg, #f6f8fa);
1132
+ background-color: var(--ry-code-bg);
947
1133
  border-radius: var(--ry-radius-lg);
948
1134
  box-shadow: var(--ry-shadow-lg);
949
1135
  }
950
1136
 
951
1137
  .ry-code__header {
952
- background-color: var(--ry-code-header-bg, #eaeef2);
1138
+ background-color: var(--ry-code-header-bg);
953
1139
  }
954
1140
 
955
1141
  .ry-code__title {
956
1142
  font-family: var(--ry-font-sans);
957
1143
  font-size: var(--ry-text-xs);
958
1144
  font-weight: var(--ry-font-bold);
959
- color: var(--ry-code-title-color, #57606a);
1145
+ color: var(--ry-code-title-color);
960
1146
  }
961
1147
 
962
1148
  .ry-code__copy {
963
1149
  background: transparent;
964
1150
  border-radius: var(--ry-radius-full);
965
- color: var(--ry-code-icon-color, #8c959f);
1151
+ color: var(--ry-code-icon-color);
966
1152
  transition: background-color var(--ry-duration-fast) var(--ry-ease),
967
1153
  color var(--ry-duration-fast) var(--ry-ease);
968
1154
  }
969
1155
 
970
1156
  .ry-code__copy:hover {
971
- background-color: var(--ry-code-icon-hover-bg, #d0d7de);
972
- color: var(--ry-code-icon-hover-color, #24292f);
1157
+ background-color: var(--ry-code-icon-hover-bg);
1158
+ color: var(--ry-code-icon-hover-color);
973
1159
  }
974
1160
 
975
1161
  .ry-code__copy--success {
976
1162
  color: var(--ry-color-success);
977
1163
  }
978
1164
 
979
- .ry-code__pre,
980
- .ry-code__code {
1165
+ :is(.ry-code__pre, .ry-code__code) {
981
1166
  font-family: var(--ry-font-mono);
982
1167
  font-size: var(--ry-text-sm);
983
1168
  line-height: var(--ry-leading-relaxed);
984
- color: var(--ry-code-text-color, #24292f);
1169
+ color: var(--ry-code-text-color);
985
1170
  }
986
1171
 
987
1172
  .ry-code__line-number {
988
- color: var(--ry-code-line-number-color, rgba(140, 149, 159, 0.6));
989
- border-right: 1px solid var(--ry-code-line-border-color, #d0d7de);
1173
+ color: var(--ry-code-line-number-color);
1174
+ border-inline-end: 1px solid var(--ry-code-line-border-color);
990
1175
  }
991
1176
 
992
1177
  .ry-code__color-preview {
993
- border: 1px solid var(--ry-code-color-preview-border, rgba(36, 41, 47, 0.3));
1178
+ border: 1px solid var(--ry-code-color-preview-border);
994
1179
  border-radius: var(--ry-radius-sm);
995
1180
  }
996
1181
 
997
- /* Syntax highlighting colors (Cool/GitHub light as default) */
1182
+ /* Syntax highlighting colors */
998
1183
  .ry-code__keyword {
999
- color: var(--ry-code-keyword, #cf222e);
1184
+ color: var(--ry-code-keyword);
1000
1185
  }
1001
1186
 
1002
1187
  .ry-code__property {
1003
- color: var(--ry-code-property, #0550ae);
1188
+ color: var(--ry-code-property);
1004
1189
  }
1005
1190
 
1006
1191
  .ry-code__value {
1007
- color: var(--ry-code-value, #0a3069);
1192
+ color: var(--ry-code-value);
1008
1193
  }
1009
1194
 
1010
1195
  .ry-code__string {
1011
- color: var(--ry-code-string, #0a3069);
1196
+ color: var(--ry-code-string);
1012
1197
  }
1013
1198
 
1014
1199
  .ry-code__number {
1015
- color: var(--ry-code-number, #0550ae);
1200
+ color: var(--ry-code-number);
1016
1201
  }
1017
1202
 
1018
1203
  .ry-code__comment {
1019
- color: var(--ry-code-comment, #6e7781);
1204
+ color: var(--ry-code-comment);
1020
1205
  font-style: italic;
1021
1206
  }
1022
1207
 
1023
1208
  .ry-code__selector {
1024
- color: var(--ry-code-selector, #116329);
1209
+ color: var(--ry-code-selector);
1025
1210
  }
1026
1211
 
1027
1212
  .ry-code__punctuation {
1028
- color: var(--ry-code-punctuation, #24292f);
1213
+ color: var(--ry-code-punctuation);
1029
1214
  }
1030
1215
 
1031
1216
  .ry-code__tag {
1032
- color: var(--ry-code-tag, #116329);
1217
+ color: var(--ry-code-tag);
1033
1218
  }
1034
1219
 
1035
1220
  .ry-code__attribute {
1036
- color: var(--ry-code-attribute, #0550ae);
1221
+ color: var(--ry-code-attribute);
1037
1222
  }
1038
1223
 
1039
1224
  .ry-code__color {
1040
- color: var(--ry-code-value, #0a3069);
1225
+ color: var(--ry-code-value);
1041
1226
  }
1042
1227
 
1043
1228
  /* ═══════════════════════════════════════════════════════════════
@@ -1106,8 +1291,8 @@ input[type="checkbox"]:checked:hover {
1106
1291
  }
1107
1292
 
1108
1293
  input[type="checkbox"]::after {
1109
- border-right: 2px solid var(--ry-color-text-inverse);
1110
- border-bottom: 2px solid var(--ry-color-text-inverse);
1294
+ border-inline-end: 2px solid var(--ry-color-text-inverse);
1295
+ border-block-end: 2px solid var(--ry-color-text-inverse);
1111
1296
  margin-bottom: 2px;
1112
1297
  }
1113
1298
 
@@ -1171,15 +1356,15 @@ th {
1171
1356
  font-weight: var(--ry-font-semibold);
1172
1357
  color: var(--ry-color-text);
1173
1358
  background-color: var(--ry-color-bg-subtle);
1174
- border-bottom: var(--ry-border-width) solid var(--ry-color-border);
1359
+ border-block-end: var(--ry-border-width) solid var(--ry-color-border);
1175
1360
  }
1176
1361
 
1177
1362
  td {
1178
- border-bottom: var(--ry-border-width) solid var(--ry-color-border);
1363
+ border-block-end: var(--ry-border-width) solid var(--ry-color-border);
1179
1364
  }
1180
1365
 
1181
1366
  tbody tr:last-child td {
1182
- border-bottom: none;
1367
+ border-block-end: none;
1183
1368
  }
1184
1369
 
1185
1370
  tbody tr:hover {
@@ -1192,8 +1377,7 @@ table[data-bordered] {
1192
1377
  border-radius: var(--ry-radius-lg);
1193
1378
  }
1194
1379
 
1195
- table[data-bordered] th,
1196
- table[data-bordered] td {
1380
+ table[data-bordered] :is(th, td) {
1197
1381
  border: var(--ry-border-width) solid var(--ry-color-border);
1198
1382
  }
1199
1383
 
@@ -1228,7 +1412,7 @@ ry-color-picker [data-ry-target="trigger"]:focus-visible {
1228
1412
 
1229
1413
  ry-color-picker [data-ry-target="trigger-color"] {
1230
1414
  border-radius: calc(var(--ry-radius-md) - 1px);
1231
- outline: 3px solid rgba(0, 0, 0, 0.2);
1415
+ outline: 3px solid oklch(0 0 0 / 0.2);
1232
1416
  outline-offset: -3px;
1233
1417
  }
1234
1418
 
@@ -1257,12 +1441,12 @@ ry-color-picker [data-ry-target="grid-handle"] {
1257
1441
  background-color: transparent;
1258
1442
  border: 2px solid #fff;
1259
1443
  border-radius: var(--ry-radius-full);
1260
- box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.3), inset 0 0 0 1px rgba(0, 0, 0, 0.3);
1444
+ box-shadow: 0 0 0 1px oklch(0 0 0 / 0.3), inset 0 0 0 1px oklch(0 0 0 / 0.3);
1261
1445
  }
1262
1446
 
1263
1447
  ry-color-picker [data-ry-target="grid-handle"]:focus-visible {
1264
1448
  outline: none;
1265
- box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.3), inset 0 0 0 1px rgba(0, 0, 0, 0.3), var(--ry-focus-ring);
1449
+ box-shadow: 0 0 0 1px oklch(0 0 0 / 0.3), inset 0 0 0 1px oklch(0 0 0 / 0.3), var(--ry-focus-ring);
1266
1450
  }
1267
1451
 
1268
1452
  /* Hue slider */
@@ -1294,12 +1478,12 @@ ry-color-picker .ry-color-picker__alpha {
1294
1478
  ry-color-picker .ry-color-picker__slider-handle {
1295
1479
  background-color: #fff;
1296
1480
  border-radius: var(--ry-radius-full);
1297
- box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.2), var(--ry-shadow-sm);
1481
+ box-shadow: 0 0 0 1px oklch(0 0 0 / 0.2), var(--ry-shadow-sm);
1298
1482
  }
1299
1483
 
1300
1484
  ry-color-picker .ry-color-picker__slider-handle:focus-visible {
1301
1485
  outline: none;
1302
- box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.2), var(--ry-focus-ring);
1486
+ box-shadow: 0 0 0 1px oklch(0 0 0 / 0.2), var(--ry-focus-ring);
1303
1487
  }
1304
1488
 
1305
1489
  /* Preview */
@@ -1313,7 +1497,7 @@ ry-color-picker [data-ry-target="preview"] {
1313
1497
 
1314
1498
  ry-color-picker [data-ry-target="preview-color"] {
1315
1499
  border-radius: inherit;
1316
- outline: 3px solid rgba(0, 0, 0, 0.2);
1500
+ outline: 3px solid oklch(0 0 0 / 0.2);
1317
1501
  outline-offset: -3px;
1318
1502
  }
1319
1503
 
@@ -1407,7 +1591,7 @@ ry-color-input:focus-within [data-ry-target="trigger"] {
1407
1591
  ry-color-input [data-ry-target="swatch"] {
1408
1592
  background-image: repeating-conic-gradient(#ccc 0% 25%, #fff 0% 50%);
1409
1593
  background-size: 8px 8px;
1410
- border-right: var(--ry-border-width) solid var(--ry-color-border);
1594
+ border-inline-end: var(--ry-border-width) solid var(--ry-color-border);
1411
1595
  transition: background-color var(--ry-duration-fast) var(--ry-ease);
1412
1596
  }
1413
1597
 
@@ -1420,7 +1604,7 @@ ry-color-input [data-ry-target="swatch"]:focus-visible {
1420
1604
  }
1421
1605
 
1422
1606
  ry-color-input [data-ry-target="swatch-color"] {
1423
- box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1);
1607
+ box-shadow: inset 0 0 0 1px oklch(0 0 0 / 0.1);
1424
1608
  }
1425
1609
 
1426
1610
  ry-color-input [data-ry-target="input"] {
@@ -1445,3 +1629,446 @@ ry-color-input [data-ry-target="panel"] {
1445
1629
  border-radius: var(--ry-radius-lg);
1446
1630
  box-shadow: var(--ry-shadow-lg);
1447
1631
  }
1632
+
1633
+ /* ═══════════════════════════════════════════════════════════════
1634
+ GRADIENT PICKER
1635
+ ═══════════════════════════════════════════════════════════════ */
1636
+
1637
+ ry-gradient-picker {
1638
+ background-color: var(--ry-color-bg);
1639
+ border: var(--ry-border-width) solid var(--ry-color-border);
1640
+ border-radius: var(--ry-radius-lg);
1641
+ box-shadow: var(--ry-shadow-md);
1642
+ }
1643
+
1644
+ ry-gradient-picker[disabled] {
1645
+ opacity: 0.5;
1646
+ }
1647
+
1648
+ /* Type toggle buttons */
1649
+ ry-gradient-picker [data-ry-target="type-toggle"] button {
1650
+ font-family: var(--ry-font-sans);
1651
+ font-size: var(--ry-text-xs);
1652
+ background-color: transparent;
1653
+ color: var(--ry-color-text-muted);
1654
+ border-radius: var(--ry-radius-sm);
1655
+ transition: background-color var(--ry-duration-fast) var(--ry-ease),
1656
+ color var(--ry-duration-fast) var(--ry-ease);
1657
+ }
1658
+
1659
+ ry-gradient-picker [data-ry-target="type-toggle"] button:hover {
1660
+ background-color: var(--ry-color-bg-subtle);
1661
+ }
1662
+
1663
+ ry-gradient-picker [data-ry-target="type-toggle"] button[data-active] {
1664
+ background-color: var(--ry-color-primary);
1665
+ color: var(--ry-color-text-inverse);
1666
+ }
1667
+
1668
+ /* Shape toggle */
1669
+ ry-gradient-picker [data-ry-target="shape-control"] button {
1670
+ font-family: var(--ry-font-sans);
1671
+ font-size: var(--ry-text-xs);
1672
+ background-color: transparent;
1673
+ color: var(--ry-color-text-muted);
1674
+ border-radius: var(--ry-radius-sm);
1675
+ transition: background-color var(--ry-duration-fast) var(--ry-ease),
1676
+ color var(--ry-duration-fast) var(--ry-ease);
1677
+ }
1678
+
1679
+ ry-gradient-picker [data-ry-target="shape-control"] button:hover {
1680
+ background-color: var(--ry-color-bg-subtle);
1681
+ }
1682
+
1683
+ ry-gradient-picker [data-ry-target="shape-control"] button[data-active] {
1684
+ background-color: var(--ry-color-primary);
1685
+ color: var(--ry-color-text-inverse);
1686
+ }
1687
+
1688
+ /* Gradient bar */
1689
+ ry-gradient-picker [data-ry-target="bar"] {
1690
+ border-radius: var(--ry-radius-full, 9999px);
1691
+ box-shadow: inset 0 0 0 1px oklch(0 0 0 / 0.1);
1692
+ }
1693
+
1694
+ /* Stop handles */
1695
+ ry-gradient-picker [data-ry-target="stop"] {
1696
+ background-color: var(--stop-color, #fff);
1697
+ border: 2px solid #fff;
1698
+ border-radius: var(--ry-radius-full);
1699
+ box-shadow: 0 0 0 1px oklch(0 0 0 / 0.3), var(--ry-shadow-sm);
1700
+ transition: transform var(--ry-duration-fast) var(--ry-ease),
1701
+ opacity var(--ry-duration-fast) var(--ry-ease);
1702
+ }
1703
+
1704
+ ry-gradient-picker [data-ry-target="stop"][data-selected] {
1705
+ box-shadow: 0 0 0 2px var(--ry-color-primary), var(--ry-shadow-md);
1706
+ }
1707
+
1708
+ ry-gradient-picker [data-ry-target="stop"]:focus-visible {
1709
+ outline: none;
1710
+ box-shadow: 0 0 0 2px var(--ry-color-primary), var(--ry-focus-ring);
1711
+ }
1712
+
1713
+ /* CSS output */
1714
+ ry-gradient-picker [data-ry-target="output"] {
1715
+ font-family: var(--ry-font-mono);
1716
+ font-size: var(--ry-text-xs);
1717
+ color: var(--ry-color-text);
1718
+ background-color: var(--ry-color-bg-subtle);
1719
+ border: var(--ry-border-width) solid var(--ry-color-border);
1720
+ border-radius: var(--ry-radius-sm);
1721
+ transition: border-color var(--ry-duration-fast) var(--ry-ease),
1722
+ box-shadow var(--ry-duration-fast) var(--ry-ease);
1723
+ }
1724
+
1725
+ ry-gradient-picker [data-ry-target="output"]:focus {
1726
+ outline: none;
1727
+ border-color: var(--ry-color-primary);
1728
+ box-shadow: var(--ry-focus-ring);
1729
+ }
1730
+
1731
+ /* Copy button */
1732
+ ry-gradient-picker [data-ry-target="copy-btn"] {
1733
+ background-color: transparent;
1734
+ color: var(--ry-color-text-muted);
1735
+ border-radius: var(--ry-radius-sm);
1736
+ transition: background-color var(--ry-duration-fast) var(--ry-ease),
1737
+ color var(--ry-duration-fast) var(--ry-ease);
1738
+ }
1739
+
1740
+ ry-gradient-picker [data-ry-target="copy-btn"]:hover {
1741
+ background-color: var(--ry-color-bg-subtle);
1742
+ color: var(--ry-color-text);
1743
+ }
1744
+
1745
+ ry-gradient-picker [data-ry-target="copy-btn"][data-copied] {
1746
+ color: var(--ry-color-success);
1747
+ }
1748
+
1749
+ /* ═══════════════════════════════════════════════════════════════
1750
+ TREE
1751
+ ═══════════════════════════════════════════════════════════════ */
1752
+
1753
+ ry-tree {
1754
+ border: var(--ry-border-width) solid var(--ry-color-border);
1755
+ border-radius: var(--ry-radius-lg);
1756
+ padding: var(--ry-space-6);
1757
+ background-color: var(--ry-color-bg);
1758
+ box-shadow: var(--ry-shadow-sm);
1759
+ }
1760
+
1761
+ /* Vertical connector line */
1762
+ .ry-tree__children {
1763
+ border-inline-start: 1px solid var(--ry-color-border);
1764
+ }
1765
+
1766
+ /* Horizontal connector line */
1767
+ .ry-tree__children .ry-tree__item::before {
1768
+ background-color: var(--ry-color-border);
1769
+ }
1770
+
1771
+ :is(.ry-tree__label, .ry-tree__file) {
1772
+ font-family: var(--ry-font-sans);
1773
+ font-size: var(--ry-text-sm);
1774
+ color: var(--ry-color-text);
1775
+ border-radius: var(--ry-radius-sm);
1776
+ transition: background-color var(--ry-duration-fast) var(--ry-ease);
1777
+ }
1778
+
1779
+ :is(.ry-tree__label, .ry-tree__file):hover {
1780
+ background-color: var(--ry-color-bg-muted);
1781
+ }
1782
+
1783
+ .ry-tree__file[data-ry-selected] {
1784
+ background-color: var(--ry-color-bg-muted);
1785
+ color: var(--ry-color-text);
1786
+ font-weight: var(--ry-font-medium);
1787
+ }
1788
+
1789
+ .ry-tree__icon {
1790
+ color: var(--ry-color-text-muted);
1791
+ }
1792
+
1793
+ /* Open folder icon gets stronger color */
1794
+ .ry-tree__toggle:checked ~ .ry-tree__label .ry-tree__icon {
1795
+ color: var(--ry-color-text);
1796
+ }
1797
+
1798
+ /* Exclude tree toggle checkboxes from global checkbox styling */
1799
+ input[type="checkbox"].ry-tree__toggle {
1800
+ background: none;
1801
+ border: none;
1802
+ box-shadow: none;
1803
+ }
1804
+
1805
+ input[type="checkbox"].ry-tree__toggle::after {
1806
+ display: none;
1807
+ }
1808
+
1809
+ /* ── Drag and Drop ── */
1810
+
1811
+ .ry-tree__ghost {
1812
+ background-color: var(--ry-color-bg);
1813
+ border: var(--ry-border-width) solid var(--ry-color-primary);
1814
+ border-radius: var(--ry-radius-sm);
1815
+ box-shadow: var(--ry-shadow-lg);
1816
+ opacity: 0.85;
1817
+ }
1818
+
1819
+ .ry-tree__item--collapsed {
1820
+ background-color: color-mix(in oklch, var(--ry-color-primary) 10%, transparent);
1821
+ border-radius: var(--ry-radius-sm);
1822
+ }
1823
+
1824
+ .ry-tree__item:is([data-ry-drop-target="before"], [data-ry-drop-target="after"])::after {
1825
+ background-color: var(--ry-color-primary);
1826
+ }
1827
+
1828
+ .ry-tree__item[data-ry-drop-target="inside"] > .ry-tree__label {
1829
+ background-color: var(--ry-color-primary);
1830
+ color: var(--ry-color-text-inverse);
1831
+ border-radius: var(--ry-radius-sm);
1832
+ }
1833
+
1834
+ .ry-tree__item[data-ry-drop-target="inside"] > .ry-tree__label .ry-tree__icon {
1835
+ color: var(--ry-color-text-inverse);
1836
+ }
1837
+
1838
+ /* ═══════════════════════════════════════════════════════════════
1839
+ TAG
1840
+ ═══════════════════════════════════════════════════════════════ */
1841
+
1842
+ ry-tag {
1843
+ font-size: var(--ry-text-xs);
1844
+ font-weight: var(--ry-font-medium);
1845
+ background-color: var(--ry-color-bg-muted);
1846
+ color: var(--ry-color-text);
1847
+ border-radius: var(--ry-radius-full);
1848
+ }
1849
+
1850
+ ry-tag[variant="primary"] {
1851
+ background-color: var(--ry-color-primary);
1852
+ color: var(--ry-color-text-inverse);
1853
+ }
1854
+
1855
+ ry-tag[variant="success"] {
1856
+ background-color: var(--ry-color-success);
1857
+ color: var(--ry-color-text-inverse);
1858
+ }
1859
+
1860
+ ry-tag[variant="warning"] {
1861
+ background-color: var(--ry-color-warning);
1862
+ color: var(--ry-color-text);
1863
+ }
1864
+
1865
+ ry-tag[variant="danger"] {
1866
+ background-color: var(--ry-color-danger);
1867
+ color: var(--ry-color-text-inverse);
1868
+ }
1869
+
1870
+ ry-tag[disabled] {
1871
+ opacity: 0.5;
1872
+ }
1873
+
1874
+ .ry-tag__remove {
1875
+ background: transparent;
1876
+ color: currentColor;
1877
+ border-radius: var(--ry-radius-full);
1878
+ opacity: 0.6;
1879
+ transition: opacity var(--ry-duration-fast) var(--ry-ease);
1880
+ }
1881
+
1882
+ .ry-tag__remove:hover {
1883
+ opacity: 1;
1884
+ }
1885
+
1886
+ /* ═══════════════════════════════════════════════════════════════
1887
+ TAG INPUT
1888
+ ═══════════════════════════════════════════════════════════════ */
1889
+
1890
+ .ry-tag-input__container {
1891
+ background-color: var(--ry-color-bg);
1892
+ border: var(--ry-border-width) solid var(--ry-color-border);
1893
+ border-radius: var(--ry-radius-md);
1894
+ transition: border-color var(--ry-duration-fast) var(--ry-ease),
1895
+ box-shadow var(--ry-duration-fast) var(--ry-ease);
1896
+ }
1897
+
1898
+ .ry-tag-input__container:hover {
1899
+ border-color: var(--ry-color-border-strong);
1900
+ }
1901
+
1902
+ .ry-tag-input__container:focus-within {
1903
+ border-color: var(--ry-color-primary);
1904
+ box-shadow: var(--ry-focus-ring);
1905
+ }
1906
+
1907
+ .ry-tag-input__input {
1908
+ font-family: var(--ry-font-sans);
1909
+ font-size: var(--ry-text-sm);
1910
+ color: var(--ry-color-text);
1911
+ background: transparent;
1912
+ }
1913
+
1914
+ .ry-tag-input__input::placeholder {
1915
+ color: var(--ry-color-text-muted);
1916
+ }
1917
+
1918
+ ry-tag-input[disabled] .ry-tag-input__container {
1919
+ opacity: 0.5;
1920
+ background-color: var(--ry-color-bg-muted);
1921
+ }
1922
+
1923
+ /* ═══════════════════════════════════════════════════════════════
1924
+ HERO
1925
+ ═══════════════════════════════════════════════════════════════ */
1926
+
1927
+ ry-hero h1 {
1928
+ font-size: var(--ry-text-4xl);
1929
+ font-weight: var(--ry-font-bold);
1930
+ line-height: var(--ry-leading-tight);
1931
+ color: var(--ry-color-text);
1932
+ }
1933
+
1934
+ ry-hero p {
1935
+ font-size: var(--ry-text-lg);
1936
+ line-height: var(--ry-leading-relaxed);
1937
+ color: var(--ry-color-text-muted);
1938
+ }
1939
+
1940
+ /* ═══════════════════════════════════════════════════════════════
1941
+ STAT
1942
+ ═══════════════════════════════════════════════════════════════ */
1943
+
1944
+ .ry-stat__value {
1945
+ font-size: var(--ry-text-3xl);
1946
+ font-weight: var(--ry-font-bold);
1947
+ color: var(--ry-color-text);
1948
+ }
1949
+
1950
+ ry-stat[size="sm"] .ry-stat__value {
1951
+ font-size: var(--ry-text-2xl);
1952
+ }
1953
+
1954
+ ry-stat[size="lg"] .ry-stat__value {
1955
+ font-size: var(--ry-text-4xl);
1956
+ }
1957
+
1958
+ .ry-stat__label {
1959
+ font-size: var(--ry-text-sm);
1960
+ color: var(--ry-color-text-muted);
1961
+ }
1962
+
1963
+ .ry-stat__trend--up {
1964
+ color: var(--ry-color-success);
1965
+ }
1966
+
1967
+ .ry-stat__trend--down {
1968
+ color: var(--ry-color-danger);
1969
+ }
1970
+
1971
+ /* ═══════════════════════════════════════════════════════════════
1972
+ FEATURE
1973
+ ═══════════════════════════════════════════════════════════════ */
1974
+
1975
+ .ry-feature__icon {
1976
+ background-color: var(--ry-color-primary);
1977
+ color: var(--ry-color-text-inverse);
1978
+ border-radius: var(--ry-radius-full);
1979
+ }
1980
+
1981
+ ry-feature h3 {
1982
+ font-size: var(--ry-text-lg);
1983
+ font-weight: var(--ry-font-semibold);
1984
+ color: var(--ry-color-text);
1985
+ }
1986
+
1987
+ ry-feature p {
1988
+ font-size: var(--ry-text-sm);
1989
+ color: var(--ry-color-text-muted);
1990
+ line-height: var(--ry-leading-relaxed);
1991
+ }
1992
+
1993
+ /* ═══════════════════════════════════════════════════════════════
1994
+ PRICING
1995
+ ═══════════════════════════════════════════════════════════════ */
1996
+
1997
+ ry-pricing-card {
1998
+ background-color: var(--ry-color-bg);
1999
+ border: var(--ry-border-width) solid var(--ry-color-border);
2000
+ border-radius: var(--ry-radius-xl);
2001
+ box-shadow: var(--ry-shadow-sm);
2002
+ }
2003
+
2004
+ ry-pricing-card[featured] {
2005
+ border-color: var(--ry-color-primary);
2006
+ box-shadow: var(--ry-shadow-lg);
2007
+ }
2008
+
2009
+ ry-pricing-card h3 {
2010
+ font-size: var(--ry-text-xl);
2011
+ font-weight: var(--ry-font-semibold);
2012
+ color: var(--ry-color-text);
2013
+ }
2014
+
2015
+ ry-pricing-card [slot="price"] {
2016
+ font-size: var(--ry-text-4xl);
2017
+ font-weight: var(--ry-font-bold);
2018
+ color: var(--ry-color-text);
2019
+ }
2020
+
2021
+ ry-pricing-card [slot="price"] span {
2022
+ font-size: var(--ry-text-base);
2023
+ font-weight: var(--ry-font-normal);
2024
+ color: var(--ry-color-text-muted);
2025
+ }
2026
+
2027
+ ry-pricing-card ul li {
2028
+ border-block-end: var(--ry-border-width) solid var(--ry-color-border);
2029
+ font-size: var(--ry-text-sm);
2030
+ color: var(--ry-color-text-muted);
2031
+ }
2032
+
2033
+ ry-pricing-card ul li:last-child {
2034
+ border-block-end: none;
2035
+ }
2036
+
2037
+ /* ═══════════════════════════════════════════════════════════════
2038
+ CAROUSEL
2039
+ ═══════════════════════════════════════════════════════════════ */
2040
+
2041
+ .ry-carousel__arrow {
2042
+ background-color: var(--ry-color-bg);
2043
+ color: var(--ry-color-text);
2044
+ border-radius: var(--ry-radius-full);
2045
+ box-shadow: var(--ry-shadow-md);
2046
+ transition: background-color var(--ry-duration-fast) var(--ry-ease),
2047
+ box-shadow var(--ry-duration-fast) var(--ry-ease);
2048
+ }
2049
+
2050
+ .ry-carousel__arrow:hover {
2051
+ background-color: var(--ry-color-bg-muted);
2052
+ box-shadow: var(--ry-shadow-lg);
2053
+ }
2054
+
2055
+ .ry-carousel__arrow:focus-visible {
2056
+ outline: none;
2057
+ box-shadow: var(--ry-focus-ring);
2058
+ }
2059
+
2060
+ .ry-carousel__dot {
2061
+ background-color: var(--ry-color-border);
2062
+ border-radius: var(--ry-radius-full);
2063
+ transition: background-color var(--ry-duration-fast) var(--ry-ease);
2064
+ }
2065
+
2066
+ .ry-carousel__dot[data-active] {
2067
+ background-color: var(--ry-color-primary);
2068
+ }
2069
+
2070
+ .ry-carousel__dot:hover {
2071
+ background-color: var(--ry-color-primary-hover);
2072
+ }
2073
+
2074
+ } /* @layer ry-theme */