@ryanhelsing/ry-ui 1.0.2 → 1.0.4

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/AGENT.md +460 -0
  2. package/AGENTS.md +57 -0
  3. package/README.md +45 -1
  4. package/dist/components/ry-button-group.d.ts +32 -0
  5. package/dist/components/ry-button-group.d.ts.map +1 -0
  6. package/dist/components/ry-carousel.d.ts +21 -0
  7. package/dist/components/ry-carousel.d.ts.map +1 -0
  8. package/dist/components/ry-feature.d.ts +21 -0
  9. package/dist/components/ry-feature.d.ts.map +1 -0
  10. package/dist/components/ry-field.d.ts +7 -1
  11. package/dist/components/ry-field.d.ts.map +1 -1
  12. package/dist/components/ry-hero.d.ts +16 -0
  13. package/dist/components/ry-hero.d.ts.map +1 -0
  14. package/dist/components/ry-number-select.d.ts.map +1 -1
  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-split.d.ts +28 -0
  20. package/dist/components/ry-split.d.ts.map +1 -0
  21. package/dist/components/ry-stat.d.ts +17 -0
  22. package/dist/components/ry-stat.d.ts.map +1 -0
  23. package/dist/components/ry-tag-input.d.ts +18 -0
  24. package/dist/components/ry-tag-input.d.ts.map +1 -0
  25. package/dist/components/ry-tag.d.ts +19 -0
  26. package/dist/components/ry-tag.d.ts.map +1 -0
  27. package/dist/core/ry-transform.d.ts.map +1 -1
  28. package/dist/css/ry-structure.css +739 -149
  29. package/dist/css/ry-theme.css +581 -180
  30. package/dist/css/ry-tokens.css +120 -24
  31. package/dist/css/ry-ui.css +4965 -1065
  32. package/dist/ry-ui.d.ts +9 -0
  33. package/dist/ry-ui.d.ts.map +1 -1
  34. package/dist/ry-ui.js +1309 -778
  35. package/dist/ry-ui.js.map +1 -1
  36. package/dist/themes/dark.css +7 -90
  37. package/dist/themes/light.css +6 -35
  38. package/dist/themes/ocean.css +22 -26
  39. package/docs/components/accordion.md +31 -0
  40. package/docs/components/button-group.md +36 -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 +90 -0
  47. package/docs/components/knob.md +42 -0
  48. package/docs/components/layout.md +217 -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 +8 -4
  59. package/USING_CDN.md +0 -591
@@ -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
 
@@ -120,12 +118,33 @@ ry-divider {
120
118
  background-color: var(--ry-color-border);
121
119
  }
122
120
 
121
+ /* ═══════════════════════════════════════════════════════════════
122
+ SPLIT HANDLE
123
+ ═══════════════════════════════════════════════════════════════ */
124
+
125
+ ry-split [data-ry-target="handle"]::after {
126
+ background-color: var(--ry-color-border-strong);
127
+ }
128
+
129
+ ry-split[data-ry-resizing] [data-ry-target="handle"]::after {
130
+ background-color: var(--ry-color-primary);
131
+ }
132
+
133
+ ry-split [data-ry-target="handle"]:focus-visible {
134
+ outline: none;
135
+ }
136
+
137
+ ry-split [data-ry-target="handle"]:focus-visible::after {
138
+ opacity: 1;
139
+ background-color: var(--ry-color-primary);
140
+ box-shadow: var(--ry-focus-ring);
141
+ }
142
+
123
143
  /* ═══════════════════════════════════════════════════════════════
124
144
  BUTTONS
125
145
  ═══════════════════════════════════════════════════════════════ */
126
146
 
127
- .ry-btn,
128
- ry-button {
147
+ :is(.ry-btn, ry-button) {
129
148
  font-family: var(--ry-font-sans);
130
149
  font-size: var(--ry-text-sm);
131
150
  font-weight: var(--ry-font-medium);
@@ -142,71 +161,98 @@ ry-button {
142
161
  transition-timing-function: var(--ry-ease);
143
162
  }
144
163
 
145
- .ry-btn:hover,
146
- ry-button:hover {
164
+ :is(.ry-btn, ry-button):hover {
147
165
  background-color: var(--ry-color-primary-hover);
148
166
  }
149
167
 
150
- .ry-btn:active,
151
- ry-button:active {
168
+ :is(.ry-btn, ry-button):active {
152
169
  background-color: var(--ry-color-primary-active);
153
170
  }
154
171
 
155
- .ry-btn:disabled,
156
- .ry-btn[aria-disabled="true"],
157
- ry-button[disabled] {
172
+ :is(.ry-btn:disabled, .ry-btn[aria-disabled="true"], ry-button[disabled]) {
158
173
  opacity: 0.5;
159
174
  }
160
175
 
161
176
  /* Button variants */
162
- .ry-btn--secondary,
163
- ry-button[variant="secondary"] {
177
+ :is(.ry-btn--secondary, ry-button[variant="secondary"]) {
164
178
  background-color: var(--ry-color-secondary);
165
179
  }
166
- .ry-btn--secondary:hover,
167
- ry-button[variant="secondary"]:hover {
180
+ :is(.ry-btn--secondary, ry-button[variant="secondary"]):hover {
168
181
  background-color: var(--ry-color-secondary-hover);
169
182
  }
170
183
 
171
- .ry-btn--outline,
172
- ry-button[variant="outline"] {
184
+ :is(.ry-btn--outline, ry-button[variant="outline"]) {
173
185
  background-color: transparent;
174
186
  color: var(--ry-color-primary);
175
187
  border-color: var(--ry-color-primary);
176
188
  }
177
- .ry-btn--outline:hover,
178
- ry-button[variant="outline"]:hover {
189
+ :is(.ry-btn--outline, ry-button[variant="outline"]):hover {
179
190
  background-color: var(--ry-color-primary);
180
191
  color: var(--ry-color-text-inverse);
181
192
  }
182
193
 
183
- .ry-btn--ghost,
184
- ry-button[variant="ghost"] {
194
+ :is(.ry-btn--ghost, ry-button[variant="ghost"]) {
185
195
  background-color: transparent;
186
196
  color: var(--ry-color-text);
187
197
  }
188
- .ry-btn--ghost:hover,
189
- ry-button[variant="ghost"]:hover {
198
+ :is(.ry-btn--ghost, ry-button[variant="ghost"]):hover {
190
199
  background-color: var(--ry-color-bg-muted);
191
200
  }
192
201
 
193
- .ry-btn--danger,
194
- ry-button[variant="danger"] {
202
+ :is(.ry-btn--danger, ry-button[variant="danger"]) {
195
203
  background-color: var(--ry-color-danger);
196
204
  }
197
- .ry-btn--danger:hover,
198
- ry-button[variant="danger"]:hover {
199
- background-color: var(--ry-color-danger-hover, #dc2626);
205
+ :is(.ry-btn--danger, ry-button[variant="danger"]):hover {
206
+ background-color: var(--ry-color-danger-hover);
207
+ }
208
+
209
+ :is(.ry-btn--accent, ry-button[variant="accent"]) {
210
+ background-color: var(--ry-color-accent);
211
+ }
212
+ :is(.ry-btn--accent, ry-button[variant="accent"]):hover {
213
+ background-color: var(--ry-color-accent-hover);
214
+ }
215
+
216
+ /* Pressed/active toggle state */
217
+ :is(.ry-btn[aria-pressed="true"], ry-button[pressed]) {
218
+ background-color: var(--ry-color-primary);
219
+ color: var(--ry-color-text-inverse);
220
+ border-color: var(--ry-color-primary);
221
+ }
222
+ :is(.ry-btn[aria-pressed="true"], ry-button[pressed]):hover {
223
+ background-color: var(--ry-color-primary-hover);
224
+ border-color: var(--ry-color-primary-hover);
225
+ }
226
+
227
+ /* ═══════════════════════════════════════════════════════════════
228
+ BUTTON GROUP
229
+ ═══════════════════════════════════════════════════════════════ */
230
+
231
+ ry-button-group > :is(ry-button, ry-toggle-button) {
232
+ border-color: var(--ry-color-border);
233
+ }
234
+
235
+ ry-button-group > :is(ry-button, ry-toggle-button):not(:first-child) {
236
+ border-inline-start-color: transparent;
237
+ }
238
+
239
+ /* Default children to outline style for segmented look */
240
+ ry-button-group:not([variant]) > :is(ry-button, ry-toggle-button):not([pressed]) {
241
+ background-color: var(--ry-color-bg);
242
+ color: var(--ry-color-text);
243
+ border-color: var(--ry-color-border);
244
+ }
245
+
246
+ ry-button-group:not([variant]) > :is(ry-button, ry-toggle-button):not([pressed]):hover {
247
+ background-color: var(--ry-color-bg-muted);
200
248
  }
201
249
 
202
250
  /* Button sizes (typography only - padding is structural) */
203
- .ry-btn--sm,
204
- ry-button[size="sm"] {
251
+ :is(.ry-btn--sm, ry-button[size="sm"]) {
205
252
  font-size: var(--ry-text-xs);
206
253
  }
207
254
 
208
- .ry-btn--lg,
209
- ry-button[size="lg"] {
255
+ :is(.ry-btn--lg, ry-button[size="lg"]) {
210
256
  font-size: var(--ry-text-base);
211
257
  }
212
258
 
@@ -440,37 +486,43 @@ ry-knob[color="danger"] [data-ry-target="indicator"] { background-color: var(--r
440
486
  }
441
487
 
442
488
  .ry-number-select__decrement {
443
- border-radius: var(--ry-radius-md) 0 0 var(--ry-radius-md);
444
- border-right: none;
489
+ border-start-start-radius: var(--ry-radius-md);
490
+ border-end-start-radius: var(--ry-radius-md);
491
+ border-start-end-radius: 0;
492
+ border-end-end-radius: 0;
493
+ border-inline-end: none;
445
494
  }
446
495
 
447
496
  .ry-number-select__increment {
448
- border-radius: 0 var(--ry-radius-md) var(--ry-radius-md) 0;
449
- border-left: none;
497
+ border-start-start-radius: 0;
498
+ border-end-start-radius: 0;
499
+ border-start-end-radius: var(--ry-radius-md);
500
+ border-end-end-radius: var(--ry-radius-md);
501
+ border-inline-start: none;
450
502
  }
451
503
 
452
504
  /* Single-button rounding */
453
505
  ry-number-select[arrows="start"] .ry-number-select__decrement {
454
506
  border-radius: var(--ry-radius-md);
455
- border-right: var(--ry-border-width) solid var(--ry-color-border);
507
+ border-inline-end: var(--ry-border-width) solid var(--ry-color-border);
456
508
  }
457
509
 
458
510
  ry-number-select[arrows="end"] .ry-number-select__increment {
459
511
  border-radius: var(--ry-radius-md);
460
- border-left: var(--ry-border-width) solid var(--ry-color-border);
512
+ border-inline-start: var(--ry-border-width) solid var(--ry-color-border);
461
513
  }
462
514
 
463
515
  .ry-number-select__display {
464
516
  background-color: var(--ry-color-bg);
465
- border-top: var(--ry-border-width) solid var(--ry-color-border);
466
- border-bottom: var(--ry-border-width) solid var(--ry-color-border);
517
+ border-block-start: var(--ry-border-width) solid var(--ry-color-border);
518
+ border-block-end: var(--ry-border-width) solid var(--ry-color-border);
467
519
  }
468
520
 
469
521
  /* Display borders when both arrows */
470
522
  ry-number-select:not([arrows]) .ry-number-select__display,
471
523
  ry-number-select[arrows="both"] .ry-number-select__display {
472
- border-left: none;
473
- border-right: none;
524
+ border-inline-start: none;
525
+ border-inline-end: none;
474
526
  }
475
527
 
476
528
  /* No arrows: full border + radius */
@@ -479,42 +531,100 @@ ry-number-select[arrows="none"] .ry-number-select__display {
479
531
  border-radius: var(--ry-radius-md);
480
532
  }
481
533
 
482
- /* Start only: display gets right border + right radius */
534
+ /* Start only: display gets end border + end radius */
483
535
  ry-number-select[arrows="start"] .ry-number-select__display {
484
- border-right: var(--ry-border-width) solid var(--ry-color-border);
485
- border-left: none;
486
- border-radius: 0 var(--ry-radius-md) var(--ry-radius-md) 0;
536
+ border-inline-end: var(--ry-border-width) solid var(--ry-color-border);
537
+ border-inline-start: none;
538
+ border-start-start-radius: 0;
539
+ border-end-start-radius: 0;
540
+ border-start-end-radius: var(--ry-radius-md);
541
+ border-end-end-radius: var(--ry-radius-md);
487
542
  }
488
543
 
489
- /* End only: display gets left border + left radius */
544
+ /* End only: display gets start border + start radius */
490
545
  ry-number-select[arrows="end"] .ry-number-select__display {
491
- border-left: var(--ry-border-width) solid var(--ry-color-border);
492
- border-right: none;
493
- border-radius: var(--ry-radius-md) 0 0 var(--ry-radius-md);
546
+ border-inline-start: var(--ry-border-width) solid var(--ry-color-border);
547
+ border-inline-end: none;
548
+ border-start-start-radius: var(--ry-radius-md);
549
+ border-end-start-radius: var(--ry-radius-md);
550
+ border-start-end-radius: 0;
551
+ border-end-end-radius: 0;
494
552
  }
495
553
 
496
554
  /* Stacked: top-rounded increment, bottom-rounded decrement, no radius on display */
497
555
  ry-number-select[arrows="stacked"] .ry-number-select__increment {
498
556
  border: var(--ry-border-width) solid var(--ry-color-border);
499
- border-bottom: none;
557
+ border-block-end: none;
500
558
  border-radius: var(--ry-radius-md) var(--ry-radius-md) 0 0;
501
- border-left: var(--ry-border-width) solid var(--ry-color-border);
502
559
  }
503
560
 
504
561
  ry-number-select[arrows="stacked"] .ry-number-select__decrement {
505
562
  border: var(--ry-border-width) solid var(--ry-color-border);
506
- border-top: none;
563
+ border-block-start: none;
507
564
  border-radius: 0 0 var(--ry-radius-md) var(--ry-radius-md);
508
- border-right: var(--ry-border-width) solid var(--ry-color-border);
509
565
  }
510
566
 
511
567
  ry-number-select[arrows="stacked"] .ry-number-select__display {
512
568
  border: var(--ry-border-width) solid var(--ry-color-border);
513
- border-top: none;
514
- border-bottom: none;
569
+ border-block-start: none;
570
+ border-block-end: none;
515
571
  border-radius: 0;
516
572
  }
517
573
 
574
+ /* Stacked-end: display start-rounded, buttons end-rounded */
575
+ ry-number-select[arrows="stacked-end"] .ry-number-select__display {
576
+ border: var(--ry-border-width) solid var(--ry-color-border);
577
+ border-inline-end: none;
578
+ border-start-start-radius: var(--ry-radius-md);
579
+ border-end-start-radius: var(--ry-radius-md);
580
+ border-start-end-radius: 0;
581
+ border-end-end-radius: 0;
582
+ }
583
+
584
+ ry-number-select[arrows="stacked-end"] .ry-number-select__increment {
585
+ border: var(--ry-border-width) solid var(--ry-color-border);
586
+ border-block-end: none;
587
+ border-start-end-radius: var(--ry-radius-md);
588
+ border-start-start-radius: 0;
589
+ border-end-start-radius: 0;
590
+ border-end-end-radius: 0;
591
+ }
592
+
593
+ ry-number-select[arrows="stacked-end"] .ry-number-select__decrement {
594
+ border: var(--ry-border-width) solid var(--ry-color-border);
595
+ border-end-end-radius: var(--ry-radius-md);
596
+ border-start-start-radius: 0;
597
+ border-start-end-radius: 0;
598
+ border-end-start-radius: 0;
599
+ }
600
+
601
+ /* Stacked-start: buttons start-rounded, display end-rounded */
602
+ ry-number-select[arrows="stacked-start"] .ry-number-select__display {
603
+ border: var(--ry-border-width) solid var(--ry-color-border);
604
+ border-inline-start: none;
605
+ border-start-start-radius: 0;
606
+ border-end-start-radius: 0;
607
+ border-start-end-radius: var(--ry-radius-md);
608
+ border-end-end-radius: var(--ry-radius-md);
609
+ }
610
+
611
+ ry-number-select[arrows="stacked-start"] .ry-number-select__increment {
612
+ border: var(--ry-border-width) solid var(--ry-color-border);
613
+ border-block-end: none;
614
+ border-start-start-radius: var(--ry-radius-md);
615
+ border-start-end-radius: 0;
616
+ border-end-start-radius: 0;
617
+ border-end-end-radius: 0;
618
+ }
619
+
620
+ ry-number-select[arrows="stacked-start"] .ry-number-select__decrement {
621
+ border: var(--ry-border-width) solid var(--ry-color-border);
622
+ border-end-start-radius: var(--ry-radius-md);
623
+ border-start-start-radius: 0;
624
+ border-start-end-radius: 0;
625
+ border-end-end-radius: 0;
626
+ }
627
+
518
628
  .ry-number-select__value {
519
629
  font-family: var(--ry-font-mono);
520
630
  font-size: var(--ry-text-sm);
@@ -529,7 +639,7 @@ ry-number-select[arrows="stacked"] .ry-number-select__display {
529
639
  color: var(--ry-color-text);
530
640
  background: transparent;
531
641
  border: none;
532
- border-bottom: 2px solid var(--ry-color-primary);
642
+ border-block-end: 2px solid var(--ry-color-primary);
533
643
  }
534
644
 
535
645
  .ry-number-select__display:focus-visible {
@@ -585,8 +695,7 @@ ry-card p {
585
695
  BADGES
586
696
  ═══════════════════════════════════════════════════════════════ */
587
697
 
588
- .ry-badge,
589
- ry-badge {
698
+ :is(.ry-badge, ry-badge) {
590
699
  font-size: var(--ry-text-xs);
591
700
  font-weight: var(--ry-font-medium);
592
701
  background-color: var(--ry-color-bg-muted);
@@ -594,71 +703,72 @@ ry-badge {
594
703
  border-radius: var(--ry-radius-full);
595
704
  }
596
705
 
597
- .ry-badge--primary,
598
- ry-badge[variant="primary"] {
706
+ :is(.ry-badge--primary, ry-badge[variant="primary"]) {
599
707
  background-color: var(--ry-color-primary);
600
708
  color: var(--ry-color-text-inverse);
601
709
  }
602
710
 
603
- .ry-badge--success,
604
- ry-badge[variant="success"] {
711
+ :is(.ry-badge--success, ry-badge[variant="success"]) {
605
712
  background-color: var(--ry-color-success);
606
713
  color: var(--ry-color-text-inverse);
607
714
  }
608
715
 
609
- .ry-badge--warning,
610
- ry-badge[variant="warning"] {
716
+ :is(.ry-badge--warning, ry-badge[variant="warning"]) {
611
717
  background-color: var(--ry-color-warning);
612
718
  color: var(--ry-color-text);
613
719
  }
614
720
 
615
- .ry-badge--danger,
616
- ry-badge[variant="danger"] {
721
+ :is(.ry-badge--danger, ry-badge[variant="danger"]) {
617
722
  background-color: var(--ry-color-danger);
618
723
  color: var(--ry-color-text-inverse);
619
724
  }
620
725
 
726
+ :is(.ry-badge--accent, ry-badge[variant="accent"]) {
727
+ background-color: var(--ry-color-accent);
728
+ color: var(--ry-color-text-inverse);
729
+ }
730
+
731
+ /* Arbitrary color via style="--ry-badge-color: ..." */
732
+ ry-badge[style*="--ry-badge-color"] {
733
+ background-color: var(--ry-badge-color);
734
+ color: var(--ry-badge-text, var(--ry-color-text-inverse));
735
+ }
736
+
621
737
  /* ═══════════════════════════════════════════════════════════════
622
738
  ALERTS
623
739
  ═══════════════════════════════════════════════════════════════ */
624
740
 
625
- .ry-alert,
626
- ry-alert {
741
+ :is(.ry-alert, ry-alert) {
627
742
  background-color: var(--ry-color-bg-subtle);
628
743
  border: var(--ry-border-width) solid var(--ry-color-border);
629
744
  border-radius: var(--ry-radius-lg);
630
745
  }
631
746
 
632
- .ry-alert--info,
633
- ry-alert[type="info"] {
634
- background-color: var(--ry-color-info-bg, #ecfeff);
747
+ :is(.ry-alert--info, ry-alert[type="info"]) {
748
+ background-color: var(--ry-color-info-bg);
635
749
  border-color: var(--ry-color-info);
636
- color: var(--ry-color-info-text, #0e7490);
750
+ color: var(--ry-color-info-text);
637
751
  }
638
752
 
639
- .ry-alert--success,
640
- ry-alert[type="success"] {
641
- background-color: var(--ry-color-success-bg, #f0fdf4);
753
+ :is(.ry-alert--success, ry-alert[type="success"]) {
754
+ background-color: var(--ry-color-success-bg);
642
755
  border-color: var(--ry-color-success);
643
- color: var(--ry-color-success-text, #15803d);
756
+ color: var(--ry-color-success-text);
644
757
  }
645
758
 
646
- .ry-alert--warning,
647
- ry-alert[type="warning"] {
648
- background-color: var(--ry-color-warning-bg, #fffbeb);
759
+ :is(.ry-alert--warning, ry-alert[type="warning"]) {
760
+ background-color: var(--ry-color-warning-bg);
649
761
  border-color: var(--ry-color-warning);
650
- color: var(--ry-color-warning-text, #b45309);
762
+ color: var(--ry-color-warning-text);
651
763
  }
652
764
 
653
- .ry-alert--danger,
654
- ry-alert[type="danger"] {
655
- background-color: var(--ry-color-danger-bg, #fef2f2);
765
+ :is(.ry-alert--danger, ry-alert[type="danger"]) {
766
+ background-color: var(--ry-color-danger-bg);
656
767
  border-color: var(--ry-color-danger);
657
- color: var(--ry-color-danger-text, #b91c1c);
768
+ color: var(--ry-color-danger-text);
658
769
  }
659
770
 
660
- .ry-alert__title,
661
- ry-alert [slot="title"] {
771
+ :is(.ry-alert__title, ry-alert [slot="title"]) {
662
772
  font-weight: var(--ry-font-semibold);
663
773
  }
664
774
 
@@ -666,10 +776,7 @@ ry-alert [slot="title"] {
666
776
  FORM ELEMENTS
667
777
  ═══════════════════════════════════════════════════════════════ */
668
778
 
669
- .ry-input,
670
- ry-field input,
671
- ry-field textarea,
672
- ry-field select {
779
+ :is(.ry-input, ry-field input, ry-field textarea, ry-field select) {
673
780
  font-family: var(--ry-font-sans);
674
781
  font-size: var(--ry-text-base);
675
782
  line-height: var(--ry-leading-normal);
@@ -683,40 +790,50 @@ ry-field select {
683
790
  box-shadow var(--ry-duration-fast) var(--ry-ease);
684
791
  }
685
792
 
686
- .ry-input:hover,
687
- ry-field input:hover,
688
- ry-field textarea:hover {
793
+ :is(.ry-input, ry-field input, ry-field textarea):hover {
689
794
  border-color: var(--ry-color-border-strong);
690
795
  }
691
796
 
692
- .ry-input:focus,
693
- ry-field input:focus,
694
- ry-field textarea:focus {
797
+ :is(.ry-input, ry-field input, ry-field textarea):focus {
695
798
  outline: none;
696
799
  border-color: var(--ry-color-primary);
697
800
  box-shadow: var(--ry-focus-ring);
698
801
  }
699
802
 
700
- .ry-input::placeholder,
701
- ry-field input::placeholder,
702
- ry-field textarea::placeholder {
803
+ :is(.ry-input, ry-field input, ry-field textarea)::placeholder {
703
804
  color: var(--ry-color-text-muted);
704
805
  }
705
806
 
706
- .ry-input:disabled,
707
- ry-field input:disabled,
708
- ry-field textarea:disabled {
807
+ :is(.ry-input, ry-field input, ry-field textarea):disabled {
709
808
  background-color: var(--ry-color-bg-muted);
710
809
  opacity: 0.5;
711
810
  }
712
811
 
713
- .ry-label,
714
- ry-field label {
812
+ :is(.ry-label, ry-field label) {
715
813
  font-size: var(--ry-text-sm);
716
814
  font-weight: var(--ry-font-medium);
717
815
  color: var(--ry-color-text);
718
816
  }
719
817
 
818
+ .ry-field__error {
819
+ font-size: var(--ry-text-sm);
820
+ color: var(--ry-color-danger);
821
+ }
822
+
823
+ .ry-field__hint {
824
+ font-size: var(--ry-text-sm);
825
+ color: var(--ry-color-text-muted);
826
+ }
827
+
828
+ /* Error state on input */
829
+ ry-field:has([data-ry-target="error"]:not(:empty)) :is(input, textarea, select) {
830
+ border-color: var(--ry-color-danger);
831
+ }
832
+
833
+ ry-field:has([data-ry-target="error"]:not(:empty)) :is(input, textarea, select):focus {
834
+ box-shadow: 0 0 0 3px light-dark(oklch(0.637 0.208 25.3 / 0.3), oklch(0.637 0.208 25.3 / 0.3));
835
+ }
836
+
720
837
  /* ═══════════════════════════════════════════════════════════════
721
838
  ACCORDION
722
839
  ═══════════════════════════════════════════════════════════════ */
@@ -726,14 +843,12 @@ ry-accordion {
726
843
  border-radius: var(--ry-radius-lg);
727
844
  }
728
845
 
729
- .ry-accordion__item,
730
- ry-accordion-item {
731
- border-bottom: var(--ry-border-width) solid var(--ry-color-border);
846
+ :is(.ry-accordion__item, ry-accordion-item) {
847
+ border-block-end: var(--ry-border-width) solid var(--ry-color-border);
732
848
  }
733
849
 
734
- .ry-accordion__item:last-child,
735
- ry-accordion-item:last-child {
736
- border-bottom: none;
850
+ :is(.ry-accordion__item, ry-accordion-item):last-child {
851
+ border-block-end: none;
737
852
  }
738
853
 
739
854
  .ry-accordion__trigger {
@@ -763,7 +878,7 @@ ry-accordion-item:last-child {
763
878
  ═══════════════════════════════════════════════════════════════ */
764
879
 
765
880
  .ry-tabs__list {
766
- border-bottom: var(--ry-border-width) solid var(--ry-color-border);
881
+ border-block-end: var(--ry-border-width) solid var(--ry-color-border);
767
882
  }
768
883
 
769
884
  .ry-tabs__trigger {
@@ -782,7 +897,7 @@ ry-accordion-item:last-child {
782
897
 
783
898
  .ry-tabs__trigger[aria-selected="true"] {
784
899
  color: var(--ry-color-primary);
785
- border-bottom-color: var(--ry-color-primary);
900
+ border-block-end-color: var(--ry-color-primary);
786
901
  }
787
902
 
788
903
  .ry-tabs__trigger:focus-visible {
@@ -806,7 +921,7 @@ ry-accordion-item:last-child {
806
921
  }
807
922
 
808
923
  .ry-modal__header {
809
- border-bottom: var(--ry-border-width) solid var(--ry-color-border);
924
+ border-block-end: var(--ry-border-width) solid var(--ry-color-border);
810
925
  }
811
926
 
812
927
  .ry-modal__title {
@@ -829,7 +944,7 @@ ry-accordion-item:last-child {
829
944
  }
830
945
 
831
946
  .ry-modal__footer {
832
- border-top: var(--ry-border-width) solid var(--ry-color-border);
947
+ border-block-start: var(--ry-border-width) solid var(--ry-color-border);
833
948
  background-color: var(--ry-color-bg-subtle);
834
949
  }
835
950
 
@@ -837,16 +952,14 @@ ry-accordion-item:last-child {
837
952
  DROPDOWN
838
953
  ═══════════════════════════════════════════════════════════════ */
839
954
 
840
- .ry-dropdown__menu,
841
- ry-menu {
955
+ :is(.ry-dropdown__menu, ry-menu) {
842
956
  background-color: var(--ry-color-bg);
843
957
  border: var(--ry-border-width) solid var(--ry-color-border);
844
958
  border-radius: var(--ry-radius-lg);
845
959
  box-shadow: var(--ry-shadow-lg);
846
960
  }
847
961
 
848
- .ry-dropdown__item,
849
- ry-menu-item {
962
+ :is(.ry-dropdown__item, ry-menu-item) {
850
963
  font-family: var(--ry-font-sans);
851
964
  font-size: var(--ry-text-sm);
852
965
  color: var(--ry-color-text);
@@ -855,13 +968,11 @@ ry-menu-item {
855
968
  transition: background-color var(--ry-duration-fast) var(--ry-ease);
856
969
  }
857
970
 
858
- .ry-dropdown__item:hover,
859
- ry-menu-item:hover {
971
+ :is(.ry-dropdown__item, ry-menu-item):hover {
860
972
  background-color: var(--ry-color-bg-muted);
861
973
  }
862
974
 
863
- .ry-dropdown__item:focus-visible,
864
- ry-menu-item:focus-visible {
975
+ :is(.ry-dropdown__item, ry-menu-item):focus-visible {
865
976
  outline: none;
866
977
  box-shadow: inset var(--ry-focus-ring);
867
978
  }
@@ -1063,8 +1174,7 @@ ry-select[data-ry-state="open"] .ry-select__trigger {
1063
1174
  transition: background-color var(--ry-duration-fast) var(--ry-ease);
1064
1175
  }
1065
1176
 
1066
- .ry-select__option:hover,
1067
- .ry-select__option[data-highlighted] {
1177
+ .ry-select__option:is(:hover, [data-highlighted]) {
1068
1178
  background-color: var(--ry-color-bg-muted);
1069
1179
  }
1070
1180
 
@@ -1081,106 +1191,131 @@ ry-select[data-ry-state="open"] .ry-select__trigger {
1081
1191
  background-color: transparent;
1082
1192
  }
1083
1193
 
1194
+ /* Multi-select checkmarks */
1195
+ .ry-select__check {
1196
+ color: var(--ry-color-primary);
1197
+ }
1198
+
1199
+ .ry-select__clear {
1200
+ background: transparent;
1201
+ color: var(--ry-color-text-muted);
1202
+ border-radius: var(--ry-radius-full);
1203
+ transition: color var(--ry-duration-fast) var(--ry-ease);
1204
+ }
1205
+
1206
+ .ry-select__clear:hover {
1207
+ color: var(--ry-color-text);
1208
+ }
1209
+
1210
+ /* Multi: checkmark is the indicator, no bg change on selected */
1211
+ ry-select[multiple] .ry-select__option[aria-selected="true"] {
1212
+ background-color: transparent;
1213
+ color: var(--ry-color-text);
1214
+ }
1215
+
1216
+ ry-select[multiple] .ry-select__option[aria-selected="true"]:is(:hover, [data-highlighted]) {
1217
+ background-color: var(--ry-color-bg-muted);
1218
+ }
1219
+
1084
1220
  /* ═══════════════════════════════════════════════════════════════
1085
1221
  CODE
1086
1222
  ═══════════════════════════════════════════════════════════════ */
1087
1223
 
1088
1224
  ry-code {
1089
- background-color: var(--ry-code-bg, #f6f8fa);
1225
+ background-color: var(--ry-code-bg);
1090
1226
  border-radius: var(--ry-radius-lg);
1091
1227
  box-shadow: var(--ry-shadow-lg);
1092
1228
  }
1093
1229
 
1094
1230
  .ry-code__header {
1095
- background-color: var(--ry-code-header-bg, #eaeef2);
1231
+ background-color: var(--ry-code-header-bg);
1096
1232
  }
1097
1233
 
1098
1234
  .ry-code__title {
1099
1235
  font-family: var(--ry-font-sans);
1100
1236
  font-size: var(--ry-text-xs);
1101
1237
  font-weight: var(--ry-font-bold);
1102
- color: var(--ry-code-title-color, #57606a);
1238
+ color: var(--ry-code-title-color);
1103
1239
  }
1104
1240
 
1105
1241
  .ry-code__copy {
1106
1242
  background: transparent;
1107
1243
  border-radius: var(--ry-radius-full);
1108
- color: var(--ry-code-icon-color, #8c959f);
1244
+ color: var(--ry-code-icon-color);
1109
1245
  transition: background-color var(--ry-duration-fast) var(--ry-ease),
1110
1246
  color var(--ry-duration-fast) var(--ry-ease);
1111
1247
  }
1112
1248
 
1113
1249
  .ry-code__copy:hover {
1114
- background-color: var(--ry-code-icon-hover-bg, #d0d7de);
1115
- color: var(--ry-code-icon-hover-color, #24292f);
1250
+ background-color: var(--ry-code-icon-hover-bg);
1251
+ color: var(--ry-code-icon-hover-color);
1116
1252
  }
1117
1253
 
1118
1254
  .ry-code__copy--success {
1119
1255
  color: var(--ry-color-success);
1120
1256
  }
1121
1257
 
1122
- .ry-code__pre,
1123
- .ry-code__code {
1258
+ :is(.ry-code__pre, .ry-code__code) {
1124
1259
  font-family: var(--ry-font-mono);
1125
1260
  font-size: var(--ry-text-sm);
1126
1261
  line-height: var(--ry-leading-relaxed);
1127
- color: var(--ry-code-text-color, #24292f);
1262
+ color: var(--ry-code-text-color);
1128
1263
  }
1129
1264
 
1130
1265
  .ry-code__line-number {
1131
- color: var(--ry-code-line-number-color, rgba(140, 149, 159, 0.6));
1132
- border-right: 1px solid var(--ry-code-line-border-color, #d0d7de);
1266
+ color: var(--ry-code-line-number-color);
1267
+ border-inline-end: 1px solid var(--ry-code-line-border-color);
1133
1268
  }
1134
1269
 
1135
1270
  .ry-code__color-preview {
1136
- border: 1px solid var(--ry-code-color-preview-border, rgba(36, 41, 47, 0.3));
1271
+ border: 1px solid var(--ry-code-color-preview-border);
1137
1272
  border-radius: var(--ry-radius-sm);
1138
1273
  }
1139
1274
 
1140
- /* Syntax highlighting colors (Cool/GitHub light as default) */
1275
+ /* Syntax highlighting colors */
1141
1276
  .ry-code__keyword {
1142
- color: var(--ry-code-keyword, #cf222e);
1277
+ color: var(--ry-code-keyword);
1143
1278
  }
1144
1279
 
1145
1280
  .ry-code__property {
1146
- color: var(--ry-code-property, #0550ae);
1281
+ color: var(--ry-code-property);
1147
1282
  }
1148
1283
 
1149
1284
  .ry-code__value {
1150
- color: var(--ry-code-value, #0a3069);
1285
+ color: var(--ry-code-value);
1151
1286
  }
1152
1287
 
1153
1288
  .ry-code__string {
1154
- color: var(--ry-code-string, #0a3069);
1289
+ color: var(--ry-code-string);
1155
1290
  }
1156
1291
 
1157
1292
  .ry-code__number {
1158
- color: var(--ry-code-number, #0550ae);
1293
+ color: var(--ry-code-number);
1159
1294
  }
1160
1295
 
1161
1296
  .ry-code__comment {
1162
- color: var(--ry-code-comment, #6e7781);
1297
+ color: var(--ry-code-comment);
1163
1298
  font-style: italic;
1164
1299
  }
1165
1300
 
1166
1301
  .ry-code__selector {
1167
- color: var(--ry-code-selector, #116329);
1302
+ color: var(--ry-code-selector);
1168
1303
  }
1169
1304
 
1170
1305
  .ry-code__punctuation {
1171
- color: var(--ry-code-punctuation, #24292f);
1306
+ color: var(--ry-code-punctuation);
1172
1307
  }
1173
1308
 
1174
1309
  .ry-code__tag {
1175
- color: var(--ry-code-tag, #116329);
1310
+ color: var(--ry-code-tag);
1176
1311
  }
1177
1312
 
1178
1313
  .ry-code__attribute {
1179
- color: var(--ry-code-attribute, #0550ae);
1314
+ color: var(--ry-code-attribute);
1180
1315
  }
1181
1316
 
1182
1317
  .ry-code__color {
1183
- color: var(--ry-code-value, #0a3069);
1318
+ color: var(--ry-code-value);
1184
1319
  }
1185
1320
 
1186
1321
  /* ═══════════════════════════════════════════════════════════════
@@ -1249,8 +1384,8 @@ input[type="checkbox"]:checked:hover {
1249
1384
  }
1250
1385
 
1251
1386
  input[type="checkbox"]::after {
1252
- border-right: 2px solid var(--ry-color-text-inverse);
1253
- border-bottom: 2px solid var(--ry-color-text-inverse);
1387
+ border-inline-end: 2px solid var(--ry-color-text-inverse);
1388
+ border-block-end: 2px solid var(--ry-color-text-inverse);
1254
1389
  margin-bottom: 2px;
1255
1390
  }
1256
1391
 
@@ -1314,15 +1449,15 @@ th {
1314
1449
  font-weight: var(--ry-font-semibold);
1315
1450
  color: var(--ry-color-text);
1316
1451
  background-color: var(--ry-color-bg-subtle);
1317
- border-bottom: var(--ry-border-width) solid var(--ry-color-border);
1452
+ border-block-end: var(--ry-border-width) solid var(--ry-color-border);
1318
1453
  }
1319
1454
 
1320
1455
  td {
1321
- border-bottom: var(--ry-border-width) solid var(--ry-color-border);
1456
+ border-block-end: var(--ry-border-width) solid var(--ry-color-border);
1322
1457
  }
1323
1458
 
1324
1459
  tbody tr:last-child td {
1325
- border-bottom: none;
1460
+ border-block-end: none;
1326
1461
  }
1327
1462
 
1328
1463
  tbody tr:hover {
@@ -1335,8 +1470,7 @@ table[data-bordered] {
1335
1470
  border-radius: var(--ry-radius-lg);
1336
1471
  }
1337
1472
 
1338
- table[data-bordered] th,
1339
- table[data-bordered] td {
1473
+ table[data-bordered] :is(th, td) {
1340
1474
  border: var(--ry-border-width) solid var(--ry-color-border);
1341
1475
  }
1342
1476
 
@@ -1371,7 +1505,7 @@ ry-color-picker [data-ry-target="trigger"]:focus-visible {
1371
1505
 
1372
1506
  ry-color-picker [data-ry-target="trigger-color"] {
1373
1507
  border-radius: calc(var(--ry-radius-md) - 1px);
1374
- outline: 3px solid rgba(0, 0, 0, 0.2);
1508
+ outline: 3px solid oklch(0 0 0 / 0.2);
1375
1509
  outline-offset: -3px;
1376
1510
  }
1377
1511
 
@@ -1400,12 +1534,12 @@ ry-color-picker [data-ry-target="grid-handle"] {
1400
1534
  background-color: transparent;
1401
1535
  border: 2px solid #fff;
1402
1536
  border-radius: var(--ry-radius-full);
1403
- box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.3), inset 0 0 0 1px rgba(0, 0, 0, 0.3);
1537
+ box-shadow: 0 0 0 1px oklch(0 0 0 / 0.3), inset 0 0 0 1px oklch(0 0 0 / 0.3);
1404
1538
  }
1405
1539
 
1406
1540
  ry-color-picker [data-ry-target="grid-handle"]:focus-visible {
1407
1541
  outline: none;
1408
- 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);
1542
+ 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);
1409
1543
  }
1410
1544
 
1411
1545
  /* Hue slider */
@@ -1437,12 +1571,12 @@ ry-color-picker .ry-color-picker__alpha {
1437
1571
  ry-color-picker .ry-color-picker__slider-handle {
1438
1572
  background-color: #fff;
1439
1573
  border-radius: var(--ry-radius-full);
1440
- box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.2), var(--ry-shadow-sm);
1574
+ box-shadow: 0 0 0 1px oklch(0 0 0 / 0.2), var(--ry-shadow-sm);
1441
1575
  }
1442
1576
 
1443
1577
  ry-color-picker .ry-color-picker__slider-handle:focus-visible {
1444
1578
  outline: none;
1445
- box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.2), var(--ry-focus-ring);
1579
+ box-shadow: 0 0 0 1px oklch(0 0 0 / 0.2), var(--ry-focus-ring);
1446
1580
  }
1447
1581
 
1448
1582
  /* Preview */
@@ -1456,7 +1590,7 @@ ry-color-picker [data-ry-target="preview"] {
1456
1590
 
1457
1591
  ry-color-picker [data-ry-target="preview-color"] {
1458
1592
  border-radius: inherit;
1459
- outline: 3px solid rgba(0, 0, 0, 0.2);
1593
+ outline: 3px solid oklch(0 0 0 / 0.2);
1460
1594
  outline-offset: -3px;
1461
1595
  }
1462
1596
 
@@ -1550,7 +1684,7 @@ ry-color-input:focus-within [data-ry-target="trigger"] {
1550
1684
  ry-color-input [data-ry-target="swatch"] {
1551
1685
  background-image: repeating-conic-gradient(#ccc 0% 25%, #fff 0% 50%);
1552
1686
  background-size: 8px 8px;
1553
- border-right: var(--ry-border-width) solid var(--ry-color-border);
1687
+ border-inline-end: var(--ry-border-width) solid var(--ry-color-border);
1554
1688
  transition: background-color var(--ry-duration-fast) var(--ry-ease);
1555
1689
  }
1556
1690
 
@@ -1563,7 +1697,7 @@ ry-color-input [data-ry-target="swatch"]:focus-visible {
1563
1697
  }
1564
1698
 
1565
1699
  ry-color-input [data-ry-target="swatch-color"] {
1566
- box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1);
1700
+ box-shadow: inset 0 0 0 1px oklch(0 0 0 / 0.1);
1567
1701
  }
1568
1702
 
1569
1703
  ry-color-input [data-ry-target="input"] {
@@ -1647,7 +1781,7 @@ ry-gradient-picker [data-ry-target="shape-control"] button[data-active] {
1647
1781
  /* Gradient bar */
1648
1782
  ry-gradient-picker [data-ry-target="bar"] {
1649
1783
  border-radius: var(--ry-radius-full, 9999px);
1650
- box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1);
1784
+ box-shadow: inset 0 0 0 1px oklch(0 0 0 / 0.1);
1651
1785
  }
1652
1786
 
1653
1787
  /* Stop handles */
@@ -1655,7 +1789,7 @@ ry-gradient-picker [data-ry-target="stop"] {
1655
1789
  background-color: var(--stop-color, #fff);
1656
1790
  border: 2px solid #fff;
1657
1791
  border-radius: var(--ry-radius-full);
1658
- box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.3), var(--ry-shadow-sm);
1792
+ box-shadow: 0 0 0 1px oklch(0 0 0 / 0.3), var(--ry-shadow-sm);
1659
1793
  transition: transform var(--ry-duration-fast) var(--ry-ease),
1660
1794
  opacity var(--ry-duration-fast) var(--ry-ease);
1661
1795
  }
@@ -1719,7 +1853,7 @@ ry-tree {
1719
1853
 
1720
1854
  /* Vertical connector line */
1721
1855
  .ry-tree__children {
1722
- border-left: 1px solid var(--ry-color-border);
1856
+ border-inline-start: 1px solid var(--ry-color-border);
1723
1857
  }
1724
1858
 
1725
1859
  /* Horizontal connector line */
@@ -1727,8 +1861,7 @@ ry-tree {
1727
1861
  background-color: var(--ry-color-border);
1728
1862
  }
1729
1863
 
1730
- .ry-tree__label,
1731
- .ry-tree__file {
1864
+ :is(.ry-tree__label, .ry-tree__file) {
1732
1865
  font-family: var(--ry-font-sans);
1733
1866
  font-size: var(--ry-text-sm);
1734
1867
  color: var(--ry-color-text);
@@ -1736,8 +1869,7 @@ ry-tree {
1736
1869
  transition: background-color var(--ry-duration-fast) var(--ry-ease);
1737
1870
  }
1738
1871
 
1739
- .ry-tree__label:hover,
1740
- .ry-tree__file:hover {
1872
+ :is(.ry-tree__label, .ry-tree__file):hover {
1741
1873
  background-color: var(--ry-color-bg-muted);
1742
1874
  }
1743
1875
 
@@ -1778,12 +1910,11 @@ input[type="checkbox"].ry-tree__toggle::after {
1778
1910
  }
1779
1911
 
1780
1912
  .ry-tree__item--collapsed {
1781
- background-color: color-mix(in srgb, var(--ry-color-primary) 10%, transparent);
1913
+ background-color: color-mix(in oklch, var(--ry-color-primary) 10%, transparent);
1782
1914
  border-radius: var(--ry-radius-sm);
1783
1915
  }
1784
1916
 
1785
- .ry-tree__item[data-ry-drop-target="before"]::after,
1786
- .ry-tree__item[data-ry-drop-target="after"]::after {
1917
+ .ry-tree__item:is([data-ry-drop-target="before"], [data-ry-drop-target="after"])::after {
1787
1918
  background-color: var(--ry-color-primary);
1788
1919
  }
1789
1920
 
@@ -1796,3 +1927,273 @@ input[type="checkbox"].ry-tree__toggle::after {
1796
1927
  .ry-tree__item[data-ry-drop-target="inside"] > .ry-tree__label .ry-tree__icon {
1797
1928
  color: var(--ry-color-text-inverse);
1798
1929
  }
1930
+
1931
+ /* ═══════════════════════════════════════════════════════════════
1932
+ TAG
1933
+ ═══════════════════════════════════════════════════════════════ */
1934
+
1935
+ ry-tag {
1936
+ font-size: var(--ry-text-xs);
1937
+ font-weight: var(--ry-font-medium);
1938
+ background-color: var(--ry-color-bg-muted);
1939
+ color: var(--ry-color-text);
1940
+ border-radius: var(--ry-radius-full);
1941
+ }
1942
+
1943
+ ry-tag[variant="primary"] {
1944
+ background-color: var(--ry-color-primary);
1945
+ color: var(--ry-color-text-inverse);
1946
+ }
1947
+
1948
+ ry-tag[variant="success"] {
1949
+ background-color: var(--ry-color-success);
1950
+ color: var(--ry-color-text-inverse);
1951
+ }
1952
+
1953
+ ry-tag[variant="warning"] {
1954
+ background-color: var(--ry-color-warning);
1955
+ color: var(--ry-color-text);
1956
+ }
1957
+
1958
+ ry-tag[variant="danger"] {
1959
+ background-color: var(--ry-color-danger);
1960
+ color: var(--ry-color-text-inverse);
1961
+ }
1962
+
1963
+ ry-tag[disabled] {
1964
+ opacity: 0.5;
1965
+ }
1966
+
1967
+ .ry-tag__remove {
1968
+ background: transparent;
1969
+ color: currentColor;
1970
+ border-radius: var(--ry-radius-full);
1971
+ opacity: 0.6;
1972
+ transition: opacity var(--ry-duration-fast) var(--ry-ease);
1973
+ }
1974
+
1975
+ .ry-tag__remove:hover {
1976
+ opacity: 1;
1977
+ }
1978
+
1979
+ /* ═══════════════════════════════════════════════════════════════
1980
+ TAG INPUT
1981
+ ═══════════════════════════════════════════════════════════════ */
1982
+
1983
+ .ry-tag-input__container {
1984
+ background-color: var(--ry-color-bg);
1985
+ border: var(--ry-border-width) solid var(--ry-color-border);
1986
+ border-radius: var(--ry-radius-md);
1987
+ transition: border-color var(--ry-duration-fast) var(--ry-ease),
1988
+ box-shadow var(--ry-duration-fast) var(--ry-ease);
1989
+ }
1990
+
1991
+ .ry-tag-input__container:hover {
1992
+ border-color: var(--ry-color-border-strong);
1993
+ }
1994
+
1995
+ .ry-tag-input__container:focus-within {
1996
+ border-color: var(--ry-color-primary);
1997
+ box-shadow: var(--ry-focus-ring);
1998
+ }
1999
+
2000
+ .ry-tag-input__input {
2001
+ font-family: var(--ry-font-sans);
2002
+ font-size: var(--ry-text-sm);
2003
+ color: var(--ry-color-text);
2004
+ background: transparent;
2005
+ border: none;
2006
+ }
2007
+
2008
+ .ry-tag-input__input:focus,
2009
+ .ry-tag-input__input:focus-visible {
2010
+ outline: none;
2011
+ box-shadow: none;
2012
+ }
2013
+
2014
+ .ry-tag-input__input::placeholder {
2015
+ color: var(--ry-color-text-muted);
2016
+ }
2017
+
2018
+ ry-tag-input[disabled] .ry-tag-input__container {
2019
+ opacity: 0.5;
2020
+ background-color: var(--ry-color-bg-muted);
2021
+ }
2022
+
2023
+ /* ═══════════════════════════════════════════════════════════════
2024
+ HERO
2025
+ ═══════════════════════════════════════════════════════════════ */
2026
+
2027
+ ry-hero h1 {
2028
+ font-size: var(--ry-text-4xl);
2029
+ font-weight: var(--ry-font-bold);
2030
+ line-height: var(--ry-leading-tight);
2031
+ color: var(--ry-color-text);
2032
+ }
2033
+
2034
+ ry-hero p {
2035
+ font-size: var(--ry-text-lg);
2036
+ line-height: var(--ry-leading-relaxed);
2037
+ color: var(--ry-color-text-muted);
2038
+ }
2039
+
2040
+ /* ═══════════════════════════════════════════════════════════════
2041
+ STAT
2042
+ ═══════════════════════════════════════════════════════════════ */
2043
+
2044
+ .ry-stat__value {
2045
+ font-size: var(--ry-text-3xl);
2046
+ font-weight: var(--ry-font-bold);
2047
+ color: var(--ry-color-text);
2048
+ }
2049
+
2050
+ ry-stat[size="sm"] .ry-stat__value {
2051
+ font-size: var(--ry-text-2xl);
2052
+ }
2053
+
2054
+ ry-stat[size="lg"] .ry-stat__value {
2055
+ font-size: var(--ry-text-4xl);
2056
+ }
2057
+
2058
+ .ry-stat__label {
2059
+ font-size: var(--ry-text-sm);
2060
+ color: var(--ry-color-text-muted);
2061
+ }
2062
+
2063
+ .ry-stat__trend--up {
2064
+ color: var(--ry-color-success);
2065
+ }
2066
+
2067
+ .ry-stat__trend--down {
2068
+ color: var(--ry-color-danger);
2069
+ }
2070
+
2071
+ /* ═══════════════════════════════════════════════════════════════
2072
+ FEATURE
2073
+ ═══════════════════════════════════════════════════════════════ */
2074
+
2075
+ .ry-feature__icon {
2076
+ background-color: var(--ry-color-primary);
2077
+ color: var(--ry-color-text-inverse);
2078
+ border-radius: var(--ry-radius-full);
2079
+ }
2080
+
2081
+ ry-feature h3 {
2082
+ font-size: var(--ry-text-lg);
2083
+ font-weight: var(--ry-font-semibold);
2084
+ color: var(--ry-color-text);
2085
+ }
2086
+
2087
+ ry-feature p {
2088
+ font-size: var(--ry-text-sm);
2089
+ color: var(--ry-color-text-muted);
2090
+ line-height: var(--ry-leading-relaxed);
2091
+ }
2092
+
2093
+ /* ═══════════════════════════════════════════════════════════════
2094
+ PRICING
2095
+ ═══════════════════════════════════════════════════════════════ */
2096
+
2097
+ ry-pricing-card {
2098
+ background-color: var(--ry-color-bg);
2099
+ border: var(--ry-border-width) solid var(--ry-color-border);
2100
+ border-radius: var(--ry-radius-xl);
2101
+ box-shadow: var(--ry-shadow-sm);
2102
+ }
2103
+
2104
+ ry-pricing-card[featured] {
2105
+ border-color: var(--ry-color-primary);
2106
+ box-shadow: var(--ry-shadow-lg);
2107
+ }
2108
+
2109
+ ry-pricing-card h3 {
2110
+ font-size: var(--ry-text-xl);
2111
+ font-weight: var(--ry-font-semibold);
2112
+ color: var(--ry-color-text);
2113
+ }
2114
+
2115
+ ry-pricing-card [slot="price"] {
2116
+ font-size: var(--ry-text-4xl);
2117
+ font-weight: var(--ry-font-bold);
2118
+ color: var(--ry-color-text);
2119
+ }
2120
+
2121
+ ry-pricing-card [slot="price"] span {
2122
+ font-size: var(--ry-text-base);
2123
+ font-weight: var(--ry-font-normal);
2124
+ color: var(--ry-color-text-muted);
2125
+ }
2126
+
2127
+ ry-pricing-card ul li {
2128
+ border-block-end: var(--ry-border-width) solid var(--ry-color-border);
2129
+ font-size: var(--ry-text-sm);
2130
+ color: var(--ry-color-text-muted);
2131
+ }
2132
+
2133
+ ry-pricing-card ul li:last-child {
2134
+ border-block-end: none;
2135
+ }
2136
+
2137
+ /* ═══════════════════════════════════════════════════════════════
2138
+ CAROUSEL
2139
+ ═══════════════════════════════════════════════════════════════ */
2140
+
2141
+ .ry-carousel__arrow {
2142
+ background-color: var(--ry-color-bg);
2143
+ color: var(--ry-color-text);
2144
+ border-radius: var(--ry-radius-full);
2145
+ box-shadow: var(--ry-shadow-md);
2146
+ transition: background-color var(--ry-duration-fast) var(--ry-ease),
2147
+ box-shadow var(--ry-duration-fast) var(--ry-ease);
2148
+ }
2149
+
2150
+ .ry-carousel__arrow:hover {
2151
+ background-color: var(--ry-color-bg-muted);
2152
+ box-shadow: var(--ry-shadow-lg);
2153
+ }
2154
+
2155
+ .ry-carousel__arrow:focus-visible {
2156
+ outline: none;
2157
+ box-shadow: var(--ry-focus-ring);
2158
+ }
2159
+
2160
+ .ry-carousel__dot {
2161
+ background-color: var(--ry-color-border);
2162
+ border-radius: var(--ry-radius-full);
2163
+ transition: background-color var(--ry-duration-fast) var(--ry-ease);
2164
+ }
2165
+
2166
+ .ry-carousel__dot[data-active] {
2167
+ background-color: var(--ry-color-primary);
2168
+ }
2169
+
2170
+ .ry-carousel__dot:hover {
2171
+ background-color: var(--ry-color-primary-hover);
2172
+ }
2173
+
2174
+ /* ═══════════════════════════════════════════════════════════════
2175
+ CHECK LIST
2176
+ ═══════════════════════════════════════════════════════════════ */
2177
+
2178
+ .ry-check-list {
2179
+ list-style: none;
2180
+ padding: 0;
2181
+ margin: 0;
2182
+ }
2183
+
2184
+ .ry-check-list li {
2185
+ padding-inline-start: var(--ry-space-6);
2186
+ position: relative;
2187
+ margin-block-end: var(--ry-space-2);
2188
+ color: var(--ry-color-text);
2189
+ }
2190
+
2191
+ .ry-check-list li::before {
2192
+ content: '\2713';
2193
+ position: absolute;
2194
+ inset-inline-start: 0;
2195
+ color: var(--ry-color-success);
2196
+ font-weight: var(--ry-font-bold);
2197
+ }
2198
+
2199
+ } /* @layer ry-theme */