@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
@@ -10,6 +10,13 @@
10
10
  * only theme CSS requires .ry-* classes.
11
11
  */
12
12
 
13
+ @layer ry-structure {
14
+
15
+ /* Enable native height: auto animation for all components */
16
+ :root {
17
+ interpolate-size: allow-keywords;
18
+ }
19
+
13
20
  /* ═══════════════════════════════════════════════════════════════
14
21
  SCROLL LOCK (for modals, drawers)
15
22
  ═══════════════════════════════════════════════════════════════ */
@@ -31,20 +38,23 @@ ry {
31
38
  BOX SIZING RESET
32
39
  ═══════════════════════════════════════════════════════════════ */
33
40
 
34
- [data-ry-target],
35
- ry-page, ry-header, ry-main, ry-footer, ry-section, ry-aside,
36
- ry-grid, ry-stack, ry-cluster, ry-split, ry-center,
37
- ry-card, ry-accordion, ry-modal, ry-tabs, ry-dropdown,
38
- ry-button, ry-badge, ry-alert, ry-field, ry-nav, ry-logo, ry-actions,
39
- ry-accordion-item, ry-tab, ry-menu, ry-menu-item, ry-divider,
40
- ry-theme-toggle, ry-select, ry-switch, ry-tooltip, ry-drawer, ry-toast,
41
- ry-toggle-button, ry-knob, ry-slider, ry-color-picker, ry-color-input {
41
+ :where([data-ry-target],
42
+ ry-page, ry-header, ry-main, ry-footer, ry-section, ry-aside,
43
+ ry-grid, ry-stack, ry-cluster, ry-split, ry-center,
44
+ ry-card, ry-accordion, ry-modal, ry-tabs, ry-dropdown,
45
+ ry-button, ry-badge, ry-alert, ry-field, ry-nav, ry-logo, ry-actions,
46
+ ry-accordion-item, ry-tab, ry-menu, ry-menu-item, ry-divider,
47
+ ry-theme-toggle, ry-select, ry-switch, ry-tooltip, ry-drawer, ry-toast,
48
+ ry-toggle-button, ry-knob, ry-slider, ry-number-select, ry-color-picker, ry-color-input,
49
+ ry-gradient-picker, ry-tree, ry-tree-item,
50
+ ry-tag, ry-tag-input, ry-hero, ry-stat, ry-feature, ry-feature-grid,
51
+ ry-pricing, ry-pricing-card, ry-carousel) {
42
52
  box-sizing: border-box;
43
53
  }
44
54
 
45
- [data-ry-target] *,
46
- ry-page *, ry-header *, ry-main *, ry-footer *, ry-section *,
47
- ry-card *, ry-accordion *, ry-modal *, ry-tabs *, ry-dropdown * {
55
+ :where([data-ry-target],
56
+ ry-page, ry-header, ry-main, ry-footer, ry-section,
57
+ ry-card, ry-accordion, ry-modal, ry-tabs, ry-dropdown) * {
48
58
  box-sizing: inherit;
49
59
  }
50
60
 
@@ -53,51 +63,40 @@ ry-card *, ry-accordion *, ry-modal *, ry-tabs *, ry-dropdown * {
53
63
  ═══════════════════════════════════════════════════════════════ */
54
64
 
55
65
  /* Block elements */
56
- ry-page,
57
- ry-header,
58
- ry-main,
59
- ry-footer,
60
- ry-section,
61
- ry-aside,
62
- ry-card,
63
- ry-accordion,
64
- ry-accordion-item,
65
- ry-tabs,
66
- ry-tab,
67
- ry-alert,
68
- ry-field {
66
+ :is(ry-page, ry-header, ry-main, ry-footer, ry-section, ry-aside,
67
+ ry-card, ry-accordion, ry-accordion-item, ry-tabs, ry-tab, ry-alert, ry-field,
68
+ ry-tag-input, ry-carousel) {
69
69
  display: block;
70
70
  }
71
71
 
72
72
  /* Flex containers */
73
- ry-grid,
74
- ry-stack,
75
- ry-cluster,
76
- ry-split,
77
- ry-center,
78
- ry-nav,
79
- ry-actions {
73
+ :is(ry-grid, ry-stack, ry-cluster, ry-split, ry-center, ry-nav, ry-actions) {
80
74
  display: flex;
81
75
  }
82
76
 
83
77
  /* Inline elements */
84
- ry-badge,
85
- ry-logo {
78
+ :is(ry-badge, ry-logo, ry-tag) {
86
79
  display: inline-flex;
87
80
  }
88
81
 
89
82
  /* Contents (wrapper doesn't affect layout) */
90
- ry-modal,
91
- ry-drawer {
83
+ :is(ry-modal, ry-drawer) {
92
84
  display: contents;
93
85
  }
94
86
 
95
87
  /* Button-like elements */
96
- ry-button,
97
- ry-menu-item {
88
+ :is(ry-button, ry-menu-item) {
98
89
  display: inline-flex;
99
90
  }
100
91
 
92
+ /* Balanced text wrapping for headings in overlay/display components */
93
+ :is(ry-modal [data-ry-target="header"] h3,
94
+ ry-card h3,
95
+ ry-hero h1,
96
+ ry-pricing-card h3) {
97
+ text-wrap: balance;
98
+ }
99
+
101
100
  /* ═══════════════════════════════════════════════════════════════
102
101
  PAGE LAYOUT
103
102
  ═══════════════════════════════════════════════════════════════ */
@@ -107,6 +106,8 @@ ry-page {
107
106
  flex-direction: column;
108
107
  min-height: 100vh;
109
108
  min-height: 100dvh;
109
+ container-type: inline-size;
110
+ scrollbar-gutter: stable;
110
111
  }
111
112
 
112
113
  /* ═══════════════════════════════════════════════════════════════
@@ -137,6 +138,8 @@ ry-main {
137
138
  max-width: 1200px;
138
139
  margin: 0 auto;
139
140
  padding: var(--ry-space-8, 2rem) var(--ry-space-6, 1.5rem);
141
+ container-type: inline-size;
142
+ scrollbar-gutter: stable;
140
143
  }
141
144
 
142
145
  /* ═══════════════════════════════════════════════════════════════
@@ -153,11 +156,12 @@ ry-footer {
153
156
  ═══════════════════════════════════════════════════════════════ */
154
157
 
155
158
  ry-section {
156
- margin-bottom: var(--ry-space-12, 3rem);
159
+ margin-block-end: var(--ry-space-12, 3rem);
160
+ container-type: inline-size;
157
161
  }
158
162
 
159
163
  ry-section:last-child {
160
- margin-bottom: 0;
164
+ margin-block-end: 0;
161
165
  }
162
166
 
163
167
  /* ═══════════════════════════════════════════════════════════════
@@ -176,21 +180,16 @@ ry-grid[cols="4"] { grid-template-columns: repeat(4, 1fr); }
176
180
  ry-grid[cols="5"] { grid-template-columns: repeat(5, 1fr); }
177
181
  ry-grid[cols="6"] { grid-template-columns: repeat(6, 1fr); }
178
182
 
179
- @media (max-width: 640px) {
180
- ry-grid[cols="2"],
181
- ry-grid[cols="3"],
182
- ry-grid[cols="4"],
183
- ry-grid[cols="5"],
184
- ry-grid[cols="6"] {
183
+ @container (max-width: 640px) {
184
+ :is(ry-grid[cols="2"], ry-grid[cols="3"], ry-grid[cols="4"],
185
+ ry-grid[cols="5"], ry-grid[cols="6"]) {
185
186
  grid-template-columns: 1fr;
186
187
  }
187
188
  }
188
189
 
189
- @media (min-width: 641px) and (max-width: 1024px) {
190
- ry-grid[cols="3"],
191
- ry-grid[cols="4"],
192
- ry-grid[cols="5"],
193
- ry-grid[cols="6"] {
190
+ @container (min-width: 641px) and (max-width: 1024px) {
191
+ :is(ry-grid[cols="3"], ry-grid[cols="4"],
192
+ ry-grid[cols="5"], ry-grid[cols="6"]) {
194
193
  grid-template-columns: repeat(2, 1fr);
195
194
  }
196
195
  }
@@ -243,7 +242,7 @@ ry-split > :last-child {
243
242
  width: 300px;
244
243
  }
245
244
 
246
- @media (max-width: 768px) {
245
+ @container (max-width: 768px) {
247
246
  ry-split {
248
247
  flex-direction: column;
249
248
  }
@@ -304,14 +303,16 @@ ry-actions {
304
303
  ry-divider {
305
304
  display: block;
306
305
  height: 1px;
307
- margin: var(--ry-space-4, 1rem) 0;
306
+ margin-block: var(--ry-space-4, 1rem);
307
+ margin-inline: 0;
308
308
  }
309
309
 
310
310
  ry-divider[vertical] {
311
311
  width: 1px;
312
312
  height: auto;
313
313
  align-self: stretch;
314
- margin: 0 var(--ry-space-4, 1rem);
314
+ margin-block: 0;
315
+ margin-inline: var(--ry-space-4, 1rem);
315
316
  }
316
317
 
317
318
  /* ═══════════════════════════════════════════════════════════════
@@ -389,7 +390,7 @@ ry-toggle-button[icon][size="lg"]:empty {
389
390
  ry-toggle-button[block] {
390
391
  display: block;
391
392
  width: 100%;
392
- text-align: left;
393
+ text-align: start;
393
394
  padding: var(--ry-space-4, 1rem);
394
395
  }
395
396
 
@@ -455,6 +456,146 @@ ry-knob [data-ry-target="label"] {
455
456
  ry-knob[size="sm"] [data-ry-target="ring"] { --knob-size: 48px; }
456
457
  ry-knob[size="lg"] [data-ry-target="ring"] { --knob-size: 80px; }
457
458
 
459
+ /* ═══════════════════════════════════════════════════════════════
460
+ NUMBER SELECT
461
+ ═══════════════════════════════════════════════════════════════ */
462
+
463
+ ry-number-select {
464
+ display: inline-flex;
465
+ align-items: center;
466
+ gap: 0;
467
+ user-select: none;
468
+ touch-action: none;
469
+ }
470
+
471
+ ry-number-select[disabled] {
472
+ pointer-events: none;
473
+ }
474
+
475
+ ry-number-select :is([data-ry-target="decrement"], [data-ry-target="increment"]) {
476
+ display: inline-flex;
477
+ align-items: center;
478
+ justify-content: center;
479
+ width: 32px;
480
+ height: 36px;
481
+ padding: 0;
482
+ flex-shrink: 0;
483
+ cursor: pointer;
484
+ }
485
+
486
+ ry-number-select :is([data-ry-target="decrement"], [data-ry-target="increment"]) svg {
487
+ width: 16px;
488
+ height: 16px;
489
+ }
490
+
491
+ ry-number-select [data-ry-target="display"] {
492
+ display: inline-flex;
493
+ align-items: center;
494
+ justify-content: center;
495
+ min-width: 48px;
496
+ height: 36px;
497
+ padding: 0 var(--ry-space-2, 0.5rem);
498
+ position: relative;
499
+ cursor: ew-resize;
500
+ outline: none;
501
+ }
502
+
503
+ :is(ry-number-select[drag="y"],
504
+ ry-number-select[arrows="stacked"]:not([drag]),
505
+ ry-number-select[arrows="stacked-end"]:not([drag]),
506
+ ry-number-select[arrows="stacked-start"]:not([drag])) [data-ry-target="display"] {
507
+ cursor: ns-resize;
508
+ }
509
+
510
+ ry-number-select[drag="none"] [data-ry-target="display"] {
511
+ cursor: default;
512
+ }
513
+
514
+ ry-number-select[data-dragging] {
515
+ cursor: ew-resize;
516
+ }
517
+
518
+ :is(ry-number-select[drag="y"],
519
+ ry-number-select[arrows="stacked"]:not([drag]),
520
+ ry-number-select[arrows="stacked-end"]:not([drag]),
521
+ ry-number-select[arrows="stacked-start"]:not([drag]))[data-dragging] {
522
+ cursor: ns-resize;
523
+ }
524
+
525
+ ry-number-select [data-ry-target="value"] {
526
+ display: inline-block;
527
+ min-width: 2em;
528
+ text-align: center;
529
+ transition: transform 60ms ease-out;
530
+ }
531
+
532
+ ry-number-select :is([data-ry-target="prefix"], [data-ry-target="suffix"]) {
533
+ flex-shrink: 0;
534
+ pointer-events: none;
535
+ }
536
+
537
+ ry-number-select [data-ry-target="input"] {
538
+ display: none;
539
+ position: absolute;
540
+ inset: 0;
541
+ width: 100%;
542
+ height: 100%;
543
+ text-align: center;
544
+ padding: 0 var(--ry-space-1, 0.25rem);
545
+ outline: none;
546
+ }
547
+
548
+ ry-number-select [data-ry-target="label"] {
549
+ display: block;
550
+ text-align: center;
551
+ margin-inline-end: var(--ry-space-2, 0.5rem);
552
+ order: -1;
553
+ }
554
+
555
+ /* Stacked layout (buttons above/below) */
556
+ ry-number-select[arrows="stacked"] {
557
+ flex-direction: column;
558
+ align-items: stretch;
559
+ }
560
+
561
+ ry-number-select[arrows="stacked"] :is([data-ry-target="decrement"], [data-ry-target="increment"]) {
562
+ width: auto;
563
+ height: 24px;
564
+ }
565
+
566
+ ry-number-select[arrows="stacked"] :is([data-ry-target="decrement"], [data-ry-target="increment"]) svg {
567
+ width: 14px;
568
+ height: 14px;
569
+ }
570
+
571
+ /* Stacked-end / stacked-start (buttons grouped beside display) */
572
+ ry-number-select [data-ry-target="btn-group"] {
573
+ display: flex;
574
+ flex-direction: column;
575
+ flex-shrink: 0;
576
+ }
577
+
578
+ :is(ry-number-select[arrows="stacked-end"], ry-number-select[arrows="stacked-start"]) :is([data-ry-target="decrement"], [data-ry-target="increment"]) {
579
+ width: 28px;
580
+ height: 18px;
581
+ }
582
+
583
+ :is(ry-number-select[arrows="stacked-end"], ry-number-select[arrows="stacked-start"]) :is([data-ry-target="decrement"], [data-ry-target="increment"]) svg {
584
+ width: 12px;
585
+ height: 12px;
586
+ }
587
+
588
+ /* Sizes */
589
+ ry-number-select[size="xs"] :is([data-ry-target="decrement"], [data-ry-target="increment"]) { width: 20px; height: 22px; }
590
+ ry-number-select[size="xs"] [data-ry-target="display"] { min-width: 28px; height: 22px; padding: 0 var(--ry-space-1, 0.25rem); }
591
+ ry-number-select[size="xs"] :is([data-ry-target="decrement"], [data-ry-target="increment"]) svg { width: 12px; height: 12px; }
592
+
593
+ ry-number-select[size="sm"] :is([data-ry-target="decrement"], [data-ry-target="increment"]) { width: 24px; height: 28px; }
594
+ ry-number-select[size="sm"] [data-ry-target="display"] { min-width: 36px; height: 28px; }
595
+
596
+ ry-number-select[size="lg"] :is([data-ry-target="decrement"], [data-ry-target="increment"]) { width: 40px; height: 44px; }
597
+ ry-number-select[size="lg"] [data-ry-target="display"] { min-width: 60px; height: 44px; }
598
+
458
599
  /* ═══════════════════════════════════════════════════════════════
459
600
  SLIDER
460
601
  ═══════════════════════════════════════════════════════════════ */
@@ -498,7 +639,7 @@ ry-slider [data-ry-target^="thumb"]:active {
498
639
  ry-slider [data-ry-target="labels"] {
499
640
  display: flex;
500
641
  justify-content: space-between;
501
- margin-top: var(--ry-space-2, 0.5rem);
642
+ margin-block-start: var(--ry-space-2, 0.5rem);
502
643
  pointer-events: none;
503
644
  }
504
645
 
@@ -512,16 +653,25 @@ ry-slider [data-ry-target^="tooltip"] {
512
653
  visibility: hidden;
513
654
  transition: opacity var(--ry-duration-fast, 100ms) var(--ry-ease, ease),
514
655
  visibility var(--ry-duration-fast, 100ms) var(--ry-ease, ease);
656
+ transition-behavior: allow-discrete;
515
657
  pointer-events: none;
516
658
  }
517
659
 
518
- ry-slider [data-ry-target^="thumb"]:hover [data-ry-target^="tooltip"],
519
- ry-slider [data-ry-target^="thumb"]:focus [data-ry-target^="tooltip"],
520
- ry-slider[data-dragging] [data-ry-target^="tooltip"] {
660
+ :is(ry-slider [data-ry-target^="thumb"]:hover,
661
+ ry-slider [data-ry-target^="thumb"]:focus,
662
+ ry-slider[data-dragging]) [data-ry-target^="tooltip"] {
521
663
  opacity: 1;
522
664
  visibility: visible;
523
665
  }
524
666
 
667
+ @starting-style {
668
+ :is(ry-slider [data-ry-target^="thumb"]:hover,
669
+ ry-slider [data-ry-target^="thumb"]:focus,
670
+ ry-slider[data-dragging]) [data-ry-target^="tooltip"] {
671
+ opacity: 0;
672
+ }
673
+ }
674
+
525
675
  /* Vertical */
526
676
  ry-slider[vertical] {
527
677
  display: inline-flex;
@@ -552,8 +702,8 @@ ry-slider[vertical] [data-ry-target="labels"] {
552
702
  flex-direction: column-reverse;
553
703
  justify-content: space-between;
554
704
  height: 100%;
555
- margin-top: 0;
556
- margin-left: var(--ry-space-2, 0.5rem);
705
+ margin-block-start: 0;
706
+ margin-inline-start: var(--ry-space-2, 0.5rem);
557
707
  }
558
708
 
559
709
  /* Sizes */
@@ -567,6 +717,7 @@ ry-slider[size="lg"] { --ry-slider-track: 18px; --ry-slider-thumb: 40px; }
567
717
  ry-card {
568
718
  display: block;
569
719
  padding: var(--ry-space-6, 1.5rem);
720
+ container-type: inline-size;
570
721
  }
571
722
 
572
723
  ry-card h3 {
@@ -615,28 +766,24 @@ ry-alert [data-ry-target="content"] {
615
766
  FORM ELEMENTS
616
767
  ═══════════════════════════════════════════════════════════════ */
617
768
 
618
- ry-field input,
619
- ry-field textarea,
620
- ry-field select {
769
+ ry-field :is(input, textarea, select) {
621
770
  display: block;
622
771
  width: 100%;
623
772
  padding: var(--ry-space-2, 0.5rem) var(--ry-space-3, 0.75rem);
624
773
  }
625
774
 
626
- ry-field input:disabled,
627
- ry-field textarea:disabled {
775
+ ry-field :is(input, textarea):disabled {
628
776
  cursor: not-allowed;
629
777
  }
630
778
 
631
- ry-field label,
632
- ry-field [data-ry-target="label"] {
779
+ ry-field :is(label, [data-ry-target="label"]) {
633
780
  display: block;
634
- margin-bottom: var(--ry-space-2, 0.5rem);
781
+ margin-block-end: var(--ry-space-2, 0.5rem);
635
782
  }
636
783
 
637
784
  ry-field {
638
785
  display: block;
639
- margin-bottom: var(--ry-space-4, 1rem);
786
+ margin-block-end: var(--ry-space-4, 1rem);
640
787
  }
641
788
 
642
789
  /* ═══════════════════════════════════════════════════════════════
@@ -653,7 +800,7 @@ ry-accordion [data-ry-target="trigger"] {
653
800
  justify-content: space-between;
654
801
  width: 100%;
655
802
  padding: var(--ry-space-4, 1rem) var(--ry-space-6, 1.5rem);
656
- text-align: left;
803
+ text-align: start;
657
804
  border: none;
658
805
  cursor: pointer;
659
806
  }
@@ -690,14 +837,14 @@ ry-tabs {
690
837
  ry-tabs [data-ry-target="list"] {
691
838
  display: flex;
692
839
  gap: var(--ry-space-1, 0.25rem);
693
- margin-bottom: var(--ry-space-4, 1rem);
840
+ margin-block-end: var(--ry-space-4, 1rem);
694
841
  }
695
842
 
696
843
  ry-tabs [data-ry-target="trigger"] {
697
844
  padding: var(--ry-space-2, 0.5rem) var(--ry-space-4, 1rem);
698
845
  border: none;
699
- border-bottom: 2px solid transparent;
700
- margin-bottom: -1px;
846
+ border-block-end: 2px solid transparent;
847
+ margin-block-end: -1px;
701
848
  cursor: pointer;
702
849
  }
703
850
 
@@ -706,9 +853,9 @@ ry-tab {
706
853
  display: none;
707
854
  }
708
855
 
709
- ry-tabs [data-ry-target="panel"][data-ry-state="active"],
710
- ry-tab[active],
711
- ry-tab[data-ry-state="active"] {
856
+ :is(ry-tabs [data-ry-target="panel"][data-ry-state="active"],
857
+ ry-tab[active],
858
+ ry-tab[data-ry-state="active"]) {
712
859
  display: block;
713
860
  }
714
861
 
@@ -732,6 +879,7 @@ ry-modal [data-ry-target="backdrop"] {
732
879
  visibility: hidden;
733
880
  transition: opacity var(--ry-duration-normal, 200ms) var(--ry-ease, ease),
734
881
  visibility var(--ry-duration-normal, 200ms) var(--ry-ease, ease);
882
+ transition-behavior: allow-discrete;
735
883
  }
736
884
 
737
885
  ry-modal[data-ry-state="open"] [data-ry-target="backdrop"] {
@@ -739,6 +887,12 @@ ry-modal[data-ry-state="open"] [data-ry-target="backdrop"] {
739
887
  visibility: visible;
740
888
  }
741
889
 
890
+ @starting-style {
891
+ ry-modal[data-ry-state="open"] [data-ry-target="backdrop"] {
892
+ opacity: 0;
893
+ }
894
+ }
895
+
742
896
  ry-modal [data-ry-target="dialog"] {
743
897
  position: fixed;
744
898
  top: 50%;
@@ -748,12 +902,14 @@ ry-modal [data-ry-target="dialog"] {
748
902
  max-width: 32rem;
749
903
  max-height: calc(100vh - var(--ry-space-8, 2rem));
750
904
  overflow: auto;
905
+ overscroll-behavior: contain;
751
906
  opacity: 0;
752
907
  visibility: hidden;
753
908
  transform: translate(-50%, -50%) scale(0.95);
754
909
  transition: opacity var(--ry-duration-normal, 200ms) var(--ry-ease, ease),
755
910
  visibility var(--ry-duration-normal, 200ms) var(--ry-ease, ease),
756
911
  transform var(--ry-duration-normal, 200ms) var(--ry-ease, ease);
912
+ transition-behavior: allow-discrete;
757
913
  }
758
914
 
759
915
  ry-modal[data-ry-state="open"] [data-ry-target="dialog"] {
@@ -762,6 +918,13 @@ ry-modal[data-ry-state="open"] [data-ry-target="dialog"] {
762
918
  transform: translate(-50%, -50%) scale(1);
763
919
  }
764
920
 
921
+ @starting-style {
922
+ ry-modal[data-ry-state="open"] [data-ry-target="dialog"] {
923
+ opacity: 0;
924
+ transform: translate(-50%, -50%) scale(0.95);
925
+ }
926
+ }
927
+
765
928
  ry-modal [data-ry-target="header"] {
766
929
  display: flex;
767
930
  align-items: center;
@@ -804,14 +967,13 @@ ry-dropdown {
804
967
  display: inline-block;
805
968
  }
806
969
 
807
- ry-dropdown [data-ry-target="menu"],
808
- ry-dropdown ry-menu {
970
+ ry-dropdown :is([data-ry-target="menu"], ry-menu) {
809
971
  position: absolute;
810
972
  top: 100%;
811
973
  left: 0;
812
974
  z-index: var(--ry-z-dropdown, 1000);
813
975
  min-width: 12rem;
814
- margin-top: var(--ry-space-1, 0.25rem);
976
+ margin-block-start: var(--ry-space-1, 0.25rem);
815
977
  padding: var(--ry-space-1, 0.25rem);
816
978
  opacity: 0;
817
979
  visibility: hidden;
@@ -819,20 +981,39 @@ ry-dropdown ry-menu {
819
981
  transition: opacity var(--ry-duration-fast, 100ms) var(--ry-ease, ease),
820
982
  visibility var(--ry-duration-fast, 100ms) var(--ry-ease, ease),
821
983
  transform var(--ry-duration-fast, 100ms) var(--ry-ease, ease);
984
+ transition-behavior: allow-discrete;
822
985
  }
823
986
 
824
- ry-dropdown[data-ry-state="open"] [data-ry-target="menu"],
825
- ry-dropdown[data-ry-state="open"] ry-menu {
987
+ ry-dropdown[data-ry-state="open"] :is([data-ry-target="menu"], ry-menu) {
826
988
  opacity: 1;
827
989
  visibility: visible;
828
990
  transform: translateY(0);
829
991
  }
830
992
 
993
+ @starting-style {
994
+ ry-dropdown[data-ry-state="open"] :is([data-ry-target="menu"], ry-menu) {
995
+ opacity: 0;
996
+ transform: translateY(-0.5rem);
997
+ }
998
+ }
999
+
1000
+ ry-dropdown[data-ry-position="top"] :is([data-ry-target="menu"], ry-menu) {
1001
+ top: auto;
1002
+ bottom: 100%;
1003
+ margin-block-start: 0;
1004
+ margin-block-end: var(--ry-space-1, 0.25rem);
1005
+ transform: translateY(0.5rem);
1006
+ }
1007
+
1008
+ ry-dropdown[data-ry-position="top"][data-ry-state="open"] :is([data-ry-target="menu"], ry-menu) {
1009
+ transform: translateY(0);
1010
+ }
1011
+
831
1012
  ry-menu-item {
832
1013
  display: block;
833
1014
  width: 100%;
834
1015
  padding: var(--ry-space-2, 0.5rem) var(--ry-space-3, 0.75rem);
835
- text-align: left;
1016
+ text-align: start;
836
1017
  text-decoration: none;
837
1018
  border: none;
838
1019
  cursor: pointer;
@@ -909,6 +1090,7 @@ ry-tooltip [data-ry-target="content"] {
909
1090
  pointer-events: none;
910
1091
  transition: opacity var(--ry-duration-fast, 100ms) var(--ry-ease, ease),
911
1092
  visibility var(--ry-duration-fast, 100ms) var(--ry-ease, ease);
1093
+ transition-behavior: allow-discrete;
912
1094
  }
913
1095
 
914
1096
  ry-tooltip[data-ry-state="open"] [data-ry-target="content"] {
@@ -916,6 +1098,12 @@ ry-tooltip[data-ry-state="open"] [data-ry-target="content"] {
916
1098
  visibility: visible;
917
1099
  }
918
1100
 
1101
+ @starting-style {
1102
+ ry-tooltip[data-ry-state="open"] [data-ry-target="content"] {
1103
+ opacity: 0;
1104
+ }
1105
+ }
1106
+
919
1107
  /* Tooltip positioning - CSS handles all layout, no JS needed */
920
1108
  ry-tooltip[data-ry-position="top"] [data-ry-target="content"] {
921
1109
  bottom: 100%;
@@ -961,6 +1149,7 @@ ry-drawer [data-ry-target="backdrop"] {
961
1149
  visibility: hidden;
962
1150
  transition: opacity var(--ry-duration-normal, 200ms) var(--ry-ease, ease),
963
1151
  visibility var(--ry-duration-normal, 200ms) var(--ry-ease, ease);
1152
+ transition-behavior: allow-discrete;
964
1153
  }
965
1154
 
966
1155
  ry-drawer[data-ry-state="open"] [data-ry-target="backdrop"] {
@@ -968,6 +1157,12 @@ ry-drawer[data-ry-state="open"] [data-ry-target="backdrop"] {
968
1157
  visibility: visible;
969
1158
  }
970
1159
 
1160
+ @starting-style {
1161
+ ry-drawer[data-ry-state="open"] [data-ry-target="backdrop"] {
1162
+ opacity: 0;
1163
+ }
1164
+ }
1165
+
971
1166
  ry-drawer [data-ry-target="panel"] {
972
1167
  position: fixed;
973
1168
  z-index: var(--ry-z-modal, 1050);
@@ -976,6 +1171,7 @@ ry-drawer [data-ry-target="panel"] {
976
1171
  transition: opacity var(--ry-duration-normal, 200ms) var(--ry-ease, ease),
977
1172
  visibility var(--ry-duration-normal, 200ms) var(--ry-ease, ease),
978
1173
  transform var(--ry-duration-normal, 200ms) var(--ry-ease, ease);
1174
+ transition-behavior: allow-discrete;
979
1175
  }
980
1176
 
981
1177
  ry-drawer[data-ry-state="open"] [data-ry-target="panel"] {
@@ -983,6 +1179,12 @@ ry-drawer[data-ry-state="open"] [data-ry-target="panel"] {
983
1179
  visibility: visible;
984
1180
  }
985
1181
 
1182
+ @starting-style {
1183
+ ry-drawer[data-ry-state="open"] [data-ry-target="panel"] {
1184
+ opacity: 0;
1185
+ }
1186
+ }
1187
+
986
1188
  /* Left drawer */
987
1189
  ry-drawer [data-ry-target="panel"][data-ry-side="left"] {
988
1190
  top: 0;
@@ -1057,6 +1259,7 @@ ry-drawer [data-ry-target="content"] {
1057
1259
  padding: var(--ry-space-6, 1.5rem);
1058
1260
  padding-top: var(--ry-space-12, 3rem);
1059
1261
  overflow-y: auto;
1262
+ overscroll-behavior: contain;
1060
1263
  height: 100%;
1061
1264
  }
1062
1265
 
@@ -1086,6 +1289,7 @@ ry-toast {
1086
1289
  transform: translateX(1rem);
1087
1290
  transition: opacity var(--ry-duration-normal, 200ms) var(--ry-ease, ease),
1088
1291
  transform var(--ry-duration-normal, 200ms) var(--ry-ease, ease);
1292
+ transition-behavior: allow-discrete;
1089
1293
  }
1090
1294
 
1091
1295
  ry-toast[data-ry-state="visible"] {
@@ -1093,6 +1297,13 @@ ry-toast[data-ry-state="visible"] {
1093
1297
  transform: translateX(0);
1094
1298
  }
1095
1299
 
1300
+ @starting-style {
1301
+ ry-toast[data-ry-state="visible"] {
1302
+ opacity: 0;
1303
+ transform: translateX(1rem);
1304
+ }
1305
+ }
1306
+
1096
1307
  ry-toast[data-ry-state="hiding"] {
1097
1308
  opacity: 0;
1098
1309
  transform: translateX(1rem);
@@ -1170,16 +1381,18 @@ ry-select [data-ry-target="dropdown"] {
1170
1381
  left: 0;
1171
1382
  right: 0;
1172
1383
  z-index: var(--ry-z-dropdown, 1000);
1173
- margin-top: var(--ry-space-1, 0.25rem);
1384
+ margin-block-start: var(--ry-space-1, 0.25rem);
1174
1385
  padding: var(--ry-space-1, 0.25rem);
1175
1386
  max-height: 15rem;
1176
1387
  overflow-y: auto;
1388
+ overscroll-behavior: contain;
1177
1389
  opacity: 0;
1178
1390
  visibility: hidden;
1179
1391
  transform: translateY(-0.5rem);
1180
1392
  transition: opacity var(--ry-duration-fast, 100ms) var(--ry-ease, ease),
1181
1393
  visibility var(--ry-duration-fast, 100ms) var(--ry-ease, ease),
1182
1394
  transform var(--ry-duration-fast, 100ms) var(--ry-ease, ease);
1395
+ transition-behavior: allow-discrete;
1183
1396
  }
1184
1397
 
1185
1398
  ry-select[data-ry-state="open"] [data-ry-target="dropdown"] {
@@ -1188,11 +1401,18 @@ ry-select[data-ry-state="open"] [data-ry-target="dropdown"] {
1188
1401
  transform: translateY(0);
1189
1402
  }
1190
1403
 
1404
+ @starting-style {
1405
+ ry-select[data-ry-state="open"] [data-ry-target="dropdown"] {
1406
+ opacity: 0;
1407
+ transform: translateY(-0.5rem);
1408
+ }
1409
+ }
1410
+
1191
1411
  ry-select[data-ry-position="top"] [data-ry-target="dropdown"] {
1192
1412
  top: auto;
1193
1413
  bottom: 100%;
1194
- margin-top: 0;
1195
- margin-bottom: var(--ry-space-1, 0.25rem);
1414
+ margin-block-start: 0;
1415
+ margin-block-end: var(--ry-space-1, 0.25rem);
1196
1416
  transform: translateY(0.5rem);
1197
1417
  }
1198
1418
 
@@ -1224,6 +1444,58 @@ ry-option {
1224
1444
  display: none;
1225
1445
  }
1226
1446
 
1447
+ /* Multi-select trigger */
1448
+ ry-select[multiple] [data-ry-target="trigger"] {
1449
+ flex-wrap: wrap;
1450
+ gap: var(--ry-space-1, 0.25rem);
1451
+ min-height: 2.5rem;
1452
+ }
1453
+
1454
+ ry-select[multiple] [data-ry-target="tags"] {
1455
+ display: contents;
1456
+ }
1457
+
1458
+ ry-select[multiple] [data-ry-target="clear"] {
1459
+ display: flex;
1460
+ align-items: center;
1461
+ justify-content: center;
1462
+ flex-shrink: 0;
1463
+ width: 1.25rem;
1464
+ height: 1.25rem;
1465
+ padding: 0;
1466
+ border: none;
1467
+ cursor: pointer;
1468
+ }
1469
+
1470
+ ry-select[multiple] [data-ry-target="clear"] svg {
1471
+ width: 14px;
1472
+ height: 14px;
1473
+ }
1474
+
1475
+ ry-select [data-ry-target="check"] {
1476
+ display: inline-flex;
1477
+ align-items: center;
1478
+ width: 1rem;
1479
+ height: 1rem;
1480
+ flex-shrink: 0;
1481
+ opacity: 0;
1482
+ }
1483
+
1484
+ ry-select [data-ry-target="check"] svg {
1485
+ width: 14px;
1486
+ height: 14px;
1487
+ }
1488
+
1489
+ ry-select [data-ry-target="option"][aria-selected="true"] [data-ry-target="check"] {
1490
+ opacity: 1;
1491
+ }
1492
+
1493
+ ry-select[multiple] [data-ry-target="option"] {
1494
+ display: flex;
1495
+ align-items: center;
1496
+ gap: var(--ry-space-2, 0.5rem);
1497
+ }
1498
+
1227
1499
  /* ═══════════════════════════════════════════════════════════════
1228
1500
  KEYFRAMES (structural animations)
1229
1501
  ═══════════════════════════════════════════════════════════════ */
@@ -1260,7 +1532,7 @@ ry-option {
1260
1532
  ry-code {
1261
1533
  display: block;
1262
1534
  overflow: hidden;
1263
- margin-bottom: var(--ry-space-4, 1rem);
1535
+ margin-block-end: var(--ry-space-4, 1rem);
1264
1536
  }
1265
1537
 
1266
1538
  ry-code [data-ry-target="header"] {
@@ -1314,22 +1586,22 @@ ry-code .ry-code__line {
1314
1586
  ry-code .ry-code__line-number {
1315
1587
  flex-shrink: 0;
1316
1588
  width: 2rem;
1317
- text-align: right;
1318
- padding-right: var(--ry-space-2, 0.5rem);
1589
+ text-align: end;
1590
+ padding-inline-end: var(--ry-space-2, 0.5rem);
1319
1591
  user-select: none;
1320
1592
  }
1321
1593
 
1322
1594
  ry-code .ry-code__line-content {
1323
1595
  flex: 1;
1324
1596
  min-width: 0;
1325
- padding-left: var(--ry-space-2, 0.5rem);
1597
+ padding-inline-start: var(--ry-space-2, 0.5rem);
1326
1598
  }
1327
1599
 
1328
1600
  ry-code .ry-code__color-preview {
1329
1601
  display: inline-block;
1330
1602
  width: 0.625rem;
1331
1603
  height: 0.625rem;
1332
- margin-right: var(--ry-space-1, 0.25rem);
1604
+ margin-inline-end: var(--ry-space-1, 0.25rem);
1333
1605
  vertical-align: middle;
1334
1606
  }
1335
1607
 
@@ -1353,7 +1625,7 @@ ry-example [data-ry-target="preview"] {
1353
1625
  padding: var(--ry-space-4, 1rem);
1354
1626
  }
1355
1627
 
1356
- @media (max-width: 768px) {
1628
+ @container (max-width: 768px) {
1357
1629
  ry-example {
1358
1630
  grid-template-columns: 1fr;
1359
1631
  }
@@ -1365,7 +1637,7 @@ ry-example[data-stacked] {
1365
1637
 
1366
1638
  .ry-example__usage {
1367
1639
  grid-column: 1 / -1;
1368
- margin-top: var(--ry-space-2, 0.5rem);
1640
+ padding-block-end: 3rem;
1369
1641
  }
1370
1642
 
1371
1643
  .ry-example__usage-toggle {
@@ -1386,7 +1658,7 @@ ry-example[data-stacked] {
1386
1658
  }
1387
1659
 
1388
1660
  .ry-example__usage-panel {
1389
- margin-top: var(--ry-space-2, 0.5rem);
1661
+ margin-block-start: var(--ry-space-2, 0.5rem);
1390
1662
  }
1391
1663
 
1392
1664
  .ry-example__usage-panel[hidden] {
@@ -1490,7 +1762,7 @@ input[type="radio"]:checked::after {
1490
1762
  table {
1491
1763
  width: 100%;
1492
1764
  border-collapse: collapse;
1493
- text-align: left;
1765
+ text-align: start;
1494
1766
  }
1495
1767
 
1496
1768
  th, td {
@@ -1499,7 +1771,7 @@ th, td {
1499
1771
  }
1500
1772
 
1501
1773
  th {
1502
- text-align: left;
1774
+ text-align: start;
1503
1775
  }
1504
1776
 
1505
1777
  /* ═══════════════════════════════════════════════════════════════
@@ -1765,3 +2037,656 @@ ry-color-input ry-color-picker[inline] [data-ry-target="panel"] {
1765
2037
  border: none;
1766
2038
  box-shadow: none;
1767
2039
  }
2040
+
2041
+ /* ═══════════════════════════════════════════════════════════════
2042
+ GRADIENT PICKER
2043
+ ═══════════════════════════════════════════════════════════════ */
2044
+
2045
+ ry-gradient-picker {
2046
+ display: block;
2047
+ width: var(--ry-color-picker-width, 240px);
2048
+ }
2049
+
2050
+ ry-gradient-picker[disabled] {
2051
+ pointer-events: none;
2052
+ }
2053
+
2054
+ /* Controls row */
2055
+ ry-gradient-picker [data-ry-target="controls"] {
2056
+ display: flex;
2057
+ align-items: center;
2058
+ gap: var(--ry-space-3, 0.75rem);
2059
+ padding: var(--ry-space-3, 0.75rem);
2060
+ }
2061
+
2062
+ ry-gradient-picker [data-ry-target="type-toggle"] {
2063
+ display: flex;
2064
+ gap: var(--ry-space-1, 0.25rem);
2065
+ }
2066
+
2067
+ ry-gradient-picker [data-ry-target="type-toggle"] button {
2068
+ display: flex;
2069
+ align-items: center;
2070
+ justify-content: center;
2071
+ width: 28px;
2072
+ height: 28px;
2073
+ padding: 0;
2074
+ border: none;
2075
+ cursor: pointer;
2076
+ }
2077
+
2078
+ ry-gradient-picker [data-ry-target="type-toggle"] button svg {
2079
+ width: 16px;
2080
+ height: 16px;
2081
+ }
2082
+
2083
+ /* Angle control — visible when linear (default) */
2084
+ ry-gradient-picker [data-ry-target="angle-control"] {
2085
+ display: flex;
2086
+ align-items: center;
2087
+ gap: var(--ry-space-1, 0.25rem);
2088
+ margin-inline-start: auto;
2089
+ }
2090
+
2091
+ ry-gradient-picker [data-ry-target="angle-control"] ry-number-select {
2092
+ min-width: 0;
2093
+ }
2094
+
2095
+ /* Shape control — hidden by default */
2096
+ ry-gradient-picker [data-ry-target="shape-control"] {
2097
+ display: none;
2098
+ gap: var(--ry-space-1, 0.25rem);
2099
+ margin-inline-start: auto;
2100
+ }
2101
+
2102
+ ry-gradient-picker [data-ry-target="shape-control"] button {
2103
+ display: flex;
2104
+ align-items: center;
2105
+ justify-content: center;
2106
+ width: 28px;
2107
+ height: 28px;
2108
+ padding: 0;
2109
+ border: none;
2110
+ cursor: pointer;
2111
+ }
2112
+
2113
+ ry-gradient-picker [data-ry-target="shape-control"] button svg {
2114
+ width: 16px;
2115
+ height: 16px;
2116
+ }
2117
+
2118
+ /* When radial: hide angle, show shape */
2119
+ ry-gradient-picker[data-ry-type="radial"] [data-ry-target="angle-control"] {
2120
+ display: none;
2121
+ }
2122
+
2123
+ ry-gradient-picker[data-ry-type="radial"] [data-ry-target="shape-control"] {
2124
+ display: flex;
2125
+ }
2126
+
2127
+ /* When solid: hide bar, angle, shape */
2128
+ ry-gradient-picker[data-ry-type="solid"] :is([data-ry-target="bar-container"], [data-ry-target="angle-control"], [data-ry-target="shape-control"]) {
2129
+ display: none;
2130
+ }
2131
+
2132
+ /* Gradient bar */
2133
+ ry-gradient-picker [data-ry-target="bar-container"] {
2134
+ position: relative;
2135
+ margin: 0 10px;
2136
+ padding: var(--ry-space-4, 1rem) 0;
2137
+ }
2138
+
2139
+ ry-gradient-picker [data-ry-target="bar"] {
2140
+ position: relative;
2141
+ height: var(--ry-gradient-picker-bar-height, 24px);
2142
+ cursor: pointer;
2143
+ touch-action: none;
2144
+ }
2145
+
2146
+ /* Stop handle */
2147
+ ry-gradient-picker [data-ry-target="stop"] {
2148
+ position: absolute;
2149
+ top: 50%;
2150
+ width: var(--ry-gradient-picker-stop-size, 16px);
2151
+ height: var(--ry-gradient-picker-stop-size, 16px);
2152
+ transform: translate(-50%, -50%);
2153
+ cursor: grab;
2154
+ z-index: 1;
2155
+ }
2156
+
2157
+ ry-gradient-picker [data-ry-target="stop"]:active {
2158
+ cursor: grabbing;
2159
+ }
2160
+
2161
+ ry-gradient-picker [data-ry-target="stop"][data-selected] {
2162
+ z-index: 2;
2163
+ width: calc(var(--ry-gradient-picker-stop-size, 16px) + 4px);
2164
+ height: calc(var(--ry-gradient-picker-stop-size, 16px) + 4px);
2165
+ }
2166
+
2167
+ /* Inline color picker — remove extra border */
2168
+ ry-gradient-picker ry-color-picker[inline] [data-ry-target="panel"] {
2169
+ border: none;
2170
+ box-shadow: none;
2171
+ }
2172
+
2173
+ /* CSS output */
2174
+ ry-gradient-picker [data-ry-target="output-row"] {
2175
+ display: flex;
2176
+ align-items: center;
2177
+ gap: var(--ry-space-1, 0.25rem);
2178
+ padding: 0 var(--ry-space-3, 0.75rem) var(--ry-space-3, 0.75rem);
2179
+ }
2180
+
2181
+ ry-gradient-picker [data-ry-target="output"] {
2182
+ flex: 1;
2183
+ min-width: 0;
2184
+ padding: var(--ry-space-1, 0.25rem) var(--ry-space-2, 0.5rem);
2185
+ border: none;
2186
+ }
2187
+
2188
+ ry-gradient-picker [data-ry-target="copy-btn"] {
2189
+ display: flex;
2190
+ align-items: center;
2191
+ justify-content: center;
2192
+ flex-shrink: 0;
2193
+ width: 28px;
2194
+ height: 28px;
2195
+ padding: 0;
2196
+ border: none;
2197
+ cursor: pointer;
2198
+ }
2199
+
2200
+ ry-gradient-picker [data-ry-target="copy-btn"] svg {
2201
+ width: 14px;
2202
+ height: 14px;
2203
+ }
2204
+
2205
+ /* ═══════════════════════════════════════════════════════════════
2206
+ TREE
2207
+ ═══════════════════════════════════════════════════════════════ */
2208
+
2209
+ ry-tree {
2210
+ display: block;
2211
+ }
2212
+
2213
+ ry-tree-item {
2214
+ display: none;
2215
+ }
2216
+
2217
+ :is(.ry-tree__root, .ry-tree__children) {
2218
+ list-style: none;
2219
+ padding: 0;
2220
+ margin: 0;
2221
+ }
2222
+
2223
+ .ry-tree__children {
2224
+ margin-inline-start: 11px;
2225
+ padding-inline-start: 11px;
2226
+ overflow: hidden;
2227
+ }
2228
+
2229
+ .ry-tree__item {
2230
+ position: relative;
2231
+ margin-block-start: var(--ry-space-1, 0.25rem);
2232
+ }
2233
+
2234
+ /* Horizontal connector lines for nested items */
2235
+ .ry-tree__children .ry-tree__item::before {
2236
+ content: "";
2237
+ position: absolute;
2238
+ inset-inline-start: -11px;
2239
+ top: 14px;
2240
+ width: 11px;
2241
+ height: 1px;
2242
+ }
2243
+
2244
+ :is(.ry-tree__label, .ry-tree__file) {
2245
+ display: flex;
2246
+ align-items: center;
2247
+ gap: var(--ry-space-2, 0.5rem);
2248
+ padding: var(--ry-space-1, 0.25rem) var(--ry-space-2, 0.5rem);
2249
+ height: 28px;
2250
+ cursor: pointer;
2251
+ user-select: none;
2252
+ text-decoration: none;
2253
+ }
2254
+
2255
+ /* Hidden checkbox — the CSS engine for expand/collapse */
2256
+ /* Compound selector to override global input[type="checkbox"] styles */
2257
+ input[type="checkbox"].ry-tree__toggle {
2258
+ display: none;
2259
+ appearance: auto;
2260
+ width: 0;
2261
+ height: 0;
2262
+ margin: 0;
2263
+ padding: 0;
2264
+ border: none;
2265
+ }
2266
+
2267
+ /* Folder icon swap */
2268
+ .ry-tree__icon-open {
2269
+ display: none;
2270
+ }
2271
+ .ry-tree__icon-closed {
2272
+ display: flex;
2273
+ }
2274
+
2275
+ .ry-tree__toggle:checked ~ .ry-tree__label .ry-tree__icon-open {
2276
+ display: flex;
2277
+ }
2278
+ .ry-tree__toggle:checked ~ .ry-tree__label .ry-tree__icon-closed {
2279
+ display: none;
2280
+ }
2281
+
2282
+ /* Grid animation for expand/collapse */
2283
+ .ry-tree__children-wrapper {
2284
+ display: grid;
2285
+ grid-template-rows: 0fr;
2286
+ transition: grid-template-rows var(--ry-tree-duration, 150ms) var(--ry-ease, ease);
2287
+ }
2288
+
2289
+ ry-tree[no-animate] .ry-tree__children-wrapper {
2290
+ transition-duration: 0ms;
2291
+ }
2292
+
2293
+ .ry-tree__toggle:checked ~ .ry-tree__children-wrapper {
2294
+ grid-template-rows: 1fr;
2295
+ }
2296
+
2297
+ .ry-tree__icon {
2298
+ width: 16px;
2299
+ height: 16px;
2300
+ flex-shrink: 0;
2301
+ }
2302
+
2303
+ /* ── Drag and Drop ── */
2304
+
2305
+ .ry-tree__ghost {
2306
+ position: fixed;
2307
+ pointer-events: none;
2308
+ user-select: none;
2309
+ z-index: var(--ry-z-toast, 1080);
2310
+ transform: rotate(-2deg);
2311
+ }
2312
+
2313
+ .ry-tree__item[data-ry-dragging] {
2314
+ opacity: 0.4;
2315
+ }
2316
+
2317
+ .ry-tree__item--collapsed {
2318
+ height: 4px;
2319
+ overflow: hidden;
2320
+ pointer-events: none;
2321
+ }
2322
+
2323
+ .ry-tree__item:is([data-ry-drop-target="before"], [data-ry-drop-target="after"])::after {
2324
+ content: '';
2325
+ position: absolute;
2326
+ inset-inline: 0;
2327
+ height: 2px;
2328
+ pointer-events: none;
2329
+ }
2330
+
2331
+ .ry-tree__item[data-ry-drop-target="before"]::after {
2332
+ top: -1px;
2333
+ }
2334
+
2335
+ .ry-tree__item[data-ry-drop-target="after"]::after {
2336
+ bottom: -1px;
2337
+ }
2338
+
2339
+ /* ═══════════════════════════════════════════════════════════════
2340
+ TAG
2341
+ ═══════════════════════════════════════════════════════════════ */
2342
+
2343
+ ry-tag {
2344
+ display: inline-flex;
2345
+ align-items: center;
2346
+ gap: var(--ry-space-1, 0.25rem);
2347
+ padding: var(--ry-space-1, 0.25rem) var(--ry-space-2, 0.5rem);
2348
+ max-width: 100%;
2349
+ line-height: 1;
2350
+ }
2351
+
2352
+ ry-tag[disabled] {
2353
+ pointer-events: none;
2354
+ }
2355
+
2356
+ ry-tag [data-ry-target="label"] {
2357
+ overflow: hidden;
2358
+ text-overflow: ellipsis;
2359
+ white-space: nowrap;
2360
+ }
2361
+
2362
+ ry-tag [data-ry-target="remove"] {
2363
+ display: inline-flex;
2364
+ align-items: center;
2365
+ justify-content: center;
2366
+ flex-shrink: 0;
2367
+ width: 1rem;
2368
+ height: 1rem;
2369
+ padding: 0;
2370
+ border: none;
2371
+ cursor: pointer;
2372
+ }
2373
+
2374
+ ry-tag [data-ry-target="remove"] svg {
2375
+ width: 12px;
2376
+ height: 12px;
2377
+ }
2378
+
2379
+ /* Size variants */
2380
+ ry-tag[size="sm"] {
2381
+ padding: 2px var(--ry-space-1, 0.25rem);
2382
+ }
2383
+
2384
+ ry-tag[size="sm"] [data-ry-target="remove"] {
2385
+ width: 0.75rem;
2386
+ height: 0.75rem;
2387
+ }
2388
+
2389
+ ry-tag[size="sm"] [data-ry-target="remove"] svg {
2390
+ width: 10px;
2391
+ height: 10px;
2392
+ }
2393
+
2394
+ ry-tag[size="lg"] {
2395
+ padding: var(--ry-space-2, 0.5rem) var(--ry-space-3, 0.75rem);
2396
+ }
2397
+
2398
+ /* ═══════════════════════════════════════════════════════════════
2399
+ TAG INPUT
2400
+ ═══════════════════════════════════════════════════════════════ */
2401
+
2402
+ ry-tag-input {
2403
+ display: block;
2404
+ }
2405
+
2406
+ ry-tag-input [data-ry-target="container"] {
2407
+ display: flex;
2408
+ flex-wrap: wrap;
2409
+ align-items: center;
2410
+ gap: var(--ry-space-1, 0.25rem);
2411
+ padding: var(--ry-space-1, 0.25rem) var(--ry-space-2, 0.5rem);
2412
+ min-height: 2.5rem;
2413
+ cursor: text;
2414
+ }
2415
+
2416
+ ry-tag-input [data-ry-target="input"] {
2417
+ flex: 1;
2418
+ min-width: 60px;
2419
+ padding: var(--ry-space-1, 0.25rem) 0;
2420
+ border: none;
2421
+ outline: none;
2422
+ }
2423
+
2424
+ ry-tag-input[disabled] [data-ry-target="container"] {
2425
+ cursor: not-allowed;
2426
+ }
2427
+
2428
+ /* ═══════════════════════════════════════════════════════════════
2429
+ HERO
2430
+ ═══════════════════════════════════════════════════════════════ */
2431
+
2432
+ ry-hero {
2433
+ display: flex;
2434
+ flex-direction: column;
2435
+ align-items: center;
2436
+ justify-content: center;
2437
+ padding: var(--ry-space-16, 4rem) var(--ry-space-6, 1.5rem);
2438
+ max-width: 48rem;
2439
+ margin-inline: auto;
2440
+ text-align: center;
2441
+ }
2442
+
2443
+ ry-hero[align="left"] {
2444
+ align-items: flex-start;
2445
+ text-align: start;
2446
+ }
2447
+
2448
+ ry-hero > * + * {
2449
+ margin-block-start: var(--ry-space-4, 1rem);
2450
+ }
2451
+
2452
+ ry-hero > h1 {
2453
+ margin: 0;
2454
+ }
2455
+
2456
+ ry-hero > p {
2457
+ margin: 0;
2458
+ margin-block-start: var(--ry-space-4, 1rem);
2459
+ }
2460
+
2461
+ /* Size variants */
2462
+ ry-hero[size="sm"] {
2463
+ padding: var(--ry-space-8, 2rem) var(--ry-space-6, 1.5rem);
2464
+ }
2465
+
2466
+ ry-hero[size="lg"] {
2467
+ padding: var(--ry-space-20, 5rem) var(--ry-space-6, 1.5rem);
2468
+ }
2469
+
2470
+ ry-hero[full-bleed] {
2471
+ max-width: none;
2472
+ }
2473
+
2474
+ /* ═══════════════════════════════════════════════════════════════
2475
+ STAT
2476
+ ═══════════════════════════════════════════════════════════════ */
2477
+
2478
+ ry-stat {
2479
+ display: flex;
2480
+ flex-direction: column;
2481
+ gap: var(--ry-space-1, 0.25rem);
2482
+ }
2483
+
2484
+ ry-stat[align="center"] {
2485
+ align-items: center;
2486
+ text-align: center;
2487
+ }
2488
+
2489
+ ry-stat [data-ry-target="value"] {
2490
+ display: flex;
2491
+ align-items: center;
2492
+ gap: var(--ry-space-2, 0.5rem);
2493
+ }
2494
+
2495
+ ry-stat [data-ry-target="trend"] svg {
2496
+ width: 20px;
2497
+ height: 20px;
2498
+ }
2499
+
2500
+ /* Size variants */
2501
+ ry-stat[size="sm"] [data-ry-target="trend"] svg {
2502
+ width: 16px;
2503
+ height: 16px;
2504
+ }
2505
+
2506
+ /* ═══════════════════════════════════════════════════════════════
2507
+ FEATURE + FEATURE GRID
2508
+ ═══════════════════════════════════════════════════════════════ */
2509
+
2510
+ ry-feature-grid {
2511
+ display: grid;
2512
+ gap: var(--ry-space-6, 1.5rem);
2513
+ }
2514
+
2515
+ ry-feature-grid[cols="2"] { grid-template-columns: repeat(2, 1fr); }
2516
+ ry-feature-grid[cols="3"] { grid-template-columns: repeat(3, 1fr); }
2517
+ ry-feature-grid[cols="4"] { grid-template-columns: repeat(4, 1fr); }
2518
+
2519
+ @container (max-width: 640px) {
2520
+ :is(ry-feature-grid[cols="2"], ry-feature-grid[cols="3"], ry-feature-grid[cols="4"]) {
2521
+ grid-template-columns: 1fr;
2522
+ }
2523
+ }
2524
+
2525
+ @container (min-width: 641px) and (max-width: 1024px) {
2526
+ :is(ry-feature-grid[cols="3"], ry-feature-grid[cols="4"]) {
2527
+ grid-template-columns: repeat(2, 1fr);
2528
+ }
2529
+ }
2530
+
2531
+ ry-feature {
2532
+ display: flex;
2533
+ flex-direction: column;
2534
+ gap: var(--ry-space-3, 0.75rem);
2535
+ }
2536
+
2537
+ ry-feature[align="center"] {
2538
+ align-items: center;
2539
+ text-align: center;
2540
+ }
2541
+
2542
+ ry-feature [data-ry-target="icon"] {
2543
+ display: flex;
2544
+ align-items: center;
2545
+ justify-content: center;
2546
+ width: 3rem;
2547
+ height: 3rem;
2548
+ flex-shrink: 0;
2549
+ }
2550
+
2551
+ ry-feature [data-ry-target="icon"] svg {
2552
+ width: 24px;
2553
+ height: 24px;
2554
+ }
2555
+
2556
+ ry-feature h3 {
2557
+ margin: 0;
2558
+ }
2559
+
2560
+ ry-feature p {
2561
+ margin: 0;
2562
+ }
2563
+
2564
+ /* ═══════════════════════════════════════════════════════════════
2565
+ PRICING + PRICING CARD
2566
+ ═══════════════════════════════════════════════════════════════ */
2567
+
2568
+ ry-pricing {
2569
+ display: flex;
2570
+ flex-wrap: wrap;
2571
+ justify-content: center;
2572
+ gap: var(--ry-space-6, 1.5rem);
2573
+ align-items: stretch;
2574
+ }
2575
+
2576
+ @container (max-width: 640px) {
2577
+ ry-pricing {
2578
+ flex-direction: column;
2579
+ align-items: center;
2580
+ }
2581
+ }
2582
+
2583
+ ry-pricing-card {
2584
+ display: flex;
2585
+ flex-direction: column;
2586
+ padding: var(--ry-space-8, 2rem);
2587
+ width: 100%;
2588
+ max-width: 20rem;
2589
+ }
2590
+
2591
+ ry-pricing-card[featured] {
2592
+ transform: scale(1.05);
2593
+ z-index: 1;
2594
+ }
2595
+
2596
+ ry-pricing-card h3 {
2597
+ margin: 0 0 var(--ry-space-2, 0.5rem) 0;
2598
+ }
2599
+
2600
+ ry-pricing-card [slot="price"] {
2601
+ margin-block-end: var(--ry-space-6, 1.5rem);
2602
+ }
2603
+
2604
+ ry-pricing-card [slot="price"] span {
2605
+ display: inline;
2606
+ }
2607
+
2608
+ ry-pricing-card ul {
2609
+ list-style: none;
2610
+ padding: 0;
2611
+ margin: 0 0 var(--ry-space-6, 1.5rem) 0;
2612
+ flex: 1;
2613
+ }
2614
+
2615
+ ry-pricing-card ul li {
2616
+ padding: var(--ry-space-2, 0.5rem) 0;
2617
+ }
2618
+
2619
+ ry-pricing-card :is(ry-button, .ry-btn) {
2620
+ margin-block-start: auto;
2621
+ }
2622
+
2623
+ /* ═══════════════════════════════════════════════════════════════
2624
+ CAROUSEL
2625
+ ═══════════════════════════════════════════════════════════════ */
2626
+
2627
+ ry-carousel {
2628
+ display: block;
2629
+ position: relative;
2630
+ overflow: hidden;
2631
+ outline: none;
2632
+ }
2633
+
2634
+ ry-carousel [data-ry-target="viewport"] {
2635
+ overflow: hidden;
2636
+ touch-action: pan-y;
2637
+ }
2638
+
2639
+ ry-carousel [data-ry-target="track"] {
2640
+ display: flex;
2641
+ transition: transform var(--ry-duration-normal, 200ms) var(--ry-ease, ease);
2642
+ }
2643
+
2644
+ ry-carousel [data-ry-target="slide"] {
2645
+ flex: 0 0 100%;
2646
+ min-width: 0;
2647
+ }
2648
+
2649
+ ry-carousel :is([data-ry-target="prev"], [data-ry-target="next"]) {
2650
+ position: absolute;
2651
+ top: 50%;
2652
+ transform: translateY(-50%);
2653
+ z-index: 1;
2654
+ display: flex;
2655
+ align-items: center;
2656
+ justify-content: center;
2657
+ width: 2.5rem;
2658
+ height: 2.5rem;
2659
+ padding: 0;
2660
+ border: none;
2661
+ cursor: pointer;
2662
+ }
2663
+
2664
+ ry-carousel [data-ry-target="prev"] {
2665
+ left: var(--ry-space-3, 0.75rem);
2666
+ }
2667
+
2668
+ ry-carousel [data-ry-target="next"] {
2669
+ right: var(--ry-space-3, 0.75rem);
2670
+ }
2671
+
2672
+ ry-carousel :is([data-ry-target="prev"], [data-ry-target="next"]) svg {
2673
+ width: 20px;
2674
+ height: 20px;
2675
+ }
2676
+
2677
+ ry-carousel [data-ry-target="dots"] {
2678
+ display: flex;
2679
+ justify-content: center;
2680
+ gap: var(--ry-space-2, 0.5rem);
2681
+ padding: var(--ry-space-3, 0.75rem) 0;
2682
+ }
2683
+
2684
+ ry-carousel [data-ry-target="dot"] {
2685
+ width: 0.5rem;
2686
+ height: 0.5rem;
2687
+ padding: 0;
2688
+ border: none;
2689
+ cursor: pointer;
2690
+ }
2691
+
2692
+ } /* @layer ry-structure */