@ryanhelsing/ry-ui 1.0.1 → 1.0.2

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.
@@ -38,7 +38,8 @@ ry-card, ry-accordion, ry-modal, ry-tabs, ry-dropdown,
38
38
  ry-button, ry-badge, ry-alert, ry-field, ry-nav, ry-logo, ry-actions,
39
39
  ry-accordion-item, ry-tab, ry-menu, ry-menu-item, ry-divider,
40
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
+ ry-toggle-button, ry-knob, ry-slider, ry-number-select, ry-color-picker, ry-color-input,
42
+ ry-tree, ry-tree-item {
42
43
  box-sizing: border-box;
43
44
  }
44
45
 
@@ -455,6 +456,134 @@ 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 [data-ry-target="decrement"],
476
+ ry-number-select [data-ry-target="increment"] {
477
+ display: inline-flex;
478
+ align-items: center;
479
+ justify-content: center;
480
+ width: 32px;
481
+ height: 36px;
482
+ padding: 0;
483
+ flex-shrink: 0;
484
+ cursor: pointer;
485
+ }
486
+
487
+ ry-number-select [data-ry-target="decrement"] svg,
488
+ ry-number-select [data-ry-target="increment"] svg {
489
+ width: 16px;
490
+ height: 16px;
491
+ }
492
+
493
+ ry-number-select [data-ry-target="display"] {
494
+ display: inline-flex;
495
+ align-items: center;
496
+ justify-content: center;
497
+ min-width: 48px;
498
+ height: 36px;
499
+ padding: 0 var(--ry-space-2, 0.5rem);
500
+ position: relative;
501
+ cursor: ew-resize;
502
+ outline: none;
503
+ }
504
+
505
+ ry-number-select[drag="y"] [data-ry-target="display"],
506
+ ry-number-select[arrows="stacked"]: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
+ ry-number-select[drag="y"][data-dragging],
519
+ ry-number-select[arrows="stacked"]:not([drag])[data-dragging] {
520
+ cursor: ns-resize;
521
+ }
522
+
523
+ ry-number-select [data-ry-target="value"] {
524
+ display: inline-block;
525
+ min-width: 2em;
526
+ text-align: center;
527
+ transition: transform 60ms ease-out;
528
+ }
529
+
530
+ ry-number-select [data-ry-target="prefix"],
531
+ ry-number-select [data-ry-target="suffix"] {
532
+ flex-shrink: 0;
533
+ pointer-events: none;
534
+ }
535
+
536
+ ry-number-select [data-ry-target="input"] {
537
+ display: none;
538
+ position: absolute;
539
+ inset: 0;
540
+ width: 100%;
541
+ height: 100%;
542
+ text-align: center;
543
+ padding: 0 var(--ry-space-1, 0.25rem);
544
+ outline: none;
545
+ }
546
+
547
+ ry-number-select [data-ry-target="label"] {
548
+ display: block;
549
+ text-align: center;
550
+ margin-right: var(--ry-space-2, 0.5rem);
551
+ order: -1;
552
+ }
553
+
554
+ /* Stacked layout (buttons above/below) */
555
+ ry-number-select[arrows="stacked"] {
556
+ flex-direction: column;
557
+ align-items: stretch;
558
+ }
559
+
560
+ ry-number-select[arrows="stacked"] [data-ry-target="decrement"],
561
+ ry-number-select[arrows="stacked"] [data-ry-target="increment"] {
562
+ width: auto;
563
+ height: 24px;
564
+ }
565
+
566
+ ry-number-select[arrows="stacked"] [data-ry-target="decrement"] svg,
567
+ ry-number-select[arrows="stacked"] [data-ry-target="increment"] svg {
568
+ width: 14px;
569
+ height: 14px;
570
+ }
571
+
572
+ /* Sizes */
573
+ ry-number-select[size="xs"] [data-ry-target="decrement"],
574
+ ry-number-select[size="xs"] [data-ry-target="increment"] { width: 20px; height: 22px; }
575
+ ry-number-select[size="xs"] [data-ry-target="display"] { min-width: 28px; height: 22px; padding: 0 var(--ry-space-1, 0.25rem); }
576
+ ry-number-select[size="xs"] [data-ry-target="decrement"] svg,
577
+ ry-number-select[size="xs"] [data-ry-target="increment"] svg { width: 12px; height: 12px; }
578
+
579
+ ry-number-select[size="sm"] [data-ry-target="decrement"],
580
+ ry-number-select[size="sm"] [data-ry-target="increment"] { width: 24px; height: 28px; }
581
+ ry-number-select[size="sm"] [data-ry-target="display"] { min-width: 36px; height: 28px; }
582
+
583
+ ry-number-select[size="lg"] [data-ry-target="decrement"],
584
+ ry-number-select[size="lg"] [data-ry-target="increment"] { width: 40px; height: 44px; }
585
+ ry-number-select[size="lg"] [data-ry-target="display"] { min-width: 60px; height: 44px; }
586
+
458
587
  /* ═══════════════════════════════════════════════════════════════
459
588
  SLIDER
460
589
  ═══════════════════════════════════════════════════════════════ */
@@ -828,6 +957,20 @@ ry-dropdown[data-ry-state="open"] ry-menu {
828
957
  transform: translateY(0);
829
958
  }
830
959
 
960
+ ry-dropdown[data-ry-position="top"] [data-ry-target="menu"],
961
+ ry-dropdown[data-ry-position="top"] ry-menu {
962
+ top: auto;
963
+ bottom: 100%;
964
+ margin-top: 0;
965
+ margin-bottom: var(--ry-space-1, 0.25rem);
966
+ transform: translateY(0.5rem);
967
+ }
968
+
969
+ ry-dropdown[data-ry-position="top"][data-ry-state="open"] [data-ry-target="menu"],
970
+ ry-dropdown[data-ry-position="top"][data-ry-state="open"] ry-menu {
971
+ transform: translateY(0);
972
+ }
973
+
831
974
  ry-menu-item {
832
975
  display: block;
833
976
  width: 100%;
@@ -1765,3 +1908,313 @@ ry-color-input ry-color-picker[inline] [data-ry-target="panel"] {
1765
1908
  border: none;
1766
1909
  box-shadow: none;
1767
1910
  }
1911
+
1912
+ /* ═══════════════════════════════════════════════════════════════
1913
+ GRADIENT PICKER
1914
+ ═══════════════════════════════════════════════════════════════ */
1915
+
1916
+ ry-gradient-picker {
1917
+ display: block;
1918
+ width: var(--ry-color-picker-width, 240px);
1919
+ }
1920
+
1921
+ ry-gradient-picker[disabled] {
1922
+ pointer-events: none;
1923
+ }
1924
+
1925
+ /* Controls row */
1926
+ ry-gradient-picker [data-ry-target="controls"] {
1927
+ display: flex;
1928
+ align-items: center;
1929
+ gap: var(--ry-space-3, 0.75rem);
1930
+ padding: var(--ry-space-3, 0.75rem);
1931
+ }
1932
+
1933
+ ry-gradient-picker [data-ry-target="type-toggle"] {
1934
+ display: flex;
1935
+ gap: var(--ry-space-1, 0.25rem);
1936
+ }
1937
+
1938
+ ry-gradient-picker [data-ry-target="type-toggle"] button {
1939
+ display: flex;
1940
+ align-items: center;
1941
+ justify-content: center;
1942
+ width: 28px;
1943
+ height: 28px;
1944
+ padding: 0;
1945
+ border: none;
1946
+ cursor: pointer;
1947
+ }
1948
+
1949
+ ry-gradient-picker [data-ry-target="type-toggle"] button svg {
1950
+ width: 16px;
1951
+ height: 16px;
1952
+ }
1953
+
1954
+ /* Angle control — visible when linear (default) */
1955
+ ry-gradient-picker [data-ry-target="angle-control"] {
1956
+ display: flex;
1957
+ align-items: center;
1958
+ gap: var(--ry-space-1, 0.25rem);
1959
+ margin-left: auto;
1960
+ }
1961
+
1962
+ ry-gradient-picker [data-ry-target="angle-control"] ry-number-select {
1963
+ min-width: 0;
1964
+ }
1965
+
1966
+ /* Shape control — hidden by default */
1967
+ ry-gradient-picker [data-ry-target="shape-control"] {
1968
+ display: none;
1969
+ gap: var(--ry-space-1, 0.25rem);
1970
+ margin-left: auto;
1971
+ }
1972
+
1973
+ ry-gradient-picker [data-ry-target="shape-control"] button {
1974
+ display: flex;
1975
+ align-items: center;
1976
+ justify-content: center;
1977
+ width: 28px;
1978
+ height: 28px;
1979
+ padding: 0;
1980
+ border: none;
1981
+ cursor: pointer;
1982
+ }
1983
+
1984
+ ry-gradient-picker [data-ry-target="shape-control"] button svg {
1985
+ width: 16px;
1986
+ height: 16px;
1987
+ }
1988
+
1989
+ /* When radial: hide angle, show shape */
1990
+ ry-gradient-picker[data-ry-type="radial"] [data-ry-target="angle-control"] {
1991
+ display: none;
1992
+ }
1993
+
1994
+ ry-gradient-picker[data-ry-type="radial"] [data-ry-target="shape-control"] {
1995
+ display: flex;
1996
+ }
1997
+
1998
+ /* When solid: hide bar, angle, shape */
1999
+ ry-gradient-picker[data-ry-type="solid"] [data-ry-target="bar-container"] {
2000
+ display: none;
2001
+ }
2002
+
2003
+ ry-gradient-picker[data-ry-type="solid"] [data-ry-target="angle-control"] {
2004
+ display: none;
2005
+ }
2006
+
2007
+ ry-gradient-picker[data-ry-type="solid"] [data-ry-target="shape-control"] {
2008
+ display: none;
2009
+ }
2010
+
2011
+ /* Gradient bar */
2012
+ ry-gradient-picker [data-ry-target="bar-container"] {
2013
+ position: relative;
2014
+ margin: 0 10px;
2015
+ padding: var(--ry-space-4, 1rem) 0;
2016
+ }
2017
+
2018
+ ry-gradient-picker [data-ry-target="bar"] {
2019
+ position: relative;
2020
+ height: var(--ry-gradient-picker-bar-height, 24px);
2021
+ cursor: pointer;
2022
+ touch-action: none;
2023
+ }
2024
+
2025
+ /* Stop handle */
2026
+ ry-gradient-picker [data-ry-target="stop"] {
2027
+ position: absolute;
2028
+ top: 50%;
2029
+ width: var(--ry-gradient-picker-stop-size, 16px);
2030
+ height: var(--ry-gradient-picker-stop-size, 16px);
2031
+ transform: translate(-50%, -50%);
2032
+ cursor: grab;
2033
+ z-index: 1;
2034
+ }
2035
+
2036
+ ry-gradient-picker [data-ry-target="stop"]:active {
2037
+ cursor: grabbing;
2038
+ }
2039
+
2040
+ ry-gradient-picker [data-ry-target="stop"][data-selected] {
2041
+ z-index: 2;
2042
+ width: calc(var(--ry-gradient-picker-stop-size, 16px) + 4px);
2043
+ height: calc(var(--ry-gradient-picker-stop-size, 16px) + 4px);
2044
+ }
2045
+
2046
+ /* Inline color picker — remove extra border */
2047
+ ry-gradient-picker ry-color-picker[inline] [data-ry-target="panel"] {
2048
+ border: none;
2049
+ box-shadow: none;
2050
+ }
2051
+
2052
+ /* CSS output */
2053
+ ry-gradient-picker [data-ry-target="output-row"] {
2054
+ display: flex;
2055
+ align-items: center;
2056
+ gap: var(--ry-space-1, 0.25rem);
2057
+ padding: 0 var(--ry-space-3, 0.75rem) var(--ry-space-3, 0.75rem);
2058
+ }
2059
+
2060
+ ry-gradient-picker [data-ry-target="output"] {
2061
+ flex: 1;
2062
+ min-width: 0;
2063
+ padding: var(--ry-space-1, 0.25rem) var(--ry-space-2, 0.5rem);
2064
+ border: none;
2065
+ }
2066
+
2067
+ ry-gradient-picker [data-ry-target="copy-btn"] {
2068
+ display: flex;
2069
+ align-items: center;
2070
+ justify-content: center;
2071
+ flex-shrink: 0;
2072
+ width: 28px;
2073
+ height: 28px;
2074
+ padding: 0;
2075
+ border: none;
2076
+ cursor: pointer;
2077
+ }
2078
+
2079
+ ry-gradient-picker [data-ry-target="copy-btn"] svg {
2080
+ width: 14px;
2081
+ height: 14px;
2082
+ }
2083
+
2084
+ /* ═══════════════════════════════════════════════════════════════
2085
+ TREE
2086
+ ═══════════════════════════════════════════════════════════════ */
2087
+
2088
+ ry-tree {
2089
+ display: block;
2090
+ }
2091
+
2092
+ ry-tree-item {
2093
+ display: none;
2094
+ }
2095
+
2096
+ .ry-tree__root,
2097
+ .ry-tree__children {
2098
+ list-style: none;
2099
+ padding: 0;
2100
+ margin: 0;
2101
+ }
2102
+
2103
+ .ry-tree__children {
2104
+ margin-left: 11px;
2105
+ padding-left: 11px;
2106
+ overflow: hidden;
2107
+ }
2108
+
2109
+ .ry-tree__item {
2110
+ position: relative;
2111
+ margin-top: var(--ry-space-1, 0.25rem);
2112
+ }
2113
+
2114
+ /* Horizontal connector lines for nested items */
2115
+ .ry-tree__children .ry-tree__item::before {
2116
+ content: "";
2117
+ position: absolute;
2118
+ left: -11px;
2119
+ top: 14px;
2120
+ width: 11px;
2121
+ height: 1px;
2122
+ }
2123
+
2124
+ .ry-tree__label,
2125
+ .ry-tree__file {
2126
+ display: flex;
2127
+ align-items: center;
2128
+ gap: var(--ry-space-2, 0.5rem);
2129
+ padding: var(--ry-space-1, 0.25rem) var(--ry-space-2, 0.5rem);
2130
+ height: 28px;
2131
+ cursor: pointer;
2132
+ user-select: none;
2133
+ text-decoration: none;
2134
+ }
2135
+
2136
+ /* Hidden checkbox — the CSS engine for expand/collapse */
2137
+ /* Compound selector to override global input[type="checkbox"] styles */
2138
+ input[type="checkbox"].ry-tree__toggle {
2139
+ display: none;
2140
+ appearance: auto;
2141
+ width: 0;
2142
+ height: 0;
2143
+ margin: 0;
2144
+ padding: 0;
2145
+ border: none;
2146
+ }
2147
+
2148
+ /* Folder icon swap */
2149
+ .ry-tree__icon-open {
2150
+ display: none;
2151
+ }
2152
+ .ry-tree__icon-closed {
2153
+ display: flex;
2154
+ }
2155
+
2156
+ .ry-tree__toggle:checked ~ .ry-tree__label .ry-tree__icon-open {
2157
+ display: flex;
2158
+ }
2159
+ .ry-tree__toggle:checked ~ .ry-tree__label .ry-tree__icon-closed {
2160
+ display: none;
2161
+ }
2162
+
2163
+ /* Grid animation for expand/collapse */
2164
+ .ry-tree__children-wrapper {
2165
+ display: grid;
2166
+ grid-template-rows: 0fr;
2167
+ transition: grid-template-rows var(--ry-tree-duration, 150ms) var(--ry-ease, ease);
2168
+ }
2169
+
2170
+ ry-tree[no-animate] .ry-tree__children-wrapper {
2171
+ transition-duration: 0ms;
2172
+ }
2173
+
2174
+ .ry-tree__toggle:checked ~ .ry-tree__children-wrapper {
2175
+ grid-template-rows: 1fr;
2176
+ }
2177
+
2178
+ .ry-tree__icon {
2179
+ width: 16px;
2180
+ height: 16px;
2181
+ flex-shrink: 0;
2182
+ }
2183
+
2184
+ /* ── Drag and Drop ── */
2185
+
2186
+ .ry-tree__ghost {
2187
+ position: fixed;
2188
+ pointer-events: none;
2189
+ user-select: none;
2190
+ z-index: var(--ry-z-toast, 1080);
2191
+ transform: rotate(-2deg);
2192
+ }
2193
+
2194
+ .ry-tree__item[data-ry-dragging] {
2195
+ opacity: 0.4;
2196
+ }
2197
+
2198
+ .ry-tree__item--collapsed {
2199
+ height: 4px;
2200
+ overflow: hidden;
2201
+ pointer-events: none;
2202
+ }
2203
+
2204
+ .ry-tree__item[data-ry-drop-target="before"]::after,
2205
+ .ry-tree__item[data-ry-drop-target="after"]::after {
2206
+ content: '';
2207
+ position: absolute;
2208
+ left: 0;
2209
+ right: 0;
2210
+ height: 2px;
2211
+ pointer-events: none;
2212
+ }
2213
+
2214
+ .ry-tree__item[data-ry-drop-target="before"]::after {
2215
+ top: -1px;
2216
+ }
2217
+
2218
+ .ry-tree__item[data-ry-drop-target="after"]::after {
2219
+ bottom: -1px;
2220
+ }